From: hobbes1069 Date: Wed, 2 Jul 2014 20:40:47 +0000 (+0000) Subject: Add pre-built binaries for MinGW builds. X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=3411a28a0c645385f12b52d7d296e47979214385;p=freetel-svn-tracking.git Add pre-built binaries for MinGW builds. git-svn-id: https://svn.code.sf.net/p/freetel/code@1735 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/wxmsw/bin/wx-config b/wxmsw/bin/wx-config new file mode 120000 index 00000000..aa7588cc --- /dev/null +++ b/wxmsw/bin/wx-config @@ -0,0 +1 @@ +/home/build/tmp/build/external/dist/lib/wx/config/gtk2-unicode-static-3.0 \ No newline at end of file diff --git a/wxmsw/bin/wxrc b/wxmsw/bin/wxrc new file mode 120000 index 00000000..05e93732 --- /dev/null +++ b/wxmsw/bin/wxrc @@ -0,0 +1 @@ +wxrc-3.0 \ No newline at end of file diff --git a/wxmsw/bin/wxrc-3.0 b/wxmsw/bin/wxrc-3.0 new file mode 100755 index 00000000..f667792f Binary files /dev/null and b/wxmsw/bin/wxrc-3.0 differ diff --git a/wxmsw/include/wx-3.0/wx/aboutdlg.h b/wxmsw/include/wx-3.0/wx/aboutdlg.h new file mode 100644 index 00000000..975b5def --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/aboutdlg.h @@ -0,0 +1,169 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/aboutdlg.h +// Purpose: declaration of wxAboutDialog class +// Author: Vadim Zeitlin +// Created: 2006-10-07 +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ABOUTDLG_H_ +#define _WX_ABOUTDLG_H_ + +#include "wx/defs.h" + +#if wxUSE_ABOUTDLG + +#include "wx/app.h" +#include "wx/icon.h" + +// ---------------------------------------------------------------------------- +// wxAboutDialogInfo: information shown by the standard "About" dialog +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxAboutDialogInfo +{ +public: + // all fields are initially uninitialized + wxAboutDialogInfo() { } + + // accessors for various simply fields + // ----------------------------------- + + // name of the program, if not used defaults to wxApp::GetAppDisplayName() + void SetName(const wxString& name) { m_name = name; } + wxString GetName() const + { return m_name.empty() ? wxTheApp->GetAppDisplayName() : m_name; } + + // version should contain program version without "version" word (e.g., + // "1.2" or "RC2") while longVersion may contain the full version including + // "version" word (e.g., "Version 1.2" or "Release Candidate 2") + // + // if longVersion is empty, it is automatically constructed from version + // + // generic and gtk native: use short version only, as a suffix to the + // program name msw and osx native: use long version + void SetVersion(const wxString& version, + const wxString& longVersion = wxString()); + + bool HasVersion() const { return !m_version.empty(); } + const wxString& GetVersion() const { return m_version; } + const wxString& GetLongVersion() const { return m_longVersion; } + + // brief, but possibly multiline, description of the program + void SetDescription(const wxString& desc) { m_description = desc; } + bool HasDescription() const { return !m_description.empty(); } + const wxString& GetDescription() const { return m_description; } + + // short string containing the program copyright information + void SetCopyright(const wxString& copyright) { m_copyright = copyright; } + bool HasCopyright() const { return !m_copyright.empty(); } + const wxString& GetCopyright() const { return m_copyright; } + + // long, multiline string containing the text of the program licence + void SetLicence(const wxString& licence) { m_licence = licence; } + void SetLicense(const wxString& licence) { m_licence = licence; } + bool HasLicence() const { return !m_licence.empty(); } + const wxString& GetLicence() const { return m_licence; } + + // icon to be shown in the dialog, defaults to the main frame icon + void SetIcon(const wxIcon& icon) { m_icon = icon; } + bool HasIcon() const { return m_icon.IsOk(); } + wxIcon GetIcon() const; + + // web site for the program and its description (defaults to URL itself if + // empty) + void SetWebSite(const wxString& url, const wxString& desc = wxEmptyString) + { + m_url = url; + m_urlDesc = desc.empty() ? url : desc; + } + + bool HasWebSite() const { return !m_url.empty(); } + + const wxString& GetWebSiteURL() const { return m_url; } + const wxString& GetWebSiteDescription() const { return m_urlDesc; } + + // accessors for the arrays + // ------------------------ + + // the list of developers of the program + void SetDevelopers(const wxArrayString& developers) + { m_developers = developers; } + void AddDeveloper(const wxString& developer) + { m_developers.push_back(developer); } + + bool HasDevelopers() const { return !m_developers.empty(); } + const wxArrayString& GetDevelopers() const { return m_developers; } + + // the list of documentation writers + void SetDocWriters(const wxArrayString& docwriters) + { m_docwriters = docwriters; } + void AddDocWriter(const wxString& docwriter) + { m_docwriters.push_back(docwriter); } + + bool HasDocWriters() const { return !m_docwriters.empty(); } + const wxArrayString& GetDocWriters() const { return m_docwriters; } + + // the list of artists for the program art + void SetArtists(const wxArrayString& artists) + { m_artists = artists; } + void AddArtist(const wxString& artist) + { m_artists.push_back(artist); } + + bool HasArtists() const { return !m_artists.empty(); } + const wxArrayString& GetArtists() const { return m_artists; } + + // the list of translators + void SetTranslators(const wxArrayString& translators) + { m_translators = translators; } + void AddTranslator(const wxString& translator) + { m_translators.push_back(translator); } + + bool HasTranslators() const { return !m_translators.empty(); } + const wxArrayString& GetTranslators() const { return m_translators; } + + + // implementation only + // ------------------- + + // "simple" about dialog shows only textual information (with possibly + // default icon but without hyperlink nor any long texts such as the + // licence text) + bool IsSimple() const + { return !HasWebSite() && !HasIcon() && !HasLicence(); } + + // get the description and credits (i.e. all of developers, doc writers, + // artists and translators) as a one long multiline string + wxString GetDescriptionAndCredits() const; + + // returns the copyright with the (C) string substituted by the Unicode + // character U+00A9 + wxString GetCopyrightToDisplay() const; + +private: + wxString m_name, + m_version, + m_longVersion, + m_description, + m_copyright, + m_licence; + + wxIcon m_icon; + + wxString m_url, + m_urlDesc; + + wxArrayString m_developers, + m_docwriters, + m_artists, + m_translators; +}; + +// functions to show the about dialog box +WXDLLIMPEXP_ADV void wxAboutBox(const wxAboutDialogInfo& info, wxWindow* parent = NULL); + +#endif // wxUSE_ABOUTDLG + +#endif // _WX_ABOUTDLG_H_ + diff --git a/wxmsw/include/wx-3.0/wx/accel.h b/wxmsw/include/wx-3.0/wx/accel.h new file mode 100644 index 00000000..5226b8b3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/accel.h @@ -0,0 +1,178 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/accel.h +// Purpose: wxAcceleratorEntry and wxAcceleratorTable classes +// Author: Julian Smart, Robert Roebling, Vadim Zeitlin +// Modified by: +// Created: 31.05.01 (extracted from other files) +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ACCEL_H_BASE_ +#define _WX_ACCEL_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_ACCEL + +#include "wx/object.h" + +class WXDLLIMPEXP_FWD_CORE wxAcceleratorTable; +class WXDLLIMPEXP_FWD_CORE wxMenuItem; +class WXDLLIMPEXP_FWD_CORE wxKeyEvent; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// wxAcceleratorEntry flags +enum wxAcceleratorEntryFlags +{ + wxACCEL_NORMAL = 0x0000, // no modifiers + wxACCEL_ALT = 0x0001, // hold Alt key down + wxACCEL_CTRL = 0x0002, // hold Ctrl key down + wxACCEL_SHIFT = 0x0004, // hold Shift key down +#if defined(__WXMAC__) || defined(__WXCOCOA__) + wxACCEL_RAW_CTRL= 0x0008, // +#else + wxACCEL_RAW_CTRL= wxACCEL_CTRL, +#endif + wxACCEL_CMD = wxACCEL_CTRL +}; + +// ---------------------------------------------------------------------------- +// an entry in wxAcceleratorTable corresponds to one accelerator +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxAcceleratorEntry +{ +public: + wxAcceleratorEntry(int flags = 0, int keyCode = 0, int cmd = 0, + wxMenuItem *item = NULL) + : m_flags(flags) + , m_keyCode(keyCode) + , m_command(cmd) + , m_item(item) + { } + + wxAcceleratorEntry(const wxAcceleratorEntry& entry) + : m_flags(entry.m_flags) + , m_keyCode(entry.m_keyCode) + , m_command(entry.m_command) + , m_item(entry.m_item) + { } + + // create accelerator corresponding to the specified string, return NULL if + // string couldn't be parsed or a pointer to be deleted by the caller + static wxAcceleratorEntry *Create(const wxString& str); + + wxAcceleratorEntry& operator=(const wxAcceleratorEntry& entry) + { + if (&entry != this) + Set(entry.m_flags, entry.m_keyCode, entry.m_command, entry.m_item); + return *this; + } + + void Set(int flags, int keyCode, int cmd, wxMenuItem *item = NULL) + { + m_flags = flags; + m_keyCode = keyCode; + m_command = cmd; + m_item = item; + } + + void SetMenuItem(wxMenuItem *item) { m_item = item; } + + int GetFlags() const { return m_flags; } + int GetKeyCode() const { return m_keyCode; } + int GetCommand() const { return m_command; } + + wxMenuItem *GetMenuItem() const { return m_item; } + + bool operator==(const wxAcceleratorEntry& entry) const + { + return m_flags == entry.m_flags && + m_keyCode == entry.m_keyCode && + m_command == entry.m_command && + m_item == entry.m_item; + } + + bool operator!=(const wxAcceleratorEntry& entry) const + { return !(*this == entry); } + +#if defined(__WXMOTIF__) + // Implementation use only + bool MatchesEvent(const wxKeyEvent& event) const; +#endif + + bool IsOk() const + { + return m_keyCode != 0; + } + + + // string <-> wxAcceleratorEntry conversion + // ---------------------------------------- + + // returns a wxString for the this accelerator. + // this function formats it using the - format + // where maybe a hyphen-separated list of "shift|alt|ctrl" + wxString ToString() const { return AsPossiblyLocalizedString(true); } + + // same as above but without translating, useful if the string is meant to + // be stored in a file or otherwise stored, instead of being shown to the + // user + wxString ToRawString() const { return AsPossiblyLocalizedString(false); } + + // returns true if the given string correctly initialized this object + // (i.e. if IsOk() returns true after this call) + bool FromString(const wxString& str); + + +private: + wxString AsPossiblyLocalizedString(bool localized) const; + + // common part of Create() and FromString() + static bool ParseAccel(const wxString& str, int *flags, int *keycode); + + + int m_flags; // combination of wxACCEL_XXX constants + int m_keyCode; // ASCII or virtual keycode + int m_command; // Command id to generate + + // the menu item this entry corresponds to, may be NULL + wxMenuItem *m_item; + + // for compatibility with old code, use accessors now! + friend class WXDLLIMPEXP_FWD_CORE wxMenu; +}; + +// ---------------------------------------------------------------------------- +// include wxAcceleratorTable class declaration, it is only used by the library +// and so doesn't have any published user visible interface +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/generic/accel.h" +#elif defined(__WXMSW__) + #include "wx/msw/accel.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/accel.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/accel.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/accel.h" +#elif defined(__WXMAC__) + #include "wx/osx/accel.h" +#elif defined(__WXCOCOA__) + #include "wx/generic/accel.h" +#elif defined(__WXPM__) + #include "wx/os2/accel.h" +#endif + +extern WXDLLIMPEXP_DATA_CORE(wxAcceleratorTable) wxNullAcceleratorTable; + +#endif // wxUSE_ACCEL + +#endif + // _WX_ACCEL_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/access.h b/wxmsw/include/wx-3.0/wx/access.h new file mode 100644 index 00000000..70cbaf13 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/access.h @@ -0,0 +1,376 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/access.h +// Purpose: Accessibility classes +// Author: Julian Smart +// Modified by: +// Created: 2003-02-12 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ACCESSBASE_H_ +#define _WX_ACCESSBASE_H_ + +// ---------------------------------------------------------------------------- +// headers we have to include here +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_ACCESSIBILITY + +#include "wx/variant.h" + +typedef enum +{ + wxACC_FAIL, + wxACC_FALSE, + wxACC_OK, + wxACC_NOT_IMPLEMENTED, + wxACC_NOT_SUPPORTED +} wxAccStatus; + +// Child ids are integer identifiers from 1 up. +// So zero represents 'this' object. +#define wxACC_SELF 0 + +// Navigation constants + +typedef enum +{ + wxNAVDIR_DOWN, + wxNAVDIR_FIRSTCHILD, + wxNAVDIR_LASTCHILD, + wxNAVDIR_LEFT, + wxNAVDIR_NEXT, + wxNAVDIR_PREVIOUS, + wxNAVDIR_RIGHT, + wxNAVDIR_UP +} wxNavDir; + +// Role constants + +typedef enum { + wxROLE_NONE, + wxROLE_SYSTEM_ALERT, + wxROLE_SYSTEM_ANIMATION, + wxROLE_SYSTEM_APPLICATION, + wxROLE_SYSTEM_BORDER, + wxROLE_SYSTEM_BUTTONDROPDOWN, + wxROLE_SYSTEM_BUTTONDROPDOWNGRID, + wxROLE_SYSTEM_BUTTONMENU, + wxROLE_SYSTEM_CARET, + wxROLE_SYSTEM_CELL, + wxROLE_SYSTEM_CHARACTER, + wxROLE_SYSTEM_CHART, + wxROLE_SYSTEM_CHECKBUTTON, + wxROLE_SYSTEM_CLIENT, + wxROLE_SYSTEM_CLOCK, + wxROLE_SYSTEM_COLUMN, + wxROLE_SYSTEM_COLUMNHEADER, + wxROLE_SYSTEM_COMBOBOX, + wxROLE_SYSTEM_CURSOR, + wxROLE_SYSTEM_DIAGRAM, + wxROLE_SYSTEM_DIAL, + wxROLE_SYSTEM_DIALOG, + wxROLE_SYSTEM_DOCUMENT, + wxROLE_SYSTEM_DROPLIST, + wxROLE_SYSTEM_EQUATION, + wxROLE_SYSTEM_GRAPHIC, + wxROLE_SYSTEM_GRIP, + wxROLE_SYSTEM_GROUPING, + wxROLE_SYSTEM_HELPBALLOON, + wxROLE_SYSTEM_HOTKEYFIELD, + wxROLE_SYSTEM_INDICATOR, + wxROLE_SYSTEM_LINK, + wxROLE_SYSTEM_LIST, + wxROLE_SYSTEM_LISTITEM, + wxROLE_SYSTEM_MENUBAR, + wxROLE_SYSTEM_MENUITEM, + wxROLE_SYSTEM_MENUPOPUP, + wxROLE_SYSTEM_OUTLINE, + wxROLE_SYSTEM_OUTLINEITEM, + wxROLE_SYSTEM_PAGETAB, + wxROLE_SYSTEM_PAGETABLIST, + wxROLE_SYSTEM_PANE, + wxROLE_SYSTEM_PROGRESSBAR, + wxROLE_SYSTEM_PROPERTYPAGE, + wxROLE_SYSTEM_PUSHBUTTON, + wxROLE_SYSTEM_RADIOBUTTON, + wxROLE_SYSTEM_ROW, + wxROLE_SYSTEM_ROWHEADER, + wxROLE_SYSTEM_SCROLLBAR, + wxROLE_SYSTEM_SEPARATOR, + wxROLE_SYSTEM_SLIDER, + wxROLE_SYSTEM_SOUND, + wxROLE_SYSTEM_SPINBUTTON, + wxROLE_SYSTEM_STATICTEXT, + wxROLE_SYSTEM_STATUSBAR, + wxROLE_SYSTEM_TABLE, + wxROLE_SYSTEM_TEXT, + wxROLE_SYSTEM_TITLEBAR, + wxROLE_SYSTEM_TOOLBAR, + wxROLE_SYSTEM_TOOLTIP, + wxROLE_SYSTEM_WHITESPACE, + wxROLE_SYSTEM_WINDOW +} wxAccRole; + +// Object types + +typedef enum { + wxOBJID_WINDOW = 0x00000000, + wxOBJID_SYSMENU = 0xFFFFFFFF, + wxOBJID_TITLEBAR = 0xFFFFFFFE, + wxOBJID_MENU = 0xFFFFFFFD, + wxOBJID_CLIENT = 0xFFFFFFFC, + wxOBJID_VSCROLL = 0xFFFFFFFB, + wxOBJID_HSCROLL = 0xFFFFFFFA, + wxOBJID_SIZEGRIP = 0xFFFFFFF9, + wxOBJID_CARET = 0xFFFFFFF8, + wxOBJID_CURSOR = 0xFFFFFFF7, + wxOBJID_ALERT = 0xFFFFFFF6, + wxOBJID_SOUND = 0xFFFFFFF5 +} wxAccObject; + +// Accessible states + +#define wxACC_STATE_SYSTEM_ALERT_HIGH 0x00000001 +#define wxACC_STATE_SYSTEM_ALERT_MEDIUM 0x00000002 +#define wxACC_STATE_SYSTEM_ALERT_LOW 0x00000004 +#define wxACC_STATE_SYSTEM_ANIMATED 0x00000008 +#define wxACC_STATE_SYSTEM_BUSY 0x00000010 +#define wxACC_STATE_SYSTEM_CHECKED 0x00000020 +#define wxACC_STATE_SYSTEM_COLLAPSED 0x00000040 +#define wxACC_STATE_SYSTEM_DEFAULT 0x00000080 +#define wxACC_STATE_SYSTEM_EXPANDED 0x00000100 +#define wxACC_STATE_SYSTEM_EXTSELECTABLE 0x00000200 +#define wxACC_STATE_SYSTEM_FLOATING 0x00000400 +#define wxACC_STATE_SYSTEM_FOCUSABLE 0x00000800 +#define wxACC_STATE_SYSTEM_FOCUSED 0x00001000 +#define wxACC_STATE_SYSTEM_HOTTRACKED 0x00002000 +#define wxACC_STATE_SYSTEM_INVISIBLE 0x00004000 +#define wxACC_STATE_SYSTEM_MARQUEED 0x00008000 +#define wxACC_STATE_SYSTEM_MIXED 0x00010000 +#define wxACC_STATE_SYSTEM_MULTISELECTABLE 0x00020000 +#define wxACC_STATE_SYSTEM_OFFSCREEN 0x00040000 +#define wxACC_STATE_SYSTEM_PRESSED 0x00080000 +#define wxACC_STATE_SYSTEM_PROTECTED 0x00100000 +#define wxACC_STATE_SYSTEM_READONLY 0x00200000 +#define wxACC_STATE_SYSTEM_SELECTABLE 0x00400000 +#define wxACC_STATE_SYSTEM_SELECTED 0x00800000 +#define wxACC_STATE_SYSTEM_SELFVOICING 0x01000000 +#define wxACC_STATE_SYSTEM_UNAVAILABLE 0x02000000 + +// Selection flag + +typedef enum +{ + wxACC_SEL_NONE = 0, + wxACC_SEL_TAKEFOCUS = 1, + wxACC_SEL_TAKESELECTION = 2, + wxACC_SEL_EXTENDSELECTION = 4, + wxACC_SEL_ADDSELECTION = 8, + wxACC_SEL_REMOVESELECTION = 16 +} wxAccSelectionFlags; + +// Accessibility event identifiers + +#define wxACC_EVENT_SYSTEM_SOUND 0x0001 +#define wxACC_EVENT_SYSTEM_ALERT 0x0002 +#define wxACC_EVENT_SYSTEM_FOREGROUND 0x0003 +#define wxACC_EVENT_SYSTEM_MENUSTART 0x0004 +#define wxACC_EVENT_SYSTEM_MENUEND 0x0005 +#define wxACC_EVENT_SYSTEM_MENUPOPUPSTART 0x0006 +#define wxACC_EVENT_SYSTEM_MENUPOPUPEND 0x0007 +#define wxACC_EVENT_SYSTEM_CAPTURESTART 0x0008 +#define wxACC_EVENT_SYSTEM_CAPTUREEND 0x0009 +#define wxACC_EVENT_SYSTEM_MOVESIZESTART 0x000A +#define wxACC_EVENT_SYSTEM_MOVESIZEEND 0x000B +#define wxACC_EVENT_SYSTEM_CONTEXTHELPSTART 0x000C +#define wxACC_EVENT_SYSTEM_CONTEXTHELPEND 0x000D +#define wxACC_EVENT_SYSTEM_DRAGDROPSTART 0x000E +#define wxACC_EVENT_SYSTEM_DRAGDROPEND 0x000F +#define wxACC_EVENT_SYSTEM_DIALOGSTART 0x0010 +#define wxACC_EVENT_SYSTEM_DIALOGEND 0x0011 +#define wxACC_EVENT_SYSTEM_SCROLLINGSTART 0x0012 +#define wxACC_EVENT_SYSTEM_SCROLLINGEND 0x0013 +#define wxACC_EVENT_SYSTEM_SWITCHSTART 0x0014 +#define wxACC_EVENT_SYSTEM_SWITCHEND 0x0015 +#define wxACC_EVENT_SYSTEM_MINIMIZESTART 0x0016 +#define wxACC_EVENT_SYSTEM_MINIMIZEEND 0x0017 +#define wxACC_EVENT_OBJECT_CREATE 0x8000 +#define wxACC_EVENT_OBJECT_DESTROY 0x8001 +#define wxACC_EVENT_OBJECT_SHOW 0x8002 +#define wxACC_EVENT_OBJECT_HIDE 0x8003 +#define wxACC_EVENT_OBJECT_REORDER 0x8004 +#define wxACC_EVENT_OBJECT_FOCUS 0x8005 +#define wxACC_EVENT_OBJECT_SELECTION 0x8006 +#define wxACC_EVENT_OBJECT_SELECTIONADD 0x8007 +#define wxACC_EVENT_OBJECT_SELECTIONREMOVE 0x8008 +#define wxACC_EVENT_OBJECT_SELECTIONWITHIN 0x8009 +#define wxACC_EVENT_OBJECT_STATECHANGE 0x800A +#define wxACC_EVENT_OBJECT_LOCATIONCHANGE 0x800B +#define wxACC_EVENT_OBJECT_NAMECHANGE 0x800C +#define wxACC_EVENT_OBJECT_DESCRIPTIONCHANGE 0x800D +#define wxACC_EVENT_OBJECT_VALUECHANGE 0x800E +#define wxACC_EVENT_OBJECT_PARENTCHANGE 0x800F +#define wxACC_EVENT_OBJECT_HELPCHANGE 0x8010 +#define wxACC_EVENT_OBJECT_DEFACTIONCHANGE 0x8011 +#define wxACC_EVENT_OBJECT_ACCELERATORCHANGE 0x8012 + +// ---------------------------------------------------------------------------- +// wxAccessible +// All functions return an indication of success, failure, or not implemented. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxAccessible; +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxPoint; +class WXDLLIMPEXP_FWD_CORE wxRect; +class WXDLLIMPEXP_CORE wxAccessibleBase : public wxObject +{ + wxDECLARE_NO_COPY_CLASS(wxAccessibleBase); + +public: + wxAccessibleBase(wxWindow* win): m_window(win) {} + virtual ~wxAccessibleBase() {} + +// Overridables + + // Can return either a child object, or an integer + // representing the child element, starting from 1. + // pt is in screen coordinates. + virtual wxAccStatus HitTest(const wxPoint& WXUNUSED(pt), int* WXUNUSED(childId), wxAccessible** WXUNUSED(childObject)) + { return wxACC_NOT_IMPLEMENTED; } + + // Returns the rectangle for this object (id = 0) or a child element (id > 0). + // rect is in screen coordinates. + virtual wxAccStatus GetLocation(wxRect& WXUNUSED(rect), int WXUNUSED(elementId)) + { return wxACC_NOT_IMPLEMENTED; } + + // Navigates from fromId to toId/toObject. + virtual wxAccStatus Navigate(wxNavDir WXUNUSED(navDir), int WXUNUSED(fromId), + int* WXUNUSED(toId), wxAccessible** WXUNUSED(toObject)) + { return wxACC_NOT_IMPLEMENTED; } + + // Gets the name of the specified object. + virtual wxAccStatus GetName(int WXUNUSED(childId), wxString* WXUNUSED(name)) + { return wxACC_NOT_IMPLEMENTED; } + + // Gets the number of children. + virtual wxAccStatus GetChildCount(int* WXUNUSED(childCount)) + { return wxACC_NOT_IMPLEMENTED; } + + // Gets the specified child (starting from 1). + // If *child is NULL and return value is wxACC_OK, + // this means that the child is a simple element and + // not an accessible object. + virtual wxAccStatus GetChild(int WXUNUSED(childId), wxAccessible** WXUNUSED(child)) + { return wxACC_NOT_IMPLEMENTED; } + + // Gets the parent, or NULL. + virtual wxAccStatus GetParent(wxAccessible** WXUNUSED(parent)) + { return wxACC_NOT_IMPLEMENTED; } + + // Performs the default action. childId is 0 (the action for this object) + // or > 0 (the action for a child). + // Return wxACC_NOT_SUPPORTED if there is no default action for this + // window (e.g. an edit control). + virtual wxAccStatus DoDefaultAction(int WXUNUSED(childId)) + { return wxACC_NOT_IMPLEMENTED; } + + // Gets the default action for this object (0) or > 0 (the action for a child). + // Return wxACC_OK even if there is no action. actionName is the action, or the empty + // string if there is no action. + // The retrieved string describes the action that is performed on an object, + // not what the object does as a result. For example, a toolbar button that prints + // a document has a default action of "Press" rather than "Prints the current document." + virtual wxAccStatus GetDefaultAction(int WXUNUSED(childId), wxString* WXUNUSED(actionName)) + { return wxACC_NOT_IMPLEMENTED; } + + // Returns the description for this object or a child. + virtual wxAccStatus GetDescription(int WXUNUSED(childId), wxString* WXUNUSED(description)) + { return wxACC_NOT_IMPLEMENTED; } + + // Returns help text for this object or a child, similar to tooltip text. + virtual wxAccStatus GetHelpText(int WXUNUSED(childId), wxString* WXUNUSED(helpText)) + { return wxACC_NOT_IMPLEMENTED; } + + // Returns the keyboard shortcut for this object or child. + // Return e.g. ALT+K + virtual wxAccStatus GetKeyboardShortcut(int WXUNUSED(childId), wxString* WXUNUSED(shortcut)) + { return wxACC_NOT_IMPLEMENTED; } + + // Returns a role constant. + virtual wxAccStatus GetRole(int WXUNUSED(childId), wxAccRole* WXUNUSED(role)) + { return wxACC_NOT_IMPLEMENTED; } + + // Returns a state constant. + virtual wxAccStatus GetState(int WXUNUSED(childId), long* WXUNUSED(state)) + { return wxACC_NOT_IMPLEMENTED; } + + // Returns a localized string representing the value for the object + // or child. + virtual wxAccStatus GetValue(int WXUNUSED(childId), wxString* WXUNUSED(strValue)) + { return wxACC_NOT_IMPLEMENTED; } + + // Selects the object or child. + virtual wxAccStatus Select(int WXUNUSED(childId), wxAccSelectionFlags WXUNUSED(selectFlags)) + { return wxACC_NOT_IMPLEMENTED; } + + // Gets the window with the keyboard focus. + // If childId is 0 and child is NULL, no object in + // this subhierarchy has the focus. + // If this object has the focus, child should be 'this'. + virtual wxAccStatus GetFocus(int* WXUNUSED(childId), wxAccessible** WXUNUSED(child)) + { return wxACC_NOT_IMPLEMENTED; } + +#if wxUSE_VARIANT + // Gets a variant representing the selected children + // of this object. + // Acceptable values: + // - a null variant (IsNull() returns TRUE) + // - a list variant (GetType() == wxT("list")) + // - an integer representing the selected child element, + // or 0 if this object is selected (GetType() == wxT("long")) + // - a "void*" pointer to a wxAccessible child object + virtual wxAccStatus GetSelections(wxVariant* WXUNUSED(selections)) + { return wxACC_NOT_IMPLEMENTED; } +#endif // wxUSE_VARIANT + +// Accessors + + // Returns the window associated with this object. + + wxWindow* GetWindow() { return m_window; } + + // Sets the window associated with this object. + + void SetWindow(wxWindow* window) { m_window = window; } + +// Operations + + // Each platform's implementation must define this + // static void NotifyEvent(int eventType, wxWindow* window, wxAccObject objectType, + // int objectId); + +private: + +// Data members + + wxWindow* m_window; +}; + + +// ---------------------------------------------------------------------------- +// now include the declaration of the real class +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/ole/access.h" +#endif + +#endif // wxUSE_ACCESSIBILITY + +#endif // _WX_ACCESSBASE_H_ + diff --git a/wxmsw/include/wx-3.0/wx/affinematrix2d.h b/wxmsw/include/wx-3.0/wx/affinematrix2d.h new file mode 100644 index 00000000..28055f8d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/affinematrix2d.h @@ -0,0 +1,51 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/affinematrix2d.h +// Purpose: wxAffineMatrix2D class. +// Author: Based on wxTransformMatrix by Chris Breeze, Julian Smart +// Created: 2011-04-05 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_AFFINEMATRIX2D_H_ +#define _WX_AFFINEMATRIX2D_H_ + +#include "wx/defs.h" + +#if wxUSE_GEOMETRY + +#include "wx/affinematrix2dbase.h" + +// A simple implementation of wxAffineMatrix2DBase interface done entirely in +// wxWidgets. +class WXDLLIMPEXP_CORE wxAffineMatrix2D : public wxAffineMatrix2DBase +{ +public: + wxAffineMatrix2D() : m_11(1), m_12(0), + m_21(0), m_22(1), + m_tx(0), m_ty(0) + { + } + + // Implement base class pure virtual methods. + virtual void Set(const wxMatrix2D& mat2D, const wxPoint2DDouble& tr); + virtual void Get(wxMatrix2D* mat2D, wxPoint2DDouble* tr) const; + virtual void Concat(const wxAffineMatrix2DBase& t); + virtual bool Invert(); + virtual bool IsIdentity() const; + virtual bool IsEqual(const wxAffineMatrix2DBase& t) const; + virtual void Translate(wxDouble dx, wxDouble dy); + virtual void Scale(wxDouble xScale, wxDouble yScale); + virtual void Rotate(wxDouble cRadians); + +protected: + virtual wxPoint2DDouble DoTransformPoint(const wxPoint2DDouble& p) const; + virtual wxPoint2DDouble DoTransformDistance(const wxPoint2DDouble& p) const; + +private: + wxDouble m_11, m_12, m_21, m_22, m_tx, m_ty; +}; + +#endif // wxUSE_GEOMETRY + +#endif // _WX_AFFINEMATRIX2D_H_ diff --git a/wxmsw/include/wx-3.0/wx/affinematrix2dbase.h b/wxmsw/include/wx-3.0/wx/affinematrix2dbase.h new file mode 100644 index 00000000..94b1955a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/affinematrix2dbase.h @@ -0,0 +1,127 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/affinematrix2dbase.h +// Purpose: Common interface for 2D transformation matrices. +// Author: Catalin Raceanu +// Created: 2011-04-06 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_AFFINEMATRIX2DBASE_H_ +#define _WX_AFFINEMATRIX2DBASE_H_ + +#include "wx/defs.h" + +#if wxUSE_GEOMETRY + +#include "wx/geometry.h" + +struct wxMatrix2D +{ + wxMatrix2D(wxDouble v11 = 1, + wxDouble v12 = 0, + wxDouble v21 = 0, + wxDouble v22 = 1) + { + m_11 = v11; m_12 = v12; + m_21 = v21; m_22 = v22; + } + + wxDouble m_11, m_12, m_21, m_22; +}; + +// A 2x3 matrix representing an affine 2D transformation. +// +// This is an abstract base class implemented by wxAffineMatrix2D only so far, +// but in the future we also plan to derive wxGraphicsMatrix from it (it should +// also be documented then as currently only wxAffineMatrix2D itself is). +class WXDLLIMPEXP_CORE wxAffineMatrix2DBase +{ +public: + wxAffineMatrix2DBase() {} + virtual ~wxAffineMatrix2DBase() {} + + // sets the matrix to the respective values + virtual void Set(const wxMatrix2D& mat2D, const wxPoint2DDouble& tr) = 0; + + // gets the component valuess of the matrix + virtual void Get(wxMatrix2D* mat2D, wxPoint2DDouble* tr) const = 0; + + // concatenates the matrix + virtual void Concat(const wxAffineMatrix2DBase& t) = 0; + + // makes this the inverse matrix + virtual bool Invert() = 0; + + // return true if this is the identity matrix + virtual bool IsIdentity() const = 0; + + // returns true if the elements of the transformation matrix are equal ? + virtual bool IsEqual(const wxAffineMatrix2DBase& t) const = 0; + bool operator==(const wxAffineMatrix2DBase& t) const { return IsEqual(t); } + bool operator!=(const wxAffineMatrix2DBase& t) const { return !IsEqual(t); } + + + // + // transformations + // + + // add the translation to this matrix + virtual void Translate(wxDouble dx, wxDouble dy) = 0; + + // add the scale to this matrix + virtual void Scale(wxDouble xScale, wxDouble yScale) = 0; + + // add the rotation to this matrix (counter clockwise, radians) + virtual void Rotate(wxDouble ccRadians) = 0; + + // add mirroring to this matrix + void Mirror(int direction = wxHORIZONTAL) + { + wxDouble x = (direction & wxHORIZONTAL) ? -1 : 1; + wxDouble y = (direction & wxVERTICAL) ? -1 : 1; + Scale(x, y); + } + + + // applies that matrix to the point + wxPoint2DDouble TransformPoint(const wxPoint2DDouble& src) const + { + return DoTransformPoint(src); + } + + void TransformPoint(wxDouble* x, wxDouble* y) const + { + wxCHECK_RET( x && y, "Can't be NULL" ); + + const wxPoint2DDouble dst = DoTransformPoint(wxPoint2DDouble(*x, *y)); + *x = dst.m_x; + *y = dst.m_y; + } + + // applies the matrix except for translations + wxPoint2DDouble TransformDistance(const wxPoint2DDouble& src) const + { + return DoTransformDistance(src); + } + + void TransformDistance(wxDouble* dx, wxDouble* dy) const + { + wxCHECK_RET( dx && dy, "Can't be NULL" ); + + const wxPoint2DDouble + dst = DoTransformDistance(wxPoint2DDouble(*dx, *dy)); + *dx = dst.m_x; + *dy = dst.m_y; + } + +protected: + virtual + wxPoint2DDouble DoTransformPoint(const wxPoint2DDouble& p) const = 0; + virtual + wxPoint2DDouble DoTransformDistance(const wxPoint2DDouble& p) const = 0; +}; + +#endif // wxUSE_GEOMETRY + +#endif // _WX_AFFINEMATRIX2DBASE_H_ diff --git a/wxmsw/include/wx-3.0/wx/afterstd.h b/wxmsw/include/wx-3.0/wx/afterstd.h new file mode 100644 index 00000000..16075fe5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/afterstd.h @@ -0,0 +1,44 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/afterstd.h +// Purpose: #include after STL headers +// Author: Vadim Zeitlin +// Modified by: +// Created: 07/07/03 +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/** + See the comments in beforestd.h. + */ + +#if defined(__WINDOWS__) + #include "wx/msw/winundef.h" +#endif + +// undo what we did in wx/beforestd.h +#if defined(__VISUALC__) && __VISUALC__ <= 1201 + // MSVC 5 does not have this + #if _MSC_VER > 1100 + #pragma warning(pop) + #else + // 'expression' : signed/unsigned mismatch + #pragma warning(default:4018) + + // 'identifier' : unreferenced formal parameter + #pragma warning(default:4100) + + // 'conversion' : conversion from 'type1' to 'type2', + // possible loss of data + #pragma warning(default:4244) + + // C++ language change: to explicitly specialize class template + // 'identifier' use the following syntax + #pragma warning(default:4663) + #endif +#endif + +// see beforestd.h for explanation +#if defined(HAVE_VISIBILITY) && defined(HAVE_BROKEN_LIBSTDCXX_VISIBILITY) + #pragma GCC visibility pop +#endif diff --git a/wxmsw/include/wx-3.0/wx/anidecod.h b/wxmsw/include/wx-3.0/wx/anidecod.h new file mode 100644 index 00000000..2923887b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/anidecod.h @@ -0,0 +1,80 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/anidecod.h +// Purpose: wxANIDecoder, ANI reader for wxImage and wxAnimation +// Author: Francesco Montorsi +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ANIDECOD_H +#define _WX_ANIDECOD_H + +#include "wx/defs.h" + +#if wxUSE_STREAMS && (wxUSE_ICO_CUR || wxUSE_GIF) + +#include "wx/stream.h" +#include "wx/image.h" +#include "wx/animdecod.h" +#include "wx/dynarray.h" + + +class /*WXDLLIMPEXP_CORE*/ wxANIFrameInfo; // private implementation detail + +WX_DECLARE_EXPORTED_OBJARRAY(wxANIFrameInfo, wxANIFrameInfoArray); +WX_DECLARE_EXPORTED_OBJARRAY(wxImage, wxImageArray); + +// -------------------------------------------------------------------------- +// wxANIDecoder class +// -------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxANIDecoder : public wxAnimationDecoder +{ +public: + // constructor, destructor, etc. + wxANIDecoder(); + ~wxANIDecoder(); + + + virtual wxSize GetFrameSize(unsigned int frame) const; + virtual wxPoint GetFramePosition(unsigned int frame) const; + virtual wxAnimationDisposal GetDisposalMethod(unsigned int frame) const; + virtual long GetDelay(unsigned int frame) const; + virtual wxColour GetTransparentColour(unsigned int frame) const; + + // implementation of wxAnimationDecoder's pure virtuals + + virtual bool Load( wxInputStream& stream ); + + bool ConvertToImage(unsigned int frame, wxImage *image) const; + + wxAnimationDecoder *Clone() const + { return new wxANIDecoder; } + wxAnimationType GetType() const + { return wxANIMATION_TYPE_ANI; } + +private: + // wxAnimationDecoder pure virtual: + virtual bool DoCanRead( wxInputStream& stream ) const; + // modifies current stream position (see wxAnimationDecoder::CanRead) + + // frames stored as wxImage(s): ANI files are meant to be used mostly for animated + // cursors and thus they do not use any optimization to encode differences between + // two frames: they are just a list of images to display sequentially. + wxImageArray m_images; + + // the info about each image stored in m_images. + // NB: m_info.GetCount() may differ from m_images.GetCount()! + wxANIFrameInfoArray m_info; + + // this is the wxCURHandler used to load the ICON chunk of the ANI files + static wxCURHandler sm_handler; + + + wxDECLARE_NO_COPY_CLASS(wxANIDecoder); +}; + + +#endif // wxUSE_STREAMS && (wxUSE_ICO_CUR || wxUSE_GIF) + +#endif // _WX_ANIDECOD_H diff --git a/wxmsw/include/wx-3.0/wx/animate.h b/wxmsw/include/wx-3.0/wx/animate.h new file mode 100644 index 00000000..6243fb45 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/animate.h @@ -0,0 +1,125 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/animate.h +// Purpose: wxAnimation and wxAnimationCtrl +// Author: Julian Smart and Guillermo Rodriguez Garcia +// Modified by: Francesco Montorsi +// Created: 13/8/99 +// Copyright: (c) Julian Smart and Guillermo Rodriguez Garcia +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ANIMATE_H_ +#define _WX_ANIMATE_H_ + +#include "wx/defs.h" + +#if wxUSE_ANIMATIONCTRL + +#include "wx/animdecod.h" +#include "wx/control.h" +#include "wx/timer.h" +#include "wx/bitmap.h" + +class WXDLLIMPEXP_FWD_ADV wxAnimation; + +extern WXDLLIMPEXP_DATA_ADV(wxAnimation) wxNullAnimation; +extern WXDLLIMPEXP_DATA_ADV(const char) wxAnimationCtrlNameStr[]; + + +// ---------------------------------------------------------------------------- +// wxAnimationBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxAnimationBase : public wxObject +{ +public: + wxAnimationBase() {} + + virtual bool IsOk() const = 0; + + // can be -1 + virtual int GetDelay(unsigned int frame) const = 0; + + virtual unsigned int GetFrameCount() const = 0; + virtual wxImage GetFrame(unsigned int frame) const = 0; + virtual wxSize GetSize() const = 0; + + virtual bool LoadFile(const wxString& name, + wxAnimationType type = wxANIMATION_TYPE_ANY) = 0; + virtual bool Load(wxInputStream& stream, + wxAnimationType type = wxANIMATION_TYPE_ANY) = 0; + +protected: + DECLARE_ABSTRACT_CLASS(wxAnimationBase) +}; + + + +// ---------------------------------------------------------------------------- +// wxAnimationCtrlBase +// ---------------------------------------------------------------------------- + +// do not autoresize to the animation's size when SetAnimation() is called +#define wxAC_NO_AUTORESIZE (0x0010) + +// default style does not include wxAC_NO_AUTORESIZE, that is, the control +// auto-resizes by default to fit the new animation when SetAnimation() is called +#define wxAC_DEFAULT_STYLE (wxBORDER_NONE) + +class WXDLLIMPEXP_ADV wxAnimationCtrlBase : public wxControl +{ +public: + wxAnimationCtrlBase() { } + + // public API + virtual bool LoadFile(const wxString& filename, + wxAnimationType type = wxANIMATION_TYPE_ANY) = 0; + virtual bool Load(wxInputStream& stream, + wxAnimationType type = wxANIMATION_TYPE_ANY) = 0; + + virtual void SetAnimation(const wxAnimation &anim) = 0; + virtual wxAnimation GetAnimation() const = 0; + + virtual bool Play() = 0; + virtual void Stop() = 0; + + virtual bool IsPlaying() const = 0; + + virtual void SetInactiveBitmap(const wxBitmap &bmp); + + // always return the original bitmap set in this control + wxBitmap GetInactiveBitmap() const + { return m_bmpStatic; } + +protected: + // the inactive bitmap as it was set by the user + wxBitmap m_bmpStatic; + + // the inactive bitmap currently shown in the control + // (may differ in the size from m_bmpStatic) + wxBitmap m_bmpStaticReal; + + // updates m_bmpStaticReal from m_bmpStatic if needed + virtual void UpdateStaticImage(); + + // called by SetInactiveBitmap + virtual void DisplayStaticImage() = 0; + +private: + DECLARE_ABSTRACT_CLASS(wxAnimationCtrlBase) +}; + + +// ---------------------------------------------------------------------------- +// include the platform-specific version of the wxAnimationCtrl class +// ---------------------------------------------------------------------------- + +#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/animate.h" +#else + #include "wx/generic/animate.h" +#endif + +#endif // wxUSE_ANIMATIONCTRL + +#endif // _WX_ANIMATE_H_ diff --git a/wxmsw/include/wx-3.0/wx/animdecod.h b/wxmsw/include/wx-3.0/wx/animdecod.h new file mode 100644 index 00000000..58177e68 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/animdecod.h @@ -0,0 +1,170 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/animdecod.h +// Purpose: wxAnimationDecoder +// Author: Francesco Montorsi +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ANIMDECOD_H +#define _WX_ANIMDECOD_H + +#include "wx/defs.h" + +#if wxUSE_STREAMS + +#include "wx/colour.h" +#include "wx/gdicmn.h" +#include "wx/log.h" +#include "wx/stream.h" + +class WXDLLIMPEXP_FWD_CORE wxImage; + +/* + + Differences between a wxAnimationDecoder and a wxImageHandler: + + 1) wxImageHandlers always load an input stream directly into a given wxImage + object converting from the format-specific data representation to the + wxImage native format (RGB24). + wxAnimationDecoders always load an input stream using some optimized format + to store it which is format-depedent. This allows to store a (possibly big) + animation using a format which is a good compromise between required memory + and time required to blit it on the screen. + + 2) wxAnimationDecoders contain the animation data in some internal variable. + That's why they derive from wxObjectRefData: they are data which can be shared. + + 3) wxAnimationDecoders can be used by a wxImageHandler to retrieve a frame + in wxImage format; the viceversa cannot be done. + + 4) wxAnimationDecoders are decoders only, thus they do not support save features. + + 5) wxAnimationDecoders are directly used by wxAnimation (generic implementation) + as wxObjectRefData while they need to be 'wrapped' by a wxImageHandler for + wxImage uses. + +*/ + + +// -------------------------------------------------------------------------- +// Constants +// -------------------------------------------------------------------------- + +// NB: the values of these enum items are not casual but coincide with the +// GIF disposal codes. Do not change them !! +enum wxAnimationDisposal +{ + // No disposal specified. The decoder is not required to take any action. + wxANIM_UNSPECIFIED = -1, + + // Do not dispose. The graphic is to be left in place. + wxANIM_DONOTREMOVE = 0, + + // Restore to background color. The area used by the graphic must be + // restored to the background color. + wxANIM_TOBACKGROUND = 1, + + // Restore to previous. The decoder is required to restore the area + // overwritten by the graphic with what was there prior to rendering the graphic. + wxANIM_TOPREVIOUS = 2 +}; + +enum wxAnimationType +{ + wxANIMATION_TYPE_INVALID, + wxANIMATION_TYPE_GIF, + wxANIMATION_TYPE_ANI, + + wxANIMATION_TYPE_ANY +}; + + +// -------------------------------------------------------------------------- +// wxAnimationDecoder class +// -------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxAnimationDecoder : public wxObjectRefData +{ +public: + wxAnimationDecoder() + { + m_nFrames = 0; + } + + virtual bool Load( wxInputStream& stream ) = 0; + + bool CanRead( wxInputStream& stream ) const + { + // NOTE: this code is the same of wxImageHandler::CallDoCanRead + + if ( !stream.IsSeekable() ) + return false; // can't test unseekable stream + + wxFileOffset posOld = stream.TellI(); + bool ok = DoCanRead(stream); + + // restore the old position to be able to test other formats and so on + if ( stream.SeekI(posOld) == wxInvalidOffset ) + { + wxLogDebug(wxT("Failed to rewind the stream in wxAnimationDecoder!")); + + // reading would fail anyhow as we're not at the right position + return false; + } + + return ok; + } + + virtual wxAnimationDecoder *Clone() const = 0; + virtual wxAnimationType GetType() const = 0; + + // convert given frame to wxImage + virtual bool ConvertToImage(unsigned int frame, wxImage *image) const = 0; + + + // frame specific data getters + + // not all frames may be of the same size; e.g. GIF allows to + // specify that between two frames only a smaller portion of the + // entire animation has changed. + virtual wxSize GetFrameSize(unsigned int frame) const = 0; + + // the position of this frame in case it's not as big as m_szAnimation + // or wxPoint(0,0) otherwise. + virtual wxPoint GetFramePosition(unsigned int frame) const = 0; + + // what should be done after displaying this frame. + virtual wxAnimationDisposal GetDisposalMethod(unsigned int frame) const = 0; + + // the number of milliseconds this frame should be displayed. + // if returns -1 then the frame must be displayed forever. + virtual long GetDelay(unsigned int frame) const = 0; + + // the transparent colour for this frame if any or wxNullColour. + virtual wxColour GetTransparentColour(unsigned int frame) const = 0; + + // get global data + wxSize GetAnimationSize() const { return m_szAnimation; } + wxColour GetBackgroundColour() const { return m_background; } + unsigned int GetFrameCount() const { return m_nFrames; } + +protected: + // checks the signature of the data in the given stream and returns true if it + // appears to be a valid animation format recognized by the animation decoder; + // this function should modify the stream current position without taking care + // of restoring it since CanRead() will do it. + virtual bool DoCanRead(wxInputStream& stream) const = 0; + + wxSize m_szAnimation; + unsigned int m_nFrames; + + // this is the colour to use for the wxANIM_TOBACKGROUND disposal. + // if not specified by the animation, it's set to wxNullColour + wxColour m_background; +}; + +#endif // wxUSE_STREAMS + +#endif // _WX_ANIMDECOD_H + diff --git a/wxmsw/include/wx-3.0/wx/any.h b/wxmsw/include/wx-3.0/wx/any.h new file mode 100644 index 00000000..c2cd7a79 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/any.h @@ -0,0 +1,1113 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/any.h +// Purpose: wxAny class +// Author: Jaakko Salli +// Modified by: +// Created: 07/05/2009 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ANY_H_ +#define _WX_ANY_H_ + +#include "wx/defs.h" + +#if wxUSE_ANY + +#include // for placement new +#include "wx/string.h" +#include "wx/meta/if.h" +#include "wx/typeinfo.h" +#include "wx/list.h" + +// Size of the wxAny value buffer. +enum +{ + WX_ANY_VALUE_BUFFER_SIZE = 16 +}; + +union wxAnyValueBuffer +{ + union Alignment + { + #if wxHAS_INT64 + wxInt64 m_int64; + #endif + long double m_longDouble; + void ( *m_funcPtr )(void); + void ( wxAnyValueBuffer::*m_mFuncPtr )(void); + } m_alignment; + + void* m_ptr; + wxByte m_buffer[WX_ANY_VALUE_BUFFER_SIZE]; +}; + +// +// wxAnyValueType is base class for value type functionality for C++ data +// types used with wxAny. Usually the default template (wxAnyValueTypeImpl<>) +// will create a satisfactory wxAnyValueType implementation for a data type. +// +class WXDLLIMPEXP_BASE wxAnyValueType +{ + WX_DECLARE_ABSTRACT_TYPEINFO(wxAnyValueType) +public: + /** + Default constructor. + */ + wxAnyValueType() + { + } + + /** + Destructor. + */ + virtual ~wxAnyValueType() + { + } + + /** + This function is used for internal type matching. + */ + virtual bool IsSameType(const wxAnyValueType* otherType) const = 0; + + /** + This function is called every time the data in wxAny + buffer needs to be freed. + */ + virtual void DeleteValue(wxAnyValueBuffer& buf) const = 0; + + /** + Implement this for buffer-to-buffer copy. + + @param src + This is the source data buffer. + + @param dst + This is the destination data buffer that is in either + uninitialized or freed state. + */ + virtual void CopyBuffer(const wxAnyValueBuffer& src, + wxAnyValueBuffer& dst) const = 0; + + /** + Convert value into buffer of different type. Return false if + not possible. + */ + virtual bool ConvertValue(const wxAnyValueBuffer& src, + wxAnyValueType* dstType, + wxAnyValueBuffer& dst) const = 0; + + /** + Use this template function for checking if wxAnyValueType represents + a specific C++ data type. + + @remarks This template function does not work on some older compilers + (such as Visual C++ 6.0). For full compiler compatibility + please use wxANY_VALUE_TYPE_CHECK_TYPE(valueTypePtr, T) macro + instead. + + @see wxAny::CheckType() + */ + // FIXME-VC6: remove this hack when VC6 is no longer supported + template + bool CheckType(T* reserved = NULL) const; + +#if wxUSE_EXTENDED_RTTI + virtual const wxTypeInfo* GetTypeInfo() const = 0; +#endif +private: +}; + + +// +// We need to allocate wxAnyValueType instances in heap, and need to use +// scoped ptr to properly deallocate them in dynamic library use cases. +// Here we have a minimal specialized scoped ptr implementation to deal +// with various compiler-specific problems with template class' static +// member variable of template type with explicit constructor which +// is initialized in global scope. +// +class wxAnyValueTypeScopedPtr +{ +public: + wxAnyValueTypeScopedPtr(wxAnyValueType* ptr) : m_ptr(ptr) { } + ~wxAnyValueTypeScopedPtr() { delete m_ptr; } + wxAnyValueType* get() const { return m_ptr; } +private: + wxAnyValueType* m_ptr; +}; + + +// +// This method of checking the type is compatible with VC6 +#define wxANY_VALUE_TYPE_CHECK_TYPE(valueTypePtr, T) \ + wxAnyValueTypeImpl::IsSameClass(valueTypePtr) + + +/** + Helper macro for defining user value types. + + Even though C++ RTTI would be fully available to use, we'd have to to + facilitate sub-type system which allows, for instance, wxAny with + signed short '15' to be treated equal to wxAny with signed long long '15'. + Having sm_instance is important here. + + NB: We really need to have wxAnyValueType instances allocated + in heap. They are stored as static template member variables, + and with them we just can't be too careful (eg. not allocating + them in heap broke the type identification in GCC). +*/ +#define WX_DECLARE_ANY_VALUE_TYPE(CLS) \ + friend class wxAny; \ + WX_DECLARE_TYPEINFO_INLINE(CLS) \ +public: \ + static bool IsSameClass(const wxAnyValueType* otherType) \ + { \ + return wxTypeId(*sm_instance.get()) == wxTypeId(*otherType); \ + } \ + virtual bool IsSameType(const wxAnyValueType* otherType) const \ + { \ + return IsSameClass(otherType); \ + } \ +private: \ + static wxAnyValueTypeScopedPtr sm_instance; \ +public: \ + static wxAnyValueType* GetInstance() \ + { \ + return sm_instance.get(); \ + } + + +#define WX_IMPLEMENT_ANY_VALUE_TYPE(CLS) \ +wxAnyValueTypeScopedPtr CLS::sm_instance(new CLS()); + + +#ifdef __VISUALC6__ + // "non dll-interface class 'xxx' used as base interface + #pragma warning (push) + #pragma warning (disable:4275) +#endif + +/** + Following are helper classes for the wxAnyValueTypeImplBase. +*/ +namespace wxPrivate +{ + +template +class wxAnyValueTypeOpsInplace +{ +public: + static void DeleteValue(wxAnyValueBuffer& buf) + { + T* value = reinterpret_cast(&buf.m_buffer[0]); + value->~T(); + + // Some compiler may given 'unused variable' warnings without this + wxUnusedVar(value); + } + + static void SetValue(const T& value, + wxAnyValueBuffer& buf) + { + // Use placement new + void* const place = buf.m_buffer; + ::new(place) T(value); + } + + static const T& GetValue(const wxAnyValueBuffer& buf) + { + // Breaking this code into two lines should suppress + // GCC's 'type-punned pointer will break strict-aliasing rules' + // warning. + const T* value = reinterpret_cast(&buf.m_buffer[0]); + return *value; + } +}; + + +template +class wxAnyValueTypeOpsGeneric +{ +public: + template + class DataHolder + { + public: + DataHolder(const T2& value) + { + m_value = value; + } + virtual ~DataHolder() { } + + T2 m_value; + private: + wxDECLARE_NO_COPY_CLASS(DataHolder); + }; + + static void DeleteValue(wxAnyValueBuffer& buf) + { + DataHolder* holder = static_cast*>(buf.m_ptr); + delete holder; + } + + static void SetValue(const T& value, + wxAnyValueBuffer& buf) + { + DataHolder* holder = new DataHolder(value); + buf.m_ptr = holder; + } + + static const T& GetValue(const wxAnyValueBuffer& buf) + { + DataHolder* holder = static_cast*>(buf.m_ptr); + return holder->m_value; + } +}; + +} // namespace wxPrivate + + +/** + Intermediate template for the generic value type implementation. + We can derive from this same value type for multiple actual types + (for instance, we can have wxAnyValueTypeImplInt for all signed + integer types), and also easily implement specialized templates + with specific dynamic type conversion. +*/ +template +class wxAnyValueTypeImplBase : public wxAnyValueType +{ + typedef typename wxIf< sizeof(T) <= WX_ANY_VALUE_BUFFER_SIZE, + wxPrivate::wxAnyValueTypeOpsInplace, + wxPrivate::wxAnyValueTypeOpsGeneric >::value + Ops; + +public: + wxAnyValueTypeImplBase() : wxAnyValueType() { } + virtual ~wxAnyValueTypeImplBase() { } + + virtual void DeleteValue(wxAnyValueBuffer& buf) const + { + Ops::DeleteValue(buf); + } + + virtual void CopyBuffer(const wxAnyValueBuffer& src, + wxAnyValueBuffer& dst) const + { + Ops::SetValue(Ops::GetValue(src), dst); + } + + /** + It is important to reimplement this in any specialized template + classes that inherit from wxAnyValueTypeImplBase. + */ + static void SetValue(const T& value, + wxAnyValueBuffer& buf) + { + Ops::SetValue(value, buf); + } + + /** + It is important to reimplement this in any specialized template + classes that inherit from wxAnyValueTypeImplBase. + */ + static const T& GetValue(const wxAnyValueBuffer& buf) + { + return Ops::GetValue(buf); + } +#if wxUSE_EXTENDED_RTTI + virtual const wxTypeInfo* GetTypeInfo() const + { + return wxGetTypeInfo((T*)NULL); + } +#endif +}; + + +/* + Generic value type template. Note that bulk of the implementation + resides in wxAnyValueTypeImplBase. +*/ +template +class wxAnyValueTypeImpl : public wxAnyValueTypeImplBase +{ + WX_DECLARE_ANY_VALUE_TYPE(wxAnyValueTypeImpl) +public: + wxAnyValueTypeImpl() : wxAnyValueTypeImplBase() { } + virtual ~wxAnyValueTypeImpl() { } + + virtual bool ConvertValue(const wxAnyValueBuffer& src, + wxAnyValueType* dstType, + wxAnyValueBuffer& dst) const + { + wxUnusedVar(src); + wxUnusedVar(dstType); + wxUnusedVar(dst); + return false; + } +}; + +template +wxAnyValueTypeScopedPtr wxAnyValueTypeImpl::sm_instance = new wxAnyValueTypeImpl(); + + +// +// Helper macro for using same base value type implementation for multiple +// actual C++ data types. +// +#define _WX_ANY_DEFINE_SUB_TYPE(T, CLSTYPE) \ +template<> \ +class wxAnyValueTypeImpl : public wxAnyValueTypeImpl##CLSTYPE \ +{ \ + typedef wxAnyBase##CLSTYPE##Type UseDataType; \ +public: \ + wxAnyValueTypeImpl() : wxAnyValueTypeImpl##CLSTYPE() { } \ + virtual ~wxAnyValueTypeImpl() { } \ + static void SetValue(const T& value, wxAnyValueBuffer& buf) \ + { \ + void* voidPtr = reinterpret_cast(&buf.m_buffer[0]); \ + UseDataType* dptr = reinterpret_cast(voidPtr); \ + *dptr = static_cast(value); \ + } \ + static T GetValue(const wxAnyValueBuffer& buf) \ + { \ + const void* voidPtr = \ + reinterpret_cast(&buf.m_buffer[0]); \ + const UseDataType* sptr = \ + reinterpret_cast(voidPtr); \ + return static_cast(*sptr); \ + } + +#if wxUSE_EXTENDED_RTTI +#define WX_ANY_DEFINE_SUB_TYPE(T, CLSTYPE) \ +_WX_ANY_DEFINE_SUB_TYPE(T, CLSTYPE)\ + virtual const wxTypeInfo* GetTypeInfo() const \ + { \ + return wxGetTypeInfo((T*)NULL); \ + } \ +}; +#else +#define WX_ANY_DEFINE_SUB_TYPE(T, CLSTYPE) \ +_WX_ANY_DEFINE_SUB_TYPE(T, CLSTYPE)\ +}; +#endif + +// +// Integer value types +// + +#ifdef wxLongLong_t + typedef wxLongLong_t wxAnyBaseIntType; + typedef wxULongLong_t wxAnyBaseUintType; +#else + typedef long wxAnyBaseIntType; + typedef unsigned long wxAnyBaseUintType; +#endif + + +class WXDLLIMPEXP_BASE wxAnyValueTypeImplInt : + public wxAnyValueTypeImplBase +{ + WX_DECLARE_ANY_VALUE_TYPE(wxAnyValueTypeImplInt) +public: + wxAnyValueTypeImplInt() : + wxAnyValueTypeImplBase() { } + virtual ~wxAnyValueTypeImplInt() { } + + virtual bool ConvertValue(const wxAnyValueBuffer& src, + wxAnyValueType* dstType, + wxAnyValueBuffer& dst) const; +}; + + +class WXDLLIMPEXP_BASE wxAnyValueTypeImplUint : + public wxAnyValueTypeImplBase +{ + WX_DECLARE_ANY_VALUE_TYPE(wxAnyValueTypeImplUint) +public: + wxAnyValueTypeImplUint() : + wxAnyValueTypeImplBase() { } + virtual ~wxAnyValueTypeImplUint() { } + + virtual bool ConvertValue(const wxAnyValueBuffer& src, + wxAnyValueType* dstType, + wxAnyValueBuffer& dst) const; +}; + + +WX_ANY_DEFINE_SUB_TYPE(signed long, Int) +WX_ANY_DEFINE_SUB_TYPE(signed int, Int) +WX_ANY_DEFINE_SUB_TYPE(signed short, Int) +WX_ANY_DEFINE_SUB_TYPE(signed char, Int) +#ifdef wxLongLong_t +WX_ANY_DEFINE_SUB_TYPE(wxLongLong_t, Int) +#endif + +WX_ANY_DEFINE_SUB_TYPE(unsigned long, Uint) +WX_ANY_DEFINE_SUB_TYPE(unsigned int, Uint) +WX_ANY_DEFINE_SUB_TYPE(unsigned short, Uint) +WX_ANY_DEFINE_SUB_TYPE(unsigned char, Uint) +#ifdef wxLongLong_t +WX_ANY_DEFINE_SUB_TYPE(wxULongLong_t, Uint) +#endif + + +// +// This macro is used in header, but then in source file we must have: +// WX_IMPLEMENT_ANY_VALUE_TYPE(wxAnyValueTypeImpl##TYPENAME) +// +#define _WX_ANY_DEFINE_CONVERTIBLE_TYPE(T, TYPENAME, CONVFUNC, GV) \ +class WXDLLIMPEXP_BASE wxAnyValueTypeImpl##TYPENAME : \ + public wxAnyValueTypeImplBase \ +{ \ + WX_DECLARE_ANY_VALUE_TYPE(wxAnyValueTypeImpl##TYPENAME) \ +public: \ + wxAnyValueTypeImpl##TYPENAME() : \ + wxAnyValueTypeImplBase() { } \ + virtual ~wxAnyValueTypeImpl##TYPENAME() { } \ + virtual bool ConvertValue(const wxAnyValueBuffer& src, \ + wxAnyValueType* dstType, \ + wxAnyValueBuffer& dst) const \ + { \ + GV value = GetValue(src); \ + return CONVFUNC(value, dstType, dst); \ + } \ +}; \ +template<> \ +class wxAnyValueTypeImpl : public wxAnyValueTypeImpl##TYPENAME \ +{ \ +public: \ + wxAnyValueTypeImpl() : wxAnyValueTypeImpl##TYPENAME() { } \ + virtual ~wxAnyValueTypeImpl() { } \ +}; + +#define WX_ANY_DEFINE_CONVERTIBLE_TYPE(T, TYPENAME, CONVFUNC, BT) \ +_WX_ANY_DEFINE_CONVERTIBLE_TYPE(T, TYPENAME, CONVFUNC, BT) \ + +#define WX_ANY_DEFINE_CONVERTIBLE_TYPE_BASE(T, TYPENAME, CONVFUNC) \ +_WX_ANY_DEFINE_CONVERTIBLE_TYPE(T, TYPENAME, \ + CONVFUNC, const T&) \ + +// +// String value type +// + +// Convert wxString to destination wxAny value type +extern WXDLLIMPEXP_BASE bool wxAnyConvertString(const wxString& value, + wxAnyValueType* dstType, + wxAnyValueBuffer& dst); + +WX_ANY_DEFINE_CONVERTIBLE_TYPE_BASE(wxString, wxString, wxAnyConvertString) +WX_ANY_DEFINE_CONVERTIBLE_TYPE(const char*, ConstCharPtr, + wxAnyConvertString, wxString) +WX_ANY_DEFINE_CONVERTIBLE_TYPE(const wchar_t*, ConstWchar_tPtr, + wxAnyConvertString, wxString) + +// +// Bool value type +// +template<> +class WXDLLIMPEXP_BASE wxAnyValueTypeImpl : + public wxAnyValueTypeImplBase +{ + WX_DECLARE_ANY_VALUE_TYPE(wxAnyValueTypeImpl) +public: + wxAnyValueTypeImpl() : + wxAnyValueTypeImplBase() { } + virtual ~wxAnyValueTypeImpl() { } + + virtual bool ConvertValue(const wxAnyValueBuffer& src, + wxAnyValueType* dstType, + wxAnyValueBuffer& dst) const; +}; + +// +// Floating point value type +// +class WXDLLIMPEXP_BASE wxAnyValueTypeImplDouble : + public wxAnyValueTypeImplBase +{ + WX_DECLARE_ANY_VALUE_TYPE(wxAnyValueTypeImplDouble) +public: + wxAnyValueTypeImplDouble() : + wxAnyValueTypeImplBase() { } + virtual ~wxAnyValueTypeImplDouble() { } + + virtual bool ConvertValue(const wxAnyValueBuffer& src, + wxAnyValueType* dstType, + wxAnyValueBuffer& dst) const; +}; + +// WX_ANY_DEFINE_SUB_TYPE requires this +typedef double wxAnyBaseDoubleType; + +WX_ANY_DEFINE_SUB_TYPE(float, Double) +WX_ANY_DEFINE_SUB_TYPE(double, Double) + + +// +// Defines a dummy wxAnyValueTypeImpl<> with given export +// declaration. This is needed if a class is used with +// wxAny in both user shared library and application. +// +#define wxDECLARE_ANY_TYPE(CLS, DECL) \ +template<> \ +class DECL wxAnyValueTypeImpl : \ + public wxAnyValueTypeImplBase \ +{ \ + WX_DECLARE_ANY_VALUE_TYPE(wxAnyValueTypeImpl) \ +public: \ + wxAnyValueTypeImpl() : \ + wxAnyValueTypeImplBase() { } \ + virtual ~wxAnyValueTypeImpl() { } \ + \ + virtual bool ConvertValue(const wxAnyValueBuffer& src, \ + wxAnyValueType* dstType, \ + wxAnyValueBuffer& dst) const \ + { \ + wxUnusedVar(src); \ + wxUnusedVar(dstType); \ + wxUnusedVar(dst); \ + return false; \ + } \ +}; + + +// Make sure some of wx's own types get the right wxAnyValueType export +// (this is needed only for types that are referred to from wxBase. +// currently we may not use any of these types from there, but let's +// use the macro on at least one to make sure it compiles since we can't +// really test it properly in unit tests since a separate DLL would +// be needed). +#if wxUSE_DATETIME + #include "wx/datetime.h" + wxDECLARE_ANY_TYPE(wxDateTime, WXDLLIMPEXP_BASE) +#endif + +//#include "wx/object.h" +//wxDECLARE_ANY_TYPE(wxObject*, WXDLLIMPEXP_BASE) + +//#include "wx/arrstr.h" +//wxDECLARE_ANY_TYPE(wxArrayString, WXDLLIMPEXP_BASE) + + +#if wxUSE_VARIANT + +class WXDLLIMPEXP_FWD_BASE wxAnyToVariantRegistration; + +// Because of header inter-dependencies, cannot include this earlier +#include "wx/variant.h" + +// +// wxVariantData* data type implementation. For cases when appropriate +// wxAny<->wxVariant conversion code is missing. +// + +class WXDLLIMPEXP_BASE wxAnyValueTypeImplVariantData : + public wxAnyValueTypeImplBase +{ + WX_DECLARE_ANY_VALUE_TYPE(wxAnyValueTypeImplVariantData) +public: + wxAnyValueTypeImplVariantData() : + wxAnyValueTypeImplBase() { } + virtual ~wxAnyValueTypeImplVariantData() { } + + virtual void DeleteValue(wxAnyValueBuffer& buf) const + { + wxVariantData* data = static_cast(buf.m_ptr); + if ( data ) + data->DecRef(); + } + + virtual void CopyBuffer(const wxAnyValueBuffer& src, + wxAnyValueBuffer& dst) const + { + wxVariantData* data = static_cast(src.m_ptr); + if ( data ) + data->IncRef(); + dst.m_ptr = data; + } + + static void SetValue(wxVariantData* value, + wxAnyValueBuffer& buf) + { + value->IncRef(); + buf.m_ptr = value; + } + + static wxVariantData* GetValue(const wxAnyValueBuffer& buf) + { + return static_cast(buf.m_ptr); + } + + virtual bool ConvertValue(const wxAnyValueBuffer& src, + wxAnyValueType* dstType, + wxAnyValueBuffer& dst) const + { + wxUnusedVar(src); + wxUnusedVar(dstType); + wxUnusedVar(dst); + return false; + } +}; + +template<> +class wxAnyValueTypeImpl : + public wxAnyValueTypeImplVariantData +{ +public: + wxAnyValueTypeImpl() : wxAnyValueTypeImplVariantData() { } + virtual ~wxAnyValueTypeImpl() { } +}; + +#endif // wxUSE_VARIANT + +#ifdef __VISUALC6__ + // Re-enable useless VC6 warnings + #pragma warning (pop) +#endif + + +/* + Let's define a discrete Null value so we don't have to really + ever check if wxAny.m_type pointer is NULL or not. This is an + optimization, mostly. Implementation of this value type is + "hidden" in the source file. +*/ +extern WXDLLIMPEXP_DATA_BASE(wxAnyValueType*) wxAnyNullValueType; + + +// +// We need to implement custom signed/unsigned int equals operators +// for signed/unsigned (eg. wxAny(128UL) == 128L) comparisons to work. +#define WXANY_IMPLEMENT_INT_EQ_OP(TS, TUS) \ +bool operator==(TS value) const \ +{ \ + if ( wxAnyValueTypeImpl::IsSameClass(m_type) ) \ + return (value == static_cast \ + (wxAnyValueTypeImpl::GetValue(m_buffer))); \ + if ( wxAnyValueTypeImpl::IsSameClass(m_type) ) \ + return (value == static_cast \ + (wxAnyValueTypeImpl::GetValue(m_buffer))); \ + return false; \ +} \ +bool operator==(TUS value) const \ +{ \ + if ( wxAnyValueTypeImpl::IsSameClass(m_type) ) \ + return (value == static_cast \ + (wxAnyValueTypeImpl::GetValue(m_buffer))); \ + if ( wxAnyValueTypeImpl::IsSameClass(m_type) ) \ + return (value == static_cast \ + (wxAnyValueTypeImpl::GetValue(m_buffer))); \ + return false; \ +} + + +#if wxUSE_VARIANT + +// Note that the following functions are implemented outside wxAny class +// so that it can reside entirely in header and lack the export declaration. + +// Helper function used to associate wxAnyValueType with a wxVariantData. +extern WXDLLIMPEXP_BASE void +wxPreRegisterAnyToVariant(wxAnyToVariantRegistration* reg); + +// This function performs main wxAny to wxVariant conversion duties. +extern WXDLLIMPEXP_BASE bool +wxConvertAnyToVariant(const wxAny& any, wxVariant* variant); + +#endif // wxUSE_VARIANT + + +// +// The wxAny class represents a container for any type. A variant's value +// can be changed at run time, possibly to a different type of value. +// +// As standard, wxAny can store value of almost any type, in a fairly +// optimal manner even. +// +class wxAny +{ +public: + /** + Default constructor. + */ + wxAny() + { + m_type = wxAnyNullValueType; + } + + /** + Destructor. + */ + ~wxAny() + { + m_type->DeleteValue(m_buffer); + } + + //@{ + /** + Various constructors. + */ + template + wxAny(const T& value) + { + m_type = wxAnyValueTypeImpl::sm_instance.get(); + wxAnyValueTypeImpl::SetValue(value, m_buffer); + } + + // These two constructors are needed to deal with string literals + wxAny(const char* value) + { + m_type = wxAnyValueTypeImpl::sm_instance.get(); + wxAnyValueTypeImpl::SetValue(value, m_buffer); + } + wxAny(const wchar_t* value) + { + m_type = wxAnyValueTypeImpl::sm_instance.get(); + wxAnyValueTypeImpl::SetValue(value, m_buffer); + } + + wxAny(const wxAny& any) + { + m_type = wxAnyNullValueType; + AssignAny(any); + } + +#if wxUSE_VARIANT + wxAny(const wxVariant& variant) + { + m_type = wxAnyNullValueType; + AssignVariant(variant); + } +#endif + + //@} + + /** + Use this template function for checking if this wxAny holds + a specific C++ data type. + + @remarks This template function does not work on some older compilers + (such as Visual C++ 6.0). For full compiler ccompatibility + please use wxANY_CHECK_TYPE(any, T) macro instead. + + @see wxAnyValueType::CheckType() + */ + // FIXME-VC6: remove this hack when VC6 is no longer supported + template + bool CheckType(T* = NULL) const + { + return m_type->CheckType(); + } + + /** + Returns the value type as wxAnyValueType instance. + + @remarks You cannot reliably test whether two wxAnys are of + same value type by simply comparing return values + of wxAny::GetType(). Instead, use wxAny::HasSameType(). + + @see HasSameType() + */ + const wxAnyValueType* GetType() const + { + return m_type; + } + + /** + Returns @true if this and another wxAny have the same + value type. + */ + bool HasSameType(const wxAny& other) const + { + return GetType()->IsSameType(other.GetType()); + } + + /** + Tests if wxAny is null (that is, whether there is no data). + */ + bool IsNull() const + { + return (m_type == wxAnyNullValueType); + } + + /** + Makes wxAny null (that is, clears it). + */ + void MakeNull() + { + m_type->DeleteValue(m_buffer); + m_type = wxAnyNullValueType; + } + + //@{ + /** + Assignment operators. + */ + template + wxAny& operator=(const T &value) + { + m_type->DeleteValue(m_buffer); + m_type = wxAnyValueTypeImpl::sm_instance.get(); + wxAnyValueTypeImpl::SetValue(value, m_buffer); + return *this; + } + + wxAny& operator=(const wxAny &any) + { + if (this != &any) + AssignAny(any); + return *this; + } + +#if wxUSE_VARIANT + wxAny& operator=(const wxVariant &variant) + { + AssignVariant(variant); + return *this; + } +#endif + + // These two operators are needed to deal with string literals + wxAny& operator=(const char* value) + { + Assign(value); + return *this; + } + wxAny& operator=(const wchar_t* value) + { + Assign(value); + return *this; + } + + //@{ + /** + Equality operators. + */ + bool operator==(const wxString& value) const + { + wxString value2; + if ( !GetAs(&value2) ) + return false; + return value == value2; + } + + bool operator==(const char* value) const + { return (*this) == wxString(value); } + bool operator==(const wchar_t* value) const + { return (*this) == wxString(value); } + + // + // We need to implement custom signed/unsigned int equals operators + // for signed/unsigned (eg. wxAny(128UL) == 128L) comparisons to work. + WXANY_IMPLEMENT_INT_EQ_OP(signed char, unsigned char) + WXANY_IMPLEMENT_INT_EQ_OP(signed short, unsigned short) + WXANY_IMPLEMENT_INT_EQ_OP(signed int, unsigned int) + WXANY_IMPLEMENT_INT_EQ_OP(signed long, unsigned long) +#ifdef wxLongLong_t + WXANY_IMPLEMENT_INT_EQ_OP(wxLongLong_t, wxULongLong_t) +#endif + + wxGCC_WARNING_SUPPRESS(float-equal) + + bool operator==(float value) const + { + if ( !wxAnyValueTypeImpl::IsSameClass(m_type) ) + return false; + + return value == + static_cast + (wxAnyValueTypeImpl::GetValue(m_buffer)); + } + + bool operator==(double value) const + { + if ( !wxAnyValueTypeImpl::IsSameClass(m_type) ) + return false; + + return value == + static_cast + (wxAnyValueTypeImpl::GetValue(m_buffer)); + } + + wxGCC_WARNING_RESTORE(float-equal) + + bool operator==(bool value) const + { + if ( !wxAnyValueTypeImpl::IsSameClass(m_type) ) + return false; + + return value == (wxAnyValueTypeImpl::GetValue(m_buffer)); + } + + //@} + + //@{ + /** + Inequality operators (implement as template). + */ + template + bool operator!=(const T& value) const + { return !((*this) == value); } + //@} + + /** + This template function converts wxAny into given type. In most cases + no type conversion is performed, so if the type is incorrect an + assertion failure will occur. + + @remarks For convenience, conversion is done when T is wxString. This + is useful when a string literal (which are treated as + const char* and const wchar_t*) has been assigned to wxAny. + + This template function may not work properly with Visual C++ + 6. For full compiler compatibility, please use + wxANY_AS(any, T) macro instead. + */ + // FIXME-VC6: remove this hack when VC6 is no longer supported + template + T As(T* = NULL) const + { + if ( !wxAnyValueTypeImpl::IsSameClass(m_type) ) + { + wxFAIL_MSG("Incorrect or non-convertible data type"); + } + + return static_cast(wxAnyValueTypeImpl::GetValue(m_buffer)); + } + + // Allow easy conversion from 'const char *' etc. to wxString + // FIXME-VC6: remove this hack when VC6 is no longer supported + //template<> + wxString As(wxString*) const + { + wxString value; + if ( !GetAs(&value) ) + { + wxFAIL_MSG("Incorrect or non-convertible data type"); + } + return value; + } + +#if wxUSE_EXTENDED_RTTI + const wxTypeInfo* GetTypeInfo() const + { + return m_type->GetTypeInfo(); + } +#endif + /** + Template function that retrieves and converts the value of this + variant to the type that T* value is. + + @return Returns @true if conversion was successful. + */ + template + bool GetAs(T* value) const + { + if ( !wxAnyValueTypeImpl::IsSameClass(m_type) ) + { + wxAnyValueType* otherType = + wxAnyValueTypeImpl::sm_instance.get(); + wxAnyValueBuffer temp_buf; + + if ( !m_type->ConvertValue(m_buffer, otherType, temp_buf) ) + return false; + + *value = + static_cast(wxAnyValueTypeImpl::GetValue(temp_buf)); + otherType->DeleteValue(temp_buf); + + return true; + } + *value = static_cast(wxAnyValueTypeImpl::GetValue(m_buffer)); + return true; + } + +#if wxUSE_VARIANT + // GetAs() wxVariant specialization + bool GetAs(wxVariant* value) const + { + return wxConvertAnyToVariant(*this, value); + } +#endif + +private: + // Assignment functions + void AssignAny(const wxAny& any) + { + // Must delete value - CopyBuffer() never does that + m_type->DeleteValue(m_buffer); + + wxAnyValueType* newType = any.m_type; + + if ( !newType->IsSameType(m_type) ) + m_type = newType; + + newType->CopyBuffer(any.m_buffer, m_buffer); + } + +#if wxUSE_VARIANT + void AssignVariant(const wxVariant& variant) + { + wxVariantData* data = variant.GetData(); + + if ( data && data->GetAsAny(this) ) + return; + + m_type->DeleteValue(m_buffer); + + if ( variant.IsNull() ) + { + // Init as Null + m_type = wxAnyNullValueType; + } + else + { + // If everything else fails, wrap the whole wxVariantData + m_type = wxAnyValueTypeImpl::sm_instance.get(); + wxAnyValueTypeImpl::SetValue(data, m_buffer); + } + } +#endif + + template + void Assign(const T &value) + { + m_type->DeleteValue(m_buffer); + m_type = wxAnyValueTypeImpl::sm_instance.get(); + wxAnyValueTypeImpl::SetValue(value, m_buffer); + } + + // Data + wxAnyValueBuffer m_buffer; + wxAnyValueType* m_type; +}; + + +// +// This method of checking the type is compatible with VC6 +#define wxANY_CHECK_TYPE(any, T) \ + wxANY_VALUE_TYPE_CHECK_TYPE((any).GetType(), T) + + +// +// This method of getting the value is compatible with VC6 +#define wxANY_AS(any, T) \ + (any).As(static_cast(NULL)) + + +template +inline bool wxAnyValueType::CheckType(T* reserved) const +{ + wxUnusedVar(reserved); + return wxAnyValueTypeImpl::IsSameClass(this); +} + +WX_DECLARE_LIST_WITH_DECL(wxAny, wxAnyList, class WXDLLIMPEXP_BASE); + +#endif // wxUSE_ANY + +#endif // _WX_ANY_H_ diff --git a/wxmsw/include/wx-3.0/wx/anybutton.h b/wxmsw/include/wx-3.0/wx/anybutton.h new file mode 100644 index 00000000..ebeac3b5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/anybutton.h @@ -0,0 +1,199 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/anybutton.h +// Purpose: wxAnyButtonBase class +// Author: Vadim Zetlin +// Created: 2000-08-15 (extracted from button.h) +// Copyright: (c) Vadim Zetlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ANYBUTTON_H_BASE_ +#define _WX_ANYBUTTON_H_BASE_ + +#include "wx/defs.h" + +#ifdef wxHAS_ANY_BUTTON + +// ---------------------------------------------------------------------------- +// wxAnyButton specific flags +// ---------------------------------------------------------------------------- + +// These flags affect label alignment +#define wxBU_LEFT 0x0040 +#define wxBU_TOP 0x0080 +#define wxBU_RIGHT 0x0100 +#define wxBU_BOTTOM 0x0200 +#define wxBU_ALIGN_MASK ( wxBU_LEFT | wxBU_TOP | wxBU_RIGHT | wxBU_BOTTOM ) + +// These two flags are obsolete +#define wxBU_NOAUTODRAW 0x0000 +#define wxBU_AUTODRAW 0x0004 + +// by default, the buttons will be created with some (system dependent) +// minimal size to make them look nicer, giving this style will make them as +// small as possible +#define wxBU_EXACTFIT 0x0001 + +// this flag can be used to disable using the text label in the button: it is +// mostly useful when creating buttons showing bitmap and having stock id as +// without it both the standard label corresponding to the stock id and the +// bitmap would be shown +#define wxBU_NOTEXT 0x0002 + + +#include "wx/bitmap.h" +#include "wx/control.h" + +// ---------------------------------------------------------------------------- +// wxAnyButton: common button functionality +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxAnyButtonBase : public wxControl +{ +public: + wxAnyButtonBase() { } + + // show the image in the button in addition to the label: this method is + // supported on all (major) platforms + void SetBitmap(const wxBitmap& bitmap, wxDirection dir = wxLEFT) + { + SetBitmapLabel(bitmap); + SetBitmapPosition(dir); + } + + wxBitmap GetBitmap() const { return DoGetBitmap(State_Normal); } + + // Methods for setting individual images for different states: normal, + // selected (meaning pushed or pressed), focused (meaning normal state for + // a focused button), disabled or hover (a.k.a. hot or current). + // + // Remember that SetBitmap() itself must be called before any other + // SetBitmapXXX() methods (except for SetBitmapLabel() which is a synonym + // for it anyhow) and that all bitmaps passed to these functions should be + // of the same size. + void SetBitmapLabel(const wxBitmap& bitmap) + { DoSetBitmap(bitmap, State_Normal); } + void SetBitmapPressed(const wxBitmap& bitmap) + { DoSetBitmap(bitmap, State_Pressed); } + void SetBitmapDisabled(const wxBitmap& bitmap) + { DoSetBitmap(bitmap, State_Disabled); } + void SetBitmapCurrent(const wxBitmap& bitmap) + { DoSetBitmap(bitmap, State_Current); } + void SetBitmapFocus(const wxBitmap& bitmap) + { DoSetBitmap(bitmap, State_Focused); } + + wxBitmap GetBitmapLabel() const { return DoGetBitmap(State_Normal); } + wxBitmap GetBitmapPressed() const { return DoGetBitmap(State_Pressed); } + wxBitmap GetBitmapDisabled() const { return DoGetBitmap(State_Disabled); } + wxBitmap GetBitmapCurrent() const { return DoGetBitmap(State_Current); } + wxBitmap GetBitmapFocus() const { return DoGetBitmap(State_Focused); } + + + // set the margins around the image + void SetBitmapMargins(wxCoord x, wxCoord y) { DoSetBitmapMargins(x, y); } + void SetBitmapMargins(const wxSize& sz) { DoSetBitmapMargins(sz.x, sz.y); } + wxSize GetBitmapMargins() { return DoGetBitmapMargins(); } + + // set the image position relative to the text, i.e. wxLEFT means that the + // image is to the left of the text (this is the default) + void SetBitmapPosition(wxDirection dir); + + + // Buttons on MSW can look bad if they are not native colours, because + // then they become owner-drawn and not theme-drawn. Disable it here + // in wxAnyButtonBase to make it consistent. + virtual bool ShouldInheritColours() const { return false; } + + // wxUniv-compatible and deprecated equivalents to SetBitmapXXX() +#if WXWIN_COMPATIBILITY_2_8 + void SetImageLabel(const wxBitmap& bitmap) { SetBitmap(bitmap); } + void SetImageMargins(wxCoord x, wxCoord y) { SetBitmapMargins(x, y); } +#endif // WXWIN_COMPATIBILITY_2_8 + + // backwards compatible names for pressed/current bitmaps: they're not + // deprecated as there is nothing really wrong with using them and no real + // advantage to using the new names but the new names are still preferred + wxBitmap GetBitmapSelected() const { return GetBitmapPressed(); } + wxBitmap GetBitmapHover() const { return GetBitmapCurrent(); } + + void SetBitmapSelected(const wxBitmap& bitmap) { SetBitmapPressed(bitmap); } + void SetBitmapHover(const wxBitmap& bitmap) { SetBitmapCurrent(bitmap); } + + + // this enum is not part of wx public API, it is public because it is used + // in non wxAnyButton-derived classes internally + // + // also notice that MSW code relies on the values of the enum elements, do + // not change them without revising src/msw/button.cpp + enum State + { + State_Normal, + State_Current, // a.k.a. hot or "hovering" + State_Pressed, // a.k.a. "selected" in public API for some reason + State_Disabled, + State_Focused, + State_Max + }; + + // return true if this button shouldn't show the text label, either because + // it doesn't have it or because it was explicitly disabled with wxBU_NOTEXT + bool DontShowLabel() const + { + return HasFlag(wxBU_NOTEXT) || GetLabel().empty(); + } + + // return true if we do show the label + bool ShowsLabel() const + { + return !DontShowLabel(); + } + +protected: + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + virtual wxBitmap DoGetBitmap(State WXUNUSED(which)) const + { return wxBitmap(); } + virtual void DoSetBitmap(const wxBitmap& WXUNUSED(bitmap), + State WXUNUSED(which)) + { } + + virtual wxSize DoGetBitmapMargins() const + { return wxSize(0, 0); } + + virtual void DoSetBitmapMargins(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y)) + { } + + virtual void DoSetBitmapPosition(wxDirection WXUNUSED(dir)) + { } + + virtual bool DoGetAuthNeeded() const { return false; } + virtual void DoSetAuthNeeded(bool WXUNUSED(show)) { } + + + wxDECLARE_NO_COPY_CLASS(wxAnyButtonBase); +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/anybutton.h" +#elif defined(__WXMSW__) + #include "wx/msw/anybutton.h" +//#elif defined(__WXMOTIF__) +// #include "wx/motif/anybutton.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/anybutton.h" +//#elif defined(__WXGTK__) +// #include "wx/gtk1/anybutton.h" +#elif defined(__WXMAC__) + #include "wx/osx/anybutton.h" +//#elif defined(__WXCOCOA__) +// #include "wx/cocoa/anybutton.h" +//#elif defined(__WXPM__) +// #include "wx/os2/anybutton.h" +#else + typedef wxAnyButtonBase wxAnyButton; +#endif + +#endif // wxHAS_ANY_BUTTON + +#endif // _WX_ANYBUTTON_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/anystr.h b/wxmsw/include/wx-3.0/wx/anystr.h new file mode 100644 index 00000000..8eebaf9b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/anystr.h @@ -0,0 +1,139 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/anystr.h +// Purpose: wxAnyStrPtr class declaration +// Author: Vadim Zeitlin +// Created: 2009-03-23 +// Copyright: (c) 2008 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ANYSTR_H_ +#define _WX_ANYSTR_H_ + +#include "wx/string.h" + +// ---------------------------------------------------------------------------- +// wxAnyStrPtr +// +// Notice that this is an internal and intentionally not documented class. It +// is only used by wxWidgets itself to ensure compatibility with previous +// versions and shouldn't be used by user code. When you see a function +// returning it you should just know that you can treat it as a string pointer. +// ---------------------------------------------------------------------------- + +// This is a helper class convertible to either narrow or wide string pointer. +// It is similar to wxCStrData but, unlike it, can be NULL which is required to +// represent the return value of wxDateTime::ParseXXX() methods for example. +// +// NB: this class is fully inline and so doesn't need to be DLL-exported +class wxAnyStrPtr +{ +public: + // ctors: this class must be created from the associated string or using + // its default ctor for an invalid NULL-like object; notice that it is + // immutable after creation. + + // ctor for invalid pointer + wxAnyStrPtr() + : m_str(NULL) + { + } + + // ctor for valid pointer into the given string (whose lifetime must be + // greater than ours and which should remain constant while we're used) + wxAnyStrPtr(const wxString& str, const wxString::const_iterator& iter) + : m_str(&str), + m_iter(iter) + { + } + + // default copy ctor is ok and so is default dtor, in particular we do not + // free the string + + + // various operators meant to make this class look like a superposition of + // char* and wchar_t* + + // this one is needed to allow boolean expressions involving these objects, + // e.g. "if ( FuncReturningAnyStrPtr() && ... )" (unfortunately using + // unspecified_bool_type here wouldn't help with ambiguity between all the + // different conversions to pointers) + operator bool() const { return m_str != NULL; } + + // at least VC6 and VC7 also need this one or they complain about ambiguity + // for !anystr expressions + bool operator!() const { return !((bool)*this); } + + + // and these are the conversions operator which allow to assign the result + // of FuncReturningAnyStrPtr() to either char* or wxChar* (i.e. wchar_t*) + operator const char *() const + { + if ( !m_str ) + return NULL; + + // check if the string is convertible to char at all + // + // notice that this pointer points into wxString internal buffer + // containing its char* representation and so it can be kept for as + // long as wxString is not modified -- which is long enough for our + // needs + const char *p = m_str->c_str().AsChar(); + if ( *p ) + { + // find the offset of the character corresponding to this iterator + // position in bytes: we don't have any direct way to do it so we + // need to redo the conversion again for the part of the string + // before the iterator to find its length in bytes in current + // locale + // + // NB: conversion won't fail as it succeeded for the entire string + p += strlen(wxString(m_str->begin(), m_iter).mb_str()); + } + //else: conversion failed, return "" as we can't do anything else + + return p; + } + + operator const wchar_t *() const + { + if ( !m_str ) + return NULL; + + // no complications with wide strings (as long as we discount + // surrogates as we do for now) + // + // just remember that this works as long as wxString keeps an internal + // buffer with its wide wide char representation, just as with AsChar() + // above + return m_str->c_str().AsWChar() + (m_iter - m_str->begin()); + } + + // Because the objects of this class are only used as return type for + // functions which can return NULL we can skip providing dereferencing + // operators: the code using this class must test it for NULL first and if + // it does anything else with it it has to assign it to either char* or + // wchar_t* itself, before dereferencing. + // + // IOW this + // + // if ( *FuncReturningAnyStrPtr() ) + // + // is invalid because it could crash. And this + // + // const char *p = FuncReturningAnyStrPtr(); + // if ( p && *p ) + // + // already works fine. + +private: + // the original string and the position in it we correspond to, if the + // string is NULL this object is NULL pointer-like + const wxString * const m_str; + const wxString::const_iterator m_iter; + + wxDECLARE_NO_ASSIGN_CLASS(wxAnyStrPtr); +}; + +#endif // _WX_ANYSTR_H_ + diff --git a/wxmsw/include/wx-3.0/wx/app.h b/wxmsw/include/wx-3.0/wx/app.h new file mode 100644 index 00000000..60e02b35 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/app.h @@ -0,0 +1,889 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/app.h +// Purpose: wxAppBase class and macros used for declaration of wxApp +// derived class in the user code +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_APP_H_BASE_ +#define _WX_APP_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers we have to include here +// ---------------------------------------------------------------------------- + +#include "wx/event.h" // for the base class +#include "wx/eventfilter.h" // (and another one) +#include "wx/build.h" +#include "wx/cmdargs.h" // for wxCmdLineArgsArray used by wxApp::argv +#include "wx/init.h" // we must declare wxEntry() +#include "wx/intl.h" // for wxLayoutDirection +#include "wx/log.h" // for wxDISABLE_DEBUG_LOGGING_IN_RELEASE_BUILD() + +class WXDLLIMPEXP_FWD_BASE wxAppConsole; +class WXDLLIMPEXP_FWD_BASE wxAppTraits; +class WXDLLIMPEXP_FWD_BASE wxCmdLineParser; +class WXDLLIMPEXP_FWD_BASE wxEventLoopBase; +class WXDLLIMPEXP_FWD_BASE wxMessageOutput; + +#if wxUSE_GUI + struct WXDLLIMPEXP_FWD_CORE wxVideoMode; + class WXDLLIMPEXP_FWD_CORE wxWindow; +#endif + +// this macro should be used in any main() or equivalent functions defined in wx +#define wxDISABLE_DEBUG_SUPPORT() \ + wxDISABLE_ASSERTS_IN_RELEASE_BUILD(); \ + wxDISABLE_DEBUG_LOGGING_IN_RELEASE_BUILD() + +// ---------------------------------------------------------------------------- +// typedefs +// ---------------------------------------------------------------------------- + +// the type of the function used to create a wxApp object on program start up +typedef wxAppConsole* (*wxAppInitializerFunction)(); + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +enum +{ + wxPRINT_WINDOWS = 1, + wxPRINT_POSTSCRIPT = 2 +}; + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +// use of this list is strongly deprecated, use wxApp ScheduleForDestruction() +// and IsScheduledForDestruction() methods instead of this list directly, it +// is here for compatibility purposes only +extern WXDLLIMPEXP_DATA_BASE(wxList) wxPendingDelete; + +// ---------------------------------------------------------------------------- +// wxAppConsoleBase: wxApp for non-GUI applications +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxAppConsoleBase : public wxEvtHandler, + public wxEventFilter +{ +public: + // ctor and dtor + wxAppConsoleBase(); + virtual ~wxAppConsoleBase(); + + + // the virtual functions which may/must be overridden in the derived class + // ----------------------------------------------------------------------- + + // This is the very first function called for a newly created wxApp object, + // it is used by the library to do the global initialization. If, for some + // reason, you must override it (instead of just overriding OnInit(), as + // usual, for app-specific initializations), do not forget to call the base + // class version! + virtual bool Initialize(int& argc, wxChar **argv); + + // This gives wxCocoa a chance to call OnInit() with a memory pool in place + virtual bool CallOnInit() { return OnInit(); } + + // Called before OnRun(), this is a good place to do initialization -- if + // anything fails, return false from here to prevent the program from + // continuing. The command line is normally parsed here, call the base + // class OnInit() to do it. + virtual bool OnInit(); + + // This is the replacement for the normal main(): all program work should + // be done here. When OnRun() returns, the programs starts shutting down. + virtual int OnRun(); + + // Called before the first events are handled, called from within MainLoop() + virtual void OnLaunched(); + + // This is called by wxEventLoopBase::SetActive(): you should put the code + // which needs an active event loop here. + // Note that this function is called whenever an event loop is activated; + // you may want to use wxEventLoopBase::IsMain() to perform initialization + // specific for the app's main event loop. + virtual void OnEventLoopEnter(wxEventLoopBase* WXUNUSED(loop)) {} + + // This is only called if OnInit() returned true so it's a good place to do + // any cleanup matching the initializations done there. + virtual int OnExit(); + + // This is called by wxEventLoopBase::OnExit() for each event loop which + // is exited. + virtual void OnEventLoopExit(wxEventLoopBase* WXUNUSED(loop)) {} + + // This is the very last function called on wxApp object before it is + // destroyed. If you override it (instead of overriding OnExit() as usual) + // do not forget to call the base class version! + virtual void CleanUp(); + + // Called when a fatal exception occurs, this function should take care not + // to do anything which might provoke a nested exception! It may be + // overridden if you wish to react somehow in non-default way (core dump + // under Unix, application crash under Windows) to fatal program errors, + // however extreme care should be taken if you don't want this function to + // crash. + virtual void OnFatalException() { } + + // Called from wxExit() function, should terminate the application a.s.a.p. + virtual void Exit(); + + + // application info: name, description, vendor + // ------------------------------------------- + + // NB: all these should be set by the application itself, there are no + // reasonable default except for the application name which is taken to + // be argv[0] + + // set/get the application name + wxString GetAppName() const; + void SetAppName(const wxString& name) { m_appName = name; } + + // set/get the application display name: the display name is the name + // shown to the user in titles, reports, etc while the app name is + // used for paths, config, and other places the user doesn't see + // + // by default the display name is the same as app name or a capitalized + // version of the program if app name was not set neither but it's + // usually better to set it explicitly to something nicer + wxString GetAppDisplayName() const; + + void SetAppDisplayName(const wxString& name) { m_appDisplayName = name; } + + // set/get the app class name + wxString GetClassName() const { return m_className; } + void SetClassName(const wxString& name) { m_className = name; } + + // set/get the vendor name + const wxString& GetVendorName() const { return m_vendorName; } + void SetVendorName(const wxString& name) { m_vendorName = name; } + + // set/get the vendor display name: the display name is shown + // in titles/reports/dialogs to the user, while the vendor name + // is used in some areas such as wxConfig, wxStandardPaths, etc + const wxString& GetVendorDisplayName() const + { + return m_vendorDisplayName.empty() ? GetVendorName() + : m_vendorDisplayName; + } + void SetVendorDisplayName(const wxString& name) + { + m_vendorDisplayName = name; + } + + + // cmd line parsing stuff + // ---------------------- + + // all of these methods may be overridden in the derived class to + // customize the command line parsing (by default only a few standard + // options are handled) + // + // you also need to call wxApp::OnInit() from YourApp::OnInit() for all + // this to work + +#if wxUSE_CMDLINE_PARSER + // this one is called from OnInit() to add all supported options + // to the given parser (don't forget to call the base class version if you + // override it!) + virtual void OnInitCmdLine(wxCmdLineParser& parser); + + // called after successfully parsing the command line, return true + // to continue and false to exit (don't forget to call the base class + // version if you override it!) + virtual bool OnCmdLineParsed(wxCmdLineParser& parser); + + // called if "--help" option was specified, return true to continue + // and false to exit + virtual bool OnCmdLineHelp(wxCmdLineParser& parser); + + // called if incorrect command line options were given, return + // false to abort and true to continue + virtual bool OnCmdLineError(wxCmdLineParser& parser); +#endif // wxUSE_CMDLINE_PARSER + + + // miscellaneous customization functions + // ------------------------------------- + + // create the app traits object to which we delegate for everything which + // either should be configurable by the user (then he can change the + // default behaviour simply by overriding CreateTraits() and returning his + // own traits object) or which is GUI/console dependent as then wxAppTraits + // allows us to abstract the differences behind the common facade + wxAppTraits *GetTraits(); + + // this function provides safer access to traits object than + // wxTheApp->GetTraits() during startup or termination when the global + // application object itself may be unavailable + // + // of course, it still returns NULL in this case and the caller must check + // for it + static wxAppTraits *GetTraitsIfExists(); + + // Return some valid traits object. + // + // This method checks if we have wxTheApp and returns its traits if it does + // exist and the traits are non-NULL, similarly to GetTraitsIfExists(), but + // falls back to wxConsoleAppTraits to ensure that it always returns + // something valid. + static wxAppTraits& GetValidTraits(); + + // returns the main event loop instance, i.e. the event loop which is started + // by OnRun() and which dispatches all events sent from the native toolkit + // to the application (except when new event loops are temporarily set-up). + // The returned value maybe NULL. Put initialization code which needs a + // non-NULL main event loop into OnEventLoopEnter(). + wxEventLoopBase* GetMainLoop() const + { return m_mainLoop; } + + // This function sets the C locale to the default locale for the current + // environment. It is advised to call this to ensure that the underlying + // toolkit uses the locale in which the numbers and monetary amounts are + // shown in the format expected by user and so on. + // + // Notice that this does _not_ change the global C++ locale, you need to do + // it explicitly if you want. + // + // Finally, notice that while this function is virtual, it is not supposed + // to be overridden outside of the library itself. + virtual void SetCLocale(); + + + // event processing functions + // -------------------------- + + // Implement the inherited wxEventFilter method but just return -1 from it + // to indicate that default processing should take place. + virtual int FilterEvent(wxEvent& event); + + // return true if we're running event loop, i.e. if the events can + // (already) be dispatched + static bool IsMainLoopRunning(); + +#if wxUSE_EXCEPTIONS + // execute the functor to handle the given event + // + // this is a generalization of HandleEvent() below and the base class + // implementation of CallEventHandler() still calls HandleEvent() for + // compatibility for functors which are just wxEventFunctions (i.e. methods + // of wxEvtHandler) + virtual void CallEventHandler(wxEvtHandler *handler, + wxEventFunctor& functor, + wxEvent& event) const; + + // call the specified handler on the given object with the given event + // + // this method only exists to allow catching the exceptions thrown by any + // event handler, it would lead to an extra (useless) virtual function call + // if the exceptions were not used, so it doesn't even exist in that case + virtual void HandleEvent(wxEvtHandler *handler, + wxEventFunction func, + wxEvent& event) const; + + // Called when an unhandled C++ exception occurs inside OnRun(): note that + // the main event loop has already terminated by now and the program will + // exit, if you need to really handle the exceptions you need to override + // OnExceptionInMainLoop() + virtual void OnUnhandledException(); + + // Function called if an uncaught exception is caught inside the main + // event loop: it may return true to continue running the event loop or + // false to stop it (in the latter case it may rethrow the exception as + // well) + virtual bool OnExceptionInMainLoop(); + +#endif // wxUSE_EXCEPTIONS + + + // pending events + // -------------- + + // IMPORTANT: all these methods conceptually belong to wxEventLoopBase + // but for many reasons we need to allow queuing of events + // even when there's no event loop (e.g. in wxApp::OnInit); + // this feature is used e.g. to queue events on secondary threads + // or in wxPython to use wx.CallAfter before the GUI is initialized + + // process all events in the m_handlersWithPendingEvents list -- it is necessary + // to call this function to process posted events. This happens during each + // event loop iteration in GUI mode but if there is no main loop, it may be + // also called directly. + virtual void ProcessPendingEvents(); + + // check if there are pending events on global pending event list + bool HasPendingEvents() const; + + // temporary suspends processing of the pending events + void SuspendProcessingOfPendingEvents(); + + // resume processing of the pending events previously stopped because of a + // call to SuspendProcessingOfPendingEvents() + void ResumeProcessingOfPendingEvents(); + + // called by ~wxEvtHandler to (eventually) remove the handler from the list of + // the handlers with pending events + void RemovePendingEventHandler(wxEvtHandler* toRemove); + + // adds an event handler to the list of the handlers with pending events + void AppendPendingEventHandler(wxEvtHandler* toAppend); + + // moves the event handler from the list of the handlers with pending events + //to the list of the handlers with _delayed_ pending events + void DelayPendingEventHandler(wxEvtHandler* toDelay); + + // deletes the current pending events + void DeletePendingEvents(); + + + // delayed destruction + // ------------------- + + // If an object may have pending events for it, it shouldn't be deleted + // immediately as this would result in a crash when trying to handle these + // events: instead, it should be scheduled for destruction and really + // destroyed only after processing all pending events. + // + // Notice that this is only possible if we have a running event loop, + // otherwise the object is just deleted directly by ScheduleForDestruction() + // and IsScheduledForDestruction() always returns false. + + // schedule the object for destruction in the near future + void ScheduleForDestruction(wxObject *object); + + // return true if the object is scheduled for destruction + bool IsScheduledForDestruction(wxObject *object) const; + + + // wxEventLoop-related methods + // --------------------------- + + // all these functions are forwarded to the corresponding methods of the + // currently active event loop -- and do nothing if there is none + virtual bool Pending(); + virtual bool Dispatch(); + + virtual int MainLoop(); + virtual void ExitMainLoop(); + + bool Yield(bool onlyIfNeeded = false); + + virtual void WakeUpIdle(); + + // this method is called by the active event loop when there are no events + // to process + // + // by default it generates the idle events and if you override it in your + // derived class you should call the base class version to ensure that idle + // events are still sent out + virtual bool ProcessIdle(); + + // this virtual function is overridden in GUI wxApp to always return true + // as GUI applications always have an event loop -- but console ones may + // have it or not, so it simply returns true if already have an event loop + // running but false otherwise + virtual bool UsesEventLoop() const; + + + // debugging support + // ----------------- + + // this function is called when an assert failure occurs, the base class + // version does the normal processing (i.e. shows the usual assert failure + // dialog box) + // + // the arguments are the location of the failed assert (func may be empty + // if the compiler doesn't support C99 __FUNCTION__), the text of the + // assert itself and the user-specified message + virtual void OnAssertFailure(const wxChar *file, + int line, + const wxChar *func, + const wxChar *cond, + const wxChar *msg); + + // old version of the function without func parameter, for compatibility + // only, override OnAssertFailure() in the new code + virtual void OnAssert(const wxChar *file, + int line, + const wxChar *cond, + const wxChar *msg); + + // check that the wxBuildOptions object (constructed in the application + // itself, usually the one from wxIMPLEMENT_APP() macro) matches the build + // options of the library and abort if it doesn't + static bool CheckBuildOptions(const char *optionsSignature, + const char *componentName); + + // implementation only from now on + // ------------------------------- + + // helpers for dynamic wxApp construction + static void SetInitializerFunction(wxAppInitializerFunction fn) + { ms_appInitFn = fn; } + static wxAppInitializerFunction GetInitializerFunction() + { return ms_appInitFn; } + + // accessors for ms_appInstance field (external code might wish to modify + // it, this is why we provide a setter here as well, but you should really + // know what you're doing if you call it), wxTheApp is usually used instead + // of GetInstance() + static wxAppConsole *GetInstance() { return ms_appInstance; } + static void SetInstance(wxAppConsole *app) { ms_appInstance = app; } + + + // command line arguments (public for backwards compatibility) + int argc; + + // this object is implicitly convertible to either "char**" (traditional + // type of argv parameter of main()) or to "wchar_t **" (for compatibility + // with Unicode build in previous wx versions and because the command line + // can, in pr +#if wxUSE_UNICODE + wxCmdLineArgsArray argv; +#else + char **argv; +#endif + +protected: + // delete all objects in wxPendingDelete list + // + // called from ProcessPendingEvents() + void DeletePendingObjects(); + + // the function which creates the traits object when GetTraits() needs it + // for the first time + virtual wxAppTraits *CreateTraits(); + + // function used for dynamic wxApp creation + static wxAppInitializerFunction ms_appInitFn; + + // the one and only global application object + static wxAppConsole *ms_appInstance; + + // create main loop from AppTraits or return NULL if + // there is no main loop implementation + wxEventLoopBase *CreateMainLoop(); + + // application info (must be set from the user code) + wxString m_vendorName, // vendor name ("acme") + m_vendorDisplayName, // vendor display name (e.g. "ACME Inc") + m_appName, // app name ("myapp") + m_appDisplayName, // app display name ("My Application") + m_className; // class name + + // the class defining the application behaviour, NULL initially and created + // by GetTraits() when first needed + wxAppTraits *m_traits; + + // the main event loop of the application (may be NULL if the loop hasn't + // been started yet or has already terminated) + wxEventLoopBase *m_mainLoop; + + + // pending events management vars: + + // the array of the handlers with pending events which needs to be processed + // inside ProcessPendingEvents() + wxEvtHandlerArray m_handlersWithPendingEvents; + + // helper array used by ProcessPendingEvents() to store the event handlers + // which have pending events but of these events none can be processed right now + // (because of a call to wxEventLoop::YieldFor() which asked to selectively process + // pending events) + wxEvtHandlerArray m_handlersWithPendingDelayedEvents; + +#if wxUSE_THREADS + // this critical section protects both the lists above + wxCriticalSection m_handlersWithPendingEventsLocker; +#endif + + // flag modified by Suspend/ResumeProcessingOfPendingEvents() + bool m_bDoPendingEventProcessing; + + friend class WXDLLIMPEXP_FWD_BASE wxEvtHandler; + + // the application object is a singleton anyhow, there is no sense in + // copying it + wxDECLARE_NO_COPY_CLASS(wxAppConsoleBase); +}; + +#if defined(__UNIX__) && !defined(__WXMSW__) + #include "wx/unix/app.h" +#else + // this has to be a class and not a typedef as we forward declare it + class wxAppConsole : public wxAppConsoleBase { }; +#endif + +// ---------------------------------------------------------------------------- +// wxAppBase: the common part of wxApp implementations for all platforms +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + +class WXDLLIMPEXP_CORE wxAppBase : public wxAppConsole +{ +public: + wxAppBase(); + virtual ~wxAppBase(); + + // the virtual functions which may/must be overridden in the derived class + // ----------------------------------------------------------------------- + + // very first initialization function + // + // Override: very rarely + virtual bool Initialize(int& argc, wxChar **argv); + + // a platform-dependent version of OnInit(): the code here is likely to + // depend on the toolkit. default version does nothing. + // + // Override: rarely. + virtual bool OnInitGui(); + + // called to start program execution - the default version just enters + // the main GUI loop in which events are received and processed until + // the last window is not deleted (if GetExitOnFrameDelete) or + // ExitMainLoop() is called. In console mode programs, the execution + // of the program really starts here + // + // Override: rarely in GUI applications, always in console ones. + virtual int OnRun(); + + // a matching function for OnInit() + virtual int OnExit(); + + // very last clean up function + // + // Override: very rarely + virtual void CleanUp(); + + + // the worker functions - usually not used directly by the user code + // ----------------------------------------------------------------- + + // safer alternatives to Yield(), using wxWindowDisabler + virtual bool SafeYield(wxWindow *win, bool onlyIfNeeded); + virtual bool SafeYieldFor(wxWindow *win, long eventsToProcess); + + // this virtual function is called in the GUI mode when the application + // becomes idle and normally just sends wxIdleEvent to all interested + // parties + // + // it should return true if more idle events are needed, false if not + virtual bool ProcessIdle(); + + // override base class version: GUI apps always use an event loop + virtual bool UsesEventLoop() const { return true; } + + + // top level window functions + // -------------------------- + + // return true if our app has focus + virtual bool IsActive() const { return m_isActive; } + + // set the "main" top level window + void SetTopWindow(wxWindow *win) { m_topWindow = win; } + + // return the "main" top level window (if it hadn't been set previously + // with SetTopWindow(), will return just some top level window and, if + // there are none, will return NULL) + virtual wxWindow *GetTopWindow() const; + + // control the exit behaviour: by default, the program will exit the + // main loop (and so, usually, terminate) when the last top-level + // program window is deleted. Beware that if you disable this behaviour + // (with SetExitOnFrameDelete(false)), you'll have to call + // ExitMainLoop() explicitly from somewhere. + void SetExitOnFrameDelete(bool flag) + { m_exitOnFrameDelete = flag ? Yes : No; } + bool GetExitOnFrameDelete() const + { return m_exitOnFrameDelete == Yes; } + + + // display mode, visual, printing mode, ... + // ------------------------------------------------------------------------ + + // Get display mode that is used use. This is only used in framebuffer + // wxWin ports such as wxDFB. + virtual wxVideoMode GetDisplayMode() const; + // Set display mode to use. This is only used in framebuffer wxWin + // ports such as wxDFB. This method should be called from + // wxApp::OnInitGui + virtual bool SetDisplayMode(const wxVideoMode& WXUNUSED(info)) { return true; } + + // set use of best visual flag (see below) + void SetUseBestVisual( bool flag, bool forceTrueColour = false ) + { m_useBestVisual = flag; m_forceTrueColour = forceTrueColour; } + bool GetUseBestVisual() const { return m_useBestVisual; } + + // set/get printing mode: see wxPRINT_XXX constants. + // + // default behaviour is the normal one for Unix: always use PostScript + // printing. + virtual void SetPrintMode(int WXUNUSED(mode)) { } + int GetPrintMode() const { return wxPRINT_POSTSCRIPT; } + + // Return the layout direction for the current locale or wxLayout_Default + // if it's unknown + virtual wxLayoutDirection GetLayoutDirection() const; + + // Change the theme used by the application, return true on success. + virtual bool SetNativeTheme(const wxString& WXUNUSED(theme)) { return false; } + + + // command line parsing (GUI-specific) + // ------------------------------------------------------------------------ + +#if wxUSE_CMDLINE_PARSER + virtual bool OnCmdLineParsed(wxCmdLineParser& parser); + virtual void OnInitCmdLine(wxCmdLineParser& parser); +#endif + + // miscellaneous other stuff + // ------------------------------------------------------------------------ + + // called by toolkit-specific code to set the app status: active (we have + // focus) or not and also the last window which had focus before we were + // deactivated + virtual void SetActive(bool isActive, wxWindow *lastFocus); + +#if WXWIN_COMPATIBILITY_2_6 + // returns true if the program is successfully initialized + wxDEPRECATED_MSG("always returns true now, don't call") + bool Initialized(); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + // override base class method to use GUI traits + virtual wxAppTraits *CreateTraits(); + + + // the main top level window (may be NULL) + wxWindow *m_topWindow; + + // if Yes, exit the main loop when the last top level window is deleted, if + // No don't do it and if Later -- only do it once we reach our OnRun() + // + // the explanation for using this strange scheme is given in appcmn.cpp + enum + { + Later = -1, + No, + Yes + } m_exitOnFrameDelete; + + // true if the app wants to use the best visual on systems where + // more than one are available (Sun, SGI, XFree86 4.0 ?) + bool m_useBestVisual; + // force TrueColour just in case "best" isn't TrueColour + bool m_forceTrueColour; + + // does any of our windows have focus? + bool m_isActive; + + wxDECLARE_NO_COPY_CLASS(wxAppBase); +}; + +#if WXWIN_COMPATIBILITY_2_6 + inline bool wxAppBase::Initialized() { return true; } +#endif // WXWIN_COMPATIBILITY_2_6 + +// ---------------------------------------------------------------------------- +// now include the declaration of the real class +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/app.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/app.h" +#elif defined(__WXDFB__) + #include "wx/dfb/app.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/app.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/app.h" +#elif defined(__WXX11__) + #include "wx/x11/app.h" +#elif defined(__WXMAC__) + #include "wx/osx/app.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/app.h" +#elif defined(__WXPM__) + #include "wx/os2/app.h" +#endif + +#else // !GUI + +// wxApp is defined in core and we cannot define another one in wxBase, +// so use the preprocessor to allow using wxApp in console programs too +#define wxApp wxAppConsole + +#endif // GUI/!GUI + +// ---------------------------------------------------------------------------- +// the global data +// ---------------------------------------------------------------------------- + +// for compatibility, we define this macro to access the global application +// object of type wxApp +// +// note that instead of using of wxTheApp in application code you should +// consider using wxDECLARE_APP() after which you may call wxGetApp() which will +// return the object of the correct type (i.e. MyApp and not wxApp) +// +// the cast is safe as in GUI build we only use wxApp, not wxAppConsole, and in +// console mode it does nothing at all +#define wxTheApp static_cast(wxApp::GetInstance()) + +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +// event loop related functions only work in GUI programs +// ------------------------------------------------------ + +// Force an exit from main loop +WXDLLIMPEXP_BASE void wxExit(); + +// avoid redeclaring this function here if it had been already declared by +// wx/utils.h, this results in warnings from g++ with -Wredundant-decls +#ifndef wx_YIELD_DECLARED +#define wx_YIELD_DECLARED + +// Yield to other apps/messages +WXDLLIMPEXP_CORE bool wxYield(); + +#endif // wx_YIELD_DECLARED + +// Yield to other apps/messages +WXDLLIMPEXP_BASE void wxWakeUpIdle(); + +// ---------------------------------------------------------------------------- +// macros for dynamic creation of the application object +// ---------------------------------------------------------------------------- + +// Having a global instance of this class allows wxApp to be aware of the app +// creator function. wxApp can then call this function to create a new app +// object. Convoluted, but necessary. + +class WXDLLIMPEXP_BASE wxAppInitializer +{ +public: + wxAppInitializer(wxAppInitializerFunction fn) + { wxApp::SetInitializerFunction(fn); } +}; + +// the code below defines a wxIMPLEMENT_WXWIN_MAIN macro which you can use if +// your compiler really, really wants main() to be in your main program (e.g. +// hello.cpp). Now wxIMPLEMENT_APP should add this code if required. + +// For compilers that support it, prefer to use wmain() as this ensures any +// Unicode strings can be passed as command line parameters and not just those +// representable in the current locale. +#if wxUSE_UNICODE && defined(__VISUALC__) + #define wxIMPLEMENT_WXWIN_MAIN_CONSOLE \ + int wmain(int argc, wchar_t **argv) \ + { \ + wxDISABLE_DEBUG_SUPPORT(); \ + \ + return wxEntry(argc, argv); \ + } +#else // Use standard main() + #define wxIMPLEMENT_WXWIN_MAIN_CONSOLE \ + int main(int argc, char **argv) \ + { \ + wxDISABLE_DEBUG_SUPPORT(); \ + \ + return wxEntry(argc, argv); \ + } +#endif + +// port-specific header could have defined it already in some special way +#ifndef wxIMPLEMENT_WXWIN_MAIN + #define wxIMPLEMENT_WXWIN_MAIN wxIMPLEMENT_WXWIN_MAIN_CONSOLE +#endif // defined(wxIMPLEMENT_WXWIN_MAIN) + +#ifdef __WXUNIVERSAL__ + #include "wx/univ/theme.h" + + #ifdef wxUNIV_DEFAULT_THEME + #define wxIMPLEMENT_WX_THEME_SUPPORT \ + WX_USE_THEME(wxUNIV_DEFAULT_THEME); + #else + #define wxIMPLEMENT_WX_THEME_SUPPORT + #endif +#else + #define wxIMPLEMENT_WX_THEME_SUPPORT +#endif + +// Use this macro if you want to define your own main() or WinMain() function +// and call wxEntry() from there. +#define wxIMPLEMENT_APP_NO_MAIN(appname) \ + appname& wxGetApp() { return *static_cast(wxApp::GetInstance()); } \ + wxAppConsole *wxCreateApp() \ + { \ + wxAppConsole::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, \ + "your program"); \ + return new appname; \ + } \ + wxAppInitializer \ + wxTheAppInitializer((wxAppInitializerFunction) wxCreateApp) + +// Same as wxIMPLEMENT_APP() normally but doesn't include themes support in +// wxUniversal builds +#define wxIMPLEMENT_APP_NO_THEMES(appname) \ + wxIMPLEMENT_WXWIN_MAIN \ + wxIMPLEMENT_APP_NO_MAIN(appname) + +// Use this macro exactly once, the argument is the name of the wxApp-derived +// class which is the class of your application. +#define wxIMPLEMENT_APP(appname) \ + wxIMPLEMENT_WX_THEME_SUPPORT \ + wxIMPLEMENT_APP_NO_THEMES(appname) + +// Same as IMPLEMENT_APP(), but for console applications. +#define wxIMPLEMENT_APP_CONSOLE(appname) \ + wxIMPLEMENT_WXWIN_MAIN_CONSOLE \ + wxIMPLEMENT_APP_NO_MAIN(appname) + +// this macro can be used multiple times and just allows you to use wxGetApp() +// function +#define wxDECLARE_APP(appname) \ + extern appname& wxGetApp() + + +// declare the stuff defined by wxIMPLEMENT_APP() macro, it's not really needed +// anywhere else but at the very least it suppresses icc warnings about +// defining extern symbols without prior declaration, and it shouldn't do any +// harm +extern wxAppConsole *wxCreateApp(); +extern wxAppInitializer wxTheAppInitializer; + +// ---------------------------------------------------------------------------- +// Compatibility macro aliases +// ---------------------------------------------------------------------------- + +// deprecated variants _not_ requiring a semicolon after them +// (note that also some wx-prefixed macro do _not_ require a semicolon because +// it's not always possible to force the compire to require it) + +#define IMPLEMENT_WXWIN_MAIN_CONSOLE wxIMPLEMENT_WXWIN_MAIN_CONSOLE +#define IMPLEMENT_WXWIN_MAIN wxIMPLEMENT_WXWIN_MAIN +#define IMPLEMENT_WX_THEME_SUPPORT wxIMPLEMENT_WX_THEME_SUPPORT +#define IMPLEMENT_APP_NO_MAIN(app) wxIMPLEMENT_APP_NO_MAIN(app); +#define IMPLEMENT_APP_NO_THEMES(app) wxIMPLEMENT_APP_NO_THEMES(app); +#define IMPLEMENT_APP(app) wxIMPLEMENT_APP(app); +#define IMPLEMENT_APP_CONSOLE(app) wxIMPLEMENT_APP_CONSOLE(app); +#define DECLARE_APP(app) wxDECLARE_APP(app); + +#endif // _WX_APP_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/apptrait.h b/wxmsw/include/wx-3.0/wx/apptrait.h new file mode 100644 index 00000000..da1b39b1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/apptrait.h @@ -0,0 +1,288 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/apptrait.h +// Purpose: declaration of wxAppTraits and derived classes +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.06.2003 +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_APPTRAIT_H_ +#define _WX_APPTRAIT_H_ + +#include "wx/string.h" +#include "wx/platinfo.h" + +class WXDLLIMPEXP_FWD_BASE wxArrayString; +class WXDLLIMPEXP_FWD_BASE wxConfigBase; +class WXDLLIMPEXP_FWD_BASE wxEventLoopBase; +#if wxUSE_FONTMAP + class WXDLLIMPEXP_FWD_CORE wxFontMapper; +#endif // wxUSE_FONTMAP +class WXDLLIMPEXP_FWD_BASE wxLog; +class WXDLLIMPEXP_FWD_BASE wxMessageOutput; +class WXDLLIMPEXP_FWD_BASE wxObject; +class WXDLLIMPEXP_FWD_CORE wxRendererNative; +class WXDLLIMPEXP_FWD_BASE wxStandardPaths; +class WXDLLIMPEXP_FWD_BASE wxString; +class WXDLLIMPEXP_FWD_BASE wxTimer; +class WXDLLIMPEXP_FWD_BASE wxTimerImpl; + +class wxSocketManager; + + +// ---------------------------------------------------------------------------- +// wxAppTraits: this class defines various configurable aspects of wxApp +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxAppTraitsBase +{ +public: + // needed since this class declares virtual members + virtual ~wxAppTraitsBase() { } + + // hooks for working with the global objects, may be overridden by the user + // ------------------------------------------------------------------------ + +#if wxUSE_CONFIG + // create the default configuration object (base class version is + // implemented in config.cpp and creates wxRegConfig for wxMSW and + // wxFileConfig for all the other platforms) + virtual wxConfigBase *CreateConfig(); +#endif // wxUSE_CONFIG + +#if wxUSE_LOG + // create the default log target + virtual wxLog *CreateLogTarget() = 0; +#endif // wxUSE_LOG + + // create the global object used for printing out messages + virtual wxMessageOutput *CreateMessageOutput() = 0; + +#if wxUSE_FONTMAP + // create the global font mapper object used for encodings/charset mapping + virtual wxFontMapper *CreateFontMapper() = 0; +#endif // wxUSE_FONTMAP + + // get the renderer to use for drawing the generic controls (return value + // may be NULL in which case the default renderer for the current platform + // is used); this is used in GUI only and always returns NULL in console + // + // NB: returned pointer will be deleted by the caller + virtual wxRendererNative *CreateRenderer() = 0; + + // wxStandardPaths object is normally the same for wxBase and wxGUI + // except in the case of wxMac and wxCocoa + virtual wxStandardPaths& GetStandardPaths(); + + + // functions abstracting differences between GUI and console modes + // ------------------------------------------------------------------------ + + // show the assert dialog with the specified message in GUI or just print + // the string to stderr in console mode + // + // base class version has an implementation (in spite of being pure + // virtual) in base/appbase.cpp which can be called as last resort. + // + // return true to suppress subsequent asserts, false to continue as before + virtual bool ShowAssertDialog(const wxString& msg) = 0; + + // return true if fprintf(stderr) goes somewhere, false otherwise + virtual bool HasStderr() = 0; + +#if wxUSE_SOCKETS + // this function is used by wxNet library to set the default socket manager + // to use: doing it like this allows us to keep all socket-related code in + // wxNet instead of having to pull it in wxBase itself as we'd have to do + // if we really implemented wxSocketManager here + // + // we don't take ownership of this pointer, it should have a lifetime + // greater than that of any socket (e.g. be a pointer to a static object) + static void SetDefaultSocketManager(wxSocketManager *manager) + { + ms_manager = manager; + } + + // return socket manager: this is usually different for console and GUI + // applications (although some ports use the same implementation for both) + virtual wxSocketManager *GetSocketManager() { return ms_manager; } +#endif + + // create a new, port specific, instance of the event loop used by wxApp + virtual wxEventLoopBase *CreateEventLoop() = 0; + +#if wxUSE_TIMER + // return platform and toolkit dependent wxTimer implementation + virtual wxTimerImpl *CreateTimerImpl(wxTimer *timer) = 0; +#endif + +#if wxUSE_THREADS + virtual void MutexGuiEnter(); + virtual void MutexGuiLeave(); +#endif + + // functions returning port-specific information + // ------------------------------------------------------------------------ + + // return information about the (native) toolkit currently used and its + // runtime (not compile-time) version. + // returns wxPORT_BASE for console applications and one of the remaining + // wxPORT_* values for GUI applications. + virtual wxPortId GetToolkitVersion(int *majVer = NULL, int *minVer = NULL) const = 0; + + // return true if the port is using wxUniversal for the GUI, false if not + virtual bool IsUsingUniversalWidgets() const = 0; + + // return the name of the Desktop Environment such as + // "KDE" or "GNOME". May return an empty string. + virtual wxString GetDesktopEnvironment() const = 0; + + // returns a short string to identify the block of the standard command + // line options parsed automatically by current port: if this string is + // empty, there are no such options, otherwise the function also fills + // passed arrays with the names and the descriptions of those options. + virtual wxString GetStandardCmdLineOptions(wxArrayString& names, + wxArrayString& desc) const + { + wxUnusedVar(names); + wxUnusedVar(desc); + + return wxEmptyString; + } + + +protected: +#if wxUSE_STACKWALKER + // utility function: returns the stack frame as a plain wxString + virtual wxString GetAssertStackTrace(); +#endif + +private: + static wxSocketManager *ms_manager; +}; + +// ---------------------------------------------------------------------------- +// include the platform-specific version of the class +// ---------------------------------------------------------------------------- + +// NB: test for __UNIX__ before __WXMAC__ as under Darwin we want to use the +// Unix code (and otherwise __UNIX__ wouldn't be defined) +// ABX: check __WIN32__ instead of __WXMSW__ for the same MSWBase in any Win32 port +#if defined(__WIN32__) + #include "wx/msw/apptbase.h" +#elif defined(__UNIX__) && !defined(__EMX__) + #include "wx/unix/apptbase.h" +#elif defined(__OS2__) + #include "wx/os2/apptbase.h" +#else // no platform-specific methods to add to wxAppTraits + // wxAppTraits must be a class because it was forward declared as class + class WXDLLIMPEXP_BASE wxAppTraits : public wxAppTraitsBase + { + }; +#endif // platform + +// ============================================================================ +// standard traits for console and GUI applications +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxConsoleAppTraitsBase: wxAppTraits implementation for the console apps +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxConsoleAppTraitsBase : public wxAppTraits +{ +public: +#if !wxUSE_CONSOLE_EVENTLOOP + virtual wxEventLoopBase *CreateEventLoop() { return NULL; } +#endif // !wxUSE_CONSOLE_EVENTLOOP + +#if wxUSE_LOG + virtual wxLog *CreateLogTarget(); +#endif // wxUSE_LOG + virtual wxMessageOutput *CreateMessageOutput(); +#if wxUSE_FONTMAP + virtual wxFontMapper *CreateFontMapper(); +#endif // wxUSE_FONTMAP + virtual wxRendererNative *CreateRenderer(); + + virtual bool ShowAssertDialog(const wxString& msg); + virtual bool HasStderr(); + + // the GetToolkitVersion for console application is always the same + virtual wxPortId GetToolkitVersion(int *verMaj = NULL, int *verMin = NULL) const + { + // no toolkits (wxBase is for console applications without GUI support) + // NB: zero means "no toolkit", -1 means "not initialized yet" + // so we must use zero here! + if (verMaj) *verMaj = 0; + if (verMin) *verMin = 0; + return wxPORT_BASE; + } + + virtual bool IsUsingUniversalWidgets() const { return false; } + virtual wxString GetDesktopEnvironment() const { return wxEmptyString; } +}; + +// ---------------------------------------------------------------------------- +// wxGUIAppTraitsBase: wxAppTraits implementation for the GUI apps +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + +class WXDLLIMPEXP_CORE wxGUIAppTraitsBase : public wxAppTraits +{ +public: +#if wxUSE_LOG + virtual wxLog *CreateLogTarget(); +#endif // wxUSE_LOG + virtual wxMessageOutput *CreateMessageOutput(); +#if wxUSE_FONTMAP + virtual wxFontMapper *CreateFontMapper(); +#endif // wxUSE_FONTMAP + virtual wxRendererNative *CreateRenderer(); + + virtual bool ShowAssertDialog(const wxString& msg); + virtual bool HasStderr(); + + virtual bool IsUsingUniversalWidgets() const + { + #ifdef __WXUNIVERSAL__ + return true; + #else + return false; + #endif + } + + virtual wxString GetDesktopEnvironment() const { return wxEmptyString; } +}; + +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// include the platform-specific version of the classes above +// ---------------------------------------------------------------------------- + +// ABX: check __WIN32__ instead of __WXMSW__ for the same MSWBase in any Win32 port +#if defined(__WIN32__) + #include "wx/msw/apptrait.h" +#elif defined(__OS2__) + #include "wx/os2/apptrait.h" +#elif defined(__UNIX__) + #include "wx/unix/apptrait.h" +#elif defined(__DOS__) + #include "wx/msdos/apptrait.h" +#else + #if wxUSE_GUI + class wxGUIAppTraits : public wxGUIAppTraitsBase + { + }; + #endif // wxUSE_GUI + class wxConsoleAppTraits: public wxConsoleAppTraitsBase + { + }; +#endif // platform + +#endif // _WX_APPTRAIT_H_ + diff --git a/wxmsw/include/wx-3.0/wx/archive.h b/wxmsw/include/wx-3.0/wx/archive.h new file mode 100644 index 00000000..9f284668 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/archive.h @@ -0,0 +1,382 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/archive.h +// Purpose: Streams for archive formats +// Author: Mike Wetherell +// Copyright: (c) 2004 Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ARCHIVE_H__ +#define _WX_ARCHIVE_H__ + +#include "wx/defs.h" + +#if wxUSE_STREAMS && wxUSE_ARCHIVE_STREAMS + +#include "wx/stream.h" +#include "wx/filename.h" + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveNotifier + +class WXDLLIMPEXP_BASE wxArchiveNotifier +{ +public: + virtual ~wxArchiveNotifier() { } + + virtual void OnEntryUpdated(class wxArchiveEntry& entry) = 0; +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveEntry +// +// Holds an entry's meta data, such as filename and timestamp. + +class WXDLLIMPEXP_BASE wxArchiveEntry : public wxObject +{ +public: + virtual ~wxArchiveEntry() { } + + virtual wxDateTime GetDateTime() const = 0; + virtual wxFileOffset GetSize() const = 0; + virtual wxFileOffset GetOffset() const = 0; + virtual bool IsDir() const = 0; + virtual bool IsReadOnly() const = 0; + virtual wxString GetInternalName() const = 0; + virtual wxPathFormat GetInternalFormat() const = 0; + virtual wxString GetName(wxPathFormat format = wxPATH_NATIVE) const = 0; + + virtual void SetDateTime(const wxDateTime& dt) = 0; + virtual void SetSize(wxFileOffset size) = 0; + virtual void SetIsDir(bool isDir = true) = 0; + virtual void SetIsReadOnly(bool isReadOnly = true) = 0; + virtual void SetName(const wxString& name, + wxPathFormat format = wxPATH_NATIVE) = 0; + + wxArchiveEntry *Clone() const { return DoClone(); } + + void SetNotifier(wxArchiveNotifier& notifier); + virtual void UnsetNotifier() { m_notifier = NULL; } + +protected: + wxArchiveEntry() : m_notifier(NULL) { } + wxArchiveEntry(const wxArchiveEntry& e) : wxObject(e), m_notifier(NULL) { } + + virtual void SetOffset(wxFileOffset offset) = 0; + virtual wxArchiveEntry* DoClone() const = 0; + + wxArchiveNotifier *GetNotifier() const { return m_notifier; } + wxArchiveEntry& operator=(const wxArchiveEntry& entry); + +private: + wxArchiveNotifier *m_notifier; + + DECLARE_ABSTRACT_CLASS(wxArchiveEntry) +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveInputStream +// +// GetNextEntry() returns an wxArchiveEntry object containing the meta-data +// for the next entry in the archive (and gives away ownership). Reading from +// the wxArchiveInputStream then returns the entry's data. Eof() becomes true +// after an attempt has been made to read past the end of the entry's data. +// +// When there are no more entries, GetNextEntry() returns NULL and sets Eof(). + +class WXDLLIMPEXP_BASE wxArchiveInputStream : public wxFilterInputStream +{ +public: + typedef wxArchiveEntry entry_type; + + virtual ~wxArchiveInputStream() { } + + virtual bool OpenEntry(wxArchiveEntry& entry) = 0; + virtual bool CloseEntry() = 0; + + wxArchiveEntry *GetNextEntry() { return DoGetNextEntry(); } + + virtual char Peek() { return wxInputStream::Peek(); } + +protected: + wxArchiveInputStream(wxInputStream& stream, wxMBConv& conv); + wxArchiveInputStream(wxInputStream *stream, wxMBConv& conv); + + virtual wxArchiveEntry *DoGetNextEntry() = 0; + + wxMBConv& GetConv() const { return m_conv; } + +private: + wxMBConv& m_conv; +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveOutputStream +// +// PutNextEntry is used to create a new entry in the output archive, then +// the entry's data is written to the wxArchiveOutputStream. +// +// Only one entry can be open for output at a time; another call to +// PutNextEntry closes the current entry and begins the next. +// +// The overload 'bool PutNextEntry(wxArchiveEntry *entry)' takes ownership +// of the entry object. + +class WXDLLIMPEXP_BASE wxArchiveOutputStream : public wxFilterOutputStream +{ +public: + virtual ~wxArchiveOutputStream() { } + + virtual bool PutNextEntry(wxArchiveEntry *entry) = 0; + + virtual bool PutNextEntry(const wxString& name, + const wxDateTime& dt = wxDateTime::Now(), + wxFileOffset size = wxInvalidOffset) = 0; + + virtual bool PutNextDirEntry(const wxString& name, + const wxDateTime& dt = wxDateTime::Now()) = 0; + + virtual bool CopyEntry(wxArchiveEntry *entry, + wxArchiveInputStream& stream) = 0; + + virtual bool CopyArchiveMetaData(wxArchiveInputStream& stream) = 0; + + virtual bool CloseEntry() = 0; + +protected: + wxArchiveOutputStream(wxOutputStream& stream, wxMBConv& conv); + wxArchiveOutputStream(wxOutputStream *stream, wxMBConv& conv); + + wxMBConv& GetConv() const { return m_conv; } + +private: + wxMBConv& m_conv; +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveIterator +// +// An input iterator that can be used to transfer an archive's catalog to +// a container. + +#if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR +#include +#include + +template inline +void _wxSetArchiveIteratorValue( + X& val, Y entry, void *WXUNUSED(d)) +{ + val = X(entry); +} +template inline +void _wxSetArchiveIteratorValue( + std::pair& val, Z entry, Z WXUNUSED(d)) +{ + val = std::make_pair(X(entry->GetInternalName()), Y(entry)); +} + +#if defined _MSC_VER && _MSC_VER < 1300 +template +#else +template +#endif +class wxArchiveIterator +{ +public: + typedef std::input_iterator_tag iterator_category; + typedef T value_type; + typedef ptrdiff_t difference_type; + typedef T* pointer; + typedef T& reference; + + wxArchiveIterator() : m_rep(NULL) { } + + wxArchiveIterator(Arc& arc) { + typename Arc::entry_type* entry = arc.GetNextEntry(); + m_rep = entry ? new Rep(arc, entry) : NULL; + } + + wxArchiveIterator(const wxArchiveIterator& it) : m_rep(it.m_rep) { + if (m_rep) + m_rep->AddRef(); + } + + ~wxArchiveIterator() { + if (m_rep) + m_rep->UnRef(); + } + + const T& operator *() const { + return m_rep->GetValue(); + } + + const T* operator ->() const { + return &**this; + } + + wxArchiveIterator& operator =(const wxArchiveIterator& it) { + if (it.m_rep) + it.m_rep.AddRef(); + if (m_rep) + this->m_rep.UnRef(); + m_rep = it.m_rep; + return *this; + } + + wxArchiveIterator& operator ++() { + m_rep = m_rep->Next(); + return *this; + } + + wxArchiveIterator operator ++(int) { + wxArchiveIterator it(*this); + ++(*this); + return it; + } + + bool operator ==(const wxArchiveIterator& j) const { + return m_rep == j.m_rep; + } + + bool operator !=(const wxArchiveIterator& j) const { + return !(*this == j); + } + +private: + class Rep { + Arc& m_arc; + typename Arc::entry_type* m_entry; + T m_value; + int m_ref; + + public: + Rep(Arc& arc, typename Arc::entry_type* entry) + : m_arc(arc), m_entry(entry), m_value(), m_ref(1) { } + ~Rep() + { delete m_entry; } + + void AddRef() { + m_ref++; + } + + void UnRef() { + if (--m_ref == 0) + delete this; + } + + Rep *Next() { + typename Arc::entry_type* entry = m_arc.GetNextEntry(); + if (!entry) { + UnRef(); + return NULL; + } + if (m_ref > 1) { + m_ref--; + return new Rep(m_arc, entry); + } + delete m_entry; + m_entry = entry; + m_value = T(); + return this; + } + + const T& GetValue() { + if (m_entry) { + _wxSetArchiveIteratorValue(m_value, m_entry, m_entry); + m_entry = NULL; + } + return m_value; + } + } *m_rep; +}; + +typedef wxArchiveIterator wxArchiveIter; +typedef wxArchiveIterator > wxArchivePairIter; + +#endif // wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveClassFactory +// +// A wxArchiveClassFactory instance for a particular archive type allows +// the creation of the other classes that may be needed. + +void WXDLLIMPEXP_BASE wxUseArchiveClasses(); + +class WXDLLIMPEXP_BASE wxArchiveClassFactory : public wxFilterClassFactoryBase +{ +public: + typedef wxArchiveEntry entry_type; + typedef wxArchiveInputStream instream_type; + typedef wxArchiveOutputStream outstream_type; + typedef wxArchiveNotifier notifier_type; +#if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR + typedef wxArchiveIter iter_type; + typedef wxArchivePairIter pairiter_type; +#endif + + virtual ~wxArchiveClassFactory() { } + + wxArchiveEntry *NewEntry() const + { return DoNewEntry(); } + wxArchiveInputStream *NewStream(wxInputStream& stream) const + { return DoNewStream(stream); } + wxArchiveOutputStream *NewStream(wxOutputStream& stream) const + { return DoNewStream(stream); } + wxArchiveInputStream *NewStream(wxInputStream *stream) const + { return DoNewStream(stream); } + wxArchiveOutputStream *NewStream(wxOutputStream *stream) const + { return DoNewStream(stream); } + + virtual wxString GetInternalName( + const wxString& name, + wxPathFormat format = wxPATH_NATIVE) const = 0; + + // FIXME-UTF8: remove these from this file, they are used for ANSI + // build only + void SetConv(wxMBConv& conv) { m_pConv = &conv; } + wxMBConv& GetConv() const + { if (m_pConv) return *m_pConv; else return wxConvLocal; } + + static const wxArchiveClassFactory *Find(const wxString& protocol, + wxStreamProtocolType type + = wxSTREAM_PROTOCOL); + + static const wxArchiveClassFactory *GetFirst(); + const wxArchiveClassFactory *GetNext() const { return m_next; } + + void PushFront() { Remove(); m_next = sm_first; sm_first = this; } + void Remove(); + +protected: + // old compilers don't support covarient returns, so 'Do' methods are + // used to simulate them + virtual wxArchiveEntry *DoNewEntry() const = 0; + virtual wxArchiveInputStream *DoNewStream(wxInputStream& stream) const = 0; + virtual wxArchiveOutputStream *DoNewStream(wxOutputStream& stream) const = 0; + virtual wxArchiveInputStream *DoNewStream(wxInputStream *stream) const = 0; + virtual wxArchiveOutputStream *DoNewStream(wxOutputStream *stream) const = 0; + + wxArchiveClassFactory() : m_pConv(NULL), m_next(this) { } + wxArchiveClassFactory& operator=(const wxArchiveClassFactory& WXUNUSED(f)) + { return *this; } + +private: + wxMBConv *m_pConv; + static wxArchiveClassFactory *sm_first; + wxArchiveClassFactory *m_next; + + DECLARE_ABSTRACT_CLASS(wxArchiveClassFactory) +}; + +#endif // wxUSE_STREAMS && wxUSE_ARCHIVE_STREAMS + +#endif // _WX_ARCHIVE_H__ diff --git a/wxmsw/include/wx-3.0/wx/arrimpl.cpp b/wxmsw/include/wx-3.0/wx/arrimpl.cpp new file mode 100644 index 00000000..0ef9e748 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/arrimpl.cpp @@ -0,0 +1,119 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/arrimpl.cpp +// Purpose: helper file for implementation of dynamic lists +// Author: Vadim Zeitlin +// Modified by: +// Created: 16.10.97 +// Copyright: (c) 1997 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/***************************************************************************** + * Purpose: implements methods of "template" class declared in * + * DECLARE_OBJARRAY macro and which couldn't be implemented inline * + * (because they need the full definition of type T in scope) * + * * + * Usage: 1) #include dynarray.h * + * 2) WX_DECLARE_OBJARRAY * + * 3) #include arrimpl.cpp * + * 4) WX_DEFINE_OBJARRAY * + *****************************************************************************/ + +// needed to resolve the conflict between global T and macro parameter T + +#define _WX_ERROR_REMOVE2(x) wxT("bad index in ") wxT(#x) wxT("::RemoveAt()") + +// macro implements remaining (not inline) methods of template list +// (it's private to this file) +#undef _DEFINE_OBJARRAY +#define _DEFINE_OBJARRAY(T, name) \ +name::~name() \ +{ \ + Empty(); \ +} \ + \ +void name::DoCopy(const name& src) \ +{ \ + for ( size_t ui = 0; ui < src.size(); ui++ ) \ + Add(src[ui]); \ +} \ + \ +name& name::operator=(const name& src) \ +{ \ + Empty(); \ + DoCopy(src); \ + \ + return *this; \ +} \ + \ +name::name(const name& src) : wxArrayPtrVoid() \ +{ \ + DoCopy(src); \ +} \ + \ +void name::DoEmpty() \ +{ \ + for ( size_t ui = 0; ui < size(); ui++ ) \ + delete (T*)base_array::operator[](ui); \ +} \ + \ +void name::RemoveAt(size_t uiIndex, size_t nRemove) \ +{ \ + wxCHECK_RET( uiIndex < size(), _WX_ERROR_REMOVE2(name) ); \ + \ + for (size_t i = 0; i < nRemove; i++ ) \ + delete (T*)base_array::operator[](uiIndex + i); \ + \ + base_array::erase(begin() + uiIndex, begin() + uiIndex + nRemove); \ +} \ + \ +void name::Add(const T& item, size_t nInsert) \ +{ \ + if (nInsert == 0) \ + return; \ + T* pItem = new T(item); \ + size_t nOldSize = size(); \ + if ( pItem != NULL ) \ + base_array::insert(end(), nInsert, pItem); \ + for (size_t i = 1; i < nInsert; i++) \ + base_array::operator[](nOldSize + i) = new T(item); \ +} \ + \ +void name::Insert(const T& item, size_t uiIndex, size_t nInsert) \ +{ \ + if (nInsert == 0) \ + return; \ + T* pItem = new T(item); \ + if ( pItem != NULL ) \ + base_array::insert(begin() + uiIndex, nInsert, pItem); \ + for (size_t i = 1; i < nInsert; i++) \ + base_array::operator[](uiIndex + i) = new T(item); \ +} \ + \ +int name::Index(const T& item, bool bFromEnd) const \ +{ \ + if ( bFromEnd ) { \ + if ( size() > 0 ) { \ + size_t ui = size() - 1; \ + do { \ + if ( (T*)base_array::operator[](ui) == &item ) \ + return static_cast(ui); \ + ui--; \ + } \ + while ( ui != 0 ); \ + } \ + } \ + else { \ + for( size_t ui = 0; ui < size(); ui++ ) { \ + if( (T*)base_array::operator[](ui) == &item ) \ + return static_cast(ui); \ + } \ + } \ + \ + return wxNOT_FOUND; \ +} + +// redefine the macro so that now it will generate the class implementation +// old value would provoke a compile-time error if this file is not included +#undef WX_DEFINE_OBJARRAY +#define WX_DEFINE_OBJARRAY(name) _DEFINE_OBJARRAY(_wxObjArray##name, name) diff --git a/wxmsw/include/wx-3.0/wx/arrstr.h b/wxmsw/include/wx-3.0/wx/arrstr.h new file mode 100644 index 00000000..db67c8ef --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/arrstr.h @@ -0,0 +1,515 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/arrstr.h +// Purpose: wxArrayString class +// Author: Mattia Barbon and Vadim Zeitlin +// Modified by: +// Created: 07/07/03 +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ARRSTR_H +#define _WX_ARRSTR_H + +#include "wx/defs.h" +#include "wx/string.h" + +// these functions are only used in STL build now but we define them in any +// case for compatibility with the existing code outside of the library which +// could be using them +inline int wxCMPFUNC_CONV wxStringSortAscending(wxString* s1, wxString* s2) +{ + return s1->Cmp(*s2); +} + +inline int wxCMPFUNC_CONV wxStringSortDescending(wxString* s1, wxString* s2) +{ + return wxStringSortAscending(s2, s1); +} + +#if wxUSE_STD_CONTAINERS + +#include "wx/dynarray.h" + +typedef int (wxCMPFUNC_CONV *CMPFUNCwxString)(wxString*, wxString*); +typedef wxString _wxArraywxBaseArrayStringBase; +_WX_DECLARE_BASEARRAY_2(_wxArraywxBaseArrayStringBase, wxBaseArrayStringBase, + wxArray_SortFunction, + class WXDLLIMPEXP_BASE); +WX_DEFINE_USER_EXPORTED_TYPEARRAY(wxString, wxArrayStringBase, + wxBaseArrayStringBase, WXDLLIMPEXP_BASE); +_WX_DEFINE_SORTED_TYPEARRAY_2(wxString, wxSortedArrayStringBase, + wxBaseArrayStringBase, = wxStringSortAscending, + class WXDLLIMPEXP_BASE, CMPFUNCwxString); + +class WXDLLIMPEXP_BASE wxArrayString : public wxArrayStringBase +{ +public: + // type of function used by wxArrayString::Sort() + typedef int (wxCMPFUNC_CONV *CompareFunction)(const wxString& first, + const wxString& second); + + wxArrayString() { } + wxArrayString(const wxArrayString& a) : wxArrayStringBase(a) { } + wxArrayString(size_t sz, const char** a); + wxArrayString(size_t sz, const wchar_t** a); + wxArrayString(size_t sz, const wxString* a); + + int Index(const wxString& str, bool bCase = true, bool bFromEnd = false) const; + + void Sort(bool reverseOrder = false); + void Sort(CompareFunction function); + void Sort(CMPFUNCwxString function) { wxArrayStringBase::Sort(function); } + + size_t Add(const wxString& string, size_t copies = 1) + { + wxArrayStringBase::Add(string, copies); + return size() - copies; + } +}; + +class WXDLLIMPEXP_BASE wxSortedArrayString : public wxSortedArrayStringBase +{ +public: + wxSortedArrayString() : wxSortedArrayStringBase(wxStringSortAscending) + { } + wxSortedArrayString(const wxSortedArrayString& array) + : wxSortedArrayStringBase(array) + { } + wxSortedArrayString(const wxArrayString& src) + : wxSortedArrayStringBase(wxStringSortAscending) + { + reserve(src.size()); + + for ( size_t n = 0; n < src.size(); n++ ) + Add(src[n]); + } + + int Index(const wxString& str, bool bCase = true, bool bFromEnd = false) const; + +private: + void Insert() + { + wxFAIL_MSG( "wxSortedArrayString::Insert() is not to be used" ); + } + + void Sort() + { + wxFAIL_MSG( "wxSortedArrayString::Sort() is not to be used" ); + } +}; + +#else // if !wxUSE_STD_CONTAINERS + +// this shouldn't be defined for compilers not supporting template methods or +// without std::distance() +// +// FIXME-VC6: currently it's only not defined for VC6 in DLL build as it +// doesn't export template methods from DLL correctly so even though +// it compiles them fine, we get link errors when using wxArrayString +#if !defined(__VISUALC6__) || !(defined(WXMAKINGDLL) || defined(WXUSINGDLL)) + #define wxHAS_VECTOR_TEMPLATE_ASSIGN +#endif + +#ifdef wxHAS_VECTOR_TEMPLATE_ASSIGN + #include "wx/beforestd.h" + #include + #include "wx/afterstd.h" +#endif // wxHAS_VECTOR_TEMPLATE_ASSIGN + +class WXDLLIMPEXP_BASE wxArrayString +{ +public: + // type of function used by wxArrayString::Sort() + typedef int (wxCMPFUNC_CONV *CompareFunction)(const wxString& first, + const wxString& second); + // type of function used by wxArrayString::Sort(), for compatibility with + // wxArray + typedef int (wxCMPFUNC_CONV *CompareFunction2)(wxString* first, + wxString* second); + + // constructors and destructor + // default ctor + wxArrayString() { Init(false); } + // if autoSort is true, the array is always sorted (in alphabetical order) + // + // NB: the reason for using int and not bool is that like this we can avoid + // using this ctor for implicit conversions from "const char *" (which + // we'd like to be implicitly converted to wxString instead!). This + // wouldn't be needed if the 'explicit' keyword was supported by all + // compilers, or if this was protected ctor for wxSortedArrayString, + // but we're stuck with it now. + wxEXPLICIT wxArrayString(int autoSort) { Init(autoSort != 0); } + // C string array ctor + wxArrayString(size_t sz, const char** a); + wxArrayString(size_t sz, const wchar_t** a); + // wxString string array ctor + wxArrayString(size_t sz, const wxString* a); + // copy ctor + wxArrayString(const wxArrayString& array); + // assignment operator + wxArrayString& operator=(const wxArrayString& src); + // not virtual, this class should not be derived from + ~wxArrayString(); + + // memory management + // empties the list, but doesn't release memory + void Empty(); + // empties the list and releases memory + void Clear(); + // preallocates memory for given number of items + void Alloc(size_t nCount); + // minimzes the memory usage (by freeing all extra memory) + void Shrink(); + + // simple accessors + // number of elements in the array + size_t GetCount() const { return m_nCount; } + // is it empty? + bool IsEmpty() const { return m_nCount == 0; } + // number of elements in the array (GetCount is preferred API) + size_t Count() const { return m_nCount; } + + // items access (range checking is done in debug version) + // get item at position uiIndex + wxString& Item(size_t nIndex) + { + wxASSERT_MSG( nIndex < m_nCount, + wxT("wxArrayString: index out of bounds") ); + + return m_pItems[nIndex]; + } + const wxString& Item(size_t nIndex) const { return const_cast(this)->Item(nIndex); } + + // same as Item() + wxString& operator[](size_t nIndex) { return Item(nIndex); } + const wxString& operator[](size_t nIndex) const { return Item(nIndex); } + // get last item + wxString& Last() + { + wxASSERT_MSG( !IsEmpty(), + wxT("wxArrayString: index out of bounds") ); + return Item(GetCount() - 1); + } + const wxString& Last() const { return const_cast(this)->Last(); } + + + // item management + // Search the element in the array, starting from the beginning if + // bFromEnd is false or from end otherwise. If bCase, comparison is case + // sensitive (default). Returns index of the first item matched or + // wxNOT_FOUND + int Index (const wxString& str, bool bCase = true, bool bFromEnd = false) const; + // add new element at the end (if the array is not sorted), return its + // index + size_t Add(const wxString& str, size_t nInsert = 1); + // add new element at given position + void Insert(const wxString& str, size_t uiIndex, size_t nInsert = 1); + // expand the array to have count elements + void SetCount(size_t count); + // remove first item matching this value + void Remove(const wxString& sz); + // remove item by index + void RemoveAt(size_t nIndex, size_t nRemove = 1); + + // sorting + // sort array elements in alphabetical order (or reversed alphabetical + // order if reverseOrder parameter is true) + void Sort(bool reverseOrder = false); + // sort array elements using specified comparison function + void Sort(CompareFunction compareFunction); + void Sort(CompareFunction2 compareFunction); + + // comparison + // compare two arrays case sensitively + bool operator==(const wxArrayString& a) const; + // compare two arrays case sensitively + bool operator!=(const wxArrayString& a) const { return !(*this == a); } + + // STL-like interface + typedef wxString value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type* iterator; + typedef const value_type* const_iterator; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef int difference_type; + typedef size_t size_type; + + // TODO: this code duplicates the one in dynarray.h + class reverse_iterator + { + typedef wxString value_type; + typedef value_type* pointer; + typedef value_type& reference; + typedef reverse_iterator itor; + friend itor operator+(int o, const itor& it); + friend itor operator+(const itor& it, int o); + friend itor operator-(const itor& it, int o); + friend difference_type operator -(const itor& i1, const itor& i2); + public: + pointer m_ptr; + reverse_iterator() : m_ptr(NULL) { } + wxEXPLICIT reverse_iterator(pointer ptr) : m_ptr(ptr) { } + reverse_iterator(const itor& it) : m_ptr(it.m_ptr) { } + reference operator*() const { return *m_ptr; } + pointer operator->() const { return m_ptr; } + itor& operator++() { --m_ptr; return *this; } + const itor operator++(int) + { reverse_iterator tmp = *this; --m_ptr; return tmp; } + itor& operator--() { ++m_ptr; return *this; } + const itor operator--(int) { itor tmp = *this; ++m_ptr; return tmp; } + bool operator ==(const itor& it) const { return m_ptr == it.m_ptr; } + bool operator !=(const itor& it) const { return m_ptr != it.m_ptr; } + }; + + class const_reverse_iterator + { + typedef wxString value_type; + typedef const value_type* pointer; + typedef const value_type& reference; + typedef const_reverse_iterator itor; + friend itor operator+(int o, const itor& it); + friend itor operator+(const itor& it, int o); + friend itor operator-(const itor& it, int o); + friend difference_type operator -(const itor& i1, const itor& i2); + public: + pointer m_ptr; + const_reverse_iterator() : m_ptr(NULL) { } + wxEXPLICIT const_reverse_iterator(pointer ptr) : m_ptr(ptr) { } + const_reverse_iterator(const itor& it) : m_ptr(it.m_ptr) { } + const_reverse_iterator(const reverse_iterator& it) : m_ptr(it.m_ptr) { } + reference operator*() const { return *m_ptr; } + pointer operator->() const { return m_ptr; } + itor& operator++() { --m_ptr; return *this; } + const itor operator++(int) + { itor tmp = *this; --m_ptr; return tmp; } + itor& operator--() { ++m_ptr; return *this; } + const itor operator--(int) { itor tmp = *this; ++m_ptr; return tmp; } + bool operator ==(const itor& it) const { return m_ptr == it.m_ptr; } + bool operator !=(const itor& it) const { return m_ptr != it.m_ptr; } + }; + + wxArrayString(const_iterator first, const_iterator last) + { Init(false); assign(first, last); } + wxArrayString(size_type n, const_reference v) { Init(false); assign(n, v); } + +#ifdef wxHAS_VECTOR_TEMPLATE_ASSIGN + template + void assign(Iterator first, Iterator last) + { + clear(); + reserve(std::distance(first, last)); + for(; first != last; ++first) + push_back(*first); + } +#else // !wxHAS_VECTOR_TEMPLATE_ASSIGN + void assign(const_iterator first, const_iterator last) + { + clear(); + reserve(last - first); + for(; first != last; ++first) + push_back(*first); + } +#endif // wxHAS_VECTOR_TEMPLATE_ASSIGN/!wxHAS_VECTOR_TEMPLATE_ASSIGN + + void assign(size_type n, const_reference v) + { clear(); Add(v, n); } + reference back() { return *(end() - 1); } + const_reference back() const { return *(end() - 1); } + iterator begin() { return m_pItems; } + const_iterator begin() const { return m_pItems; } + size_type capacity() const { return m_nSize; } + void clear() { Clear(); } + bool empty() const { return IsEmpty(); } + iterator end() { return begin() + GetCount(); } + const_iterator end() const { return begin() + GetCount(); } + iterator erase(iterator first, iterator last) + { + size_t idx = first - begin(); + RemoveAt(idx, last - first); + return begin() + idx; + } + iterator erase(iterator it) { return erase(it, it + 1); } + reference front() { return *begin(); } + const_reference front() const { return *begin(); } + void insert(iterator it, size_type n, const_reference v) + { Insert(v, it - begin(), n); } + iterator insert(iterator it, const_reference v = value_type()) + { size_t idx = it - begin(); Insert(v, idx); return begin() + idx; } + void insert(iterator it, const_iterator first, const_iterator last); + size_type max_size() const { return INT_MAX; } + void pop_back() { RemoveAt(GetCount() - 1); } + void push_back(const_reference v) { Add(v); } + reverse_iterator rbegin() { return reverse_iterator(end() - 1); } + const_reverse_iterator rbegin() const + { return const_reverse_iterator(end() - 1); } + reverse_iterator rend() { return reverse_iterator(begin() - 1); } + const_reverse_iterator rend() const + { return const_reverse_iterator(begin() - 1); } + void reserve(size_type n) /* base::reserve*/; + void resize(size_type n, value_type v = value_type()); + size_type size() const { return GetCount(); } + void swap(wxArrayString& other) + { + wxSwap(m_nSize, other.m_nSize); + wxSwap(m_nCount, other.m_nCount); + wxSwap(m_pItems, other.m_pItems); + wxSwap(m_autoSort, other.m_autoSort); + } + +protected: + void Init(bool autoSort); // common part of all ctors + void Copy(const wxArrayString& src); // copies the contents of another array + +private: + void Grow(size_t nIncrement = 0); // makes array bigger if needed + + size_t m_nSize, // current size of the array + m_nCount; // current number of elements + + wxString *m_pItems; // pointer to data + + bool m_autoSort; // if true, keep the array always sorted +}; + +class WXDLLIMPEXP_BASE wxSortedArrayString : public wxArrayString +{ +public: + wxSortedArrayString() : wxArrayString(true) + { } + wxSortedArrayString(const wxArrayString& array) : wxArrayString(true) + { Copy(array); } +}; + +#endif // !wxUSE_STD_CONTAINERS + +// this class provides a temporary wxString* from a +// wxArrayString +class WXDLLIMPEXP_BASE wxCArrayString +{ +public: + wxCArrayString( const wxArrayString& array ) + : m_array( array ), m_strings( NULL ) + { } + ~wxCArrayString() { delete[] m_strings; } + + size_t GetCount() const { return m_array.GetCount(); } + wxString* GetStrings() + { + if( m_strings ) return m_strings; + size_t count = m_array.GetCount(); + m_strings = new wxString[count]; + for( size_t i = 0; i < count; ++i ) + m_strings[i] = m_array[i]; + return m_strings; + } + + wxString* Release() + { + wxString *r = GetStrings(); + m_strings = NULL; + return r; + } + +private: + const wxArrayString& m_array; + wxString* m_strings; +}; + + +// ---------------------------------------------------------------------------- +// helper functions for working with arrays +// ---------------------------------------------------------------------------- + +// by default, these functions use the escape character to escape the +// separators occurring inside the string to be joined, this can be disabled by +// passing '\0' as escape + +WXDLLIMPEXP_BASE wxString wxJoin(const wxArrayString& arr, + const wxChar sep, + const wxChar escape = wxT('\\')); + +WXDLLIMPEXP_BASE wxArrayString wxSplit(const wxString& str, + const wxChar sep, + const wxChar escape = wxT('\\')); + + +// ---------------------------------------------------------------------------- +// This helper class allows to pass both C array of wxStrings or wxArrayString +// using the same interface. +// +// Use it when you have two methods taking wxArrayString or (int, wxString[]), +// that do the same thing. This class lets you iterate over input data in the +// same way whether it is a raw array of strings or wxArrayString. +// +// The object does not take ownership of the data -- internally it keeps +// pointers to the data, therefore the data must be disposed of by user +// and only after this object is destroyed. Usually it is not a problem as +// only temporary objects of this class are used. +// ---------------------------------------------------------------------------- + +class wxArrayStringsAdapter +{ +public: + // construct an adapter from a wxArrayString + wxArrayStringsAdapter(const wxArrayString& strings) + : m_type(wxSTRING_ARRAY), m_size(strings.size()) + { + m_data.array = &strings; + } + + // construct an adapter from a wxString[] + wxArrayStringsAdapter(unsigned int n, const wxString *strings) + : m_type(wxSTRING_POINTER), m_size(n) + { + m_data.ptr = strings; + } + + // construct an adapter from a single wxString + wxArrayStringsAdapter(const wxString& s) + : m_type(wxSTRING_POINTER), m_size(1) + { + m_data.ptr = &s; + } + + // default copy constructor is ok + + // iteration interface + size_t GetCount() const { return m_size; } + bool IsEmpty() const { return GetCount() == 0; } + const wxString& operator[] (unsigned int i) const + { + wxASSERT_MSG( i < GetCount(), wxT("index out of bounds") ); + if(m_type == wxSTRING_POINTER) + return m_data.ptr[i]; + return m_data.array->Item(i); + } + wxArrayString AsArrayString() const + { + if(m_type == wxSTRING_ARRAY) + return *m_data.array; + return wxArrayString(GetCount(), m_data.ptr); + } + +private: + // type of the data being held + enum wxStringContainerType + { + wxSTRING_ARRAY, // wxArrayString + wxSTRING_POINTER // wxString[] + }; + + wxStringContainerType m_type; + size_t m_size; + union + { + const wxString * ptr; + const wxArrayString * array; + } m_data; + + wxDECLARE_NO_ASSIGN_CLASS(wxArrayStringsAdapter); +}; + +#endif // _WX_ARRSTR_H diff --git a/wxmsw/include/wx-3.0/wx/artprov.h b/wxmsw/include/wx-3.0/wx/artprov.h new file mode 100644 index 00000000..3e95ed98 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/artprov.h @@ -0,0 +1,261 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/artprov.h +// Purpose: wxArtProvider class +// Author: Vaclav Slavik +// Modified by: +// Created: 18/03/2002 +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ARTPROV_H_ +#define _WX_ARTPROV_H_ + +#include "wx/string.h" +#include "wx/bitmap.h" +#include "wx/icon.h" +#include "wx/iconbndl.h" + +class WXDLLIMPEXP_FWD_CORE wxArtProvidersList; +class WXDLLIMPEXP_FWD_CORE wxArtProviderCache; +class wxArtProviderModule; + +// ---------------------------------------------------------------------------- +// Types +// ---------------------------------------------------------------------------- + +typedef wxString wxArtClient; +typedef wxString wxArtID; + +#define wxART_MAKE_CLIENT_ID_FROM_STR(id) ((id) + "_C") +#define wxART_MAKE_CLIENT_ID(id) (#id "_C") +#define wxART_MAKE_ART_ID_FROM_STR(id) (id) +#define wxART_MAKE_ART_ID(id) (#id) + +// ---------------------------------------------------------------------------- +// Art clients +// ---------------------------------------------------------------------------- + +#define wxART_TOOLBAR wxART_MAKE_CLIENT_ID(wxART_TOOLBAR) +#define wxART_MENU wxART_MAKE_CLIENT_ID(wxART_MENU) +#define wxART_FRAME_ICON wxART_MAKE_CLIENT_ID(wxART_FRAME_ICON) + +#define wxART_CMN_DIALOG wxART_MAKE_CLIENT_ID(wxART_CMN_DIALOG) +#define wxART_HELP_BROWSER wxART_MAKE_CLIENT_ID(wxART_HELP_BROWSER) +#define wxART_MESSAGE_BOX wxART_MAKE_CLIENT_ID(wxART_MESSAGE_BOX) +#define wxART_BUTTON wxART_MAKE_CLIENT_ID(wxART_BUTTON) +#define wxART_LIST wxART_MAKE_CLIENT_ID(wxART_LIST) + +#define wxART_OTHER wxART_MAKE_CLIENT_ID(wxART_OTHER) + +// ---------------------------------------------------------------------------- +// Art IDs +// ---------------------------------------------------------------------------- + +#define wxART_ADD_BOOKMARK wxART_MAKE_ART_ID(wxART_ADD_BOOKMARK) +#define wxART_DEL_BOOKMARK wxART_MAKE_ART_ID(wxART_DEL_BOOKMARK) +#define wxART_HELP_SIDE_PANEL wxART_MAKE_ART_ID(wxART_HELP_SIDE_PANEL) +#define wxART_HELP_SETTINGS wxART_MAKE_ART_ID(wxART_HELP_SETTINGS) +#define wxART_HELP_BOOK wxART_MAKE_ART_ID(wxART_HELP_BOOK) +#define wxART_HELP_FOLDER wxART_MAKE_ART_ID(wxART_HELP_FOLDER) +#define wxART_HELP_PAGE wxART_MAKE_ART_ID(wxART_HELP_PAGE) +#define wxART_GO_BACK wxART_MAKE_ART_ID(wxART_GO_BACK) +#define wxART_GO_FORWARD wxART_MAKE_ART_ID(wxART_GO_FORWARD) +#define wxART_GO_UP wxART_MAKE_ART_ID(wxART_GO_UP) +#define wxART_GO_DOWN wxART_MAKE_ART_ID(wxART_GO_DOWN) +#define wxART_GO_TO_PARENT wxART_MAKE_ART_ID(wxART_GO_TO_PARENT) +#define wxART_GO_HOME wxART_MAKE_ART_ID(wxART_GO_HOME) +#define wxART_GOTO_FIRST wxART_MAKE_ART_ID(wxART_GOTO_FIRST) +#define wxART_GOTO_LAST wxART_MAKE_ART_ID(wxART_GOTO_LAST) +#define wxART_FILE_OPEN wxART_MAKE_ART_ID(wxART_FILE_OPEN) +#define wxART_FILE_SAVE wxART_MAKE_ART_ID(wxART_FILE_SAVE) +#define wxART_FILE_SAVE_AS wxART_MAKE_ART_ID(wxART_FILE_SAVE_AS) +#define wxART_PRINT wxART_MAKE_ART_ID(wxART_PRINT) +#define wxART_HELP wxART_MAKE_ART_ID(wxART_HELP) +#define wxART_TIP wxART_MAKE_ART_ID(wxART_TIP) +#define wxART_REPORT_VIEW wxART_MAKE_ART_ID(wxART_REPORT_VIEW) +#define wxART_LIST_VIEW wxART_MAKE_ART_ID(wxART_LIST_VIEW) +#define wxART_NEW_DIR wxART_MAKE_ART_ID(wxART_NEW_DIR) +#define wxART_HARDDISK wxART_MAKE_ART_ID(wxART_HARDDISK) +#define wxART_FLOPPY wxART_MAKE_ART_ID(wxART_FLOPPY) +#define wxART_CDROM wxART_MAKE_ART_ID(wxART_CDROM) +#define wxART_REMOVABLE wxART_MAKE_ART_ID(wxART_REMOVABLE) +#define wxART_FOLDER wxART_MAKE_ART_ID(wxART_FOLDER) +#define wxART_FOLDER_OPEN wxART_MAKE_ART_ID(wxART_FOLDER_OPEN) +#define wxART_GO_DIR_UP wxART_MAKE_ART_ID(wxART_GO_DIR_UP) +#define wxART_EXECUTABLE_FILE wxART_MAKE_ART_ID(wxART_EXECUTABLE_FILE) +#define wxART_NORMAL_FILE wxART_MAKE_ART_ID(wxART_NORMAL_FILE) +#define wxART_TICK_MARK wxART_MAKE_ART_ID(wxART_TICK_MARK) +#define wxART_CROSS_MARK wxART_MAKE_ART_ID(wxART_CROSS_MARK) +#define wxART_ERROR wxART_MAKE_ART_ID(wxART_ERROR) +#define wxART_QUESTION wxART_MAKE_ART_ID(wxART_QUESTION) +#define wxART_WARNING wxART_MAKE_ART_ID(wxART_WARNING) +#define wxART_INFORMATION wxART_MAKE_ART_ID(wxART_INFORMATION) +#define wxART_MISSING_IMAGE wxART_MAKE_ART_ID(wxART_MISSING_IMAGE) + +#define wxART_COPY wxART_MAKE_ART_ID(wxART_COPY) +#define wxART_CUT wxART_MAKE_ART_ID(wxART_CUT) +#define wxART_PASTE wxART_MAKE_ART_ID(wxART_PASTE) +#define wxART_DELETE wxART_MAKE_ART_ID(wxART_DELETE) +#define wxART_NEW wxART_MAKE_ART_ID(wxART_NEW) + +#define wxART_UNDO wxART_MAKE_ART_ID(wxART_UNDO) +#define wxART_REDO wxART_MAKE_ART_ID(wxART_REDO) + +#define wxART_PLUS wxART_MAKE_ART_ID(wxART_PLUS) +#define wxART_MINUS wxART_MAKE_ART_ID(wxART_MINUS) + +#define wxART_CLOSE wxART_MAKE_ART_ID(wxART_CLOSE) +#define wxART_QUIT wxART_MAKE_ART_ID(wxART_QUIT) + +#define wxART_FIND wxART_MAKE_ART_ID(wxART_FIND) +#define wxART_FIND_AND_REPLACE wxART_MAKE_ART_ID(wxART_FIND_AND_REPLACE) + + +// ---------------------------------------------------------------------------- +// wxArtProvider class +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxArtProvider : public wxObject +{ +public: + // Dtor removes the provider from providers stack if it's still on it + virtual ~wxArtProvider(); + + // Does this platform implement native icons theme? + static bool HasNativeProvider(); + + // Add new provider to the top of providers stack (i.e. the provider will + // be queried first of all). + static void Push(wxArtProvider *provider); + + // Add new provider to the bottom of providers stack (i.e. the provider + // will be queried as the last one). + static void PushBack(wxArtProvider *provider); + +#if WXWIN_COMPATIBILITY_2_8 + // use PushBack(), it's the same thing + static wxDEPRECATED( void Insert(wxArtProvider *provider) ); +#endif + + // Remove latest added provider and delete it. + static bool Pop(); + + // Remove provider from providers stack but don't delete it. + static bool Remove(wxArtProvider *provider); + + // Delete the given provider and remove it from the providers stack. + static bool Delete(wxArtProvider *provider); + + + // Query the providers for bitmap with given ID and return it. Return + // wxNullBitmap if no provider provides it. + static wxBitmap GetBitmap(const wxArtID& id, + const wxArtClient& client = wxART_OTHER, + const wxSize& size = wxDefaultSize); + + // Query the providers for icon with given ID and return it. Return + // wxNullIcon if no provider provides it. + static wxIcon GetIcon(const wxArtID& id, + const wxArtClient& client = wxART_OTHER, + const wxSize& size = wxDefaultSize); + + // Helper used by GetMessageBoxIcon(): return the art id corresponding to + // the standard wxICON_INFORMATION/WARNING/ERROR/QUESTION flags (only one + // can be set) + static wxArtID GetMessageBoxIconId(int flags); + + // Helper used by several generic classes: return the icon corresponding to + // the standard wxICON_INFORMATION/WARNING/ERROR/QUESTION flags (only one + // can be set) + static wxIcon GetMessageBoxIcon(int flags) + { + return GetIcon(GetMessageBoxIconId(flags), wxART_MESSAGE_BOX); + } + + // Query the providers for iconbundle with given ID and return it. Return + // wxNullIconBundle if no provider provides it. + static wxIconBundle GetIconBundle(const wxArtID& id, + const wxArtClient& client = wxART_OTHER); + + // Gets native size for given 'client' or wxDefaultSize if it doesn't + // have native equivalent + static wxSize GetNativeSizeHint(const wxArtClient& client); + + // Get the size hint of an icon from a specific wxArtClient, queries + // the topmost provider if platform_dependent = false + static wxSize GetSizeHint(const wxArtClient& client, bool platform_dependent = false); + +#if WXWIN_COMPATIBILITY_2_6 + // use the corresponding methods without redundant "Provider" suffix + static wxDEPRECATED( void PushProvider(wxArtProvider *provider) ); + static wxDEPRECATED( void InsertProvider(wxArtProvider *provider) ); + static wxDEPRECATED( bool PopProvider() ); + + // use Delete() if this is what you really need, or just delete the + // provider pointer, do not use Remove() as it does not delete the pointer + // unlike RemoveProvider() which does + static wxDEPRECATED( bool RemoveProvider(wxArtProvider *provider) ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + friend class wxArtProviderModule; +#if wxUSE_ARTPROVIDER_STD + // Initializes default provider + static void InitStdProvider(); +#endif // wxUSE_ARTPROVIDER_STD + // Initializes Tango-based icon provider +#if wxUSE_ARTPROVIDER_TANGO + static void InitTangoProvider(); +#endif // wxUSE_ARTPROVIDER_TANGO + // Initializes platform's native provider, if available (e.g. GTK2) + static void InitNativeProvider(); + // Destroy caches & all providers + static void CleanUpProviders(); + + // Get the default size of an icon for a specific client + virtual wxSize DoGetSizeHint(const wxArtClient& client) + { + return GetSizeHint(client, true); + } + + // Derived classes must override CreateBitmap or CreateIconBundle + // (or both) to create requested art resource. This method is called + // only once per instance's lifetime for each requested wxArtID. + virtual wxBitmap CreateBitmap(const wxArtID& WXUNUSED(id), + const wxArtClient& WXUNUSED(client), + const wxSize& WXUNUSED(size)) + { + return wxNullBitmap; + } + + virtual wxIconBundle CreateIconBundle(const wxArtID& WXUNUSED(id), + const wxArtClient& WXUNUSED(client)) + { + return wxNullIconBundle; + } + +private: + static void CommonAddingProvider(); + static wxIconBundle DoGetIconBundle(const wxArtID& id, + const wxArtClient& client); + +private: + // list of providers: + static wxArtProvidersList *sm_providers; + // art resources cache (so that CreateXXX is not called that often): + static wxArtProviderCache *sm_cache; + + DECLARE_ABSTRACT_CLASS(wxArtProvider) +}; + + +#if !defined(__WXUNIVERSAL__) && \ + ((defined(__WXGTK__) && defined(__WXGTK20__)) || defined(__WXMSW__) || \ + defined(__WXMAC__)) + // *some* (partial) native implementation of wxArtProvider exists; this is + // not the same as wxArtProvider::HasNativeProvider()! + #define wxHAS_NATIVE_ART_PROVIDER_IMPL +#endif + +#endif // _WX_ARTPROV_H_ diff --git a/wxmsw/include/wx-3.0/wx/atomic.h b/wxmsw/include/wx-3.0/wx/atomic.h new file mode 100644 index 00000000..1439d294 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/atomic.h @@ -0,0 +1,159 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/atomic.h +// Purpose: functions to manipulate atomically integers and pointers +// Author: Armel Asselin +// Created: 12/13/2006 +// Copyright: (c) Armel Asselin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ATOMIC_H_ +#define _WX_ATOMIC_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// get the value of wxUSE_THREADS configuration flag +#include "wx/defs.h" + +// constraints on the various functions: +// - wxAtomicDec must return a zero value if the value is zero once +// decremented else it must return any non-zero value (the true value is OK +// but not necessary). + +#if wxUSE_THREADS + +#if defined(HAVE_GCC_ATOMIC_BUILTINS) + +// NB: we intentionally don't use Linux's asm/atomic.h header, because it's +// an internal kernel header that doesn't always work in userspace: +// http://bugs.mysql.com/bug.php?id=28456 +// http://golubenco.org/blog/atomic-operations/ + +inline void wxAtomicInc (wxUint32 &value) +{ + __sync_fetch_and_add(&value, 1); +} + +inline wxUint32 wxAtomicDec (wxUint32 &value) +{ + return __sync_sub_and_fetch(&value, 1); +} + + +#elif defined(__WINDOWS__) + +// include standard Windows headers +#include "wx/msw/wrapwin.h" + +inline void wxAtomicInc (wxUint32 &value) +{ + InterlockedIncrement ((LONG*)&value); +} + +inline wxUint32 wxAtomicDec (wxUint32 &value) +{ + return InterlockedDecrement ((LONG*)&value); +} + +#elif defined(__WXMAC__) || defined(__DARWIN__) + +#include "libkern/OSAtomic.h" +inline void wxAtomicInc (wxUint32 &value) +{ + OSAtomicIncrement32 ((int32_t*)&value); +} + +inline wxUint32 wxAtomicDec (wxUint32 &value) +{ + return OSAtomicDecrement32 ((int32_t*)&value); +} + +#elif defined (__SOLARIS__) + +#include + +inline void wxAtomicInc (wxUint32 &value) +{ + atomic_add_32 ((uint32_t*)&value, 1); +} + +inline wxUint32 wxAtomicDec (wxUint32 &value) +{ + return atomic_add_32_nv ((uint32_t*)&value, (uint32_t)-1); +} + +#else // unknown platform + +// it will result in inclusion if the generic implementation code a bit later in this page +#define wxNEEDS_GENERIC_ATOMIC_OPS + +#endif // unknown platform + +#else // else of wxUSE_THREADS +// if no threads are used we can safely use simple ++/-- + +inline void wxAtomicInc (wxUint32 &value) { ++value; } +inline wxUint32 wxAtomicDec (wxUint32 &value) { return --value; } + +#endif // !wxUSE_THREADS + +// ---------------------------------------------------------------------------- +// proxies to actual implementations, but for various other types with same +// behaviour +// ---------------------------------------------------------------------------- + +#ifdef wxNEEDS_GENERIC_ATOMIC_OPS + +#include "wx/thread.h" // for wxCriticalSection + +class wxAtomicInt32 +{ +public: + wxAtomicInt32() { } // non initialized for consistency with basic int type + wxAtomicInt32(wxInt32 v) : m_value(v) { } + wxAtomicInt32(const wxAtomicInt32& a) : m_value(a.m_value) {} + + operator wxInt32() const { return m_value; } + operator volatile wxInt32&() { return m_value; } + + wxAtomicInt32& operator=(wxInt32 v) { m_value = v; return *this; } + + void Inc() + { + wxCriticalSectionLocker lock(m_locker); + ++m_value; + } + + wxInt32 Dec() + { + wxCriticalSectionLocker lock(m_locker); + return --m_value; + } + +private: + volatile wxInt32 m_value; + wxCriticalSection m_locker; +}; + +inline void wxAtomicInc(wxAtomicInt32 &value) { value.Inc(); } +inline wxInt32 wxAtomicDec(wxAtomicInt32 &value) { return value.Dec(); } + +#else // !wxNEEDS_GENERIC_ATOMIC_OPS + +#define wxHAS_ATOMIC_OPS + +inline void wxAtomicInc(wxInt32 &value) { wxAtomicInc((wxUint32&)value); } +inline wxInt32 wxAtomicDec(wxInt32 &value) { return wxAtomicDec((wxUint32&)value); } + +typedef wxInt32 wxAtomicInt32; + +#endif // wxNEEDS_GENERIC_ATOMIC_OPS + +// all the native implementations use 32 bits currently +// for a 64 bits implementation we could use (a future) wxAtomicInt64 as +// default type +typedef wxAtomicInt32 wxAtomicInt; + +#endif // _WX_ATOMIC_H_ diff --git a/wxmsw/include/wx-3.0/wx/aui/aui.h b/wxmsw/include/wx-3.0/wx/aui/aui.h new file mode 100644 index 00000000..df3a9166 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/aui/aui.h @@ -0,0 +1,22 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/aui/aui.h +// Purpose: wxaui: wx advanced user interface - docking window manager +// Author: Benjamin I. Williams +// Modified by: +// Created: 2005-05-17 +// Copyright: (C) Copyright 2005, Kirix Corporation, All Rights Reserved. +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_AUI_H_ +#define _WX_AUI_H_ + +#include "wx/aui/framemanager.h" +#include "wx/aui/dockart.h" +#include "wx/aui/floatpane.h" +#include "wx/aui/auibar.h" +#include "wx/aui/auibook.h" +#include "wx/aui/tabmdi.h" + +#endif // _WX_AUI_H_ + diff --git a/wxmsw/include/wx-3.0/wx/aui/auibar.h b/wxmsw/include/wx-3.0/wx/aui/auibar.h new file mode 100644 index 00000000..52e25252 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/aui/auibar.h @@ -0,0 +1,755 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/aui/toolbar.h +// Purpose: wxaui: wx advanced user interface - docking window manager +// Author: Benjamin I. Williams +// Modified by: +// Created: 2008-08-04 +// Copyright: (C) Copyright 2005, Kirix Corporation, All Rights Reserved. +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_AUIBAR_H_ +#define _WX_AUIBAR_H_ + +#include "wx/defs.h" + +#if wxUSE_AUI + +#include "wx/control.h" +#include "wx/sizer.h" +#include "wx/pen.h" + +class WXDLLIMPEXP_FWD_CORE wxClientDC; +class WXDLLIMPEXP_FWD_AUI wxAuiPaneInfo; + +enum wxAuiToolBarStyle +{ + wxAUI_TB_TEXT = 1 << 0, + wxAUI_TB_NO_TOOLTIPS = 1 << 1, + wxAUI_TB_NO_AUTORESIZE = 1 << 2, + wxAUI_TB_GRIPPER = 1 << 3, + wxAUI_TB_OVERFLOW = 1 << 4, + // using this style forces the toolbar to be vertical and + // be only dockable to the left or right sides of the window + // whereas by default it can be horizontal or vertical and + // be docked anywhere + wxAUI_TB_VERTICAL = 1 << 5, + wxAUI_TB_HORZ_LAYOUT = 1 << 6, + // analogous to wxAUI_TB_VERTICAL, but forces the toolbar + // to be horizontal + wxAUI_TB_HORIZONTAL = 1 << 7, + wxAUI_TB_PLAIN_BACKGROUND = 1 << 8, + wxAUI_TB_HORZ_TEXT = (wxAUI_TB_HORZ_LAYOUT | wxAUI_TB_TEXT), + wxAUI_ORIENTATION_MASK = (wxAUI_TB_VERTICAL | wxAUI_TB_HORIZONTAL), + wxAUI_TB_DEFAULT_STYLE = 0 +}; + +enum wxAuiToolBarArtSetting +{ + wxAUI_TBART_SEPARATOR_SIZE = 0, + wxAUI_TBART_GRIPPER_SIZE = 1, + wxAUI_TBART_OVERFLOW_SIZE = 2 +}; + +enum wxAuiToolBarToolTextOrientation +{ + wxAUI_TBTOOL_TEXT_LEFT = 0, // unused/unimplemented + wxAUI_TBTOOL_TEXT_RIGHT = 1, + wxAUI_TBTOOL_TEXT_TOP = 2, // unused/unimplemented + wxAUI_TBTOOL_TEXT_BOTTOM = 3 +}; + + +// aui toolbar event class + +class WXDLLIMPEXP_AUI wxAuiToolBarEvent : public wxNotifyEvent +{ +public: + wxAuiToolBarEvent(wxEventType commandType = wxEVT_NULL, + int winId = 0) + : wxNotifyEvent(commandType, winId) + { + m_isDropdownClicked = false; + m_clickPt = wxPoint(-1, -1); + m_rect = wxRect(-1,-1, 0, 0); + m_toolId = -1; + } +#ifndef SWIG + wxAuiToolBarEvent(const wxAuiToolBarEvent& c) : wxNotifyEvent(c) + { + m_isDropdownClicked = c.m_isDropdownClicked; + m_clickPt = c.m_clickPt; + m_rect = c.m_rect; + m_toolId = c.m_toolId; + } +#endif + wxEvent *Clone() const { return new wxAuiToolBarEvent(*this); } + + bool IsDropDownClicked() const { return m_isDropdownClicked; } + void SetDropDownClicked(bool c) { m_isDropdownClicked = c; } + + wxPoint GetClickPoint() const { return m_clickPt; } + void SetClickPoint(const wxPoint& p) { m_clickPt = p; } + + wxRect GetItemRect() const { return m_rect; } + void SetItemRect(const wxRect& r) { m_rect = r; } + + int GetToolId() const { return m_toolId; } + void SetToolId(int toolId) { m_toolId = toolId; } + +private: + + bool m_isDropdownClicked; + wxPoint m_clickPt; + wxRect m_rect; + int m_toolId; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxAuiToolBarEvent) +}; + + +class WXDLLIMPEXP_AUI wxAuiToolBarItem +{ + friend class wxAuiToolBar; + +public: + + wxAuiToolBarItem() + { + m_window = NULL; + m_sizerItem = NULL; + m_spacerPixels = 0; + m_toolId = 0; + m_kind = wxITEM_NORMAL; + m_state = 0; // normal, enabled + m_proportion = 0; + m_active = true; + m_dropDown = true; + m_sticky = true; + m_userData = 0; + m_alignment = wxALIGN_CENTER; + } + + wxAuiToolBarItem(const wxAuiToolBarItem& c) + { + Assign(c); + } + + wxAuiToolBarItem& operator=(const wxAuiToolBarItem& c) + { + Assign(c); + return *this; + } + + void Assign(const wxAuiToolBarItem& c) + { + m_window = c.m_window; + m_label = c.m_label; + m_bitmap = c.m_bitmap; + m_disabledBitmap = c.m_disabledBitmap; + m_hoverBitmap = c.m_hoverBitmap; + m_shortHelp = c.m_shortHelp; + m_longHelp = c.m_longHelp; + m_sizerItem = c.m_sizerItem; + m_minSize = c.m_minSize; + m_spacerPixels = c.m_spacerPixels; + m_toolId = c.m_toolId; + m_kind = c.m_kind; + m_state = c.m_state; + m_proportion = c.m_proportion; + m_active = c.m_active; + m_dropDown = c.m_dropDown; + m_sticky = c.m_sticky; + m_userData = c.m_userData; + m_alignment = c.m_alignment; + } + + + void SetWindow(wxWindow* w) { m_window = w; } + wxWindow* GetWindow() { return m_window; } + + void SetId(int newId) { m_toolId = newId; } + int GetId() const { return m_toolId; } + + void SetKind(int newKind) { m_kind = newKind; } + int GetKind() const { return m_kind; } + + void SetState(int newState) { m_state = newState; } + int GetState() const { return m_state; } + + void SetSizerItem(wxSizerItem* s) { m_sizerItem = s; } + wxSizerItem* GetSizerItem() const { return m_sizerItem; } + + void SetLabel(const wxString& s) { m_label = s; } + const wxString& GetLabel() const { return m_label; } + + void SetBitmap(const wxBitmap& bmp) { m_bitmap = bmp; } + const wxBitmap& GetBitmap() const { return m_bitmap; } + + void SetDisabledBitmap(const wxBitmap& bmp) { m_disabledBitmap = bmp; } + const wxBitmap& GetDisabledBitmap() const { return m_disabledBitmap; } + + void SetHoverBitmap(const wxBitmap& bmp) { m_hoverBitmap = bmp; } + const wxBitmap& GetHoverBitmap() const { return m_hoverBitmap; } + + void SetShortHelp(const wxString& s) { m_shortHelp = s; } + const wxString& GetShortHelp() const { return m_shortHelp; } + + void SetLongHelp(const wxString& s) { m_longHelp = s; } + const wxString& GetLongHelp() const { return m_longHelp; } + + void SetMinSize(const wxSize& s) { m_minSize = s; } + const wxSize& GetMinSize() const { return m_minSize; } + + void SetSpacerPixels(int s) { m_spacerPixels = s; } + int GetSpacerPixels() const { return m_spacerPixels; } + + void SetProportion(int p) { m_proportion = p; } + int GetProportion() const { return m_proportion; } + + void SetActive(bool b) { m_active = b; } + bool IsActive() const { return m_active; } + + void SetHasDropDown(bool b) + { + wxCHECK_RET( !b || m_kind == wxITEM_NORMAL, + wxS("Only normal tools can have drop downs") ); + + m_dropDown = b; + } + + bool HasDropDown() const { return m_dropDown; } + + void SetSticky(bool b) { m_sticky = b; } + bool IsSticky() const { return m_sticky; } + + void SetUserData(long l) { m_userData = l; } + long GetUserData() const { return m_userData; } + + void SetAlignment(int l) { m_alignment = l; } + int GetAlignment() const { return m_alignment; } + +private: + + wxWindow* m_window; // item's associated window + wxString m_label; // label displayed on the item + wxBitmap m_bitmap; // item's bitmap + wxBitmap m_disabledBitmap; // item's disabled bitmap + wxBitmap m_hoverBitmap; // item's hover bitmap + wxString m_shortHelp; // short help (for tooltip) + wxString m_longHelp; // long help (for status bar) + wxSizerItem* m_sizerItem; // sizer item + wxSize m_minSize; // item's minimum size + int m_spacerPixels; // size of a spacer + int m_toolId; // item's id + int m_kind; // item's kind + int m_state; // state + int m_proportion; // proportion + bool m_active; // true if the item is currently active + bool m_dropDown; // true if the item has a dropdown button + bool m_sticky; // overrides button states if true (always active) + long m_userData; // user-specified data + int m_alignment; // sizer alignment flag, defaults to wxCENTER, may be wxEXPAND or any other +}; + +#ifndef SWIG +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiToolBarItem, wxAuiToolBarItemArray, WXDLLIMPEXP_AUI); +#endif + + + + +// tab art class + +class WXDLLIMPEXP_AUI wxAuiToolBarArt +{ +public: + + wxAuiToolBarArt() { } + virtual ~wxAuiToolBarArt() { } + + virtual wxAuiToolBarArt* Clone() = 0; + virtual void SetFlags(unsigned int flags) = 0; + virtual unsigned int GetFlags() = 0; + virtual void SetFont(const wxFont& font) = 0; + virtual wxFont GetFont() = 0; + virtual void SetTextOrientation(int orientation) = 0; + virtual int GetTextOrientation() = 0; + + virtual void DrawBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + + virtual void DrawPlainBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + + virtual void DrawLabel( + wxDC& dc, + wxWindow* wnd, + const wxAuiToolBarItem& item, + const wxRect& rect) = 0; + + virtual void DrawButton( + wxDC& dc, + wxWindow* wnd, + const wxAuiToolBarItem& item, + const wxRect& rect) = 0; + + virtual void DrawDropDownButton( + wxDC& dc, + wxWindow* wnd, + const wxAuiToolBarItem& item, + const wxRect& rect) = 0; + + virtual void DrawControlLabel( + wxDC& dc, + wxWindow* wnd, + const wxAuiToolBarItem& item, + const wxRect& rect) = 0; + + virtual void DrawSeparator( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + + virtual void DrawGripper( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + + virtual void DrawOverflowButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect, + int state) = 0; + + virtual wxSize GetLabelSize( + wxDC& dc, + wxWindow* wnd, + const wxAuiToolBarItem& item) = 0; + + virtual wxSize GetToolSize( + wxDC& dc, + wxWindow* wnd, + const wxAuiToolBarItem& item) = 0; + + virtual int GetElementSize(int elementId) = 0; + virtual void SetElementSize(int elementId, int size) = 0; + + virtual int ShowDropDown( + wxWindow* wnd, + const wxAuiToolBarItemArray& items) = 0; +}; + + + +class WXDLLIMPEXP_AUI wxAuiDefaultToolBarArt : public wxAuiToolBarArt +{ + +public: + + wxAuiDefaultToolBarArt(); + virtual ~wxAuiDefaultToolBarArt(); + + virtual wxAuiToolBarArt* Clone(); + virtual void SetFlags(unsigned int flags); + virtual unsigned int GetFlags(); + virtual void SetFont(const wxFont& font); + virtual wxFont GetFont(); + virtual void SetTextOrientation(int orientation); + virtual int GetTextOrientation(); + + virtual void DrawBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + virtual void DrawPlainBackground(wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + virtual void DrawLabel( + wxDC& dc, + wxWindow* wnd, + const wxAuiToolBarItem& item, + const wxRect& rect); + + virtual void DrawButton( + wxDC& dc, + wxWindow* wnd, + const wxAuiToolBarItem& item, + const wxRect& rect); + + virtual void DrawDropDownButton( + wxDC& dc, + wxWindow* wnd, + const wxAuiToolBarItem& item, + const wxRect& rect); + + virtual void DrawControlLabel( + wxDC& dc, + wxWindow* wnd, + const wxAuiToolBarItem& item, + const wxRect& rect); + + virtual void DrawSeparator( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + virtual void DrawGripper( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + virtual void DrawOverflowButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect, + int state); + + virtual wxSize GetLabelSize( + wxDC& dc, + wxWindow* wnd, + const wxAuiToolBarItem& item); + + virtual wxSize GetToolSize( + wxDC& dc, + wxWindow* wnd, + const wxAuiToolBarItem& item); + + virtual int GetElementSize(int element); + virtual void SetElementSize(int elementId, int size); + + virtual int ShowDropDown(wxWindow* wnd, + const wxAuiToolBarItemArray& items); + +protected: + + wxBitmap m_buttonDropDownBmp; + wxBitmap m_disabledButtonDropDownBmp; + wxBitmap m_overflowBmp; + wxBitmap m_disabledOverflowBmp; + wxColour m_baseColour; + wxColour m_highlightColour; + wxFont m_font; + unsigned int m_flags; + int m_textOrientation; + + wxPen m_gripperPen1; + wxPen m_gripperPen2; + wxPen m_gripperPen3; + + int m_separatorSize; + int m_gripperSize; + int m_overflowSize; +}; + + + + +class WXDLLIMPEXP_AUI wxAuiToolBar : public wxControl +{ +public: + wxAuiToolBar() { Init(); } + + wxAuiToolBar(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxAUI_TB_DEFAULT_STYLE) + { + Init(); + Create(parent, id, pos, size, style); + } + + virtual ~wxAuiToolBar(); + + bool Create(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxAUI_TB_DEFAULT_STYLE); + + virtual void SetWindowStyleFlag(long style); + + void SetArtProvider(wxAuiToolBarArt* art); + wxAuiToolBarArt* GetArtProvider() const; + + bool SetFont(const wxFont& font); + + + wxAuiToolBarItem* AddTool(int toolId, + const wxString& label, + const wxBitmap& bitmap, + const wxString& shortHelpString = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL); + + wxAuiToolBarItem* AddTool(int toolId, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& disabledBitmap, + wxItemKind kind, + const wxString& shortHelpString, + const wxString& longHelpString, + wxObject* clientData); + + wxAuiToolBarItem* AddTool(int toolId, + const wxBitmap& bitmap, + const wxBitmap& disabledBitmap, + bool toggle = false, + wxObject* clientData = NULL, + const wxString& shortHelpString = wxEmptyString, + const wxString& longHelpString = wxEmptyString) + { + return AddTool(toolId, + wxEmptyString, + bitmap, + disabledBitmap, + toggle ? wxITEM_CHECK : wxITEM_NORMAL, + shortHelpString, + longHelpString, + clientData); + } + + wxAuiToolBarItem* AddLabel(int toolId, + const wxString& label = wxEmptyString, + const int width = -1); + wxAuiToolBarItem* AddControl(wxControl* control, + const wxString& label = wxEmptyString); + wxAuiToolBarItem* AddSeparator(); + wxAuiToolBarItem* AddSpacer(int pixels); + wxAuiToolBarItem* AddStretchSpacer(int proportion = 1); + + bool Realize(); + + wxControl* FindControl(int windowId); + wxAuiToolBarItem* FindToolByPosition(wxCoord x, wxCoord y) const; + wxAuiToolBarItem* FindToolByIndex(int idx) const; + wxAuiToolBarItem* FindTool(int toolId) const; + + void ClearTools() { Clear() ; } + void Clear(); + bool DeleteTool(int toolId); + bool DeleteByIndex(int toolId); + + size_t GetToolCount() const; + int GetToolPos(int toolId) const { return GetToolIndex(toolId); } + int GetToolIndex(int toolId) const; + bool GetToolFits(int toolId) const; + wxRect GetToolRect(int toolId) const; + bool GetToolFitsByIndex(int toolId) const; + bool GetToolBarFits() const; + + void SetMargins(const wxSize& size) { SetMargins(size.x, size.x, size.y, size.y); } + void SetMargins(int x, int y) { SetMargins(x, x, y, y); } + void SetMargins(int left, int right, int top, int bottom); + + void SetToolBitmapSize(const wxSize& size); + wxSize GetToolBitmapSize() const; + + bool GetOverflowVisible() const; + void SetOverflowVisible(bool visible); + + bool GetGripperVisible() const; + void SetGripperVisible(bool visible); + + void ToggleTool(int toolId, bool state); + bool GetToolToggled(int toolId) const; + + void EnableTool(int toolId, bool state); + bool GetToolEnabled(int toolId) const; + + void SetToolDropDown(int toolId, bool dropdown); + bool GetToolDropDown(int toolId) const; + + void SetToolBorderPadding(int padding); + int GetToolBorderPadding() const; + + void SetToolTextOrientation(int orientation); + int GetToolTextOrientation() const; + + void SetToolPacking(int packing); + int GetToolPacking() const; + + void SetToolProportion(int toolId, int proportion); + int GetToolProportion(int toolId) const; + + void SetToolSeparation(int separation); + int GetToolSeparation() const; + + void SetToolSticky(int toolId, bool sticky); + bool GetToolSticky(int toolId) const; + + wxString GetToolLabel(int toolId) const; + void SetToolLabel(int toolId, const wxString& label); + + wxBitmap GetToolBitmap(int toolId) const; + void SetToolBitmap(int toolId, const wxBitmap& bitmap); + + wxString GetToolShortHelp(int toolId) const; + void SetToolShortHelp(int toolId, const wxString& helpString); + + wxString GetToolLongHelp(int toolId) const; + void SetToolLongHelp(int toolId, const wxString& helpString); + + void SetCustomOverflowItems(const wxAuiToolBarItemArray& prepend, + const wxAuiToolBarItemArray& append); + + // get size of hint rectangle for a particular dock location + wxSize GetHintSize(int dockDirection) const; + bool IsPaneValid(const wxAuiPaneInfo& pane) const; + + // Override to call DoIdleUpdate(). + virtual void UpdateWindowUI(long flags = wxUPDATE_UI_NONE); + +protected: + void Init(); + + virtual void OnCustomRender(wxDC& WXUNUSED(dc), + const wxAuiToolBarItem& WXUNUSED(item), + const wxRect& WXUNUSED(rect)) { } + +protected: + + void DoIdleUpdate(); + void SetOrientation(int orientation); + void SetHoverItem(wxAuiToolBarItem* item); + void SetPressedItem(wxAuiToolBarItem* item); + void RefreshOverflowState(); + + int GetOverflowState() const; + wxRect GetOverflowRect() const; + wxSize GetLabelSize(const wxString& label); + wxAuiToolBarItem* FindToolByPositionWithPacking(wxCoord x, wxCoord y) const; + + void DoSetSize(int x, + int y, + int width, + int height, + int sizeFlags = wxSIZE_AUTO); + +protected: // handlers + + void OnSize(wxSizeEvent& evt); + void OnIdle(wxIdleEvent& evt); + void OnPaint(wxPaintEvent& evt); + void OnEraseBackground(wxEraseEvent& evt); + void OnLeftDown(wxMouseEvent& evt); + void OnLeftUp(wxMouseEvent& evt); + void OnRightDown(wxMouseEvent& evt); + void OnRightUp(wxMouseEvent& evt); + void OnMiddleDown(wxMouseEvent& evt); + void OnMiddleUp(wxMouseEvent& evt); + void OnMotion(wxMouseEvent& evt); + void OnLeaveWindow(wxMouseEvent& evt); + void OnCaptureLost(wxMouseCaptureLostEvent& evt); + void OnSetCursor(wxSetCursorEvent& evt); + +protected: + + wxAuiToolBarItemArray m_items; // array of toolbar items + wxAuiToolBarArt* m_art; // art provider + wxBoxSizer* m_sizer; // main sizer for toolbar + wxAuiToolBarItem* m_actionItem; // item that's being acted upon (pressed) + wxAuiToolBarItem* m_tipItem; // item that has its tooltip shown + wxBitmap m_bitmap; // double-buffer bitmap + wxSizerItem* m_gripperSizerItem; + wxSizerItem* m_overflowSizerItem; + wxSize m_absoluteMinSize; + wxPoint m_actionPos; // position of left-mouse down + wxAuiToolBarItemArray m_customOverflowPrepend; + wxAuiToolBarItemArray m_customOverflowAppend; + + int m_buttonWidth; + int m_buttonHeight; + int m_sizerElementCount; + int m_leftPadding; + int m_rightPadding; + int m_topPadding; + int m_bottomPadding; + int m_toolPacking; + int m_toolBorderPadding; + int m_toolTextOrientation; + int m_overflowState; + bool m_dragging; + bool m_gripperVisible; + bool m_overflowVisible; + + bool RealizeHelper(wxClientDC& dc, bool horizontal); + static bool IsPaneValid(long style, const wxAuiPaneInfo& pane); + bool IsPaneValid(long style) const; + void SetArtFlags() const; + wxOrientation m_orientation; + wxSize m_horzHintSize; + wxSize m_vertHintSize; + +private: + // Common part of OnLeaveWindow() and OnCaptureLost(). + void DoResetMouseState(); + + DECLARE_EVENT_TABLE() + DECLARE_CLASS(wxAuiToolBar) +}; + + + + +// wx event machinery + +#ifndef SWIG + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUITOOLBAR_TOOL_DROPDOWN, wxAuiToolBarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUITOOLBAR_OVERFLOW_CLICK, wxAuiToolBarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUITOOLBAR_RIGHT_CLICK, wxAuiToolBarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUITOOLBAR_MIDDLE_CLICK, wxAuiToolBarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUITOOLBAR_BEGIN_DRAG, wxAuiToolBarEvent ); + +typedef void (wxEvtHandler::*wxAuiToolBarEventFunction)(wxAuiToolBarEvent&); + +#define wxAuiToolBarEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxAuiToolBarEventFunction, func) + +#define EVT_AUITOOLBAR_TOOL_DROPDOWN(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, winid, wxAuiToolBarEventHandler(fn)) +#define EVT_AUITOOLBAR_OVERFLOW_CLICK(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUITOOLBAR_OVERFLOW_CLICK, winid, wxAuiToolBarEventHandler(fn)) +#define EVT_AUITOOLBAR_RIGHT_CLICK(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUITOOLBAR_RIGHT_CLICK, winid, wxAuiToolBarEventHandler(fn)) +#define EVT_AUITOOLBAR_MIDDLE_CLICK(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUITOOLBAR_MIDDLE_CLICK, winid, wxAuiToolBarEventHandler(fn)) +#define EVT_AUITOOLBAR_BEGIN_DRAG(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUITOOLBAR_BEGIN_DRAG, winid, wxAuiToolBarEventHandler(fn)) + +#else + +// wxpython/swig event work +%constant wxEventType wxEVT_AUITOOLBAR_TOOL_DROPDOWN; +%constant wxEventType wxEVT_AUITOOLBAR_OVERFLOW_CLICK; +%constant wxEventType wxEVT_AUITOOLBAR_RIGHT_CLICK; +%constant wxEventType wxEVT_AUITOOLBAR_MIDDLE_CLICK; +%constant wxEventType wxEVT_AUITOOLBAR_BEGIN_DRAG; + +%pythoncode { + EVT_AUITOOLBAR_TOOL_DROPDOWN = wx.PyEventBinder( wxEVT_AUITOOLBAR_TOOL_DROPDOWN, 1 ) + EVT_AUITOOLBAR_OVERFLOW_CLICK = wx.PyEventBinder( wxEVT_AUITOOLBAR_OVERFLOW_CLICK, 1 ) + EVT_AUITOOLBAR_RIGHT_CLICK = wx.PyEventBinder( wxEVT_AUITOOLBAR_RIGHT_CLICK, 1 ) + EVT_AUITOOLBAR_MIDDLE_CLICK = wx.PyEventBinder( wxEVT_AUITOOLBAR_MIDDLE_CLICK, 1 ) + EVT_AUITOOLBAR_BEGIN_DRAG = wx.PyEventBinder( wxEVT_AUITOOLBAR_BEGIN_DRAG, 1 ) +} +#endif // SWIG + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN wxEVT_AUITOOLBAR_TOOL_DROPDOWN +#define wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK wxEVT_AUITOOLBAR_OVERFLOW_CLICK +#define wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK wxEVT_AUITOOLBAR_RIGHT_CLICK +#define wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK wxEVT_AUITOOLBAR_MIDDLE_CLICK +#define wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG wxEVT_AUITOOLBAR_BEGIN_DRAG + +#endif // wxUSE_AUI +#endif // _WX_AUIBAR_H_ + diff --git a/wxmsw/include/wx-3.0/wx/aui/auibook.h b/wxmsw/include/wx-3.0/wx/aui/auibook.h new file mode 100644 index 00000000..17b3fdae --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/aui/auibook.h @@ -0,0 +1,556 @@ +////////////////////////////////////////////////////////////////////////////// +// Name: wx/aui/auibook.h +// Purpose: wxaui: wx advanced user interface - notebook +// Author: Benjamin I. Williams +// Modified by: Jens Lody +// Created: 2006-06-28 +// Copyright: (C) Copyright 2006, Kirix Corporation, All Rights Reserved. +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + + + +#ifndef _WX_AUINOTEBOOK_H_ +#define _WX_AUINOTEBOOK_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_AUI + +#include "wx/aui/tabart.h" +#include "wx/aui/framemanager.h" +#include "wx/bookctrl.h" +#include "wx/containr.h" + + +class wxAuiNotebook; + + +enum wxAuiNotebookOption +{ + wxAUI_NB_TOP = 1 << 0, + wxAUI_NB_LEFT = 1 << 1, // not implemented yet + wxAUI_NB_RIGHT = 1 << 2, // not implemented yet + wxAUI_NB_BOTTOM = 1 << 3, + wxAUI_NB_TAB_SPLIT = 1 << 4, + wxAUI_NB_TAB_MOVE = 1 << 5, + wxAUI_NB_TAB_EXTERNAL_MOVE = 1 << 6, + wxAUI_NB_TAB_FIXED_WIDTH = 1 << 7, + wxAUI_NB_SCROLL_BUTTONS = 1 << 8, + wxAUI_NB_WINDOWLIST_BUTTON = 1 << 9, + wxAUI_NB_CLOSE_BUTTON = 1 << 10, + wxAUI_NB_CLOSE_ON_ACTIVE_TAB = 1 << 11, + wxAUI_NB_CLOSE_ON_ALL_TABS = 1 << 12, + wxAUI_NB_MIDDLE_CLICK_CLOSE = 1 << 13, + + wxAUI_NB_DEFAULT_STYLE = wxAUI_NB_TOP | + wxAUI_NB_TAB_SPLIT | + wxAUI_NB_TAB_MOVE | + wxAUI_NB_SCROLL_BUTTONS | + wxAUI_NB_CLOSE_ON_ACTIVE_TAB | + wxAUI_NB_MIDDLE_CLICK_CLOSE +}; + + + + +// aui notebook event class + +class WXDLLIMPEXP_AUI wxAuiNotebookEvent : public wxBookCtrlEvent +{ +public: + wxAuiNotebookEvent(wxEventType commandType = wxEVT_NULL, + int winId = 0) + : wxBookCtrlEvent(commandType, winId) + { + m_dragSource = NULL; + } +#ifndef SWIG + wxAuiNotebookEvent(const wxAuiNotebookEvent& c) : wxBookCtrlEvent(c) + { + m_dragSource = c.m_dragSource; + } +#endif + wxEvent *Clone() const { return new wxAuiNotebookEvent(*this); } + + void SetDragSource(wxAuiNotebook* s) { m_dragSource = s; } + wxAuiNotebook* GetDragSource() const { return m_dragSource; } + +private: + wxAuiNotebook* m_dragSource; + +#ifndef SWIG +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxAuiNotebookEvent) +#endif +}; + + +class WXDLLIMPEXP_AUI wxAuiNotebookPage +{ +public: + wxWindow* window; // page's associated window + wxString caption; // caption displayed on the tab + wxString tooltip; // tooltip displayed when hovering over tab title + wxBitmap bitmap; // tab's bitmap + wxRect rect; // tab's hit rectangle + bool active; // true if the page is currently active +}; + +class WXDLLIMPEXP_AUI wxAuiTabContainerButton +{ +public: + + int id; // button's id + int curState; // current state (normal, hover, pressed, etc.) + int location; // buttons location (wxLEFT, wxRIGHT, or wxCENTER) + wxBitmap bitmap; // button's hover bitmap + wxBitmap disBitmap; // button's disabled bitmap + wxRect rect; // button's hit rectangle +}; + + +#ifndef SWIG +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiNotebookPage, wxAuiNotebookPageArray, WXDLLIMPEXP_AUI); +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiTabContainerButton, wxAuiTabContainerButtonArray, WXDLLIMPEXP_AUI); +#endif + + +class WXDLLIMPEXP_AUI wxAuiTabContainer +{ +public: + + wxAuiTabContainer(); + virtual ~wxAuiTabContainer(); + + void SetArtProvider(wxAuiTabArt* art); + wxAuiTabArt* GetArtProvider() const; + + void SetFlags(unsigned int flags); + unsigned int GetFlags() const; + + bool AddPage(wxWindow* page, const wxAuiNotebookPage& info); + bool InsertPage(wxWindow* page, const wxAuiNotebookPage& info, size_t idx); + bool MovePage(wxWindow* page, size_t newIdx); + bool RemovePage(wxWindow* page); + bool SetActivePage(wxWindow* page); + bool SetActivePage(size_t page); + void SetNoneActive(); + int GetActivePage() const; + bool TabHitTest(int x, int y, wxWindow** hit) const; + bool ButtonHitTest(int x, int y, wxAuiTabContainerButton** hit) const; + wxWindow* GetWindowFromIdx(size_t idx) const; + int GetIdxFromWindow(wxWindow* page) const; + size_t GetPageCount() const; + wxAuiNotebookPage& GetPage(size_t idx); + const wxAuiNotebookPage& GetPage(size_t idx) const; + wxAuiNotebookPageArray& GetPages(); + void SetNormalFont(const wxFont& normalFont); + void SetSelectedFont(const wxFont& selectedFont); + void SetMeasuringFont(const wxFont& measuringFont); + void SetColour(const wxColour& colour); + void SetActiveColour(const wxColour& colour); + void DoShowHide(); + void SetRect(const wxRect& rect); + + void RemoveButton(int id); + void AddButton(int id, + int location, + const wxBitmap& normalBitmap = wxNullBitmap, + const wxBitmap& disabledBitmap = wxNullBitmap); + + size_t GetTabOffset() const; + void SetTabOffset(size_t offset); + + // Is the tab visible? + bool IsTabVisible(int tabPage, int tabOffset, wxDC* dc, wxWindow* wnd); + + // Make the tab visible if it wasn't already + void MakeTabVisible(int tabPage, wxWindow* win); + +protected: + + virtual void Render(wxDC* dc, wxWindow* wnd); + +protected: + + wxAuiTabArt* m_art; + wxAuiNotebookPageArray m_pages; + wxAuiTabContainerButtonArray m_buttons; + wxAuiTabContainerButtonArray m_tabCloseButtons; + wxRect m_rect; + size_t m_tabOffset; + unsigned int m_flags; +}; + + + +class WXDLLIMPEXP_AUI wxAuiTabCtrl : public wxControl, + public wxAuiTabContainer +{ +public: + + wxAuiTabCtrl(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0); + + ~wxAuiTabCtrl(); + + bool IsDragging() const { return m_isDragging; } + +protected: + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + void OnPaint(wxPaintEvent& evt); + void OnEraseBackground(wxEraseEvent& evt); + void OnSize(wxSizeEvent& evt); + void OnLeftDown(wxMouseEvent& evt); + void OnLeftDClick(wxMouseEvent& evt); + void OnLeftUp(wxMouseEvent& evt); + void OnMiddleDown(wxMouseEvent& evt); + void OnMiddleUp(wxMouseEvent& evt); + void OnRightDown(wxMouseEvent& evt); + void OnRightUp(wxMouseEvent& evt); + void OnMotion(wxMouseEvent& evt); + void OnLeaveWindow(wxMouseEvent& evt); + void OnButton(wxAuiNotebookEvent& evt); + void OnSetFocus(wxFocusEvent& event); + void OnKillFocus(wxFocusEvent& event); + void OnChar(wxKeyEvent& event); + void OnCaptureLost(wxMouseCaptureLostEvent& evt); + +protected: + + wxPoint m_clickPt; + wxWindow* m_clickTab; + bool m_isDragging; + wxAuiTabContainerButton* m_hoverButton; + wxAuiTabContainerButton* m_pressedButton; + +#ifndef SWIG + DECLARE_CLASS(wxAuiTabCtrl) + DECLARE_EVENT_TABLE() +#endif +}; + + + + +class WXDLLIMPEXP_AUI wxAuiNotebook : public wxNavigationEnabled +{ + +public: + + wxAuiNotebook() { Init(); } + + wxAuiNotebook(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxAUI_NB_DEFAULT_STYLE) + { + Init(); + Create(parent, id, pos, size, style); + } + + virtual ~wxAuiNotebook(); + + bool Create(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0); + + void SetWindowStyleFlag(long style); + void SetArtProvider(wxAuiTabArt* art); + wxAuiTabArt* GetArtProvider() const; + + virtual void SetUniformBitmapSize(const wxSize& size); + virtual void SetTabCtrlHeight(int height); + + bool AddPage(wxWindow* page, + const wxString& caption, + bool select = false, + const wxBitmap& bitmap = wxNullBitmap); + + bool InsertPage(size_t pageIdx, + wxWindow* page, + const wxString& caption, + bool select = false, + const wxBitmap& bitmap = wxNullBitmap); + + bool DeletePage(size_t page); + bool RemovePage(size_t page); + + virtual size_t GetPageCount() const; + virtual wxWindow* GetPage(size_t pageIdx) const; + int GetPageIndex(wxWindow* pageWnd) const; + + bool SetPageText(size_t page, const wxString& text); + wxString GetPageText(size_t pageIdx) const; + + bool SetPageToolTip(size_t page, const wxString& text); + wxString GetPageToolTip(size_t pageIdx) const; + + bool SetPageBitmap(size_t page, const wxBitmap& bitmap); + wxBitmap GetPageBitmap(size_t pageIdx) const; + + int SetSelection(size_t newPage); + int GetSelection() const; + + virtual void Split(size_t page, int direction); + + const wxAuiManager& GetAuiManager() const { return m_mgr; } + + // Sets the normal font + void SetNormalFont(const wxFont& font); + + // Sets the selected tab font + void SetSelectedFont(const wxFont& font); + + // Sets the measuring font + void SetMeasuringFont(const wxFont& font); + + // Sets the tab font + virtual bool SetFont(const wxFont& font); + + // Gets the tab control height + int GetTabCtrlHeight() const; + + // Gets the height of the notebook for a given page height + int GetHeightForPageHeight(int pageHeight); + + // Shows the window menu + bool ShowWindowMenu(); + + // we do have multiple pages + virtual bool HasMultiplePages() const { return true; } + + // we don't want focus for ourselves + // virtual bool AcceptsFocus() const { return false; } + + //wxBookCtrlBase functions + + virtual void SetPageSize (const wxSize &size); + virtual int HitTest (const wxPoint &pt, long *flags=NULL) const; + + virtual int GetPageImage(size_t n) const; + virtual bool SetPageImage(size_t n, int imageId); + + virtual int ChangeSelection(size_t n); + + virtual bool AddPage(wxWindow *page, const wxString &text, bool select, + int imageId); + virtual bool DeleteAllPages(); + virtual bool InsertPage(size_t index, wxWindow *page, const wxString &text, + bool select, int imageId); + +protected: + // Common part of all ctors. + void Init(); + + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + // Redo sizing after thawing + virtual void DoThaw(); + + // these can be overridden + + // update the height, return true if it was done or false if the new height + // calculated by CalculateTabCtrlHeight() is the same as the old one + virtual bool UpdateTabCtrlHeight(); + + virtual int CalculateTabCtrlHeight(); + virtual wxSize CalculateNewSplitSize(); + + // remove the page and return a pointer to it + virtual wxWindow *DoRemovePage(size_t WXUNUSED(page)) { return NULL; } + + //A general selection function + virtual int DoModifySelection(size_t n, bool events); + +protected: + + void DoSizing(); + void InitNotebook(long style); + wxAuiTabCtrl* GetTabCtrlFromPoint(const wxPoint& pt); + wxWindow* GetTabFrameFromTabCtrl(wxWindow* tabCtrl); + wxAuiTabCtrl* GetActiveTabCtrl(); + bool FindTab(wxWindow* page, wxAuiTabCtrl** ctrl, int* idx); + void RemoveEmptyTabFrames(); + void UpdateHintWindowSize(); + +protected: + + void OnChildFocusNotebook(wxChildFocusEvent& evt); + void OnRender(wxAuiManagerEvent& evt); + void OnSize(wxSizeEvent& evt); + void OnTabClicked(wxAuiNotebookEvent& evt); + void OnTabBeginDrag(wxAuiNotebookEvent& evt); + void OnTabDragMotion(wxAuiNotebookEvent& evt); + void OnTabEndDrag(wxAuiNotebookEvent& evt); + void OnTabCancelDrag(wxAuiNotebookEvent& evt); + void OnTabButton(wxAuiNotebookEvent& evt); + void OnTabMiddleDown(wxAuiNotebookEvent& evt); + void OnTabMiddleUp(wxAuiNotebookEvent& evt); + void OnTabRightDown(wxAuiNotebookEvent& evt); + void OnTabRightUp(wxAuiNotebookEvent& evt); + void OnTabBgDClick(wxAuiNotebookEvent& evt); + void OnNavigationKeyNotebook(wxNavigationKeyEvent& event); + + // set selection to the given window (which must be non-NULL and be one of + // our pages, otherwise an assert is raised) + void SetSelectionToWindow(wxWindow *win); + void SetSelectionToPage(const wxAuiNotebookPage& page) + { + SetSelectionToWindow(page.window); + } + +protected: + + wxAuiManager m_mgr; + wxAuiTabContainer m_tabs; + int m_curPage; + int m_tabIdCounter; + wxWindow* m_dummyWnd; + + wxSize m_requestedBmpSize; + int m_requestedTabCtrlHeight; + wxFont m_selectedFont; + wxFont m_normalFont; + int m_tabCtrlHeight; + + int m_lastDragX; + unsigned int m_flags; + +#ifndef SWIG + DECLARE_CLASS(wxAuiNotebook) + DECLARE_EVENT_TABLE() +#endif +}; + + + + +// wx event machinery + +#ifndef SWIG + +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_PAGE_CLOSE, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_PAGE_CHANGING, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_PAGE_CLOSED, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_BUTTON, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_BEGIN_DRAG, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_END_DRAG, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_DRAG_MOTION, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_ALLOW_DND, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_TAB_RIGHT_UP, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_DRAG_DONE, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_BG_DCLICK, wxAuiNotebookEvent); + +typedef void (wxEvtHandler::*wxAuiNotebookEventFunction)(wxAuiNotebookEvent&); + +#define wxAuiNotebookEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxAuiNotebookEventFunction, func) + +#define EVT_AUINOTEBOOK_PAGE_CLOSE(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_PAGE_CLOSE, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_PAGE_CLOSED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_PAGE_CLOSED, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_PAGE_CHANGED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_PAGE_CHANGED, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_PAGE_CHANGING(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_PAGE_CHANGING, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_BUTTON(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_BUTTON, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_BEGIN_DRAG(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_BEGIN_DRAG, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_END_DRAG(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_END_DRAG, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_DRAG_MOTION(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_DRAG_MOTION, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_ALLOW_DND(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_ALLOW_DND, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_DRAG_DONE(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_DRAG_DONE, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_TAB_MIDDLE_DOWN(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_TAB_MIDDLE_UP(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_TAB_RIGHT_DOWN(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_TAB_RIGHT_UP(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_TAB_RIGHT_UP, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_BG_DCLICK(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_BG_DCLICK, winid, wxAuiNotebookEventHandler(fn)) +#else + +// wxpython/swig event work +%constant wxEventType wxEVT_AUINOTEBOOK_PAGE_CLOSE; +%constant wxEventType wxEVT_AUINOTEBOOK_PAGE_CLOSED; +%constant wxEventType wxEVT_AUINOTEBOOK_PAGE_CHANGED; +%constant wxEventType wxEVT_AUINOTEBOOK_PAGE_CHANGING; +%constant wxEventType wxEVT_AUINOTEBOOK_BUTTON; +%constant wxEventType wxEVT_AUINOTEBOOK_BEGIN_DRAG; +%constant wxEventType wxEVT_AUINOTEBOOK_END_DRAG; +%constant wxEventType wxEVT_AUINOTEBOOK_DRAG_MOTION; +%constant wxEventType wxEVT_AUINOTEBOOK_ALLOW_DND; +%constant wxEventType wxEVT_AUINOTEBOOK_DRAG_DONE; +%constant wxEventType wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN; +%constant wxEventType wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP; +%constant wxEventType wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN; +%constant wxEventType wxEVT_AUINOTEBOOK_TAB_RIGHT_UP; +%constant wxEventType wxEVT_AUINOTEBOOK_BG_DCLICK; + +%pythoncode { + EVT_AUINOTEBOOK_PAGE_CLOSE = wx.PyEventBinder( wxEVT_AUINOTEBOOK_PAGE_CLOSE, 1 ) + EVT_AUINOTEBOOK_PAGE_CLOSED = wx.PyEventBinder( wxEVT_AUINOTEBOOK_PAGE_CLOSED, 1 ) + EVT_AUINOTEBOOK_PAGE_CHANGED = wx.PyEventBinder( wxEVT_AUINOTEBOOK_PAGE_CHANGED, 1 ) + EVT_AUINOTEBOOK_PAGE_CHANGING = wx.PyEventBinder( wxEVT_AUINOTEBOOK_PAGE_CHANGING, 1 ) + EVT_AUINOTEBOOK_BUTTON = wx.PyEventBinder( wxEVT_AUINOTEBOOK_BUTTON, 1 ) + EVT_AUINOTEBOOK_BEGIN_DRAG = wx.PyEventBinder( wxEVT_AUINOTEBOOK_BEGIN_DRAG, 1 ) + EVT_AUINOTEBOOK_END_DRAG = wx.PyEventBinder( wxEVT_AUINOTEBOOK_END_DRAG, 1 ) + EVT_AUINOTEBOOK_DRAG_MOTION = wx.PyEventBinder( wxEVT_AUINOTEBOOK_DRAG_MOTION, 1 ) + EVT_AUINOTEBOOK_ALLOW_DND = wx.PyEventBinder( wxEVT_AUINOTEBOOK_ALLOW_DND, 1 ) + EVT_AUINOTEBOOK_DRAG_DONE = wx.PyEventBinder( wxEVT_AUINOTEBOOK_DRAG_DONE, 1 ) + EVT__AUINOTEBOOK_TAB_MIDDLE_DOWN = wx.PyEventBinder( wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN, 1 ) + EVT__AUINOTEBOOK_TAB_MIDDLE_UP = wx.PyEventBinder( wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP, 1 ) + EVT__AUINOTEBOOK_TAB_RIGHT_DOWN = wx.PyEventBinder( wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, 1 ) + EVT__AUINOTEBOOK_TAB_RIGHT_UP = wx.PyEventBinder( wxEVT_AUINOTEBOOK_TAB_RIGHT_UP, 1 ) + EVT_AUINOTEBOOK_BG_DCLICK = wx.PyEventBinder( wxEVT_AUINOTEBOOK_BG_DCLICK, 1 ) +} +#endif + + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE wxEVT_AUINOTEBOOK_PAGE_CLOSE +#define wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED wxEVT_AUINOTEBOOK_PAGE_CLOSED +#define wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED wxEVT_AUINOTEBOOK_PAGE_CHANGED +#define wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING wxEVT_AUINOTEBOOK_PAGE_CHANGING +#define wxEVT_COMMAND_AUINOTEBOOK_BUTTON wxEVT_AUINOTEBOOK_BUTTON +#define wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG wxEVT_AUINOTEBOOK_BEGIN_DRAG +#define wxEVT_COMMAND_AUINOTEBOOK_END_DRAG wxEVT_AUINOTEBOOK_END_DRAG +#define wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION wxEVT_AUINOTEBOOK_DRAG_MOTION +#define wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND wxEVT_AUINOTEBOOK_ALLOW_DND +#define wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE wxEVT_AUINOTEBOOK_DRAG_DONE +#define wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN +#define wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP +#define wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN +#define wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP wxEVT_AUINOTEBOOK_TAB_RIGHT_UP +#define wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK wxEVT_AUINOTEBOOK_BG_DCLICK +#define wxEVT_COMMAND_AUINOTEBOOK_CANCEL_DRAG wxEVT_AUINOTEBOOK_CANCEL_DRAG + +#endif // wxUSE_AUI +#endif // _WX_AUINOTEBOOK_H_ diff --git a/wxmsw/include/wx-3.0/wx/aui/dockart.h b/wxmsw/include/wx-3.0/wx/aui/dockart.h new file mode 100644 index 00000000..744cad56 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/aui/dockart.h @@ -0,0 +1,178 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/aui/dockart.h +// Purpose: wxaui: wx advanced user interface - docking window manager +// Author: Benjamin I. Williams +// Modified by: +// Created: 2005-05-17 +// Copyright: (C) Copyright 2005, Kirix Corporation, All Rights Reserved. +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DOCKART_H_ +#define _WX_DOCKART_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_AUI + +#include "wx/pen.h" +#include "wx/brush.h" +#include "wx/bitmap.h" +#include "wx/colour.h" + +// dock art provider code - a dock provider provides all drawing +// functionality to the wxAui dock manager. This allows the dock +// manager to have plugable look-and-feels + +class WXDLLIMPEXP_AUI wxAuiDockArt +{ +public: + + wxAuiDockArt() { } + virtual ~wxAuiDockArt() { } + + virtual int GetMetric(int id) = 0; + virtual void SetMetric(int id, int newVal) = 0; + virtual void SetFont(int id, const wxFont& font) = 0; + virtual wxFont GetFont(int id) = 0; + virtual wxColour GetColour(int id) = 0; + virtual void SetColour(int id, const wxColor& colour) = 0; + wxColour GetColor(int id) { return GetColour(id); } + void SetColor(int id, const wxColour& color) { SetColour(id, color); } + + virtual void DrawSash(wxDC& dc, + wxWindow* window, + int orientation, + const wxRect& rect) = 0; + + virtual void DrawBackground(wxDC& dc, + wxWindow* window, + int orientation, + const wxRect& rect) = 0; + + virtual void DrawCaption(wxDC& dc, + wxWindow* window, + const wxString& text, + const wxRect& rect, + wxAuiPaneInfo& pane) = 0; + + virtual void DrawGripper(wxDC& dc, + wxWindow* window, + const wxRect& rect, + wxAuiPaneInfo& pane) = 0; + + virtual void DrawBorder(wxDC& dc, + wxWindow* window, + const wxRect& rect, + wxAuiPaneInfo& pane) = 0; + + virtual void DrawPaneButton(wxDC& dc, + wxWindow* window, + int button, + int buttonState, + const wxRect& rect, + wxAuiPaneInfo& pane) = 0; +}; + + +// this is the default art provider for wxAuiManager. Dock art +// can be customized by creating a class derived from this one, +// or replacing this class entirely + +class WXDLLIMPEXP_AUI wxAuiDefaultDockArt : public wxAuiDockArt +{ +public: + + wxAuiDefaultDockArt(); + + int GetMetric(int metricId); + void SetMetric(int metricId, int newVal); + wxColour GetColour(int id); + void SetColour(int id, const wxColor& colour); + void SetFont(int id, const wxFont& font); + wxFont GetFont(int id); + + void DrawSash(wxDC& dc, + wxWindow *window, + int orientation, + const wxRect& rect); + + void DrawBackground(wxDC& dc, + wxWindow *window, + int orientation, + const wxRect& rect); + + void DrawCaption(wxDC& dc, + wxWindow *window, + const wxString& text, + const wxRect& rect, + wxAuiPaneInfo& pane); + + void DrawGripper(wxDC& dc, + wxWindow *window, + const wxRect& rect, + wxAuiPaneInfo& pane); + + void DrawBorder(wxDC& dc, + wxWindow *window, + const wxRect& rect, + wxAuiPaneInfo& pane); + + void DrawPaneButton(wxDC& dc, + wxWindow *window, + int button, + int buttonState, + const wxRect& rect, + wxAuiPaneInfo& pane); + + void DrawIcon(wxDC& dc, + const wxRect& rect, + wxAuiPaneInfo& pane); + +protected: + + void DrawCaptionBackground(wxDC& dc, const wxRect& rect, bool active); + + void InitBitmaps(); + +protected: + + wxPen m_borderPen; + wxBrush m_sashBrush; + wxBrush m_backgroundBrush; + wxBrush m_gripperBrush; + wxFont m_captionFont; + wxBitmap m_inactiveCloseBitmap; + wxBitmap m_inactivePinBitmap; + wxBitmap m_inactiveMaximizeBitmap; + wxBitmap m_inactiveRestoreBitmap; + wxBitmap m_activeCloseBitmap; + wxBitmap m_activePinBitmap; + wxBitmap m_activeMaximizeBitmap; + wxBitmap m_activeRestoreBitmap; + wxPen m_gripperPen1; + wxPen m_gripperPen2; + wxPen m_gripperPen3; + wxColour m_baseColour; + wxColour m_activeCaptionColour; + wxColour m_activeCaptionGradientColour; + wxColour m_activeCaptionTextColour; + wxColour m_inactiveCaptionColour; + wxColour m_inactiveCaptionGradientColour; + wxColour m_inactiveCaptionTextColour; + int m_borderSize; + int m_captionSize; + int m_sashSize; + int m_buttonSize; + int m_gripperSize; + int m_gradientType; +}; + + + +#endif // wxUSE_AUI +#endif //_WX_DOCKART_H_ diff --git a/wxmsw/include/wx-3.0/wx/aui/floatpane.h b/wxmsw/include/wx-3.0/wx/aui/floatpane.h new file mode 100644 index 00000000..bf158933 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/aui/floatpane.h @@ -0,0 +1,80 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/aui/floatpane.h +// Purpose: wxaui: wx advanced user interface - docking window manager +// Author: Benjamin I. Williams +// Modified by: +// Created: 2005-05-17 +// Copyright: (C) Copyright 2005, Kirix Corporation, All Rights Reserved. +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FLOATPANE_H_ +#define _WX_FLOATPANE_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" +#include "wx/weakref.h" + +#if wxUSE_AUI + +#if wxUSE_MINIFRAME + #include "wx/minifram.h" + #define wxAuiFloatingFrameBaseClass wxMiniFrame +#else + #include "wx/frame.h" + #define wxAuiFloatingFrameBaseClass wxFrame +#endif + +class WXDLLIMPEXP_AUI wxAuiFloatingFrame : public wxAuiFloatingFrameBaseClass +{ +public: + wxAuiFloatingFrame(wxWindow* parent, + wxAuiManager* ownerMgr, + const wxAuiPaneInfo& pane, + wxWindowID id = wxID_ANY, + long style = wxRESIZE_BORDER | wxSYSTEM_MENU | wxCAPTION | + wxFRAME_NO_TASKBAR | wxFRAME_FLOAT_ON_PARENT | + wxCLIP_CHILDREN + ); + virtual ~wxAuiFloatingFrame(); + void SetPaneWindow(const wxAuiPaneInfo& pane); + wxAuiManager* GetOwnerManager() const; + +protected: + virtual void OnMoveStart(); + virtual void OnMoving(const wxRect& windowRect, wxDirection dir); + virtual void OnMoveFinished(); + +private: + void OnSize(wxSizeEvent& event); + void OnClose(wxCloseEvent& event); + void OnMoveEvent(wxMoveEvent& event); + void OnIdle(wxIdleEvent& event); + void OnActivate(wxActivateEvent& event); + static bool isMouseDown(); + +private: + wxWindow* m_paneWindow; // pane window being managed + bool m_solidDrag; // true if system uses solid window drag + bool m_moving; + wxRect m_lastRect; + wxRect m_last2Rect; + wxRect m_last3Rect; + wxSize m_lastSize; + wxDirection m_lastDirection; + + wxWeakRef m_ownerMgr; + wxAuiManager m_mgr; + +#ifndef SWIG + DECLARE_EVENT_TABLE() + DECLARE_CLASS(wxAuiFloatingFrame) +#endif // SWIG +}; + +#endif // wxUSE_AUI +#endif //_WX_FLOATPANE_H_ + diff --git a/wxmsw/include/wx-3.0/wx/aui/framemanager.h b/wxmsw/include/wx-3.0/wx/aui/framemanager.h new file mode 100644 index 00000000..4f6b4641 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/aui/framemanager.h @@ -0,0 +1,890 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/aui/framemanager.h +// Purpose: wxaui: wx advanced user interface - docking window manager +// Author: Benjamin I. Williams +// Modified by: +// Created: 2005-05-17 +// Copyright: (C) Copyright 2005, Kirix Corporation, All Rights Reserved. +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FRAMEMANAGER_H_ +#define _WX_FRAMEMANAGER_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_AUI + +#include "wx/dynarray.h" +#include "wx/gdicmn.h" +#include "wx/window.h" +#include "wx/timer.h" +#include "wx/sizer.h" +#include "wx/bitmap.h" + +enum wxAuiManagerDock +{ + wxAUI_DOCK_NONE = 0, + wxAUI_DOCK_TOP = 1, + wxAUI_DOCK_RIGHT = 2, + wxAUI_DOCK_BOTTOM = 3, + wxAUI_DOCK_LEFT = 4, + wxAUI_DOCK_CENTER = 5, + wxAUI_DOCK_CENTRE = wxAUI_DOCK_CENTER +}; + +enum wxAuiManagerOption +{ + wxAUI_MGR_ALLOW_FLOATING = 1 << 0, + wxAUI_MGR_ALLOW_ACTIVE_PANE = 1 << 1, + wxAUI_MGR_TRANSPARENT_DRAG = 1 << 2, + wxAUI_MGR_TRANSPARENT_HINT = 1 << 3, + wxAUI_MGR_VENETIAN_BLINDS_HINT = 1 << 4, + wxAUI_MGR_RECTANGLE_HINT = 1 << 5, + wxAUI_MGR_HINT_FADE = 1 << 6, + wxAUI_MGR_NO_VENETIAN_BLINDS_FADE = 1 << 7, + wxAUI_MGR_LIVE_RESIZE = 1 << 8, + + wxAUI_MGR_DEFAULT = wxAUI_MGR_ALLOW_FLOATING | + wxAUI_MGR_TRANSPARENT_HINT | + wxAUI_MGR_HINT_FADE | + wxAUI_MGR_NO_VENETIAN_BLINDS_FADE +}; + + +enum wxAuiPaneDockArtSetting +{ + wxAUI_DOCKART_SASH_SIZE = 0, + wxAUI_DOCKART_CAPTION_SIZE = 1, + wxAUI_DOCKART_GRIPPER_SIZE = 2, + wxAUI_DOCKART_PANE_BORDER_SIZE = 3, + wxAUI_DOCKART_PANE_BUTTON_SIZE = 4, + wxAUI_DOCKART_BACKGROUND_COLOUR = 5, + wxAUI_DOCKART_SASH_COLOUR = 6, + wxAUI_DOCKART_ACTIVE_CAPTION_COLOUR = 7, + wxAUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR = 8, + wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR = 9, + wxAUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR = 10, + wxAUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR = 11, + wxAUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR = 12, + wxAUI_DOCKART_BORDER_COLOUR = 13, + wxAUI_DOCKART_GRIPPER_COLOUR = 14, + wxAUI_DOCKART_CAPTION_FONT = 15, + wxAUI_DOCKART_GRADIENT_TYPE = 16 +}; + +enum wxAuiPaneDockArtGradients +{ + wxAUI_GRADIENT_NONE = 0, + wxAUI_GRADIENT_VERTICAL = 1, + wxAUI_GRADIENT_HORIZONTAL = 2 +}; + +enum wxAuiPaneButtonState +{ + wxAUI_BUTTON_STATE_NORMAL = 0, + wxAUI_BUTTON_STATE_HOVER = 1 << 1, + wxAUI_BUTTON_STATE_PRESSED = 1 << 2, + wxAUI_BUTTON_STATE_DISABLED = 1 << 3, + wxAUI_BUTTON_STATE_HIDDEN = 1 << 4, + wxAUI_BUTTON_STATE_CHECKED = 1 << 5 +}; + +enum wxAuiButtonId +{ + wxAUI_BUTTON_CLOSE = 101, + wxAUI_BUTTON_MAXIMIZE_RESTORE = 102, + wxAUI_BUTTON_MINIMIZE = 103, + wxAUI_BUTTON_PIN = 104, + wxAUI_BUTTON_OPTIONS = 105, + wxAUI_BUTTON_WINDOWLIST = 106, + wxAUI_BUTTON_LEFT = 107, + wxAUI_BUTTON_RIGHT = 108, + wxAUI_BUTTON_UP = 109, + wxAUI_BUTTON_DOWN = 110, + wxAUI_BUTTON_CUSTOM1 = 201, + wxAUI_BUTTON_CUSTOM2 = 202, + wxAUI_BUTTON_CUSTOM3 = 203 +}; + +enum wxAuiPaneInsertLevel +{ + wxAUI_INSERT_PANE = 0, + wxAUI_INSERT_ROW = 1, + wxAUI_INSERT_DOCK = 2 +}; + + + + +// forwards and array declarations +class wxAuiDockUIPart; +class wxAuiPaneButton; +class wxAuiPaneInfo; +class wxAuiDockInfo; +class wxAuiDockArt; +class wxAuiManagerEvent; + +#ifndef SWIG +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiDockInfo, wxAuiDockInfoArray, WXDLLIMPEXP_AUI); +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiDockUIPart, wxAuiDockUIPartArray, WXDLLIMPEXP_AUI); +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiPaneButton, wxAuiPaneButtonArray, WXDLLIMPEXP_AUI); +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiPaneInfo, wxAuiPaneInfoArray, WXDLLIMPEXP_AUI); +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxAuiPaneInfo*, wxAuiPaneInfoPtrArray, class WXDLLIMPEXP_AUI); +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxAuiDockInfo*, wxAuiDockInfoPtrArray, class WXDLLIMPEXP_AUI); +#endif // SWIG + +extern WXDLLIMPEXP_AUI wxAuiDockInfo wxAuiNullDockInfo; +extern WXDLLIMPEXP_AUI wxAuiPaneInfo wxAuiNullPaneInfo; + + + +class WXDLLIMPEXP_AUI wxAuiPaneInfo +{ +public: + + wxAuiPaneInfo() + { + window = NULL; + frame = NULL; + state = 0; + dock_direction = wxAUI_DOCK_LEFT; + dock_layer = 0; + dock_row = 0; + dock_pos = 0; + floating_pos = wxDefaultPosition; + floating_size = wxDefaultSize; + best_size = wxDefaultSize; + min_size = wxDefaultSize; + max_size = wxDefaultSize; + dock_proportion = 0; + + DefaultPane(); + } + + ~wxAuiPaneInfo() {} + +#ifndef SWIG + wxAuiPaneInfo(const wxAuiPaneInfo& c) + { + name = c.name; + caption = c.caption; + icon = c.icon; + window = c.window; + frame = c.frame; + state = c.state; + dock_direction = c.dock_direction; + dock_layer = c.dock_layer; + dock_row = c.dock_row; + dock_pos = c.dock_pos; + best_size = c.best_size; + min_size = c.min_size; + max_size = c.max_size; + floating_pos = c.floating_pos; + floating_size = c.floating_size; + dock_proportion = c.dock_proportion; + buttons = c.buttons; + rect = c.rect; + } + + wxAuiPaneInfo& operator=(const wxAuiPaneInfo& c) + { + name = c.name; + caption = c.caption; + window = c.window; + frame = c.frame; + state = c.state; + dock_direction = c.dock_direction; + dock_layer = c.dock_layer; + dock_row = c.dock_row; + dock_pos = c.dock_pos; + best_size = c.best_size; + min_size = c.min_size; + max_size = c.max_size; + floating_pos = c.floating_pos; + floating_size = c.floating_size; + dock_proportion = c.dock_proportion; + buttons = c.buttons; + rect = c.rect; + return *this; + } +#endif // SWIG + + // Write the safe parts of a newly loaded PaneInfo structure "source" into "this" + // used on loading perspectives etc. + void SafeSet(wxAuiPaneInfo source) + { + // note source is not passed by reference so we can overwrite, to keep the + // unsafe bits of "dest" + source.window = window; + source.frame = frame; + source.buttons = buttons; + wxCHECK_RET(source.IsValid(), + "window settings and pane settings are incompatible"); + // now assign + *this = source; + } + + bool IsOk() const { return window != NULL; } + bool IsFixed() const { return !HasFlag(optionResizable); } + bool IsResizable() const { return HasFlag(optionResizable); } + bool IsShown() const { return !HasFlag(optionHidden); } + bool IsFloating() const { return HasFlag(optionFloating); } + bool IsDocked() const { return !HasFlag(optionFloating); } + bool IsToolbar() const { return HasFlag(optionToolbar); } + bool IsTopDockable() const { return HasFlag(optionTopDockable); } + bool IsBottomDockable() const { return HasFlag(optionBottomDockable); } + bool IsLeftDockable() const { return HasFlag(optionLeftDockable); } + bool IsRightDockable() const { return HasFlag(optionRightDockable); } + bool IsDockable() const + { + return HasFlag(optionTopDockable | optionBottomDockable | + optionLeftDockable | optionRightDockable); + } + bool IsFloatable() const { return HasFlag(optionFloatable); } + bool IsMovable() const { return HasFlag(optionMovable); } + bool IsDestroyOnClose() const { return HasFlag(optionDestroyOnClose); } + bool IsMaximized() const { return HasFlag(optionMaximized); } + bool HasCaption() const { return HasFlag(optionCaption); } + bool HasGripper() const { return HasFlag(optionGripper); } + bool HasBorder() const { return HasFlag(optionPaneBorder); } + bool HasCloseButton() const { return HasFlag(buttonClose); } + bool HasMaximizeButton() const { return HasFlag(buttonMaximize); } + bool HasMinimizeButton() const { return HasFlag(buttonMinimize); } + bool HasPinButton() const { return HasFlag(buttonPin); } + bool HasGripperTop() const { return HasFlag(optionGripperTop); } + +#ifdef SWIG + %typemap(out) wxAuiPaneInfo& { $result = $self; Py_INCREF($result); } +#endif + wxAuiPaneInfo& Window(wxWindow* w) + { + wxAuiPaneInfo test(*this); + test.window = w; + wxCHECK_MSG(test.IsValid(), *this, + "window settings and pane settings are incompatible"); + *this = test; + return *this; + } + wxAuiPaneInfo& Name(const wxString& n) { name = n; return *this; } + wxAuiPaneInfo& Caption(const wxString& c) { caption = c; return *this; } + wxAuiPaneInfo& Icon(const wxBitmap& b) { icon = b; return *this; } + wxAuiPaneInfo& Left() { dock_direction = wxAUI_DOCK_LEFT; return *this; } + wxAuiPaneInfo& Right() { dock_direction = wxAUI_DOCK_RIGHT; return *this; } + wxAuiPaneInfo& Top() { dock_direction = wxAUI_DOCK_TOP; return *this; } + wxAuiPaneInfo& Bottom() { dock_direction = wxAUI_DOCK_BOTTOM; return *this; } + wxAuiPaneInfo& Center() { dock_direction = wxAUI_DOCK_CENTER; return *this; } + wxAuiPaneInfo& Centre() { dock_direction = wxAUI_DOCK_CENTRE; return *this; } + wxAuiPaneInfo& Direction(int direction) { dock_direction = direction; return *this; } + wxAuiPaneInfo& Layer(int layer) { dock_layer = layer; return *this; } + wxAuiPaneInfo& Row(int row) { dock_row = row; return *this; } + wxAuiPaneInfo& Position(int pos) { dock_pos = pos; return *this; } + wxAuiPaneInfo& BestSize(const wxSize& size) { best_size = size; return *this; } + wxAuiPaneInfo& MinSize(const wxSize& size) { min_size = size; return *this; } + wxAuiPaneInfo& MaxSize(const wxSize& size) { max_size = size; return *this; } + wxAuiPaneInfo& BestSize(int x, int y) { best_size.Set(x,y); return *this; } + wxAuiPaneInfo& MinSize(int x, int y) { min_size.Set(x,y); return *this; } + wxAuiPaneInfo& MaxSize(int x, int y) { max_size.Set(x,y); return *this; } + wxAuiPaneInfo& FloatingPosition(const wxPoint& pos) { floating_pos = pos; return *this; } + wxAuiPaneInfo& FloatingPosition(int x, int y) { floating_pos.x = x; floating_pos.y = y; return *this; } + wxAuiPaneInfo& FloatingSize(const wxSize& size) { floating_size = size; return *this; } + wxAuiPaneInfo& FloatingSize(int x, int y) { floating_size.Set(x,y); return *this; } + wxAuiPaneInfo& Fixed() { return SetFlag(optionResizable, false); } + wxAuiPaneInfo& Resizable(bool resizable = true) { return SetFlag(optionResizable, resizable); } + wxAuiPaneInfo& Dock() { return SetFlag(optionFloating, false); } + wxAuiPaneInfo& Float() { return SetFlag(optionFloating, true); } + wxAuiPaneInfo& Hide() { return SetFlag(optionHidden, true); } + wxAuiPaneInfo& Show(bool show = true) { return SetFlag(optionHidden, !show); } + wxAuiPaneInfo& CaptionVisible(bool visible = true) { return SetFlag(optionCaption, visible); } + wxAuiPaneInfo& Maximize() { return SetFlag(optionMaximized, true); } + wxAuiPaneInfo& Restore() { return SetFlag(optionMaximized, false); } + wxAuiPaneInfo& PaneBorder(bool visible = true) { return SetFlag(optionPaneBorder, visible); } + wxAuiPaneInfo& Gripper(bool visible = true) { return SetFlag(optionGripper, visible); } + wxAuiPaneInfo& GripperTop(bool attop = true) { return SetFlag(optionGripperTop, attop); } + wxAuiPaneInfo& CloseButton(bool visible = true) { return SetFlag(buttonClose, visible); } + wxAuiPaneInfo& MaximizeButton(bool visible = true) { return SetFlag(buttonMaximize, visible); } + wxAuiPaneInfo& MinimizeButton(bool visible = true) { return SetFlag(buttonMinimize, visible); } + wxAuiPaneInfo& PinButton(bool visible = true) { return SetFlag(buttonPin, visible); } + wxAuiPaneInfo& DestroyOnClose(bool b = true) { return SetFlag(optionDestroyOnClose, b); } + wxAuiPaneInfo& TopDockable(bool b = true) { return SetFlag(optionTopDockable, b); } + wxAuiPaneInfo& BottomDockable(bool b = true) { return SetFlag(optionBottomDockable, b); } + wxAuiPaneInfo& LeftDockable(bool b = true) { return SetFlag(optionLeftDockable, b); } + wxAuiPaneInfo& RightDockable(bool b = true) { return SetFlag(optionRightDockable, b); } + wxAuiPaneInfo& Floatable(bool b = true) { return SetFlag(optionFloatable, b); } + wxAuiPaneInfo& Movable(bool b = true) { return SetFlag(optionMovable, b); } + wxAuiPaneInfo& DockFixed(bool b = true) { return SetFlag(optionDockFixed, b); } + + wxAuiPaneInfo& Dockable(bool b = true) + { + return TopDockable(b).BottomDockable(b).LeftDockable(b).RightDockable(b); + } + + wxAuiPaneInfo& DefaultPane() + { + wxAuiPaneInfo test(*this); + test.state |= optionTopDockable | optionBottomDockable | + optionLeftDockable | optionRightDockable | + optionFloatable | optionMovable | optionResizable | + optionCaption | optionPaneBorder | buttonClose; + wxCHECK_MSG(test.IsValid(), *this, + "window settings and pane settings are incompatible"); + *this = test; + return *this; + } + + wxAuiPaneInfo& CentrePane() { return CenterPane(); } + wxAuiPaneInfo& CenterPane() + { + state = 0; + return Center().PaneBorder().Resizable(); + } + + wxAuiPaneInfo& ToolbarPane() + { + DefaultPane(); + state |= (optionToolbar | optionGripper); + state &= ~(optionResizable | optionCaption); + if (dock_layer == 0) + dock_layer = 10; + return *this; + } + + wxAuiPaneInfo& SetFlag(int flag, bool option_state) + { + wxAuiPaneInfo test(*this); + if (option_state) + test.state |= flag; + else + test.state &= ~flag; + wxCHECK_MSG(test.IsValid(), *this, + "window settings and pane settings are incompatible"); + *this = test; + return *this; + } + + bool HasFlag(int flag) const + { + return (state & flag) != 0; + } + +#ifdef SWIG + %typemap(out) wxAuiPaneInfo& ; +#endif + +public: + + // NOTE: You can add and subtract flags from this list, + // but do not change the values of the flags, because + // they are stored in a binary integer format in the + // perspective string. If you really need to change the + // values around, you'll have to ensure backwards-compatibility + // in the perspective loading code. + enum wxAuiPaneState + { + optionFloating = 1 << 0, + optionHidden = 1 << 1, + optionLeftDockable = 1 << 2, + optionRightDockable = 1 << 3, + optionTopDockable = 1 << 4, + optionBottomDockable = 1 << 5, + optionFloatable = 1 << 6, + optionMovable = 1 << 7, + optionResizable = 1 << 8, + optionPaneBorder = 1 << 9, + optionCaption = 1 << 10, + optionGripper = 1 << 11, + optionDestroyOnClose = 1 << 12, + optionToolbar = 1 << 13, + optionActive = 1 << 14, + optionGripperTop = 1 << 15, + optionMaximized = 1 << 16, + optionDockFixed = 1 << 17, + + buttonClose = 1 << 21, + buttonMaximize = 1 << 22, + buttonMinimize = 1 << 23, + buttonPin = 1 << 24, + + buttonCustom1 = 1 << 26, + buttonCustom2 = 1 << 27, + buttonCustom3 = 1 << 28, + + savedHiddenState = 1 << 30, // used internally + actionPane = 1 << 31 // used internally + }; + +public: + wxString name; // name of the pane + wxString caption; // caption displayed on the window + wxBitmap icon; // icon of the pane, may be invalid + + wxWindow* window; // window that is in this pane + wxFrame* frame; // floating frame window that holds the pane + unsigned int state; // a combination of wxPaneState values + + int dock_direction; // dock direction (top, bottom, left, right, center) + int dock_layer; // layer number (0 = innermost layer) + int dock_row; // row number on the docking bar (0 = first row) + int dock_pos; // position inside the row (0 = first position) + + wxSize best_size; // size that the layout engine will prefer + wxSize min_size; // minimum size the pane window can tolerate + wxSize max_size; // maximum size the pane window can tolerate + + wxPoint floating_pos; // position while floating + wxSize floating_size; // size while floating + int dock_proportion; // proportion while docked + + wxAuiPaneButtonArray buttons; // buttons on the pane + + + wxRect rect; // current rectangle (populated by wxAUI) + + bool IsValid() const; +}; + + + +class WXDLLIMPEXP_FWD_AUI wxAuiFloatingFrame; + +class WXDLLIMPEXP_AUI wxAuiManager : public wxEvtHandler +{ + friend class wxAuiFloatingFrame; + +public: + + wxAuiManager(wxWindow* managedWnd = NULL, + unsigned int flags = wxAUI_MGR_DEFAULT); + virtual ~wxAuiManager(); + void UnInit(); + + void SetFlags(unsigned int flags); + unsigned int GetFlags() const; + + void SetManagedWindow(wxWindow* managedWnd); + wxWindow* GetManagedWindow() const; + + static wxAuiManager* GetManager(wxWindow* window); + + void SetArtProvider(wxAuiDockArt* artProvider); + wxAuiDockArt* GetArtProvider() const; + + wxAuiPaneInfo& GetPane(wxWindow* window); + wxAuiPaneInfo& GetPane(const wxString& name); + wxAuiPaneInfoArray& GetAllPanes(); + + bool AddPane(wxWindow* window, + const wxAuiPaneInfo& paneInfo); + + bool AddPane(wxWindow* window, + const wxAuiPaneInfo& paneInfo, + const wxPoint& dropPos); + + bool AddPane(wxWindow* window, + int direction = wxLEFT, + const wxString& caption = wxEmptyString); + + bool InsertPane(wxWindow* window, + const wxAuiPaneInfo& insertLocation, + int insertLevel = wxAUI_INSERT_PANE); + + bool DetachPane(wxWindow* window); + + void Update(); + + wxString SavePaneInfo(wxAuiPaneInfo& pane); + void LoadPaneInfo(wxString panePart, wxAuiPaneInfo &pane); + wxString SavePerspective(); + bool LoadPerspective(const wxString& perspective, bool update = true); + + void SetDockSizeConstraint(double widthPct, double heightPct); + void GetDockSizeConstraint(double* widthPct, double* heightPct) const; + + void ClosePane(wxAuiPaneInfo& paneInfo); + void MaximizePane(wxAuiPaneInfo& paneInfo); + void RestorePane(wxAuiPaneInfo& paneInfo); + void RestoreMaximizedPane(); + +public: + + virtual wxAuiFloatingFrame* CreateFloatingFrame(wxWindow* parent, const wxAuiPaneInfo& p); + virtual bool CanDockPanel(const wxAuiPaneInfo & p); + + void StartPaneDrag( + wxWindow* paneWindow, + const wxPoint& offset); + + wxRect CalculateHintRect( + wxWindow* paneWindow, + const wxPoint& pt, + const wxPoint& offset); + + void DrawHintRect( + wxWindow* paneWindow, + const wxPoint& pt, + const wxPoint& offset); + + virtual void ShowHint(const wxRect& rect); + virtual void HideHint(); + + void OnHintActivate(wxActivateEvent& event); + +public: + + // deprecated -- please use SetManagedWindow() and + // and GetManagedWindow() instead + + wxDEPRECATED( void SetFrame(wxFrame* frame) ); + wxDEPRECATED( wxFrame* GetFrame() const ); + +protected: + + void UpdateHintWindowConfig(); + + void DoFrameLayout(); + + void LayoutAddPane(wxSizer* container, + wxAuiDockInfo& dock, + wxAuiPaneInfo& pane, + wxAuiDockUIPartArray& uiparts, + bool spacerOnly); + + void LayoutAddDock(wxSizer* container, + wxAuiDockInfo& dock, + wxAuiDockUIPartArray& uiParts, + bool spacerOnly); + + wxSizer* LayoutAll(wxAuiPaneInfoArray& panes, + wxAuiDockInfoArray& docks, + wxAuiDockUIPartArray & uiParts, + bool spacerOnly = false); + + virtual bool ProcessDockResult(wxAuiPaneInfo& target, + const wxAuiPaneInfo& newPos); + + bool DoDrop(wxAuiDockInfoArray& docks, + wxAuiPaneInfoArray& panes, + wxAuiPaneInfo& drop, + const wxPoint& pt, + const wxPoint& actionOffset = wxPoint(0,0)); + + wxAuiDockUIPart* HitTest(int x, int y); + wxAuiDockUIPart* GetPanePart(wxWindow* pane); + int GetDockPixelOffset(wxAuiPaneInfo& test); + void OnFloatingPaneMoveStart(wxWindow* window); + void OnFloatingPaneMoving(wxWindow* window, wxDirection dir ); + void OnFloatingPaneMoved(wxWindow* window, wxDirection dir); + void OnFloatingPaneActivated(wxWindow* window); + void OnFloatingPaneClosed(wxWindow* window, wxCloseEvent& evt); + void OnFloatingPaneResized(wxWindow* window, const wxRect& rect); + void Render(wxDC* dc); + void Repaint(wxDC* dc = NULL); + void ProcessMgrEvent(wxAuiManagerEvent& event); + void UpdateButtonOnScreen(wxAuiDockUIPart* buttonUiPart, + const wxMouseEvent& event); + void GetPanePositionsAndSizes(wxAuiDockInfo& dock, + wxArrayInt& positions, + wxArrayInt& sizes); + + /// Ends a resize action, or for live update, resizes the sash + bool DoEndResizeAction(wxMouseEvent& event); + + void SetActivePane(wxWindow* active_pane); + +public: + + // public events (which can be invoked externally) + void OnRender(wxAuiManagerEvent& evt); + void OnPaneButton(wxAuiManagerEvent& evt); + +protected: + + // protected events + void OnPaint(wxPaintEvent& evt); + void OnEraseBackground(wxEraseEvent& evt); + void OnSize(wxSizeEvent& evt); + void OnSetCursor(wxSetCursorEvent& evt); + void OnLeftDown(wxMouseEvent& evt); + void OnLeftUp(wxMouseEvent& evt); + void OnMotion(wxMouseEvent& evt); + void OnCaptureLost(wxMouseCaptureLostEvent& evt); + void OnLeaveWindow(wxMouseEvent& evt); + void OnChildFocus(wxChildFocusEvent& evt); + void OnHintFadeTimer(wxTimerEvent& evt); + void OnFindManager(wxAuiManagerEvent& evt); + +protected: + + enum + { + actionNone = 0, + actionResize, + actionClickButton, + actionClickCaption, + actionDragToolbarPane, + actionDragFloatingPane + }; + +protected: + + wxWindow* m_frame; // the window being managed + wxAuiDockArt* m_art; // dock art object which does all drawing + unsigned int m_flags; // manager flags wxAUI_MGR_* + + wxAuiPaneInfoArray m_panes; // array of panes structures + wxAuiDockInfoArray m_docks; // array of docks structures + wxAuiDockUIPartArray m_uiParts; // array of UI parts (captions, buttons, etc) + + int m_action; // current mouse action + wxPoint m_actionStart; // position where the action click started + wxPoint m_actionOffset; // offset from upper left of the item clicked + wxAuiDockUIPart* m_actionPart; // ptr to the part the action happened to + wxWindow* m_actionWindow; // action frame or window (NULL if none) + wxRect m_actionHintRect; // hint rectangle for the action + wxRect m_lastRect; + wxAuiDockUIPart* m_hoverButton;// button uipart being hovered over + wxRect m_lastHint; // last hint rectangle + wxPoint m_lastMouseMove; // last mouse move position (see OnMotion) + int m_currentDragItem; + bool m_skipping; + bool m_hasMaximized; + + double m_dockConstraintX; // 0.0 .. 1.0; max pct of window width a dock can consume + double m_dockConstraintY; // 0.0 .. 1.0; max pct of window height a dock can consume + + wxFrame* m_hintWnd; // transparent hint window, if supported by platform + wxTimer m_hintFadeTimer; // transparent fade timer + wxByte m_hintFadeAmt; // transparent fade amount + wxByte m_hintFadeMax; // maximum value of hint fade + + void* m_reserved; + +#ifndef SWIG + DECLARE_EVENT_TABLE() + DECLARE_CLASS(wxAuiManager) +#endif // SWIG +}; + + + +// event declarations/classes + +class WXDLLIMPEXP_AUI wxAuiManagerEvent : public wxEvent +{ +public: + wxAuiManagerEvent(wxEventType type=wxEVT_NULL) : wxEvent(0, type) + { + manager = NULL; + pane = NULL; + button = 0; + veto_flag = false; + canveto_flag = true; + dc = NULL; + } +#ifndef SWIG + wxAuiManagerEvent(const wxAuiManagerEvent& c) : wxEvent(c) + { + manager = c.manager; + pane = c.pane; + button = c.button; + veto_flag = c.veto_flag; + canveto_flag = c.canveto_flag; + dc = c.dc; + } +#endif + wxEvent *Clone() const { return new wxAuiManagerEvent(*this); } + + void SetManager(wxAuiManager* mgr) { manager = mgr; } + void SetPane(wxAuiPaneInfo* p) { pane = p; } + void SetButton(int b) { button = b; } + void SetDC(wxDC* pdc) { dc = pdc; } + + wxAuiManager* GetManager() const { return manager; } + wxAuiPaneInfo* GetPane() const { return pane; } + int GetButton() const { return button; } + wxDC* GetDC() const { return dc; } + + void Veto(bool veto = true) { veto_flag = veto; } + bool GetVeto() const { return veto_flag; } + void SetCanVeto(bool can_veto) { canveto_flag = can_veto; } + bool CanVeto() const { return canveto_flag && veto_flag; } + +public: + wxAuiManager* manager; + wxAuiPaneInfo* pane; + int button; + bool veto_flag; + bool canveto_flag; + wxDC* dc; + +#ifndef SWIG +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxAuiManagerEvent) +#endif +}; + + +class WXDLLIMPEXP_AUI wxAuiDockInfo +{ +public: + wxAuiDockInfo() + { + dock_direction = 0; + dock_layer = 0; + dock_row = 0; + size = 0; + min_size = 0; + resizable = true; + fixed = false; + toolbar = false; + reserved1 = false; + } + +#ifndef SWIG + wxAuiDockInfo(const wxAuiDockInfo& c) + { + dock_direction = c.dock_direction; + dock_layer = c.dock_layer; + dock_row = c.dock_row; + size = c.size; + min_size = c.min_size; + resizable = c.resizable; + fixed = c.fixed; + toolbar = c.toolbar; + panes = c.panes; + rect = c.rect; + reserved1 = c.reserved1; + } + + wxAuiDockInfo& operator=(const wxAuiDockInfo& c) + { + dock_direction = c.dock_direction; + dock_layer = c.dock_layer; + dock_row = c.dock_row; + size = c.size; + min_size = c.min_size; + resizable = c.resizable; + fixed = c.fixed; + toolbar = c.toolbar; + panes = c.panes; + rect = c.rect; + reserved1 = c.reserved1; + return *this; + } +#endif // SWIG + + bool IsOk() const { return dock_direction != 0; } + bool IsHorizontal() const { return dock_direction == wxAUI_DOCK_TOP || + dock_direction == wxAUI_DOCK_BOTTOM; } + bool IsVertical() const { return dock_direction == wxAUI_DOCK_LEFT || + dock_direction == wxAUI_DOCK_RIGHT || + dock_direction == wxAUI_DOCK_CENTER; } +public: + wxAuiPaneInfoPtrArray panes; // array of panes + wxRect rect; // current rectangle + int dock_direction; // dock direction (top, bottom, left, right, center) + int dock_layer; // layer number (0 = innermost layer) + int dock_row; // row number on the docking bar (0 = first row) + int size; // size of the dock + int min_size; // minimum size of a dock (0 if there is no min) + bool resizable; // flag indicating whether the dock is resizable + bool toolbar; // flag indicating dock contains only toolbars + bool fixed; // flag indicating that the dock operates on + // absolute coordinates as opposed to proportional + bool reserved1; +}; + + +class WXDLLIMPEXP_AUI wxAuiDockUIPart +{ +public: + enum + { + typeCaption, + typeGripper, + typeDock, + typeDockSizer, + typePane, + typePaneSizer, + typeBackground, + typePaneBorder, + typePaneButton + }; + + int type; // ui part type (see enum above) + int orientation; // orientation (either wxHORIZONTAL or wxVERTICAL) + wxAuiDockInfo* dock; // which dock the item is associated with + wxAuiPaneInfo* pane; // which pane the item is associated with + wxAuiPaneButton* button; // which pane button the item is associated with + wxSizer* cont_sizer; // the part's containing sizer + wxSizerItem* sizer_item; // the sizer item of the part + wxRect rect; // client coord rectangle of the part itself +}; + + +class WXDLLIMPEXP_AUI wxAuiPaneButton +{ +public: + int button_id; // id of the button (e.g. buttonClose) +}; + + + +#ifndef SWIG + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUI_PANE_BUTTON, wxAuiManagerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUI_PANE_CLOSE, wxAuiManagerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUI_PANE_MAXIMIZE, wxAuiManagerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUI_PANE_RESTORE, wxAuiManagerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUI_PANE_ACTIVATED, wxAuiManagerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUI_RENDER, wxAuiManagerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUI_FIND_MANAGER, wxAuiManagerEvent ); + +typedef void (wxEvtHandler::*wxAuiManagerEventFunction)(wxAuiManagerEvent&); + +#define wxAuiManagerEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxAuiManagerEventFunction, func) + +#define EVT_AUI_PANE_BUTTON(func) \ + wx__DECLARE_EVT0(wxEVT_AUI_PANE_BUTTON, wxAuiManagerEventHandler(func)) +#define EVT_AUI_PANE_CLOSE(func) \ + wx__DECLARE_EVT0(wxEVT_AUI_PANE_CLOSE, wxAuiManagerEventHandler(func)) +#define EVT_AUI_PANE_MAXIMIZE(func) \ + wx__DECLARE_EVT0(wxEVT_AUI_PANE_MAXIMIZE, wxAuiManagerEventHandler(func)) +#define EVT_AUI_PANE_RESTORE(func) \ + wx__DECLARE_EVT0(wxEVT_AUI_PANE_RESTORE, wxAuiManagerEventHandler(func)) +#define EVT_AUI_PANE_ACTIVATED(func) \ + wx__DECLARE_EVT0(wxEVT_AUI_PANE_ACTIVATED, wxAuiManagerEventHandler(func)) +#define EVT_AUI_RENDER(func) \ + wx__DECLARE_EVT0(wxEVT_AUI_RENDER, wxAuiManagerEventHandler(func)) +#define EVT_AUI_FIND_MANAGER(func) \ + wx__DECLARE_EVT0(wxEVT_AUI_FIND_MANAGER, wxAuiManagerEventHandler(func)) + +#else + +%constant wxEventType wxEVT_AUI_PANE_BUTTON; +%constant wxEventType wxEVT_AUI_PANE_CLOSE; +%constant wxEventType wxEVT_AUI_PANE_MAXIMIZE; +%constant wxEventType wxEVT_AUI_PANE_RESTORE; +%constant wxEventType wxEVT_AUI_PANE_ACTIVATED; +%constant wxEventType wxEVT_AUI_RENDER; +%constant wxEventType wxEVT_AUI_FIND_MANAGER; + +%pythoncode { + EVT_AUI_PANE_BUTTON = wx.PyEventBinder( wxEVT_AUI_PANE_BUTTON ) + EVT_AUI_PANE_CLOSE = wx.PyEventBinder( wxEVT_AUI_PANE_CLOSE ) + EVT_AUI_PANE_MAXIMIZE = wx.PyEventBinder( wxEVT_AUI_PANE_MAXIMIZE ) + EVT_AUI_PANE_RESTORE = wx.PyEventBinder( wxEVT_AUI_PANE_RESTORE ) + EVT_AUI_PANE_ACTIVATED = wx.PyEventBinder( wxEVT_AUI_PANE_ACTIVATED ) + EVT_AUI_RENDER = wx.PyEventBinder( wxEVT_AUI_RENDER ) + EVT_AUI_FIND_MANAGER = wx.PyEventBinder( wxEVT_AUI_FIND_MANAGER ) +} +#endif // SWIG + +#endif // wxUSE_AUI +#endif //_WX_FRAMEMANAGER_H_ + diff --git a/wxmsw/include/wx-3.0/wx/aui/tabart.h b/wxmsw/include/wx-3.0/wx/aui/tabart.h new file mode 100644 index 00000000..3de076c9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/aui/tabart.h @@ -0,0 +1,324 @@ +////////////////////////////////////////////////////////////////////////////// +// Name: wx/aui/tabart.h +// Purpose: wxaui: wx advanced user interface - notebook +// Author: Benjamin I. Williams +// Modified by: Jens Lody (extracted from wx/aui/auibook.h) +// Created: 2012-03-21 +// Copyright: (C) Copyright 2006, Kirix Corporation, All Rights Reserved. +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + + +#ifndef _WX_AUI_TABART_H_ +#define _WX_AUI_TABART_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_AUI + +#include "wx/colour.h" +#include "wx/gdicmn.h" +#include "wx/font.h" +#include "wx/pen.h" +#include "wx/brush.h" +#include "wx/bitmap.h" + + +class wxAuiNotebookPage; +class wxAuiNotebookPageArray; +class wxWindow; +class wxDC; + + +// tab art class + +class WXDLLIMPEXP_AUI wxAuiTabArt +{ +public: + + wxAuiTabArt() { } + virtual ~wxAuiTabArt() { } + + virtual wxAuiTabArt* Clone() = 0; + virtual void SetFlags(unsigned int flags) = 0; + + virtual void SetSizingInfo(const wxSize& tabCtrlSize, + size_t tabCount) = 0; + + virtual void SetNormalFont(const wxFont& font) = 0; + virtual void SetSelectedFont(const wxFont& font) = 0; + virtual void SetMeasuringFont(const wxFont& font) = 0; + virtual void SetColour(const wxColour& colour) = 0; + virtual void SetActiveColour(const wxColour& colour) = 0; + + virtual void DrawBorder( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + + virtual void DrawBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + + virtual void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& pane, + const wxRect& inRect, + int closeButtonState, + wxRect* outTabRect, + wxRect* outButtonRect, + int* xExtent) = 0; + + virtual void DrawButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& inRect, + int bitmapId, + int buttonState, + int orientation, + wxRect* outRect) = 0; + + virtual wxSize GetTabSize( + wxDC& dc, + wxWindow* wnd, + const wxString& caption, + const wxBitmap& bitmap, + bool active, + int closeButtonState, + int* xExtent) = 0; + + virtual int ShowDropDown( + wxWindow* wnd, + const wxAuiNotebookPageArray& items, + int activeIdx) = 0; + + virtual int GetIndentSize() = 0; + + virtual int GetBorderWidth( + wxWindow* wnd) = 0; + + virtual int GetAdditionalBorderSpace( + wxWindow* wnd) = 0; + + virtual int GetBestTabCtrlSize( + wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + const wxSize& requiredBmpSize) = 0; +}; + + +class WXDLLIMPEXP_AUI wxAuiGenericTabArt : public wxAuiTabArt +{ + +public: + + wxAuiGenericTabArt(); + virtual ~wxAuiGenericTabArt(); + + wxAuiTabArt* Clone(); + void SetFlags(unsigned int flags); + void SetSizingInfo(const wxSize& tabCtrlSize, + size_t tabCount); + + void SetNormalFont(const wxFont& font); + void SetSelectedFont(const wxFont& font); + void SetMeasuringFont(const wxFont& font); + void SetColour(const wxColour& colour); + void SetActiveColour(const wxColour& colour); + + void DrawBorder( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& pane, + const wxRect& inRect, + int closeButtonState, + wxRect* outTabRect, + wxRect* outButtonRect, + int* xExtent); + + void DrawButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& inRect, + int bitmapId, + int buttonState, + int orientation, + wxRect* outRect); + + int GetIndentSize(); + + int GetBorderWidth( + wxWindow* wnd); + + int GetAdditionalBorderSpace( + wxWindow* wnd); + + wxSize GetTabSize( + wxDC& dc, + wxWindow* wnd, + const wxString& caption, + const wxBitmap& bitmap, + bool active, + int closeButtonState, + int* xExtent); + + int ShowDropDown( + wxWindow* wnd, + const wxAuiNotebookPageArray& items, + int activeIdx); + + int GetBestTabCtrlSize(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + const wxSize& requiredBmpSize); + +protected: + + wxFont m_normalFont; + wxFont m_selectedFont; + wxFont m_measuringFont; + wxColour m_baseColour; + wxPen m_baseColourPen; + wxPen m_borderPen; + wxBrush m_baseColourBrush; + wxColour m_activeColour; + wxBitmap m_activeCloseBmp; + wxBitmap m_disabledCloseBmp; + wxBitmap m_activeLeftBmp; + wxBitmap m_disabledLeftBmp; + wxBitmap m_activeRightBmp; + wxBitmap m_disabledRightBmp; + wxBitmap m_activeWindowListBmp; + wxBitmap m_disabledWindowListBmp; + + int m_fixedTabWidth; + int m_tabCtrlHeight; + unsigned int m_flags; +}; + + +class WXDLLIMPEXP_AUI wxAuiSimpleTabArt : public wxAuiTabArt +{ + +public: + + wxAuiSimpleTabArt(); + virtual ~wxAuiSimpleTabArt(); + + wxAuiTabArt* Clone(); + void SetFlags(unsigned int flags); + + void SetSizingInfo(const wxSize& tabCtrlSize, + size_t tabCount); + + void SetNormalFont(const wxFont& font); + void SetSelectedFont(const wxFont& font); + void SetMeasuringFont(const wxFont& font); + void SetColour(const wxColour& colour); + void SetActiveColour(const wxColour& colour); + + void DrawBorder( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& pane, + const wxRect& inRect, + int closeButtonState, + wxRect* outTabRect, + wxRect* outButtonRect, + int* xExtent); + + void DrawButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& inRect, + int bitmapId, + int buttonState, + int orientation, + wxRect* outRect); + + int GetIndentSize(); + + int GetBorderWidth( + wxWindow* wnd); + + int GetAdditionalBorderSpace( + wxWindow* wnd); + + wxSize GetTabSize( + wxDC& dc, + wxWindow* wnd, + const wxString& caption, + const wxBitmap& bitmap, + bool active, + int closeButtonState, + int* xExtent); + + int ShowDropDown( + wxWindow* wnd, + const wxAuiNotebookPageArray& items, + int activeIdx); + + int GetBestTabCtrlSize(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + const wxSize& requiredBmpSize); + +protected: + + wxFont m_normalFont; + wxFont m_selectedFont; + wxFont m_measuringFont; + wxPen m_normalBkPen; + wxPen m_selectedBkPen; + wxBrush m_normalBkBrush; + wxBrush m_selectedBkBrush; + wxBrush m_bkBrush; + wxBitmap m_activeCloseBmp; + wxBitmap m_disabledCloseBmp; + wxBitmap m_activeLeftBmp; + wxBitmap m_disabledLeftBmp; + wxBitmap m_activeRightBmp; + wxBitmap m_disabledRightBmp; + wxBitmap m_activeWindowListBmp; + wxBitmap m_disabledWindowListBmp; + + int m_fixedTabWidth; + unsigned int m_flags; +}; + +#ifndef __WXUNIVERSAL__ + #if defined(__WXGTK20__) && !defined(__WXGTK3__) + #define wxHAS_NATIVE_TABART + #include "wx/aui/tabartgtk.h" + #define wxAuiDefaultTabArt wxAuiGtkTabArt + #endif +#endif // !__WXUNIVERSAL__ + +#ifndef wxHAS_NATIVE_TABART + #define wxAuiDefaultTabArt wxAuiGenericTabArt +#endif + +#endif // wxUSE_AUI + +#endif // _WX_AUI_TABART_H_ diff --git a/wxmsw/include/wx-3.0/wx/aui/tabartgtk.h b/wxmsw/include/wx-3.0/wx/aui/tabartgtk.h new file mode 100644 index 00000000..85fe9e2a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/aui/tabartgtk.h @@ -0,0 +1,58 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: include/wx/aui/tabartgtk.h +// Purpose: declaration of the wxAuiGTKTabArt +// Author: Jens Lody and Teodor Petrov +// Modified by: +// Created: 2012-03-23 +// Copyright: (c) 2012 Jens Lody +// and Teodor Petrov +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_AUI_TABARTGTK_H_ +#define _WX_AUI_TABARTGTK_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_AUI + +#include "wx/aui/tabart.h" +#include "wx/gdicmn.h" + +class wxWindow; +class wxDC; + +class WXDLLIMPEXP_AUI wxAuiGtkTabArt : public wxAuiGenericTabArt +{ +public: + wxAuiGtkTabArt(); + + virtual wxAuiTabArt* Clone(); + virtual void DrawBorder(wxDC& dc, wxWindow* wnd, const wxRect& rect); + virtual void DrawBackground(wxDC& dc, wxWindow* wnd, const wxRect& rect); + virtual void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& page, + const wxRect& in_rect, + int close_button_state, + wxRect* out_tab_rect, + wxRect* out_button_rect, + int* x_extent); + void DrawButton(wxDC& dc, wxWindow* wnd, const wxRect& in_rect, int bitmap_id, + int button_state, int orientation, wxRect* out_rect); + int GetBestTabCtrlSize(wxWindow* wnd, const wxAuiNotebookPageArray& pages, + const wxSize& required_bmp_size); + int GetBorderWidth(wxWindow* wnd); + int GetAdditionalBorderSpace(wxWindow* wnd); + virtual wxSize GetTabSize(wxDC& dc, wxWindow* wnd, const wxString& caption, + const wxBitmap& bitmap, bool active, + int close_button_state, int* x_extent); +}; + +#endif // wxUSE_AUI + +#endif // _WX_AUI_TABARTGTK_H_ diff --git a/wxmsw/include/wx-3.0/wx/aui/tabmdi.h b/wxmsw/include/wx-3.0/wx/aui/tabmdi.h new file mode 100644 index 00000000..87508317 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/aui/tabmdi.h @@ -0,0 +1,270 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/aui/tabmdi.h +// Purpose: Generic MDI (Multiple Document Interface) classes +// Author: Hans Van Leemputten +// Modified by: Benjamin I. Williams / Kirix Corporation +// Created: 29/07/2002 +// Copyright: (c) Hans Van Leemputten +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_AUITABMDI_H_ +#define _WX_AUITABMDI_H_ + +#if wxUSE_AUI + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/frame.h" +#include "wx/panel.h" +#include "wx/notebook.h" +#include "wx/icon.h" +#include "wx/aui/auibook.h" + +//----------------------------------------------------------------------------- +// classes +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_AUI wxAuiMDIParentFrame; +class WXDLLIMPEXP_FWD_AUI wxAuiMDIClientWindow; +class WXDLLIMPEXP_FWD_AUI wxAuiMDIChildFrame; + +//----------------------------------------------------------------------------- +// wxAuiMDIParentFrame +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_AUI wxAuiMDIParentFrame : public wxFrame +{ +public: + wxAuiMDIParentFrame(); + wxAuiMDIParentFrame(wxWindow *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL, + const wxString& name = wxFrameNameStr); + + ~wxAuiMDIParentFrame(); + + bool Create(wxWindow *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL, + const wxString& name = wxFrameNameStr ); + + void SetArtProvider(wxAuiTabArt* provider); + wxAuiTabArt* GetArtProvider(); + wxAuiNotebook* GetNotebook() const; + +#if wxUSE_MENUS + wxMenu* GetWindowMenu() const { return m_pWindowMenu; } + void SetWindowMenu(wxMenu* pMenu); + + virtual void SetMenuBar(wxMenuBar *pMenuBar); +#endif // wxUSE_MENUS + + void SetChildMenuBar(wxAuiMDIChildFrame *pChild); + + wxAuiMDIChildFrame *GetActiveChild() const; + void SetActiveChild(wxAuiMDIChildFrame* pChildFrame); + + wxAuiMDIClientWindow *GetClientWindow() const; + virtual wxAuiMDIClientWindow *OnCreateClient(); + + virtual void Cascade() { /* Has no effect */ } + virtual void Tile(wxOrientation orient = wxHORIZONTAL); + virtual void ArrangeIcons() { /* Has no effect */ } + virtual void ActivateNext(); + virtual void ActivatePrevious(); + +protected: + wxAuiMDIClientWindow* m_pClientWindow; + wxEvent* m_pLastEvt; + +#if wxUSE_MENUS + wxMenu *m_pWindowMenu; + wxMenuBar *m_pMyMenuBar; +#endif // wxUSE_MENUS + +protected: + void Init(); + +#if wxUSE_MENUS + void RemoveWindowMenu(wxMenuBar *pMenuBar); + void AddWindowMenu(wxMenuBar *pMenuBar); + + void DoHandleMenu(wxCommandEvent &event); + void DoHandleUpdateUI(wxUpdateUIEvent &event); +#endif // wxUSE_MENUS + + virtual bool ProcessEvent(wxEvent& event); + + virtual void DoGetClientSize(int *width, int *height) const; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxAuiMDIParentFrame) +}; + +//----------------------------------------------------------------------------- +// wxAuiMDIChildFrame +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_AUI wxAuiMDIChildFrame : public wxPanel +{ +public: + wxAuiMDIChildFrame(); + wxAuiMDIChildFrame(wxAuiMDIParentFrame *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + virtual ~wxAuiMDIChildFrame(); + bool Create(wxAuiMDIParentFrame *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + +#if wxUSE_MENUS + virtual void SetMenuBar(wxMenuBar *menuBar); + virtual wxMenuBar *GetMenuBar() const; +#endif // wxUSE_MENUS + + virtual void SetTitle(const wxString& title); + virtual wxString GetTitle() const; + + virtual void SetIcons(const wxIconBundle& icons); + virtual const wxIconBundle& GetIcons() const; + + virtual void SetIcon(const wxIcon& icon); + virtual const wxIcon& GetIcon() const; + + virtual void Activate(); + virtual bool Destroy(); + + virtual bool Show(bool show = true); + +#if wxUSE_STATUSBAR + // no status bars + virtual wxStatusBar* CreateStatusBar(int WXUNUSED(number) = 1, + long WXUNUSED(style) = 1, + wxWindowID WXUNUSED(winid) = 1, + const wxString& WXUNUSED(name) = wxEmptyString) + { return NULL; } + + virtual wxStatusBar *GetStatusBar() const { return NULL; } + virtual void SetStatusText( const wxString &WXUNUSED(text), int WXUNUSED(number)=0 ) {} + virtual void SetStatusWidths( int WXUNUSED(n), const int WXUNUSED(widths_field)[] ) {} +#endif + +#if wxUSE_TOOLBAR + // no toolbar bars + virtual wxToolBar* CreateToolBar(long WXUNUSED(style), + wxWindowID WXUNUSED(winid), + const wxString& WXUNUSED(name)) + { return NULL; } + virtual wxToolBar *GetToolBar() const { return NULL; } +#endif + + + // no maximize etc + virtual void Maximize(bool WXUNUSED(maximize) = true) { /* Has no effect */ } + virtual void Restore() { /* Has no effect */ } + virtual void Iconize(bool WXUNUSED(iconize) = true) { /* Has no effect */ } + virtual bool IsMaximized() const { return true; } + virtual bool IsIconized() const { return false; } + virtual bool ShowFullScreen(bool WXUNUSED(show), long WXUNUSED(style)) { return false; } + virtual bool IsFullScreen() const { return false; } + + virtual bool IsTopLevel() const { return false; } + + void OnMenuHighlight(wxMenuEvent& evt); + void OnActivate(wxActivateEvent& evt); + void OnCloseWindow(wxCloseEvent& evt); + + void SetMDIParentFrame(wxAuiMDIParentFrame* parent); + wxAuiMDIParentFrame* GetMDIParentFrame() const; + +protected: + void Init(); + virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags); + virtual void DoMoveWindow(int x, int y, int width, int height); + + // no size hints + virtual void DoSetSizeHints(int WXUNUSED(minW), int WXUNUSED(minH), + int WXUNUSED(maxW), int WXUNUSED(maxH), + int WXUNUSED(incW), int WXUNUSED(incH)) {} +public: + // This function needs to be called when a size change is confirmed, + // we needed this function to prevent anybody from the outside + // changing the panel... it messes the UI layout when we would allow it. + void ApplyMDIChildFrameRect(); + void DoShow(bool show); + +protected: + wxAuiMDIParentFrame* m_pMDIParentFrame; + wxRect m_mdiNewRect; + wxRect m_mdiCurRect; + wxString m_title; + wxIcon m_icon; + wxIconBundle m_iconBundle; + bool m_activateOnCreate; + +#if wxUSE_MENUS + wxMenuBar* m_pMenuBar; +#endif // wxUSE_MENUS + + + +private: + DECLARE_DYNAMIC_CLASS(wxAuiMDIChildFrame) + DECLARE_EVENT_TABLE() + + friend class wxAuiMDIClientWindow; +}; + +//----------------------------------------------------------------------------- +// wxAuiMDIClientWindow +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_AUI wxAuiMDIClientWindow : public wxAuiNotebook +{ +public: + wxAuiMDIClientWindow(); + wxAuiMDIClientWindow(wxAuiMDIParentFrame *parent, long style = 0); + + virtual bool CreateClient(wxAuiMDIParentFrame *parent, + long style = wxVSCROLL | wxHSCROLL); + + virtual int SetSelection(size_t page); + virtual wxAuiMDIChildFrame* GetActiveChild(); + virtual void SetActiveChild(wxAuiMDIChildFrame* pChildFrame) + { + SetSelection(GetPageIndex(pChildFrame)); + } + +protected: + + void PageChanged(int oldSelection, int newSelection); + void OnPageClose(wxAuiNotebookEvent& evt); + void OnPageChanged(wxAuiNotebookEvent& evt); + void OnSize(wxSizeEvent& evt); + +private: + DECLARE_DYNAMIC_CLASS(wxAuiMDIClientWindow) + DECLARE_EVENT_TABLE() +}; +#endif // wxUSE_AUI + +#endif // _WX_AUITABMDI_H_ diff --git a/wxmsw/include/wx-3.0/wx/bannerwindow.h b/wxmsw/include/wx-3.0/wx/bannerwindow.h new file mode 100644 index 00000000..1f1fb246 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/bannerwindow.h @@ -0,0 +1,144 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/bannerwindow.h +// Purpose: wxBannerWindow class declaration +// Author: Vadim Zeitlin +// Created: 2011-08-16 +// Copyright: (c) 2011 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BANNERWINDOW_H_ +#define _WX_BANNERWINDOW_H_ + +#include "wx/defs.h" + +#if wxUSE_BANNERWINDOW + +#include "wx/bitmap.h" +#include "wx/event.h" +#include "wx/window.h" + +class WXDLLIMPEXP_FWD_CORE wxBitmap; +class WXDLLIMPEXP_FWD_CORE wxColour; +class WXDLLIMPEXP_FWD_CORE wxDC; + +extern WXDLLIMPEXP_DATA_ADV(const char) wxBannerWindowNameStr[]; + +// ---------------------------------------------------------------------------- +// A simple banner window showing either a bitmap or text. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxBannerWindow : public wxWindow +{ +public: + // Default constructor, use Create() later. + wxBannerWindow() { Init(); } + + // Convenient constructor that should be used in the majority of cases. + // + // The banner orientation changes how the text in it is displayed and also + // defines where is the bitmap truncated if it's too big to fit but doesn't + // do anything for the banner position, this is supposed to be taken care + // of in the usual way, e.g. using sizers. + wxBannerWindow(wxWindow* parent, wxDirection dir = wxLEFT) + { + Init(); + + Create(parent, wxID_ANY, dir); + } + + // Full constructor provided for consistency with the other classes only. + wxBannerWindow(wxWindow* parent, + wxWindowID winid, + wxDirection dir = wxLEFT, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxBannerWindowNameStr) + { + Init(); + + Create(parent, winid, dir, pos, size, style, name); + } + + // Can be only called on objects created with the default constructor. + bool Create(wxWindow* parent, + wxWindowID winid, + wxDirection dir = wxLEFT, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxBannerWindowNameStr); + + + // Provide an existing bitmap to show. For wxLEFT orientation the bitmap is + // truncated from the top, for wxTOP and wxBOTTOM -- from the right and for + // wxRIGHT -- from the bottom, so put the most important part of the bitmap + // information in the opposite direction. + void SetBitmap(const wxBitmap& bmp); + + // Set the text to display. This is mutually exclusive with SetBitmap(). + // Title is rendered in bold and should be single line, message can have + // multiple lines but is not wrapped automatically. + void SetText(const wxString& title, const wxString& message); + + // Set the colours between which the gradient runs. This can be combined + // with SetText() but not SetBitmap(). + void SetGradient(const wxColour& start, const wxColour& end); + +protected: + virtual wxSize DoGetBestClientSize() const; + +private: + // Common part of all constructors. + void Init(); + + // Fully invalidates the window. + void OnSize(wxSizeEvent& event); + + // Redraws the window using either m_bitmap or m_title/m_message. + void OnPaint(wxPaintEvent& event); + + // Helper of OnPaint(): draw the bitmap at the correct position depending + // on our orientation. + void DrawBitmapBackground(wxDC& dc); + + // Helper of OnPaint(): draw the text in the appropriate direction. + void DrawBannerTextLine(wxDC& dc, const wxString& str, const wxPoint& pos); + + // Return the font to use for the title. Currently this is hardcoded as a + // larger bold version of the standard window font but could be made + // configurable in the future. + wxFont GetTitleFont() const; + + // Return the colour to use for extending the bitmap. Non-const as it + // updates m_colBitmapBg if needed. + wxColour GetBitmapBg(); + + + // The window side along which the banner is laid out. + wxDirection m_direction; + + // If valid, this bitmap is drawn as is. + wxBitmap m_bitmap; + + // If bitmap is valid, this is the colour we use to extend it if the bitmap + // is smaller than this window. It is computed on demand by GetBitmapBg(). + wxColour m_colBitmapBg; + + // The title and main message to draw, used if m_bitmap is invalid. + wxString m_title, + m_message; + + // Start and stop gradient colours, only used when drawing text. + wxColour m_colStart, + m_colEnd; + + wxDECLARE_EVENT_TABLE(); + + wxDECLARE_NO_COPY_CLASS(wxBannerWindow); +}; + +#endif // wxUSE_BANNERWINDOW + +#endif // _WX_BANNERWINDOW_H_ diff --git a/wxmsw/include/wx-3.0/wx/base64.h b/wxmsw/include/wx-3.0/wx/base64.h new file mode 100644 index 00000000..96c6dd80 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/base64.h @@ -0,0 +1,121 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/base64.h +// Purpose: declaration of BASE64 encoding/decoding functionality +// Author: Charles Reimers, Vadim Zeitlin +// Created: 2007-06-18 +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BASE64_H_ +#define _WX_BASE64_H_ + +#if wxUSE_BASE64 + +#include "wx/string.h" +#include "wx/buffer.h" + +// ---------------------------------------------------------------------------- +// encoding functions +// ---------------------------------------------------------------------------- + +// return the size needed for the buffer containing the encoded representation +// of a buffer of given length +inline size_t wxBase64EncodedSize(size_t len) { return 4*((len+2)/3); } + +// raw base64 encoding function which encodes the contents of a buffer of the +// specified length into the buffer of the specified size +// +// returns the length of the encoded data or wxCONV_FAILED if the buffer is not +// large enough; to determine the needed size you can either allocate a buffer +// of wxBase64EncodedSize(srcLen) size or call the function with NULL buffer in +// which case the required size will be returned +WXDLLIMPEXP_BASE size_t +wxBase64Encode(char *dst, size_t dstLen, const void *src, size_t srcLen); + +// encode the contents of the given buffer using base64 and return as string +// (there is no error return) +inline wxString wxBase64Encode(const void *src, size_t srcLen) +{ + const size_t dstLen = wxBase64EncodedSize(srcLen); + wxCharBuffer dst(dstLen); + wxBase64Encode(dst.data(), dstLen, src, srcLen); + + return dst; +} + +inline wxString wxBase64Encode(const wxMemoryBuffer& buf) +{ + return wxBase64Encode(buf.GetData(), buf.GetDataLen()); +} + +// ---------------------------------------------------------------------------- +// decoding functions +// ---------------------------------------------------------------------------- + +// elements of this enum specify the possible behaviours of wxBase64Decode() +// when an invalid character is encountered +enum wxBase64DecodeMode +{ + // normal behaviour: stop at any invalid characters + wxBase64DecodeMode_Strict, + + // skip whitespace characters + wxBase64DecodeMode_SkipWS, + + // the most lenient behaviour: simply ignore all invalid characters + wxBase64DecodeMode_Relaxed +}; + +// return the buffer size necessary for decoding a base64 string of the given +// length +inline size_t wxBase64DecodedSize(size_t srcLen) { return 3*srcLen/4; } + +// raw decoding function which decodes the contents of the string of specified +// length (or NUL-terminated by default) into the provided buffer of the given +// size +// +// the function normally stops at any character invalid inside a base64-encoded +// string (i.e. not alphanumeric nor '+' nor '/') but can be made to skip the +// whitespace or all invalid characters using its mode argument +// +// returns the length of the decoded data or wxCONV_FAILED if an error occurs +// such as the buffer is too small or the encoded string is invalid; in the +// latter case the posErr is filled with the position where the decoding +// stopped if it is not NULL +WXDLLIMPEXP_BASE size_t +wxBase64Decode(void *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN, + wxBase64DecodeMode mode = wxBase64DecodeMode_Strict, + size_t *posErr = NULL); + +inline size_t +wxBase64Decode(void *dst, size_t dstLen, + const wxString& src, + wxBase64DecodeMode mode = wxBase64DecodeMode_Strict, + size_t *posErr = NULL) +{ + // don't use str.length() here as the ASCII buffer is shorter than it for + // strings with embedded NULs + return wxBase64Decode(dst, dstLen, src.ToAscii(), wxNO_LEN, mode, posErr); +} + +// decode the contents of the given string; the returned buffer is empty if an +// error occurs during decoding +WXDLLIMPEXP_BASE wxMemoryBuffer +wxBase64Decode(const char *src, size_t srcLen = wxNO_LEN, + wxBase64DecodeMode mode = wxBase64DecodeMode_Strict, + size_t *posErr = NULL); + +inline wxMemoryBuffer +wxBase64Decode(const wxString& src, + wxBase64DecodeMode mode = wxBase64DecodeMode_Strict, + size_t *posErr = NULL) +{ + // don't use str.length() here as the ASCII buffer is shorter than it for + // strings with embedded NULs + return wxBase64Decode(src.ToAscii(), wxNO_LEN, mode, posErr); +} + +#endif // wxUSE_BASE64 + +#endif // _WX_BASE64_H_ diff --git a/wxmsw/include/wx-3.0/wx/beforestd.h b/wxmsw/include/wx-3.0/wx/beforestd.h new file mode 100644 index 00000000..cc335d31 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/beforestd.h @@ -0,0 +1,75 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/beforestd.h +// Purpose: #include before STL headers +// Author: Vadim Zeitlin +// Modified by: +// Created: 07/07/03 +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/** + Unfortunately, when compiling at maximum warning level, the standard + headers themselves may generate warnings -- and really lots of them. So + before including them, this header should be included to temporarily + suppress the warnings and after this the header afterstd.h should be + included to enable them back again. + + Note that there are intentionally no inclusion guards in this file, because + it can be included several times. + */ + +// VC 7.x isn't as bad as VC6 and doesn't give these warnings but eVC (which +// defines _MSC_VER as 1201) does need to be included as it's VC6-like +#if defined(__VISUALC__) && __VISUALC__ <= 1201 + // these warning have to be disabled and not just temporarily disabled + // because they will be given at the end of the compilation of the + // current source and there is absolutely nothing we can do about them so + // disable them before warning(push) below + + // 'foo': unreferenced inline function has been removed + #pragma warning(disable:4514) + + // 'function' : function not inlined + #pragma warning(disable:4710) + + // 'id': identifier was truncated to 'num' characters in the debug info + #pragma warning(disable:4786) + + // MSVC 5 does not have this + #if __VISUALC__ > 1100 + // we have to disable (and reenable in afterstd.h) this one because, + // even though it is of level 4, it is not disabled by warning(push, 1) + // below for VC7.1! + + // unreachable code + #pragma warning(disable:4702) + + #pragma warning(push, 1) + #else // VC 5 + // 'expression' : signed/unsigned mismatch + #pragma warning(disable:4018) + + // 'identifier' : unreferenced formal parameter + #pragma warning(disable:4100) + + // 'conversion' : conversion from 'type1' to 'type2', + // possible loss of data + #pragma warning(disable:4244) + + // C++ language change: to explicitly specialize class template + // 'identifier' use the following syntax + #pragma warning(disable:4663) + #endif +#endif // VC++ < 7 + +/** + GCC's visibility support is broken for libstdc++ in some older versions + (namely Debian/Ubuntu's GCC 4.1, see + https://bugs.launchpad.net/ubuntu/+source/gcc-4.1/+bug/109262). We fix it + here by mimicking newer versions' behaviour of using default visibility + for libstdc++ code. + */ +#if defined(HAVE_VISIBILITY) && defined(HAVE_BROKEN_LIBSTDCXX_VISIBILITY) + #pragma GCC visibility push(default) +#endif diff --git a/wxmsw/include/wx-3.0/wx/bitmap.h b/wxmsw/include/wx-3.0/wx/bitmap.h new file mode 100644 index 00000000..6d9ffe71 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/bitmap.h @@ -0,0 +1,323 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/bitmap.h +// Purpose: wxBitmap class interface +// Author: Vaclav Slavik +// Modified by: +// Created: 22.04.01 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BITMAP_H_BASE_ +#define _WX_BITMAP_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/string.h" +#include "wx/gdicmn.h" // for wxBitmapType +#include "wx/colour.h" +#include "wx/image.h" + +class WXDLLIMPEXP_FWD_CORE wxBitmap; +class WXDLLIMPEXP_FWD_CORE wxBitmapHandler; +class WXDLLIMPEXP_FWD_CORE wxIcon; +class WXDLLIMPEXP_FWD_CORE wxMask; +class WXDLLIMPEXP_FWD_CORE wxPalette; +class WXDLLIMPEXP_FWD_CORE wxDC; + +// ---------------------------------------------------------------------------- +// wxVariant support +// ---------------------------------------------------------------------------- + +#if wxUSE_VARIANT +#include "wx/variant.h" +DECLARE_VARIANT_OBJECT_EXPORTED(wxBitmap,WXDLLIMPEXP_CORE) +#endif + +// ---------------------------------------------------------------------------- +// wxMask represents the transparent area of the bitmap +// ---------------------------------------------------------------------------- + +// TODO: all implementation of wxMask, except the generic one, +// do not derive from wxMaskBase,,, they should +class WXDLLIMPEXP_CORE wxMaskBase : public wxObject +{ +public: + // create the mask from bitmap pixels of the given colour + bool Create(const wxBitmap& bitmap, const wxColour& colour); + +#if wxUSE_PALETTE + // create the mask from bitmap pixels with the given palette index + bool Create(const wxBitmap& bitmap, int paletteIndex); +#endif // wxUSE_PALETTE + + // create the mask from the given mono bitmap + bool Create(const wxBitmap& bitmap); + +protected: + // this function is called from Create() to free the existing mask data + virtual void FreeData() = 0; + + // these functions must be overridden to implement the corresponding public + // Create() methods, they shouldn't call FreeData() as it's already called + // by the public wrappers + virtual bool InitFromColour(const wxBitmap& bitmap, + const wxColour& colour) = 0; + virtual bool InitFromMonoBitmap(const wxBitmap& bitmap) = 0; +}; + +#if defined(__WXDFB__) || \ + defined(__WXMAC__) || \ + defined(__WXGTK__) || \ + defined(__WXCOCOA__) || \ + defined(__WXMOTIF__) || \ + defined(__WXX11__) + #define wxUSE_BITMAP_BASE 1 +#else + #define wxUSE_BITMAP_BASE 0 +#endif + +// a more readable way to tell +#define wxBITMAP_SCREEN_DEPTH (-1) + + +// ---------------------------------------------------------------------------- +// wxBitmapHelpers: container for various bitmap methods common to all ports. +// ---------------------------------------------------------------------------- + +// Unfortunately, currently wxBitmap does not inherit from wxBitmapBase on all +// platforms and this is not easy to fix. So we extract at least some common +// methods into this class from which both wxBitmapBase (and hence wxBitmap on +// all platforms where it does inherit from it) and wxBitmap in wxMSW and other +// exceptional ports (only wxPM and old wxCocoa) inherit. +class WXDLLIMPEXP_CORE wxBitmapHelpers +{ +public: + // Create a new wxBitmap from the PNG data in the given buffer. + static wxBitmap NewFromPNGData(const void* data, size_t size); +}; + + +// All ports except wxMSW and wxOS2 use wxBitmapHandler and wxBitmapBase as +// base class for wxBitmapHandler; wxMSW and wxOS2 use wxGDIImageHandler as +// base class since it allows some code reuse there. +#if wxUSE_BITMAP_BASE + +// ---------------------------------------------------------------------------- +// wxBitmapHandler: class which knows how to create/load/save bitmaps in +// different formats +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxBitmapHandler : public wxObject +{ +public: + wxBitmapHandler() { m_type = wxBITMAP_TYPE_INVALID; } + virtual ~wxBitmapHandler() { } + + // NOTE: the following functions should be pure virtuals, but they aren't + // because otherwise almost all ports would have to implement + // them as "return false"... + + virtual bool Create(wxBitmap *WXUNUSED(bitmap), const void* WXUNUSED(data), + wxBitmapType WXUNUSED(type), int WXUNUSED(width), int WXUNUSED(height), + int WXUNUSED(depth) = 1) + { return false; } + + virtual bool LoadFile(wxBitmap *WXUNUSED(bitmap), const wxString& WXUNUSED(name), + wxBitmapType WXUNUSED(type), int WXUNUSED(desiredWidth), + int WXUNUSED(desiredHeight)) + { return false; } + + virtual bool SaveFile(const wxBitmap *WXUNUSED(bitmap), const wxString& WXUNUSED(name), + wxBitmapType WXUNUSED(type), const wxPalette *WXUNUSED(palette) = NULL) const + { return false; } + + void SetName(const wxString& name) { m_name = name; } + void SetExtension(const wxString& ext) { m_extension = ext; } + void SetType(wxBitmapType type) { m_type = type; } + const wxString& GetName() const { return m_name; } + const wxString& GetExtension() const { return m_extension; } + wxBitmapType GetType() const { return m_type; } + +private: + wxString m_name; + wxString m_extension; + wxBitmapType m_type; + + DECLARE_ABSTRACT_CLASS(wxBitmapHandler) +}; + +// ---------------------------------------------------------------------------- +// wxBitmap: class which represents platform-dependent bitmap (unlike wxImage) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxBitmapBase : public wxGDIObject, + public wxBitmapHelpers +{ +public: + /* + Derived class must implement these: + + wxBitmap(); + wxBitmap(const wxBitmap& bmp); + wxBitmap(const char bits[], int width, int height, int depth = 1); + wxBitmap(int width, int height, int depth = wxBITMAP_SCREEN_DEPTH); + wxBitmap(const wxSize& sz, int depth = wxBITMAP_SCREEN_DEPTH); + wxBitmap(const char* const* bits); + wxBitmap(const wxString &filename, wxBitmapType type = wxBITMAP_TYPE_XPM); + wxBitmap(const wxImage& image, int depth = wxBITMAP_SCREEN_DEPTH); + + static void InitStandardHandlers(); + */ + + virtual bool Create(int width, int height, int depth = wxBITMAP_SCREEN_DEPTH) = 0; + virtual bool Create(const wxSize& sz, int depth = wxBITMAP_SCREEN_DEPTH) = 0; + virtual bool CreateScaled(int w, int h, int d, double logicalScale) + { return Create(w*logicalScale,h*logicalScale,d); } + + virtual int GetHeight() const = 0; + virtual int GetWidth() const = 0; + virtual int GetDepth() const = 0; + + wxSize GetSize() const + { return wxSize(GetWidth(), GetHeight()); } + + // support for scaled bitmaps + virtual double GetScaleFactor() const { return 1.0; } + virtual double GetScaledWidth() const { return GetWidth() / GetScaleFactor(); } + virtual double GetScaledHeight() const { return GetHeight() / GetScaleFactor(); } + virtual wxSize GetScaledSize() const + { return wxSize(GetScaledWidth(), GetScaledHeight()); } + +#if wxUSE_IMAGE + virtual wxImage ConvertToImage() const = 0; + + // Convert to disabled (dimmed) bitmap. + wxBitmap ConvertToDisabled(unsigned char brightness = 255) const; +#endif // wxUSE_IMAGE + + virtual wxMask *GetMask() const = 0; + virtual void SetMask(wxMask *mask) = 0; + + virtual wxBitmap GetSubBitmap(const wxRect& rect) const = 0; + + virtual bool SaveFile(const wxString &name, wxBitmapType type, + const wxPalette *palette = NULL) const = 0; + virtual bool LoadFile(const wxString &name, wxBitmapType type) = 0; + + /* + If raw bitmap access is supported (see wx/rawbmp.h), the following + methods should be implemented: + + virtual bool GetRawData(wxRawBitmapData *data) = 0; + virtual void UngetRawData(wxRawBitmapData *data) = 0; + */ + +#if wxUSE_PALETTE + virtual wxPalette *GetPalette() const = 0; + virtual void SetPalette(const wxPalette& palette) = 0; +#endif // wxUSE_PALETTE + + // copies the contents and mask of the given (colour) icon to the bitmap + virtual bool CopyFromIcon(const wxIcon& icon) = 0; + + // implementation: + virtual void SetHeight(int height) = 0; + virtual void SetWidth(int width) = 0; + virtual void SetDepth(int depth) = 0; + + // Format handling + static inline wxList& GetHandlers() { return sm_handlers; } + static void AddHandler(wxBitmapHandler *handler); + static void InsertHandler(wxBitmapHandler *handler); + static bool RemoveHandler(const wxString& name); + static wxBitmapHandler *FindHandler(const wxString& name); + static wxBitmapHandler *FindHandler(const wxString& extension, wxBitmapType bitmapType); + static wxBitmapHandler *FindHandler(wxBitmapType bitmapType); + + //static void InitStandardHandlers(); + // (wxBitmap must implement this one) + + static void CleanUpHandlers(); + + // this method is only used by the generic implementation of wxMask + // currently but could be useful elsewhere in the future: it can be + // overridden to quantize the colour to correspond to bitmap colour depth + // if necessary; default implementation simply returns the colour as is + virtual wxColour QuantizeColour(const wxColour& colour) const + { + return colour; + } + +protected: + static wxList sm_handlers; + + DECLARE_ABSTRACT_CLASS(wxBitmapBase) +}; + +#endif // wxUSE_BITMAP_BASE + + +// the wxBITMAP_DEFAULT_TYPE constant defines the default argument value +// for wxBitmap's ctor and wxBitmap::LoadFile() functions. +#if defined(__WXMSW__) + #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_BMP_RESOURCE + #include "wx/msw/bitmap.h" +#elif defined(__WXMOTIF__) + #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #include "wx/x11/bitmap.h" +#elif defined(__WXGTK20__) + #ifdef __WINDOWS__ + #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_BMP_RESOURCE + #else + #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #endif + #include "wx/gtk/bitmap.h" +#elif defined(__WXGTK__) + #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #include "wx/gtk1/bitmap.h" +#elif defined(__WXX11__) + #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #include "wx/x11/bitmap.h" +#elif defined(__WXDFB__) + #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_BMP_RESOURCE + #include "wx/dfb/bitmap.h" +#elif defined(__WXMAC__) + #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_PICT_RESOURCE + #include "wx/osx/bitmap.h" +#elif defined(__WXCOCOA__) + #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_BMP_RESOURCE + #include "wx/cocoa/bitmap.h" +#elif defined(__WXPM__) + #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_BMP_RESOURCE + #include "wx/os2/bitmap.h" +#endif + +#if wxUSE_IMAGE +inline +wxBitmap +#if wxUSE_BITMAP_BASE +wxBitmapBase:: +#else +wxBitmap:: +#endif +ConvertToDisabled(unsigned char brightness) const +{ + return ConvertToImage().ConvertToDisabled(brightness); +} +#endif // wxUSE_IMAGE + +// we must include generic mask.h after wxBitmap definition +#if defined(__WXDFB__) + #define wxUSE_GENERIC_MASK 1 +#else + #define wxUSE_GENERIC_MASK 0 +#endif + +#if wxUSE_GENERIC_MASK + #include "wx/generic/mask.h" +#endif + +#endif // _WX_BITMAP_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/bmpbuttn.h b/wxmsw/include/wx-3.0/wx/bmpbuttn.h new file mode 100644 index 00000000..ead0ba81 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/bmpbuttn.h @@ -0,0 +1,144 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/bmpbuttn.h +// Purpose: wxBitmapButton class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 25.08.00 +// Copyright: (c) 2000 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BMPBUTTON_H_BASE_ +#define _WX_BMPBUTTON_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_BMPBUTTON + +#include "wx/button.h" + +// FIXME: right now only wxMSW, wxGTK and wxOSX implement bitmap support in wxButton +// itself, this shouldn't be used for the other platforms neither +// when all of them do it +#if (defined(__WXMSW__) || defined(__WXGTK20__) || defined(__WXOSX__)) && !defined(__WXUNIVERSAL__) + #define wxHAS_BUTTON_BITMAP +#endif + +class WXDLLIMPEXP_FWD_CORE wxBitmapButton; + +// ---------------------------------------------------------------------------- +// wxBitmapButton: a button which shows bitmaps instead of the usual string. +// It has different bitmaps for different states (focused/disabled/pressed) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxBitmapButtonBase : public wxButton +{ +public: + wxBitmapButtonBase() + { +#ifndef wxHAS_BUTTON_BITMAP + m_marginX = + m_marginY = 0; +#endif // wxHAS_BUTTON_BITMAP + } + + bool Create(wxWindow *parent, + wxWindowID winid, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) + { + // We use wxBU_NOTEXT to let the base class Create() know that we are + // not going to show the label: this is a hack needed for wxGTK where + // we can show both label and bitmap only with GTK 2.6+ but we always + // can show just one of them and this style allows us to choose which + // one we need. + // + // And we also use wxBU_EXACTFIT to avoid being resized up to the + // standard button size as this doesn't make sense for bitmap buttons + // which are not standard anyhow and should fit their bitmap size. + return wxButton::Create(parent, winid, "", + pos, size, + style | wxBU_NOTEXT | wxBU_EXACTFIT, + validator, name); + } + + // Special creation function for a standard "Close" bitmap. It allows to + // simply create a close button with the image appropriate for the common + // platform. + static wxBitmapButton* NewCloseButton(wxWindow* parent, wxWindowID winid); + + + // set/get the margins around the button + virtual void SetMargins(int x, int y) + { + DoSetBitmapMargins(x, y); + } + + int GetMarginX() const { return DoGetBitmapMargins().x; } + int GetMarginY() const { return DoGetBitmapMargins().y; } + + // deprecated synonym for SetBitmapLabel() +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED_INLINE( void SetLabel(const wxBitmap& bitmap), + SetBitmapLabel(bitmap); ) + + // prevent virtual function hiding + virtual void SetLabel(const wxString& label) + { wxWindow::SetLabel(label); } +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: +#ifndef wxHAS_BUTTON_BITMAP + // function called when any of the bitmaps changes + virtual void OnSetBitmap() { InvalidateBestSize(); Refresh(); } + + virtual wxBitmap DoGetBitmap(State which) const { return m_bitmaps[which]; } + virtual void DoSetBitmap(const wxBitmap& bitmap, State which) + { m_bitmaps[which] = bitmap; OnSetBitmap(); } + + virtual wxSize DoGetBitmapMargins() const + { + return wxSize(m_marginX, m_marginY); + } + + virtual void DoSetBitmapMargins(int x, int y) + { + m_marginX = x; + m_marginY = y; + } + + // the bitmaps for various states + wxBitmap m_bitmaps[State_Max]; + + // the margins around the bitmap + int m_marginX, + m_marginY; +#endif // !wxHAS_BUTTON_BITMAP + + wxDECLARE_NO_COPY_CLASS(wxBitmapButtonBase); +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/bmpbuttn.h" +#elif defined(__WXMSW__) + #include "wx/msw/bmpbuttn.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/bmpbuttn.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/bmpbuttn.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/bmpbuttn.h" +#elif defined(__WXMAC__) + #include "wx/osx/bmpbuttn.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/bmpbuttn.h" +#elif defined(__WXPM__) + #include "wx/os2/bmpbuttn.h" +#endif + +#endif // wxUSE_BMPBUTTON + +#endif // _WX_BMPBUTTON_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/bmpcbox.h b/wxmsw/include/wx-3.0/wx/bmpcbox.h new file mode 100644 index 00000000..dd695257 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/bmpcbox.h @@ -0,0 +1,124 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/bmpcbox.h +// Purpose: wxBitmapComboBox base header +// Author: Jaakko Salli +// Modified by: +// Created: Aug-31-2006 +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BMPCBOX_H_BASE_ +#define _WX_BMPCBOX_H_BASE_ + + +#include "wx/defs.h" + +#if wxUSE_BITMAPCOMBOBOX + +#include "wx/bitmap.h" + +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxItemContainer; + +// Define wxBITMAPCOMBOBOX_OWNERDRAWN_BASED for platforms which +// wxBitmapComboBox implementation utilizes ownerdrawn combobox +// (either native or generic). +#if !defined(__WXGTK20__) || defined(__WXUNIVERSAL__) + #define wxBITMAPCOMBOBOX_OWNERDRAWN_BASED + +class WXDLLIMPEXP_FWD_CORE wxDC; +#endif + +extern WXDLLIMPEXP_DATA_ADV(const char) wxBitmapComboBoxNameStr[]; + + +class WXDLLIMPEXP_ADV wxBitmapComboBoxBase +{ +public: + // ctors and such + wxBitmapComboBoxBase() { Init(); } + + virtual ~wxBitmapComboBoxBase() { } + + // Sets the image for the given item. + virtual void SetItemBitmap(unsigned int n, const wxBitmap& bitmap) = 0; + +#if !defined(wxBITMAPCOMBOBOX_OWNERDRAWN_BASED) + + // Returns the image of the item with the given index. + virtual wxBitmap GetItemBitmap(unsigned int n) const = 0; + + // Returns size of the image used in list + virtual wxSize GetBitmapSize() const = 0; + +private: + void Init() {} + +#else // wxBITMAPCOMBOBOX_OWNERDRAWN_BASED + + // Returns the image of the item with the given index. + virtual wxBitmap GetItemBitmap(unsigned int n) const; + + // Returns size of the image used in list + virtual wxSize GetBitmapSize() const + { + return m_usedImgSize; + } + +protected: + + // Returns pointer to the combobox item container + virtual wxItemContainer* GetItemContainer() = 0; + + // Return pointer to the owner-drawn combobox control + virtual wxWindow* GetControl() = 0; + + // wxItemContainer functions + void BCBDoClear(); + void BCBDoDeleteOneItem(unsigned int n); + + void DoSetItemBitmap(unsigned int n, const wxBitmap& bitmap); + + void DrawBackground(wxDC& dc, const wxRect& rect, int item, int flags) const; + void DrawItem(wxDC& dc, const wxRect& rect, int item, const wxString& text, + int flags) const; + wxCoord MeasureItem(size_t item) const; + + // Returns true if image size was affected + virtual bool OnAddBitmap(const wxBitmap& bitmap); + + // Recalculates amount of empty space needed in front of text + // in control itself. Returns number that can be passed to + // wxOwnerDrawnComboBox::SetCustomPaintWidth() and similar + // functions. + virtual int DetermineIndent(); + + void UpdateInternals(); + + wxArrayPtrVoid m_bitmaps; // Images associated with items + wxSize m_usedImgSize; // Size of bitmaps + + int m_imgAreaWidth; // Width and height of area next to text field + int m_fontHeight; + int m_indent; + +private: + void Init(); +#endif // !wxBITMAPCOMBOBOX_OWNERDRAWN_BASED/wxBITMAPCOMBOBOX_OWNERDRAWN_BASED +}; + + +#if defined(__WXUNIVERSAL__) + #include "wx/generic/bmpcbox.h" +#elif defined(__WXMSW__) + #include "wx/msw/bmpcbox.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/bmpcbox.h" +#else + #include "wx/generic/bmpcbox.h" +#endif + +#endif // wxUSE_BITMAPCOMBOBOX + +#endif // _WX_BMPCBOX_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/bookctrl.h b/wxmsw/include/wx-3.0/wx/bookctrl.h new file mode 100644 index 00000000..8b4fbb2f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/bookctrl.h @@ -0,0 +1,445 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/bookctrl.h +// Purpose: wxBookCtrlBase: common base class for wxList/Tree/Notebook +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.08.03 +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BOOKCTRL_H_ +#define _WX_BOOKCTRL_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_BOOKCTRL + +#include "wx/control.h" +#include "wx/dynarray.h" +#include "wx/withimages.h" + +WX_DEFINE_EXPORTED_ARRAY_PTR(wxWindow *, wxArrayPages); + +class WXDLLIMPEXP_FWD_CORE wxImageList; +class WXDLLIMPEXP_FWD_CORE wxBookCtrlEvent; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// wxBookCtrl hit results +enum +{ + wxBK_HITTEST_NOWHERE = 1, // not on tab + wxBK_HITTEST_ONICON = 2, // on icon + wxBK_HITTEST_ONLABEL = 4, // on label + wxBK_HITTEST_ONITEM = wxBK_HITTEST_ONICON | wxBK_HITTEST_ONLABEL, + wxBK_HITTEST_ONPAGE = 8 // not on tab control, but over the selected page +}; + +// wxBookCtrl flags (common for wxNotebook, wxListbook, wxChoicebook, wxTreebook) +#define wxBK_DEFAULT 0x0000 +#define wxBK_TOP 0x0010 +#define wxBK_BOTTOM 0x0020 +#define wxBK_LEFT 0x0040 +#define wxBK_RIGHT 0x0080 +#define wxBK_ALIGN_MASK (wxBK_TOP | wxBK_BOTTOM | wxBK_LEFT | wxBK_RIGHT) + +// ---------------------------------------------------------------------------- +// wxBookCtrlBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxBookCtrlBase : public wxControl, + public wxWithImages +{ +public: + // construction + // ------------ + + wxBookCtrlBase() + { + Init(); + } + + wxBookCtrlBase(wxWindow *parent, + wxWindowID winid, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString) + { + Init(); + + (void)Create(parent, winid, pos, size, style, name); + } + + // quasi ctor + bool Create(wxWindow *parent, + wxWindowID winid, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString); + + + // accessors + // --------- + + // get number of pages in the dialog + virtual size_t GetPageCount() const { return m_pages.size(); } + + // get the panel which represents the given page + virtual wxWindow *GetPage(size_t n) const { return m_pages[n]; } + + // get the current page or NULL if none + wxWindow *GetCurrentPage() const + { + const int n = GetSelection(); + return n == wxNOT_FOUND ? NULL : GetPage(n); + } + + // get the currently selected page or wxNOT_FOUND if none + virtual int GetSelection() const { return m_selection; } + + // set/get the title of a page + virtual bool SetPageText(size_t n, const wxString& strText) = 0; + virtual wxString GetPageText(size_t n) const = 0; + + + // image list stuff: each page may have an image associated with it (all + // images belong to the same image list) + // --------------------------------------------------------------------- + + // sets/returns item's image index in the current image list + virtual int GetPageImage(size_t n) const = 0; + virtual bool SetPageImage(size_t n, int imageId) = 0; + + + // geometry + // -------- + + // resize the notebook so that all pages will have the specified size + virtual void SetPageSize(const wxSize& size); + + // return the size of the area needed to accommodate the controller + wxSize GetControllerSize() const; + + // calculate the size of the control from the size of its page + // + // by default this simply returns size enough to fit both the page and the + // controller + virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const; + + // get/set size of area between book control area and page area + unsigned int GetInternalBorder() const { return m_internalBorder; } + void SetInternalBorder(unsigned int border) { m_internalBorder = border; } + + // Sets/gets the margin around the controller + void SetControlMargin(int margin) { m_controlMargin = margin; } + int GetControlMargin() const { return m_controlMargin; } + + // returns true if we have wxBK_TOP or wxBK_BOTTOM style + bool IsVertical() const { return HasFlag(wxBK_BOTTOM | wxBK_TOP); } + + // set/get option to shrink to fit current page + void SetFitToCurrentPage(bool fit) { m_fitToCurrentPage = fit; } + bool GetFitToCurrentPage() const { return m_fitToCurrentPage; } + + // returns the sizer containing the control, if any + wxSizer* GetControlSizer() const { return m_controlSizer; } + + + // operations + // ---------- + + // remove one page from the control and delete it + virtual bool DeletePage(size_t n); + + // remove one page from the notebook, without deleting it + virtual bool RemovePage(size_t n) + { + DoInvalidateBestSize(); + return DoRemovePage(n) != NULL; + } + + // remove all pages and delete them + virtual bool DeleteAllPages() + { + m_selection = wxNOT_FOUND; + DoInvalidateBestSize(); + WX_CLEAR_ARRAY(m_pages); + return true; + } + + // adds a new page to the control + virtual bool AddPage(wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = NO_IMAGE) + { + DoInvalidateBestSize(); + return InsertPage(GetPageCount(), page, text, bSelect, imageId); + } + + // the same as AddPage(), but adds the page at the specified position + virtual bool InsertPage(size_t n, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = NO_IMAGE) = 0; + + // set the currently selected page, return the index of the previously + // selected one (or wxNOT_FOUND on error) + // + // NB: this function will generate PAGE_CHANGING/ED events + virtual int SetSelection(size_t n) = 0; + + // acts as SetSelection but does not generate events + virtual int ChangeSelection(size_t n) = 0; + + + // cycle thru the pages + void AdvanceSelection(bool forward = true) + { + int nPage = GetNextPage(forward); + if ( nPage != wxNOT_FOUND ) + { + // cast is safe because of the check above + SetSelection((size_t)nPage); + } + } + + // return the index of the given page or wxNOT_FOUND + int FindPage(const wxWindow* page) const; + + // hit test: returns which page is hit and, optionally, where (icon, label) + virtual int HitTest(const wxPoint& WXUNUSED(pt), + long * WXUNUSED(flags) = NULL) const + { + return wxNOT_FOUND; + } + + + // we do have multiple pages + virtual bool HasMultiplePages() const { return true; } + + // we don't want focus for ourselves + virtual bool AcceptsFocus() const { return false; } + + // returns true if the platform should explicitly apply a theme border + virtual bool CanApplyThemeBorder() const { return false; } + +protected: + // flags for DoSetSelection() + enum + { + SetSelection_SendEvent = 1 + }; + + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + // After the insertion of the page in the method InsertPage, calling this + // method sets the selection to the given page or the first one if there is + // still no selection. The "selection changed" event is sent only if + // bSelect is true, so when it is false, no event is sent even if the + // selection changed from wxNOT_FOUND to 0 when inserting the first page. + // + // Returns true if the selection was set to the specified page (explicitly + // because of bSelect == true or implicitly because it's the first page) or + // false otherwise. + bool DoSetSelectionAfterInsertion(size_t n, bool bSelect); + + // Update the selection after removing the page at the given index, + // typically called from the derived class overridden DoRemovePage(). + void DoSetSelectionAfterRemoval(size_t n); + + // set the selection to the given page, sending the events (which can + // possibly prevent the page change from taking place) if SendEvent flag is + // included + virtual int DoSetSelection(size_t nPage, int flags = 0); + + // if the derived class uses DoSetSelection() for implementing + // [Set|Change]Selection, it must override UpdateSelectedPage(), + // CreatePageChangingEvent() and MakeChangedEvent(), but as it might not + // use it, these functions are not pure virtual + + // called to notify the control about a new current page + virtual void UpdateSelectedPage(size_t WXUNUSED(newsel)) + { wxFAIL_MSG(wxT("Override this function!")); } + + // create a new "page changing" event + virtual wxBookCtrlEvent* CreatePageChangingEvent() const + { wxFAIL_MSG(wxT("Override this function!")); return NULL; } + + // modify the event created by CreatePageChangingEvent() to "page changed" + // event, usually by just calling SetEventType() on it + virtual void MakeChangedEvent(wxBookCtrlEvent& WXUNUSED(event)) + { wxFAIL_MSG(wxT("Override this function!")); } + + + // The derived class also may override the following method, also called + // from DoSetSelection(), to show/hide pages differently. + virtual void DoShowPage(wxWindow* page, bool show) { page->Show(show); } + + + // Should we accept NULL page pointers in Add/InsertPage()? + // + // Default is no but derived classes may override it if they can treat NULL + // pages in some sensible way (e.g. wxTreebook overrides this to allow + // having nodes without any associated page) + virtual bool AllowNullPage() const { return false; } + + // Remove the page and return a pointer to it. + // + // It also needs to update the current selection if necessary, i.e. if the + // page being removed comes before the selected one and the helper method + // DoSetSelectionAfterRemoval() can be used for this. + virtual wxWindow *DoRemovePage(size_t page) = 0; + + // our best size is the size which fits all our pages + virtual wxSize DoGetBestSize() const; + + // helper: get the next page wrapping if we reached the end + int GetNextPage(bool forward) const; + + // Lay out controls + virtual void DoSize(); + + // This method also invalidates the size of the controller and should be + // called instead of just InvalidateBestSize() whenever pages are added or + // removed as this also affects the controller + void DoInvalidateBestSize(); + +#if wxUSE_HELP + // Show the help for the corresponding page + void OnHelp(wxHelpEvent& event); +#endif // wxUSE_HELP + + + // the array of all pages of this control + wxArrayPages m_pages; + + // get the page area + virtual wxRect GetPageRect() const; + + // event handlers + void OnSize(wxSizeEvent& event); + + // controller buddy if available, NULL otherwise (usually for native book controls like wxNotebook) + wxControl *m_bookctrl; + + // Whether to shrink to fit current page + bool m_fitToCurrentPage; + + // the sizer containing the choice control + wxSizer *m_controlSizer; + + // the margin around the choice control + int m_controlMargin; + + // The currently selected page (in range 0..m_pages.size()-1 inclusive) or + // wxNOT_FOUND if none (this can normally only be the case for an empty + // control without any pages). + int m_selection; + +private: + + // common part of all ctors + void Init(); + + // internal border + unsigned int m_internalBorder; + + DECLARE_ABSTRACT_CLASS(wxBookCtrlBase) + wxDECLARE_NO_COPY_CLASS(wxBookCtrlBase); + + DECLARE_EVENT_TABLE() +}; + +// ---------------------------------------------------------------------------- +// wxBookCtrlEvent: page changing events generated by book classes +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxBookCtrlEvent : public wxNotifyEvent +{ +public: + wxBookCtrlEvent(wxEventType commandType = wxEVT_NULL, int winid = 0, + int nSel = wxNOT_FOUND, int nOldSel = wxNOT_FOUND) + : wxNotifyEvent(commandType, winid) + { + m_nSel = nSel; + m_nOldSel = nOldSel; + } + + wxBookCtrlEvent(const wxBookCtrlEvent& event) + : wxNotifyEvent(event) + { + m_nSel = event.m_nSel; + m_nOldSel = event.m_nOldSel; + } + + virtual wxEvent *Clone() const { return new wxBookCtrlEvent(*this); } + + // accessors + // the currently selected page (wxNOT_FOUND if none) + int GetSelection() const { return m_nSel; } + void SetSelection(int nSel) { m_nSel = nSel; } + // the page that was selected before the change (wxNOT_FOUND if none) + int GetOldSelection() const { return m_nOldSel; } + void SetOldSelection(int nOldSel) { m_nOldSel = nOldSel; } + +private: + int m_nSel, // currently selected page + m_nOldSel; // previously selected page + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxBookCtrlEvent) +}; + +typedef void (wxEvtHandler::*wxBookCtrlEventFunction)(wxBookCtrlEvent&); + +#define wxBookCtrlEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxBookCtrlEventFunction, func) + +// obsolete name, defined for compatibility only +#define wxBookCtrlBaseEvent wxBookCtrlEvent + +// make a default book control for given platform +#if wxUSE_NOTEBOOK + // dedicated to majority of desktops + #include "wx/notebook.h" + #define wxBookCtrl wxNotebook + #define wxEVT_BOOKCTRL_PAGE_CHANGED wxEVT_NOTEBOOK_PAGE_CHANGED + #define wxEVT_BOOKCTRL_PAGE_CHANGING wxEVT_NOTEBOOK_PAGE_CHANGING + #define EVT_BOOKCTRL_PAGE_CHANGED(id, fn) EVT_NOTEBOOK_PAGE_CHANGED(id, fn) + #define EVT_BOOKCTRL_PAGE_CHANGING(id, fn) EVT_NOTEBOOK_PAGE_CHANGING(id, fn) +#else + // dedicated to Smartphones + #include "wx/choicebk.h" + #define wxBookCtrl wxChoicebook + #define wxEVT_BOOKCTRL_PAGE_CHANGED wxEVT_CHOICEBOOK_PAGE_CHANGED + #define wxEVT_BOOKCTRL_PAGE_CHANGING wxEVT_CHOICEBOOK_PAGE_CHANGING + #define EVT_BOOKCTRL_PAGE_CHANGED(id, fn) EVT_CHOICEBOOK_PAGE_CHANGED(id, fn) + #define EVT_BOOKCTRL_PAGE_CHANGING(id, fn) EVT_CHOICEBOOK_PAGE_CHANGING(id, fn) +#endif + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_BOOKCTRL_PAGE_CHANGED wxEVT_BOOKCTRL_PAGE_CHANGED +#define wxEVT_COMMAND_BOOKCTRL_PAGE_CHANGING wxEVT_BOOKCTRL_PAGE_CHANGING + +#if WXWIN_COMPATIBILITY_2_6 + #define wxBC_TOP wxBK_TOP + #define wxBC_BOTTOM wxBK_BOTTOM + #define wxBC_LEFT wxBK_LEFT + #define wxBC_RIGHT wxBK_RIGHT + #define wxBC_DEFAULT wxBK_DEFAULT +#endif + +#endif // wxUSE_BOOKCTRL + +#endif // _WX_BOOKCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/brush.h b/wxmsw/include/wx-3.0/wx/brush.h new file mode 100644 index 00000000..1bf2c300 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/brush.h @@ -0,0 +1,136 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/brush.h +// Purpose: Includes platform-specific wxBrush file +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BRUSH_H_BASE_ +#define _WX_BRUSH_H_BASE_ + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/gdiobj.h" +#include "wx/gdicmn.h" // for wxGDIObjListBase + +// NOTE: these values cannot be combined together! +enum wxBrushStyle +{ + wxBRUSHSTYLE_INVALID = -1, + + wxBRUSHSTYLE_SOLID = wxSOLID, + wxBRUSHSTYLE_TRANSPARENT = wxTRANSPARENT, + wxBRUSHSTYLE_STIPPLE_MASK_OPAQUE = wxSTIPPLE_MASK_OPAQUE, + wxBRUSHSTYLE_STIPPLE_MASK = wxSTIPPLE_MASK, + wxBRUSHSTYLE_STIPPLE = wxSTIPPLE, + wxBRUSHSTYLE_BDIAGONAL_HATCH = wxHATCHSTYLE_BDIAGONAL, + wxBRUSHSTYLE_CROSSDIAG_HATCH = wxHATCHSTYLE_CROSSDIAG, + wxBRUSHSTYLE_FDIAGONAL_HATCH = wxHATCHSTYLE_FDIAGONAL, + wxBRUSHSTYLE_CROSS_HATCH = wxHATCHSTYLE_CROSS, + wxBRUSHSTYLE_HORIZONTAL_HATCH = wxHATCHSTYLE_HORIZONTAL, + wxBRUSHSTYLE_VERTICAL_HATCH = wxHATCHSTYLE_VERTICAL, + wxBRUSHSTYLE_FIRST_HATCH = wxHATCHSTYLE_FIRST, + wxBRUSHSTYLE_LAST_HATCH = wxHATCHSTYLE_LAST +}; + + +// wxBrushBase +class WXDLLIMPEXP_CORE wxBrushBase: public wxGDIObject +{ +public: + virtual ~wxBrushBase() { } + + virtual void SetColour(const wxColour& col) = 0; + virtual void SetColour(unsigned char r, unsigned char g, unsigned char b) = 0; + virtual void SetStyle(wxBrushStyle style) = 0; + virtual void SetStipple(const wxBitmap& stipple) = 0; + + virtual wxColour GetColour() const = 0; + virtual wxBrushStyle GetStyle() const = 0; + virtual wxBitmap *GetStipple() const = 0; + + virtual bool IsHatch() const + { return (GetStyle()>=wxBRUSHSTYLE_FIRST_HATCH) && (GetStyle()<=wxBRUSHSTYLE_LAST_HATCH); } + + // Convenient helpers for testing whether the brush is a transparent one: + // unlike GetStyle() == wxBRUSHSTYLE_TRANSPARENT, they work correctly even + // if the brush is invalid (they both return false in this case). + bool IsTransparent() const + { + return IsOk() && GetStyle() == wxBRUSHSTYLE_TRANSPARENT; + } + + bool IsNonTransparent() const + { + return IsOk() && GetStyle() != wxBRUSHSTYLE_TRANSPARENT; + } +}; + +#if defined(__WXMSW__) + #include "wx/msw/brush.h" +#elif defined(__WXMOTIF__) || defined(__WXX11__) + #include "wx/x11/brush.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/brush.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/brush.h" +#elif defined(__WXDFB__) + #include "wx/dfb/brush.h" +#elif defined(__WXMAC__) + #include "wx/osx/brush.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/brush.h" +#elif defined(__WXPM__) + #include "wx/os2/brush.h" +#endif + +class WXDLLIMPEXP_CORE wxBrushList: public wxGDIObjListBase +{ +public: + wxBrush *FindOrCreateBrush(const wxColour& colour, + wxBrushStyle style = wxBRUSHSTYLE_SOLID); + +#if FUTURE_WXWIN_COMPATIBILITY_3_0 + wxBrush *FindOrCreateBrush(const wxColour& colour, int style) + { return FindOrCreateBrush(colour, (wxBrushStyle)style); } +#endif + +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( void AddBrush(wxBrush*) ); + wxDEPRECATED( void RemoveBrush(wxBrush*) ); +#endif +}; + +extern WXDLLIMPEXP_DATA_CORE(wxBrushList*) wxTheBrushList; + +// provide comparison operators to allow code such as +// +// if ( brush.GetStyle() == wxTRANSPARENT ) +// +// to compile without warnings which it would otherwise provoke from some +// compilers as it compares elements of different enums +#if FUTURE_WXWIN_COMPATIBILITY_3_0 + +// Unfortunately some compilers have ambiguity issues when enum comparisons are +// overloaded so we have to disable the overloads in this case, see +// wxCOMPILER_NO_OVERLOAD_ON_ENUM definition in wx/platform.h for more details. +#ifndef wxCOMPILER_NO_OVERLOAD_ON_ENUM + +inline bool operator==(wxBrushStyle s, wxDeprecatedGUIConstants t) +{ + return static_cast(s) == static_cast(t); +} + +inline bool operator!=(wxBrushStyle s, wxDeprecatedGUIConstants t) +{ + return !(s == t); +} + +#endif // wxCOMPILER_NO_OVERLOAD_ON_ENUM + +#endif // FUTURE_WXWIN_COMPATIBILITY_3_0 + +#endif // _WX_BRUSH_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/buffer.h b/wxmsw/include/wx-3.0/wx/buffer.h new file mode 100644 index 00000000..9891494d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/buffer.h @@ -0,0 +1,624 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/buffer.h +// Purpose: auto buffer classes: buffers which automatically free memory +// Author: Vadim Zeitlin +// Modified by: +// Created: 12.04.99 +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BUFFER_H +#define _WX_BUFFER_H + +#include "wx/chartype.h" +#include "wx/wxcrtbase.h" + +#include // malloc() and free() + +class WXDLLIMPEXP_FWD_BASE wxCStrData; + +// ---------------------------------------------------------------------------- +// Special classes for (wide) character strings: they use malloc/free instead +// of new/delete +// ---------------------------------------------------------------------------- + +// helpers used by wxCharTypeBuffer +namespace wxPrivate +{ + +struct UntypedBufferData +{ + enum Kind + { + Owned, + NonOwned + }; + + UntypedBufferData(void *str, size_t len, Kind kind = Owned) + : m_str(str), m_length(len), m_ref(1), m_owned(kind == Owned) {} + + ~UntypedBufferData() + { + if ( m_owned ) + free(m_str); + } + + void *m_str; + size_t m_length; + + // "short" to have sizeof(Data)=12 on 32bit archs + unsigned short m_ref; + + bool m_owned; +}; + +// NB: this is defined in string.cpp and not the (non-existent) buffer.cpp +WXDLLIMPEXP_BASE UntypedBufferData * GetUntypedNullData(); + +} // namespace wxPrivate + + +// Reference-counted character buffer for storing string data. The buffer +// is only valid for as long as the "parent" object that provided the data +// is valid; see wxCharTypeBuffer for persistent variant. +template +class wxScopedCharTypeBuffer +{ +public: + typedef T CharType; + + wxScopedCharTypeBuffer() + { + m_data = GetNullData(); + } + + // Creates "non-owned" buffer, i.e. 'str' is not owned by the buffer + // and doesn't get freed by dtor. Used e.g. to point to wxString's internal + // storage. + static + const wxScopedCharTypeBuffer CreateNonOwned(const CharType *str, + size_t len = wxNO_LEN) + { + if ( len == wxNO_LEN ) + len = wxStrlen(str); + + wxScopedCharTypeBuffer buf; + if ( str ) + buf.m_data = new Data(const_cast(str), len, Data::NonOwned); + return buf; + } + + // Creates "owned" buffer, i.e. takes over ownership of 'str' and frees it + // in dtor (if ref.count reaches 0). + static + const wxScopedCharTypeBuffer CreateOwned(CharType *str, + size_t len = wxNO_LEN ) + { + if ( len == wxNO_LEN ) + len = wxStrlen(str); + + wxScopedCharTypeBuffer buf; + if ( str ) + buf.m_data = new Data(str, len); + return buf; + } + + wxScopedCharTypeBuffer(const wxScopedCharTypeBuffer& src) + { + m_data = src.m_data; + IncRef(); + } + + wxScopedCharTypeBuffer& operator=(const wxScopedCharTypeBuffer& src) + { + if ( &src == this ) + return *this; + + DecRef(); + m_data = src.m_data; + IncRef(); + + return *this; + } + + ~wxScopedCharTypeBuffer() + { + DecRef(); + } + + // NB: this method is only const for backward compatibility. It used to + // be needed for auto_ptr-like semantics of the copy ctor, but now + // that ref-counting is used, it's not really needed. + CharType *release() const + { + if ( m_data == GetNullData() ) + return NULL; + + wxASSERT_MSG( m_data->m_owned, wxT("can't release non-owned buffer") ); + wxASSERT_MSG( m_data->m_ref == 1, wxT("can't release shared buffer") ); + + CharType * const p = m_data->Get(); + + wxScopedCharTypeBuffer *self = const_cast(this); + self->m_data->Set(NULL, 0); + self->DecRef(); + + return p; + } + + void reset() + { + DecRef(); + } + + CharType *data() { return m_data->Get(); } + const CharType *data() const { return m_data->Get(); } + operator const CharType *() const { return data(); } + CharType operator[](size_t n) const { return data()[n]; } + + size_t length() const { return m_data->m_length; } + +protected: + // reference-counted data + struct Data : public wxPrivate::UntypedBufferData + { + Data(CharType *str, size_t len, Kind kind = Owned) + : wxPrivate::UntypedBufferData(str, len, kind) + { + } + + CharType *Get() const { return static_cast(m_str); } + void Set(CharType *str, size_t len) + { + m_str = str; + m_length = len; + } + }; + + // placeholder for NULL string, to simplify this code + static Data *GetNullData() + { + return static_cast(wxPrivate::GetUntypedNullData()); + } + + void IncRef() + { + if ( m_data == GetNullData() ) // exception, not ref-counted + return; + m_data->m_ref++; + } + + void DecRef() + { + if ( m_data == GetNullData() ) // exception, not ref-counted + return; + if ( --m_data->m_ref == 0 ) + delete m_data; + m_data = GetNullData(); + } + + // sets this object to a be copy of 'other'; if 'src' is non-owned, + // a deep copy is made and 'this' will contain new instance of the data + void MakeOwnedCopyOf(const wxScopedCharTypeBuffer& src) + { + this->DecRef(); + + if ( src.m_data == this->GetNullData() ) + { + this->m_data = this->GetNullData(); + } + else if ( src.m_data->m_owned ) + { + this->m_data = src.m_data; + this->IncRef(); + } + else + { + // if the scoped buffer had non-owned data, we have to make + // a copy here, because src.m_data->m_str is valid only for as long + // as 'src' exists + this->m_data = new Data + ( + StrCopy(src.data(), src.length()), + src.length() + ); + } + } + + static CharType *StrCopy(const CharType *src, size_t len) + { + CharType *dst = (CharType*)malloc(sizeof(CharType) * (len + 1)); + if ( dst ) + memcpy(dst, src, sizeof(CharType) * (len + 1)); + return dst; + } + +protected: + Data *m_data; +}; + +typedef wxScopedCharTypeBuffer wxScopedCharBuffer; +typedef wxScopedCharTypeBuffer wxScopedWCharBuffer; + + +// this buffer class always stores data in "owned" (persistent) manner +template +class wxCharTypeBuffer : public wxScopedCharTypeBuffer +{ +protected: + typedef typename wxScopedCharTypeBuffer::Data Data; + +public: + typedef T CharType; + + wxCharTypeBuffer(const CharType *str = NULL, size_t len = wxNO_LEN) + { + if ( str ) + { + if ( len == wxNO_LEN ) + len = wxStrlen(str); + this->m_data = new Data(this->StrCopy(str, len), len); + } + else + { + this->m_data = this->GetNullData(); + } + } + + wxCharTypeBuffer(size_t len) + { + CharType* const str = (CharType *)malloc((len + 1)*sizeof(CharType)); + if ( str ) + { + str[len] = (CharType)0; + + // There is a potential memory leak here if new throws because it + // fails to allocate Data, we ought to use new(nothrow) here, but + // this might fail to compile under some platforms so until this + // can be fully tested, just live with this (rather unlikely, as + // Data is a small object) potential leak. + this->m_data = new Data(str, len); + } + else + { + this->m_data = this->GetNullData(); + } + } + + wxCharTypeBuffer(const wxCharTypeBuffer& src) + : wxScopedCharTypeBuffer(src) {} + + wxCharTypeBuffer& operator=(const CharType *str) + { + this->DecRef(); + + if ( str ) + this->m_data = new Data(wxStrdup(str), wxStrlen(str)); + return *this; + } + + wxCharTypeBuffer& operator=(const wxCharTypeBuffer& src) + { + wxScopedCharTypeBuffer::operator=(src); + return *this; + } + + wxCharTypeBuffer(const wxScopedCharTypeBuffer& src) + { + this->MakeOwnedCopyOf(src); + } + + wxCharTypeBuffer& operator=(const wxScopedCharTypeBuffer& src) + { + MakeOwnedCopyOf(src); + return *this; + } + + bool extend(size_t len) + { + wxASSERT_MSG( this->m_data->m_owned, "cannot extend non-owned buffer" ); + wxASSERT_MSG( this->m_data->m_ref == 1, "can't extend shared buffer" ); + + CharType *str = + (CharType *)realloc(this->data(), (len + 1) * sizeof(CharType)); + if ( !str ) + return false; + + // For consistency with the ctor taking just the length, NUL-terminate + // the buffer. + str[len] = (CharType)0; + + if ( this->m_data == this->GetNullData() ) + { + this->m_data = new Data(str, len); + } + else + { + this->m_data->Set(str, len); + this->m_data->m_owned = true; + } + + return true; + } + + void shrink(size_t len) + { + wxASSERT_MSG( this->m_data->m_owned, "cannot shrink non-owned buffer" ); + wxASSERT_MSG( this->m_data->m_ref == 1, "can't shrink shared buffer" ); + + wxASSERT( len <= this->length() ); + + this->m_data->m_length = len; + this->data()[len] = 0; + } +}; + +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxScopedCharTypeBuffer ) +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxCharTypeBuffer ) + +class wxCharBuffer : public wxCharTypeBuffer +{ +public: + typedef wxCharTypeBuffer wxCharTypeBufferBase; + typedef wxScopedCharTypeBuffer wxScopedCharTypeBufferBase; + + wxCharBuffer(const wxCharTypeBufferBase& buf) + : wxCharTypeBufferBase(buf) {} + wxCharBuffer(const wxScopedCharTypeBufferBase& buf) + : wxCharTypeBufferBase(buf) {} + + wxCharBuffer(const CharType *str = NULL) : wxCharTypeBufferBase(str) {} + wxCharBuffer(size_t len) : wxCharTypeBufferBase(len) {} + + wxCharBuffer(const wxCStrData& cstr); +}; + +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxScopedCharTypeBuffer ) +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxCharTypeBuffer ) + +class wxWCharBuffer : public wxCharTypeBuffer +{ +public: + typedef wxCharTypeBuffer wxCharTypeBufferBase; + typedef wxScopedCharTypeBuffer wxScopedCharTypeBufferBase; + + wxWCharBuffer(const wxCharTypeBufferBase& buf) + : wxCharTypeBufferBase(buf) {} + wxWCharBuffer(const wxScopedCharTypeBufferBase& buf) + : wxCharTypeBufferBase(buf) {} + + wxWCharBuffer(const CharType *str = NULL) : wxCharTypeBufferBase(str) {} + wxWCharBuffer(size_t len) : wxCharTypeBufferBase(len) {} + + wxWCharBuffer(const wxCStrData& cstr); +}; + +// wxCharTypeBuffer implicitly convertible to T* +template +class wxWritableCharTypeBuffer : public wxCharTypeBuffer +{ +public: + typedef typename wxScopedCharTypeBuffer::CharType CharType; + + wxWritableCharTypeBuffer(const wxScopedCharTypeBuffer& src) + : wxCharTypeBuffer(src) {} + // FIXME-UTF8: this won't be needed after converting mb_str()/wc_str() to + // always return a buffer + // + we should derive this class from wxScopedCharTypeBuffer + // then + wxWritableCharTypeBuffer(const CharType *str = NULL) + : wxCharTypeBuffer(str) {} + + operator CharType*() { return this->data(); } +}; + +typedef wxWritableCharTypeBuffer wxWritableCharBuffer; +typedef wxWritableCharTypeBuffer wxWritableWCharBuffer; + + +#if wxUSE_UNICODE + #define wxWxCharBuffer wxWCharBuffer + + #define wxMB2WXbuf wxWCharBuffer + #define wxWX2MBbuf wxCharBuffer + #if wxUSE_UNICODE_WCHAR + #define wxWC2WXbuf wxChar* + #define wxWX2WCbuf wxChar* + #elif wxUSE_UNICODE_UTF8 + #define wxWC2WXbuf wxWCharBuffer + #define wxWX2WCbuf wxWCharBuffer + #endif +#else // ANSI + #define wxWxCharBuffer wxCharBuffer + + #define wxMB2WXbuf wxChar* + #define wxWX2MBbuf wxChar* + #define wxWC2WXbuf wxCharBuffer + #define wxWX2WCbuf wxWCharBuffer +#endif // Unicode/ANSI + +// ---------------------------------------------------------------------------- +// A class for holding growable data buffers (not necessarily strings) +// ---------------------------------------------------------------------------- + +// This class manages the actual data buffer pointer and is ref-counted. +class wxMemoryBufferData +{ +public: + // the initial size and also the size added by ResizeIfNeeded() + enum { DefBufSize = 1024 }; + + friend class wxMemoryBuffer; + + // everything is private as it can only be used by wxMemoryBuffer +private: + wxMemoryBufferData(size_t size = wxMemoryBufferData::DefBufSize) + : m_data(size ? malloc(size) : NULL), m_size(size), m_len(0), m_ref(0) + { + } + ~wxMemoryBufferData() { free(m_data); } + + + void ResizeIfNeeded(size_t newSize) + { + if (newSize > m_size) + { + void *dataOld = m_data; + m_data = realloc(m_data, newSize + wxMemoryBufferData::DefBufSize); + if ( !m_data ) + { + free(dataOld); + } + + m_size = newSize + wxMemoryBufferData::DefBufSize; + } + } + + void IncRef() { m_ref += 1; } + void DecRef() + { + m_ref -= 1; + if (m_ref == 0) // are there no more references? + delete this; + } + + void *release() + { + if ( m_data == NULL ) + return NULL; + + wxASSERT_MSG( m_ref == 1, "can't release shared buffer" ); + + void *p = m_data; + m_data = NULL; + m_len = + m_size = 0; + + return p; + } + + + // the buffer containing the data + void *m_data; + + // the size of the buffer + size_t m_size; + + // the amount of data currently in the buffer + size_t m_len; + + // the reference count + size_t m_ref; + + wxDECLARE_NO_COPY_CLASS(wxMemoryBufferData); +}; + + +class wxMemoryBuffer +{ +public: + // ctor and dtor + wxMemoryBuffer(size_t size = wxMemoryBufferData::DefBufSize) + { + m_bufdata = new wxMemoryBufferData(size); + m_bufdata->IncRef(); + } + + ~wxMemoryBuffer() { m_bufdata->DecRef(); } + + + // copy and assignment + wxMemoryBuffer(const wxMemoryBuffer& src) + : m_bufdata(src.m_bufdata) + { + m_bufdata->IncRef(); + } + + wxMemoryBuffer& operator=(const wxMemoryBuffer& src) + { + if (&src != this) + { + m_bufdata->DecRef(); + m_bufdata = src.m_bufdata; + m_bufdata->IncRef(); + } + return *this; + } + + + // Accessors + void *GetData() const { return m_bufdata->m_data; } + size_t GetBufSize() const { return m_bufdata->m_size; } + size_t GetDataLen() const { return m_bufdata->m_len; } + + bool IsEmpty() const { return GetDataLen() == 0; } + + void SetBufSize(size_t size) { m_bufdata->ResizeIfNeeded(size); } + void SetDataLen(size_t len) + { + wxASSERT(len <= m_bufdata->m_size); + m_bufdata->m_len = len; + } + + void Clear() { SetDataLen(0); } + + // Ensure the buffer is big enough and return a pointer to it + void *GetWriteBuf(size_t sizeNeeded) + { + m_bufdata->ResizeIfNeeded(sizeNeeded); + return m_bufdata->m_data; + } + + // Update the length after the write + void UngetWriteBuf(size_t sizeUsed) { SetDataLen(sizeUsed); } + + // Like the above, but appends to the buffer + void *GetAppendBuf(size_t sizeNeeded) + { + m_bufdata->ResizeIfNeeded(m_bufdata->m_len + sizeNeeded); + return (char*)m_bufdata->m_data + m_bufdata->m_len; + } + + // Update the length after the append + void UngetAppendBuf(size_t sizeUsed) + { + SetDataLen(m_bufdata->m_len + sizeUsed); + } + + // Other ways to append to the buffer + void AppendByte(char data) + { + wxCHECK_RET( m_bufdata->m_data, wxT("invalid wxMemoryBuffer") ); + + m_bufdata->ResizeIfNeeded(m_bufdata->m_len + 1); + *(((char*)m_bufdata->m_data) + m_bufdata->m_len) = data; + m_bufdata->m_len += 1; + } + + void AppendData(const void *data, size_t len) + { + memcpy(GetAppendBuf(len), data, len); + UngetAppendBuf(len); + } + + operator const char *() const { return (const char*)GetData(); } + + // gives up ownership of data, returns the pointer; after this call, + // data isn't freed by the buffer and its content is resent to empty + void *release() + { + return m_bufdata->release(); + } + +private: + wxMemoryBufferData* m_bufdata; +}; + +// ---------------------------------------------------------------------------- +// template class for any kind of data +// ---------------------------------------------------------------------------- + +// TODO + +#endif // _WX_BUFFER_H diff --git a/wxmsw/include/wx-3.0/wx/build.h b/wxmsw/include/wx-3.0/wx/build.h new file mode 100644 index 00000000..0959a297 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/build.h @@ -0,0 +1,120 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/build.h +// Purpose: Runtime build options checking +// Author: Vadim Zeitlin, Vaclav Slavik +// Modified by: +// Created: 07.05.02 +// Copyright: (c) 2002 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BUILD_H_ +#define _WX_BUILD_H_ + +#include "wx/version.h" + +// NB: This file contains macros for checking binary compatibility of libraries +// in multilib builds, plugins and user components. +// The WX_BUILD_OPTIONS_SIGNATURE macro expands into string that should +// uniquely identify binary compatible builds: i.e. if two builds of the +// library are binary compatible, their signature string should be the +// same; if two builds are binary incompatible, their signatures should +// be different. +// +// Therefore, wxUSE_XXX flags that affect binary compatibility (vtables, +// function signatures) should be accounted for here. So should compilers +// and compiler versions (but note that binary compatible compiler versions +// such as gcc-2.95.2 and gcc-2.95.3 should have same signature!). + +// ---------------------------------------------------------------------------- +// WX_BUILD_OPTIONS_SIGNATURE +// ---------------------------------------------------------------------------- + +#define __WX_BO_STRINGIZE(x) __WX_BO_STRINGIZE0(x) +#define __WX_BO_STRINGIZE0(x) #x + +#if (wxMINOR_VERSION % 2) == 0 + #define __WX_BO_VERSION(x,y,z) \ + __WX_BO_STRINGIZE(x) "." __WX_BO_STRINGIZE(y) +#else + #define __WX_BO_VERSION(x,y,z) \ + __WX_BO_STRINGIZE(x) "." __WX_BO_STRINGIZE(y) "." __WX_BO_STRINGIZE(z) +#endif + +#if wxUSE_UNICODE_UTF8 + #define __WX_BO_UNICODE "UTF-8" +#elif wxUSE_UNICODE_WCHAR + #define __WX_BO_UNICODE "wchar_t" +#else + #define __WX_BO_UNICODE "ANSI" +#endif + +// GCC and Intel C++ share same C++ ABI (and possibly others in the future), +// check if compiler versions are compatible: +#if defined(__GXX_ABI_VERSION) + #define __WX_BO_COMPILER \ + ",compiler with C++ ABI " __WX_BO_STRINGIZE(__GXX_ABI_VERSION) +#elif defined(__INTEL_COMPILER) + #define __WX_BO_COMPILER ",Intel C++" +#elif defined(__GNUG__) + #define __WX_BO_COMPILER ",GCC " \ + __WX_BO_STRINGIZE(__GNUC__) "." __WX_BO_STRINGIZE(__GNUC_MINOR__) +#elif defined(__VISUALC__) + #define __WX_BO_COMPILER ",Visual C++ " __WX_BO_STRINGIZE(_MSC_VER) +#elif defined(__BORLANDC__) + #define __WX_BO_COMPILER ",Borland C++" +#elif defined(__DIGITALMARS__) + #define __WX_BO_COMPILER ",DigitalMars" +#elif defined(__WATCOMC__) + #define __WX_BO_COMPILER ",Watcom C++" +#else + #define __WX_BO_COMPILER +#endif + +// WXWIN_COMPATIBILITY macros affect presence of virtual functions +#if WXWIN_COMPATIBILITY_2_6 + #define __WX_BO_WXWIN_COMPAT_2_6 ",compatible with 2.6" +#else + #define __WX_BO_WXWIN_COMPAT_2_6 +#endif +#if WXWIN_COMPATIBILITY_2_8 + #define __WX_BO_WXWIN_COMPAT_2_8 ",compatible with 2.8" +#else + #define __WX_BO_WXWIN_COMPAT_2_8 +#endif + +// deriving wxWin containers from STL ones changes them completely: +#if wxUSE_STD_CONTAINERS + #define __WX_BO_STL ",STL containers" +#else + #define __WX_BO_STL ",wx containers" +#endif + +// This macro is passed as argument to wxConsoleApp::CheckBuildOptions() +#define WX_BUILD_OPTIONS_SIGNATURE \ + __WX_BO_VERSION(wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER) \ + " (" __WX_BO_UNICODE \ + __WX_BO_COMPILER \ + __WX_BO_STL \ + __WX_BO_WXWIN_COMPAT_2_6 __WX_BO_WXWIN_COMPAT_2_8 \ + ")" + + +// ---------------------------------------------------------------------------- +// WX_CHECK_BUILD_OPTIONS +// ---------------------------------------------------------------------------- + +// Use this macro to check build options. Adding it to a file in DLL will +// ensure that the DLL checks build options in same way wxIMPLEMENT_APP() does. +#define WX_CHECK_BUILD_OPTIONS(libName) \ + static struct wxBuildOptionsChecker \ + { \ + wxBuildOptionsChecker() \ + { \ + wxAppConsole::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, \ + libName); \ + } \ + } gs_buildOptionsCheck; + + +#endif // _WX_BUILD_H_ diff --git a/wxmsw/include/wx-3.0/wx/busyinfo.h b/wxmsw/include/wx-3.0/wx/busyinfo.h new file mode 100644 index 00000000..600c86c6 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/busyinfo.h @@ -0,0 +1,20 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/busyinfo.h +// Purpose: Information window (when app is busy) +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __BUSYINFO_H_BASE__ +#define __BUSYINFO_H_BASE__ + +#include "wx/defs.h" + +#if wxUSE_BUSYINFO + +#include "wx/generic/busyinfo.h" + +#endif // wxUSE_BUSYINFO + +#endif // __BUSYINFO_H_BASE__ diff --git a/wxmsw/include/wx-3.0/wx/button.h b/wxmsw/include/wx-3.0/wx/button.h new file mode 100644 index 00000000..71dbee41 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/button.h @@ -0,0 +1,69 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/button.h +// Purpose: wxButtonBase class +// Author: Vadim Zetlin +// Modified by: +// Created: 15.08.00 +// Copyright: (c) Vadim Zetlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BUTTON_H_BASE_ +#define _WX_BUTTON_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_BUTTON + +#include "wx/anybutton.h" + +extern WXDLLIMPEXP_DATA_CORE(const char) wxButtonNameStr[]; + +// ---------------------------------------------------------------------------- +// wxButton: a push button +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxButtonBase : public wxAnyButton +{ +public: + wxButtonBase() { } + + // show the authentication needed symbol on the button: this is currently + // only implemented on Windows Vista and newer (on which it shows the UAC + // shield symbol) + void SetAuthNeeded(bool show = true) { DoSetAuthNeeded(show); } + bool GetAuthNeeded() const { return DoGetAuthNeeded(); } + + // make this button the default button in its top level window + // + // returns the old default item (possibly NULL) + virtual wxWindow *SetDefault(); + + // returns the default button size for this platform + static wxSize GetDefaultSize(); + +protected: + wxDECLARE_NO_COPY_CLASS(wxButtonBase); +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/button.h" +#elif defined(__WXMSW__) + #include "wx/msw/button.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/button.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/button.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/button.h" +#elif defined(__WXMAC__) + #include "wx/osx/button.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/button.h" +#elif defined(__WXPM__) + #include "wx/os2/button.h" +#endif + +#endif // wxUSE_BUTTON + +#endif // _WX_BUTTON_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/calctrl.h b/wxmsw/include/wx-3.0/wx/calctrl.h new file mode 100644 index 00000000..16a84748 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/calctrl.h @@ -0,0 +1,396 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/calctrl.h +// Purpose: date-picker control +// Author: Vadim Zeitlin +// Modified by: +// Created: 29.12.99 +// Copyright: (c) 1999 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CALCTRL_H_ +#define _WX_CALCTRL_H_ + +#include "wx/defs.h" + +#if wxUSE_CALENDARCTRL + +#include "wx/dateevt.h" +#include "wx/colour.h" +#include "wx/font.h" +#include "wx/control.h" + +// ---------------------------------------------------------------------------- +// wxCalendarCtrl flags +// ---------------------------------------------------------------------------- + +enum +{ + // show Sunday as the first day of the week (default) + wxCAL_SUNDAY_FIRST = 0x0000, + + // show Monday as the first day of the week + wxCAL_MONDAY_FIRST = 0x0001, + + // highlight holidays + wxCAL_SHOW_HOLIDAYS = 0x0002, + + // disable the year change control, show only the month change one + // deprecated + wxCAL_NO_YEAR_CHANGE = 0x0004, + + // don't allow changing neither month nor year (implies + // wxCAL_NO_YEAR_CHANGE) + wxCAL_NO_MONTH_CHANGE = 0x000c, + + // use MS-style month-selection instead of combo-spin combination + wxCAL_SEQUENTIAL_MONTH_SELECTION = 0x0010, + + // show the neighbouring weeks in the previous and next month + wxCAL_SHOW_SURROUNDING_WEEKS = 0x0020, + + // show week numbers on the left side of the calendar. + wxCAL_SHOW_WEEK_NUMBERS = 0x0040 +}; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// return values for the HitTest() method +enum wxCalendarHitTestResult +{ + wxCAL_HITTEST_NOWHERE, // outside of anything + wxCAL_HITTEST_HEADER, // on the header (weekdays) + wxCAL_HITTEST_DAY, // on a day in the calendar + wxCAL_HITTEST_INCMONTH, + wxCAL_HITTEST_DECMONTH, + wxCAL_HITTEST_SURROUNDING_WEEK, + wxCAL_HITTEST_WEEK +}; + +// border types for a date +enum wxCalendarDateBorder +{ + wxCAL_BORDER_NONE, // no border (default) + wxCAL_BORDER_SQUARE, // a rectangular border + wxCAL_BORDER_ROUND // a round border +}; + +// ---------------------------------------------------------------------------- +// wxCalendarDateAttr: custom attributes for a calendar date +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxCalendarDateAttr +{ +public: + // ctors + wxCalendarDateAttr(const wxColour& colText = wxNullColour, + const wxColour& colBack = wxNullColour, + const wxColour& colBorder = wxNullColour, + const wxFont& font = wxNullFont, + wxCalendarDateBorder border = wxCAL_BORDER_NONE) + : m_colText(colText), m_colBack(colBack), + m_colBorder(colBorder), m_font(font) + { + Init(border); + } + wxCalendarDateAttr(wxCalendarDateBorder border, + const wxColour& colBorder = wxNullColour) + : m_colBorder(colBorder) + { + Init(border); + } + + // setters + void SetTextColour(const wxColour& colText) { m_colText = colText; } + void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; } + void SetBorderColour(const wxColour& col) { m_colBorder = col; } + void SetFont(const wxFont& font) { m_font = font; } + void SetBorder(wxCalendarDateBorder border) { m_border = border; } + void SetHoliday(bool holiday) { m_holiday = holiday; } + + // accessors + bool HasTextColour() const { return m_colText.IsOk(); } + bool HasBackgroundColour() const { return m_colBack.IsOk(); } + bool HasBorderColour() const { return m_colBorder.IsOk(); } + bool HasFont() const { return m_font.IsOk(); } + bool HasBorder() const { return m_border != wxCAL_BORDER_NONE; } + + bool IsHoliday() const { return m_holiday; } + + const wxColour& GetTextColour() const { return m_colText; } + const wxColour& GetBackgroundColour() const { return m_colBack; } + const wxColour& GetBorderColour() const { return m_colBorder; } + const wxFont& GetFont() const { return m_font; } + wxCalendarDateBorder GetBorder() const { return m_border; } + + // get or change the "mark" attribute, i.e. the one used for the items + // marked with wxCalendarCtrl::Mark() + static const wxCalendarDateAttr& GetMark() { return m_mark; } + static void SetMark(wxCalendarDateAttr const& m) { m_mark = m; } + +protected: + void Init(wxCalendarDateBorder border = wxCAL_BORDER_NONE) + { + m_border = border; + m_holiday = false; + } + +private: + static wxCalendarDateAttr m_mark; + + wxColour m_colText, + m_colBack, + m_colBorder; + wxFont m_font; + wxCalendarDateBorder m_border; + bool m_holiday; +}; + +// ---------------------------------------------------------------------------- +// wxCalendarCtrl events +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_ADV wxCalendarCtrl; + +class WXDLLIMPEXP_ADV wxCalendarEvent : public wxDateEvent +{ +public: + wxCalendarEvent() : m_wday(wxDateTime::Inv_WeekDay) { } + wxCalendarEvent(wxWindow *win, const wxDateTime& dt, wxEventType type) + : wxDateEvent(win, dt, type), + m_wday(wxDateTime::Inv_WeekDay) { } + wxCalendarEvent(const wxCalendarEvent& event) + : wxDateEvent(event), m_wday(event.m_wday) { } + + void SetWeekDay(const wxDateTime::WeekDay wd) { m_wday = wd; } + wxDateTime::WeekDay GetWeekDay() const { return m_wday; } + + virtual wxEvent *Clone() const { return new wxCalendarEvent(*this); } + +private: + wxDateTime::WeekDay m_wday; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCalendarEvent) +}; + +// ---------------------------------------------------------------------------- +// wxCalendarCtrlBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxCalendarCtrlBase : public wxControl +{ +public: + // do we allow changing the month/year? + bool AllowMonthChange() const { return !HasFlag(wxCAL_NO_MONTH_CHANGE); } + + // get/set the current date + virtual wxDateTime GetDate() const = 0; + virtual bool SetDate(const wxDateTime& date) = 0; + + + // restricting the dates shown by the control to the specified range: only + // implemented in the generic and MSW versions for now + + // if either date is set, the corresponding limit will be enforced and true + // returned; if none are set, the existing restrictions are removed and + // false is returned + virtual bool + SetDateRange(const wxDateTime& WXUNUSED(lowerdate) = wxDefaultDateTime, + const wxDateTime& WXUNUSED(upperdate) = wxDefaultDateTime) + { + return false; + } + + // retrieves the limits currently in use (wxDefaultDateTime if none) in the + // provided pointers (which may be NULL) and returns true if there are any + // limits or false if none + virtual bool + GetDateRange(wxDateTime *lowerdate, wxDateTime *upperdate) const + { + if ( lowerdate ) + *lowerdate = wxDefaultDateTime; + if ( upperdate ) + *upperdate = wxDefaultDateTime; + return false; + } + + // returns one of wxCAL_HITTEST_XXX constants and fills either date or wd + // with the corresponding value (none for NOWHERE, the date for DAY and wd + // for HEADER) + // + // notice that this is not implemented in all versions + virtual wxCalendarHitTestResult + HitTest(const wxPoint& WXUNUSED(pos), + wxDateTime* WXUNUSED(date) = NULL, + wxDateTime::WeekDay* WXUNUSED(wd) = NULL) + { + return wxCAL_HITTEST_NOWHERE; + } + + // allow or disable changing the current month (and year), return true if + // the value of this option really changed or false if it was already set + // to the required value + // + // NB: we provide implementation for this pure virtual function, derived + // classes should call it + virtual bool EnableMonthChange(bool enable = true) = 0; + + + // an item without custom attributes is drawn with the default colours and + // font and without border, setting custom attributes allows to modify this + // + // the day parameter should be in 1..31 range, for days 29, 30, 31 the + // corresponding attribute is just unused if there is no such day in the + // current month + // + // notice that currently arbitrary attributes are supported only in the + // generic version, the native controls only support Mark() which assigns + // some special appearance (which can be customized using SetMark() for the + // generic version) to the given day + + virtual void Mark(size_t day, bool mark) = 0; + + virtual wxCalendarDateAttr *GetAttr(size_t WXUNUSED(day)) const + { return NULL; } + virtual void SetAttr(size_t WXUNUSED(day), wxCalendarDateAttr *attr) + { delete attr; } + virtual void ResetAttr(size_t WXUNUSED(day)) { } + + + // holidays support + // + // currently only the generic version implements all functions in this + // section; wxMSW implements simple support for holidays (they can be + // just enabled or disabled) and wxGTK doesn't support them at all + + // equivalent to changing wxCAL_SHOW_HOLIDAYS flag but should be called + // instead of just changing it + virtual void EnableHolidayDisplay(bool display = true); + + // set/get the colours to use for holidays (if they're enabled) + virtual void SetHolidayColours(const wxColour& WXUNUSED(colFg), + const wxColour& WXUNUSED(colBg)) { } + + virtual const wxColour& GetHolidayColourFg() const { return wxNullColour; } + virtual const wxColour& GetHolidayColourBg() const { return wxNullColour; } + + // mark the given day of the current month as being a holiday + virtual void SetHoliday(size_t WXUNUSED(day)) { } + + + // customizing the colours of the controls + // + // most of the methods in this section are only implemented by the native + // version of the control and do nothing in the native ones + + // set/get the colours to use for the display of the week day names at the + // top of the controls + virtual void SetHeaderColours(const wxColour& WXUNUSED(colFg), + const wxColour& WXUNUSED(colBg)) { } + + virtual const wxColour& GetHeaderColourFg() const { return wxNullColour; } + virtual const wxColour& GetHeaderColourBg() const { return wxNullColour; } + + // set/get the colours used for the currently selected date + virtual void SetHighlightColours(const wxColour& WXUNUSED(colFg), + const wxColour& WXUNUSED(colBg)) { } + + virtual const wxColour& GetHighlightColourFg() const { return wxNullColour; } + virtual const wxColour& GetHighlightColourBg() const { return wxNullColour; } + + + // implementation only from now on + + // generate the given calendar event, return true if it was processed + // + // NB: this is public because it's used from GTK+ callbacks + bool GenerateEvent(wxEventType type) + { + wxCalendarEvent event(this, GetDate(), type); + return HandleWindowEvent(event); + } + +protected: + // generate all the events for the selection change from dateOld to current + // date: SEL_CHANGED, PAGE_CHANGED if necessary and also one of (deprecated) + // YEAR/MONTH/DAY_CHANGED ones + // + // returns true if page changed event was generated, false if the new date + // is still in the same month as before + bool GenerateAllChangeEvents(const wxDateTime& dateOld); + + // call SetHoliday() for all holidays in the current month + // + // should be called on month change, does nothing if wxCAL_SHOW_HOLIDAYS is + // not set and returns false in this case, true if we do show them + bool SetHolidayAttrs(); + + // called by SetHolidayAttrs() to forget the previously set holidays + virtual void ResetHolidayAttrs() { } + + // called by EnableHolidayDisplay() + virtual void RefreshHolidays() { } +}; + +// ---------------------------------------------------------------------------- +// wxCalendarCtrl +// ---------------------------------------------------------------------------- + +#define wxCalendarNameStr "CalendarCtrl" + +#ifndef __WXUNIVERSAL__ + #if defined(__WXGTK20__) + #define wxHAS_NATIVE_CALENDARCTRL + #include "wx/gtk/calctrl.h" + #define wxCalendarCtrl wxGtkCalendarCtrl + #elif defined(__WXMSW__) + #define wxHAS_NATIVE_CALENDARCTRL + #include "wx/msw/calctrl.h" + #endif +#endif // !__WXUNIVERSAL__ + +#ifndef wxHAS_NATIVE_CALENDARCTRL + #include "wx/generic/calctrlg.h" + #define wxCalendarCtrl wxGenericCalendarCtrl +#endif + +// ---------------------------------------------------------------------------- +// calendar event types and macros for handling them +// ---------------------------------------------------------------------------- + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_PAGE_CHANGED, wxCalendarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_DOUBLECLICKED, wxCalendarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_WEEKDAY_CLICKED, wxCalendarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_WEEK_CLICKED, wxCalendarEvent ); + +// deprecated events +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_DAY_CHANGED, wxCalendarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_MONTH_CHANGED, wxCalendarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_YEAR_CHANGED, wxCalendarEvent ); + +typedef void (wxEvtHandler::*wxCalendarEventFunction)(wxCalendarEvent&); + +#define wxCalendarEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxCalendarEventFunction, func) + +#define wx__DECLARE_CALEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_CALENDAR_ ## evt, id, wxCalendarEventHandler(fn)) + +#define EVT_CALENDAR(id, fn) wx__DECLARE_CALEVT(DOUBLECLICKED, id, fn) +#define EVT_CALENDAR_SEL_CHANGED(id, fn) wx__DECLARE_CALEVT(SEL_CHANGED, id, fn) +#define EVT_CALENDAR_PAGE_CHANGED(id, fn) wx__DECLARE_CALEVT(PAGE_CHANGED, id, fn) +#define EVT_CALENDAR_WEEKDAY_CLICKED(id, fn) wx__DECLARE_CALEVT(WEEKDAY_CLICKED, id, fn) +#define EVT_CALENDAR_WEEK_CLICKED(id, fn) wx__DECLARE_CALEVT(WEEK_CLICKED, id, fn) + +// deprecated events +#define EVT_CALENDAR_DAY(id, fn) wx__DECLARE_CALEVT(DAY_CHANGED, id, fn) +#define EVT_CALENDAR_MONTH(id, fn) wx__DECLARE_CALEVT(MONTH_CHANGED, id, fn) +#define EVT_CALENDAR_YEAR(id, fn) wx__DECLARE_CALEVT(YEAR_CHANGED, id, fn) + +#endif // wxUSE_CALENDARCTRL + +#endif // _WX_CALCTRL_H_ + diff --git a/wxmsw/include/wx-3.0/wx/caret.h b/wxmsw/include/wx-3.0/wx/caret.h new file mode 100644 index 00000000..e6e9728f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/caret.h @@ -0,0 +1,251 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/caret.h +// Purpose: wxCaretBase class - the interface of wxCaret +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.05.99 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CARET_H_BASE_ +#define _WX_CARET_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_CARET + +// --------------------------------------------------------------------------- +// forward declarations +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxWindowBase; + +// ---------------------------------------------------------------------------- +// headers we have to include +// ---------------------------------------------------------------------------- + +#include "wx/gdicmn.h" // for wxPoint, wxSize + +// ---------------------------------------------------------------------------- +// A caret is a blinking cursor showing the position where the typed text will +// appear. It can be either a solid block or a custom bitmap (TODO) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxCaretBase +{ +public: + // ctors + // ----- + // default - use Create + wxCaretBase() { Init(); } + // create the caret of given (in pixels) width and height and associate + // with the given window + wxCaretBase(wxWindowBase *window, int width, int height) + { + Init(); + + (void)Create(window, width, height); + } + // same as above + wxCaretBase(wxWindowBase *window, const wxSize& size) + { + Init(); + + (void)Create(window, size); + } + + // a virtual dtor has been provided since this class has virtual members + virtual ~wxCaretBase() { } + + // Create() functions - same as ctor but returns the success code + // -------------------------------------------------------------- + + // same as ctor + bool Create(wxWindowBase *window, int width, int height) + { return DoCreate(window, width, height); } + // same as ctor + bool Create(wxWindowBase *window, const wxSize& size) + { return DoCreate(window, size.x, size.y); } + + // accessors + // --------- + + // is the caret valid? + bool IsOk() const { return m_width != 0 && m_height != 0; } + + // is the caret currently shown? + bool IsVisible() const { return m_countVisible > 0; } + + // get the caret position + void GetPosition(int *x, int *y) const + { + if ( x ) *x = m_x; + if ( y ) *y = m_y; + } + wxPoint GetPosition() const { return wxPoint(m_x, m_y); } + + // get the caret size + void GetSize(int *width, int *height) const + { + if ( width ) *width = m_width; + if ( height ) *height = m_height; + } + wxSize GetSize() const { return wxSize(m_width, m_height); } + + // get the window we're associated with + wxWindow *GetWindow() const { return (wxWindow *)m_window; } + + // change the size of the caret + void SetSize(int width, int height) { + m_width = width; + m_height = height; + DoSize(); + } + void SetSize(const wxSize& size) { SetSize(size.x, size.y); } + + + // operations + // ---------- + + // move the caret to given position (in logical coords) + void Move(int x, int y) { m_x = x; m_y = y; DoMove(); } + void Move(const wxPoint& pt) { m_x = pt.x; m_y = pt.y; DoMove(); } + + // show/hide the caret (should be called by wxWindow when needed): + // Show() must be called as many times as Hide() + 1 to make the caret + // visible + virtual void Show(bool show = true) + { + if ( show ) + { + if ( m_countVisible++ == 0 ) + DoShow(); + } + else + { + if ( --m_countVisible == 0 ) + DoHide(); + } + } + virtual void Hide() { Show(false); } + + // blink time is measured in milliseconds and is the time elapsed + // between 2 inversions of the caret (blink time of the caret is common + // to all carets in the Universe, so these functions are static) + static int GetBlinkTime(); + static void SetBlinkTime(int milliseconds); + + // implementation from now on + // -------------------------- + + // these functions should be called by wxWindow when the window gets/loses + // the focus - we create/show and hide/destroy the caret here + virtual void OnSetFocus() { } + virtual void OnKillFocus() { } + +protected: + // these functions may be overridden in the derived classes, but they + // should call the base class version first + virtual bool DoCreate(wxWindowBase *window, int width, int height) + { + m_window = window; + m_width = width; + m_height = height; + + return true; + } + + // pure virtuals to implement in the derived class + virtual void DoShow() = 0; + virtual void DoHide() = 0; + virtual void DoMove() = 0; + virtual void DoSize() { } + + // the common initialization + void Init() + { + m_window = NULL; + m_x = m_y = 0; + m_width = m_height = 0; + m_countVisible = 0; + } + + // the size of the caret + int m_width, m_height; + + // the position of the caret + int m_x, m_y; + + // the window we're associated with + wxWindowBase *m_window; + + // visibility count: the caret is visible only if it's positive + int m_countVisible; + +private: + wxDECLARE_NO_COPY_CLASS(wxCaretBase); +}; + +// --------------------------------------------------------------------------- +// now include the real thing +// --------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/caret.h" +#else + #include "wx/generic/caret.h" +#endif // platform + +// ---------------------------------------------------------------------------- +// wxCaretSuspend: a simple class which hides the caret in its ctor and +// restores it in the dtor, this should be used when drawing on the screen to +// avoid overdrawing the caret +// ---------------------------------------------------------------------------- + +#ifdef wxHAS_CARET_USING_OVERLAYS + +// we don't need to hide the caret if it's rendered using overlays +class WXDLLIMPEXP_CORE wxCaretSuspend +{ +public: + wxCaretSuspend(wxWindow *WXUNUSED(win)) {} + + wxDECLARE_NO_COPY_CLASS(wxCaretSuspend); +}; + +#else // !wxHAS_CARET_USING_OVERLAYS + +class WXDLLIMPEXP_CORE wxCaretSuspend +{ +public: + wxCaretSuspend(wxWindow *win) + { + m_caret = win->GetCaret(); + m_show = false; + if ( m_caret && m_caret->IsVisible() ) + { + m_caret->Hide(); + m_show = true; + } + } + + ~wxCaretSuspend() + { + if ( m_caret && m_show ) + m_caret->Show(); + } + +private: + wxCaret *m_caret; + bool m_show; + + wxDECLARE_NO_COPY_CLASS(wxCaretSuspend); +}; + +#endif // wxHAS_CARET_USING_OVERLAYS/!wxHAS_CARET_USING_OVERLAYS + +#endif // wxUSE_CARET + +#endif // _WX_CARET_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/chartype.h b/wxmsw/include/wx-3.0/wx/chartype.h new file mode 100644 index 00000000..5217258d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/chartype.h @@ -0,0 +1,304 @@ +/* + * Name: wx/chartype.h + * Purpose: Declarations of wxChar and related types + * Author: Joel Farley, Ove KÃ¥ven + * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee + * Created: 1998/06/12 + * Copyright: (c) 1998-2006 wxWidgets dev team + * Licence: wxWindows licence + */ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_WXCHARTYPE_H_ +#define _WX_WXCHARTYPE_H_ + +/* defs.h indirectly includes this file, so don't include it here */ +#include "wx/platform.h" + +/* check whether we have wchar_t and which size it is if we do */ +#if !defined(wxUSE_WCHAR_T) + #if defined(__UNIX__) + #if defined(HAVE_WCSTR_H) || defined(HAVE_WCHAR_H) || defined(__FreeBSD__) || defined(__DARWIN__) + #define wxUSE_WCHAR_T 1 + #else + #define wxUSE_WCHAR_T 0 + #endif + #elif defined(__GNUWIN32__) && !defined(__MINGW32__) + #define wxUSE_WCHAR_T 0 + #elif defined(__WATCOMC__) + #define wxUSE_WCHAR_T 0 + #elif defined(__VISAGECPP__) && (__IBMCPP__ < 400) + #define wxUSE_WCHAR_T 0 + #else + /* add additional compiler checks if this fails */ + #define wxUSE_WCHAR_T 1 + #endif +#endif /* !defined(wxUSE_WCHAR_T) */ + +/* Unicode support requires wchar_t */ +#if !wxUSE_WCHAR_T + #error "wchar_t must be available" +#endif /* Unicode */ + +/* + non Unix compilers which do have wchar.h (but not tchar.h which is included + below and which includes wchar.h anyhow). + + Actually MinGW has tchar.h, but it does not include wchar.h + */ +#if defined(__VISAGECPP__) || defined(__MINGW32__) || defined(__WATCOMC__) + #ifndef HAVE_WCHAR_H + #define HAVE_WCHAR_H + #endif +#endif + +#ifdef HAVE_WCHAR_H + /* the current (as of Nov 2002) version of cygwin has a bug in its */ + /* wchar.h -- there is no extern "C" around the declarations in it */ + /* and this results in linking errors later; also, at least on some */ + /* Cygwin versions, wchar.h requires sys/types.h */ + #ifdef __CYGWIN__ + #include + #ifdef __cplusplus + extern "C" { + #endif + #endif /* Cygwin */ + + #include + + #if defined(__CYGWIN__) && defined(__cplusplus) + } + #endif /* Cygwin and C++ */ + +#elif defined(HAVE_WCSTR_H) + /* old compilers have relevant declarations here */ + #include +#elif defined(__FreeBSD__) || defined(__DARWIN__) || defined(__EMX__) + /* include stdlib.h for wchar_t */ + #include +#endif /* HAVE_WCHAR_H */ + +#ifdef HAVE_WIDEC_H + #include +#endif + +/* -------------------------------------------------------------------------- */ +/* define wxHAVE_TCHAR_SUPPORT for the compilers which support the TCHAR type */ +/* mapped to either char or wchar_t depending on the ASCII/Unicode mode and */ +/* have the function mapping _tfoo() -> foo() or wfoo() */ +/* -------------------------------------------------------------------------- */ + +/* VC++ and BC++ starting with 5.2 have TCHAR support */ +#ifdef __VISUALC__ + #define wxHAVE_TCHAR_SUPPORT +#elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x520) + #define wxHAVE_TCHAR_SUPPORT + #include +#elif defined(__WATCOMC__) + #define wxHAVE_TCHAR_SUPPORT +#elif defined(__DMC__) + #define wxHAVE_TCHAR_SUPPORT +#elif defined(__MINGW32__) && wxCHECK_W32API_VERSION( 1, 0 ) + #define wxHAVE_TCHAR_SUPPORT + #include + #include + #include +#elif 0 && defined(__VISAGECPP__) && (__IBMCPP__ >= 400) + /* VZ: the old VisualAge definitions were completely wrong and had no */ + /* chance at all to work in Unicode build anyhow so let's pretend */ + /* that VisualAge does _not_ support TCHAR for the moment (as */ + /* indicated by "0 &&" above) until someone really has time to delve */ + /* into Unicode issues under OS/2 */ + + /* VisualAge 4.0+ supports TCHAR */ + #define wxHAVE_TCHAR_SUPPORT +#endif /* compilers with (good) TCHAR support */ + +#ifdef wxHAVE_TCHAR_SUPPORT + /* get TCHAR definition if we've got it */ + #include + + /* we surely do have wchar_t if we have TCHAR */ + #ifndef wxUSE_WCHAR_T + #define wxUSE_WCHAR_T 1 + #endif /* !defined(wxUSE_WCHAR_T) */ +#endif /* wxHAVE_TCHAR_SUPPORT */ + +/* ------------------------------------------------------------------------- */ +/* define wxChar type */ +/* ------------------------------------------------------------------------- */ + +/* TODO: define wxCharInt to be equal to either int or wint_t? */ + +#if !wxUSE_UNICODE + typedef char wxChar; + typedef signed char wxSChar; + typedef unsigned char wxUChar; +#else + /* VZ: note that VC++ defines _T[SU]CHAR simply as wchar_t and not as */ + /* signed/unsigned version of it which (a) makes sense to me (unlike */ + /* char wchar_t is always unsigned) and (b) was how the previous */ + /* definitions worked so keep it like this */ + + /* Sun's SunPro compiler supports the wchar_t type and wide character */ + /* functions, but does not define __WCHAR_TYPE__. Define it here to */ + /* allow unicode enabled builds. */ + #if (defined(__SUNPRO_CC) || defined(__SUNPRO_C)) && !defined(__WCHAR_TYPE__) + #define __WCHAR_TYPE__ wxchar_t + #endif + + /* GNU libc has __WCHAR_TYPE__ which requires special treatment, see */ + /* comment below */ + #if !defined(__WCHAR_TYPE__) || \ + (!defined(__GNUC__) || wxCHECK_GCC_VERSION(2, 96)) + /* standard case */ + typedef wchar_t wxChar; + typedef wchar_t wxSChar; + typedef wchar_t wxUChar; + #else /* __WCHAR_TYPE__ and gcc < 2.96 */ + /* VS: wxWidgets used to define wxChar as __WCHAR_TYPE__ here. */ + /* However, this doesn't work with new GCC 3.x compilers because */ + /* wchar_t is C++'s builtin type in the new standard. OTOH, old */ + /* compilers (GCC 2.x) won't accept new definition of */ + /* wx{S,U}CharType, so we have to define wxChar */ + /* conditionally depending on detected compiler & compiler */ + /* version. */ + + /* with old definition of wxChar. */ + #define wchar_t __WCHAR_TYPE__ + typedef __WCHAR_TYPE__ wxChar; + typedef __WCHAR_TYPE__ wxSChar; + typedef __WCHAR_TYPE__ wxUChar; + #endif /* __WCHAR_TYPE__ */ +#endif /* ASCII/Unicode */ + +/* ------------------------------------------------------------------------- */ +/* define wxStringCharType */ +/* ------------------------------------------------------------------------- */ + +/* depending on the platform, Unicode build can either store wxStrings as + wchar_t* or UTF-8 encoded char*: */ +#if wxUSE_UNICODE + /* FIXME-UTF8: what would be better place for this? */ + #if defined(wxUSE_UTF8_LOCALE_ONLY) && !defined(wxUSE_UNICODE_UTF8) + #error "wxUSE_UTF8_LOCALE_ONLY only makes sense with wxUSE_UNICODE_UTF8" + #endif + #ifndef wxUSE_UTF8_LOCALE_ONLY + #define wxUSE_UTF8_LOCALE_ONLY 0 + #endif + + #ifndef wxUSE_UNICODE_UTF8 + #define wxUSE_UNICODE_UTF8 0 + #endif + + #if wxUSE_UNICODE_UTF8 + #define wxUSE_UNICODE_WCHAR 0 + #else + #define wxUSE_UNICODE_WCHAR 1 + #endif +#else + #define wxUSE_UNICODE_WCHAR 0 + #define wxUSE_UNICODE_UTF8 0 + #define wxUSE_UTF8_LOCALE_ONLY 0 +#endif + +/* define char type used by wxString internal representation: */ +#if wxUSE_UNICODE_WCHAR + typedef wchar_t wxStringCharType; +#else /* wxUSE_UNICODE_UTF8 || ANSI */ + typedef char wxStringCharType; +#endif + + +/* ------------------------------------------------------------------------- */ +/* define wxT() and related macros */ +/* ------------------------------------------------------------------------- */ + +/* BSD systems define _T() to be something different in ctype.h, override it */ +#if defined(__FreeBSD__) || defined(__DARWIN__) + #include + #undef _T +#endif + +/* + wxT ("wx text") macro turns a literal string constant into a wide char + constant. It is mostly unnecessary with wx 2.9 but defined for + compatibility. + */ +#ifndef wxT + #if !wxUSE_UNICODE + #define wxT(x) x + #else /* Unicode */ + /* + Notice that we use an intermediate macro to allow x to be expanded + if it's a macro itself. + */ + #ifndef wxCOMPILER_BROKEN_CONCAT_OPER + #define wxT(x) wxCONCAT_HELPER(L, x) + #else + #define wxT(x) wxPREPEND_L(x) + #endif + #endif /* ASCII/Unicode */ +#endif /* !defined(wxT) */ + +/* + wxT_2 exists only for compatibility with wx 2.x and is the same as wxT() in + that version but nothing in the newer ones. + */ +#define wxT_2(x) x + +/* + wxS ("wx string") macro can be used to create literals using the same + representation as wxString does internally, i.e. wchar_t in Unicode build + under Windows or char in UTF-8-based Unicode builds and (deprecated) ANSI + builds everywhere (see wxStringCharType definition above). + */ +#if wxUSE_UNICODE_WCHAR + /* + As above with wxT(), wxS() argument is expanded if it's a macro. + */ + #ifndef wxCOMPILER_BROKEN_CONCAT_OPER + #define wxS(x) wxCONCAT_HELPER(L, x) + #else + #define wxS(x) wxPREPEND_L(x) + #endif +#else /* wxUSE_UNICODE_UTF8 || ANSI */ + #define wxS(x) x +#endif + +/* + _T() is a synonym for wxT() familiar to Windows programmers. As this macro + has even higher risk of conflicting with system headers, its use is + discouraged and you may predefine wxNO__T to disable it. Additionally, we + do it ourselves for Sun CC which is known to use it in its standard headers + (see #10660). + */ +#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) + #ifndef wxNO__T + #define wxNO__T + #endif +#endif + +#if !defined(_T) && !defined(wxNO__T) + #define _T(x) wxT(x) +#endif + +/* a helper macro allowing to make another macro Unicode-friendly, see below */ +#define wxAPPLY_T(x) wxT(x) + +/* Unicode-friendly __FILE__, __DATE__ and __TIME__ analogs */ +#ifndef __TFILE__ + #define __TFILE__ wxAPPLY_T(__FILE__) +#endif + +#ifndef __TDATE__ + #define __TDATE__ wxAPPLY_T(__DATE__) +#endif + +#ifndef __TTIME__ + #define __TTIME__ wxAPPLY_T(__TIME__) +#endif + +#endif /* _WX_WXCHARTYPE_H_ */ + diff --git a/wxmsw/include/wx-3.0/wx/checkbox.h b/wxmsw/include/wx-3.0/wx/checkbox.h new file mode 100644 index 00000000..e0978a0d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/checkbox.h @@ -0,0 +1,190 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/checkbox.h +// Purpose: wxCheckBox class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 07.09.00 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CHECKBOX_H_BASE_ +#define _WX_CHECKBOX_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_CHECKBOX + +#include "wx/control.h" + + +/* + * wxCheckBox style flags + * (Using wxCHK_* because wxCB_* is used by wxComboBox). + * Determine whether to use a 3-state or 2-state + * checkbox. 3-state enables to differentiate + * between 'unchecked', 'checked' and 'undetermined'. + * + * In addition to the styles here it is also possible to specify just 0 which + * is treated the same as wxCHK_2STATE for compatibility (but using explicit + * flag is preferred). + */ +#define wxCHK_2STATE 0x4000 +#define wxCHK_3STATE 0x1000 + +/* + * If this style is set the user can set the checkbox to the + * undetermined state. If not set the undetermined set can only + * be set programmatically. + * This style can only be used with 3 state checkboxes. + */ +#define wxCHK_ALLOW_3RD_STATE_FOR_USER 0x2000 + +extern WXDLLIMPEXP_DATA_CORE(const char) wxCheckBoxNameStr[]; + +// ---------------------------------------------------------------------------- +// wxCheckBox: a control which shows a label and a box which may be checked +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxCheckBoxBase : public wxControl +{ +public: + wxCheckBoxBase() { } + + // set/get the checked status of the listbox + virtual void SetValue(bool value) = 0; + virtual bool GetValue() const = 0; + + bool IsChecked() const + { + wxASSERT_MSG( !Is3State(), wxT("Calling IsChecked() doesn't make sense for") + wxT(" a three state checkbox, Use Get3StateValue() instead") ); + + return GetValue(); + } + + wxCheckBoxState Get3StateValue() const + { + wxCheckBoxState state = DoGet3StateValue(); + + if ( state == wxCHK_UNDETERMINED && !Is3State() ) + { + // Undetermined state with a 2-state checkbox?? + wxFAIL_MSG( wxT("DoGet3StateValue() says the 2-state checkbox is ") + wxT("in an undetermined/third state") ); + + state = wxCHK_UNCHECKED; + } + + return state; + } + + void Set3StateValue(wxCheckBoxState state) + { + if ( state == wxCHK_UNDETERMINED && !Is3State() ) + { + wxFAIL_MSG(wxT("Setting a 2-state checkbox to undetermined state")); + state = wxCHK_UNCHECKED; + } + + DoSet3StateValue(state); + } + + bool Is3State() const { return HasFlag(wxCHK_3STATE); } + + bool Is3rdStateAllowedForUser() const + { + return HasFlag(wxCHK_ALLOW_3RD_STATE_FOR_USER); + } + + virtual bool HasTransparentBackground() { return true; } + + // wxCheckBox-specific processing after processing the update event + virtual void DoUpdateWindowUI(wxUpdateUIEvent& event) + { + wxControl::DoUpdateWindowUI(event); + + if ( event.GetSetChecked() ) + SetValue(event.GetChecked()); + } + +protected: + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + virtual void DoSet3StateValue(wxCheckBoxState WXUNUSED(state)) { wxFAIL; } + + virtual wxCheckBoxState DoGet3StateValue() const + { + wxFAIL; + return wxCHK_UNCHECKED; + } + + // Helper function to be called from derived classes Create() + // implementations: it checks that the style doesn't contain any + // incompatible bits and modifies it to be sane if it does. + static void WXValidateStyle(long *stylePtr) + { + long& style = *stylePtr; + + if ( !(style & (wxCHK_2STATE | wxCHK_3STATE)) ) + { + // For compatibility we use absence of style flags as wxCHK_2STATE + // because wxCHK_2STATE used to have the value of 0 and some + // existing code uses 0 instead of it. Moreover, some code even + // uses some non-0 style, e.g. wxBORDER_XXX, but doesn't specify + // neither wxCHK_2STATE nor wxCHK_3STATE -- to avoid breaking it, + // assume (much more common) 2 state checkbox by default. + style |= wxCHK_2STATE; + } + + if ( style & wxCHK_3STATE ) + { + if ( style & wxCHK_2STATE ) + { + wxFAIL_MSG( "wxCHK_2STATE and wxCHK_3STATE can't be used " + "together" ); + style &= ~wxCHK_3STATE; + } + } + else // No wxCHK_3STATE + { + if ( style & wxCHK_ALLOW_3RD_STATE_FOR_USER ) + { + wxFAIL_MSG( "wxCHK_ALLOW_3RD_STATE_FOR_USER doesn't make sense " + "without wxCHK_3STATE" ); + style &= ~wxCHK_ALLOW_3RD_STATE_FOR_USER; + } + } + } + +private: + wxDECLARE_NO_COPY_CLASS(wxCheckBoxBase); +}; + +// Most ports support 3 state checkboxes so define this by default. +#define wxHAS_3STATE_CHECKBOX + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/checkbox.h" +#elif defined(__WXMSW__) + #include "wx/msw/checkbox.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/checkbox.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/checkbox.h" +#elif defined(__WXGTK__) + #undef wxHAS_3STATE_CHECKBOX + #include "wx/gtk1/checkbox.h" +#elif defined(__WXMAC__) + #include "wx/osx/checkbox.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/checkbox.h" +#elif defined(__WXPM__) + #undef wxHAS_3STATE_CHECKBOX + #include "wx/os2/checkbox.h" +#endif + +#endif // wxUSE_CHECKBOX + +#endif // _WX_CHECKBOX_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/checkeddelete.h b/wxmsw/include/wx-3.0/wx/checkeddelete.h new file mode 100644 index 00000000..fd295faf --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/checkeddelete.h @@ -0,0 +1,44 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/checkeddelete.h +// Purpose: wxCHECKED_DELETE() macro +// Author: Vadim Zeitlin +// Created: 2009-02-03 +// Copyright: (c) 2002-2009 wxWidgets dev team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CHECKEDDELETE_H_ +#define _WX_CHECKEDDELETE_H_ + +#include "wx/cpp.h" + +// TODO: provide wxCheckedDelete[Array]() template functions too + +// ---------------------------------------------------------------------------- +// wxCHECKED_DELETE and wxCHECKED_DELETE_ARRAY macros +// ---------------------------------------------------------------------------- + +/* + checked deleters are used to make sure that the type being deleted is really + a complete type.: otherwise sizeof() would result in a compile-time error + + do { ... } while ( 0 ) construct is used to have an anonymous scope + (otherwise we could have name clashes between different "complete"s) but + still force a semicolon after the macro +*/ + +#define wxCHECKED_DELETE(ptr) \ + wxSTATEMENT_MACRO_BEGIN \ + typedef char complete[sizeof(*ptr)] WX_ATTRIBUTE_UNUSED; \ + delete ptr; \ + wxSTATEMENT_MACRO_END + +#define wxCHECKED_DELETE_ARRAY(ptr) \ + wxSTATEMENT_MACRO_BEGIN \ + typedef char complete[sizeof(*ptr)] WX_ATTRIBUTE_UNUSED; \ + delete [] ptr; \ + wxSTATEMENT_MACRO_END + + +#endif // _WX_CHECKEDDELETE_H_ + diff --git a/wxmsw/include/wx-3.0/wx/checklst.h b/wxmsw/include/wx-3.0/wx/checklst.h new file mode 100644 index 00000000..3c54304d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/checklst.h @@ -0,0 +1,67 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/checklst.h +// Purpose: wxCheckListBox class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 12.09.00 +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CHECKLST_H_BASE_ +#define _WX_CHECKLST_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_CHECKLISTBOX + +#include "wx/listbox.h" + +// ---------------------------------------------------------------------------- +// wxCheckListBox: a listbox whose items may be checked +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxCheckListBoxBase : public + #ifdef __WXWINCE__ + // keep virtuals synchronised + wxListBoxBase + #else + wxListBox + #endif +{ +public: + wxCheckListBoxBase() { } + + // check list box specific methods + virtual bool IsChecked(unsigned int item) const = 0; + virtual void Check(unsigned int item, bool check = true) = 0; + + virtual unsigned int GetCheckedItems(wxArrayInt& checkedItems) const; + + wxDECLARE_NO_COPY_CLASS(wxCheckListBoxBase); +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/checklst.h" +#elif defined(__WXWINCE__) + #include "wx/msw/wince/checklst.h" +#elif defined(__WXMSW__) + #include "wx/msw/checklst.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/checklst.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/checklst.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/checklst.h" +#elif defined(__WXMAC__) + #include "wx/osx/checklst.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/checklst.h" +#elif defined(__WXPM__) + #include "wx/os2/checklst.h" +#endif + +#endif // wxUSE_CHECKLISTBOX + +#endif + // _WX_CHECKLST_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/chkconf.h b/wxmsw/include/wx-3.0/wx/chkconf.h new file mode 100644 index 00000000..47fa8ee4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/chkconf.h @@ -0,0 +1,2231 @@ +/* + * Name: wx/chkconf.h + * Purpose: check the config settings for consistency + * Author: Vadim Zeitlin + * Modified by: + * Created: 09.08.00 + * Copyright: (c) 2000 Vadim Zeitlin + * Licence: wxWindows licence + */ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ +#ifndef _WX_CHKCONF_H_ +#define _WX_CHKCONF_H_ + +/* + ************************************************** + PLEASE READ THIS IF YOU GET AN ERROR IN THIS FILE! + ************************************************** + + If you get an error saying "wxUSE_FOO must be defined", it means that you + are not using the correct up-to-date version of setup.h. This happens most + often when using svn or daily snapshots and a new symbol was added to + setup0.h and you haven't updated your local setup.h to reflect it. If + this is the case, you need to propagate the changes from setup0.h to your + setup.h and, if using makefiles under MSW, also remove setup.h under the + build directory (lib/$(COMPILER)_{lib,dll}/msw[u][d][dll]/wx) so that + the new setup.h is copied there. + + If you get an error of the form "wxFoo requires wxBar", then the settings + in your setup.h are inconsistent. You have the choice between correcting + them manually or commenting out #define wxABORT_ON_CONFIG_ERROR below to + try to correct the problems automatically (not really recommended but + might work). + */ + +/* + This file has the following sections: + 1. checks that all wxUSE_XXX symbols we use are defined + a) first the non-GUI ones + b) then the GUI-only ones + 2. platform-specific checks done in the platform headers + 3. generic consistency checks + a) first the non-GUI ones + b) then the GUI-only ones + */ + +/* + this global setting determines what should we do if the setting FOO + requires BAR and BAR is not set: we can either silently unset FOO as well + (do this if you're trying to build the smallest possible library) or give an + error and abort (default as leads to least surprising behaviour) + */ +#define wxABORT_ON_CONFIG_ERROR + +/* + global features + */ + +/* + If we're compiling without support for threads/exceptions we have to + disable the corresponding features. + */ +#ifdef wxNO_THREADS +# undef wxUSE_THREADS +# define wxUSE_THREADS 0 +#endif /* wxNO_THREADS */ + +#ifdef wxNO_EXCEPTIONS +# undef wxUSE_EXCEPTIONS +# define wxUSE_EXCEPTIONS 0 +#endif /* wxNO_EXCEPTIONS */ + +/* we also must disable exceptions if compiler doesn't support them */ +#if defined(_MSC_VER) && !defined(_CPPUNWIND) +# undef wxUSE_EXCEPTIONS +# define wxUSE_EXCEPTIONS 0 +#endif /* VC++ without exceptions support */ + + +/* + Section 1a: tests for non GUI features. + + please keep the options in alphabetical order! + */ + +#ifndef wxUSE_ANY +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ANY must be defined, please read comment near the top of this file." +# else +# define wxUSE_ANY 0 +# endif +#endif /* wxUSE_ANY */ + +#ifndef wxUSE_COMPILER_TLS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COMPILER_TLS must be defined, please read comment near the top of this file." +# else +# define wxUSE_COMPILER_TLS 0 +# endif +#endif /* !defined(wxUSE_COMPILER_TLS) */ + +#ifndef wxUSE_CONSOLE_EVENTLOOP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CONSOLE_EVENTLOOP must be defined, please read comment near the top of this file." +# else +# define wxUSE_CONSOLE_EVENTLOOP 0 +# endif +#endif /* !defined(wxUSE_CONSOLE_EVENTLOOP) */ + +#ifndef wxUSE_DYNLIB_CLASS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DYNLIB_CLASS must be defined, please read comment near the top of this file." +# else +# define wxUSE_DYNLIB_CLASS 0 +# endif +#endif /* !defined(wxUSE_DYNLIB_CLASS) */ + +#ifndef wxUSE_EXCEPTIONS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_EXCEPTIONS must be defined, please read comment near the top of this file." +# else +# define wxUSE_EXCEPTIONS 0 +# endif +#endif /* !defined(wxUSE_EXCEPTIONS) */ + +#ifndef wxUSE_FILE_HISTORY +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FILE_HISTORY must be defined, please read comment near the top of this file." +# else +# define wxUSE_FILE_HISTORY 0 +# endif +#endif /* !defined(wxUSE_FILE_HISTORY) */ + +#ifndef wxUSE_FILESYSTEM +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FILESYSTEM must be defined, please read comment near the top of this file." +# else +# define wxUSE_FILESYSTEM 0 +# endif +#endif /* !defined(wxUSE_FILESYSTEM) */ + +#ifndef wxUSE_FS_ARCHIVE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FS_ARCHIVE must be defined, please read comment near the top of this file." +# else +# define wxUSE_FS_ARCHIVE 0 +# endif +#endif /* !defined(wxUSE_FS_ARCHIVE) */ + +#ifndef wxUSE_FSVOLUME +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FSVOLUME must be defined, please read comment near the top of this file." +# else +# define wxUSE_FSVOLUME 0 +# endif +#endif /* !defined(wxUSE_FSVOLUME) */ + +#ifndef wxUSE_FSWATCHER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FSWATCHER must be defined, please read comment near the top of this file." +# else +# define wxUSE_FSWATCHER 0 +# endif +#endif /* !defined(wxUSE_FSWATCHER) */ + +#ifndef wxUSE_DYNAMIC_LOADER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DYNAMIC_LOADER must be defined, please read comment near the top of this file." +# else +# define wxUSE_DYNAMIC_LOADER 0 +# endif +#endif /* !defined(wxUSE_DYNAMIC_LOADER) */ + +#ifndef wxUSE_INTL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_INTL must be defined, please read comment near the top of this file." +# else +# define wxUSE_INTL 0 +# endif +#endif /* !defined(wxUSE_INTL) */ + +#ifndef wxUSE_IPV6 +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_IPV6 must be defined, please read comment near the top of this file." +# else +# define wxUSE_IPV6 0 +# endif +#endif /* !defined(wxUSE_IPV6) */ + +#ifndef wxUSE_LOG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LOG must be defined, please read comment near the top of this file." +# else +# define wxUSE_LOG 0 +# endif +#endif /* !defined(wxUSE_LOG) */ + +#ifndef wxUSE_LONGLONG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LONGLONG must be defined, please read comment near the top of this file." +# else +# define wxUSE_LONGLONG 0 +# endif +#endif /* !defined(wxUSE_LONGLONG) */ + +#ifndef wxUSE_MIMETYPE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MIMETYPE must be defined, please read comment near the top of this file." +# else +# define wxUSE_MIMETYPE 0 +# endif +#endif /* !defined(wxUSE_MIMETYPE) */ + +#ifndef wxUSE_ON_FATAL_EXCEPTION +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ON_FATAL_EXCEPTION must be defined, please read comment near the top of this file." +# else +# define wxUSE_ON_FATAL_EXCEPTION 0 +# endif +#endif /* !defined(wxUSE_ON_FATAL_EXCEPTION) */ + +#ifndef wxUSE_PRINTF_POS_PARAMS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PRINTF_POS_PARAMS must be defined, please read comment near the top of this file." +# else +# define wxUSE_PRINTF_POS_PARAMS 0 +# endif +#endif /* !defined(wxUSE_PRINTF_POS_PARAMS) */ + +#ifndef wxUSE_PROTOCOL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PROTOCOL must be defined, please read comment near the top of this file." +# else +# define wxUSE_PROTOCOL 0 +# endif +#endif /* !defined(wxUSE_PROTOCOL) */ + +/* we may not define wxUSE_PROTOCOL_XXX if wxUSE_PROTOCOL is set to 0 */ +#if !wxUSE_PROTOCOL +# undef wxUSE_PROTOCOL_HTTP +# undef wxUSE_PROTOCOL_FTP +# undef wxUSE_PROTOCOL_FILE +# define wxUSE_PROTOCOL_HTTP 0 +# define wxUSE_PROTOCOL_FTP 0 +# define wxUSE_PROTOCOL_FILE 0 +#endif /* wxUSE_PROTOCOL */ + +#ifndef wxUSE_PROTOCOL_HTTP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PROTOCOL_HTTP must be defined, please read comment near the top of this file." +# else +# define wxUSE_PROTOCOL_HTTP 0 +# endif +#endif /* !defined(wxUSE_PROTOCOL_HTTP) */ + +#ifndef wxUSE_PROTOCOL_FTP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PROTOCOL_FTP must be defined, please read comment near the top of this file." +# else +# define wxUSE_PROTOCOL_FTP 0 +# endif +#endif /* !defined(wxUSE_PROTOCOL_FTP) */ + +#ifndef wxUSE_PROTOCOL_FILE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PROTOCOL_FILE must be defined, please read comment near the top of this file." +# else +# define wxUSE_PROTOCOL_FILE 0 +# endif +#endif /* !defined(wxUSE_PROTOCOL_FILE) */ + +#ifndef wxUSE_REGEX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_REGEX must be defined, please read comment near the top of this file." +# else +# define wxUSE_REGEX 0 +# endif +#endif /* !defined(wxUSE_REGEX) */ + +#ifndef wxUSE_STDPATHS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STDPATHS must be defined, please read comment near the top of this file." +# else +# define wxUSE_STDPATHS 1 +# endif +#endif /* !defined(wxUSE_STDPATHS) */ + +#ifndef wxUSE_XML +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_XML must be defined, please read comment near the top of this file." +# else +# define wxUSE_XML 0 +# endif +#endif /* !defined(wxUSE_XML) */ + +#ifndef wxUSE_SOCKETS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SOCKETS must be defined, please read comment near the top of this file." +# else +# define wxUSE_SOCKETS 0 +# endif +#endif /* !defined(wxUSE_SOCKETS) */ + +#ifndef wxUSE_STD_CONTAINERS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STD_CONTAINERS must be defined, please read comment near the top of this file." +# else +# define wxUSE_STD_CONTAINERS 0 +# endif +#endif /* !defined(wxUSE_STD_CONTAINERS) */ + +#ifndef wxUSE_STD_STRING_CONV_IN_WXSTRING +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STD_STRING_CONV_IN_WXSTRING must be defined, please read comment near the top of this file." +# else +# define wxUSE_STD_STRING_CONV_IN_WXSTRING 0 +# endif +#endif /* !defined(wxUSE_STD_STRING_CONV_IN_WXSTRING) */ + +#ifndef wxUSE_STREAMS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STREAMS must be defined, please read comment near the top of this file." +# else +# define wxUSE_STREAMS 0 +# endif +#endif /* !defined(wxUSE_STREAMS) */ + +#ifndef wxUSE_STOPWATCH +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STOPWATCH must be defined, please read comment near the top of this file." +# else +# define wxUSE_STOPWATCH 0 +# endif +#endif /* !defined(wxUSE_STOPWATCH) */ + +#ifndef wxUSE_TEXTBUFFER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TEXTBUFFER must be defined, please read comment near the top of this file." +# else +# define wxUSE_TEXTBUFFER 0 +# endif +#endif /* !defined(wxUSE_TEXTBUFFER) */ + +#ifndef wxUSE_TEXTFILE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TEXTFILE must be defined, please read comment near the top of this file." +# else +# define wxUSE_TEXTFILE 0 +# endif +#endif /* !defined(wxUSE_TEXTFILE) */ + +#ifndef wxUSE_UNICODE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_UNICODE must be defined, please read comment near the top of this file." +# else +# define wxUSE_UNICODE 0 +# endif +#endif /* !defined(wxUSE_UNICODE) */ + +#ifndef wxUSE_URL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_URL must be defined, please read comment near the top of this file." +# else +# define wxUSE_URL 0 +# endif +#endif /* !defined(wxUSE_URL) */ + +#ifndef wxUSE_VARIANT +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_VARIANT must be defined, please read comment near the top of this file." +# else +# define wxUSE_VARIANT 0 +# endif +#endif /* wxUSE_VARIANT */ + +#ifndef wxUSE_XLOCALE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_XLOCALE must be defined, please read comment near the top of this file." +# else +# define wxUSE_XLOCALE 0 +# endif +#endif /* !defined(wxUSE_XLOCALE) */ + +/* + Section 1b: all these tests are for GUI only. + + please keep the options in alphabetical order! + */ +#if wxUSE_GUI + +/* + all of the settings tested below must be defined or we'd get an error from + preprocessor about invalid integer expression + */ + +#ifndef wxUSE_ABOUTDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ABOUTDLG must be defined, please read comment near the top of this file." +# else +# define wxUSE_ABOUTDLG 0 +# endif +#endif /* !defined(wxUSE_ABOUTDLG) */ + +#ifndef wxUSE_ACCEL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ACCEL must be defined, please read comment near the top of this file." +# else +# define wxUSE_ACCEL 0 +# endif +#endif /* !defined(wxUSE_ACCEL) */ + +#ifndef wxUSE_ACCESSIBILITY +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ACCESSIBILITY must be defined, please read comment near the top of this file." +# else +# define wxUSE_ACCESSIBILITY 0 +# endif +#endif /* !defined(wxUSE_ACCESSIBILITY) */ + +#ifndef wxUSE_ANIMATIONCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ANIMATIONCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_ANIMATIONCTRL 0 +# endif +#endif /* !defined(wxUSE_ANIMATIONCTRL) */ + +#ifndef wxUSE_ARTPROVIDER_STD +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ARTPROVIDER_STD must be defined, please read comment near the top of this file." +# else +# define wxUSE_ARTPROVIDER_STD 0 +# endif +#endif /* !defined(wxUSE_ARTPROVIDER_STD) */ + +#ifndef wxUSE_ARTPROVIDER_TANGO +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ARTPROVIDER_TANGO must be defined, please read comment near the top of this file." +# else +# define wxUSE_ARTPROVIDER_TANGO 0 +# endif +#endif /* !defined(wxUSE_ARTPROVIDER_TANGO) */ + +#ifndef wxUSE_AUTOID_MANAGEMENT +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_AUTOID_MANAGEMENT must be defined, please read comment near the top of this file." +# else +# define wxUSE_AUTOID_MANAGEMENT 0 +# endif +#endif /* !defined(wxUSE_AUTOID_MANAGEMENT) */ + +#ifndef wxUSE_BITMAPCOMBOBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_BITMAPCOMBOBOX must be defined, please read comment near the top of this file." +# else +# define wxUSE_BITMAPCOMBOBOX 0 +# endif +#endif /* !defined(wxUSE_BITMAPCOMBOBOX) */ + +#ifndef wxUSE_BMPBUTTON +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_BMPBUTTON must be defined, please read comment near the top of this file." +# else +# define wxUSE_BMPBUTTON 0 +# endif +#endif /* !defined(wxUSE_BMPBUTTON) */ + +#ifndef wxUSE_BUTTON +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_BUTTON must be defined, please read comment near the top of this file." +# else +# define wxUSE_BUTTON 0 +# endif +#endif /* !defined(wxUSE_BUTTON) */ + +#ifndef wxUSE_CAIRO +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CAIRO must be defined, please read comment near the top of this file." +# else +# define wxUSE_CAIRO 0 +# endif +#endif /* !defined(wxUSE_CAIRO) */ + +#ifndef wxUSE_CALENDARCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CALENDARCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_CALENDARCTRL 0 +# endif +#endif /* !defined(wxUSE_CALENDARCTRL) */ + +#ifndef wxUSE_CARET +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CARET must be defined, please read comment near the top of this file." +# else +# define wxUSE_CARET 0 +# endif +#endif /* !defined(wxUSE_CARET) */ + +#ifndef wxUSE_CHECKBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CHECKBOX must be defined, please read comment near the top of this file." +# else +# define wxUSE_CHECKBOX 0 +# endif +#endif /* !defined(wxUSE_CHECKBOX) */ + +#ifndef wxUSE_CHECKLISTBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CHECKLISTBOX must be defined, please read comment near the top of this file." +# else +# define wxUSE_CHECKLISTBOX 0 +# endif +#endif /* !defined(wxUSE_CHECKLISTBOX) */ + +#ifndef wxUSE_CHOICE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CHOICE must be defined, please read comment near the top of this file." +# else +# define wxUSE_CHOICE 0 +# endif +#endif /* !defined(wxUSE_CHOICE) */ + +#ifndef wxUSE_CHOICEBOOK +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CHOICEBOOK must be defined, please read comment near the top of this file." +# else +# define wxUSE_CHOICEBOOK 0 +# endif +#endif /* !defined(wxUSE_CHOICEBOOK) */ + +#ifndef wxUSE_CHOICEDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CHOICEDLG must be defined, please read comment near the top of this file." +# else +# define wxUSE_CHOICEDLG 0 +# endif +#endif /* !defined(wxUSE_CHOICEDLG) */ + +#ifndef wxUSE_CLIPBOARD +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CLIPBOARD must be defined, please read comment near the top of this file." +# else +# define wxUSE_CLIPBOARD 0 +# endif +#endif /* !defined(wxUSE_CLIPBOARD) */ + +#ifndef wxUSE_COLLPANE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COLLPANE must be defined, please read comment near the top of this file." +# else +# define wxUSE_COLLPANE 0 +# endif +#endif /* !defined(wxUSE_COLLPANE) */ + +#ifndef wxUSE_COLOURDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COLOURDLG must be defined, please read comment near the top of this file." +# else +# define wxUSE_COLOURDLG 0 +# endif +#endif /* !defined(wxUSE_COLOURDLG) */ + +#ifndef wxUSE_COLOURPICKERCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COLOURPICKERCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_COLOURPICKERCTRL 0 +# endif +#endif /* !defined(wxUSE_COLOURPICKERCTRL) */ + +#ifndef wxUSE_COMBOBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COMBOBOX must be defined, please read comment near the top of this file." +# else +# define wxUSE_COMBOBOX 0 +# endif +#endif /* !defined(wxUSE_COMBOBOX) */ + +#ifndef wxUSE_COMMANDLINKBUTTON +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COMMANDLINKBUTTON must be defined, please read comment near the top of this file." +# else +# define wxUSE_COMMANDLINKBUTTON 0 +# endif +#endif /* !defined(wxUSE_COMMANDLINKBUTTON) */ + +#ifndef wxUSE_COMBOCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COMBOCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_COMBOCTRL 0 +# endif +#endif /* !defined(wxUSE_COMBOCTRL) */ + +#ifndef wxUSE_DATAOBJ +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DATAOBJ must be defined, please read comment near the top of this file." +# else +# define wxUSE_DATAOBJ 0 +# endif +#endif /* !defined(wxUSE_DATAOBJ) */ + +#ifndef wxUSE_DATAVIEWCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DATAVIEWCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_DATAVIEWCTRL 0 +# endif +#endif /* !defined(wxUSE_DATAVIEWCTRL) */ + +#ifndef wxUSE_DATEPICKCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DATEPICKCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_DATEPICKCTRL 0 +# endif +#endif /* !defined(wxUSE_DATEPICKCTRL) */ + +#ifndef wxUSE_DC_TRANSFORM_MATRIX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DC_TRANSFORM_MATRIX must be defined, please read comment near the top of this file." +# else +# define wxUSE_DC_TRANSFORM_MATRIX 1 +# endif +#endif /* wxUSE_DC_TRANSFORM_MATRIX */ + +#ifndef wxUSE_DIRPICKERCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DIRPICKERCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_DIRPICKERCTRL 0 +# endif +#endif /* !defined(wxUSE_DIRPICKERCTRL) */ + +#ifndef wxUSE_DISPLAY +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DISPLAY must be defined, please read comment near the top of this file." +# else +# define wxUSE_DISPLAY 0 +# endif +#endif /* !defined(wxUSE_DISPLAY) */ + +#ifndef wxUSE_DOC_VIEW_ARCHITECTURE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DOC_VIEW_ARCHITECTURE must be defined, please read comment near the top of this file." +# else +# define wxUSE_DOC_VIEW_ARCHITECTURE 0 +# endif +#endif /* !defined(wxUSE_DOC_VIEW_ARCHITECTURE) */ + +#ifndef wxUSE_FILECTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FILECTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_FILECTRL 0 +# endif +#endif /* !defined(wxUSE_FILECTRL) */ + +#ifndef wxUSE_FILEDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FILEDLG must be defined, please read comment near the top of this file." +# else +# define wxUSE_FILEDLG 0 +# endif +#endif /* !defined(wxUSE_FILEDLG) */ + +#ifndef wxUSE_FILEPICKERCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FILEPICKERCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_FILEPICKERCTRL 0 +# endif +#endif /* !defined(wxUSE_FILEPICKERCTRL) */ + +#ifndef wxUSE_FONTDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FONTDLG must be defined, please read comment near the top of this file." +# else +# define wxUSE_FONTDLG 0 +# endif +#endif /* !defined(wxUSE_FONTDLG) */ + +#ifndef wxUSE_FONTMAP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FONTMAP must be defined, please read comment near the top of this file." +# else +# define wxUSE_FONTMAP 0 +# endif +#endif /* !defined(wxUSE_FONTMAP) */ + +#ifndef wxUSE_FONTPICKERCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FONTPICKERCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_FONTPICKERCTRL 0 +# endif +#endif /* !defined(wxUSE_FONTPICKERCTRL) */ + +#ifndef wxUSE_GAUGE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_GAUGE must be defined, please read comment near the top of this file." +# else +# define wxUSE_GAUGE 0 +# endif +#endif /* !defined(wxUSE_GAUGE) */ + +#ifndef wxUSE_GRAPHICS_CONTEXT +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_GRAPHICS_CONTEXT must be defined, please read comment near the top of this file." +# else +# define wxUSE_GRAPHICS_CONTEXT 0 +# endif +#endif /* !defined(wxUSE_GRAPHICS_CONTEXT) */ + + +#ifndef wxUSE_GRID +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_GRID must be defined, please read comment near the top of this file." +# else +# define wxUSE_GRID 0 +# endif +#endif /* !defined(wxUSE_GRID) */ + +#ifndef wxUSE_HEADERCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_HEADERCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_HEADERCTRL 0 +# endif +#endif /* !defined(wxUSE_HEADERCTRL) */ + +#ifndef wxUSE_HELP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_HELP must be defined, please read comment near the top of this file." +# else +# define wxUSE_HELP 0 +# endif +#endif /* !defined(wxUSE_HELP) */ + +#ifndef wxUSE_HYPERLINKCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_HYPERLINKCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_HYPERLINKCTRL 0 +# endif +#endif /* !defined(wxUSE_HYPERLINKCTRL) */ + +#ifndef wxUSE_HTML +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_HTML must be defined, please read comment near the top of this file." +# else +# define wxUSE_HTML 0 +# endif +#endif /* !defined(wxUSE_HTML) */ + +#ifndef wxUSE_LIBMSPACK +# if !defined(__UNIX__) + /* set to 0 on platforms that don't have libmspack */ +# define wxUSE_LIBMSPACK 0 +# else +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LIBMSPACK must be defined, please read comment near the top of this file." +# else +# define wxUSE_LIBMSPACK 0 +# endif +# endif +#endif /* !defined(wxUSE_LIBMSPACK) */ + +#ifndef wxUSE_ICO_CUR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ICO_CUR must be defined, please read comment near the top of this file." +# else +# define wxUSE_ICO_CUR 0 +# endif +#endif /* !defined(wxUSE_ICO_CUR) */ + +#ifndef wxUSE_IFF +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_IFF must be defined, please read comment near the top of this file." +# else +# define wxUSE_IFF 0 +# endif +#endif /* !defined(wxUSE_IFF) */ + +#ifndef wxUSE_IMAGLIST +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_IMAGLIST must be defined, please read comment near the top of this file." +# else +# define wxUSE_IMAGLIST 0 +# endif +#endif /* !defined(wxUSE_IMAGLIST) */ + +#ifndef wxUSE_INFOBAR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_INFOBAR must be defined, please read comment near the top of this file." +# else +# define wxUSE_INFOBAR 0 +# endif +#endif /* !defined(wxUSE_INFOBAR) */ + +#ifndef wxUSE_JOYSTICK +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_JOYSTICK must be defined, please read comment near the top of this file." +# else +# define wxUSE_JOYSTICK 0 +# endif +#endif /* !defined(wxUSE_JOYSTICK) */ + +#ifndef wxUSE_LISTBOOK +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LISTBOOK must be defined, please read comment near the top of this file." +# else +# define wxUSE_LISTBOOK 0 +# endif +#endif /* !defined(wxUSE_LISTBOOK) */ + +#ifndef wxUSE_LISTBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LISTBOX must be defined, please read comment near the top of this file." +# else +# define wxUSE_LISTBOX 0 +# endif +#endif /* !defined(wxUSE_LISTBOX) */ + +#ifndef wxUSE_LISTCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LISTCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_LISTCTRL 0 +# endif +#endif /* !defined(wxUSE_LISTCTRL) */ + +#ifndef wxUSE_LOGGUI +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LOGGUI must be defined, please read comment near the top of this file." +# else +# define wxUSE_LOGGUI 0 +# endif +#endif /* !defined(wxUSE_LOGGUI) */ + +#ifndef wxUSE_LOGWINDOW +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LOGWINDOW must be defined, please read comment near the top of this file." +# else +# define wxUSE_LOGWINDOW 0 +# endif +#endif /* !defined(wxUSE_LOGWINDOW) */ + +#ifndef wxUSE_LOG_DIALOG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LOG_DIALOG must be defined, please read comment near the top of this file." +# else +# define wxUSE_LOG_DIALOG 0 +# endif +#endif /* !defined(wxUSE_LOG_DIALOG) */ + +#ifndef wxUSE_MARKUP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MARKUP must be defined, please read comment near the top of this file." +# else +# define wxUSE_MARKUP 0 +# endif +#endif /* !defined(wxUSE_MARKUP) */ + +#ifndef wxUSE_MDI +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MDI must be defined, please read comment near the top of this file." +# else +# define wxUSE_MDI 0 +# endif +#endif /* !defined(wxUSE_MDI) */ + +#ifndef wxUSE_MDI_ARCHITECTURE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MDI_ARCHITECTURE must be defined, please read comment near the top of this file." +# else +# define wxUSE_MDI_ARCHITECTURE 0 +# endif +#endif /* !defined(wxUSE_MDI_ARCHITECTURE) */ + +#ifndef wxUSE_MENUS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MENUS must be defined, please read comment near the top of this file." +# else +# define wxUSE_MENUS 0 +# endif +#endif /* !defined(wxUSE_MENUS) */ + +#ifndef wxUSE_MSGDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MSGDLG must be defined, please read comment near the top of this file." +# else +# define wxUSE_MSGDLG 0 +# endif +#endif /* !defined(wxUSE_MSGDLG) */ + +#ifndef wxUSE_NOTEBOOK +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_NOTEBOOK must be defined, please read comment near the top of this file." +# else +# define wxUSE_NOTEBOOK 0 +# endif +#endif /* !defined(wxUSE_NOTEBOOK) */ + +#ifndef wxUSE_NOTIFICATION_MESSAGE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_NOTIFICATION_MESSAGE must be defined, please read comment near the top of this file." +# else +# define wxUSE_NOTIFICATION_MESSAGE 0 +# endif +#endif /* !defined(wxUSE_NOTIFICATION_MESSAGE) */ + +#ifndef wxUSE_ODCOMBOBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ODCOMBOBOX must be defined, please read comment near the top of this file." +# else +# define wxUSE_ODCOMBOBOX 0 +# endif +#endif /* !defined(wxUSE_ODCOMBOBOX) */ + +#ifndef wxUSE_PALETTE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PALETTE must be defined, please read comment near the top of this file." +# else +# define wxUSE_PALETTE 0 +# endif +#endif /* !defined(wxUSE_PALETTE) */ + +#ifndef wxUSE_POPUPWIN +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_POPUPWIN must be defined, please read comment near the top of this file." +# else +# define wxUSE_POPUPWIN 0 +# endif +#endif /* !defined(wxUSE_POPUPWIN) */ + +#ifndef wxUSE_PREFERENCES_EDITOR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PREFERENCES_EDITOR must be defined, please read comment near the top of this file." +# else +# define wxUSE_PREFERENCES_EDITOR 0 +# endif +#endif /* !defined(wxUSE_PREFERENCES_EDITOR) */ + +#ifndef wxUSE_PRINTING_ARCHITECTURE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PRINTING_ARCHITECTURE must be defined, please read comment near the top of this file." +# else +# define wxUSE_PRINTING_ARCHITECTURE 0 +# endif +#endif /* !defined(wxUSE_PRINTING_ARCHITECTURE) */ + +#ifndef wxUSE_RADIOBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_RADIOBOX must be defined, please read comment near the top of this file." +# else +# define wxUSE_RADIOBOX 0 +# endif +#endif /* !defined(wxUSE_RADIOBOX) */ + +#ifndef wxUSE_RADIOBTN +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_RADIOBTN must be defined, please read comment near the top of this file." +# else +# define wxUSE_RADIOBTN 0 +# endif +#endif /* !defined(wxUSE_RADIOBTN) */ + +#ifndef wxUSE_REARRANGECTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_REARRANGECTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_REARRANGECTRL 0 +# endif +#endif /* !defined(wxUSE_REARRANGECTRL) */ + +#ifndef wxUSE_RIBBON +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_RIBBON must be defined, please read comment near the top of this file." +# else +# define wxUSE_RIBBON 0 +# endif +#endif /* !defined(wxUSE_RIBBON) */ + +#ifndef wxUSE_RICHMSGDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_RICHMSGDLG must be defined, please read comment near the top of this file." +# else +# define wxUSE_RICHMSGDLG 0 +# endif +#endif /* !defined(wxUSE_RICHMSGDLG) */ + +#ifndef wxUSE_RICHTOOLTIP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_RICHTOOLTIP must be defined, please read comment near the top of this file." +# else +# define wxUSE_RICHTOOLTIP 0 +# endif +#endif /* !defined(wxUSE_RICHTOOLTIP) */ + +#ifndef wxUSE_SASH +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SASH must be defined, please read comment near the top of this file." +# else +# define wxUSE_SASH 0 +# endif +#endif /* !defined(wxUSE_SASH) */ + +#ifndef wxUSE_SCROLLBAR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SCROLLBAR must be defined, please read comment near the top of this file." +# else +# define wxUSE_SCROLLBAR 0 +# endif +#endif /* !defined(wxUSE_SCROLLBAR) */ + +#ifndef wxUSE_SLIDER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SLIDER must be defined, please read comment near the top of this file." +# else +# define wxUSE_SLIDER 0 +# endif +#endif /* !defined(wxUSE_SLIDER) */ + +#ifndef wxUSE_SOUND +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SOUND must be defined, please read comment near the top of this file." +# else +# define wxUSE_SOUND 0 +# endif +#endif /* !defined(wxUSE_SOUND) */ + +#ifndef wxUSE_SPINBTN +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SPINBTN must be defined, please read comment near the top of this file." +# else +# define wxUSE_SPINBTN 0 +# endif +#endif /* !defined(wxUSE_SPINBTN) */ + +#ifndef wxUSE_SPINCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SPINCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_SPINCTRL 0 +# endif +#endif /* !defined(wxUSE_SPINCTRL) */ + +#ifndef wxUSE_SPLASH +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SPLASH must be defined, please read comment near the top of this file." +# else +# define wxUSE_SPLASH 0 +# endif +#endif /* !defined(wxUSE_SPLASH) */ + +#ifndef wxUSE_SPLITTER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SPLITTER must be defined, please read comment near the top of this file." +# else +# define wxUSE_SPLITTER 0 +# endif +#endif /* !defined(wxUSE_SPLITTER) */ + +#ifndef wxUSE_STATBMP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STATBMP must be defined, please read comment near the top of this file." +# else +# define wxUSE_STATBMP 0 +# endif +#endif /* !defined(wxUSE_STATBMP) */ + +#ifndef wxUSE_STATBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STATBOX must be defined, please read comment near the top of this file." +# else +# define wxUSE_STATBOX 0 +# endif +#endif /* !defined(wxUSE_STATBOX) */ + +#ifndef wxUSE_STATLINE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STATLINE must be defined, please read comment near the top of this file." +# else +# define wxUSE_STATLINE 0 +# endif +#endif /* !defined(wxUSE_STATLINE) */ + +#ifndef wxUSE_STATTEXT +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STATTEXT must be defined, please read comment near the top of this file." +# else +# define wxUSE_STATTEXT 0 +# endif +#endif /* !defined(wxUSE_STATTEXT) */ + +#ifndef wxUSE_STATUSBAR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STATUSBAR must be defined, please read comment near the top of this file." +# else +# define wxUSE_STATUSBAR 0 +# endif +#endif /* !defined(wxUSE_STATUSBAR) */ + +#ifndef wxUSE_TASKBARICON +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TASKBARICON must be defined, please read comment near the top of this file." +# else +# define wxUSE_TASKBARICON 0 +# endif +#endif /* !defined(wxUSE_TASKBARICON) */ + +#ifndef wxUSE_TEXTCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TEXTCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_TEXTCTRL 0 +# endif +#endif /* !defined(wxUSE_TEXTCTRL) */ + +#ifndef wxUSE_TIMEPICKCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TIMEPICKCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_TIMEPICKCTRL 0 +# endif +#endif /* !defined(wxUSE_TIMEPICKCTRL) */ + +#ifndef wxUSE_TIPWINDOW +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TIPWINDOW must be defined, please read comment near the top of this file." +# else +# define wxUSE_TIPWINDOW 0 +# endif +#endif /* !defined(wxUSE_TIPWINDOW) */ + +#ifndef wxUSE_TOOLBAR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TOOLBAR must be defined, please read comment near the top of this file." +# else +# define wxUSE_TOOLBAR 0 +# endif +#endif /* !defined(wxUSE_TOOLBAR) */ + +#ifndef wxUSE_TOOLTIPS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TOOLTIPS must be defined, please read comment near the top of this file." +# else +# define wxUSE_TOOLTIPS 0 +# endif +#endif /* !defined(wxUSE_TOOLTIPS) */ + +#ifndef wxUSE_TREECTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TREECTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_TREECTRL 0 +# endif +#endif /* !defined(wxUSE_TREECTRL) */ + +#ifndef wxUSE_TREELISTCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TREELISTCTRL must be defined, please read comment near the top of this file." +# else +# define wxUSE_TREELISTCTRL 0 +# endif +#endif /* !defined(wxUSE_TREELISTCTRL) */ + +#ifndef wxUSE_UIACTIONSIMULATOR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_UIACTIONSIMULATOR must be defined, please read comment near the top of this file." +# else +# define wxUSE_UIACTIONSIMULATOR 0 +# endif +#endif /* !defined(wxUSE_UIACTIONSIMULATOR) */ + +#ifndef wxUSE_VALIDATORS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_VALIDATORS must be defined, please read comment near the top of this file." +# else +# define wxUSE_VALIDATORS 0 +# endif +#endif /* !defined(wxUSE_VALIDATORS) */ + +#ifndef wxUSE_WEBVIEW +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_WEBVIEW must be defined, please read comment near the top of this file." +# else +# define wxUSE_WEBVIEW 0 +# endif +#endif /* !defined(wxUSE_WEBVIEW) */ + +#ifndef wxUSE_WXHTML_HELP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_WXHTML_HELP must be defined, please read comment near the top of this file." +# else +# define wxUSE_WXHTML_HELP 0 +# endif +#endif /* !defined(wxUSE_WXHTML_HELP) */ + +#ifndef wxUSE_XRC +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_XRC must be defined, please read comment near the top of this file." +# else +# define wxUSE_XRC 0 +# endif +#endif /* !defined(wxUSE_XRC) */ + +#endif /* wxUSE_GUI */ + +/* + Section 2: platform-specific checks. + + This must be done after checking that everything is defined as the platform + checks use wxUSE_XXX symbols in #if tests. + */ + +#if defined(__WXWINCE__) +# include "wx/msw/wince/chkconf.h" +#elif defined(__WINDOWS__) +# include "wx/msw/chkconf.h" +# if defined(__WXGTK__) +# include "wx/gtk/chkconf.h" +# endif +#elif defined(__WXGTK__) +# include "wx/gtk/chkconf.h" +#elif defined(__WXCOCOA__) +# include "wx/cocoa/chkconf.h" +#elif defined(__WXMAC__) +# include "wx/osx/chkconf.h" +#elif defined(__OS2__) +# include "wx/os2/chkconf.h" +#elif defined(__WXDFB__) +# include "wx/dfb/chkconf.h" +#elif defined(__WXMOTIF__) +# include "wx/motif/chkconf.h" +#elif defined(__WXX11__) +# include "wx/x11/chkconf.h" +#elif defined(__WXANDROID__) +# include "wx/android/chkconf.h" +#endif + +/* + __UNIX__ is also defined under Cygwin but we shouldn't perform these checks + there if we're building Windows ports. + */ +#if defined(__UNIX__) && !defined(__WINDOWS__) +# include "wx/unix/chkconf.h" +#endif + +#ifdef __WXUNIVERSAL__ +# include "wx/univ/chkconf.h" +#endif + +/* + Section 3a: check consistency of the non-GUI settings. + */ + +#if WXWIN_COMPATIBILITY_2_6 +# if !WXWIN_COMPATIBILITY_2_8 +# ifdef wxABORT_ON_CONFIG_ERROR +# error "2.6.X compatibility requires 2.8.X compatibility" +# else +# undef WXWIN_COMPATIBILITY_2_8 +# define WXWIN_COMPATIBILITY_2_8 1 +# endif +# endif +#endif /* WXWIN_COMPATIBILITY_2_6 */ + +#if wxUSE_ARCHIVE_STREAMS +# if !wxUSE_DATETIME +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxArchive requires wxUSE_DATETIME" +# else +# undef wxUSE_ARCHIVE_STREAMS +# define wxUSE_ARCHIVE_STREAMS 0 +# endif +# endif +#endif /* wxUSE_ARCHIVE_STREAMS */ + +#if wxUSE_PROTOCOL_FILE || wxUSE_PROTOCOL_FTP || wxUSE_PROTOCOL_HTTP +# if !wxUSE_PROTOCOL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PROTOCOL_XXX requires wxUSE_PROTOCOL" +# else +# undef wxUSE_PROTOCOL +# define wxUSE_PROTOCOL 1 +# endif +# endif +#endif /* wxUSE_PROTOCOL_XXX */ + +#if wxUSE_URL +# if !wxUSE_PROTOCOL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_URL requires wxUSE_PROTOCOL" +# else +# undef wxUSE_PROTOCOL +# define wxUSE_PROTOCOL 1 +# endif +# endif +#endif /* wxUSE_URL */ + +#if wxUSE_PROTOCOL +# if !wxUSE_SOCKETS +# if wxUSE_PROTOCOL_HTTP || wxUSE_PROTOCOL_FTP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PROTOCOL_FTP/HTTP requires wxUSE_SOCKETS" +# else +# undef wxUSE_SOCKETS +# define wxUSE_SOCKETS 1 +# endif +# endif +# endif + +# if !wxUSE_STREAMS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PROTOCOL requires wxUSE_STREAMS" +# else +# undef wxUSE_STREAMS +# define wxUSE_STREAMS 1 +# endif +# endif +#endif /* wxUSE_PROTOCOL */ + +/* have to test for wxUSE_HTML before wxUSE_FILESYSTEM */ +#if wxUSE_HTML +# if !wxUSE_FILESYSTEM +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxHTML requires wxFileSystem" +# else +# undef wxUSE_FILESYSTEM +# define wxUSE_FILESYSTEM 1 +# endif +# endif +#endif /* wxUSE_HTML */ + +#if wxUSE_FS_ARCHIVE +# if !wxUSE_FILESYSTEM +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxArchiveFSHandler requires wxFileSystem" +# else +# undef wxUSE_FILESYSTEM +# define wxUSE_FILESYSTEM 1 +# endif +# endif +# if !wxUSE_ARCHIVE_STREAMS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxArchiveFSHandler requires wxArchive" +# else +# undef wxUSE_ARCHIVE_STREAMS +# define wxUSE_ARCHIVE_STREAMS 1 +# endif +# endif +#endif /* wxUSE_FS_ARCHIVE */ + +#if wxUSE_FILESYSTEM +# if !wxUSE_STREAMS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FILESYSTEM requires wxUSE_STREAMS" +# else +# undef wxUSE_STREAMS +# define wxUSE_STREAMS 1 +# endif +# endif +# if !wxUSE_FILE && !wxUSE_FFILE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FILESYSTEM requires either wxUSE_FILE or wxUSE_FFILE" +# else +# undef wxUSE_FILE +# define wxUSE_FILE 1 +# undef wxUSE_FFILE +# define wxUSE_FFILE 1 +# endif +# endif +#endif /* wxUSE_FILESYSTEM */ + +#if wxUSE_FS_INET +# if !wxUSE_PROTOCOL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FS_INET requires wxUSE_PROTOCOL" +# else +# undef wxUSE_PROTOCOL +# define wxUSE_PROTOCOL 1 +# endif +# endif +#endif /* wxUSE_FS_INET */ + +#if wxUSE_STOPWATCH || wxUSE_DATETIME +# if !wxUSE_LONGLONG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STOPWATCH and wxUSE_DATETIME require wxUSE_LONGLONG" +# else +# undef wxUSE_LONGLONG +# define wxUSE_LONGLONG 1 +# endif +# endif +#endif /* wxUSE_STOPWATCH */ + +#if wxUSE_MIMETYPE && !wxUSE_TEXTFILE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MIMETYPE requires wxUSE_TEXTFILE" +# else +# undef wxUSE_TEXTFILE +# define wxUSE_TEXTFILE 1 +# endif +#endif /* wxUSE_MIMETYPE */ + +#if wxUSE_TEXTFILE && !wxUSE_TEXTBUFFER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TEXTFILE requires wxUSE_TEXTBUFFER" +# else +# undef wxUSE_TEXTBUFFER +# define wxUSE_TEXTBUFFER 1 +# endif +#endif /* wxUSE_TEXTFILE */ + +#if wxUSE_TEXTFILE && !wxUSE_FILE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TEXTFILE requires wxUSE_FILE" +# else +# undef wxUSE_FILE +# define wxUSE_FILE 1 +# endif +#endif /* wxUSE_TEXTFILE */ + +#if !wxUSE_DYNLIB_CLASS +# if wxUSE_DYNAMIC_LOADER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DYNAMIC_LOADER requires wxUSE_DYNLIB_CLASS." +# else +# define wxUSE_DYNLIB_CLASS 1 +# endif +# endif +#endif /* wxUSE_DYNLIB_CLASS */ + +#if wxUSE_ZIPSTREAM +# if !wxUSE_ZLIB +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxZip requires wxZlib" +# else +# undef wxUSE_ZLIB +# define wxUSE_ZLIB 1 +# endif +# endif +# if !wxUSE_ARCHIVE_STREAMS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxZip requires wxArchive" +# else +# undef wxUSE_ARCHIVE_STREAMS +# define wxUSE_ARCHIVE_STREAMS 1 +# endif +# endif +#endif /* wxUSE_ZIPSTREAM */ + +#if wxUSE_TARSTREAM +# if !wxUSE_ARCHIVE_STREAMS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxTar requires wxArchive" +# else +# undef wxUSE_ARCHIVE_STREAMS +# define wxUSE_ARCHIVE_STREAMS 1 +# endif +# endif +#endif /* wxUSE_TARSTREAM */ + +/* + Section 3b: the tests for the GUI settings only. + */ +#if wxUSE_GUI + +#if wxUSE_ACCESSIBILITY && !defined(__WXMSW__) +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ACCESSIBILITY is currently only supported under wxMSW" +# else +# undef wxUSE_ACCESSIBILITY +# define wxUSE_ACCESSIBILITY 0 +# endif +#endif /* wxUSE_ACCESSIBILITY */ + +#if wxUSE_BUTTON || \ + wxUSE_CALENDARCTRL || \ + wxUSE_CARET || \ + wxUSE_COMBOBOX || \ + wxUSE_BMPBUTTON || \ + wxUSE_CHECKBOX || \ + wxUSE_CHECKLISTBOX || \ + wxUSE_CHOICE || \ + wxUSE_GAUGE || \ + wxUSE_GRID || \ + wxUSE_HEADERCTRL || \ + wxUSE_LISTBOX || \ + wxUSE_LISTCTRL || \ + wxUSE_NOTEBOOK || \ + wxUSE_RADIOBOX || \ + wxUSE_RADIOBTN || \ + wxUSE_REARRANGECTRL || \ + wxUSE_SCROLLBAR || \ + wxUSE_SLIDER || \ + wxUSE_SPINBTN || \ + wxUSE_SPINCTRL || \ + wxUSE_STATBMP || \ + wxUSE_STATBOX || \ + wxUSE_STATLINE || \ + wxUSE_STATTEXT || \ + wxUSE_STATUSBAR || \ + wxUSE_TEXTCTRL || \ + wxUSE_TOOLBAR || \ + wxUSE_TREECTRL || \ + wxUSE_TREELISTCTRL +# if !wxUSE_CONTROLS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CONTROLS unset but some controls used" +# else +# undef wxUSE_CONTROLS +# define wxUSE_CONTROLS 1 +# endif +# endif +#endif /* controls */ + +#if wxUSE_BMPBUTTON +# if !wxUSE_BUTTON +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_BMPBUTTON requires wxUSE_BUTTON" +# else +# undef wxUSE_BUTTON +# define wxUSE_BUTTON 1 +# endif +# endif +#endif /* wxUSE_BMPBUTTON */ + +#if wxUSE_COMMANDLINKBUTTON +# if !wxUSE_BUTTON +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COMMANDLINKBUTTON requires wxUSE_BUTTON" +# else +# undef wxUSE_BUTTON +# define wxUSE_BUTTON 1 +# endif +# endif +#endif /* wxUSE_COMMANDLINKBUTTON */ + +/* + wxUSE_BOOKCTRL should be only used if any of the controls deriving from it + are used + */ +#ifdef wxUSE_BOOKCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_BOOKCTRL is defined automatically, don't define it" +# else +# undef wxUSE_BOOKCTRL +# endif +#endif + +#define wxUSE_BOOKCTRL (wxUSE_NOTEBOOK || \ + wxUSE_LISTBOOK || \ + wxUSE_CHOICEBOOK || \ + wxUSE_TOOLBOOK || \ + wxUSE_TREEBOOK) + +#if wxUSE_COLLPANE +# if !wxUSE_BUTTON || !wxUSE_STATLINE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COLLPANE requires wxUSE_BUTTON and wxUSE_STATLINE" +# else +# undef wxUSE_COLLPANE +# define wxUSE_COLLPANE 0 +# endif +# endif +#endif /* wxUSE_COLLPANE */ + +#if wxUSE_LISTBOOK +# if !wxUSE_LISTCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxListbook requires wxListCtrl" +# else +# undef wxUSE_LISTCTRL +# define wxUSE_LISTCTRL 1 +# endif +# endif +#endif /* wxUSE_LISTBOOK */ + +#if wxUSE_CHOICEBOOK +# if !wxUSE_CHOICE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxChoicebook requires wxChoice" +# else +# undef wxUSE_CHOICE +# define wxUSE_CHOICE 1 +# endif +# endif +#endif /* wxUSE_CHOICEBOOK */ + +#if wxUSE_TOOLBOOK +# if !wxUSE_TOOLBAR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxToolbook requires wxToolBar" +# else +# undef wxUSE_TOOLBAR +# define wxUSE_TOOLBAR 1 +# endif +# endif +#endif /* wxUSE_TOOLBOOK */ + +#if !wxUSE_ODCOMBOBOX +# if wxUSE_BITMAPCOMBOBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxBitmapComboBox requires wxOwnerDrawnComboBox" +# else +# undef wxUSE_BITMAPCOMBOBOX +# define wxUSE_BITMAPCOMBOBOX 0 +# endif +# endif +#endif /* !wxUSE_ODCOMBOBOX */ + +#if !wxUSE_HEADERCTRL +# if wxUSE_DATAVIEWCTRL || wxUSE_GRID +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxDataViewCtrl and wxGrid require wxHeaderCtrl" +# else +# undef wxUSE_HEADERCTRL +# define wxUSE_HEADERCTRL 1 +# endif +# endif +#endif /* !wxUSE_HEADERCTRL */ + +#if wxUSE_REARRANGECTRL +# if !wxUSE_CHECKLISTBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxRearrangeCtrl requires wxCheckListBox" +# else +# undef wxUSE_REARRANGECTRL +# define wxUSE_REARRANGECTRL 0 +# endif +# endif +#endif /* wxUSE_REARRANGECTRL */ + +#if wxUSE_RICHMSGDLG +# if !wxUSE_MSGDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_RICHMSGDLG requires wxUSE_MSGDLG" +# else +# undef wxUSE_MSGDLG +# define wxUSE_MSGDLG 1 +# endif +# endif +#endif /* wxUSE_RICHMSGDLG */ + +/* don't attempt to use native status bar on the platforms not having it */ +#ifndef wxUSE_NATIVE_STATUSBAR +# define wxUSE_NATIVE_STATUSBAR 0 +#elif wxUSE_NATIVE_STATUSBAR +# if defined(__WXUNIVERSAL__) || !(defined(__WXMSW__) || defined(__WXMAC__)) +# undef wxUSE_NATIVE_STATUSBAR +# define wxUSE_NATIVE_STATUSBAR 0 +# endif +#endif + +#if wxUSE_GRAPHICS_CONTEXT && !wxUSE_GEOMETRY +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_GRAPHICS_CONTEXT requires wxUSE_GEOMETRY" +# else +# undef wxUSE_GRAPHICS_CONTEXT +# define wxUSE_GRAPHICS_CONTEXT 0 +# endif +#endif /* wxUSE_GRAPHICS_CONTEXT */ + + +/* generic controls dependencies */ +#if !defined(__WXMSW__) || defined(__WXUNIVERSAL__) +# if wxUSE_FONTDLG || wxUSE_FILEDLG || wxUSE_CHOICEDLG + /* all common controls are needed by these dialogs */ +# if !defined(wxUSE_CHOICE) || \ + !defined(wxUSE_TEXTCTRL) || \ + !defined(wxUSE_BUTTON) || \ + !defined(wxUSE_CHECKBOX) || \ + !defined(wxUSE_STATTEXT) +# ifdef wxABORT_ON_CONFIG_ERROR +# error "These common controls are needed by common dialogs" +# else +# undef wxUSE_CHOICE +# define wxUSE_CHOICE 1 +# undef wxUSE_TEXTCTRL +# define wxUSE_TEXTCTRL 1 +# undef wxUSE_BUTTON +# define wxUSE_BUTTON 1 +# undef wxUSE_CHECKBOX +# define wxUSE_CHECKBOX 1 +# undef wxUSE_STATTEXT +# define wxUSE_STATTEXT 1 +# endif +# endif +# endif +#endif /* !wxMSW || wxUniv */ + +/* generic file dialog depends on (generic) file control */ +#if wxUSE_FILEDLG && !wxUSE_FILECTRL && \ + (defined(__WXUNIVERSAL__) || defined(__WXGTK__)) +# ifdef wxABORT_ON_CONFIG_ERROR +# error "Generic wxFileDialog requires wxFileCtrl" +# else +# undef wxUSE_FILECTRL +# define wxUSE_FILECTRL 1 +# endif +#endif /* wxUSE_FILEDLG */ + +/* common dependencies */ +#if wxUSE_ARTPROVIDER_TANGO +# if !(wxUSE_STREAMS && wxUSE_IMAGE && wxUSE_LIBPNG) +# ifdef wxABORT_ON_CONFIG_ERROR +# error "Tango art provider requires wxImage with streams and PNG support" +# else +# undef wxUSE_ARTPROVIDER_TANGO +# define wxUSE_ARTPROVIDER_TANGO 0 +# endif +# endif +#endif /* wxUSE_ARTPROVIDER_TANGO */ + +#if wxUSE_CALENDARCTRL +# if !(wxUSE_SPINBTN && wxUSE_COMBOBOX) +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxCalendarCtrl requires wxSpinButton and wxComboBox" +# else +# undef wxUSE_SPINBTN +# undef wxUSE_COMBOBOX +# define wxUSE_SPINBTN 1 +# define wxUSE_COMBOBOX 1 +# endif +# endif + +# if !wxUSE_DATETIME +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxCalendarCtrl requires wxUSE_DATETIME" +# else +# undef wxUSE_DATETIME +# define wxUSE_DATETIME 1 +# endif +# endif +#endif /* wxUSE_CALENDARCTRL */ + +#if wxUSE_DATEPICKCTRL || wxUSE_TIMEPICKCTRL +# if !wxUSE_DATETIME +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxDatePickerCtrl and wxTimePickerCtrl requires wxUSE_DATETIME" +# else +# undef wxUSE_DATETIME +# define wxUSE_DATETIME 1 +# endif +# endif +#endif /* wxUSE_DATEPICKCTRL || wxUSE_TIMEPICKCTRL */ + +#if wxUSE_CHECKLISTBOX +# if !wxUSE_LISTBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxCheckListBox requires wxListBox" +# else +# undef wxUSE_LISTBOX +# define wxUSE_LISTBOX 1 +# endif +# endif +#endif /* wxUSE_CHECKLISTBOX */ + +#if wxUSE_CHOICEDLG +# if !wxUSE_LISTBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "Choice dialogs requires wxListBox" +# else +# undef wxUSE_LISTBOX +# define wxUSE_LISTBOX 1 +# endif +# endif +#endif /* wxUSE_CHOICEDLG */ + +#if wxUSE_FILECTRL +# if !wxUSE_DATETIME +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxFileCtrl requires wxDateTime" +# else +# undef wxUSE_DATETIME +# define wxUSE_DATETIME 1 +# endif +# endif +#endif /* wxUSE_FILECTRL */ + +#if wxUSE_HELP +# if !wxUSE_BMPBUTTON +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_HELP requires wxUSE_BMPBUTTON" +# else +# undef wxUSE_BMPBUTTON +# define wxUSE_BMPBUTTON 1 +# endif +# endif + +# if !wxUSE_CHOICEDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_HELP requires wxUSE_CHOICEDLG" +# else +# undef wxUSE_CHOICEDLG +# define wxUSE_CHOICEDLG 1 +# endif +# endif +#endif /* wxUSE_HELP */ + +#if wxUSE_MS_HTML_HELP + /* + this doesn't make sense for platforms other than MSW but we still + define it in wx/setup_inc.h so don't complain if it happens to be + defined under another platform but just silently fix it. + */ +# ifndef __WXMSW__ +# undef wxUSE_MS_HTML_HELP +# define wxUSE_MS_HTML_HELP 0 +# endif +#endif /* wxUSE_MS_HTML_HELP */ + +#if wxUSE_WXHTML_HELP +# if !wxUSE_HELP || !wxUSE_HTML || !wxUSE_COMBOBOX || !wxUSE_NOTEBOOK || !wxUSE_SPINCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "Built in help controller can't be compiled" +# else +# undef wxUSE_HELP +# define wxUSE_HELP 1 +# undef wxUSE_HTML +# define wxUSE_HTML 1 +# undef wxUSE_COMBOBOX +# define wxUSE_COMBOBOX 1 +# undef wxUSE_NOTEBOOK +# define wxUSE_NOTEBOOK 1 +# undef wxUSE_SPINCTRL +# define wxUSE_SPINCTRL 1 +# endif +# endif +#endif /* wxUSE_WXHTML_HELP */ + +#if !wxUSE_IMAGE +/* + The default wxUSE_IMAGE setting is 1, so if it's set to 0 we assume the + user explicitly wants this and disable all other features that require + wxUSE_IMAGE. + */ +# if wxUSE_DRAGIMAGE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DRAGIMAGE requires wxUSE_IMAGE" +# else +# undef wxUSE_DRAGIMAGE +# define wxUSE_DRAGIMAGE 0 +# endif +# endif + +# if wxUSE_LIBPNG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LIBPNG requires wxUSE_IMAGE" +# else +# undef wxUSE_LIBPNG +# define wxUSE_LIBPNG 0 +# endif +# endif + +# if wxUSE_LIBJPEG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LIBJPEG requires wxUSE_IMAGE" +# else +# undef wxUSE_LIBJPEG +# define wxUSE_LIBJPEG 0 +# endif +# endif + +# if wxUSE_LIBTIFF +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LIBTIFF requires wxUSE_IMAGE" +# else +# undef wxUSE_LIBTIFF +# define wxUSE_LIBTIFF 0 +# endif +# endif + +# if wxUSE_GIF +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_GIF requires wxUSE_IMAGE" +# else +# undef wxUSE_GIF +# define wxUSE_GIF 0 +# endif +# endif + +# if wxUSE_PNM +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PNM requires wxUSE_IMAGE" +# else +# undef wxUSE_PNM +# define wxUSE_PNM 0 +# endif +# endif + +# if wxUSE_PCX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PCX requires wxUSE_IMAGE" +# else +# undef wxUSE_PCX +# define wxUSE_PCX 0 +# endif +# endif + +# if wxUSE_IFF +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_IFF requires wxUSE_IMAGE" +# else +# undef wxUSE_IFF +# define wxUSE_IFF 0 +# endif +# endif + +# if wxUSE_TOOLBAR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TOOLBAR requires wxUSE_IMAGE" +# else +# undef wxUSE_TOOLBAR +# define wxUSE_TOOLBAR 0 +# endif +# endif + +# if wxUSE_XPM +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_XPM requires wxUSE_IMAGE" +# else +# undef wxUSE_XPM +# define wxUSE_XPM 0 +# endif +# endif + +#endif /* !wxUSE_IMAGE */ + +#if wxUSE_DOC_VIEW_ARCHITECTURE +# if !wxUSE_MENUS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "DocView requires wxUSE_MENUS" +# else +# undef wxUSE_MENUS +# define wxUSE_MENUS 1 +# endif +# endif + +# if !wxUSE_CHOICEDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "DocView requires wxUSE_CHOICEDLG" +# else +# undef wxUSE_CHOICEDLG +# define wxUSE_CHOICEDLG 1 +# endif +# endif + +# if !wxUSE_STREAMS && !wxUSE_STD_IOSTREAM +# ifdef wxABORT_ON_CONFIG_ERROR +# error "DocView requires wxUSE_STREAMS or wxUSE_STD_IOSTREAM" +# else +# undef wxUSE_STREAMS +# define wxUSE_STREAMS 1 +# endif +# endif + +# if !wxUSE_FILE_HISTORY +# ifdef wxABORT_ON_CONFIG_ERROR +# error "DocView requires wxUSE_FILE_HISTORY" +# else +# undef wxUSE_FILE_HISTORY +# define wxUSE_FILE_HISTORY 1 +# endif +# endif +#endif /* wxUSE_DOC_VIEW_ARCHITECTURE */ + +#if wxUSE_PRINTING_ARCHITECTURE +# if !wxUSE_COMBOBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "Print dialog requires wxUSE_COMBOBOX" +# else +# undef wxUSE_COMBOBOX +# define wxUSE_COMBOBOX 1 +# endif +# endif +#endif /* wxUSE_PRINTING_ARCHITECTURE */ + +#if wxUSE_MDI_ARCHITECTURE +# if !wxUSE_MDI +# ifdef wxABORT_ON_CONFIG_ERROR +# error "MDI requires wxUSE_MDI" +# else +# undef wxUSE_MDI +# define wxUSE_MDI 1 +# endif +# endif + +# if !wxUSE_DOC_VIEW_ARCHITECTURE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MDI_ARCHITECTURE requires wxUSE_DOC_VIEW_ARCHITECTURE" +# else +# undef wxUSE_DOC_VIEW_ARCHITECTURE +# define wxUSE_DOC_VIEW_ARCHITECTURE 1 +# endif +# endif +#endif /* wxUSE_MDI_ARCHITECTURE */ + +#if !wxUSE_FILEDLG +# if wxUSE_DOC_VIEW_ARCHITECTURE || wxUSE_WXHTML_HELP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FILEDLG is required by wxUSE_DOC_VIEW_ARCHITECTURE and wxUSE_WXHTML_HELP!" +# else +# undef wxUSE_FILEDLG +# define wxUSE_FILEDLG 1 +# endif +# endif +#endif /* wxUSE_FILEDLG */ + +#if !wxUSE_GAUGE || !wxUSE_BUTTON +# if wxUSE_PROGRESSDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "Generic progress dialog requires wxUSE_GAUGE and wxUSE_BUTTON" +# else +# undef wxUSE_GAUGE +# undef wxUSE_BUTTON +# define wxUSE_GAUGE 1 +# define wxUSE_BUTTON 1 +# endif +# endif +#endif /* !wxUSE_GAUGE */ + +#if !wxUSE_BUTTON +# if wxUSE_FONTDLG || \ + wxUSE_FILEDLG || \ + wxUSE_CHOICEDLG || \ + wxUSE_NUMBERDLG || \ + wxUSE_TEXTDLG || \ + wxUSE_DIRDLG || \ + wxUSE_STARTUP_TIPS || \ + wxUSE_WIZARDDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "Common and generic dialogs require wxUSE_BUTTON" +# else +# undef wxUSE_BUTTON +# define wxUSE_BUTTON 1 +# endif +# endif +#endif /* !wxUSE_BUTTON */ + +#if !wxUSE_TOOLBAR +# if wxUSE_TOOLBAR_NATIVE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TOOLBAR is set to 0 but wxUSE_TOOLBAR_NATIVE is set to 1" +# else +# undef wxUSE_TOOLBAR_NATIVE +# define wxUSE_TOOLBAR_NATIVE 0 +# endif +# endif +#endif + +#if !wxUSE_IMAGLIST +# if wxUSE_TREECTRL || wxUSE_NOTEBOOK || wxUSE_LISTCTRL || wxUSE_TREELISTCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxImageList must be compiled as well" +# else +# undef wxUSE_IMAGLIST +# define wxUSE_IMAGLIST 1 +# endif +# endif +#endif /* !wxUSE_IMAGLIST */ + +#if wxUSE_RADIOBOX +# if !wxUSE_RADIOBTN +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_RADIOBOX requires wxUSE_RADIOBTN" +# else +# undef wxUSE_RADIOBTN +# define wxUSE_RADIOBTN 1 +# endif +# endif +# if !wxUSE_STATBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_RADIOBOX requires wxUSE_STATBOX" +# else +# undef wxUSE_STATBOX +# define wxUSE_STATBOX 1 +# endif +# endif +#endif /* wxUSE_RADIOBOX */ + +#if wxUSE_LOGWINDOW +# if !wxUSE_TEXTCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LOGWINDOW requires wxUSE_TEXTCTRL" +# else +# undef wxUSE_TEXTCTRL +# define wxUSE_TEXTCTRL 1 +# endif +# endif +#endif /* wxUSE_LOGWINDOW */ + +#if wxUSE_LOG_DIALOG +# if !wxUSE_LISTCTRL || !wxUSE_BUTTON +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LOG_DIALOG requires wxUSE_LISTCTRL and wxUSE_BUTTON" +# else +# undef wxUSE_LISTCTRL +# define wxUSE_LISTCTRL 1 +# undef wxUSE_BUTTON +# define wxUSE_BUTTON 1 +# endif +# endif +#endif /* wxUSE_LOG_DIALOG */ + +#if wxUSE_CLIPBOARD && !wxUSE_DATAOBJ +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxClipboard requires wxDataObject" +# else +# undef wxUSE_DATAOBJ +# define wxUSE_DATAOBJ 1 +# endif +#endif /* wxUSE_CLIPBOARD */ + +#if wxUSE_XRC && !wxUSE_XML +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_XRC requires wxUSE_XML" +# else +# undef wxUSE_XRC +# define wxUSE_XRC 0 +# endif +#endif /* wxUSE_XRC */ + +#if wxUSE_SOCKETS && !wxUSE_STOPWATCH +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SOCKETS requires wxUSE_STOPWATCH" +# else +# undef wxUSE_SOCKETS +# define wxUSE_SOCKETS 0 +# endif +#endif /* wxUSE_SOCKETS */ + +#if wxUSE_SVG && !wxUSE_STREAMS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SVG requires wxUSE_STREAMS" +# else +# undef wxUSE_SVG +# define wxUSE_SVG 0 +# endif +#endif /* wxUSE_SVG */ + +#if wxUSE_SVG && !wxUSE_IMAGE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SVG requires wxUSE_IMAGE" +# else +# undef wxUSE_SVG +# define wxUSE_SVG 0 +# endif +#endif /* wxUSE_SVG */ + +#if wxUSE_SVG && !wxUSE_LIBPNG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SVG requires wxUSE_LIBPNG" +# else +# undef wxUSE_SVG +# define wxUSE_SVG 0 +# endif +#endif /* wxUSE_SVG */ + +#if wxUSE_TASKBARICON && !wxUSE_MENUS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TASKBARICON requires wxUSE_MENUS" +# else +# undef wxUSE_TASKBARICON +# define wxUSE_TASKBARICON 0 +# endif +#endif /* wxUSE_TASKBARICON */ + +#if !wxUSE_VARIANT +# if wxUSE_DATAVIEWCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxDataViewCtrl requires wxVariant" +# else +# undef wxUSE_DATAVIEWCTRL +# define wxUSE_DATAVIEWCTRL 0 +# endif +# endif +#endif /* wxUSE_VARIANT */ + +#if wxUSE_TREELISTCTRL && !wxUSE_DATAVIEWCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TREELISTCTRL requires wxDataViewCtrl" +# else +# undef wxUSE_TREELISTCTRL +# define wxUSE_TREELISTCTRL 0 +# endif +#endif /* wxUSE_TREELISTCTRL */ + +#if wxUSE_WEBVIEW && !(wxUSE_WEBVIEW_WEBKIT || wxUSE_WEBVIEW_IE) +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_WEBVIEW requires at least one backend" +# else +# undef wxUSE_WEBVIEW +# define wxUSE_WEBVIEW 0 +# endif +#endif /* wxUSE_WEBVIEW && !any web view backend */ + +#if wxUSE_PREFERENCES_EDITOR + /* + We can use either a generic implementation, using wxNotebook, or a + native one under wxOSX/Cocoa but then we must be using the native + toolbar. + */ +# if !wxUSE_NOTEBOOK +# ifdef __WXOSX_COCOA__ +# if !wxUSE_TOOLBAR || !wxOSX_USE_NATIVE_TOOLBAR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PREFERENCES_EDITOR requires native toolbar in wxOSX" +# else +# undef wxUSE_PREFERENCES_EDITOR +# define wxUSE_PREFERENCES_EDITOR 0 +# endif +# endif +# else +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PREFERENCES_EDITOR requires wxNotebook" +# else +# undef wxUSE_PREFERENCES_EDITOR +# define wxUSE_PREFERENCES_EDITOR 0 +# endif +# endif +# endif +#endif /* wxUSE_PREFERENCES_EDITOR */ + +#endif /* wxUSE_GUI */ + +#endif /* _WX_CHKCONF_H_ */ diff --git a/wxmsw/include/wx-3.0/wx/choicdlg.h b/wxmsw/include/wx-3.0/wx/choicdlg.h new file mode 100644 index 00000000..0ab4c076 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/choicdlg.h @@ -0,0 +1,22 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/choicdlg.h +// Purpose: Includes generic choice dialog file +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CHOICDLG_H_BASE_ +#define _WX_CHOICDLG_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_CHOICEDLG + +#include "wx/generic/choicdgg.h" + +#endif + +#endif // _WX_CHOICDLG_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/choice.h b/wxmsw/include/wx-3.0/wx/choice.h new file mode 100644 index 00000000..3a848f9f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/choice.h @@ -0,0 +1,97 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/choice.h +// Purpose: wxChoice class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 26.07.99 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CHOICE_H_BASE_ +#define _WX_CHOICE_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_CHOICE + +#include "wx/ctrlsub.h" // the base class + +// ---------------------------------------------------------------------------- +// global data +// ---------------------------------------------------------------------------- + +extern WXDLLIMPEXP_DATA_CORE(const char) wxChoiceNameStr[]; + +// ---------------------------------------------------------------------------- +// wxChoice allows to select one of a non-modifiable list of strings +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxChoiceBase : public wxControlWithItems +{ +public: + wxChoiceBase() { } + virtual ~wxChoiceBase(); + + // all generic methods are in wxControlWithItems + + // get the current selection: this can only be different from the normal + // selection if the popup items list is currently opened and the user + // selected some item in it but didn't close the list yet; otherwise (and + // currently always on platforms other than MSW) this is the same as + // GetSelection() + virtual int GetCurrentSelection() const { return GetSelection(); } + + // set/get the number of columns in the control (as they're not supported on + // most platforms, they do nothing by default) + virtual void SetColumns(int WXUNUSED(n) = 1 ) { } + virtual int GetColumns() const { return 1 ; } + + // emulate selecting the item event.GetInt() + void Command(wxCommandEvent& event); + + // override wxItemContainer::IsSorted + virtual bool IsSorted() const { return HasFlag(wxCB_SORT); } + +protected: + // The generic implementation doesn't determine the height correctly and + // doesn't account for the width of the arrow but does take into account + // the string widths, so the derived classes should override it and set the + // height and add the arrow width to the size returned by this version. + virtual wxSize DoGetBestSize() const; + +private: + wxDECLARE_NO_COPY_CLASS(wxChoiceBase); +}; + +// ---------------------------------------------------------------------------- +// include the platform-dependent class definition +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/choice.h" +#elif defined(__SMARTPHONE__) && defined(__WXWINCE__) + #include "wx/msw/wince/choicece.h" +#elif defined(__WXMSW__) + #include "wx/msw/choice.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/choice.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/choice.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/choice.h" +#elif defined(__WXMAC__) + #include "wx/osx/choice.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/choice.h" +#elif defined(__WXPM__) + #include "wx/os2/choice.h" +#endif + +#endif // wxUSE_CHOICE + +#endif // _WX_CHOICE_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/choicebk.h b/wxmsw/include/wx-3.0/wx/choicebk.h new file mode 100644 index 00000000..335ede16 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/choicebk.h @@ -0,0 +1,130 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/choicebk.h +// Purpose: wxChoicebook: wxChoice and wxNotebook combination +// Author: Vadim Zeitlin +// Modified by: Wlodzimierz ABX Skiba from wx/listbook.h +// Created: 15.09.04 +// Copyright: (c) Vadim Zeitlin, Wlodzimierz Skiba +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CHOICEBOOK_H_ +#define _WX_CHOICEBOOK_H_ + +#include "wx/defs.h" + +#if wxUSE_CHOICEBOOK + +#include "wx/bookctrl.h" +#include "wx/choice.h" +#include "wx/containr.h" + +class WXDLLIMPEXP_FWD_CORE wxChoice; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_CHOICEBOOK_PAGE_CHANGED, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_CHOICEBOOK_PAGE_CHANGING, wxBookCtrlEvent ); + +// wxChoicebook flags +#define wxCHB_DEFAULT wxBK_DEFAULT +#define wxCHB_TOP wxBK_TOP +#define wxCHB_BOTTOM wxBK_BOTTOM +#define wxCHB_LEFT wxBK_LEFT +#define wxCHB_RIGHT wxBK_RIGHT +#define wxCHB_ALIGN_MASK wxBK_ALIGN_MASK + +// ---------------------------------------------------------------------------- +// wxChoicebook +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxChoicebook : public wxNavigationEnabled +{ +public: + wxChoicebook() { } + + wxChoicebook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString) + { + (void)Create(parent, id, pos, size, style, name); + } + + // quasi ctor + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString); + + + virtual bool SetPageText(size_t n, const wxString& strText); + virtual wxString GetPageText(size_t n) const; + virtual int GetPageImage(size_t n) const; + virtual bool SetPageImage(size_t n, int imageId); + virtual bool InsertPage(size_t n, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = NO_IMAGE); + virtual int SetSelection(size_t n) + { return DoSetSelection(n, SetSelection_SendEvent); } + virtual int ChangeSelection(size_t n) { return DoSetSelection(n); } + virtual void SetImageList(wxImageList *imageList); + + virtual bool DeleteAllPages(); + + // returns the choice control + wxChoice* GetChoiceCtrl() const { return (wxChoice*)m_bookctrl; } + + // Override this to return true because the part of parent window + // background between our controlling wxChoice and the page area should + // show through. + virtual bool HasTransparentBackground() { return true; } + +protected: + virtual void DoSetWindowVariant(wxWindowVariant variant); + + virtual wxWindow *DoRemovePage(size_t page); + + void UpdateSelectedPage(size_t newsel) + { + m_selection = static_cast(newsel); + GetChoiceCtrl()->Select(m_selection); + } + + wxBookCtrlEvent* CreatePageChangingEvent() const; + void MakeChangedEvent(wxBookCtrlEvent &event); + + // event handlers + void OnChoiceSelected(wxCommandEvent& event); + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxChoicebook) +}; + +// ---------------------------------------------------------------------------- +// choicebook event class and related stuff +// ---------------------------------------------------------------------------- + +// wxChoicebookEvent is obsolete and defined for compatibility only +#define wxChoicebookEvent wxBookCtrlEvent +typedef wxBookCtrlEventFunction wxChoicebookEventFunction; +#define wxChoicebookEventHandler(func) wxBookCtrlEventHandler(func) + +#define EVT_CHOICEBOOK_PAGE_CHANGED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_CHOICEBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) + +#define EVT_CHOICEBOOK_PAGE_CHANGING(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_CHOICEBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED wxEVT_CHOICEBOOK_PAGE_CHANGED +#define wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING wxEVT_CHOICEBOOK_PAGE_CHANGING + +#endif // wxUSE_CHOICEBOOK + +#endif // _WX_CHOICEBOOK_H_ diff --git a/wxmsw/include/wx-3.0/wx/clipbrd.h b/wxmsw/include/wx-3.0/wx/clipbrd.h new file mode 100644 index 00000000..5399be27 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/clipbrd.h @@ -0,0 +1,204 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/clipbrd.h +// Purpose: wxClipboad class and clipboard functions +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.10.99 +// Copyright: (c) wxWidgets Team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CLIPBRD_H_BASE_ +#define _WX_CLIPBRD_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_CLIPBOARD + + +#include "wx/event.h" +#include "wx/chartype.h" +#include "wx/dataobj.h" // for wxDataFormat +#include "wx/vector.h" + +class WXDLLIMPEXP_FWD_CORE wxClipboard; + +// ---------------------------------------------------------------------------- +// wxClipboard represents the system clipboard. Normally, you should use +// wxTheClipboard which is a global pointer to the (unique) clipboard. +// +// Clipboard can be used to copy data to/paste data from. It works together +// with wxDataObject. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxClipboardBase : public wxObject +{ +public: + wxClipboardBase() { m_usePrimary = false; } + + // open the clipboard before Add/SetData() and GetData() + virtual bool Open() = 0; + + // close the clipboard after Add/SetData() and GetData() + virtual void Close() = 0; + + // query whether the clipboard is opened + virtual bool IsOpened() const = 0; + + // add to the clipboard data + // + // NB: the clipboard owns the pointer and will delete it, so data must be + // allocated on the heap + virtual bool AddData( wxDataObject *data ) = 0; + + // set the clipboard data, this is the same as Clear() followed by + // AddData() + virtual bool SetData( wxDataObject *data ) = 0; + + // ask if data in correct format is available + virtual bool IsSupported( const wxDataFormat& format ) = 0; + + // ask if data in correct format is available + virtual bool IsSupportedAsync( wxEvtHandler *sink ); + + // fill data with data on the clipboard (if available) + virtual bool GetData( wxDataObject& data ) = 0; + + // clears wxTheClipboard and the system's clipboard if possible + virtual void Clear() = 0; + + // flushes the clipboard: this means that the data which is currently on + // clipboard will stay available even after the application exits (possibly + // eating memory), otherwise the clipboard will be emptied on exit + virtual bool Flush() { return false; } + + // this allows to choose whether we work with CLIPBOARD (default) or + // PRIMARY selection on X11-based systems + // + // on the other ones, working with primary selection does nothing: this + // allows to write code which sets the primary selection when something is + // selected without any ill effects (i.e. without overwriting the + // clipboard which would be wrong on the platforms without X11 PRIMARY) + virtual void UsePrimarySelection(bool usePrimary = false) + { + m_usePrimary = usePrimary; + } + + // return true if we're using primary selection + bool IsUsingPrimarySelection() const { return m_usePrimary; } + + // Returns global instance (wxTheClipboard) of the object: + static wxClipboard *Get(); + + + // don't use this directly, it is public for compatibility with some ports + // (wxX11, wxMotif, ...) only + bool m_usePrimary; +}; + +// ---------------------------------------------------------------------------- +// asynchronous clipboard event +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxClipboardEvent : public wxEvent +{ +public: + wxClipboardEvent(wxEventType evtType = wxEVT_NULL) + : wxEvent(0, evtType) + { + } + + wxClipboardEvent(const wxClipboardEvent& event) + : wxEvent(event), + m_formats(event.m_formats) + { + } + + bool SupportsFormat(const wxDataFormat& format) const; + void AddFormat(const wxDataFormat& format); + + virtual wxEvent *Clone() const + { + return new wxClipboardEvent(*this); + } + + +protected: + wxVector m_formats; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxClipboardEvent) +}; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_CLIPBOARD_CHANGED, wxClipboardEvent ); + +typedef void (wxEvtHandler::*wxClipboardEventFunction)(wxClipboardEvent&); + +#define wxClipboardEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxClipboardEventFunction, func) + +#define EVT_CLIPBOARD_CHANGED(func) wx__DECLARE_EVT0(wxEVT_CLIPBOARD_CHANGED, wxClipboardEventHandler(func)) + +// ---------------------------------------------------------------------------- +// globals +// ---------------------------------------------------------------------------- + +// The global clipboard object - backward compatible access macro: +#define wxTheClipboard (wxClipboard::Get()) + +// ---------------------------------------------------------------------------- +// include platform-specific class declaration +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/clipbrd.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/clipbrd.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/clipbrd.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/clipbrd.h" +#elif defined(__WXX11__) + #include "wx/x11/clipbrd.h" +#elif defined(__WXMAC__) + #include "wx/osx/clipbrd.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/clipbrd.h" +#elif defined(__WXPM__) + #include "wx/os2/clipbrd.h" +#endif + +// ---------------------------------------------------------------------------- +// helpful class for opening the clipboard and automatically closing it +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxClipboardLocker +{ +public: + wxClipboardLocker(wxClipboard *clipboard = NULL) + { + m_clipboard = clipboard ? clipboard : wxTheClipboard; + if ( m_clipboard ) + { + m_clipboard->Open(); + } + } + + bool operator!() const { return !m_clipboard->IsOpened(); } + + ~wxClipboardLocker() + { + if ( m_clipboard ) + { + m_clipboard->Close(); + } + } + +private: + wxClipboard *m_clipboard; + + wxDECLARE_NO_COPY_CLASS(wxClipboardLocker); +}; + +#endif // wxUSE_CLIPBOARD + +#endif // _WX_CLIPBRD_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/clntdata.h b/wxmsw/include/wx-3.0/wx/clntdata.h new file mode 100644 index 00000000..a41ccc0e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/clntdata.h @@ -0,0 +1,162 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/clntdata.h +// Purpose: A mixin class for holding a wxClientData or void pointer +// Author: Robin Dunn +// Modified by: +// Created: 9-Oct-2001 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CLNTDATAH__ +#define _WX_CLNTDATAH__ + +#include "wx/defs.h" +#include "wx/string.h" +#include "wx/hashmap.h" + +typedef int (*wxShadowObjectMethod)(void*, void*); +WX_DECLARE_STRING_HASH_MAP_WITH_DECL( + wxShadowObjectMethod, + wxShadowObjectMethods, + class WXDLLIMPEXP_BASE +); +WX_DECLARE_STRING_HASH_MAP_WITH_DECL( + void *, + wxShadowObjectFields, + class WXDLLIMPEXP_BASE +); + +class WXDLLIMPEXP_BASE wxShadowObject +{ +public: + wxShadowObject() { } + + void AddMethod( const wxString &name, wxShadowObjectMethod method ) + { + wxShadowObjectMethods::iterator it = m_methods.find( name ); + if (it == m_methods.end()) + m_methods[ name ] = method; + else + it->second = method; + } + + bool InvokeMethod( const wxString &name, void* window, void* param, int* returnValue ) + { + wxShadowObjectMethods::iterator it = m_methods.find( name ); + if (it == m_methods.end()) + return false; + wxShadowObjectMethod method = it->second; + int ret = (*method)(window, param); + if (returnValue) + *returnValue = ret; + return true; + } + + void AddField( const wxString &name, void* initialValue = NULL ) + { + wxShadowObjectFields::iterator it = m_fields.find( name ); + if (it == m_fields.end()) + m_fields[ name ] = initialValue; + else + it->second = initialValue; + } + + void SetField( const wxString &name, void* value ) + { + wxShadowObjectFields::iterator it = m_fields.find( name ); + if (it == m_fields.end()) + return; + it->second = value; + } + + void* GetField( const wxString &name, void *defaultValue = NULL ) + { + wxShadowObjectFields::iterator it = m_fields.find( name ); + if (it == m_fields.end()) + return defaultValue; + return it->second; + } + +private: + wxShadowObjectMethods m_methods; + wxShadowObjectFields m_fields; +}; + + +// ---------------------------------------------------------------------------- + +// what kind of client data do we have? +enum wxClientDataType +{ + wxClientData_None, // we don't know yet because we don't have it at all + wxClientData_Object, // our client data is typed and we own it + wxClientData_Void // client data is untyped and we don't own it +}; + +class WXDLLIMPEXP_BASE wxClientData +{ +public: + wxClientData() { } + virtual ~wxClientData() { } +}; + +class WXDLLIMPEXP_BASE wxStringClientData : public wxClientData +{ +public: + wxStringClientData() : m_data() { } + wxStringClientData( const wxString &data ) : m_data(data) { } + void SetData( const wxString &data ) { m_data = data; } + const wxString& GetData() const { return m_data; } + +private: + wxString m_data; +}; + +// This class is a mixin that provides storage and management of "client +// data." The client data stored can either be a pointer to a wxClientData +// object in which case it is managed by the container (i.e. it will delete +// the data when it's destroyed) or an untyped pointer which won't be deleted +// by the container - but not both of them +// +// NOTE: This functionality is currently duplicated in wxEvtHandler in order +// to avoid having more than one vtable in that class hierarchy. + +class WXDLLIMPEXP_BASE wxClientDataContainer +{ +public: + wxClientDataContainer(); + virtual ~wxClientDataContainer(); + + void SetClientObject( wxClientData *data ) { DoSetClientObject(data); } + wxClientData *GetClientObject() const { return DoGetClientObject(); } + + void SetClientData( void *data ) { DoSetClientData(data); } + void *GetClientData() const { return DoGetClientData(); } + +protected: + // The user data: either an object which will be deleted by the container + // when it's deleted or some raw pointer which we do nothing with. Only + // one type of data can be used with the given window, i.e. you cannot set + // the void data and then associate the container with wxClientData or vice + // versa. + union + { + wxClientData *m_clientObject; + void *m_clientData; + }; + + // client data accessors + virtual void DoSetClientObject( wxClientData *data ); + virtual wxClientData *DoGetClientObject() const; + + virtual void DoSetClientData( void *data ); + virtual void *DoGetClientData() const; + + // what kind of data do we have? + wxClientDataType m_clientDataType; + +}; + +#endif // _WX_CLNTDATAH__ + diff --git a/wxmsw/include/wx-3.0/wx/clrpicker.h b/wxmsw/include/wx-3.0/wx/clrpicker.h new file mode 100644 index 00000000..1794ee68 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/clrpicker.h @@ -0,0 +1,203 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/clrpicker.h +// Purpose: wxColourPickerCtrl base header +// Author: Francesco Montorsi (based on Vadim Zeitlin's code) +// Modified by: +// Created: 14/4/2006 +// Copyright: (c) Vadim Zeitlin, Francesco Montorsi +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CLRPICKER_H_BASE_ +#define _WX_CLRPICKER_H_BASE_ + +#include "wx/defs.h" + + +#if wxUSE_COLOURPICKERCTRL + +#include "wx/pickerbase.h" + + +class WXDLLIMPEXP_FWD_CORE wxColourPickerEvent; + +extern WXDLLIMPEXP_DATA_CORE(const char) wxColourPickerWidgetNameStr[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxColourPickerCtrlNameStr[]; + +// show the colour in HTML form (#AABBCC) as colour button label +#define wxCLRBTN_SHOW_LABEL 100 + +// the default style +#define wxCLRBTN_DEFAULT_STYLE (wxCLRBTN_SHOW_LABEL) + + + +// ---------------------------------------------------------------------------- +// wxColourPickerWidgetBase: a generic abstract interface which must be +// implemented by controls used by wxColourPickerCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxColourPickerWidgetBase +{ +public: + wxColourPickerWidgetBase() { m_colour = *wxBLACK; } + virtual ~wxColourPickerWidgetBase() {} + + wxColour GetColour() const + { return m_colour; } + virtual void SetColour(const wxColour &col) + { m_colour = col; UpdateColour(); } + virtual void SetColour(const wxString &col) + { m_colour.Set(col); UpdateColour(); } + +protected: + + virtual void UpdateColour() = 0; + + // the current colour (may be invalid if none) + wxColour m_colour; +}; + + +// Styles which must be supported by all controls implementing wxColourPickerWidgetBase +// NB: these styles must be defined to carefully-chosen values to +// avoid conflicts with wxButton's styles + +// show the colour in HTML form (#AABBCC) as colour button label +// (instead of no label at all) +// NOTE: this style is supported just by wxColourButtonGeneric and +// thus is not exposed in wxColourPickerCtrl +#define wxCLRP_SHOW_LABEL 0x0008 + +// map platform-dependent controls which implement the wxColourPickerWidgetBase +// under the name "wxColourPickerWidget". +// NOTE: wxColourPickerCtrl allocates a wxColourPickerWidget and relies on the +// fact that all classes being mapped as wxColourPickerWidget have the +// same prototype for their contructor (and also explains why we use +// define instead of a typedef) +// since GTK > 2.4, there is GtkColorButton +#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/clrpicker.h" + #define wxColourPickerWidget wxColourButton +#else + #include "wx/generic/clrpickerg.h" + #define wxColourPickerWidget wxGenericColourButton +#endif + + +// ---------------------------------------------------------------------------- +// wxColourPickerCtrl: platform-independent class which embeds a +// platform-dependent wxColourPickerWidget and, if wxCLRP_USE_TEXTCTRL style is +// used, a textctrl next to it. +// ---------------------------------------------------------------------------- + +#define wxCLRP_USE_TEXTCTRL (wxPB_USE_TEXTCTRL) +#define wxCLRP_DEFAULT_STYLE 0 + +class WXDLLIMPEXP_CORE wxColourPickerCtrl : public wxPickerBase +{ +public: + wxColourPickerCtrl() {} + virtual ~wxColourPickerCtrl() {} + + + wxColourPickerCtrl(wxWindow *parent, wxWindowID id, + const wxColour& col = *wxBLACK, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxCLRP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxColourPickerCtrlNameStr) + { Create(parent, id, col, pos, size, style, validator, name); } + + bool Create(wxWindow *parent, wxWindowID id, + const wxColour& col = *wxBLACK, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCLRP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxColourPickerCtrlNameStr); + + +public: // public API + + // get the colour chosen + wxColour GetColour() const + { return ((wxColourPickerWidget *)m_picker)->GetColour(); } + + // set currently displayed color + void SetColour(const wxColour& col); + + // set colour using RGB(r,g,b) syntax or considering given text as a colour name; + // returns true if the given text was successfully recognized. + bool SetColour(const wxString& text); + + +public: // internal functions + + // update the button colour to match the text control contents + void UpdatePickerFromTextCtrl(); + + // update the text control to match the button's colour + void UpdateTextCtrlFromPicker(); + + // event handler for our picker + void OnColourChange(wxColourPickerEvent &); + +protected: + virtual long GetPickerStyle(long style) const + { return (style & wxCLRP_SHOW_LABEL); } + +private: + DECLARE_DYNAMIC_CLASS(wxColourPickerCtrl) +}; + + +// ---------------------------------------------------------------------------- +// wxColourPickerEvent: used by wxColourPickerCtrl only +// ---------------------------------------------------------------------------- + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COLOURPICKER_CHANGED, wxColourPickerEvent ); + +class WXDLLIMPEXP_CORE wxColourPickerEvent : public wxCommandEvent +{ +public: + wxColourPickerEvent() {} + wxColourPickerEvent(wxObject *generator, int id, const wxColour &col) + : wxCommandEvent(wxEVT_COLOURPICKER_CHANGED, id), + m_colour(col) + { + SetEventObject(generator); + } + + wxColour GetColour() const { return m_colour; } + void SetColour(const wxColour &c) { m_colour = c; } + + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxColourPickerEvent(*this); } + +private: + wxColour m_colour; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxColourPickerEvent) +}; + +// ---------------------------------------------------------------------------- +// event types and macros +// ---------------------------------------------------------------------------- + +typedef void (wxEvtHandler::*wxColourPickerEventFunction)(wxColourPickerEvent&); + +#define wxColourPickerEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxColourPickerEventFunction, func) + +#define EVT_COLOURPICKER_CHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COLOURPICKER_CHANGED, id, wxColourPickerEventHandler(fn)) + + +// old wxEVT_COMMAND_* constant +#define wxEVT_COMMAND_COLOURPICKER_CHANGED wxEVT_COLOURPICKER_CHANGED + +#endif // wxUSE_COLOURPICKERCTRL + +#endif // _WX_CLRPICKER_H_BASE_ + diff --git a/wxmsw/include/wx-3.0/wx/cmdargs.h b/wxmsw/include/wx-3.0/wx/cmdargs.h new file mode 100644 index 00000000..e4167f0f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/cmdargs.h @@ -0,0 +1,151 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/cmdargs.h +// Purpose: declaration of wxCmdLineArgsArray helper class +// Author: Vadim Zeitlin +// Created: 2007-11-12 +// Copyright: (c) 2007 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CMDARGS_H_ +#define _WX_CMDARGS_H_ + +#include "wx/arrstr.h" + +// ---------------------------------------------------------------------------- +// wxCmdLineArgsArray: helper class used by wxApp::argv +// ---------------------------------------------------------------------------- + +#if wxUSE_UNICODE + +// this class is used instead of either "char **" or "wchar_t **" (neither of +// which would be backwards compatible with all the existing code) for argv +// field of wxApp +// +// as it's used for compatibility, it tries to look as much as traditional +// (char **) argv as possible, in particular it provides implicit conversions +// to "char **" and also array-like operator[] +class WXDLLIMPEXP_BASE wxCmdLineArgsArray +{ +public: + wxCmdLineArgsArray() { m_argsA = NULL; m_argsW = NULL; } + + template + wxCmdLineArgsArray& operator=(T **argv) + { + FreeArgs(); + + m_args.clear(); + + if ( argv ) + { + while ( *argv ) + m_args.push_back(*argv++); + } + + return *this; + } + + operator char**() const + { + if ( !m_argsA ) + { + const size_t count = m_args.size(); + m_argsA = new char *[count]; + for ( size_t n = 0; n < count; n++ ) + m_argsA[n] = wxStrdup(m_args[n].ToAscii()); + } + + return m_argsA; + } + + operator wchar_t**() const + { + if ( !m_argsW ) + { + const size_t count = m_args.size(); + m_argsW = new wchar_t *[count]; + for ( size_t n = 0; n < count; n++ ) + m_argsW[n] = wxStrdup(m_args[n].wc_str()); + } + + return m_argsW; + } + + // existing code does checks like "if ( argv )" and we want it to continue + // to compile, so provide this conversion even if it is pretty dangerous + operator bool() const + { + return !m_args.empty(); + } + + // and the same for "if ( !argv )" checks + bool operator!() const + { + return m_args.empty(); + } + + wxString operator[](size_t n) const + { + return m_args[n]; + } + + // we must provide this overload for g++ 3.4 which can't choose between + // our operator[](size_t) and ::operator[](char**, int) otherwise + wxString operator[](int n) const + { + return m_args[n]; + } + + + // convenience methods, i.e. not existing only for backwards compatibility + + // do we have any arguments at all? + bool IsEmpty() const { return m_args.empty(); } + + // access the arguments as a convenient array of wxStrings + const wxArrayString& GetArguments() const { return m_args; } + + ~wxCmdLineArgsArray() + { + FreeArgs(); + } + +private: + template + void Free(T **args) + { + if ( !args ) + return; + + const size_t count = m_args.size(); + for ( size_t n = 0; n < count; n++ ) + free(args[n]); + + delete [] args; + } + + void FreeArgs() + { + Free(m_argsA); + Free(m_argsW); + } + + wxArrayString m_args; + mutable char **m_argsA; + mutable wchar_t **m_argsW; + + wxDECLARE_NO_COPY_CLASS(wxCmdLineArgsArray); +}; + +// provide global operator overload for compatibility with the existing code +// doing things like "if ( condition && argv )" +inline bool operator&&(bool cond, const wxCmdLineArgsArray& array) +{ + return cond && !array.IsEmpty(); +} + +#endif // wxUSE_UNICODE + +#endif // _WX_CMDARGS_H_ + diff --git a/wxmsw/include/wx-3.0/wx/cmdline.h b/wxmsw/include/wx-3.0/wx/cmdline.h new file mode 100644 index 00000000..3dd41b9f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/cmdline.h @@ -0,0 +1,297 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/cmdline.h +// Purpose: wxCmdLineParser and related classes for parsing the command +// line options +// Author: Vadim Zeitlin +// Modified by: +// Created: 04.01.00 +// Copyright: (c) 2000 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CMDLINE_H_ +#define _WX_CMDLINE_H_ + +#include "wx/defs.h" + +#include "wx/string.h" +#include "wx/arrstr.h" +#include "wx/cmdargs.h" + +// determines ConvertStringToArgs() behaviour +enum wxCmdLineSplitType +{ + wxCMD_LINE_SPLIT_DOS, + wxCMD_LINE_SPLIT_UNIX +}; + +#if wxUSE_CMDLINE_PARSER + +class WXDLLIMPEXP_FWD_BASE wxDateTime; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// by default, options are optional (sic) and each call to AddParam() allows +// one more parameter - this may be changed by giving non-default flags to it +enum wxCmdLineEntryFlags +{ + wxCMD_LINE_OPTION_MANDATORY = 0x01, // this option must be given + wxCMD_LINE_PARAM_OPTIONAL = 0x02, // the parameter may be omitted + wxCMD_LINE_PARAM_MULTIPLE = 0x04, // the parameter may be repeated + wxCMD_LINE_OPTION_HELP = 0x08, // this option is a help request + wxCMD_LINE_NEEDS_SEPARATOR = 0x10, // must have sep before the value + wxCMD_LINE_SWITCH_NEGATABLE = 0x20 // this switch can be negated (e.g. /S-) +}; + +// an option value or parameter may be a string (the most common case), a +// number or a date +enum wxCmdLineParamType +{ + wxCMD_LINE_VAL_STRING, // should be 0 (default) + wxCMD_LINE_VAL_NUMBER, + wxCMD_LINE_VAL_DATE, + wxCMD_LINE_VAL_DOUBLE, + wxCMD_LINE_VAL_NONE +}; + +// for constructing the cmd line description using Init() +enum wxCmdLineEntryType +{ + wxCMD_LINE_SWITCH, + wxCMD_LINE_OPTION, + wxCMD_LINE_PARAM, + wxCMD_LINE_USAGE_TEXT, + wxCMD_LINE_NONE // to terminate the list +}; + +// Possible return values of wxCmdLineParser::FoundSwitch() +enum wxCmdLineSwitchState +{ + wxCMD_SWITCH_OFF = -1, // Found but turned off/negated. + wxCMD_SWITCH_NOT_FOUND, // Not found at all. + wxCMD_SWITCH_ON // Found in normal state. +}; + +// ---------------------------------------------------------------------------- +// wxCmdLineEntryDesc is a description of one command line +// switch/option/parameter +// ---------------------------------------------------------------------------- + +struct wxCmdLineEntryDesc +{ + wxCmdLineEntryType kind; + const char *shortName; + const char *longName; + const char *description; + wxCmdLineParamType type; + int flags; +}; + +// the list of wxCmdLineEntryDesc objects should be terminated with this one +#define wxCMD_LINE_DESC_END \ + { wxCMD_LINE_NONE, NULL, NULL, NULL, wxCMD_LINE_VAL_NONE, 0x0 } + +// ---------------------------------------------------------------------------- +// wxCmdLineParser is a class for parsing command line. +// +// It has the following features: +// +// 1. distinguishes options, switches and parameters; allows option grouping +// 2. allows both short and long options +// 3. automatically generates the usage message from the cmd line description +// 4. does type checks on the options values (number, date, ...) +// +// To use it you should: +// +// 1. construct it giving it the cmd line to parse and optionally its desc +// 2. construct the cmd line description using AddXXX() if not done in (1) +// 3. call Parse() +// 4. use GetXXX() to retrieve the parsed info +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxCmdLineParser +{ +public: + // ctors and initializers + // ---------------------- + + // default ctor or ctor giving the cmd line in either Unix or Win form + wxCmdLineParser() { Init(); } + wxCmdLineParser(int argc, char **argv) { Init(); SetCmdLine(argc, argv); } +#if wxUSE_UNICODE + wxCmdLineParser(int argc, wxChar **argv) { Init(); SetCmdLine(argc, argv); } + wxCmdLineParser(int argc, const wxCmdLineArgsArray& argv) + { Init(); SetCmdLine(argc, argv); } +#endif // wxUSE_UNICODE + wxCmdLineParser(const wxString& cmdline) { Init(); SetCmdLine(cmdline); } + + // the same as above, but also gives the cmd line description - otherwise, + // use AddXXX() later + wxCmdLineParser(const wxCmdLineEntryDesc *desc) + { Init(); SetDesc(desc); } + wxCmdLineParser(const wxCmdLineEntryDesc *desc, int argc, char **argv) + { Init(); SetCmdLine(argc, argv); SetDesc(desc); } +#if wxUSE_UNICODE + wxCmdLineParser(const wxCmdLineEntryDesc *desc, int argc, wxChar **argv) + { Init(); SetCmdLine(argc, argv); SetDesc(desc); } + wxCmdLineParser(const wxCmdLineEntryDesc *desc, + int argc, + const wxCmdLineArgsArray& argv) + { Init(); SetCmdLine(argc, argv); SetDesc(desc); } +#endif // wxUSE_UNICODE + wxCmdLineParser(const wxCmdLineEntryDesc *desc, const wxString& cmdline) + { Init(); SetCmdLine(cmdline); SetDesc(desc); } + + // set cmd line to parse after using one of the ctors which don't do it + void SetCmdLine(int argc, char **argv); +#if wxUSE_UNICODE + void SetCmdLine(int argc, wxChar **argv); + void SetCmdLine(int argc, const wxCmdLineArgsArray& argv); +#endif // wxUSE_UNICODE + void SetCmdLine(const wxString& cmdline); + + // not virtual, don't use this class polymorphically + ~wxCmdLineParser(); + + // set different parser options + // ---------------------------- + + // by default, '-' is switch char under Unix, '-' or '/' under Win: + // switchChars contains all characters with which an option or switch may + // start + void SetSwitchChars(const wxString& switchChars); + + // long options are not POSIX-compliant, this option allows to disable them + void EnableLongOptions(bool enable = true); + void DisableLongOptions() { EnableLongOptions(false); } + + bool AreLongOptionsEnabled() const; + + // extra text may be shown by Usage() method if set by this function + void SetLogo(const wxString& logo); + + // construct the cmd line description + // ---------------------------------- + + // take the cmd line description from the wxCMD_LINE_NONE terminated table + void SetDesc(const wxCmdLineEntryDesc *desc); + + // a switch: i.e. an option without value + void AddSwitch(const wxString& name, const wxString& lng = wxEmptyString, + const wxString& desc = wxEmptyString, + int flags = 0); + void AddLongSwitch(const wxString& lng, + const wxString& desc = wxEmptyString, + int flags = 0) + { + AddSwitch(wxString(), lng, desc, flags); + } + + // an option taking a value of the given type + void AddOption(const wxString& name, const wxString& lng = wxEmptyString, + const wxString& desc = wxEmptyString, + wxCmdLineParamType type = wxCMD_LINE_VAL_STRING, + int flags = 0); + void AddLongOption(const wxString& lng, + const wxString& desc = wxEmptyString, + wxCmdLineParamType type = wxCMD_LINE_VAL_STRING, + int flags = 0) + { + AddOption(wxString(), lng, desc, type, flags); + } + + // a parameter + void AddParam(const wxString& desc = wxEmptyString, + wxCmdLineParamType type = wxCMD_LINE_VAL_STRING, + int flags = 0); + + // add an explanatory text to be shown to the user in help + void AddUsageText(const wxString& text); + + // actions + // ------- + + // parse the command line, return 0 if ok, -1 if "-h" or "--help" option + // was encountered and the help message was given or a positive value if a + // syntax error occurred + // + // if showUsage is true, Usage() is called in case of syntax error or if + // help was requested + int Parse(bool showUsage = true); + + // give the usage message describing all program options + void Usage() const; + + // return the usage string, call Usage() to directly show it to the user + wxString GetUsageString() const; + + // get the command line arguments + // ------------------------------ + + // returns true if the given switch was found + bool Found(const wxString& name) const; + + // Returns wxCMD_SWITCH_NOT_FOUND if the switch was not found at all, + // wxCMD_SWITCH_ON if it was found in normal state and wxCMD_SWITCH_OFF if + // it was found but negated (i.e. followed by "-", this can only happen for + // the switches with wxCMD_LINE_SWITCH_NEGATABLE flag). + wxCmdLineSwitchState FoundSwitch(const wxString& name) const; + + // returns true if an option taking a string value was found and stores the + // value in the provided pointer + bool Found(const wxString& name, wxString *value) const; + + // returns true if an option taking an integer value was found and stores + // the value in the provided pointer + bool Found(const wxString& name, long *value) const; + + // returns true if an option taking a double value was found and stores + // the value in the provided pointer + bool Found(const wxString& name, double *value) const; + +#if wxUSE_DATETIME + // returns true if an option taking a date value was found and stores the + // value in the provided pointer + bool Found(const wxString& name, wxDateTime *value) const; +#endif // wxUSE_DATETIME + + // gets the number of parameters found + size_t GetParamCount() const; + + // gets the value of Nth parameter (as string only for now) + wxString GetParam(size_t n = 0u) const; + + // Resets switches and options + void Reset(); + + // break down the command line in arguments + static wxArrayString + ConvertStringToArgs(const wxString& cmdline, + wxCmdLineSplitType type = wxCMD_LINE_SPLIT_DOS); + +private: + // common part of all ctors + void Init(); + + struct wxCmdLineParserData *m_data; + + wxDECLARE_NO_COPY_CLASS(wxCmdLineParser); +}; + +#else // !wxUSE_CMDLINE_PARSER + +// this function is always available (even if !wxUSE_CMDLINE_PARSER) because it +// is used by wxWin itself under Windows +class WXDLLIMPEXP_BASE wxCmdLineParser +{ +public: + static wxArrayString + ConvertStringToArgs(const wxString& cmdline, + wxCmdLineSplitType type = wxCMD_LINE_SPLIT_DOS); +}; + +#endif // wxUSE_CMDLINE_PARSER/!wxUSE_CMDLINE_PARSER + +#endif // _WX_CMDLINE_H_ diff --git a/wxmsw/include/wx-3.0/wx/cmdproc.h b/wxmsw/include/wx-3.0/wx/cmdproc.h new file mode 100644 index 00000000..c6125096 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/cmdproc.h @@ -0,0 +1,140 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/cmdproc.h +// Purpose: undo/redo capable command processing framework +// Author: Julian Smart (extracted from docview.h by VZ) +// Modified by: +// Created: 05.11.00 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CMDPROC_H_ +#define _WX_CMDPROC_H_ + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/list.h" + +class WXDLLIMPEXP_FWD_CORE wxMenu; + +// ---------------------------------------------------------------------------- +// wxCommand: a single command capable of performing itself +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxCommand : public wxObject +{ +public: + wxCommand(bool canUndoIt = false, const wxString& name = wxEmptyString); + virtual ~wxCommand(){} + + // Override this to perform a command + virtual bool Do() = 0; + + // Override this to undo a command + virtual bool Undo() = 0; + + virtual bool CanUndo() const { return m_canUndo; } + virtual wxString GetName() const { return m_commandName; } + +protected: + bool m_canUndo; + wxString m_commandName; + +private: + DECLARE_CLASS(wxCommand) +}; + +// ---------------------------------------------------------------------------- +// wxCommandProcessor: wxCommand manager +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxCommandProcessor : public wxObject +{ +public: + // if max number of commands is -1, it is unlimited + wxCommandProcessor(int maxCommands = -1); + virtual ~wxCommandProcessor(); + + // Pass a command to the processor. The processor calls Do(); if + // successful, is appended to the command history unless storeIt is false. + virtual bool Submit(wxCommand *command, bool storeIt = true); + + // just store the command without executing it + virtual void Store(wxCommand *command); + + virtual bool Undo(); + virtual bool Redo(); + virtual bool CanUndo() const; + virtual bool CanRedo() const; + + // Initialises the current command and menu strings. + virtual void Initialize(); + + // Sets the Undo/Redo menu strings for the current menu. + virtual void SetMenuStrings(); + + // Gets the current Undo menu label. + wxString GetUndoMenuLabel() const; + + // Gets the current Undo menu label. + wxString GetRedoMenuLabel() const; + +#if wxUSE_MENUS + // Call this to manage an edit menu. + void SetEditMenu(wxMenu *menu) { m_commandEditMenu = menu; } + wxMenu *GetEditMenu() const { return m_commandEditMenu; } +#endif // wxUSE_MENUS + + // command list access + wxList& GetCommands() { return m_commands; } + const wxList& GetCommands() const { return m_commands; } + wxCommand *GetCurrentCommand() const + { + return (wxCommand *)(m_currentCommand ? m_currentCommand->GetData() : NULL); + } + int GetMaxCommands() const { return m_maxNoCommands; } + virtual void ClearCommands(); + + // Has the current project been changed? + virtual bool IsDirty() const; + + // Mark the current command as the one where the last save took place + void MarkAsSaved() + { + m_lastSavedCommand = m_currentCommand; + } + + + // By default, the accelerators are "\tCtrl+Z" and "\tCtrl+Y" + const wxString& GetUndoAccelerator() const { return m_undoAccelerator; } + const wxString& GetRedoAccelerator() const { return m_redoAccelerator; } + + void SetUndoAccelerator(const wxString& accel) { m_undoAccelerator = accel; } + void SetRedoAccelerator(const wxString& accel) { m_redoAccelerator = accel; } + +protected: + // for further flexibility, command processor doesn't call wxCommand::Do() + // and Undo() directly but uses these functions which can be overridden in + // the derived class + virtual bool DoCommand(wxCommand& cmd); + virtual bool UndoCommand(wxCommand& cmd); + + int m_maxNoCommands; + wxList m_commands; + wxList::compatibility_iterator m_currentCommand, + m_lastSavedCommand; + +#if wxUSE_MENUS + wxMenu* m_commandEditMenu; +#endif // wxUSE_MENUS + + wxString m_undoAccelerator; + wxString m_redoAccelerator; + +private: + DECLARE_DYNAMIC_CLASS(wxCommandProcessor) + wxDECLARE_NO_COPY_CLASS(wxCommandProcessor); +}; + +#endif // _WX_CMDPROC_H_ + diff --git a/wxmsw/include/wx-3.0/wx/cmndata.h b/wxmsw/include/wx-3.0/wx/cmndata.h new file mode 100644 index 00000000..c8e345af --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/cmndata.h @@ -0,0 +1,311 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/cmndata.h +// Purpose: Common GDI data classes +// Author: Julian Smart and others +// Modified by: +// Created: 01/02/97 +// Copyright: (c) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CMNDATA_H_BASE_ +#define _WX_CMNDATA_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_PRINTING_ARCHITECTURE + +#include "wx/gdicmn.h" + +#if wxUSE_STREAMS +#include "wx/stream.h" +#endif + +class WXDLLIMPEXP_FWD_CORE wxPrintNativeDataBase; + +/* + * wxPrintData + * Encapsulates printer information (not printer dialog information) + */ + +enum wxPrintBin +{ + wxPRINTBIN_DEFAULT, + + wxPRINTBIN_ONLYONE, + wxPRINTBIN_LOWER, + wxPRINTBIN_MIDDLE, + wxPRINTBIN_MANUAL, + wxPRINTBIN_ENVELOPE, + wxPRINTBIN_ENVMANUAL, + wxPRINTBIN_AUTO, + wxPRINTBIN_TRACTOR, + wxPRINTBIN_SMALLFMT, + wxPRINTBIN_LARGEFMT, + wxPRINTBIN_LARGECAPACITY, + wxPRINTBIN_CASSETTE, + wxPRINTBIN_FORMSOURCE, + + wxPRINTBIN_USER +}; + +const int wxPRINTMEDIA_DEFAULT = 0; + +class WXDLLIMPEXP_CORE wxPrintData: public wxObject +{ +public: + wxPrintData(); + wxPrintData(const wxPrintData& printData); + virtual ~wxPrintData(); + + int GetNoCopies() const { return m_printNoCopies; } + bool GetCollate() const { return m_printCollate; } + wxPrintOrientation GetOrientation() const { return m_printOrientation; } + bool IsOrientationReversed() const { return m_printOrientationReversed; } + + // Is this data OK for showing the print dialog? + bool Ok() const { return IsOk(); } + bool IsOk() const ; + + const wxString& GetPrinterName() const { return m_printerName; } + bool GetColour() const { return m_colour; } + wxDuplexMode GetDuplex() const { return m_duplexMode; } + wxPaperSize GetPaperId() const { return m_paperId; } + const wxSize& GetPaperSize() const { return m_paperSize; } // Not used yet: confusable with paper size + // in wxPageSetupDialogData + wxPrintQuality GetQuality() const { return m_printQuality; } + wxPrintBin GetBin() const { return m_bin; } + wxPrintMode GetPrintMode() const { return m_printMode; } + int GetMedia() const { return m_media; } + + void SetNoCopies(int v) { m_printNoCopies = v; } + void SetCollate(bool flag) { m_printCollate = flag; } + + // Please use the overloaded method below + wxDEPRECATED_INLINE(void SetOrientation(int orient), + m_printOrientation = (wxPrintOrientation)orient; ) + void SetOrientation(wxPrintOrientation orient) { m_printOrientation = orient; } + void SetOrientationReversed(bool reversed) { m_printOrientationReversed = reversed; } + + void SetPrinterName(const wxString& name) { m_printerName = name; } + void SetColour(bool colour) { m_colour = colour; } + void SetDuplex(wxDuplexMode duplex) { m_duplexMode = duplex; } + void SetPaperId(wxPaperSize sizeId) { m_paperId = sizeId; } + void SetPaperSize(const wxSize& sz) { m_paperSize = sz; } + void SetQuality(wxPrintQuality quality) { m_printQuality = quality; } + void SetBin(wxPrintBin bin) { m_bin = bin; } + void SetMedia(int media) { m_media = media; } + void SetPrintMode(wxPrintMode printMode) { m_printMode = printMode; } + + wxString GetFilename() const { return m_filename; } + void SetFilename( const wxString &filename ) { m_filename = filename; } + + wxPrintData& operator=(const wxPrintData& data); + + char* GetPrivData() const { return m_privData; } + int GetPrivDataLen() const { return m_privDataLen; } + void SetPrivData( char *privData, int len ); + + + // Convert between wxPrintData and native data + void ConvertToNative(); + void ConvertFromNative(); + // Holds the native print data + wxPrintNativeDataBase *GetNativeData() const { return m_nativeData; } + +private: + wxPrintBin m_bin; + int m_media; + wxPrintMode m_printMode; + + int m_printNoCopies; + wxPrintOrientation m_printOrientation; + bool m_printOrientationReversed; + bool m_printCollate; + + wxString m_printerName; + bool m_colour; + wxDuplexMode m_duplexMode; + wxPrintQuality m_printQuality; + wxPaperSize m_paperId; + wxSize m_paperSize; + + wxString m_filename; + + char* m_privData; + int m_privDataLen; + + wxPrintNativeDataBase *m_nativeData; + +private: + DECLARE_DYNAMIC_CLASS(wxPrintData) +}; + +/* + * wxPrintDialogData + * Encapsulates information displayed and edited in the printer dialog box. + * Contains a wxPrintData object which is filled in according to the values retrieved + * from the dialog. + */ + +class WXDLLIMPEXP_CORE wxPrintDialogData: public wxObject +{ +public: + wxPrintDialogData(); + wxPrintDialogData(const wxPrintDialogData& dialogData); + wxPrintDialogData(const wxPrintData& printData); + virtual ~wxPrintDialogData(); + + int GetFromPage() const { return m_printFromPage; } + int GetToPage() const { return m_printToPage; } + int GetMinPage() const { return m_printMinPage; } + int GetMaxPage() const { return m_printMaxPage; } + int GetNoCopies() const { return m_printNoCopies; } + bool GetAllPages() const { return m_printAllPages; } + bool GetSelection() const { return m_printSelection; } + bool GetCollate() const { return m_printCollate; } + bool GetPrintToFile() const { return m_printToFile; } + + void SetFromPage(int v) { m_printFromPage = v; } + void SetToPage(int v) { m_printToPage = v; } + void SetMinPage(int v) { m_printMinPage = v; } + void SetMaxPage(int v) { m_printMaxPage = v; } + void SetNoCopies(int v) { m_printNoCopies = v; } + void SetAllPages(bool flag) { m_printAllPages = flag; } + void SetSelection(bool flag) { m_printSelection = flag; } + void SetCollate(bool flag) { m_printCollate = flag; } + void SetPrintToFile(bool flag) { m_printToFile = flag; } + + void EnablePrintToFile(bool flag) { m_printEnablePrintToFile = flag; } + void EnableSelection(bool flag) { m_printEnableSelection = flag; } + void EnablePageNumbers(bool flag) { m_printEnablePageNumbers = flag; } + void EnableHelp(bool flag) { m_printEnableHelp = flag; } + + bool GetEnablePrintToFile() const { return m_printEnablePrintToFile; } + bool GetEnableSelection() const { return m_printEnableSelection; } + bool GetEnablePageNumbers() const { return m_printEnablePageNumbers; } + bool GetEnableHelp() const { return m_printEnableHelp; } + + // Is this data OK for showing the print dialog? + bool Ok() const { return IsOk(); } + bool IsOk() const { return m_printData.IsOk() ; } + + wxPrintData& GetPrintData() { return m_printData; } + void SetPrintData(const wxPrintData& printData) { m_printData = printData; } + + void operator=(const wxPrintDialogData& data); + void operator=(const wxPrintData& data); // Sets internal m_printData member + +private: + int m_printFromPage; + int m_printToPage; + int m_printMinPage; + int m_printMaxPage; + int m_printNoCopies; + bool m_printAllPages; + bool m_printCollate; + bool m_printToFile; + bool m_printSelection; + bool m_printEnableSelection; + bool m_printEnablePageNumbers; + bool m_printEnableHelp; + bool m_printEnablePrintToFile; + wxPrintData m_printData; + +private: + DECLARE_DYNAMIC_CLASS(wxPrintDialogData) +}; + +/* +* This is the data used (and returned) by the wxPageSetupDialog. +*/ + +// Compatibility with old name +#define wxPageSetupData wxPageSetupDialogData + +class WXDLLIMPEXP_CORE wxPageSetupDialogData: public wxObject +{ +public: + wxPageSetupDialogData(); + wxPageSetupDialogData(const wxPageSetupDialogData& dialogData); + wxPageSetupDialogData(const wxPrintData& printData); + virtual ~wxPageSetupDialogData(); + + wxSize GetPaperSize() const { return m_paperSize; } + wxPaperSize GetPaperId() const { return m_printData.GetPaperId(); } + wxPoint GetMinMarginTopLeft() const { return m_minMarginTopLeft; } + wxPoint GetMinMarginBottomRight() const { return m_minMarginBottomRight; } + wxPoint GetMarginTopLeft() const { return m_marginTopLeft; } + wxPoint GetMarginBottomRight() const { return m_marginBottomRight; } + + bool GetDefaultMinMargins() const { return m_defaultMinMargins; } + bool GetEnableMargins() const { return m_enableMargins; } + bool GetEnableOrientation() const { return m_enableOrientation; } + bool GetEnablePaper() const { return m_enablePaper; } + bool GetEnablePrinter() const { return m_enablePrinter; } + bool GetDefaultInfo() const { return m_getDefaultInfo; } + bool GetEnableHelp() const { return m_enableHelp; } + + // Is this data OK for showing the page setup dialog? + bool Ok() const { return IsOk(); } + bool IsOk() const { return m_printData.IsOk() ; } + + // If a corresponding paper type is found in the paper database, will set the m_printData + // paper size id member as well. + void SetPaperSize(const wxSize& sz); + + void SetPaperId(wxPaperSize id) { m_printData.SetPaperId(id); } + + // Sets the wxPrintData id, plus the paper width/height if found in the paper database. + void SetPaperSize(wxPaperSize id); + + void SetMinMarginTopLeft(const wxPoint& pt) { m_minMarginTopLeft = pt; } + void SetMinMarginBottomRight(const wxPoint& pt) { m_minMarginBottomRight = pt; } + void SetMarginTopLeft(const wxPoint& pt) { m_marginTopLeft = pt; } + void SetMarginBottomRight(const wxPoint& pt) { m_marginBottomRight = pt; } + void SetDefaultMinMargins(bool flag) { m_defaultMinMargins = flag; } + void SetDefaultInfo(bool flag) { m_getDefaultInfo = flag; } + + void EnableMargins(bool flag) { m_enableMargins = flag; } + void EnableOrientation(bool flag) { m_enableOrientation = flag; } + void EnablePaper(bool flag) { m_enablePaper = flag; } + void EnablePrinter(bool flag) { m_enablePrinter = flag; } + void EnableHelp(bool flag) { m_enableHelp = flag; } + + // Use paper size defined in this object to set the wxPrintData + // paper id + void CalculateIdFromPaperSize(); + + // Use paper id in wxPrintData to set this object's paper size + void CalculatePaperSizeFromId(); + + wxPageSetupDialogData& operator=(const wxPageSetupDialogData& data); + wxPageSetupDialogData& operator=(const wxPrintData& data); + + wxPrintData& GetPrintData() { return m_printData; } + const wxPrintData& GetPrintData() const { return m_printData; } + void SetPrintData(const wxPrintData& printData); + +private: + wxSize m_paperSize; // The dimensions selected by the user (on return, same as in wxPrintData?) + wxPoint m_minMarginTopLeft; + wxPoint m_minMarginBottomRight; + wxPoint m_marginTopLeft; + wxPoint m_marginBottomRight; + bool m_defaultMinMargins; + bool m_enableMargins; + bool m_enableOrientation; + bool m_enablePaper; + bool m_enablePrinter; + bool m_getDefaultInfo; // Equiv. to PSD_RETURNDEFAULT + bool m_enableHelp; + wxPrintData m_printData; + +private: + DECLARE_DYNAMIC_CLASS(wxPageSetupDialogData) +}; + +#endif // wxUSE_PRINTING_ARCHITECTURE + +#endif +// _WX_CMNDATA_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/collpane.h b/wxmsw/include/wx-3.0/wx/collpane.h new file mode 100644 index 00000000..40c8939b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/collpane.h @@ -0,0 +1,108 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/collpane.h +// Purpose: wxCollapsiblePane +// Author: Francesco Montorsi +// Modified by: +// Created: 8/10/2006 +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COLLAPSABLE_PANE_H_BASE_ +#define _WX_COLLAPSABLE_PANE_H_BASE_ + +#include "wx/defs.h" + + +#if wxUSE_COLLPANE + +#include "wx/control.h" + +// class name +extern WXDLLIMPEXP_DATA_CORE(const char) wxCollapsiblePaneNameStr[]; + +// ---------------------------------------------------------------------------- +// wxCollapsiblePaneBase: interface for wxCollapsiblePane +// ---------------------------------------------------------------------------- + +#define wxCP_DEFAULT_STYLE (wxTAB_TRAVERSAL | wxNO_BORDER) +#define wxCP_NO_TLW_RESIZE (0x0002) + +class WXDLLIMPEXP_CORE wxCollapsiblePaneBase : public wxControl +{ +public: + wxCollapsiblePaneBase() {} + + virtual void Collapse(bool collapse = true) = 0; + void Expand() { Collapse(false); } + + virtual bool IsCollapsed() const = 0; + bool IsExpanded() const { return !IsCollapsed(); } + + virtual wxWindow *GetPane() const = 0; + + virtual wxString GetLabel() const = 0; + virtual void SetLabel(const wxString& label) = 0; +}; + + +// ---------------------------------------------------------------------------- +// event types and macros +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxCollapsiblePaneEvent; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COLLAPSIBLEPANE_CHANGED, wxCollapsiblePaneEvent ); + +class WXDLLIMPEXP_CORE wxCollapsiblePaneEvent : public wxCommandEvent +{ +public: + wxCollapsiblePaneEvent() {} + wxCollapsiblePaneEvent(wxObject *generator, int id, bool collapsed) + : wxCommandEvent(wxEVT_COLLAPSIBLEPANE_CHANGED, id), + m_bCollapsed(collapsed) + { + SetEventObject(generator); + } + + bool GetCollapsed() const { return m_bCollapsed; } + void SetCollapsed(bool c) { m_bCollapsed = c; } + + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxCollapsiblePaneEvent(*this); } + +private: + bool m_bCollapsed; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCollapsiblePaneEvent) +}; + +// ---------------------------------------------------------------------------- +// event types and macros +// ---------------------------------------------------------------------------- + +typedef void (wxEvtHandler::*wxCollapsiblePaneEventFunction)(wxCollapsiblePaneEvent&); + +#define wxCollapsiblePaneEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxCollapsiblePaneEventFunction, func) + +#define EVT_COLLAPSIBLEPANE_CHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COLLAPSIBLEPANE_CHANGED, id, wxCollapsiblePaneEventHandler(fn)) + + +#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/collpane.h" +#else + #include "wx/generic/collpaneg.h" + + // use #define and not a typedef to allow forward declaring the class + #define wxCollapsiblePane wxGenericCollapsiblePane +#endif + +// old wxEVT_COMMAND_* constant +#define wxEVT_COMMAND_COLLPANE_CHANGED wxEVT_COLLAPSIBLEPANE_CHANGED + +#endif // wxUSE_COLLPANE + +#endif // _WX_COLLAPSABLE_PANE_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/colordlg.h b/wxmsw/include/wx-3.0/wx/colordlg.h new file mode 100644 index 00000000..b4156d14 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/colordlg.h @@ -0,0 +1,41 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/colordlg.h +// Purpose: wxColourDialog +// Author: Vadim Zeitiln +// Modified by: +// Created: 01/02/97 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COLORDLG_H_BASE_ +#define _WX_COLORDLG_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_COLOURDLG + +#include "wx/colourdata.h" + +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + #include "wx/msw/colordlg.h" +#elif defined(__WXMAC__) && !defined(__WXUNIVERSAL__) + #include "wx/osx/colordlg.h" +#elif defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/colordlg.h" +#else + #include "wx/generic/colrdlgg.h" + + #define wxColourDialog wxGenericColourDialog +#endif + +// get the colour from user and return it +WXDLLIMPEXP_CORE wxColour wxGetColourFromUser(wxWindow *parent = NULL, + const wxColour& colInit = wxNullColour, + const wxString& caption = wxEmptyString, + wxColourData *data = NULL); + +#endif // wxUSE_COLOURDLG + +#endif + // _WX_COLORDLG_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/colour.h b/wxmsw/include/wx-3.0/wx/colour.h new file mode 100644 index 00000000..eec55428 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/colour.h @@ -0,0 +1,238 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/colour.h +// Purpose: wxColourBase definition +// Author: Julian Smart +// Modified by: Francesco Montorsi +// Created: +// Copyright: Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COLOUR_H_BASE_ +#define _WX_COLOUR_H_BASE_ + +#include "wx/defs.h" +#include "wx/gdiobj.h" + +class WXDLLIMPEXP_FWD_CORE wxColour; + +// A macro to define the standard wxColour constructors: +// +// It avoids the need to repeat these lines across all colour.h files, since +// Set() is a virtual function and thus cannot be called by wxColourBase ctors +#define DEFINE_STD_WXCOLOUR_CONSTRUCTORS \ + wxColour() { Init(); } \ + wxColour(ChannelType red, \ + ChannelType green, \ + ChannelType blue, \ + ChannelType alpha = wxALPHA_OPAQUE) \ + { Init(); Set(red, green, blue, alpha); } \ + wxColour(unsigned long colRGB) { Init(); Set(colRGB ); } \ + wxColour(const wxString& colourName) { Init(); Set(colourName); } \ + wxColour(const char *colourName) { Init(); Set(colourName); } \ + wxColour(const wchar_t *colourName) { Init(); Set(colourName); } + + +// flags for wxColour -> wxString conversion (see wxColour::GetAsString) +enum { + wxC2S_NAME = 1, // return colour name, when possible + wxC2S_CSS_SYNTAX = 2, // return colour in rgb(r,g,b) syntax + wxC2S_HTML_SYNTAX = 4 // return colour in #rrggbb syntax +}; + +const unsigned char wxALPHA_TRANSPARENT = 0; +const unsigned char wxALPHA_OPAQUE = 0xff; + +// a valid but fully transparent colour +#define wxTransparentColour wxColour(0, 0, 0, wxALPHA_TRANSPARENT) +#define wxTransparentColor wxTransparentColour + +// ---------------------------------------------------------------------------- +// wxVariant support +// ---------------------------------------------------------------------------- + +#if wxUSE_VARIANT +#include "wx/variant.h" +DECLARE_VARIANT_OBJECT_EXPORTED(wxColour,WXDLLIMPEXP_CORE) +#endif + +//----------------------------------------------------------------------------- +// wxColourBase: this class has no data members, just some functions to avoid +// code redundancy in all native wxColour implementations +//----------------------------------------------------------------------------- + +/* Transition from wxGDIObject to wxObject is incomplete. If your port does + not need the wxGDIObject machinery to handle colors, please add it to the + list of ports which do not need it. + */ +#if defined( __WXMAC__ ) || defined( __WXMSW__ ) || defined( __WXPM__ ) || defined( __WXCOCOA__ ) +#define wxCOLOUR_IS_GDIOBJECT 0 +#else +#define wxCOLOUR_IS_GDIOBJECT 1 +#endif + +class WXDLLIMPEXP_CORE wxColourBase : public +#if wxCOLOUR_IS_GDIOBJECT + wxGDIObject +#else + wxObject +#endif +{ +public: + // type of a single colour component + typedef unsigned char ChannelType; + + wxColourBase() {} + virtual ~wxColourBase() {} + + + // Set() functions + // --------------- + + void Set(ChannelType red, + ChannelType green, + ChannelType blue, + ChannelType alpha = wxALPHA_OPAQUE) + { InitRGBA(red, green, blue, alpha); } + + // implemented in colourcmn.cpp + bool Set(const wxString &str) + { return FromString(str); } + + void Set(unsigned long colRGB) + { + // we don't need to know sizeof(long) here because we assume that the three + // least significant bytes contain the R, G and B values + Set((ChannelType)(0xFF & colRGB), + (ChannelType)(0xFF & (colRGB >> 8)), + (ChannelType)(0xFF & (colRGB >> 16))); + } + + + + // accessors + // --------- + + virtual ChannelType Red() const = 0; + virtual ChannelType Green() const = 0; + virtual ChannelType Blue() const = 0; + virtual ChannelType Alpha() const + { return wxALPHA_OPAQUE ; } + + // implemented in colourcmn.cpp + virtual wxString GetAsString(long flags = wxC2S_NAME | wxC2S_CSS_SYNTAX) const; + + void SetRGB(wxUint32 colRGB) + { + Set((ChannelType)(0xFF & colRGB), + (ChannelType)(0xFF & (colRGB >> 8)), + (ChannelType)(0xFF & (colRGB >> 16))); + } + + void SetRGBA(wxUint32 colRGBA) + { + Set((ChannelType)(0xFF & colRGBA), + (ChannelType)(0xFF & (colRGBA >> 8)), + (ChannelType)(0xFF & (colRGBA >> 16)), + (ChannelType)(0xFF & (colRGBA >> 24))); + } + + wxUint32 GetRGB() const + { return Red() | (Green() << 8) | (Blue() << 16); } + + wxUint32 GetRGBA() const + { return Red() | (Green() << 8) | (Blue() << 16) | (Alpha() << 24); } + +#if !wxCOLOUR_IS_GDIOBJECT + virtual bool IsOk() const= 0; + + // older version, for backwards compatibility only (but not deprecated + // because it's still widely used) + bool Ok() const { return IsOk(); } +#endif + + // manipulation + // ------------ + + // These methods are static because they are mostly used + // within tight loops (where we don't want to instantiate wxColour's) + + static void MakeMono (unsigned char* r, unsigned char* g, unsigned char* b, bool on); + static void MakeDisabled(unsigned char* r, unsigned char* g, unsigned char* b, unsigned char brightness = 255); + static void MakeGrey (unsigned char* r, unsigned char* g, unsigned char* b); // integer version + static void MakeGrey (unsigned char* r, unsigned char* g, unsigned char* b, + double weight_r, double weight_g, double weight_b); // floating point version + static unsigned char AlphaBlend (unsigned char fg, unsigned char bg, double alpha); + static void ChangeLightness(unsigned char* r, unsigned char* g, unsigned char* b, int ialpha); + + wxColour ChangeLightness(int ialpha) const; + wxColour& MakeDisabled(unsigned char brightness = 255); + + // old, deprecated + // --------------- + +#if WXWIN_COMPATIBILITY_2_6 + static wxDEPRECATED( wxColour CreateByName(const wxString& name) ); + wxDEPRECATED( void InitFromName(const wxString& col) ); +#endif + +protected: + // Some ports need Init() and while we don't, provide a stub so that the + // ports which don't need it are not forced to define it + void Init() { } + + virtual void + InitRGBA(ChannelType r, ChannelType g, ChannelType b, ChannelType a) = 0; + + virtual bool FromString(const wxString& s); + +#if wxCOLOUR_IS_GDIOBJECT + // wxColour doesn't use reference counted data (at least not in all ports) + // so provide stubs for the functions which need to be defined if we do use + // them + virtual wxGDIRefData *CreateGDIRefData() const + { + wxFAIL_MSG( "must be overridden if used" ); + + return NULL; + } + + virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *WXUNUSED(data)) const + { + wxFAIL_MSG( "must be overridden if used" ); + + return NULL; + } +#endif +}; + + +// wxColour <-> wxString utilities, used by wxConfig, defined in colourcmn.cpp +WXDLLIMPEXP_CORE wxString wxToString(const wxColourBase& col); +WXDLLIMPEXP_CORE bool wxFromString(const wxString& str, wxColourBase* col); + + + +#if defined(__WXMSW__) + #include "wx/msw/colour.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/colour.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/colour.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/colour.h" +#elif defined(__WXDFB__) + #include "wx/generic/colour.h" +#elif defined(__WXX11__) + #include "wx/x11/colour.h" +#elif defined(__WXMAC__) + #include "wx/osx/colour.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/colour.h" +#elif defined(__WXPM__) + #include "wx/os2/colour.h" +#endif + +#define wxColor wxColour + +#endif // _WX_COLOUR_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/colourdata.h b/wxmsw/include/wx-3.0/wx/colourdata.h new file mode 100644 index 00000000..5a755ae0 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/colourdata.h @@ -0,0 +1,51 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/colourdata.h +// Author: Julian Smart +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COLOURDATA_H_ +#define _WX_COLOURDATA_H_ + +#include "wx/colour.h" + +class WXDLLIMPEXP_CORE wxColourData : public wxObject +{ +public: + // number of custom colours we store + enum + { + NUM_CUSTOM = 16 + }; + + wxColourData(); + wxColourData(const wxColourData& data); + wxColourData& operator=(const wxColourData& data); + virtual ~wxColourData(); + + void SetChooseFull(bool flag) { m_chooseFull = flag; } + bool GetChooseFull() const { return m_chooseFull; } + void SetColour(const wxColour& colour) { m_dataColour = colour; } + const wxColour& GetColour() const { return m_dataColour; } + wxColour& GetColour() { return m_dataColour; } + + // SetCustomColour() modifies colours in an internal array of NUM_CUSTOM + // custom colours; + void SetCustomColour(int i, const wxColour& colour); + wxColour GetCustomColour(int i) const; + + // Serialize the object to a string and restore it from it + wxString ToString() const; + bool FromString(const wxString& str); + + + // public for backwards compatibility only: don't use directly + wxColour m_dataColour; + wxColour m_custColours[NUM_CUSTOM]; + bool m_chooseFull; + + DECLARE_DYNAMIC_CLASS(wxColourData) +}; + +#endif // _WX_COLOURDATA_H_ diff --git a/wxmsw/include/wx-3.0/wx/combo.h b/wxmsw/include/wx-3.0/wx/combo.h new file mode 100644 index 00000000..6a040b3d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/combo.h @@ -0,0 +1,882 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/combo.h +// Purpose: wxComboCtrl declaration +// Author: Jaakko Salli +// Modified by: +// Created: Apr-30-2006 +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COMBOCONTROL_H_BASE_ +#define _WX_COMBOCONTROL_H_BASE_ + + +/* + A few words about all the classes defined in this file are probably in + order: why do we need extra wxComboCtrl and wxComboPopup classes? + + This is because a traditional combobox is a combination of a text control + (with a button allowing to open the pop down list) with a listbox and + wxComboBox class is exactly such control, however we want to also have other + combinations - in fact, we want to allow anything at all to be used as pop + down list, not just a wxListBox. + + So we define a base wxComboCtrl which can use any control as pop down + list and wxComboBox deriving from it which implements the standard wxWidgets + combobox API. wxComboCtrl needs to be told somehow which control to use + and this is done by SetPopupControl(). However, we need something more than + just a wxControl in this method as, for example, we need to call + SetSelection("initial text value") and wxControl doesn't have such method. + So we also need a wxComboPopup which is just a very simple interface which + must be implemented by a control to be usable as a popup. + + We couldn't derive wxComboPopup from wxControl as this would make it + impossible to have a class deriving from both wxListBx and from it, so + instead it is just a mix-in. + */ + + +#include "wx/defs.h" + +#if wxUSE_COMBOCTRL + +#include "wx/control.h" +#include "wx/renderer.h" // this is needed for wxCONTROL_XXX flags +#include "wx/bitmap.h" // wxBitmap used by-value +#include "wx/textentry.h" + +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxComboPopup; + +// +// New window styles for wxComboCtrlBase +// +enum +{ + // Double-clicking a read-only combo triggers call to popup's OnComboPopup. + // In wxOwnerDrawnComboBox, for instance, it cycles item. + wxCC_SPECIAL_DCLICK = 0x0100, + + // Dropbutton acts like standard push button. + wxCC_STD_BUTTON = 0x0200 +}; + + +// wxComboCtrl internal flags +enum +{ + // First those that can be passed to Customize. + // It is Windows style for all flags to be clear. + + // Button is preferred outside the border (GTK style) + wxCC_BUTTON_OUTSIDE_BORDER = 0x0001, + // Show popup on mouse up instead of mouse down (which is the Windows style) + wxCC_POPUP_ON_MOUSE_UP = 0x0002, + // All text is not automatically selected on click + wxCC_NO_TEXT_AUTO_SELECT = 0x0004, + // Drop-button stays down as long as popup is displayed. + wxCC_BUTTON_STAYS_DOWN = 0x0008, + // Drop-button covers the entire control. + wxCC_FULL_BUTTON = 0x0010, + // Drop-button goes over the custom-border (used under WinVista). + wxCC_BUTTON_COVERS_BORDER = 0x0020, + + // Internal use: signals creation is complete + wxCC_IFLAG_CREATED = 0x0100, + // Internal use: really put button outside + wxCC_IFLAG_BUTTON_OUTSIDE = 0x0200, + // Internal use: SetMargins has been successfully called + wxCC_IFLAG_LEFT_MARGIN_SET = 0x0400, + // Internal use: Set wxTAB_TRAVERSAL to parent when popup is dismissed + wxCC_IFLAG_PARENT_TAB_TRAVERSAL = 0x0800, + // Internal use: Secondary popup window type should be used (if available). + wxCC_IFLAG_USE_ALT_POPUP = 0x1000, + // Internal use: Skip popup animation. + wxCC_IFLAG_DISABLE_POPUP_ANIM = 0x2000, + // Internal use: Drop-button is a bitmap button or has non-default size + // (but can still be on either side of the control), regardless whether + // specified by the platform or the application. + wxCC_IFLAG_HAS_NONSTANDARD_BUTTON = 0x4000 +}; + + +// Flags used by PreprocessMouseEvent and HandleButtonMouseEvent +enum +{ + wxCC_MF_ON_BUTTON = 0x0001, // cursor is on dropbutton area + wxCC_MF_ON_CLICK_AREA = 0x0002 // cursor is on dropbutton or other area + // that can be clicked to show the popup. +}; + + +// Namespace for wxComboCtrl feature flags +struct wxComboCtrlFeatures +{ + enum + { + MovableButton = 0x0001, // Button can be on either side of control + BitmapButton = 0x0002, // Button may be replaced with bitmap + ButtonSpacing = 0x0004, // Button can have spacing from the edge + // of the control + TextIndent = 0x0008, // SetMargins can be used to control + // left margin. + PaintControl = 0x0010, // Combo control itself can be custom painted + PaintWritable = 0x0020, // A variable-width area in front of writable + // combo control's textctrl can be custom + // painted + Borderless = 0x0040, // wxNO_BORDER window style works + + // There are no feature flags for... + // PushButtonBitmapBackground - if its in wxRendererNative, then it should be + // not an issue to have it automatically under the bitmap. + + All = MovableButton|BitmapButton| + ButtonSpacing|TextIndent| + PaintControl|PaintWritable| + Borderless + }; +}; + + +class WXDLLIMPEXP_CORE wxComboCtrlBase : public wxControl, + public wxTextEntry +{ + friend class wxComboPopup; + friend class wxComboPopupEvtHandler; +public: + // ctors and such + wxComboCtrlBase() : wxControl(), wxTextEntry() { Init(); } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name); + + virtual ~wxComboCtrlBase(); + + // Show/hide popup window (wxComboBox-compatible methods) + virtual void Popup(); + virtual void Dismiss() + { + HidePopup(true); + } + + // Show/hide popup window. + // TODO: Maybe deprecate in favor of Popup()/Dismiss(). + // However, these functions are still called internally + // so it is not straightforward. + virtual void ShowPopup(); + virtual void HidePopup(bool generateEvent=false); + + // Override for totally custom combo action + virtual void OnButtonClick(); + + // return true if the popup is currently shown + bool IsPopupShown() const { return m_popupWinState == Visible; } + + // set interface class instance derived from wxComboPopup + // NULL popup can be used to indicate default in a derived class + void SetPopupControl( wxComboPopup* popup ) + { + DoSetPopupControl(popup); + } + + // get interface class instance derived from wxComboPopup + wxComboPopup* GetPopupControl() + { + EnsurePopupControl(); + return m_popupInterface; + } + + // get the popup window containing the popup control + wxWindow *GetPopupWindow() const { return m_winPopup; } + + // Get the text control which is part of the combobox. + wxTextCtrl *GetTextCtrl() const { return m_text; } + + // get the dropdown button which is part of the combobox + // note: its not necessarily a wxButton or wxBitmapButton + wxWindow *GetButton() const { return m_btn; } + + // forward these methods to all subcontrols + virtual bool Enable(bool enable = true); + virtual bool Show(bool show = true); + virtual bool SetFont(const wxFont& font); + + // + // wxTextEntry methods + // + // NB: We basically need to override all of them because there is + // no guarantee how platform-specific wxTextEntry is implemented. + // + virtual void SetValue(const wxString& value) + { wxTextEntryBase::SetValue(value); } + virtual void ChangeValue(const wxString& value) + { wxTextEntryBase::ChangeValue(value); } + + virtual void WriteText(const wxString& text); + virtual void AppendText(const wxString& text) + { wxTextEntryBase::AppendText(text); } + + virtual wxString GetValue() const + { return wxTextEntryBase::GetValue(); } + + virtual wxString GetRange(long from, long to) const + { return wxTextEntryBase::GetRange(from, to); } + + // Replace() and DoSetValue() need to be fully re-implemented since + // EventSuppressor utility class does not work with the way + // wxComboCtrl is implemented. + virtual void Replace(long from, long to, const wxString& value); + + virtual void Remove(long from, long to); + + virtual void Copy(); + virtual void Cut(); + virtual void Paste(); + + virtual void Undo(); + virtual void Redo(); + virtual bool CanUndo() const; + virtual bool CanRedo() const; + + virtual void SetInsertionPoint(long pos); + virtual long GetInsertionPoint() const; + virtual long GetLastPosition() const; + + virtual void SetSelection(long from, long to); + virtual void GetSelection(long *from, long *to) const; + + virtual bool IsEditable() const; + virtual void SetEditable(bool editable); + + virtual bool SetHint(const wxString& hint); + virtual wxString GetHint() const; + + // This method sets the text without affecting list selection + // (ie. wxComboPopup::SetStringValue doesn't get called). + void SetText(const wxString& value); + + // This method sets value and also optionally sends EVT_TEXT + // (needed by combo popups) + wxDEPRECATED( void SetValueWithEvent(const wxString& value, + bool withEvent = true) ); + + // Changes value of the control as if user had done it by selecting an + // item from a combo box drop-down list. Needs to be public so that + // derived popup classes can call it. + void SetValueByUser(const wxString& value); + + // + // Popup customization methods + // + + // Sets minimum width of the popup. If wider than combo control, it will extend to the left. + // Remarks: + // * Value -1 indicates the default. + // * Custom popup may choose to ignore this (wxOwnerDrawnComboBox does not). + void SetPopupMinWidth( int width ) + { + m_widthMinPopup = width; + } + + // Sets preferred maximum height of the popup. + // Remarks: + // * Value -1 indicates the default. + // * Custom popup may choose to ignore this (wxOwnerDrawnComboBox does not). + void SetPopupMaxHeight( int height ) + { + m_heightPopup = height; + } + + // Extends popup size horizontally, relative to the edges of the combo control. + // Remarks: + // * Popup minimum width may override extLeft (ie. it has higher precedence). + // * Values 0 indicate default. + // * Custom popup may not take this fully into account (wxOwnerDrawnComboBox takes). + void SetPopupExtents( int extLeft, int extRight ) + { + m_extLeft = extLeft; + m_extRight = extRight; + } + + // Set width, in pixels, of custom paint area in writable combo. + // In read-only, used to indicate area that is not covered by the + // focus rectangle (which may or may not be drawn, depending on the + // popup type). + void SetCustomPaintWidth( int width ); + int GetCustomPaintWidth() const { return m_widthCustomPaint; } + + // Set side of the control to which the popup will align itself. + // Valid values are wxLEFT, wxRIGHT and 0. The default value 0 wmeans + // that the side of the button will be used. + void SetPopupAnchor( int anchorSide ) + { + m_anchorSide = anchorSide; + } + + // Set position of dropdown button. + // width: button width. <= 0 for default. + // height: button height. <= 0 for default. + // side: wxLEFT or wxRIGHT, indicates on which side the button will be placed. + // spacingX: empty space on sides of the button. Default is 0. + // Remarks: + // There is no spacingY - the button will be centered vertically. + void SetButtonPosition( int width = -1, + int height = -1, + int side = wxRIGHT, + int spacingX = 0 ); + + // Returns current size of the dropdown button. + wxSize GetButtonSize(); + + // + // Sets dropbutton to be drawn with custom bitmaps. + // + // bmpNormal: drawn when cursor is not on button + // pushButtonBg: Draw push button background below the image. + // NOTE! This is usually only properly supported on platforms with appropriate + // method in wxRendererNative. + // bmpPressed: drawn when button is depressed + // bmpHover: drawn when cursor hovers on button. This is ignored on platforms + // that do not generally display hover differently. + // bmpDisabled: drawn when combobox is disabled. + void SetButtonBitmaps( const wxBitmap& bmpNormal, + bool pushButtonBg = false, + const wxBitmap& bmpPressed = wxNullBitmap, + const wxBitmap& bmpHover = wxNullBitmap, + const wxBitmap& bmpDisabled = wxNullBitmap ); + +#if WXWIN_COMPATIBILITY_2_8 + // + // This will set the space in pixels between left edge of the control and the + // text, regardless whether control is read-only (ie. no wxTextCtrl) or not. + // Platform-specific default can be set with value-1. + // Remarks + // * This method may do nothing on some native implementations. + wxDEPRECATED( void SetTextIndent( int indent ) ); + + // Returns actual indentation in pixels. + wxDEPRECATED( wxCoord GetTextIndent() const ); +#endif + + // Returns area covered by the text field. + const wxRect& GetTextRect() const + { + return m_tcArea; + } + + // Call with enable as true to use a type of popup window that guarantees ability + // to focus the popup control, and normal function of common native controls. + // This alternative popup window is usually a wxDialog, and as such it's parent + // frame will appear as if the focus has been lost from it. + void UseAltPopupWindow( bool enable = true ) + { + wxASSERT_MSG( !m_winPopup, + wxT("call this only before SetPopupControl") ); + + if ( enable ) + m_iFlags |= wxCC_IFLAG_USE_ALT_POPUP; + else + m_iFlags &= ~wxCC_IFLAG_USE_ALT_POPUP; + } + + // Call with false to disable popup animation, if any. + void EnablePopupAnimation( bool enable = true ) + { + if ( enable ) + m_iFlags &= ~wxCC_IFLAG_DISABLE_POPUP_ANIM; + else + m_iFlags |= wxCC_IFLAG_DISABLE_POPUP_ANIM; + } + + // + // Utilies needed by the popups or native implementations + // + + // Returns true if given key combination should toggle the popup. + // NB: This is a separate from other keyboard handling because: + // 1) Replaceability. + // 2) Centralized code (otherwise it'd be split up between + // wxComboCtrl key handler and wxVListBoxComboPopup's + // key handler). + virtual bool IsKeyPopupToggle(const wxKeyEvent& event) const = 0; + + // Prepare background of combo control or an item in a dropdown list + // in a way typical on platform. This includes painting the focus/disabled + // background and setting the clipping region. + // Unless you plan to paint your own focus indicator, you should always call this + // in your wxComboPopup::PaintComboControl implementation. + // In addition, it sets pen and text colour to what looks good and proper + // against the background. + // flags: wxRendererNative flags: wxCONTROL_ISSUBMENU: is drawing a list item instead of combo control + // wxCONTROL_SELECTED: list item is selected + // wxCONTROL_DISABLED: control/item is disabled + virtual void PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const; + + // Returns true if focus indicator should be drawn in the control. + bool ShouldDrawFocus() const + { + const wxWindow* curFocus = FindFocus(); + return ( IsPopupWindowState(Hidden) && + (curFocus == m_mainCtrlWnd || (m_btn && curFocus == m_btn)) && + (m_windowStyle & wxCB_READONLY) ); + } + + // These methods return references to appropriate dropbutton bitmaps + const wxBitmap& GetBitmapNormal() const { return m_bmpNormal; } + const wxBitmap& GetBitmapPressed() const { return m_bmpPressed; } + const wxBitmap& GetBitmapHover() const { return m_bmpHover; } + const wxBitmap& GetBitmapDisabled() const { return m_bmpDisabled; } + + // Set custom style flags for embedded wxTextCtrl. Usually must be used + // with two-step creation, before Create() call. + void SetTextCtrlStyle( int style ); + + // Return internal flags + wxUint32 GetInternalFlags() const { return m_iFlags; } + + // Return true if Create has finished + bool IsCreated() const { return m_iFlags & wxCC_IFLAG_CREATED ? true : false; } + + // Need to override to return text area background colour + wxColour GetBackgroundColour() const; + + // common code to be called on popup hide/dismiss + void OnPopupDismiss(bool generateEvent); + + // PopupShown states + enum + { + Hidden = 0, + //Closing = 1, + Animating = 2, + Visible = 3 + }; + + bool IsPopupWindowState( int state ) const { return (state == m_popupWinState) ? true : false; } + + wxByte GetPopupWindowState() const { return m_popupWinState; } + + // Set value returned by GetMainWindowOfCompositeControl + void SetCtrlMainWnd( wxWindow* wnd ) { m_mainCtrlWnd = wnd; } + + // This is public so we can access it from wxComboCtrlTextCtrl + virtual wxWindow *GetMainWindowOfCompositeControl() + { return m_mainCtrlWnd; } + + // also set the embedded wxTextCtrl colours + virtual bool SetForegroundColour(const wxColour& colour); + virtual bool SetBackgroundColour(const wxColour& colour); + +protected: + + // Returns true if hint text should be drawn in the control + bool ShouldUseHintText(int flags = 0) const + { + return ( !m_text && + !(flags & wxCONTROL_ISSUBMENU) && + !m_valueString.length() && + m_hintText.length() && + !ShouldDrawFocus() ); + } + + // + // Override these for customization purposes + // + + // called from wxSizeEvent handler + virtual void OnResize() = 0; + + // Return native text identation + // (i.e. text margin, for pure text, not textctrl) + virtual wxCoord GetNativeTextIndent() const; + + // Called in syscolourchanged handler and base create + virtual void OnThemeChange(); + + // Creates wxTextCtrl. + // extraStyle: Extra style parameters + void CreateTextCtrl( int extraStyle ); + + // Called when text was changed programmatically + // (e.g. from WriteText()) + void OnSetValue(const wxString& value); + + // Installs standard input handler to combo (and optionally to the textctrl) + void InstallInputHandlers(); + + // Flags for DrawButton + enum + { + Button_PaintBackground = 0x0001, // Paints control background below the button + Button_BitmapOnly = 0x0002 // Only paints the bitmap + }; + + // Draws dropbutton. Using wxRenderer or bitmaps, as appropriate. + // Flags are defined above. + virtual void DrawButton( wxDC& dc, const wxRect& rect, int flags = Button_PaintBackground ); + + // Call if cursor is on button area or mouse is captured for the button. + //bool HandleButtonMouseEvent( wxMouseEvent& event, bool isInside ); + bool HandleButtonMouseEvent( wxMouseEvent& event, int flags ); + + // returns true if event was consumed or filtered (event type is also set to 0 in this case) + bool PreprocessMouseEvent( wxMouseEvent& event, int flags ); + + // + // This will handle left_down and left_dclick events outside button in a Windows-like manner. + // If you need alternate behaviour, it is recommended you manipulate and filter events to it + // instead of building your own handling routine (for reference, on wxEVT_LEFT_DOWN it will + // toggle popup and on wxEVT_LEFT_DCLICK it will do the same or run the popup's dclick method, + // if defined - you should pass events of other types of it for common processing). + void HandleNormalMouseEvent( wxMouseEvent& event ); + + // Creates popup window, calls interface->Create(), etc + void CreatePopup(); + + // Destroy popup window and all related constructs + void DestroyPopup(); + + // override the base class virtuals involved in geometry calculations + // The common version only sets a default width, so the derived classes + // should override it and set the height and change the width as needed. + virtual wxSize DoGetBestSize() const; + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; + + // NULL popup can be used to indicate default in a derived class + virtual void DoSetPopupControl(wxComboPopup* popup); + + // ensures there is atleast the default popup + void EnsurePopupControl(); + + // Recalculates button and textctrl areas. Called when size or button setup change. + // btnWidth: default/calculated width of the dropbutton. 0 means unchanged, + // just recalculate. + void CalculateAreas( int btnWidth = 0 ); + + // Standard textctrl positioning routine. Just give it platform-dependent + // textctrl coordinate adjustment. + virtual void PositionTextCtrl( int textCtrlXAdjust = 0, + int textCtrlYAdjust = 0); + + // event handlers + void OnSizeEvent( wxSizeEvent& event ); + void OnFocusEvent(wxFocusEvent& event); + void OnIdleEvent(wxIdleEvent& event); + void OnTextCtrlEvent(wxCommandEvent& event); + void OnSysColourChanged(wxSysColourChangedEvent& event); + void OnKeyEvent(wxKeyEvent& event); + void OnCharEvent(wxKeyEvent& event); + + // Set customization flags (directs how wxComboCtrlBase helpers behave) + void Customize( wxUint32 flags ) { m_iFlags |= flags; } + + // Dispatches size event and refreshes + void RecalcAndRefresh(); + + // Flags for DoShowPopup and AnimateShow + enum + { + ShowBelow = 0x0000, // Showing popup below the control + ShowAbove = 0x0001, // Showing popup above the control + CanDeferShow = 0x0002 // Can only return true from AnimateShow if this is set + }; + + // Shows and positions the popup. + virtual void DoShowPopup( const wxRect& rect, int flags ); + + // Implement in derived class to create a drop-down animation. + // Return true if finished immediately. Otherwise popup is only + // shown when the derived class call DoShowPopup. + // Flags are same as for DoShowPopup. + virtual bool AnimateShow( const wxRect& rect, int flags ); + +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip( wxToolTip *tip ); +#endif + + // protected wxTextEntry methods + virtual void DoSetValue(const wxString& value, int flags); + virtual wxString DoGetValue() const; + virtual wxWindow *GetEditableWindow() { return this; } + + // margins functions + virtual bool DoSetMargins(const wxPoint& pt); + virtual wxPoint DoGetMargins() const; + + // This is used when m_text is hidden (readonly). + wxString m_valueString; + + // This is used when control is unfocused and m_valueString is empty + wxString m_hintText; + + // the text control and button we show all the time + wxTextCtrl* m_text; + wxWindow* m_btn; + + // wxPopupWindow or similar containing the window managed by the interface. + wxWindow* m_winPopup; + + // the popup control/panel + wxWindow* m_popup; + + // popup interface + wxComboPopup* m_popupInterface; + + // this is input etc. handler for the text control + wxEvtHandler* m_textEvtHandler; + + // this is for the top level window + wxEvtHandler* m_toplevEvtHandler; + + // this is for the control in popup + wxEvtHandler* m_popupEvtHandler; + + // this is for the popup window + wxEvtHandler* m_popupWinEvtHandler; + + // main (ie. topmost) window of a composite control (default = this) + wxWindow* m_mainCtrlWnd; + + // used to prevent immediate re-popupping in case closed popup + // by clicking on the combo control (needed because of inconsistent + // transient implementation across platforms). + wxLongLong m_timeCanAcceptClick; + + // how much popup should expand to the left/right of the control + wxCoord m_extLeft; + wxCoord m_extRight; + + // minimum popup width + wxCoord m_widthMinPopup; + + // preferred popup height + wxCoord m_heightPopup; + + // how much of writable combo is custom-paint by callback? + // also used to indicate area that is not covered by "blue" + // selection indicator. + wxCoord m_widthCustomPaint; + + // left margin, in pixels + wxCoord m_marginLeft; + + // side on which the popup is aligned + int m_anchorSide; + + // Width of the "fake" border + wxCoord m_widthCustomBorder; + + // The button and textctrl click/paint areas + wxRect m_tcArea; + wxRect m_btnArea; + + // Colour of the text area, in case m_text is NULL + wxColour m_tcBgCol; + + // current button state (uses renderer flags) + int m_btnState; + + // button position + int m_btnWid; + int m_btnHei; + int m_btnSide; + int m_btnSpacingX; + + // last default button width + int m_btnWidDefault; + + // custom dropbutton bitmaps + wxBitmap m_bmpNormal; + wxBitmap m_bmpPressed; + wxBitmap m_bmpHover; + wxBitmap m_bmpDisabled; + + // area used by the button + wxSize m_btnSize; + + // platform-dependent customization and other flags + wxUint32 m_iFlags; + + // custom style for m_text + int m_textCtrlStyle; + + // draw blank button background under bitmap? + bool m_blankButtonBg; + + // is the popup window currenty shown? + wxByte m_popupWinState; + + // should the focus be reset to the textctrl in idle time? + bool m_resetFocus; + + // is the text-area background colour overridden? + bool m_hasTcBgCol; + +private: + void Init(); + + wxByte m_ignoreEvtText; // Number of next EVT_TEXTs to ignore + + // Is popup window wxPopupTransientWindow, wxPopupWindow or wxDialog? + wxByte m_popupWinType; + + DECLARE_EVENT_TABLE() + + DECLARE_ABSTRACT_CLASS(wxComboCtrlBase) +}; + + +// ---------------------------------------------------------------------------- +// wxComboPopup is the interface which must be implemented by a control to be +// used as a popup by wxComboCtrl +// ---------------------------------------------------------------------------- + + +// wxComboPopup internal flags +enum +{ + wxCP_IFLAG_CREATED = 0x0001 // Set by wxComboCtrlBase after Create is called +}; + +class WXDLLIMPEXP_FWD_CORE wxComboCtrl; + + +class WXDLLIMPEXP_CORE wxComboPopup +{ + friend class wxComboCtrlBase; +public: + wxComboPopup() + { + m_combo = NULL; + m_iFlags = 0; + } + + // This is called immediately after construction finishes. m_combo member + // variable has been initialized before the call. + // NOTE: It is not in constructor so the derived class doesn't need to redefine + // a default constructor of its own. + virtual void Init() { } + + virtual ~wxComboPopup(); + + // Create the popup child control. + // Return true for success. + virtual bool Create(wxWindow* parent) = 0; + + // Calls Destroy() for the popup control (i.e. one returned by + // GetControl()) and makes sure that 'this' is deleted at the end. + // Default implementation works for both cases where popup control + // class is multiple inherited or created on heap as a separate + // object. + virtual void DestroyPopup(); + + // We must have an associated control which is subclassed by the combobox. + virtual wxWindow *GetControl() = 0; + + // Called immediately after the popup is shown + virtual void OnPopup(); + + // Called when popup is dismissed + virtual void OnDismiss(); + + // Called just prior to displaying popup. + // Default implementation does nothing. + virtual void SetStringValue( const wxString& value ); + + // Gets displayed string representation of the value. + virtual wxString GetStringValue() const = 0; + + // Called to check if the popup - when an item container - actually + // has matching item. Case-sensitivity checking etc. is up to the + // implementation. If the found item matched the string, but is + // different, it should be written back to pItem. Default implementation + // always return true and does not alter trueItem. + virtual bool FindItem(const wxString& item, wxString* trueItem=NULL); + + // This is called to custom paint in the combo control itself (ie. not the popup). + // Default implementation draws value as string. + virtual void PaintComboControl( wxDC& dc, const wxRect& rect ); + + // Receives wxEVT_KEY_DOWN key events from the parent wxComboCtrl. + // Events not handled should be skipped, as usual. + virtual void OnComboKeyEvent( wxKeyEvent& event ); + + // Receives wxEVT_CHAR key events from the parent wxComboCtrl. + // Events not handled should be skipped, as usual. + virtual void OnComboCharEvent( wxKeyEvent& event ); + + // Implement if you need to support special action when user + // double-clicks on the parent wxComboCtrl. + virtual void OnComboDoubleClick(); + + // Return final size of popup. Called on every popup, just prior to OnShow. + // minWidth = preferred minimum width for window + // prefHeight = preferred height. Only applies if > 0, + // maxHeight = max height for window, as limited by screen size + // and should only be rounded down, if necessary. + virtual wxSize GetAdjustedSize( int minWidth, int prefHeight, int maxHeight ); + + // Return true if you want delay call to Create until the popup is shown + // for the first time. It is more efficient, but note that it is often + // more convenient to have the control created immediately. + // Default returns false. + virtual bool LazyCreate(); + + // + // Utilies + // + + // Hides the popup + void Dismiss(); + + // Returns true if Create has been called. + bool IsCreated() const + { + return (m_iFlags & wxCP_IFLAG_CREATED) ? true : false; + } + + // Returns pointer to the associated parent wxComboCtrl. + wxComboCtrl* GetComboCtrl() const; + + // Default PaintComboControl behaviour + static void DefaultPaintComboControl( wxComboCtrlBase* combo, + wxDC& dc, + const wxRect& rect ); + +protected: + wxComboCtrlBase* m_combo; + wxUint32 m_iFlags; + +private: + // Called in wxComboCtrlBase::SetPopupControl + void InitBase(wxComboCtrlBase *combo) + { + m_combo = combo; + } +}; + + +// ---------------------------------------------------------------------------- +// include the platform-dependent header defining the real class +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + // No native universal (but it must still be first in the list) +#elif defined(__WXMSW__) + #include "wx/msw/combo.h" +#endif + +// Any ports may need generic as an alternative +#include "wx/generic/combo.h" + +#endif // wxUSE_COMBOCTRL + +#endif + // _WX_COMBOCONTROL_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/combobox.h b/wxmsw/include/wx-3.0/wx/combobox.h new file mode 100644 index 00000000..93b36995 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/combobox.h @@ -0,0 +1,92 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/combobox.h +// Purpose: wxComboBox declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 24.12.00 +// Copyright: (c) 1996-2000 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COMBOBOX_H_BASE_ +#define _WX_COMBOBOX_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_COMBOBOX + +// For compatibility with 2.8 include this header to allow using wxTE_XXX +// styles with wxComboBox without explicitly including it in the user code. +#include "wx/textctrl.h" + +extern WXDLLIMPEXP_DATA_CORE(const char) wxComboBoxNameStr[]; + +// ---------------------------------------------------------------------------- +// wxComboBoxBase: this interface defines the methods wxComboBox must implement +// ---------------------------------------------------------------------------- + +#include "wx/ctrlsub.h" +#include "wx/textentry.h" + +class WXDLLIMPEXP_CORE wxComboBoxBase : public wxItemContainer, + public wxTextEntry +{ +public: + // override these methods to disambiguate between two base classes versions + virtual void Clear() + { + wxTextEntry::Clear(); + wxItemContainer::Clear(); + } + + // IsEmpty() is ambiguous because we inherit it from both wxItemContainer + // and wxTextEntry, and even if defined it here to help the compiler with + // choosing one of them, it would still be confusing for the human users of + // this class. So instead define the clearly named methods below and leave + // IsEmpty() ambiguous to trigger a compilation error if it's used. + bool IsListEmpty() const { return wxItemContainer::IsEmpty(); } + bool IsTextEmpty() const { return wxTextEntry::IsEmpty(); } + + // also bring in GetSelection() versions of both base classes in scope + // + // NB: GetSelection(from, to) could be already implemented in wxTextEntry + // but still make it pure virtual because for some platforms it's not + // implemented there and also because the derived class has to override + // it anyhow to avoid ambiguity with the other GetSelection() + virtual int GetSelection() const = 0; + virtual void GetSelection(long *from, long *to) const = 0; + + virtual void Popup() { wxFAIL_MSG( wxT("Not implemented") ); } + virtual void Dismiss() { wxFAIL_MSG( wxT("Not implemented") ); } + + // may return value different from GetSelection() when the combobox + // dropdown is shown and the user selected, but not yet accepted, a value + // different from the old one in it + virtual int GetCurrentSelection() const { return GetSelection(); } +}; + +// ---------------------------------------------------------------------------- +// include the platform-dependent header defining the real class +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/combobox.h" +#elif defined(__WXMSW__) + #include "wx/msw/combobox.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/combobox.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/combobox.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/combobox.h" +#elif defined(__WXMAC__) + #include "wx/osx/combobox.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/combobox.h" +#elif defined(__WXPM__) + #include "wx/os2/combobox.h" +#endif + +#endif // wxUSE_COMBOBOX + +#endif // _WX_COMBOBOX_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/commandlinkbutton.h b/wxmsw/include/wx-3.0/wx/commandlinkbutton.h new file mode 100644 index 00000000..0aaa0ec6 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/commandlinkbutton.h @@ -0,0 +1,169 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/commandlinkbutton.h +// Purpose: wxCommandLinkButtonBase and wxGenericCommandLinkButton classes +// Author: Rickard Westerlund +// Created: 2010-06-11 +// Copyright: (c) 2010 wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COMMANDLINKBUTTON_H_ +#define _WX_COMMANDLINKBUTTON_H_ + +#include "wx/defs.h" + +#if wxUSE_COMMANDLINKBUTTON + +#include "wx/button.h" + +// ---------------------------------------------------------------------------- +// Command link button common base class +// ---------------------------------------------------------------------------- + +// This class has separate "main label" (title-like string) and (possibly +// multiline) "note" which can be set and queried separately but can also be +// set both at once by joining them with a new line and setting them as a +// label and queried by breaking the label into the parts before the first new +// line and after it. + +class WXDLLIMPEXP_ADV wxCommandLinkButtonBase : public wxButton +{ +public: + wxCommandLinkButtonBase() : wxButton() { } + + wxCommandLinkButtonBase(wxWindow *parent, + wxWindowID id, + const wxString& mainLabel = wxEmptyString, + const wxString& note = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = + wxDefaultValidator, + const wxString& name = wxButtonNameStr) + : wxButton(parent, + id, + mainLabel + '\n' + note, + pos, + size, + style, + validator, + name) + { } + + virtual void SetMainLabelAndNote(const wxString& mainLabel, + const wxString& note) = 0; + + virtual void SetMainLabel(const wxString& mainLabel) + { + SetMainLabelAndNote(mainLabel, GetNote()); + } + + virtual void SetNote(const wxString& note) + { + SetMainLabelAndNote(GetMainLabel(), note); + } + + virtual wxString GetMainLabel() const + { + return GetLabel().BeforeFirst('\n'); + } + + virtual wxString GetNote() const + { + return GetLabel().AfterFirst('\n'); + } + +protected: + virtual bool HasNativeBitmap() const { return false; } + +private: + wxDECLARE_NO_COPY_CLASS(wxCommandLinkButtonBase); +}; + +// ---------------------------------------------------------------------------- +// Generic command link button +// ---------------------------------------------------------------------------- + +// Trivial generic implementation simply using a multiline label to show both +// the main label and the note. + +class WXDLLIMPEXP_ADV wxGenericCommandLinkButton + : public wxCommandLinkButtonBase +{ +public: + wxGenericCommandLinkButton() : wxCommandLinkButtonBase() { } + + + wxGenericCommandLinkButton(wxWindow *parent, + wxWindowID id, + const wxString& mainLabel = wxEmptyString, + const wxString& note = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr) + : wxCommandLinkButtonBase() + { + Create(parent, id, mainLabel, note, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& mainLabel = wxEmptyString, + const wxString& note = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr); + + virtual void SetMainLabelAndNote(const wxString& mainLabel, + const wxString& note) + { + wxButton::SetLabel(mainLabel + '\n' + note); + } + +private: + void SetDefaultBitmap(); + + wxDECLARE_NO_COPY_CLASS(wxGenericCommandLinkButton); +}; + +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + #include "wx/msw/commandlinkbutton.h" +#else + class WXDLLIMPEXP_ADV wxCommandLinkButton : public wxGenericCommandLinkButton + { + public: + wxCommandLinkButton() : wxGenericCommandLinkButton() { } + + wxCommandLinkButton(wxWindow *parent, + wxWindowID id, + const wxString& mainLabel = wxEmptyString, + const wxString& note = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr) + : wxGenericCommandLinkButton(parent, + id, + mainLabel, + note, + pos, + size, + style, + validator, + name) + { } + + private: + wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxCommandLinkButton); + }; +#endif // __WXMSW__/!__WXMSW__ + +#endif // wxUSE_COMMANDLINKBUTTON + +#endif // _WX_COMMANDLINKBUTTON_H_ diff --git a/wxmsw/include/wx-3.0/wx/compiler.h b/wxmsw/include/wx-3.0/wx/compiler.h new file mode 100644 index 00000000..34a4718c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/compiler.h @@ -0,0 +1,173 @@ +/* + * Name: wx/compiler.h + * Purpose: Compiler-specific macro definitions. + * Author: Vadim Zeitlin + * Created: 2013-07-13 (extracted from wx/platform.h) + * Copyright: (c) 1997-2013 Vadim Zeitlin + * Licence: wxWindows licence + */ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_COMPILER_H_ +#define _WX_COMPILER_H_ + +/* + Compiler detection and related helpers. + */ + +/* + Notice that Intel compiler can be used as Microsoft Visual C++ add-on and + so we should define both __INTELC__ and __VISUALC__ for it. +*/ +#ifdef __INTEL_COMPILER +# define __INTELC__ +#endif + +#if defined(_MSC_VER) + /* + define another standard symbol for Microsoft Visual C++: the standard + one (_MSC_VER) is also defined by some other compilers. + */ +# define __VISUALC__ _MSC_VER + + /* + define special symbols for different VC version instead of writing tests + for magic numbers such as 1200, 1300 &c repeatedly + */ +#if __VISUALC__ < 1100 +# error "This Visual C++ version is too old and not supported any longer." +#elif __VISUALC__ < 1200 +# define __VISUALC5__ +#elif __VISUALC__ < 1300 +# define __VISUALC6__ +#elif __VISUALC__ < 1400 +# define __VISUALC7__ +#elif __VISUALC__ < 1500 +# define __VISUALC8__ +#elif __VISUALC__ < 1600 +# define __VISUALC9__ +#elif __VISUALC__ < 1700 +# define __VISUALC10__ +#elif __VISUALC__ < 1800 +# define __VISUALC11__ +#elif __VISUALC__ < 1900 +# define __VISUALC12__ +#else +# pragma message("Please update wx/compiler.h to recognize this VC++ version") +#endif + +#elif defined(__BCPLUSPLUS__) && !defined(__BORLANDC__) +# define __BORLANDC__ +#elif defined(__WATCOMC__) +#elif defined(__SC__) +# define __SYMANTECC__ +#elif defined(__SUNPRO_CC) +# ifndef __SUNCC__ +# define __SUNCC__ __SUNPRO_CC +# endif /* Sun CC */ +#elif defined(__SC__) +# ifdef __DMC__ +# define __DIGITALMARS__ +# else +# define __SYMANTEC__ +# endif +#endif /* compiler */ + +/* + Macros for checking compiler version. +*/ + +/* + This macro can be used to test the gcc version and can be used like this: + +# if wxCHECK_GCC_VERSION(3, 1) + ... we have gcc 3.1 or later ... +# else + ... no gcc at all or gcc < 3.1 ... +# endif +*/ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) + #define wxCHECK_GCC_VERSION( major, minor ) \ + ( ( __GNUC__ > (major) ) \ + || ( __GNUC__ == (major) && __GNUC_MINOR__ >= (minor) ) ) +#else + #define wxCHECK_GCC_VERSION( major, minor ) 0 +#endif + +/* + This macro can be used to test the Visual C++ version. +*/ +#ifndef __VISUALC__ +# define wxVISUALC_VERSION(major) 0 +# define wxCHECK_VISUALC_VERSION(major) 0 +#else +# define wxVISUALC_VERSION(major) ( (6 + major) * 100 ) +# define wxCHECK_VISUALC_VERSION(major) ( __VISUALC__ >= wxVISUALC_VERSION(major) ) +#endif + +/** + This is similar to wxCHECK_GCC_VERSION but for Sun CC compiler. + */ +#ifdef __SUNCC__ + /* + __SUNCC__ is 0xVRP where V is major version, R release and P patch level + */ + #define wxCHECK_SUNCC_VERSION(maj, min) (__SUNCC__ >= (((maj)<<8) | ((min)<<4))) +#else + #define wxCHECK_SUNCC_VERSION(maj, min) (0) +#endif + +#ifndef __WATCOMC__ +# define wxWATCOM_VERSION(major,minor) 0 +# define wxCHECK_WATCOM_VERSION(major,minor) 0 +# define wxONLY_WATCOM_EARLIER_THAN(major,minor) 0 +# define WX_WATCOM_ONLY_CODE( x ) +#else +# if __WATCOMC__ < 1200 +# error "Only Open Watcom is supported in this release" +# endif + +# define wxWATCOM_VERSION(major,minor) ( major * 100 + minor * 10 + 1100 ) +# define wxCHECK_WATCOM_VERSION(major,minor) ( __WATCOMC__ >= wxWATCOM_VERSION(major,minor) ) +# define wxONLY_WATCOM_EARLIER_THAN(major,minor) ( __WATCOMC__ < wxWATCOM_VERSION(major,minor) ) +# define WX_WATCOM_ONLY_CODE( x ) x +#endif + +/* + This macro can be used to check that the version of mingw32 compiler is + at least maj.min + */ + +/* Check for Mingw runtime version: */ +#if defined(__MINGW32_MAJOR_VERSION) && defined(__MINGW32_MINOR_VERSION) + #define wxCHECK_MINGW32_VERSION( major, minor ) \ + ( ( ( __MINGW32_MAJOR_VERSION > (major) ) \ + || ( __MINGW32_MAJOR_VERSION == (major) && __MINGW32_MINOR_VERSION >= (minor) ) ) ) + +/* + MinGW-w64 project provides compilers for both Win32 and Win64 but only + defines the same __MINGW32__ symbol for the former as MinGW32 toolchain + which is quite different (notably doesn't provide many SDK headers that + MinGW-w64 does include). So we define a separate symbol which, unlike the + predefined __MINGW64__, can be used to detect this toolchain in both 32 and + 64 bit builds. + + And define __MINGW32_TOOLCHAIN__ for consistency and also because it's + convenient as we often want to have some workarounds only for the (old) + MinGW32 but not (newer) MinGW-w64, which still predefines __MINGW32__. + */ +# ifdef __MINGW64_VERSION_MAJOR +# ifndef __MINGW64_TOOLCHAIN__ +# define __MINGW64_TOOLCHAIN__ +# endif +# else +# ifndef __MINGW32_TOOLCHAIN__ +# define __MINGW32_TOOLCHAIN__ +# endif +# endif +#else + #define wxCHECK_MINGW32_VERSION( major, minor ) (0) +#endif + +#endif // _WX_COMPILER_H_ diff --git a/wxmsw/include/wx-3.0/wx/compositewin.h b/wxmsw/include/wx-3.0/wx/compositewin.h new file mode 100644 index 00000000..a46c2577 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/compositewin.h @@ -0,0 +1,229 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/compositewin.h +// Purpose: wxCompositeWindow<> declaration +// Author: Vadim Zeitlin +// Created: 2011-01-02 +// Copyright: (c) 2011 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COMPOSITEWIN_H_ +#define _WX_COMPOSITEWIN_H_ + +#include "wx/window.h" +#include "wx/containr.h" + +class WXDLLIMPEXP_FWD_CORE wxToolTip; + +// NB: This is an experimental and, as for now, undocumented class used only by +// wxWidgets itself internally. Don't use it in your code until its API is +// officially stabilized unless you are ready to change it with the next +// wxWidgets release. + +// ---------------------------------------------------------------------------- +// wxCompositeWindow is a helper for implementing composite windows: to define +// a class using subwindows, simply inherit from it specialized with the real +// base class name and implement GetCompositeWindowParts() pure virtual method. +// ---------------------------------------------------------------------------- + +// The template parameter W must be a wxWindow-derived class. +template +class wxCompositeWindow : public W +{ +public: + typedef W BaseWindowClass; + + // Default ctor doesn't do anything. + wxCompositeWindow() + { + this->Connect + ( + wxEVT_CREATE, + wxWindowCreateEventHandler(wxCompositeWindow::OnWindowCreate) + ); + + } + +#ifndef __VISUALC6__ + // FIXME-VC6: This compiler can't compile DoSetForAllParts() template function, + // it can't determine whether the deduced type should be "T" or "const T&". And + // without this function wxCompositeWindow is pretty useless so simply disable + // this code for it, this does mean that setting colours/fonts/... for + // composite controls won't work in the library compiled with it but so far + // this only affects the generic wxDatePickerCtrl which is not used by default + // under MSW anyhow so it doesn't seem to be worth it to spend time and uglify + // the code to fix it. + + // Override all wxWindow methods which must be forwarded to the composite + // window parts. + + // Attribute setters group. + // + // NB: Unfortunately we can't factor out the call for the setter itself + // into DoSetForAllParts() because we can't call the function passed to + // it non-virtually and we need to do this to avoid infinite recursion, + // so we work around this by calling the method of this object itself + // manually in each function. + virtual bool SetForegroundColour(const wxColour& colour) + { + if ( !BaseWindowClass::SetForegroundColour(colour) ) + return false; + + SetForAllParts(&wxWindowBase::SetForegroundColour, colour); + + return true; + } + + virtual bool SetBackgroundColour(const wxColour& colour) + { + if ( !BaseWindowClass::SetBackgroundColour(colour) ) + return false; + + SetForAllParts(&wxWindowBase::SetBackgroundColour, colour); + + return true; + } + + virtual bool SetFont(const wxFont& font) + { + if ( !BaseWindowClass::SetFont(font) ) + return false; + + SetForAllParts(&wxWindowBase::SetFont, font); + + return true; + } + + virtual bool SetCursor(const wxCursor& cursor) + { + if ( !BaseWindowClass::SetCursor(cursor) ) + return false; + + SetForAllParts(&wxWindowBase::SetCursor, cursor); + + return true; + } + +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip(wxToolTip *tip) + { + BaseWindowClass::DoSetToolTip(tip); + + SetForAllParts(&wxWindowBase::CopyToolTip, tip); + } +#endif // wxUSE_TOOLTIPS + +#endif // !__VISUALC6__ + + virtual void SetFocus() + { + wxSetFocusToChild(this, NULL); + } + +private: + // Must be implemented by the derived class to return all children to which + // the public methods we override should forward to. + virtual wxWindowList GetCompositeWindowParts() const = 0; + + void OnWindowCreate(wxWindowCreateEvent& event) + { + event.Skip(); + + // Attach a few event handlers to all parts of the composite window. + // This makes the composite window behave more like a simple control + // and allows other code (such as wxDataViewCtrl's inline editing + // support) to hook into its event processing. + + wxWindow *child = event.GetWindow(); + if ( child == this ) + return; // not a child, we don't want to Connect() to ourselves + + // Always capture wxEVT_KILL_FOCUS: + child->Connect(wxEVT_KILL_FOCUS, + wxFocusEventHandler(wxCompositeWindow::OnKillFocus), + NULL, this); + + // Some events should be only handled for non-toplevel children. For + // example, we want to close the control in wxDataViewCtrl when Enter + // is pressed in the inline editor, but not when it's pressed in a + // popup dialog it opens. + wxWindow *win = child; + while ( win && win != this ) + { + if ( win->IsTopLevel() ) + return; + win = win->GetParent(); + } + + child->Connect(wxEVT_CHAR, + wxKeyEventHandler(wxCompositeWindow::OnChar), + NULL, this); + } + + void OnChar(wxKeyEvent& event) + { + if ( !this->ProcessWindowEvent(event) ) + event.Skip(); + } + + void OnKillFocus(wxFocusEvent& event) + { + // Ignore focus changes within the composite control: + wxWindow *win = event.GetWindow(); + while ( win ) + { + if ( win == this ) + { + event.Skip(); + return; + } + + // Note that we don't use IsTopLevel() check here, because we do + // want to ignore focus changes going to toplevel window that have + // the composite control as its parent; these would typically be + // some kind of control's popup window. + win = win->GetParent(); + } + + // The event shouldn't be ignored, forward it to the main control: + if ( !this->ProcessWindowEvent(event) ) + event.Skip(); + } + +#ifndef __VISUALC6__ + template + void SetForAllParts(bool (wxWindowBase::*func)(const T&), const T& arg) + { + DoSetForAllParts(func, arg); + } + + template + void SetForAllParts(bool (wxWindowBase::*func)(T*), T* arg) + { + DoSetForAllParts(func, arg); + } + + template + void DoSetForAllParts(bool (wxWindowBase::*func)(T), T arg) + { + // Simply call the setters for all parts of this composite window. + const wxWindowList parts = GetCompositeWindowParts(); + for ( wxWindowList::const_iterator i = parts.begin(); + i != parts.end(); + ++i ) + { + wxWindow * const child = *i; + + // Allow NULL elements in the list, this makes the code of derived + // composite controls which may have optionally shown children + // simpler and it doesn't cost us much here. + if ( child ) + (child->*func)(arg); + } + } +#endif // !__VISUALC6__ + + wxDECLARE_NO_COPY_TEMPLATE_CLASS(wxCompositeWindow, W); +}; + +#endif // _WX_COMPOSITEWIN_H_ diff --git a/wxmsw/include/wx-3.0/wx/confbase.h b/wxmsw/include/wx-3.0/wx/confbase.h new file mode 100644 index 00000000..9fd9df78 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/confbase.h @@ -0,0 +1,458 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/confbase.h +// Purpose: declaration of the base class of all config implementations +// (see also: fileconf.h and msw/regconf.h and iniconf.h) +// Author: Karsten Ballueder & Vadim Zeitlin +// Modified by: +// Created: 07.04.98 (adapted from appconf.h) +// Copyright: (c) 1997 Karsten Ballueder Ballueder@usa.net +// Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CONFBASE_H_ +#define _WX_CONFBASE_H_ + +#include "wx/defs.h" +#include "wx/string.h" +#include "wx/object.h" +#include "wx/base64.h" + +class WXDLLIMPEXP_FWD_BASE wxArrayString; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +/// shall we be case sensitive in parsing variable names? +#ifndef wxCONFIG_CASE_SENSITIVE + #define wxCONFIG_CASE_SENSITIVE 0 +#endif + +/// separates group and entry names (probably shouldn't be changed) +#ifndef wxCONFIG_PATH_SEPARATOR + #define wxCONFIG_PATH_SEPARATOR wxT('/') +#endif + +/// introduces immutable entries +// (i.e. the ones which can't be changed from the local config file) +#ifndef wxCONFIG_IMMUTABLE_PREFIX + #define wxCONFIG_IMMUTABLE_PREFIX wxT('!') +#endif + +#if wxUSE_CONFIG + +/// should we use registry instead of configuration files under Windows? +// (i.e. whether wxConfigBase::Create() will create a wxFileConfig (if it's +// false) or wxRegConfig (if it's true and we're under Win32)) +#ifndef wxUSE_CONFIG_NATIVE + #define wxUSE_CONFIG_NATIVE 1 +#endif + +// not all compilers can deal with template Read/Write() methods, define this +// symbol if the template functions are available +#if (!defined(__VISUALC__) || __VISUALC__ > 1200) && \ + !defined( __VMS ) && \ + !(defined(__HP_aCC) && defined(__hppa)) && \ + !defined (__DMC__) + #define wxHAS_CONFIG_TEMPLATE_RW +#endif + +// Style flags for constructor style parameter +enum +{ + wxCONFIG_USE_LOCAL_FILE = 1, + wxCONFIG_USE_GLOBAL_FILE = 2, + wxCONFIG_USE_RELATIVE_PATH = 4, + wxCONFIG_USE_NO_ESCAPE_CHARACTERS = 8, + wxCONFIG_USE_SUBDIR = 16 +}; + +// ---------------------------------------------------------------------------- +// abstract base class wxConfigBase which defines the interface for derived +// classes +// +// wxConfig organizes the items in a tree-like structure (modelled after the +// Unix/Dos filesystem). There are groups (directories) and keys (files). +// There is always one current group given by the current path. +// +// Keys are pairs "key_name = value" where value may be of string or integer +// (long) type (TODO doubles and other types such as wxDate coming soon). +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxConfigBase : public wxObject +{ +public: + // constants + // the type of an entry + enum EntryType + { + Type_Unknown, + Type_String, + Type_Boolean, + Type_Integer, // use Read(long *) + Type_Float // use Read(double *) + }; + + // static functions + // sets the config object, returns the previous pointer + static wxConfigBase *Set(wxConfigBase *pConfig); + // get the config object, creates it on demand unless DontCreateOnDemand + // was called + static wxConfigBase *Get(bool createOnDemand = true) + { if ( createOnDemand && (!ms_pConfig) ) Create(); return ms_pConfig; } + // create a new config object: this function will create the "best" + // implementation of wxConfig available for the current platform, see + // comments near definition wxUSE_CONFIG_NATIVE for details. It returns + // the created object and also sets it as ms_pConfig. + static wxConfigBase *Create(); + // should Get() try to create a new log object if the current one is NULL? + static void DontCreateOnDemand() { ms_bAutoCreate = false; } + + // ctor & virtual dtor + // ctor (can be used as default ctor too) + // + // Not all args will always be used by derived classes, but including + // them all in each class ensures compatibility. If appName is empty, + // uses wxApp name + wxConfigBase(const wxString& appName = wxEmptyString, + const wxString& vendorName = wxEmptyString, + const wxString& localFilename = wxEmptyString, + const wxString& globalFilename = wxEmptyString, + long style = 0); + + // empty but ensures that dtor of all derived classes is virtual + virtual ~wxConfigBase(); + + // path management + // set current path: if the first character is '/', it's the absolute path, + // otherwise it's a relative path. '..' is supported. If the strPath + // doesn't exist it is created. + virtual void SetPath(const wxString& strPath) = 0; + // retrieve the current path (always as absolute path) + virtual const wxString& GetPath() const = 0; + + // enumeration: all functions here return false when there are no more items. + // you must pass the same lIndex to GetNext and GetFirst (don't modify it) + // enumerate subgroups + virtual bool GetFirstGroup(wxString& str, long& lIndex) const = 0; + virtual bool GetNextGroup (wxString& str, long& lIndex) const = 0; + // enumerate entries + virtual bool GetFirstEntry(wxString& str, long& lIndex) const = 0; + virtual bool GetNextEntry (wxString& str, long& lIndex) const = 0; + // get number of entries/subgroups in the current group, with or without + // it's subgroups + virtual size_t GetNumberOfEntries(bool bRecursive = false) const = 0; + virtual size_t GetNumberOfGroups(bool bRecursive = false) const = 0; + + // tests of existence + // returns true if the group by this name exists + virtual bool HasGroup(const wxString& strName) const = 0; + // same as above, but for an entry + virtual bool HasEntry(const wxString& strName) const = 0; + // returns true if either a group or an entry with a given name exist + bool Exists(const wxString& strName) const + { return HasGroup(strName) || HasEntry(strName); } + + // get the entry type + virtual EntryType GetEntryType(const wxString& name) const + { + // by default all entries are strings + return HasEntry(name) ? Type_String : Type_Unknown; + } + + // key access: returns true if value was really read, false if default used + // (and if the key is not found the default value is returned.) + + // read a string from the key + bool Read(const wxString& key, wxString *pStr) const; + bool Read(const wxString& key, wxString *pStr, const wxString& defVal) const; + + // read a number (long) + bool Read(const wxString& key, long *pl) const; + bool Read(const wxString& key, long *pl, long defVal) const; + + // read an int (wrapper around `long' version) + bool Read(const wxString& key, int *pi) const; + bool Read(const wxString& key, int *pi, int defVal) const; + + // read a double + bool Read(const wxString& key, double* val) const; + bool Read(const wxString& key, double* val, double defVal) const; + + // read a float + bool Read(const wxString& key, float* val) const; + bool Read(const wxString& key, float* val, float defVal) const; + + // read a bool + bool Read(const wxString& key, bool* val) const; + bool Read(const wxString& key, bool* val, bool defVal) const; + +#if wxUSE_BASE64 + // read a binary data block + bool Read(const wxString& key, wxMemoryBuffer* data) const + { return DoReadBinary(key, data); } + // no default version since it does not make sense for binary data +#endif // wxUSE_BASE64 + +#ifdef wxHAS_CONFIG_TEMPLATE_RW + // read other types, for which wxFromString is defined + template + bool Read(const wxString& key, T* value) const + { + wxString s; + if ( !Read(key, &s) ) + return false; + return wxFromString(s, value); + } + + template + bool Read(const wxString& key, T* value, const T& defVal) const + { + const bool found = Read(key, value); + if ( !found ) + { + if (IsRecordingDefaults()) + ((wxConfigBase *)this)->Write(key, defVal); + *value = defVal; + } + return found; + } +#endif // wxHAS_CONFIG_TEMPLATE_RW + + // convenience functions returning directly the value + wxString Read(const wxString& key, + const wxString& defVal = wxEmptyString) const + { wxString s; (void)Read(key, &s, defVal); return s; } + + // we have to provide a separate version for C strings as otherwise the + // template Read() would be used + wxString Read(const wxString& key, const char* defVal) const + { return Read(key, wxString(defVal)); } + wxString Read(const wxString& key, const wchar_t* defVal) const + { return Read(key, wxString(defVal)); } + + long ReadLong(const wxString& key, long defVal) const + { long l; (void)Read(key, &l, defVal); return l; } + + double ReadDouble(const wxString& key, double defVal) const + { double d; (void)Read(key, &d, defVal); return d; } + + bool ReadBool(const wxString& key, bool defVal) const + { bool b; (void)Read(key, &b, defVal); return b; } + + template + T ReadObject(const wxString& key, T const& defVal) const + { T t; (void)Read(key, &t, defVal); return t; } + + // for compatibility with wx 2.8 + long Read(const wxString& key, long defVal) const + { return ReadLong(key, defVal); } + + + // write the value (return true on success) + bool Write(const wxString& key, const wxString& value) + { return DoWriteString(key, value); } + + bool Write(const wxString& key, long value) + { return DoWriteLong(key, value); } + + bool Write(const wxString& key, double value) + { return DoWriteDouble(key, value); } + + bool Write(const wxString& key, bool value) + { return DoWriteBool(key, value); } + +#if wxUSE_BASE64 + bool Write(const wxString& key, const wxMemoryBuffer& buf) + { return DoWriteBinary(key, buf); } +#endif // wxUSE_BASE64 + + // we have to provide a separate version for C strings as otherwise they + // would be converted to bool and not to wxString as expected! + bool Write(const wxString& key, const char *value) + { return Write(key, wxString(value)); } + bool Write(const wxString& key, const unsigned char *value) + { return Write(key, wxString(value)); } + bool Write(const wxString& key, const wchar_t *value) + { return Write(key, wxString(value)); } + + + // we also have to provide specializations for other types which we want to + // handle using the specialized DoWriteXXX() instead of the generic template + // version below + bool Write(const wxString& key, char value) + { return DoWriteLong(key, value); } + + bool Write(const wxString& key, unsigned char value) + { return DoWriteLong(key, value); } + + bool Write(const wxString& key, short value) + { return DoWriteLong(key, value); } + + bool Write(const wxString& key, unsigned short value) + { return DoWriteLong(key, value); } + + bool Write(const wxString& key, unsigned int value) + { return DoWriteLong(key, value); } + + bool Write(const wxString& key, int value) + { return DoWriteLong(key, value); } + + bool Write(const wxString& key, unsigned long value) + { return DoWriteLong(key, value); } + + bool Write(const wxString& key, float value) + { return DoWriteDouble(key, value); } + + // Causes ambiguities in VC++ 6 and OpenVMS (at least) +#if ( (!defined(__VISUALC__) || __VISUALC__ > 1200) && !defined( __VMS ) && !defined (__DMC__)) + // for other types, use wxToString() + template + bool Write(const wxString& key, T const& value) + { return Write(key, wxToString(value)); } +#endif + + // permanently writes all changes + virtual bool Flush(bool bCurrentOnly = false) = 0; + + // renaming, all functions return false on failure (probably because the new + // name is already taken by an existing entry) + // rename an entry + virtual bool RenameEntry(const wxString& oldName, + const wxString& newName) = 0; + // rename a group + virtual bool RenameGroup(const wxString& oldName, + const wxString& newName) = 0; + + // delete entries/groups + // deletes the specified entry and the group it belongs to if + // it was the last key in it and the second parameter is true + virtual bool DeleteEntry(const wxString& key, + bool bDeleteGroupIfEmpty = true) = 0; + // delete the group (with all subgroups) + virtual bool DeleteGroup(const wxString& key) = 0; + // delete the whole underlying object (disk file, registry key, ...) + // primarily for use by uninstallation routine. + virtual bool DeleteAll() = 0; + + // options + // we can automatically expand environment variables in the config entries + // (this option is on by default, you can turn it on/off at any time) + bool IsExpandingEnvVars() const { return m_bExpandEnvVars; } + void SetExpandEnvVars(bool bDoIt = true) { m_bExpandEnvVars = bDoIt; } + // recording of default values + void SetRecordDefaults(bool bDoIt = true) { m_bRecordDefaults = bDoIt; } + bool IsRecordingDefaults() const { return m_bRecordDefaults; } + // does expansion only if needed + wxString ExpandEnvVars(const wxString& str) const; + + // misc accessors + wxString GetAppName() const { return m_appName; } + wxString GetVendorName() const { return m_vendorName; } + + // Used wxIniConfig to set members in constructor + void SetAppName(const wxString& appName) { m_appName = appName; } + void SetVendorName(const wxString& vendorName) { m_vendorName = vendorName; } + + void SetStyle(long style) { m_style = style; } + long GetStyle() const { return m_style; } + +protected: + static bool IsImmutable(const wxString& key) + { return !key.IsEmpty() && key[0] == wxCONFIG_IMMUTABLE_PREFIX; } + + // return the path without trailing separator, if any: this should be called + // to sanitize paths referring to the group names before passing them to + // wxConfigPathChanger as "/foo/bar/" should be the same as "/foo/bar" and it + // isn't interpreted in the same way by it (and this can't be changed there + // as it's not the same for the entries names) + static wxString RemoveTrailingSeparator(const wxString& key); + + // do read/write the values of different types + virtual bool DoReadString(const wxString& key, wxString *pStr) const = 0; + virtual bool DoReadLong(const wxString& key, long *pl) const = 0; + virtual bool DoReadDouble(const wxString& key, double* val) const; + virtual bool DoReadBool(const wxString& key, bool* val) const; +#if wxUSE_BASE64 + virtual bool DoReadBinary(const wxString& key, wxMemoryBuffer* buf) const = 0; +#endif // wxUSE_BASE64 + + virtual bool DoWriteString(const wxString& key, const wxString& value) = 0; + virtual bool DoWriteLong(const wxString& key, long value) = 0; + virtual bool DoWriteDouble(const wxString& key, double value); + virtual bool DoWriteBool(const wxString& key, bool value); +#if wxUSE_BASE64 + virtual bool DoWriteBinary(const wxString& key, const wxMemoryBuffer& buf) = 0; +#endif // wxUSE_BASE64 + +private: + // are we doing automatic environment variable expansion? + bool m_bExpandEnvVars; + // do we record default values? + bool m_bRecordDefaults; + + // static variables + static wxConfigBase *ms_pConfig; + static bool ms_bAutoCreate; + + // Application name and organisation name + wxString m_appName; + wxString m_vendorName; + + // Style flag + long m_style; + + DECLARE_ABSTRACT_CLASS(wxConfigBase) +}; + +// a handy little class which changes current path to the path of given entry +// and restores it in dtor: so if you declare a local variable of this type, +// you work in the entry directory and the path is automatically restored +// when the function returns +// Taken out of wxConfig since not all compilers can cope with nested classes. +class WXDLLIMPEXP_BASE wxConfigPathChanger +{ +public: + // ctor/dtor do path changing/restoring of the path + wxConfigPathChanger(const wxConfigBase *pContainer, const wxString& strEntry); + ~wxConfigPathChanger(); + + // get the key name + const wxString& Name() const { return m_strName; } + + // this method must be called if the original path (i.e. the current path at + // the moment of creation of this object) could have been deleted to prevent + // us from restoring the not existing (any more) path + // + // if the original path doesn't exist any more, the path will be restored to + // the deepest still existing component of the old path + void UpdateIfDeleted(); + +private: + wxConfigBase *m_pContainer; // object we live in + wxString m_strName, // name of entry (i.e. name only) + m_strOldPath; // saved path + bool m_bChanged; // was the path changed? + + wxDECLARE_NO_COPY_CLASS(wxConfigPathChanger); +}; + + +#endif // wxUSE_CONFIG + +/* + Replace environment variables ($SOMETHING) with their values. The format is + $VARNAME or ${VARNAME} where VARNAME contains alphanumeric characters and + '_' only. '$' must be escaped ('\$') in order to be taken literally. +*/ + +WXDLLIMPEXP_BASE wxString wxExpandEnvVars(const wxString &sz); + +/* + Split path into parts removing '..' in progress + */ +WXDLLIMPEXP_BASE void wxSplitPath(wxArrayString& aParts, const wxString& path); + +#endif // _WX_CONFBASE_H_ + diff --git a/wxmsw/include/wx-3.0/wx/config.h b/wxmsw/include/wx-3.0/wx/config.h new file mode 100644 index 00000000..4df4b8dd --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/config.h @@ -0,0 +1,37 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/config.h +// Purpose: wxConfig base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CONFIG_H_BASE_ +#define _WX_CONFIG_H_BASE_ + +#include "wx/confbase.h" + +#if wxUSE_CONFIG + +// ---------------------------------------------------------------------------- +// define the native wxConfigBase implementation +// ---------------------------------------------------------------------------- + +// under Windows we prefer to use the native implementation but can be forced +// to use the file-based one +#if defined(__WINDOWS__) && wxUSE_CONFIG_NATIVE + #include "wx/msw/regconf.h" + #define wxConfig wxRegConfig +#elif defined(__WXOS2__) && wxUSE_CONFIG_NATIVE + #include "wx/os2/iniconf.h" + #define wxConfig wxIniConfig +#else // either we're under Unix or wish to always use config files + #include "wx/fileconf.h" + #define wxConfig wxFileConfig +#endif + +#endif // wxUSE_CONFIG + +#endif // _WX_CONFIG_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/containr.h b/wxmsw/include/wx-3.0/wx/containr.h new file mode 100644 index 00000000..277909e5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/containr.h @@ -0,0 +1,414 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/containr.h +// Purpose: wxControlContainer and wxNavigationEnabled declarations +// Author: Vadim Zeitlin +// Modified by: +// Created: 06.08.01 +// Copyright: (c) 2001, 2011 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CONTAINR_H_ +#define _WX_CONTAINR_H_ + +#include "wx/defs.h" + +#ifndef wxHAS_NATIVE_TAB_TRAVERSAL + // We need wxEVT_XXX declarations in this case. + #include "wx/event.h" +#endif + +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxWindowBase; + +/* + This header declares wxControlContainer class however it's not a real + container of controls but rather just a helper used to implement TAB + navigation among the window children. You should rarely need to use it + directly, derive from the documented public wxNavigationEnabled<> class to + implement TAB navigation in a custom composite window. + */ + +// ---------------------------------------------------------------------------- +// wxControlContainerBase: common part used in both native and generic cases +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxControlContainerBase +{ +public: + // default ctor, SetContainerWindow() must be called later + wxControlContainerBase() + { + m_winParent = NULL; + + // By default, we accept focus ourselves. + m_acceptsFocusSelf = true; + + // But we don't have any children accepting it yet. + m_acceptsFocusChildren = false; + + m_inSetFocus = false; + m_winLastFocused = NULL; + } + virtual ~wxControlContainerBase() {} + + void SetContainerWindow(wxWindow *winParent) + { + wxASSERT_MSG( !m_winParent, wxT("shouldn't be called twice") ); + + m_winParent = winParent; + } + + // This can be called by the window to indicate that it never wants to have + // the focus for itself. + void DisableSelfFocus() + { m_acceptsFocusSelf = false; UpdateParentCanFocus(); } + + // This can be called to undo the effect of a previous DisableSelfFocus() + // (otherwise calling it is not necessary as the window does accept focus + // by default). + void EnableSelfFocus() + { m_acceptsFocusSelf = true; UpdateParentCanFocus(); } + + // should be called from SetFocus(), returns false if we did nothing with + // the focus and the default processing should take place + bool DoSetFocus(); + + // returns whether we should accept focus ourselves or not + bool AcceptsFocus() const; + + // Returns whether we or one of our children accepts focus. + bool AcceptsFocusRecursively() const + { return AcceptsFocus() || + (m_acceptsFocusChildren && HasAnyChildrenAcceptingFocus()); } + + // We accept focus from keyboard if we accept it at all. + bool AcceptsFocusFromKeyboard() const { return AcceptsFocusRecursively(); } + + // Call this when the number of children of the window changes. + // + // Returns true if we have any focusable children, false otherwise. + bool UpdateCanFocusChildren(); + +protected: + // set the focus to the child which had it the last time + virtual bool SetFocusToChild(); + + // return true if we have any children accepting focus + bool HasAnyFocusableChildren() const; + + // return true if we have any children that do accept focus right now + bool HasAnyChildrenAcceptingFocus() const; + + + // the parent window we manage the children for + wxWindow *m_winParent; + + // the child which had the focus last time this panel was activated + wxWindow *m_winLastFocused; + +private: + // Update the window status to reflect whether it is getting focus or not. + void UpdateParentCanFocus(); + + // Indicates whether the associated window can ever have focus itself. + // + // Usually this is the case, e.g. a wxPanel can be used either as a + // container for its children or just as a normal window which can be + // focused. But sometimes, e.g. for wxStaticBox, we can never have focus + // ourselves and can only get it if we have any focusable children. + bool m_acceptsFocusSelf; + + // Cached value remembering whether we have any children accepting focus. + bool m_acceptsFocusChildren; + + // a guard against infinite recursion + bool m_inSetFocus; +}; + +#ifdef wxHAS_NATIVE_TAB_TRAVERSAL + +// ---------------------------------------------------------------------------- +// wxControlContainer for native TAB navigation +// ---------------------------------------------------------------------------- + +// this must be a real class as we forward-declare it elsewhere +class WXDLLIMPEXP_CORE wxControlContainer : public wxControlContainerBase +{ +protected: + // set the focus to the child which had it the last time + virtual bool SetFocusToChild(); +}; + +#else // !wxHAS_NATIVE_TAB_TRAVERSAL + +// ---------------------------------------------------------------------------- +// wxControlContainer for TAB navigation implemented in wx itself +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxControlContainer : public wxControlContainerBase +{ +public: + // default ctor, SetContainerWindow() must be called later + wxControlContainer(); + + // the methods to be called from the window event handlers + void HandleOnNavigationKey(wxNavigationKeyEvent& event); + void HandleOnFocus(wxFocusEvent& event); + void HandleOnWindowDestroy(wxWindowBase *child); + + // called from OnChildFocus() handler, i.e. when one of our (grand) + // children gets the focus + void SetLastFocus(wxWindow *win); + +protected: + + wxDECLARE_NO_COPY_CLASS(wxControlContainer); +}; + +#endif // wxHAS_NATIVE_TAB_TRAVERSAL/!wxHAS_NATIVE_TAB_TRAVERSAL + +// this function is for wxWidgets internal use only +extern WXDLLIMPEXP_CORE bool wxSetFocusToChild(wxWindow *win, wxWindow **child); + +// ---------------------------------------------------------------------------- +// wxNavigationEnabled: Derive from this class to support keyboard navigation +// among window children in a wxWindow-derived class. The details of this class +// don't matter, you just need to derive from it to make navigation work. +// ---------------------------------------------------------------------------- + +// The template parameter W must be a wxWindow-derived class. +template +class wxNavigationEnabled : public W +{ +public: + typedef W BaseWindowClass; + + wxNavigationEnabled() + { + m_container.SetContainerWindow(this); + +#ifndef wxHAS_NATIVE_TAB_TRAVERSAL + BaseWindowClass::Connect(wxEVT_NAVIGATION_KEY, + wxNavigationKeyEventHandler(wxNavigationEnabled::OnNavigationKey)); + + BaseWindowClass::Connect(wxEVT_SET_FOCUS, + wxFocusEventHandler(wxNavigationEnabled::OnFocus)); + + BaseWindowClass::Connect(wxEVT_CHILD_FOCUS, + wxChildFocusEventHandler(wxNavigationEnabled::OnChildFocus)); +#endif // !wxHAS_NATIVE_TAB_TRAVERSAL + } + + WXDLLIMPEXP_INLINE_CORE virtual bool AcceptsFocus() const + { + return m_container.AcceptsFocus(); + } + + WXDLLIMPEXP_INLINE_CORE virtual bool AcceptsFocusRecursively() const + { + return m_container.AcceptsFocusRecursively(); + } + + WXDLLIMPEXP_INLINE_CORE virtual bool AcceptsFocusFromKeyboard() const + { + return m_container.AcceptsFocusFromKeyboard(); + } + + WXDLLIMPEXP_INLINE_CORE virtual void AddChild(wxWindowBase *child) + { + BaseWindowClass::AddChild(child); + + if ( m_container.UpdateCanFocusChildren() ) + { + // Under MSW we must have wxTAB_TRAVERSAL style for TAB navigation + // to work. + if ( !BaseWindowClass::HasFlag(wxTAB_TRAVERSAL) ) + BaseWindowClass::ToggleWindowStyle(wxTAB_TRAVERSAL); + } + } + + WXDLLIMPEXP_INLINE_CORE virtual void RemoveChild(wxWindowBase *child) + { +#ifndef wxHAS_NATIVE_TAB_TRAVERSAL + m_container.HandleOnWindowDestroy(child); +#endif // !wxHAS_NATIVE_TAB_TRAVERSAL + + BaseWindowClass::RemoveChild(child); + + // We could reset wxTAB_TRAVERSAL here but it doesn't seem to do any + // harm to keep it. + m_container.UpdateCanFocusChildren(); + } + + WXDLLIMPEXP_INLINE_CORE virtual void SetFocus() + { + if ( !m_container.DoSetFocus() ) + BaseWindowClass::SetFocus(); + } + + void SetFocusIgnoringChildren() + { + BaseWindowClass::SetFocus(); + } + +protected: +#ifndef wxHAS_NATIVE_TAB_TRAVERSAL + void OnNavigationKey(wxNavigationKeyEvent& event) + { + m_container.HandleOnNavigationKey(event); + } + + void OnFocus(wxFocusEvent& event) + { + m_container.HandleOnFocus(event); + } + + void OnChildFocus(wxChildFocusEvent& event) + { + m_container.SetLastFocus(event.GetWindow()); + event.Skip(); + } +#endif // !wxHAS_NATIVE_TAB_TRAVERSAL + + wxControlContainer m_container; + + + wxDECLARE_NO_COPY_TEMPLATE_CLASS(wxNavigationEnabled, W); +}; + +// ---------------------------------------------------------------------------- +// Compatibility macros from now on, do NOT use them and preferably do not even +// look at them. +// ---------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_8 + +// common part of WX_DECLARE_CONTROL_CONTAINER in the native and generic cases, +// it should be used in the wxWindow-derived class declaration +#define WX_DECLARE_CONTROL_CONTAINER_BASE() \ +public: \ + virtual bool AcceptsFocus() const; \ + virtual bool AcceptsFocusRecursively() const; \ + virtual bool AcceptsFocusFromKeyboard() const; \ + virtual void AddChild(wxWindowBase *child); \ + virtual void RemoveChild(wxWindowBase *child); \ + virtual void SetFocus(); \ + void SetFocusIgnoringChildren(); \ + \ +protected: \ + wxControlContainer m_container + +// this macro must be used in the derived class ctor +#define WX_INIT_CONTROL_CONTAINER() \ + m_container.SetContainerWindow(this) + +// common part of WX_DELEGATE_TO_CONTROL_CONTAINER in the native and generic +// cases, must be used in the wxWindow-derived class implementation +#define WX_DELEGATE_TO_CONTROL_CONTAINER_BASE(classname, basename) \ + void classname::AddChild(wxWindowBase *child) \ + { \ + basename::AddChild(child); \ + \ + m_container.UpdateCanFocusChildren(); \ + } \ + \ + bool classname::AcceptsFocusRecursively() const \ + { \ + return m_container.AcceptsFocusRecursively(); \ + } \ + \ + void classname::SetFocus() \ + { \ + if ( !m_container.DoSetFocus() ) \ + basename::SetFocus(); \ + } \ + \ + bool classname::AcceptsFocus() const \ + { \ + return m_container.AcceptsFocus(); \ + } \ + \ + bool classname::AcceptsFocusFromKeyboard() const \ + { \ + return m_container.AcceptsFocusFromKeyboard(); \ + } + + +#ifdef wxHAS_NATIVE_TAB_TRAVERSAL + +#define WX_EVENT_TABLE_CONTROL_CONTAINER(classname) + +#define WX_DECLARE_CONTROL_CONTAINER WX_DECLARE_CONTROL_CONTAINER_BASE + +#define WX_DELEGATE_TO_CONTROL_CONTAINER(classname, basename) \ + WX_DELEGATE_TO_CONTROL_CONTAINER_BASE(classname, basename) \ + \ + void classname::RemoveChild(wxWindowBase *child) \ + { \ + basename::RemoveChild(child); \ + \ + m_container.UpdateCanFocusChildren(); \ + } \ + \ + void classname::SetFocusIgnoringChildren() \ + { \ + basename::SetFocus(); \ + } + +#else // !wxHAS_NATIVE_TAB_TRAVERSAL + +// declare the methods to be forwarded +#define WX_DECLARE_CONTROL_CONTAINER() \ + WX_DECLARE_CONTROL_CONTAINER_BASE(); \ + \ +public: \ + void OnNavigationKey(wxNavigationKeyEvent& event); \ + void OnFocus(wxFocusEvent& event); \ + virtual void OnChildFocus(wxChildFocusEvent& event) + +// implement the event table entries for wxControlContainer +#define WX_EVENT_TABLE_CONTROL_CONTAINER(classname) \ + EVT_SET_FOCUS(classname::OnFocus) \ + EVT_CHILD_FOCUS(classname::OnChildFocus) \ + EVT_NAVIGATION_KEY(classname::OnNavigationKey) + +// implement the methods forwarding to the wxControlContainer +#define WX_DELEGATE_TO_CONTROL_CONTAINER(classname, basename) \ + WX_DELEGATE_TO_CONTROL_CONTAINER_BASE(classname, basename) \ + \ + void classname::RemoveChild(wxWindowBase *child) \ + { \ + m_container.HandleOnWindowDestroy(child); \ + \ + basename::RemoveChild(child); \ + \ + m_container.UpdateCanFocusChildren(); \ + } \ + \ + void classname::OnNavigationKey( wxNavigationKeyEvent& event ) \ + { \ + m_container.HandleOnNavigationKey(event); \ + } \ + \ + void classname::SetFocusIgnoringChildren() \ + { \ + basename::SetFocus(); \ + } \ + \ + void classname::OnChildFocus(wxChildFocusEvent& event) \ + { \ + m_container.SetLastFocus(event.GetWindow()); \ + event.Skip(); \ + } \ + \ + void classname::OnFocus(wxFocusEvent& event) \ + { \ + m_container.HandleOnFocus(event); \ + } + +#endif // wxHAS_NATIVE_TAB_TRAVERSAL/!wxHAS_NATIVE_TAB_TRAVERSAL + +#endif // WXWIN_COMPATIBILITY_2_8 + +#endif // _WX_CONTAINR_H_ diff --git a/wxmsw/include/wx-3.0/wx/control.h b/wxmsw/include/wx-3.0/wx/control.h new file mode 100644 index 00000000..cd7bc9e2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/control.h @@ -0,0 +1,248 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/control.h +// Purpose: wxControl common interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 26.07.99 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CONTROL_H_BASE_ +#define _WX_CONTROL_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_CONTROLS + +#include "wx/window.h" // base class + +extern WXDLLIMPEXP_DATA_CORE(const char) wxControlNameStr[]; + + +// ---------------------------------------------------------------------------- +// Ellipsize() constants +// ---------------------------------------------------------------------------- + +enum wxEllipsizeFlags +{ + wxELLIPSIZE_FLAGS_NONE = 0, + wxELLIPSIZE_FLAGS_PROCESS_MNEMONICS = 1, + wxELLIPSIZE_FLAGS_EXPAND_TABS = 2, + + wxELLIPSIZE_FLAGS_DEFAULT = wxELLIPSIZE_FLAGS_PROCESS_MNEMONICS | + wxELLIPSIZE_FLAGS_EXPAND_TABS +}; + +// NB: Don't change the order of these values, they're the same as in +// PangoEllipsizeMode enum. +enum wxEllipsizeMode +{ + wxELLIPSIZE_NONE, + wxELLIPSIZE_START, + wxELLIPSIZE_MIDDLE, + wxELLIPSIZE_END +}; + +// ---------------------------------------------------------------------------- +// wxControl is the base class for all controls +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxControlBase : public wxWindow +{ +public: + wxControlBase() { } + + virtual ~wxControlBase(); + + // Create() function adds the validator parameter + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxControlNameStr); + + // get the control alignment (left/right/centre, top/bottom/centre) + int GetAlignment() const { return m_windowStyle & wxALIGN_MASK; } + + // set label with mnemonics + virtual void SetLabel(const wxString& label) + { + m_labelOrig = label; + + InvalidateBestSize(); + + wxWindow::SetLabel(label); + } + + // return the original string, as it was passed to SetLabel() + // (i.e. with wx-style mnemonics) + virtual wxString GetLabel() const { return m_labelOrig; } + + // set label text (mnemonics will be escaped) + virtual void SetLabelText(const wxString& text) + { + SetLabel(EscapeMnemonics(text)); + } + + // get just the text of the label, without mnemonic characters ('&') + virtual wxString GetLabelText() const { return GetLabelText(GetLabel()); } + + +#if wxUSE_MARKUP + // Set the label with markup (and mnemonics). Markup is a simple subset of + // HTML with tags such as , and . By default it is not + // supported i.e. all the markup is simply stripped and SetLabel() is + // called but some controls in some ports do support this already and in + // the future most of them should. + // + // Notice that, being HTML-like, markup also supports XML entities so '<' + // should be encoded as "<" and so on, a bare '<' in the input will + // likely result in an error. As an exception, a bare '&' is allowed and + // indicates that the next character is a mnemonic. To insert a literal '&' + // in the control you need to use "&" in the input string. + // + // Returns true if the label was set, even if the markup in it was ignored. + // False is only returned if we failed to parse the label. + bool SetLabelMarkup(const wxString& markup) + { + return DoSetLabelMarkup(markup); + } +#endif // wxUSE_MARKUP + + + // controls by default inherit the colours of their parents, if a + // particular control class doesn't want to do it, it can override + // ShouldInheritColours() to return false + virtual bool ShouldInheritColours() const { return true; } + + + // WARNING: this doesn't work for all controls nor all platforms! + // + // simulates the event of given type (i.e. wxButton::Command() is just as + // if the button was clicked) + virtual void Command(wxCommandEvent &event); + + virtual bool SetFont(const wxFont& font); + + // wxControl-specific processing after processing the update event + virtual void DoUpdateWindowUI(wxUpdateUIEvent& event); + + wxSize GetSizeFromTextSize(int xlen, int ylen = -1) const + { return DoGetSizeFromTextSize(xlen, ylen); } + wxSize GetSizeFromTextSize(const wxSize& tsize) const + { return DoGetSizeFromTextSize(tsize.x, tsize.y); } + + + // static utilities for mnemonics char (&) handling + // ------------------------------------------------ + + // returns the given string without mnemonic characters ('&') + static wxString GetLabelText(const wxString& label); + + // returns the given string without mnemonic characters ('&') + // this function is identic to GetLabelText() and is provided for clarity + // and for symmetry with the wxStaticText::RemoveMarkup() function. + static wxString RemoveMnemonics(const wxString& str); + + // escapes (by doubling them) the mnemonics + static wxString EscapeMnemonics(const wxString& str); + + + // miscellaneous static utilities + // ------------------------------ + + // replaces parts of the given (multiline) string with an ellipsis if needed + static wxString Ellipsize(const wxString& label, const wxDC& dc, + wxEllipsizeMode mode, int maxWidth, + int flags = wxELLIPSIZE_FLAGS_DEFAULT); + + // return the accel index in the string or -1 if none and puts the modified + // string into second parameter if non NULL + static int FindAccelIndex(const wxString& label, + wxString *labelOnly = NULL); + + // this is a helper for the derived class GetClassDefaultAttributes() + // implementation: it returns the right colours for the classes which + // contain something else (e.g. wxListBox, wxTextCtrl, ...) instead of + // being simple controls (such as wxButton, wxCheckBox, ...) + static wxVisualAttributes + GetCompositeControlsDefaultAttributes(wxWindowVariant variant); + +protected: + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const; + + // creates the control (calls wxWindowBase::CreateBase inside) and adds it + // to the list of parents children + bool CreateControl(wxWindowBase *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name); + +#if wxUSE_MARKUP + // This function may be overridden in the derived classes to implement + // support for labels with markup. The base class version simply strips the + // markup and calls SetLabel() with the remaining text. + virtual bool DoSetLabelMarkup(const wxString& markup); +#endif // wxUSE_MARKUP + + // override this to return the total control's size from a string size + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; + + // initialize the common fields of wxCommandEvent + void InitCommandEvent(wxCommandEvent& event) const; + + // Ellipsize() helper: + static wxString DoEllipsizeSingleLine(const wxString& label, const wxDC& dc, + wxEllipsizeMode mode, int maxWidth, + int replacementWidth); + +#if wxUSE_MARKUP + // Remove markup from the given string, returns empty string on error i.e. + // if markup was syntactically invalid. + static wxString RemoveMarkup(const wxString& markup); +#endif // wxUSE_MARKUP + + + // this field contains the label in wx format, i.e. with '&' mnemonics, + // as it was passed to the last SetLabel() call + wxString m_labelOrig; + + wxDECLARE_NO_COPY_CLASS(wxControlBase); +}; + +// ---------------------------------------------------------------------------- +// include platform-dependent wxControl declarations +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/control.h" +#elif defined(__WXMSW__) + #include "wx/msw/control.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/control.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/control.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/control.h" +#elif defined(__WXMAC__) + #include "wx/osx/control.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/control.h" +#elif defined(__WXPM__) + #include "wx/os2/control.h" +#endif + +#endif // wxUSE_CONTROLS + +#endif + // _WX_CONTROL_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/convauto.h b/wxmsw/include/wx-3.0/wx/convauto.h new file mode 100644 index 00000000..0912368f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/convauto.h @@ -0,0 +1,155 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/convauto.h +// Purpose: wxConvAuto class declaration +// Author: Vadim Zeitlin +// Created: 2006-04-03 +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CONVAUTO_H_ +#define _WX_CONVAUTO_H_ + +#include "wx/strconv.h" +#include "wx/fontenc.h" + +// ---------------------------------------------------------------------------- +// wxConvAuto: uses BOM to automatically detect input encoding +// ---------------------------------------------------------------------------- + +// All currently recognized BOM values. +enum wxBOM +{ + wxBOM_Unknown = -1, + wxBOM_None, + wxBOM_UTF32BE, + wxBOM_UTF32LE, + wxBOM_UTF16BE, + wxBOM_UTF16LE, + wxBOM_UTF8 +}; + +class WXDLLIMPEXP_BASE wxConvAuto : public wxMBConv +{ +public: + // default ctor, the real conversion will be created on demand + wxConvAuto(wxFontEncoding enc = wxFONTENCODING_DEFAULT) + { + Init(); + + m_encDefault = enc; + } + + // copy ctor doesn't initialize anything neither as conversion can only be + // deduced on first use + wxConvAuto(const wxConvAuto& other) : wxMBConv() + { + Init(); + + m_encDefault = other.m_encDefault; + } + + virtual ~wxConvAuto() + { + if ( m_ownsConv ) + delete m_conv; + } + + // get/set the fall-back encoding used when the input text doesn't have BOM + // and isn't UTF-8 + // + // special values are wxFONTENCODING_MAX meaning not to use any fall back + // at all (but just fail to convert in this case) and wxFONTENCODING_SYSTEM + // meaning to use the encoding of the system locale + static wxFontEncoding GetFallbackEncoding() { return ms_defaultMBEncoding; } + static void SetFallbackEncoding(wxFontEncoding enc); + static void DisableFallbackEncoding() + { + SetFallbackEncoding(wxFONTENCODING_MAX); + } + + + // override the base class virtual function(s) to use our m_conv + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + + virtual size_t GetMBNulLen() const { return m_conv->GetMBNulLen(); } + + virtual wxMBConv *Clone() const { return new wxConvAuto(*this); } + + // return the BOM type of this buffer + static wxBOM DetectBOM(const char *src, size_t srcLen); + + // return the characters composing the given BOM. + static const char* GetBOMChars(wxBOM bomType, size_t* count); + + wxBOM GetBOM() const + { + return m_bomType; + } + +private: + // common part of all ctors + void Init() + { + // We don't initialize m_encDefault here as different ctors do it + // differently. + m_conv = NULL; + m_bomType = wxBOM_Unknown; + m_ownsConv = false; + m_consumedBOM = false; + } + + // initialize m_conv with the UTF-8 conversion + void InitWithUTF8() + { + m_conv = &wxConvUTF8; + m_ownsConv = false; + } + + // create the correct conversion object for the given BOM type + void InitFromBOM(wxBOM bomType); + + // create the correct conversion object for the BOM present in the + // beginning of the buffer + // + // return false if the buffer is too short to allow us to determine if we + // have BOM or not + bool InitFromInput(const char *src, size_t len); + + // adjust src and len to skip over the BOM (identified by m_bomType) at the + // start of the buffer + void SkipBOM(const char **src, size_t *len) const; + + + // fall-back multibyte encoding to use, may be wxFONTENCODING_SYSTEM or + // wxFONTENCODING_MAX but not wxFONTENCODING_DEFAULT + static wxFontEncoding ms_defaultMBEncoding; + + // conversion object which we really use, NULL until the first call to + // either ToWChar() or FromWChar() + wxMBConv *m_conv; + + // the multibyte encoding to use by default if input isn't Unicode + wxFontEncoding m_encDefault; + + // our BOM type + wxBOM m_bomType; + + // true if we allocated m_conv ourselves, false if we just use an existing + // global conversion + bool m_ownsConv; + + // true if we already skipped BOM when converting (and not just calculating + // the size) + bool m_consumedBOM; + + + wxDECLARE_NO_ASSIGN_CLASS(wxConvAuto); +}; + +#endif // _WX_CONVAUTO_H_ + diff --git a/wxmsw/include/wx-3.0/wx/cpp.h b/wxmsw/include/wx-3.0/wx/cpp.h new file mode 100644 index 00000000..b5ce014e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/cpp.h @@ -0,0 +1,187 @@ +/* + * Name: wx/cpp.h + * Purpose: Various preprocessor helpers + * Author: Vadim Zeitlin + * Created: 2006-09-30 + * Copyright: (c) 2006 Vadim Zeitlin + * Licence: wxWindows licence + */ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_CPP_H_ +#define _WX_CPP_H_ + +#include "wx/compiler.h" /* wxCHECK_XXX_VERSION() macros */ + +/* wxCONCAT works like preprocessor ## operator but also works with macros */ +#define wxCONCAT_HELPER(text, line) text ## line + +#define wxCONCAT(x1, x2) \ + wxCONCAT_HELPER(x1, x2) +#define wxCONCAT3(x1, x2, x3) \ + wxCONCAT(wxCONCAT(x1, x2), x3) +#define wxCONCAT4(x1, x2, x3, x4) \ + wxCONCAT(wxCONCAT3(x1, x2, x3), x4) +#define wxCONCAT5(x1, x2, x3, x4, x5) \ + wxCONCAT(wxCONCAT4(x1, x2, x3, x4), x5) +#define wxCONCAT6(x1, x2, x3, x4, x5, x6) \ + wxCONCAT(wxCONCAT5(x1, x2, x3, x4, x5), x6) +#define wxCONCAT7(x1, x2, x3, x4, x5, x6, x7) \ + wxCONCAT(wxCONCAT6(x1, x2, x3, x4, x5, x6), x7) +#define wxCONCAT8(x1, x2, x3, x4, x5, x6, x7, x8) \ + wxCONCAT(wxCONCAT7(x1, x2, x3, x4, x5, x6, x7), x8) +#define wxCONCAT9(x1, x2, x3, x4, x5, x6, x7, x8, x9) \ + wxCONCAT(wxCONCAT8(x1, x2, x3, x4, x5, x6, x7, x8), x9) + +/* wxSTRINGIZE works as the preprocessor # operator but also works with macros */ +#define wxSTRINGIZE_HELPER(x) #x +#define wxSTRINGIZE(x) wxSTRINGIZE_HELPER(x) + +/* a Unicode-friendly version of wxSTRINGIZE_T */ +#define wxSTRINGIZE_T(x) wxAPPLY_T(wxSTRINGIZE(x)) + +/* + Special workarounds for compilers with broken "##" operator. For all the + other ones we can just use it directly. + */ +#ifdef wxCOMPILER_BROKEN_CONCAT_OPER + #define wxPREPEND_L(x) L ## x + #define wxAPPEND_i64(x) x ## i64 + #define wxAPPEND_ui64(x) x ## ui64 +#endif /* wxCOMPILER_BROKEN_CONCAT_OPER */ + +/* + Helper macros for wxMAKE_UNIQUE_NAME: normally this works by appending the + current line number to the given identifier to reduce the probability of the + conflict (it may still happen if this is used in the headers, hence you + should avoid doing it or provide unique prefixes then) but we have to do it + differently for VC++ + */ +#if defined(__VISUALC__) && (__VISUALC__ >= 1300) + /* + __LINE__ handling is completely broken in VC++ when using "Edit and + Continue" (/ZI option) and results in preprocessor errors if we use it + inside the macros. Luckily VC7 has another standard macro which can be + used like this and is even better than __LINE__ because it is globally + unique. + */ +# define wxCONCAT_LINE(text) wxCONCAT(text, __COUNTER__) +#else /* normal compilers */ +# define wxCONCAT_LINE(text) wxCONCAT(text, __LINE__) +#endif + +/* Create a "unique" name with the given prefix */ +#define wxMAKE_UNIQUE_NAME(text) wxCONCAT_LINE(text) + +/* + This macro can be passed as argument to another macro when you don't have + anything to pass in fact. + */ +#define wxEMPTY_PARAMETER_VALUE /* Fake macro parameter value */ + +/* + Helpers for defining macros that expand into a single statement. + + The standatd solution is to use "do { ... } while (0)" statement but MSVC + generates a C4127 "condition expression is constant" warning for it so we + use something which is just complicated enough to not be recognized as a + constant but still simple enough to be optimized away. + + Another solution would be to use __pragma() to temporarily disable C4127. + + Notice that wxASSERT_ARG_TYPE in wx/strvargarg.h relies on these macros + creating some kind of a loop because it uses "break". + */ +#ifdef __WATCOMC__ + #define wxFOR_ONCE(name) for(int name=0; name<1; name++) + #define wxSTATEMENT_MACRO_BEGIN wxFOR_ONCE(wxMAKE_UNIQUE_NAME(wxmacro)) { + #define wxSTATEMENT_MACRO_END } +#else + #define wxSTATEMENT_MACRO_BEGIN do { + #define wxSTATEMENT_MACRO_END } while ( (void)0, 0 ) +#endif + +/* + Define __WXFUNCTION__ which is like standard __FUNCTION__ but defined as + NULL for the compilers which don't support the latter. + */ +#ifndef __WXFUNCTION__ + /* TODO: add more compilers supporting __FUNCTION__ */ + #if defined(__DMC__) + /* + __FUNCTION__ happens to be not defined within class members + http://www.digitalmars.com/drn-bin/wwwnews?c%2B%2B.beta/485 + */ + #define __WXFUNCTION__ (NULL) + #elif defined(__GNUC__) || \ + (defined(_MSC_VER) && _MSC_VER >= 1300) || \ + defined(__FUNCTION__) + #define __WXFUNCTION__ __FUNCTION__ + #else + /* still define __WXFUNCTION__ to avoid #ifdefs elsewhere */ + #define __WXFUNCTION__ (NULL) + #endif +#endif /* __WXFUNCTION__ already defined */ + + +/* Auto-detect variadic macros support unless explicitly disabled. */ +#if !defined(HAVE_VARIADIC_MACROS) && !defined(wxNO_VARIADIC_MACROS) + /* Any C99 or C++11 compiler should have them. */ + #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ + (defined(__cplusplus) && __cplusplus >= 201103L) + #define HAVE_VARIADIC_MACROS + #elif wxCHECK_GCC_VERSION(3,0) + #define HAVE_VARIADIC_MACROS + #elif wxCHECK_VISUALC_VERSION(8) + #define HAVE_VARIADIC_MACROS + #elif wxCHECK_WATCOM_VERSION(1,2) + #define HAVE_VARIADIC_MACROS + #endif +#endif /* !HAVE_VARIADIC_MACROS */ + + + +#ifdef HAVE_VARIADIC_MACROS +/* + wxCALL_FOR_EACH(what, ...) calls the macro from its first argument, what(pos, x), + for every remaining argument 'x', with 'pos' being its 1-based index in + *reverse* order (with the last argument being numbered 1). + + For example, wxCALL_FOR_EACH(test, a, b, c) expands into this: + + test(3, a) \ + test(2, b) \ + test(1, c) + + Up to eight arguments are supported. + + (With thanks to https://groups.google.com/d/topic/comp.std.c/d-6Mj5Lko_s/discussion + and http://stackoverflow.com/questions/1872220/is-it-possible-to-iterate-over-arguments-in-variadic-macros) +*/ +#define wxCALL_FOR_EACH_NARG(...) wxCALL_FOR_EACH_NARG_((__VA_ARGS__, wxCALL_FOR_EACH_RSEQ_N())) +#define wxCALL_FOR_EACH_NARG_(args) wxCALL_FOR_EACH_ARG_N args +#define wxCALL_FOR_EACH_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, N, ...) N +#define wxCALL_FOR_EACH_RSEQ_N() 8, 7, 6, 5, 4, 3, 2, 1, 0 + +#define wxCALL_FOR_EACH_1(what, x) what(1, x) +#define wxCALL_FOR_EACH_2(what, x, ...) what(2, x) wxCALL_FOR_EACH_1(what, __VA_ARGS__) +#define wxCALL_FOR_EACH_3(what, x, ...) what(3, x) wxCALL_FOR_EACH_2(what, __VA_ARGS__) +#define wxCALL_FOR_EACH_4(what, x, ...) what(4, x) wxCALL_FOR_EACH_3(what, __VA_ARGS__) +#define wxCALL_FOR_EACH_5(what, x, ...) what(5, x) wxCALL_FOR_EACH_4(what, __VA_ARGS__) +#define wxCALL_FOR_EACH_6(what, x, ...) what(6, x) wxCALL_FOR_EACH_5(what, __VA_ARGS__) +#define wxCALL_FOR_EACH_7(what, x, ...) what(7, x) wxCALL_FOR_EACH_6(what, __VA_ARGS__) +#define wxCALL_FOR_EACH_8(what, x, ...) what(8, x) wxCALL_FOR_EACH_7(what, __VA_ARGS__) + +#define wxCALL_FOR_EACH_(N, args) \ + wxCONCAT(wxCALL_FOR_EACH_, N) args + +#define wxCALL_FOR_EACH(what, ...) \ + wxCALL_FOR_EACH_(wxCALL_FOR_EACH_NARG(__VA_ARGS__), (what, __VA_ARGS__)) + +#else + #define wxCALL_FOR_EACH Error_wx_CALL_FOR_EACH_requires_variadic_macros_support +#endif /* HAVE_VARIADIC_MACROS */ + +#endif /* _WX_CPP_H_ */ + diff --git a/wxmsw/include/wx-3.0/wx/crt.h b/wxmsw/include/wx-3.0/wx/crt.h new file mode 100644 index 00000000..9b939fd0 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/crt.h @@ -0,0 +1,22 @@ +////////////////////////////////////////////////////////////////////////////// +// Name: wx/crt.h +// Purpose: Header to include all headers with wrappers for CRT functions +// Author: Robert Roebling +// Created: 2007-05-30 +// Copyright: (c) 2007 wxWidgets dev team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CRT_H_ +#define _WX_CRT_H_ + +#include "wx/defs.h" + +// include wxChar type definition: +#include "wx/chartype.h" + +// and wrappers for CRT functions: +#include "wx/wxcrt.h" +#include "wx/wxcrtvararg.h" + +#endif // _WX_CRT_H_ diff --git a/wxmsw/include/wx-3.0/wx/cshelp.h b/wxmsw/include/wx-3.0/wx/cshelp.h new file mode 100644 index 00000000..723ac14e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/cshelp.h @@ -0,0 +1,243 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/cshelp.h +// Purpose: Context-sensitive help support classes +// Author: Julian Smart, Vadim Zeitlin +// Modified by: +// Created: 08/09/2000 +// Copyright: (c) 2000 Julian Smart, Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CSHELP_H_ +#define _WX_CSHELP_H_ + +#include "wx/defs.h" + +#if wxUSE_HELP + +#include "wx/help.h" + +#include "wx/hashmap.h" +#if wxUSE_BMPBUTTON +#include "wx/bmpbuttn.h" +#endif + +#include "wx/event.h" + +// ---------------------------------------------------------------------------- +// classes used to implement context help UI +// ---------------------------------------------------------------------------- + +/* + * wxContextHelp + * Invokes context-sensitive help. When the user + * clicks on a window, a wxEVT_HELP event will be sent to that + * window for the application to display help for. + */ + +class WXDLLIMPEXP_CORE wxContextHelp : public wxObject +{ +public: + wxContextHelp(wxWindow* win = NULL, bool beginHelp = true); + virtual ~wxContextHelp(); + + bool BeginContextHelp(wxWindow* win); + bool EndContextHelp(); + + bool EventLoop(); + bool DispatchEvent(wxWindow* win, const wxPoint& pt); + + void SetStatus(bool status) { m_status = status; } + +protected: + bool m_inHelp; + bool m_status; // true if the user left-clicked + +private: + DECLARE_DYNAMIC_CLASS(wxContextHelp) +}; + +#if wxUSE_BMPBUTTON +/* + * wxContextHelpButton + * You can add this to your dialogs (especially on non-Windows platforms) + * to put the application into context help mode. + */ + +class WXDLLIMPEXP_CORE wxContextHelpButton : public wxBitmapButton +{ +public: + wxContextHelpButton(wxWindow* parent, + wxWindowID id = wxID_CONTEXT_HELP, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxBU_AUTODRAW); + + void OnContextHelp(wxCommandEvent& event); + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxContextHelpButton) + DECLARE_EVENT_TABLE() +}; + +#endif + +// ---------------------------------------------------------------------------- +// classes used to implement context help support +// ---------------------------------------------------------------------------- + +// wxHelpProvider is an abstract class used by the program implementing context help to +// show the help text (or whatever: it may be HTML page or anything else) for +// the given window. +// +// The current help provider must be explicitly set by the application using +// wxHelpProvider::Set(). +// +// Special note about ShowHelpAtPoint() and ShowHelp(): we want to be able to +// override ShowHelpAtPoint() when we need to use different help messages for +// different parts of the window, but it should also be possible to override +// just ShowHelp() both for backwards compatibility and just because most +// often the help does not, in fact, depend on the position and so +// implementing just ShowHelp() is simpler and more natural, so by default +// ShowHelpAtPoint() forwards to ShowHelp(). But this means that +// wxSimpleHelpProvider has to override ShowHelp() and not ShowHelpAtPoint() +// for backwards compatibility as otherwise the existing code deriving from it +// and overriding ShowHelp() but calling the base class version wouldn't work +// any more, which forces us to use a rather ugly hack and pass the extra +// parameters of ShowHelpAtPoint() to ShowHelp() via member variables. +class WXDLLIMPEXP_CORE wxHelpProvider +{ +public: + // get/set the current (application-global) help provider (Set() returns + // the previous one) + static wxHelpProvider *Set(wxHelpProvider *helpProvider) + { + wxHelpProvider *helpProviderOld = ms_helpProvider; + ms_helpProvider = helpProvider; + return helpProviderOld; + } + + // unlike some other class, the help provider is not created on demand, + // this must be explicitly done by the application + static wxHelpProvider *Get() { return ms_helpProvider; } + + // get the help string (whose interpretation is help provider dependent + // except that empty string always means that no help is associated with + // the window) for this window + virtual wxString GetHelp(const wxWindowBase *window) = 0; + + // do show help for the given window (uses window->GetHelpAtPoint() + // internally if applicable), return true if it was done or false + // if no help available for this window + virtual bool ShowHelpAtPoint(wxWindowBase *window, + const wxPoint& pt, + wxHelpEvent::Origin origin) + { + wxCHECK_MSG( window, false, wxT("window must not be NULL") ); + + m_helptextAtPoint = pt; + m_helptextOrigin = origin; + + return ShowHelp(window); + } + + // show help for the given window, see ShowHelpAtPoint() above + virtual bool ShowHelp(wxWindowBase * WXUNUSED(window)) { return false; } + + // associate the text with the given window or id: although all help + // providers have these functions to allow making wxWindow::SetHelpText() + // work, not all of them implement them + virtual void AddHelp(wxWindowBase *window, const wxString& text); + + // this version associates the given text with all window with this id + // (may be used to set the same help string for all [Cancel] buttons in + // the application, for example) + virtual void AddHelp(wxWindowID id, const wxString& text); + + // removes the association + virtual void RemoveHelp(wxWindowBase* window); + + // virtual dtor for any base class + virtual ~wxHelpProvider(); + +protected: + wxHelpProvider() + : m_helptextAtPoint(wxDefaultPosition), + m_helptextOrigin(wxHelpEvent::Origin_Unknown) + { + } + + // helper method used by ShowHelp(): returns the help string to use by + // using m_helptextAtPoint/m_helptextOrigin if they're set or just GetHelp + // otherwise + wxString GetHelpTextMaybeAtPoint(wxWindowBase *window); + + + // parameters of the last ShowHelpAtPoint() call, used by ShowHelp() + wxPoint m_helptextAtPoint; + wxHelpEvent::Origin m_helptextOrigin; + +private: + static wxHelpProvider *ms_helpProvider; +}; + +WX_DECLARE_EXPORTED_HASH_MAP( wxUIntPtr, wxString, wxIntegerHash, + wxIntegerEqual, wxSimpleHelpProviderHashMap ); + +// wxSimpleHelpProvider is an implementation of wxHelpProvider which supports +// only plain text help strings and shows the string associated with the +// control (if any) in a tooltip +class WXDLLIMPEXP_CORE wxSimpleHelpProvider : public wxHelpProvider +{ +public: + // implement wxHelpProvider methods + virtual wxString GetHelp(const wxWindowBase *window); + + // override ShowHelp() and not ShowHelpAtPoint() as explained above + virtual bool ShowHelp(wxWindowBase *window); + + virtual void AddHelp(wxWindowBase *window, const wxString& text); + virtual void AddHelp(wxWindowID id, const wxString& text); + virtual void RemoveHelp(wxWindowBase* window); + +protected: + // we use 2 hashes for storing the help strings associated with windows + // and the ids + wxSimpleHelpProviderHashMap m_hashWindows, + m_hashIds; +}; + +// wxHelpControllerHelpProvider is an implementation of wxHelpProvider which supports +// both context identifiers and plain text help strings. If the help text is an integer, +// it is passed to wxHelpController::DisplayContextPopup. Otherwise, it shows the string +// in a tooltip as per wxSimpleHelpProvider. +class WXDLLIMPEXP_CORE wxHelpControllerHelpProvider : public wxSimpleHelpProvider +{ +public: + // Note that it doesn't own the help controller. The help controller + // should be deleted separately. + wxHelpControllerHelpProvider(wxHelpControllerBase* hc = NULL); + + // implement wxHelpProvider methods + + // again (see above): this should be ShowHelpAtPoint() but we need to + // override ShowHelp() to avoid breaking existing code + virtual bool ShowHelp(wxWindowBase *window); + + // Other accessors + void SetHelpController(wxHelpControllerBase* hc) { m_helpController = hc; } + wxHelpControllerBase* GetHelpController() const { return m_helpController; } + +protected: + wxHelpControllerBase* m_helpController; + + wxDECLARE_NO_COPY_CLASS(wxHelpControllerHelpProvider); +}; + +// Convenience function for turning context id into wxString +WXDLLIMPEXP_CORE wxString wxContextId(int id); + +#endif // wxUSE_HELP + +#endif // _WX_CSHELP_H_ + diff --git a/wxmsw/include/wx-3.0/wx/ctrlsub.h b/wxmsw/include/wx-3.0/wx/ctrlsub.h new file mode 100644 index 00000000..88832e5b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ctrlsub.h @@ -0,0 +1,479 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/ctrlsub.h (read: "wxConTRoL with SUBitems") +// Purpose: wxControlWithItems interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.10.99 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CTRLSUB_H_BASE_ +#define _WX_CTRLSUB_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_CONTROLS + +#include "wx/arrstr.h" +#include "wx/control.h" // base class + +// ---------------------------------------------------------------------------- +// wxItemContainer defines an interface which is implemented by all controls +// which have string subitems each of which may be selected. +// +// It is decomposed in wxItemContainerImmutable which omits all methods +// adding/removing items and is used by wxRadioBox and wxItemContainer itself. +// +// Examples: wxListBox, wxCheckListBox, wxChoice and wxComboBox (which +// implements an extended interface deriving from this one) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxItemContainerImmutable +{ +public: + wxItemContainerImmutable() { } + virtual ~wxItemContainerImmutable(); + + // accessing strings + // ----------------- + + virtual unsigned int GetCount() const = 0; + bool IsEmpty() const { return GetCount() == 0; } + + virtual wxString GetString(unsigned int n) const = 0; + wxArrayString GetStrings() const; + virtual void SetString(unsigned int n, const wxString& s) = 0; + + // finding string natively is either case sensitive or insensitive + // but never both so fall back to this base version for not + // supported search type + virtual int FindString(const wxString& s, bool bCase = false) const + { + unsigned int count = GetCount(); + + for ( unsigned int i = 0; i < count ; ++i ) + { + if (GetString(i).IsSameAs( s , bCase )) + return (int)i; + } + + return wxNOT_FOUND; + } + + + // selection + // --------- + + virtual void SetSelection(int n) = 0; + virtual int GetSelection() const = 0; + + // set selection to the specified string, return false if not found + bool SetStringSelection(const wxString& s); + + // return the selected string or empty string if none + virtual wxString GetStringSelection() const; + + // this is the same as SetSelection( for single-selection controls but + // reads better for multi-selection ones + void Select(int n) { SetSelection(n); } + + +protected: + // check that the index is valid + bool IsValid(unsigned int n) const { return n < GetCount(); } + bool IsValidInsert(unsigned int n) const { return n <= GetCount(); } +}; + +// ---------------------------------------------------------------------------- +// wxItemContainer extends wxItemContainerImmutable interface with methods +// for adding/removing items. +// +// Classes deriving from this one must override DoInsertItems() to implement +// adding items to the control. This can often be implemented more efficiently +// than simply looping over the elements and inserting them but if this is not +// the case, the generic DoInsertItemsInLoop can be used in implementation, but +// in this case DoInsertItem() needs to be overridden. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxItemContainer : public wxItemContainerImmutable +{ +private: + // AppendItems() and InsertItems() helpers just call DoAppend/InsertItems() + // after doing some checks + // + // NB: they're defined here so that they're inlined when used in public part + int AppendItems(const wxArrayStringsAdapter& items, + void **clientData, + wxClientDataType type) + { + if ( items.IsEmpty() ) + return wxNOT_FOUND; + + return DoAppendItems(items, clientData, type); + } + + int AppendItems(const wxArrayStringsAdapter& items) + { + return AppendItems(items, NULL, wxClientData_None); + } + + int AppendItems(const wxArrayStringsAdapter& items, void **clientData) + { + wxASSERT_MSG( GetClientDataType() != wxClientData_Object, + wxT("can't mix different types of client data") ); + + return AppendItems(items, clientData, wxClientData_Void); + } + + int AppendItems(const wxArrayStringsAdapter& items, + wxClientData **clientData) + { + wxASSERT_MSG( GetClientDataType() != wxClientData_Void, + wxT("can't mix different types of client data") ); + + return AppendItems(items, reinterpret_cast(clientData), + wxClientData_Object); + } + + int InsertItems(const wxArrayStringsAdapter& items, + unsigned int pos, + void **clientData, + wxClientDataType type) + { + wxASSERT_MSG( !IsSorted(), wxT("can't insert items in sorted control") ); + + wxCHECK_MSG( pos <= GetCount(), wxNOT_FOUND, + wxT("position out of range") ); + + // not all derived classes handle empty arrays correctly in + // DoInsertItems() and besides it really doesn't make much sense to do + // this (for append it could correspond to creating an initially empty + // control but why would anybody need to insert 0 items?) + wxCHECK_MSG( !items.IsEmpty(), wxNOT_FOUND, + wxT("need something to insert") ); + + return DoInsertItems(items, pos, clientData, type); + } + + int InsertItems(const wxArrayStringsAdapter& items, unsigned int pos) + { + return InsertItems(items, pos, NULL, wxClientData_None); + } + + int InsertItems(const wxArrayStringsAdapter& items, + unsigned int pos, + void **clientData) + { + wxASSERT_MSG( GetClientDataType() != wxClientData_Object, + wxT("can't mix different types of client data") ); + + return InsertItems(items, pos, clientData, wxClientData_Void); + } + + int InsertItems(const wxArrayStringsAdapter& items, + unsigned int pos, + wxClientData **clientData) + { + wxASSERT_MSG( GetClientDataType() != wxClientData_Void, + wxT("can't mix different types of client data") ); + + return InsertItems(items, pos, + reinterpret_cast(clientData), + wxClientData_Object); + } + +public: + wxItemContainer() { m_clientDataItemsType = wxClientData_None; } + virtual ~wxItemContainer(); + + // adding items + // ------------ + + // append single item, return its position in the control (which can be + // different from the last one if the control is sorted) + int Append(const wxString& item) + { return AppendItems(item); } + int Append(const wxString& item, void *clientData) + { return AppendItems(item, &clientData); } + int Append(const wxString& item, wxClientData *clientData) + { return AppendItems(item, &clientData); } + + // append several items at once to the control, return the position of the + // last item appended + int Append(const wxArrayString& items) + { return AppendItems(items); } + int Append(const wxArrayString& items, void **clientData) + { return AppendItems(items, clientData); } + int Append(const wxArrayString& items, wxClientData **clientData) + { return AppendItems(items, clientData); } + int Append(unsigned int n, const wxString *items) + { return AppendItems(wxArrayStringsAdapter(n, items)); } + int Append(unsigned int n, const wxString *items, void **clientData) + { return AppendItems(wxArrayStringsAdapter(n, items), clientData); } + int Append(unsigned int n, + const wxString *items, + wxClientData **clientData) + { return AppendItems(wxArrayStringsAdapter(n, items), clientData); } + + // only for RTTI needs (separate name) + void AppendString(const wxString& item) + { Append(item); } + + + // inserting items: not for sorted controls! + // ----------------------------------------- + + // insert single item at the given position, return its effective position + int Insert(const wxString& item, unsigned int pos) + { return InsertItems(item, pos); } + int Insert(const wxString& item, unsigned int pos, void *clientData) + { return InsertItems(item, pos, &clientData); } + int Insert(const wxString& item, unsigned int pos, wxClientData *clientData) + { return InsertItems(item, pos, &clientData); } + + // insert several items at once into the control, return the index of the + // last item inserted + int Insert(const wxArrayString& items, unsigned int pos) + { return InsertItems(items, pos); } + int Insert(const wxArrayString& items, unsigned int pos, void **clientData) + { return InsertItems(items, pos, clientData); } + int Insert(const wxArrayString& items, + unsigned int pos, + wxClientData **clientData) + { return InsertItems(items, pos, clientData); } + int Insert(unsigned int n, const wxString *items, unsigned int pos) + { return InsertItems(wxArrayStringsAdapter(n, items), pos); } + int Insert(unsigned int n, + const wxString *items, + unsigned int pos, + void **clientData) + { return InsertItems(wxArrayStringsAdapter(n, items), pos, clientData); } + int Insert(unsigned int n, + const wxString *items, + unsigned int pos, + wxClientData **clientData) + { return InsertItems(wxArrayStringsAdapter(n, items), pos, clientData); } + + + // replacing items + // --------------- + + void Set(const wxArrayString& items) + { Clear(); Append(items); } + void Set(const wxArrayString& items, void **clientData) + { Clear(); Append(items, clientData); } + void Set(const wxArrayString& items, wxClientData **clientData) + { Clear(); Append(items, clientData); } + void Set(unsigned int n, const wxString *items) + { Clear(); Append(n, items); } + void Set(unsigned int n, const wxString *items, void **clientData) + { Clear(); Append(n, items, clientData); } + void Set(unsigned int n, const wxString *items, wxClientData **clientData) + { Clear(); Append(n, items, clientData); } + + // deleting items + // -------------- + + void Clear(); + void Delete(unsigned int pos); + + + // various accessors + // ----------------- + + // The control may maintain its items in a sorted order in which case + // items are automatically inserted at the right position when they are + // inserted or appended. Derived classes have to override this method if + // they implement sorting, typically by returning HasFlag(wxXX_SORT) + virtual bool IsSorted() const { return false; } + + + // client data stuff + // ----------------- + + void SetClientData(unsigned int n, void* clientData); + void* GetClientData(unsigned int n) const; + + // SetClientObject() takes ownership of the pointer, GetClientObject() + // returns it but keeps the ownership while DetachClientObject() expects + // the caller to delete the pointer and also resets the internally stored + // one to NULL for this item + void SetClientObject(unsigned int n, wxClientData* clientData); + wxClientData* GetClientObject(unsigned int n) const; + wxClientData* DetachClientObject(unsigned int n); + + // return the type of client data stored in this control: usually it just + // returns m_clientDataItemsType but must be overridden in the controls + // which delegate their client data storage to another one (e.g. wxChoice + // in wxUniv which stores data in wxListBox which it uses anyhow); don't + // forget to override SetClientDataType() if you override this one + // + // NB: for this to work no code should ever access m_clientDataItemsType + // directly but only via this function! + virtual wxClientDataType GetClientDataType() const + { return m_clientDataItemsType; } + + bool HasClientData() const + { return GetClientDataType() != wxClientData_None; } + bool HasClientObjectData() const + { return GetClientDataType() == wxClientData_Object; } + bool HasClientUntypedData() const + { return GetClientDataType() == wxClientData_Void; } + +protected: + // there is usually no need to override this method but you can do it if it + // is more convenient to only do "real" insertions in DoInsertItems() and + // to implement items appending here (in which case DoInsertItems() should + // call this method if pos == GetCount() as it can still be called in this + // case if public Insert() is called with such position) + virtual int DoAppendItems(const wxArrayStringsAdapter& items, + void **clientData, + wxClientDataType type) + { + return DoInsertItems(items, GetCount(), clientData, type); + } + + // this method must be implemented to insert the items into the control at + // position pos which can be GetCount() meaning that the items should be + // appended; for the sorted controls the position can be ignored + // + // the derived classes typically use AssignNewItemClientData() to + // associate the data with the items as they're being inserted + // + // the method should return the index of the position the last item was + // inserted into or wxNOT_FOUND if an error occurred + virtual int DoInsertItems(const wxArrayStringsAdapter & items, + unsigned int pos, + void **clientData, + wxClientDataType type) = 0; + + // before the client data is set for the first time for the control which + // hadn't had it before, DoInitItemClientData() is called which gives the + // derived class the possibility to initialize its client data storage only + // when client data is really used + virtual void DoInitItemClientData() { } + virtual void DoSetItemClientData(unsigned int n, void *clientData) = 0; + virtual void *DoGetItemClientData(unsigned int n) const = 0; + + virtual void DoClear() = 0; + virtual void DoDeleteOneItem(unsigned int pos) = 0; + + + // methods useful for the derived classes which don't have any better way + // of adding multiple items to the control than doing it one by one: such + // classes should call DoInsertItemsInLoop() from their DoInsert() and + // override DoInsertOneItem() to perform the real insertion + virtual int DoInsertOneItem(const wxString& item, unsigned int pos); + int DoInsertItemsInLoop(const wxArrayStringsAdapter& items, + unsigned int pos, + void **clientData, + wxClientDataType type); + + + // helper for DoInsertItems(): n is the index into clientData, pos is the + // position of the item in the control + void AssignNewItemClientData(unsigned int pos, + void **clientData, + unsigned int n, + wxClientDataType type); + + // free the client object associated with the item at given position and + // set it to NULL (must only be called if HasClientObjectData()) + void ResetItemClientObject(unsigned int n); + + // set the type of the client data stored in this control: override this if + // you override GetClientDataType() + virtual void SetClientDataType(wxClientDataType clientDataItemsType) + { + m_clientDataItemsType = clientDataItemsType; + } + +private: + // the type of the client data for the items + wxClientDataType m_clientDataItemsType; +}; + +// Inheriting directly from a wxWindow-derived class and wxItemContainer +// unfortunately introduces an ambiguity for all GetClientXXX() methods as they +// are inherited twice: the "global" versions from wxWindow and the per-item +// versions taking the index from wxItemContainer. +// +// So we need to explicitly resolve them and this helper template class is +// provided to do it. To use it, simply inherit from wxWindowWithItems instead of Window and Container interface directly. +template +class wxWindowWithItems : public W, public C +{ +public: + typedef W BaseWindowClass; + typedef C BaseContainerInterface; + + wxWindowWithItems() { } + + void SetClientData(void *data) + { BaseWindowClass::SetClientData(data); } + void *GetClientData() const + { return BaseWindowClass::GetClientData(); } + void SetClientObject(wxClientData *data) + { BaseWindowClass::SetClientObject(data); } + wxClientData *GetClientObject() const + { return BaseWindowClass::GetClientObject(); } + + void SetClientData(unsigned int n, void* clientData) + { wxItemContainer::SetClientData(n, clientData); } + void* GetClientData(unsigned int n) const + { return wxItemContainer::GetClientData(n); } + void SetClientObject(unsigned int n, wxClientData* clientData) + { wxItemContainer::SetClientObject(n, clientData); } + wxClientData* GetClientObject(unsigned int n) const + { return wxItemContainer::GetClientObject(n); } +}; + +class WXDLLIMPEXP_CORE wxControlWithItemsBase : + public wxWindowWithItems +{ +public: + wxControlWithItemsBase() { } + + // usually the controls like list/combo boxes have their own background + // colour + virtual bool ShouldInheritColours() const { return false; } + + + // Implementation only from now on. + + // Generate an event of the given type for the selection change. + void SendSelectionChangedEvent(wxEventType eventType); + +protected: + // fill in the client object or data field of the event as appropriate + // + // calls InitCommandEvent() and, if n != wxNOT_FOUND, also sets the per + // item client data + void InitCommandEventWithItems(wxCommandEvent& event, int n); + +private: + wxDECLARE_NO_COPY_CLASS(wxControlWithItemsBase); +}; + +// define the platform-specific wxControlWithItems class +#if defined(__WXMSW__) + #include "wx/msw/ctrlsub.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/ctrlsub.h" +#else + class WXDLLIMPEXP_CORE wxControlWithItems : public wxControlWithItemsBase + { + public: + wxControlWithItems() { } + + private: + DECLARE_ABSTRACT_CLASS(wxControlWithItems) + wxDECLARE_NO_COPY_CLASS(wxControlWithItems); + }; +#endif + +#endif // wxUSE_CONTROLS + +#endif // _WX_CTRLSUB_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/cursor.h b/wxmsw/include/wx-3.0/wx/cursor.h new file mode 100644 index 00000000..bdde8cdf --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/cursor.h @@ -0,0 +1,107 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/cursor.h +// Purpose: wxCursor base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CURSOR_H_BASE_ +#define _WX_CURSOR_H_BASE_ + +#include "wx/defs.h" + +/* + wxCursor classes should have the following public API: + +class WXDLLIMPEXP_CORE wxCursor : public wxGDIObject +{ +public: + wxCursor(); + wxCursor(const wxImage& image); + wxCursor(const wxString& name, + wxBitmapType type = wxCURSOR_DEFAULT_TYPE, + int hotSpotX = 0, int hotSpotY = 0); + wxCursor(wxStockCursor id) { InitFromStock(id); } +#if WXWIN_COMPATIBILITY_2_8 + wxCursor(int id) { InitFromStock((wxStockCursor)id); } +#endif + virtual ~wxCursor(); +}; + +*/ + +#if defined(__WXMSW__) + #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR_RESOURCE + #include "wx/msw/cursor.h" +#elif defined(__WXMOTIF__) + #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XBM + #include "wx/motif/cursor.h" +#elif defined(__WXGTK20__) + #ifdef __WINDOWS__ + #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR_RESOURCE + #else + #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #endif + #include "wx/gtk/cursor.h" +#elif defined(__WXGTK__) + #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #include "wx/gtk1/cursor.h" +#elif defined(__WXX11__) + #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #include "wx/x11/cursor.h" +#elif defined(__WXDFB__) + #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR_RESOURCE + #include "wx/dfb/cursor.h" +#elif defined(__WXMAC__) + #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_MACCURSOR_RESOURCE + #include "wx/osx/cursor.h" +#elif defined(__WXCOCOA__) + #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_MACCURSOR_RESOURCE + #include "wx/cocoa/cursor.h" +#elif defined(__WXPM__) + #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR_RESOURCE + #include "wx/os2/cursor.h" +#endif + +#include "wx/utils.h" + +/* This is a small class which can be used by all ports + to temporarily suspend the busy cursor. Useful in modal + dialogs. + + Actually that is not (any longer) quite true.. currently it is + only used in wxGTK Dialog::ShowModal() and now uses static + wxBusyCursor methods that are only implemented for wxGTK so far. + The BusyCursor handling code should probably be implemented in + common code somewhere instead of the separate implementations we + currently have. Also the name BusyCursorSuspender is a little + misleading since it doesn't actually suspend the BusyCursor, just + masks one that is already showing. + If another call to wxBeginBusyCursor is made while this is active + the Busy Cursor will again be shown. But at least now it doesn't + interfere with the state of wxIsBusy() -- RL + +*/ +class wxBusyCursorSuspender +{ +public: + wxBusyCursorSuspender() + { + if( wxIsBusy() ) + { + wxSetCursor( wxBusyCursor::GetStoredCursor() ); + } + } + ~wxBusyCursorSuspender() + { + if( wxIsBusy() ) + { + wxSetCursor( wxBusyCursor::GetBusyCursor() ); + } + } +}; +#endif + // _WX_CURSOR_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/custombgwin.h b/wxmsw/include/wx-3.0/wx/custombgwin.h new file mode 100644 index 00000000..73890a46 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/custombgwin.h @@ -0,0 +1,52 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/custombgwin.h +// Purpose: Class adding support for custom window backgrounds. +// Author: Vadim Zeitlin +// Created: 2011-10-10 +// Copyright: (c) 2011 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CUSTOMBGWIN_H_ +#define _WX_CUSTOMBGWIN_H_ + +// ---------------------------------------------------------------------------- +// wxCustomBackgroundWindow: Adds support for custom backgrounds to any +// wxWindow-derived class. +// ---------------------------------------------------------------------------- + +class wxCustomBackgroundWindowBase +{ +public: + // Trivial default ctor. + wxCustomBackgroundWindowBase() { } + + // Also a trivial but virtual -- to suppress g++ warnings -- dtor. + virtual ~wxCustomBackgroundWindowBase() { } + + // Use the given bitmap to tile the background of this window. This bitmap + // will show through any transparent children. + // + // Notice that you must not prevent the base class EVT_ERASE_BACKGROUND + // handler from running (i.e. not to handle this event yourself) for this + // to work. + void SetBackgroundBitmap(const wxBitmap& bmp) + { + DoSetBackgroundBitmap(bmp); + } + +protected: + virtual void DoSetBackgroundBitmap(const wxBitmap& bmp) = 0; + + wxDECLARE_NO_COPY_CLASS(wxCustomBackgroundWindowBase); +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/custombgwin.h" +#elif defined(__WXMSW__) + #include "wx/msw/custombgwin.h" +#else + #include "wx/generic/custombgwin.h" +#endif + +#endif // _WX_CUSTOMBGWIN_H_ diff --git a/wxmsw/include/wx-3.0/wx/dataobj.h b/wxmsw/include/wx-3.0/wx/dataobj.h new file mode 100644 index 00000000..d099f4b6 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dataobj.h @@ -0,0 +1,589 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/dataobj.h +// Purpose: common data object classes +// Author: Vadim Zeitlin, Robert Roebling +// Modified by: +// Created: 26.05.99 +// Copyright: (c) wxWidgets Team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DATAOBJ_H_BASE_ +#define _WX_DATAOBJ_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- +#include "wx/defs.h" + +#if wxUSE_DATAOBJ + +#include "wx/string.h" +#include "wx/bitmap.h" +#include "wx/list.h" +#include "wx/arrstr.h" + +// ============================================================================ +/* + Generic data transfer related classes. The class hierarchy is as follows: + + - wxDataObject- + / \ + / \ + wxDataObjectSimple wxDataObjectComposite + / | \ + / | \ + wxTextDataObject | wxBitmapDataObject + | + wxCustomDataObject + +*/ +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxDataFormat class is declared in platform-specific headers: it represents +// a format for data which may be either one of the standard ones (text, +// bitmap, ...) or a custom one which is then identified by a unique string. +// ---------------------------------------------------------------------------- + +/* the class interface looks like this (pseudo code): + +class wxDataFormat +{ +public: + typedef NativeFormat; + + wxDataFormat(NativeFormat format = wxDF_INVALID); + wxDataFormat(const wxString& format); + + wxDataFormat& operator=(NativeFormat format); + wxDataFormat& operator=(const wxDataFormat& format); + + bool operator==(NativeFormat format) const; + bool operator!=(NativeFormat format) const; + + void SetType(NativeFormat format); + NativeFormat GetType() const; + + wxString GetId() const; + void SetId(const wxString& format); +}; + +*/ + +#if defined(__WXMSW__) + #include "wx/msw/ole/dataform.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/dataform.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/dataform.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/dataform.h" +#elif defined(__WXX11__) + #include "wx/x11/dataform.h" +#elif defined(__WXMAC__) + #include "wx/osx/dataform.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/dataform.h" +#elif defined(__WXPM__) + #include "wx/os2/dataform.h" +#endif + +// the value for default argument to some functions (corresponds to +// wxDF_INVALID) +extern WXDLLIMPEXP_CORE const wxDataFormat& wxFormatInvalid; + +// ---------------------------------------------------------------------------- +// wxDataObject represents a piece of data which knows which formats it +// supports and knows how to render itself in each of them - GetDataHere(), +// and how to restore data from the buffer (SetData()). +// +// Although this class may be used directly (i.e. custom classes may be +// derived from it), in many cases it might be simpler to use either +// wxDataObjectSimple or wxDataObjectComposite classes. +// +// A data object may be "read only", i.e. support only GetData() functions or +// "read-write", i.e. support both GetData() and SetData() (in principle, it +// might be "write only" too, but this is rare). Moreover, it doesn't have to +// support the same formats in Get() and Set() directions: for example, a data +// object containing JPEG image might accept BMPs in GetData() because JPEG +// image may be easily transformed into BMP but not in SetData(). Accordingly, +// all methods dealing with formats take an additional "direction" argument +// which is either SET or GET and which tells the function if the format needs +// to be supported by SetData() or GetDataHere(). +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDataObjectBase +{ +public: + enum Direction + { + Get = 0x01, // format is supported by GetDataHere() + Set = 0x02, // format is supported by SetData() + Both = 0x03 // format is supported by both (unused currently) + }; + + // this class is polymorphic, hence it needs a virtual dtor + virtual ~wxDataObjectBase(); + + // get the best suited format for rendering our data + virtual wxDataFormat GetPreferredFormat(Direction dir = Get) const = 0; + + // get the number of formats we support + virtual size_t GetFormatCount(Direction dir = Get) const = 0; + + // return all formats in the provided array (of size GetFormatCount()) + virtual void GetAllFormats(wxDataFormat *formats, + Direction dir = Get) const = 0; + + // get the (total) size of data for the given format + virtual size_t GetDataSize(const wxDataFormat& format) const = 0; + + // copy raw data (in the specified format) to the provided buffer, return + // true if data copied successfully, false otherwise + virtual bool GetDataHere(const wxDataFormat& format, void *buf) const = 0; + + // get data from the buffer of specified length (in the given format), + // return true if the data was read successfully, false otherwise + virtual bool SetData(const wxDataFormat& WXUNUSED(format), + size_t WXUNUSED(len), const void * WXUNUSED(buf)) + { + return false; + } + + // returns true if this format is supported + bool IsSupported(const wxDataFormat& format, Direction dir = Get) const; +}; + +// ---------------------------------------------------------------------------- +// include the platform-specific declarations of wxDataObject +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/ole/dataobj.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/dataobj.h" +#elif defined(__WXX11__) + #include "wx/x11/dataobj.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/dataobj.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/dataobj.h" +#elif defined(__WXMAC__) + #include "wx/osx/dataobj.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/dataobj.h" +#elif defined(__WXPM__) + #include "wx/os2/dataobj.h" +#endif + +// ---------------------------------------------------------------------------- +// wxDataObjectSimple is a wxDataObject which only supports one format (in +// both Get and Set directions, but you may return false from GetDataHere() or +// SetData() if one of them is not supported). This is the simplest possible +// wxDataObject implementation. +// +// This is still an "abstract base class" (although it doesn't have any pure +// virtual functions), to use it you should derive from it and implement +// GetDataSize(), GetDataHere() and SetData() functions because the base class +// versions don't do anything - they just return "not implemented". +// +// This class should be used when you provide data in only one format (no +// conversion to/from other formats), either a standard or a custom one. +// Otherwise, you should use wxDataObjectComposite or wxDataObject directly. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDataObjectSimple : public wxDataObject +{ +public: + // ctor takes the format we support, but it can also be set later with + // SetFormat() + wxDataObjectSimple(const wxDataFormat& format = wxFormatInvalid) + : m_format(format) + { + } + + // get/set the format we support + const wxDataFormat& GetFormat() const { return m_format; } + void SetFormat(const wxDataFormat& format) { m_format = format; } + + // virtual functions to override in derived class (the base class versions + // just return "not implemented") + // ----------------------------------------------------------------------- + + // get the size of our data + virtual size_t GetDataSize() const + { return 0; } + + // copy our data to the buffer + virtual bool GetDataHere(void *WXUNUSED(buf)) const + { return false; } + + // copy data from buffer to our data + virtual bool SetData(size_t WXUNUSED(len), const void *WXUNUSED(buf)) + { return false; } + + // implement base class pure virtuals + // ---------------------------------- + virtual wxDataFormat GetPreferredFormat(wxDataObjectBase::Direction WXUNUSED(dir) = Get) const + { return m_format; } + virtual size_t GetFormatCount(wxDataObjectBase::Direction WXUNUSED(dir) = Get) const + { return 1; } + virtual void GetAllFormats(wxDataFormat *formats, + wxDataObjectBase::Direction WXUNUSED(dir) = Get) const + { *formats = m_format; } + virtual size_t GetDataSize(const wxDataFormat& WXUNUSED(format)) const + { return GetDataSize(); } + virtual bool GetDataHere(const wxDataFormat& WXUNUSED(format), + void *buf) const + { return GetDataHere(buf); } + virtual bool SetData(const wxDataFormat& WXUNUSED(format), + size_t len, const void *buf) + { return SetData(len, buf); } + +private: + // the one and only format we support + wxDataFormat m_format; + + wxDECLARE_NO_COPY_CLASS(wxDataObjectSimple); +}; + +// ---------------------------------------------------------------------------- +// wxDataObjectComposite is the simplest way to implement wxDataObject +// supporting multiple formats. It contains several wxDataObjectSimple and +// supports all formats supported by any of them. +// +// This class shouldn't be (normally) derived from, but may be used directly. +// If you need more flexibility than what it provides, you should probably use +// wxDataObject directly. +// ---------------------------------------------------------------------------- + +WX_DECLARE_EXPORTED_LIST(wxDataObjectSimple, wxSimpleDataObjectList); + +class WXDLLIMPEXP_CORE wxDataObjectComposite : public wxDataObject +{ +public: + // ctor + wxDataObjectComposite(); + virtual ~wxDataObjectComposite(); + + // add data object (it will be deleted by wxDataObjectComposite, hence it + // must be allocated on the heap) whose format will become the preferred + // one if preferred == true + void Add(wxDataObjectSimple *dataObject, bool preferred = false); + + // Report the format passed to the SetData method. This should be the + // format of the data object within the composite that received data from + // the clipboard or the DnD operation. You can use this method to find + // out what kind of data object was received. + wxDataFormat GetReceivedFormat() const; + + // Returns the pointer to the object which supports this format or NULL. + // The returned pointer is owned by wxDataObjectComposite and must + // therefore not be destroyed by the caller. + wxDataObjectSimple *GetObject(const wxDataFormat& format, + wxDataObjectBase::Direction dir = Get) const; + + // implement base class pure virtuals + // ---------------------------------- + virtual wxDataFormat GetPreferredFormat(wxDataObjectBase::Direction dir = Get) const; + virtual size_t GetFormatCount(wxDataObjectBase::Direction dir = Get) const; + virtual void GetAllFormats(wxDataFormat *formats, wxDataObjectBase::Direction dir = Get) const; + virtual size_t GetDataSize(const wxDataFormat& format) const; + virtual bool GetDataHere(const wxDataFormat& format, void *buf) const; + virtual bool SetData(const wxDataFormat& format, size_t len, const void *buf); +#if defined(__WXMSW__) + virtual const void* GetSizeFromBuffer( const void* buffer, size_t* size, + const wxDataFormat& format ); + virtual void* SetSizeInBuffer( void* buffer, size_t size, + const wxDataFormat& format ); + virtual size_t GetBufferOffset( const wxDataFormat& format ); +#endif + +private: + // the list of all (simple) data objects whose formats we support + wxSimpleDataObjectList m_dataObjects; + + // the index of the preferred one (0 initially, so by default the first + // one is the preferred) + size_t m_preferred; + + wxDataFormat m_receivedFormat; + + wxDECLARE_NO_COPY_CLASS(wxDataObjectComposite); +}; + +// ============================================================================ +// Standard implementations of wxDataObjectSimple which can be used directly +// (i.e. without having to derive from them) for standard data type transfers. +// +// Note that although all of them can work with provided data, you can also +// override their virtual GetXXX() functions to only provide data on demand. +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxTextDataObject contains text data +// ---------------------------------------------------------------------------- + +#if wxUSE_UNICODE + #if defined(__WXGTK20__) + #define wxNEEDS_UTF8_FOR_TEXT_DATAOBJ + #elif defined(__WXMAC__) + #define wxNEEDS_UTF16_FOR_TEXT_DATAOBJ + #endif +#endif // wxUSE_UNICODE + +class WXDLLIMPEXP_CORE wxHTMLDataObject : public wxDataObjectSimple +{ +public: + // ctor: you can specify the text here or in SetText(), or override + // GetText() + wxHTMLDataObject(const wxString& html = wxEmptyString) + : wxDataObjectSimple(wxDF_HTML), + m_html(html) + { + } + + // virtual functions which you may override if you want to provide text on + // demand only - otherwise, the trivial default versions will be used + virtual size_t GetLength() const { return m_html.Len() + 1; } + virtual wxString GetHTML() const { return m_html; } + virtual void SetHTML(const wxString& html) { m_html = html; } + + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t len, const void *buf); + + // Must provide overloads to avoid hiding them (and warnings about it) + virtual size_t GetDataSize(const wxDataFormat&) const + { + return GetDataSize(); + } + virtual bool GetDataHere(const wxDataFormat&, void *buf) const + { + return GetDataHere(buf); + } + virtual bool SetData(const wxDataFormat&, size_t len, const void *buf) + { + return SetData(len, buf); + } + +private: + wxString m_html; +}; + +class WXDLLIMPEXP_CORE wxTextDataObject : public wxDataObjectSimple +{ +public: + // ctor: you can specify the text here or in SetText(), or override + // GetText() + wxTextDataObject(const wxString& text = wxEmptyString) + : wxDataObjectSimple( +#if wxUSE_UNICODE + wxDF_UNICODETEXT +#else + wxDF_TEXT +#endif + ), + m_text(text) + { + } + + // virtual functions which you may override if you want to provide text on + // demand only - otherwise, the trivial default versions will be used + virtual size_t GetTextLength() const { return m_text.Len() + 1; } + virtual wxString GetText() const { return m_text; } + virtual void SetText(const wxString& text) { m_text = text; } + + // implement base class pure virtuals + // ---------------------------------- + + // some platforms have 2 and not 1 format for text data +#if defined(wxNEEDS_UTF8_FOR_TEXT_DATAOBJ) || defined(wxNEEDS_UTF16_FOR_TEXT_DATAOBJ) + virtual size_t GetFormatCount(Direction WXUNUSED(dir) = Get) const { return 2; } + virtual void GetAllFormats(wxDataFormat *formats, + wxDataObjectBase::Direction WXUNUSED(dir) = Get) const; + + virtual size_t GetDataSize() const { return GetDataSize(GetPreferredFormat()); } + virtual bool GetDataHere(void *buf) const { return GetDataHere(GetPreferredFormat(), buf); } + virtual bool SetData(size_t len, const void *buf) { return SetData(GetPreferredFormat(), len, buf); } + + size_t GetDataSize(const wxDataFormat& format) const; + bool GetDataHere(const wxDataFormat& format, void *pBuf) const; + bool SetData(const wxDataFormat& format, size_t nLen, const void* pBuf); +#else // !wxNEEDS_UTF{8,16}_FOR_TEXT_DATAOBJ + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t len, const void *buf); + // Must provide overloads to avoid hiding them (and warnings about it) + virtual size_t GetDataSize(const wxDataFormat&) const + { + return GetDataSize(); + } + virtual bool GetDataHere(const wxDataFormat&, void *buf) const + { + return GetDataHere(buf); + } + virtual bool SetData(const wxDataFormat&, size_t len, const void *buf) + { + return SetData(len, buf); + } +#endif // different wxTextDataObject implementations + +private: + wxString m_text; + + wxDECLARE_NO_COPY_CLASS(wxTextDataObject); +}; + +// ---------------------------------------------------------------------------- +// wxBitmapDataObject contains a bitmap +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxBitmapDataObjectBase : public wxDataObjectSimple +{ +public: + // ctor: you can specify the bitmap here or in SetBitmap(), or override + // GetBitmap() + wxBitmapDataObjectBase(const wxBitmap& bitmap = wxNullBitmap) + : wxDataObjectSimple(wxDF_BITMAP), m_bitmap(bitmap) + { + } + + // virtual functions which you may override if you want to provide data on + // demand only - otherwise, the trivial default versions will be used + virtual wxBitmap GetBitmap() const { return m_bitmap; } + virtual void SetBitmap(const wxBitmap& bitmap) { m_bitmap = bitmap; } + +protected: + wxBitmap m_bitmap; + + wxDECLARE_NO_COPY_CLASS(wxBitmapDataObjectBase); +}; + +// ---------------------------------------------------------------------------- +// wxFileDataObject contains a list of filenames +// +// NB: notice that this is a "write only" object, it can only be filled with +// data from drag and drop operation. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFileDataObjectBase : public wxDataObjectSimple +{ +public: + // ctor: use AddFile() later to fill the array + wxFileDataObjectBase() : wxDataObjectSimple(wxDF_FILENAME) { } + + // get a reference to our array + const wxArrayString& GetFilenames() const { return m_filenames; } + +protected: + wxArrayString m_filenames; + + wxDECLARE_NO_COPY_CLASS(wxFileDataObjectBase); +}; + +// ---------------------------------------------------------------------------- +// wxCustomDataObject contains arbitrary untyped user data. +// +// It is understood that this data can be copied bitwise. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxCustomDataObject : public wxDataObjectSimple +{ +public: + // if you don't specify the format in the ctor, you can still use + // SetFormat() later + wxCustomDataObject(const wxDataFormat& format = wxFormatInvalid); + + // the dtor calls Free() + virtual ~wxCustomDataObject(); + + // you can call SetData() to set m_data: it will make a copy of the data + // you pass - or you can use TakeData() which won't copy anything, but + // will take ownership of data (i.e. will call Free() on it later) + void TakeData(size_t size, void *data); + + // this function is called to allocate "size" bytes of memory from + // SetData(). The default version uses operator new[]. + virtual void *Alloc(size_t size); + + // this function is called when the data is freed, you may override it to + // anything you want (or may be nothing at all). The default version calls + // operator delete[] on m_data + virtual void Free(); + + // get data: you may override these functions if you wish to provide data + // only when it's requested + virtual size_t GetSize() const { return m_size; } + virtual void *GetData() const { return m_data; } + + // implement base class pure virtuals + // ---------------------------------- + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t size, const void *buf); + // Must provide overloads to avoid hiding them (and warnings about it) + virtual size_t GetDataSize(const wxDataFormat&) const + { + return GetDataSize(); + } + virtual bool GetDataHere(const wxDataFormat&, void *buf) const + { + return GetDataHere(buf); + } + virtual bool SetData(const wxDataFormat&, size_t len, const void *buf) + { + return SetData(len, buf); + } + +private: + size_t m_size; + void *m_data; + + wxDECLARE_NO_COPY_CLASS(wxCustomDataObject); +}; + +// ---------------------------------------------------------------------------- +// include platform-specific declarations of wxXXXBase classes +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/ole/dataobj2.h" + // wxURLDataObject defined in msw/ole/dataobj2.h +#elif defined(__WXGTK20__) + #include "wx/gtk/dataobj2.h" + // wxURLDataObject defined in msw/ole/dataobj2.h + +#else + #if defined(__WXGTK__) + #include "wx/gtk1/dataobj2.h" + #elif defined(__WXX11__) + #include "wx/x11/dataobj2.h" + #elif defined(__WXMOTIF__) + #include "wx/motif/dataobj2.h" + #elif defined(__WXMAC__) + #include "wx/osx/dataobj2.h" + #elif defined(__WXCOCOA__) + #include "wx/cocoa/dataobj2.h" + #elif defined(__WXPM__) + #include "wx/os2/dataobj2.h" + #endif + + // wxURLDataObject is simply wxTextDataObject with a different name + class WXDLLIMPEXP_CORE wxURLDataObject : public wxTextDataObject + { + public: + wxURLDataObject(const wxString& url = wxEmptyString) + : wxTextDataObject(url) + { + } + + wxString GetURL() const { return GetText(); } + void SetURL(const wxString& url) { SetText(url); } + }; +#endif + +#endif // wxUSE_DATAOBJ + +#endif // _WX_DATAOBJ_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/dataview.h b/wxmsw/include/wx-3.0/wx/dataview.h new file mode 100644 index 00000000..298ab7f9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dataview.h @@ -0,0 +1,1350 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dataview.h +// Purpose: wxDataViewCtrl base classes +// Author: Robert Roebling +// Modified by: Bo Yang +// Created: 08.01.06 +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DATAVIEW_H_BASE_ +#define _WX_DATAVIEW_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_DATAVIEWCTRL + +#include "wx/textctrl.h" +#include "wx/headercol.h" +#include "wx/variant.h" +#include "wx/dnd.h" // For wxDragResult declaration only. +#include "wx/dynarray.h" +#include "wx/icon.h" +#include "wx/itemid.h" +#include "wx/weakref.h" +#include "wx/vector.h" +#include "wx/dataobj.h" +#include "wx/withimages.h" + +class WXDLLIMPEXP_FWD_CORE wxImageList; + +#if !(defined(__WXGTK20__) || defined(__WXOSX__)) || defined(__WXUNIVERSAL__) +// #if !(defined(__WXOSX__)) || defined(__WXUNIVERSAL__) + #define wxHAS_GENERIC_DATAVIEWCTRL +#endif + +#ifdef wxHAS_GENERIC_DATAVIEWCTRL + // this symbol doesn't follow the convention for wxUSE_XXX symbols which + // are normally always defined as either 0 or 1, so its use is deprecated + // and it only exists for backwards compatibility, don't use it any more + // and use wxHAS_GENERIC_DATAVIEWCTRL instead + #define wxUSE_GENERICDATAVIEWCTRL +#endif + +// ---------------------------------------------------------------------------- +// wxDataViewCtrl globals +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_ADV wxDataViewModel; +class WXDLLIMPEXP_FWD_ADV wxDataViewCtrl; +class WXDLLIMPEXP_FWD_ADV wxDataViewColumn; +class WXDLLIMPEXP_FWD_ADV wxDataViewRenderer; +class WXDLLIMPEXP_FWD_ADV wxDataViewModelNotifier; + +extern WXDLLIMPEXP_DATA_ADV(const char) wxDataViewCtrlNameStr[]; + +// ---------------------------------------------------------------------------- +// wxDataViewCtrl flags +// ---------------------------------------------------------------------------- + +// size of a wxDataViewRenderer without contents: +#define wxDVC_DEFAULT_RENDERER_SIZE 20 + +// the default width of new (text) columns: +#define wxDVC_DEFAULT_WIDTH 80 + +// the default width of new toggle columns: +#define wxDVC_TOGGLE_DEFAULT_WIDTH 30 + +// the default minimal width of the columns: +#define wxDVC_DEFAULT_MINWIDTH 30 + +// The default alignment of wxDataViewRenderers is to take +// the alignment from the column it owns. +#define wxDVR_DEFAULT_ALIGNMENT -1 + + +// --------------------------------------------------------- +// wxDataViewItem +// --------------------------------------------------------- + +// Make it a class and not a typedef to allow forward declaring it. +class wxDataViewItem : public wxItemId +{ +public: + wxDataViewItem() : wxItemId() { } + wxEXPLICIT wxDataViewItem(void* pItem) : wxItemId(pItem) { } +}; + +WX_DEFINE_ARRAY(wxDataViewItem, wxDataViewItemArray); + +// --------------------------------------------------------- +// wxDataViewModelNotifier +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewModelNotifier +{ +public: + wxDataViewModelNotifier() { m_owner = NULL; } + virtual ~wxDataViewModelNotifier() { m_owner = NULL; } + + virtual bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ) = 0; + virtual bool ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item ) = 0; + virtual bool ItemChanged( const wxDataViewItem &item ) = 0; + virtual bool ItemsAdded( const wxDataViewItem &parent, const wxDataViewItemArray &items ); + virtual bool ItemsDeleted( const wxDataViewItem &parent, const wxDataViewItemArray &items ); + virtual bool ItemsChanged( const wxDataViewItemArray &items ); + virtual bool ValueChanged( const wxDataViewItem &item, unsigned int col ) = 0; + virtual bool Cleared() = 0; + + // some platforms, such as GTK+, may need a two step procedure for ::Reset() + virtual bool BeforeReset() { return true; } + virtual bool AfterReset() { return Cleared(); } + + virtual void Resort() = 0; + + void SetOwner( wxDataViewModel *owner ) { m_owner = owner; } + wxDataViewModel *GetOwner() const { return m_owner; } + +private: + wxDataViewModel *m_owner; +}; + + + +// ---------------------------------------------------------------------------- +// wxDataViewItemAttr: a structure containing the visual attributes of an item +// ---------------------------------------------------------------------------- + +// TODO: this should be renamed to wxItemAttr or something general like this + +class WXDLLIMPEXP_ADV wxDataViewItemAttr +{ +public: + // ctors + wxDataViewItemAttr() + { + m_bold = false; + m_italic = false; + } + + // setters + void SetColour(const wxColour& colour) { m_colour = colour; } + void SetBold( bool set ) { m_bold = set; } + void SetItalic( bool set ) { m_italic = set; } + void SetBackgroundColour(const wxColour& colour) { m_bgColour = colour; } + + // accessors + bool HasColour() const { return m_colour.IsOk(); } + const wxColour& GetColour() const { return m_colour; } + + bool HasFont() const { return m_bold || m_italic; } + bool GetBold() const { return m_bold; } + bool GetItalic() const { return m_italic; } + + bool HasBackgroundColour() const { return m_bgColour.IsOk(); } + const wxColour& GetBackgroundColour() const { return m_bgColour; } + + bool IsDefault() const { return !(HasColour() || HasFont() || HasBackgroundColour()); } + + // Return the font based on the given one with this attribute applied to it. + wxFont GetEffectiveFont(const wxFont& font) const; + +private: + wxColour m_colour; + bool m_bold; + bool m_italic; + wxColour m_bgColour; +}; + + +// --------------------------------------------------------- +// wxDataViewModel +// --------------------------------------------------------- + +WX_DECLARE_LIST_WITH_DECL(wxDataViewModelNotifier, wxDataViewModelNotifiers, + class WXDLLIMPEXP_ADV); + +class WXDLLIMPEXP_ADV wxDataViewModel: public wxRefCounter +{ +public: + wxDataViewModel(); + + virtual unsigned int GetColumnCount() const = 0; + + // return type as reported by wxVariant + virtual wxString GetColumnType( unsigned int col ) const = 0; + + // get value into a wxVariant + virtual void GetValue( wxVariant &variant, + const wxDataViewItem &item, unsigned int col ) const = 0; + + // return true if the given item has a value to display in the given + // column: this is always true except for container items which by default + // only show their label in the first column (but see HasContainerColumns()) + bool HasValue(const wxDataViewItem& item, unsigned col) const + { + return col == 0 || !IsContainer(item) || HasContainerColumns(item); + } + + // usually ValueChanged() should be called after changing the value in the + // model to update the control, ChangeValue() does it on its own while + // SetValue() does not -- so while you will override SetValue(), you should + // be usually calling ChangeValue() + virtual bool SetValue(const wxVariant &variant, + const wxDataViewItem &item, + unsigned int col) = 0; + + bool ChangeValue(const wxVariant& variant, + const wxDataViewItem& item, + unsigned int col) + { + return SetValue(variant, item, col) && ValueChanged(item, col); + } + + // Get text attribute, return false of default attributes should be used + virtual bool GetAttr(const wxDataViewItem &WXUNUSED(item), + unsigned int WXUNUSED(col), + wxDataViewItemAttr &WXUNUSED(attr)) const + { + return false; + } + + // Override this if you want to disable specific items + virtual bool IsEnabled(const wxDataViewItem &WXUNUSED(item), + unsigned int WXUNUSED(col)) const + { + return true; + } + + // define hierarchy + virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const = 0; + virtual bool IsContainer( const wxDataViewItem &item ) const = 0; + // Is the container just a header or an item with all columns + virtual bool HasContainerColumns(const wxDataViewItem& WXUNUSED(item)) const + { return false; } + virtual unsigned int GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const = 0; + + // delegated notifiers + bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ); + bool ItemsAdded( const wxDataViewItem &parent, const wxDataViewItemArray &items ); + bool ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item ); + bool ItemsDeleted( const wxDataViewItem &parent, const wxDataViewItemArray &items ); + bool ItemChanged( const wxDataViewItem &item ); + bool ItemsChanged( const wxDataViewItemArray &items ); + bool ValueChanged( const wxDataViewItem &item, unsigned int col ); + bool Cleared(); + + // some platforms, such as GTK+, may need a two step procedure for ::Reset() + bool BeforeReset(); + bool AfterReset(); + + + // delegated action + virtual void Resort(); + + void AddNotifier( wxDataViewModelNotifier *notifier ); + void RemoveNotifier( wxDataViewModelNotifier *notifier ); + + // default compare function + virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, + unsigned int column, bool ascending ) const; + virtual bool HasDefaultCompare() const { return false; } + + // internal + virtual bool IsListModel() const { return false; } + virtual bool IsVirtualListModel() const { return false; } + +protected: + // the user should not delete this class directly: he should use DecRef() instead! + virtual ~wxDataViewModel() { } + + wxDataViewModelNotifiers m_notifiers; +}; + +// ---------------------------------------------------------------------------- +// wxDataViewListModel: a model of a list, i.e. flat data structure without any +// branches/containers, used as base class by wxDataViewIndexListModel and +// wxDataViewVirtualListModel +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewListModel : public wxDataViewModel +{ +public: + // derived classes should override these methods instead of + // {Get,Set}Value() and GetAttr() inherited from the base class + + virtual void GetValueByRow(wxVariant &variant, + unsigned row, unsigned col) const = 0; + + virtual bool SetValueByRow(const wxVariant &variant, + unsigned row, unsigned col) = 0; + + virtual bool + GetAttrByRow(unsigned WXUNUSED(row), unsigned WXUNUSED(col), + wxDataViewItemAttr &WXUNUSED(attr)) const + { + return false; + } + + virtual bool IsEnabledByRow(unsigned int WXUNUSED(row), + unsigned int WXUNUSED(col)) const + { + return true; + } + + + // helper methods provided by list models only + virtual unsigned GetRow( const wxDataViewItem &item ) const = 0; + + // returns the number of rows + virtual unsigned int GetCount() const = 0; + + // implement some base class pure virtual directly + virtual wxDataViewItem + GetParent( const wxDataViewItem & WXUNUSED(item) ) const + { + // items never have valid parent in this model + return wxDataViewItem(); + } + + virtual bool IsContainer( const wxDataViewItem &item ) const + { + // only the invisible (and invalid) root item has children + return !item.IsOk(); + } + + // and implement some others by forwarding them to our own ones + virtual void GetValue( wxVariant &variant, + const wxDataViewItem &item, unsigned int col ) const + { + GetValueByRow(variant, GetRow(item), col); + } + + virtual bool SetValue( const wxVariant &variant, + const wxDataViewItem &item, unsigned int col ) + { + return SetValueByRow( variant, GetRow(item), col ); + } + + virtual bool GetAttr(const wxDataViewItem &item, unsigned int col, + wxDataViewItemAttr &attr) const + { + return GetAttrByRow( GetRow(item), col, attr ); + } + + virtual bool IsEnabled(const wxDataViewItem &item, unsigned int col) const + { + return IsEnabledByRow( GetRow(item), col ); + } + + + virtual bool IsListModel() const { return true; } +}; + +// --------------------------------------------------------- +// wxDataViewIndexListModel +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewIndexListModel: public wxDataViewListModel +{ +public: + wxDataViewIndexListModel( unsigned int initial_size = 0 ); + + void RowPrepended(); + void RowInserted( unsigned int before ); + void RowAppended(); + void RowDeleted( unsigned int row ); + void RowsDeleted( const wxArrayInt &rows ); + void RowChanged( unsigned int row ); + void RowValueChanged( unsigned int row, unsigned int col ); + void Reset( unsigned int new_size ); + + // convert to/from row/wxDataViewItem + + virtual unsigned GetRow( const wxDataViewItem &item ) const; + wxDataViewItem GetItem( unsigned int row ) const; + + // implement base methods + virtual unsigned int GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const; + + unsigned int GetCount() const { return m_hash.GetCount(); } + +private: + wxDataViewItemArray m_hash; + unsigned int m_nextFreeID; + bool m_ordered; +}; + +// --------------------------------------------------------- +// wxDataViewVirtualListModel +// --------------------------------------------------------- + +#ifdef __WXMAC__ +// better than nothing +typedef wxDataViewIndexListModel wxDataViewVirtualListModel; +#else + +class WXDLLIMPEXP_ADV wxDataViewVirtualListModel: public wxDataViewListModel +{ +public: + wxDataViewVirtualListModel( unsigned int initial_size = 0 ); + + void RowPrepended(); + void RowInserted( unsigned int before ); + void RowAppended(); + void RowDeleted( unsigned int row ); + void RowsDeleted( const wxArrayInt &rows ); + void RowChanged( unsigned int row ); + void RowValueChanged( unsigned int row, unsigned int col ); + void Reset( unsigned int new_size ); + + // convert to/from row/wxDataViewItem + + virtual unsigned GetRow( const wxDataViewItem &item ) const; + wxDataViewItem GetItem( unsigned int row ) const; + + // compare based on index + + virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, + unsigned int column, bool ascending ) const; + virtual bool HasDefaultCompare() const; + + // implement base methods + virtual unsigned int GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const; + + unsigned int GetCount() const { return m_size; } + + // internal + virtual bool IsVirtualListModel() const { return true; } + +private: + unsigned int m_size; +}; +#endif + +// ---------------------------------------------------------------------------- +// wxDataViewRenderer and related classes +// ---------------------------------------------------------------------------- + +#include "wx/dvrenderers.h" + +// --------------------------------------------------------- +// wxDataViewColumnBase +// --------------------------------------------------------- + +// for compatibility only, do not use +enum wxDataViewColumnFlags +{ + wxDATAVIEW_COL_RESIZABLE = wxCOL_RESIZABLE, + wxDATAVIEW_COL_SORTABLE = wxCOL_SORTABLE, + wxDATAVIEW_COL_REORDERABLE = wxCOL_REORDERABLE, + wxDATAVIEW_COL_HIDDEN = wxCOL_HIDDEN +}; + +class WXDLLIMPEXP_ADV wxDataViewColumnBase : public wxSettableHeaderColumn +{ +public: + // ctor for the text columns: takes ownership of renderer + wxDataViewColumnBase(wxDataViewRenderer *renderer, + unsigned int model_column) + { + Init(renderer, model_column); + } + + // ctor for the bitmap columns + wxDataViewColumnBase(const wxBitmap& bitmap, + wxDataViewRenderer *renderer, + unsigned int model_column) + : m_bitmap(bitmap) + { + Init(renderer, model_column); + } + + virtual ~wxDataViewColumnBase(); + + // setters: + virtual void SetOwner( wxDataViewCtrl *owner ) + { m_owner = owner; } + + // getters: + unsigned int GetModelColumn() const { return static_cast(m_model_column); } + wxDataViewCtrl *GetOwner() const { return m_owner; } + wxDataViewRenderer* GetRenderer() const { return m_renderer; } + + // implement some of base class pure virtuals (the rest is port-dependent + // and done differently in generic and native versions) + virtual void SetBitmap( const wxBitmap& bitmap ) { m_bitmap = bitmap; } + virtual wxBitmap GetBitmap() const { return m_bitmap; } + +protected: + wxDataViewRenderer *m_renderer; + int m_model_column; + wxBitmap m_bitmap; + wxDataViewCtrl *m_owner; + +private: + // common part of all ctors + void Init(wxDataViewRenderer *renderer, unsigned int model_column); +}; + +// --------------------------------------------------------- +// wxDataViewCtrlBase +// --------------------------------------------------------- + +#define wxDV_SINGLE 0x0000 // for convenience +#define wxDV_MULTIPLE 0x0001 // can select multiple items + +#define wxDV_NO_HEADER 0x0002 // column titles not visible +#define wxDV_HORIZ_RULES 0x0004 // light horizontal rules between rows +#define wxDV_VERT_RULES 0x0008 // light vertical rules between columns + +#define wxDV_ROW_LINES 0x0010 // alternating colour in rows +#define wxDV_VARIABLE_LINE_HEIGHT 0x0020 // variable line height + +class WXDLLIMPEXP_ADV wxDataViewCtrlBase: public wxControl +{ +public: + wxDataViewCtrlBase(); + virtual ~wxDataViewCtrlBase(); + + // model + // ----- + + virtual bool AssociateModel( wxDataViewModel *model ); + wxDataViewModel* GetModel(); + const wxDataViewModel* GetModel() const; + + + // column management + // ----------------- + + wxDataViewColumn *PrependTextColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *PrependIconTextColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *PrependToggleColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *PrependProgressColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_DEFAULT_WIDTH, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *PrependDateColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *PrependBitmapColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *PrependTextColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *PrependIconTextColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *PrependToggleColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *PrependProgressColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_DEFAULT_WIDTH, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *PrependDateColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *PrependBitmapColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE ); + + wxDataViewColumn *AppendTextColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *AppendIconTextColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *AppendToggleColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *AppendProgressColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_DEFAULT_WIDTH, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *AppendDateColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *AppendBitmapColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *AppendTextColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *AppendIconTextColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *AppendToggleColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *AppendProgressColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_DEFAULT_WIDTH, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *AppendDateColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1, + wxAlignment align = wxALIGN_NOT, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *AppendBitmapColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE ); + + virtual bool PrependColumn( wxDataViewColumn *col ); + virtual bool InsertColumn( unsigned int pos, wxDataViewColumn *col ); + virtual bool AppendColumn( wxDataViewColumn *col ); + + virtual unsigned int GetColumnCount() const = 0; + virtual wxDataViewColumn* GetColumn( unsigned int pos ) const = 0; + virtual int GetColumnPosition( const wxDataViewColumn *column ) const = 0; + + virtual bool DeleteColumn( wxDataViewColumn *column ) = 0; + virtual bool ClearColumns() = 0; + + void SetExpanderColumn( wxDataViewColumn *col ) + { m_expander_column = col ; DoSetExpanderColumn(); } + wxDataViewColumn *GetExpanderColumn() const + { return m_expander_column; } + + virtual wxDataViewColumn *GetSortingColumn() const = 0; + + + // items management + // ---------------- + + void SetIndent( int indent ) + { m_indent = indent ; DoSetIndent(); } + int GetIndent() const + { return m_indent; } + + // Current item is the one used by the keyboard navigation, it is the same + // as the (unique) selected item in single selection mode so these + // functions are mostly useful for controls with wxDV_MULTIPLE style. + wxDataViewItem GetCurrentItem() const; + void SetCurrentItem(const wxDataViewItem& item); + + // Currently focused column of the current item or NULL if no column has focus + virtual wxDataViewColumn *GetCurrentColumn() const = 0; + + // Selection: both GetSelection() and GetSelections() can be used for the + // controls both with and without wxDV_MULTIPLE style. For single selection + // controls GetSelections() is not very useful however. And for multi + // selection controls GetSelection() returns an invalid item if more than + // one item is selected. Use GetSelectedItemsCount() or HasSelection() to + // check if any items are selected at all. + virtual int GetSelectedItemsCount() const = 0; + bool HasSelection() const { return GetSelectedItemsCount() != 0; } + wxDataViewItem GetSelection() const; + virtual int GetSelections( wxDataViewItemArray & sel ) const = 0; + virtual void SetSelections( const wxDataViewItemArray & sel ) = 0; + virtual void Select( const wxDataViewItem & item ) = 0; + virtual void Unselect( const wxDataViewItem & item ) = 0; + virtual bool IsSelected( const wxDataViewItem & item ) const = 0; + + virtual void SelectAll() = 0; + virtual void UnselectAll() = 0; + + virtual void Expand( const wxDataViewItem & item ) = 0; + virtual void ExpandAncestors( const wxDataViewItem & item ); + virtual void Collapse( const wxDataViewItem & item ) = 0; + virtual bool IsExpanded( const wxDataViewItem & item ) const = 0; + + virtual void EnsureVisible( const wxDataViewItem & item, + const wxDataViewColumn *column = NULL ) = 0; + virtual void HitTest( const wxPoint & point, wxDataViewItem &item, wxDataViewColumn* &column ) const = 0; + virtual wxRect GetItemRect( const wxDataViewItem & item, const wxDataViewColumn *column = NULL ) const = 0; + + virtual bool SetRowHeight( int WXUNUSED(rowHeight) ) { return false; } + + virtual void EditItem(const wxDataViewItem& item, const wxDataViewColumn *column) = 0; + + // Use EditItem() instead + wxDEPRECATED( void StartEditor(const wxDataViewItem& item, unsigned int column) ); + +#if wxUSE_DRAG_AND_DROP + virtual bool EnableDragSource(const wxDataFormat& WXUNUSED(format)) + { return false; } + virtual bool EnableDropTarget(const wxDataFormat& WXUNUSED(format)) + { return false; } +#endif // wxUSE_DRAG_AND_DROP + + // define control visual attributes + // -------------------------------- + + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL) + { + return wxControl::GetCompositeControlsDefaultAttributes(variant); + } + +protected: + virtual void DoSetExpanderColumn() = 0 ; + virtual void DoSetIndent() = 0; + +private: + // Implementation of the public Set/GetCurrentItem() methods which are only + // called in multi selection case (for single selection controls their + // implementation is trivial and is done in the base class itself). + virtual wxDataViewItem DoGetCurrentItem() const = 0; + virtual void DoSetCurrentItem(const wxDataViewItem& item) = 0; + + wxDataViewModel *m_model; + wxDataViewColumn *m_expander_column; + int m_indent ; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCtrlBase) +}; + +// ---------------------------------------------------------------------------- +// wxDataViewEvent - the event class for the wxDataViewCtrl notifications +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewEvent : public wxNotifyEvent +{ +public: + wxDataViewEvent(wxEventType commandType = wxEVT_NULL, int winid = 0) + : wxNotifyEvent(commandType, winid), + m_item(0), + m_col(-1), + m_model(NULL), + m_value(wxNullVariant), + m_column(NULL), + m_pos(-1,-1), + m_cacheFrom(0), + m_cacheTo(0), + m_editCancelled(false) +#if wxUSE_DRAG_AND_DROP + , m_dataObject(NULL), + m_dataBuffer(NULL), + m_dataSize(0), + m_dragFlags(0), + m_dropEffect(wxDragNone) +#endif + { } + + wxDataViewEvent(const wxDataViewEvent& event) + : wxNotifyEvent(event), + m_item(event.m_item), + m_col(event.m_col), + m_model(event.m_model), + m_value(event.m_value), + m_column(event.m_column), + m_pos(event.m_pos), + m_cacheFrom(event.m_cacheFrom), + m_cacheTo(event.m_cacheTo), + m_editCancelled(event.m_editCancelled) +#if wxUSE_DRAG_AND_DROP + , m_dataObject(event.m_dataObject), + m_dataFormat(event.m_dataFormat), + m_dataBuffer(event.m_dataBuffer), + m_dataSize(event.m_dataSize), + m_dragFlags(event.m_dragFlags), + m_dropEffect(event.m_dropEffect) +#endif + { } + + wxDataViewItem GetItem() const { return m_item; } + void SetItem( const wxDataViewItem &item ) { m_item = item; } + + int GetColumn() const { return m_col; } + void SetColumn( int col ) { m_col = col; } + + wxDataViewModel* GetModel() const { return m_model; } + void SetModel( wxDataViewModel *model ) { m_model = model; } + + const wxVariant &GetValue() const { return m_value; } + void SetValue( const wxVariant &value ) { m_value = value; } + + // for wxEVT_DATAVIEW_ITEM_EDITING_DONE only + bool IsEditCancelled() const { return m_editCancelled; } + void SetEditCanceled(bool editCancelled) { m_editCancelled = editCancelled; } + + // for wxEVT_DATAVIEW_COLUMN_HEADER_CLICKED only + void SetDataViewColumn( wxDataViewColumn *col ) { m_column = col; } + wxDataViewColumn *GetDataViewColumn() const { return m_column; } + + // for wxEVT_DATAVIEW_CONTEXT_MENU only + wxPoint GetPosition() const { return m_pos; } + void SetPosition( int x, int y ) { m_pos.x = x; m_pos.y = y; } + + // For wxEVT_DATAVIEW_CACHE_HINT + int GetCacheFrom() const { return m_cacheFrom; } + int GetCacheTo() const { return m_cacheTo; } + void SetCache(int from, int to) { m_cacheFrom = from; m_cacheTo = to; } + + +#if wxUSE_DRAG_AND_DROP + // For drag operations + void SetDataObject( wxDataObject *obj ) { m_dataObject = obj; } + wxDataObject *GetDataObject() const { return m_dataObject; } + + // For drop operations + void SetDataFormat( const wxDataFormat &format ) { m_dataFormat = format; } + wxDataFormat GetDataFormat() const { return m_dataFormat; } + void SetDataSize( size_t size ) { m_dataSize = size; } + size_t GetDataSize() const { return m_dataSize; } + void SetDataBuffer( void* buf ) { m_dataBuffer = buf;} + void *GetDataBuffer() const { return m_dataBuffer; } + void SetDragFlags( int flags ) { m_dragFlags = flags; } + int GetDragFlags() const { return m_dragFlags; } + void SetDropEffect( wxDragResult effect ) { m_dropEffect = effect; } + wxDragResult GetDropEffect() const { return m_dropEffect; } +#endif // wxUSE_DRAG_AND_DROP + + virtual wxEvent *Clone() const { return new wxDataViewEvent(*this); } + +protected: + wxDataViewItem m_item; + int m_col; + wxDataViewModel *m_model; + wxVariant m_value; + wxDataViewColumn *m_column; + wxPoint m_pos; + int m_cacheFrom; + int m_cacheTo; + bool m_editCancelled; + +#if wxUSE_DRAG_AND_DROP + wxDataObject *m_dataObject; + + wxDataFormat m_dataFormat; + void* m_dataBuffer; + size_t m_dataSize; + + int m_dragFlags; + wxDragResult m_dropEffect; +#endif // wxUSE_DRAG_AND_DROP + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewEvent) +}; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEvent ); + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_ACTIVATED, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_COLLAPSED, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_EXPANDED, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_COLLAPSING, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_EXPANDING, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_START_EDITING, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_EDITING_STARTED, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_EDITING_DONE, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, wxDataViewEvent ); + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_CONTEXT_MENU, wxDataViewEvent ); + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_COLUMN_HEADER_CLICK, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_COLUMN_SORTED, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_COLUMN_REORDERED, wxDataViewEvent ); + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_CACHE_HINT, wxDataViewEvent ); + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_BEGIN_DRAG, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_DROP, wxDataViewEvent ); + +typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&); + +#define wxDataViewEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxDataViewEventFunction, func) + +#define wx__DECLARE_DATAVIEWEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_DATAVIEW_ ## evt, id, wxDataViewEventHandler(fn)) + +#define EVT_DATAVIEW_SELECTION_CHANGED(id, fn) wx__DECLARE_DATAVIEWEVT(SELECTION_CHANGED, id, fn) + +#define EVT_DATAVIEW_ITEM_ACTIVATED(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_ACTIVATED, id, fn) +#define EVT_DATAVIEW_ITEM_COLLAPSING(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_COLLAPSING, id, fn) +#define EVT_DATAVIEW_ITEM_COLLAPSED(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_COLLAPSED, id, fn) +#define EVT_DATAVIEW_ITEM_EXPANDING(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_EXPANDING, id, fn) +#define EVT_DATAVIEW_ITEM_EXPANDED(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_EXPANDED, id, fn) +#define EVT_DATAVIEW_ITEM_START_EDITING(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_START_EDITING, id, fn) +#define EVT_DATAVIEW_ITEM_EDITING_STARTED(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_EDITING_STARTED, id, fn) +#define EVT_DATAVIEW_ITEM_EDITING_DONE(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_EDITING_DONE, id, fn) +#define EVT_DATAVIEW_ITEM_VALUE_CHANGED(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_VALUE_CHANGED, id, fn) + +#define EVT_DATAVIEW_ITEM_CONTEXT_MENU(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_CONTEXT_MENU, id, fn) + +#define EVT_DATAVIEW_COLUMN_HEADER_CLICK(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_CLICK, id, fn) +#define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_RIGHT_CLICK, id, fn) +#define EVT_DATAVIEW_COLUMN_SORTED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_SORTED, id, fn) +#define EVT_DATAVIEW_COLUMN_REORDERED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_REORDERED, id, fn) +#define EVT_DATAVIEW_CACHE_HINT(id, fn) wx__DECLARE_DATAVIEWEVT(CACHE_HINT, id, fn) + +#define EVT_DATAVIEW_ITEM_BEGIN_DRAG(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_BEGIN_DRAG, id, fn) +#define EVT_DATAVIEW_ITEM_DROP_POSSIBLE(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_DROP_POSSIBLE, id, fn) +#define EVT_DATAVIEW_ITEM_DROP(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_DROP, id, fn) + +// Old and not documented synonym, don't use. +#define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED(id, fn) EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK(id, fn) + +#ifdef wxHAS_GENERIC_DATAVIEWCTRL + #include "wx/generic/dataview.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/dataview.h" +#elif defined(__WXMAC__) + #include "wx/osx/dataview.h" +#else + #error "unknown native wxDataViewCtrl implementation" +#endif + +//----------------------------------------------------------------------------- +// wxDataViewListStore +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewListStoreLine +{ +public: + wxDataViewListStoreLine( wxUIntPtr data = 0 ) + { + m_data = data; + } + + void SetData( wxUIntPtr data ) + { m_data = data; } + wxUIntPtr GetData() const + { return m_data; } + + wxVector m_values; + +private: + wxUIntPtr m_data; +}; + + +class WXDLLIMPEXP_ADV wxDataViewListStore: public wxDataViewIndexListModel +{ +public: + wxDataViewListStore(); + ~wxDataViewListStore(); + + void PrependColumn( const wxString &varianttype ); + void InsertColumn( unsigned int pos, const wxString &varianttype ); + void AppendColumn( const wxString &varianttype ); + + void AppendItem( const wxVector &values, wxUIntPtr data = 0 ); + void PrependItem( const wxVector &values, wxUIntPtr data = 0 ); + void InsertItem( unsigned int row, const wxVector &values, wxUIntPtr data = 0 ); + void DeleteItem( unsigned int pos ); + void DeleteAllItems(); + + unsigned int GetItemCount() const; + + void SetItemData( const wxDataViewItem& item, wxUIntPtr data ); + wxUIntPtr GetItemData( const wxDataViewItem& item ) const; + + // override base virtuals + + virtual unsigned int GetColumnCount() const; + + virtual wxString GetColumnType( unsigned int col ) const; + + virtual void GetValueByRow( wxVariant &value, + unsigned int row, unsigned int col ) const; + + virtual bool SetValueByRow( const wxVariant &value, + unsigned int row, unsigned int col ); + + +public: + wxVector m_data; + wxArrayString m_cols; +}; + +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewListCtrl: public wxDataViewCtrl +{ +public: + wxDataViewListCtrl(); + wxDataViewListCtrl( wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxDV_ROW_LINES, + const wxValidator& validator = wxDefaultValidator ); + ~wxDataViewListCtrl(); + + bool Create( wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxDV_ROW_LINES, + const wxValidator& validator = wxDefaultValidator ); + + wxDataViewListStore *GetStore() + { return (wxDataViewListStore*) GetModel(); } + const wxDataViewListStore *GetStore() const + { return (const wxDataViewListStore*) GetModel(); } + + int ItemToRow(const wxDataViewItem &item) const + { return item.IsOk() ? (int)GetStore()->GetRow(item) : wxNOT_FOUND; } + wxDataViewItem RowToItem(int row) const + { return row == wxNOT_FOUND ? wxDataViewItem() : GetStore()->GetItem(row); } + + int GetSelectedRow() const + { return ItemToRow(GetSelection()); } + void SelectRow(unsigned row) + { Select(RowToItem(row)); } + void UnselectRow(unsigned row) + { Unselect(RowToItem(row)); } + bool IsRowSelected(unsigned row) const + { return IsSelected(RowToItem(row)); } + + bool AppendColumn( wxDataViewColumn *column, const wxString &varianttype ); + bool PrependColumn( wxDataViewColumn *column, const wxString &varianttype ); + bool InsertColumn( unsigned int pos, wxDataViewColumn *column, const wxString &varianttype ); + + // overridden from base class + virtual bool PrependColumn( wxDataViewColumn *col ); + virtual bool InsertColumn( unsigned int pos, wxDataViewColumn *col ); + virtual bool AppendColumn( wxDataViewColumn *col ); + + wxDataViewColumn *AppendTextColumn( const wxString &label, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int width = -1, wxAlignment align = wxALIGN_LEFT, int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *AppendToggleColumn( const wxString &label, + wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, + int width = -1, wxAlignment align = wxALIGN_LEFT, int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *AppendProgressColumn( const wxString &label, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int width = -1, wxAlignment align = wxALIGN_LEFT, int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn *AppendIconTextColumn( const wxString &label, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int width = -1, wxAlignment align = wxALIGN_LEFT, int flags = wxDATAVIEW_COL_RESIZABLE ); + + void AppendItem( const wxVector &values, wxUIntPtr data = 0 ) + { GetStore()->AppendItem( values, data ); } + void PrependItem( const wxVector &values, wxUIntPtr data = 0 ) + { GetStore()->PrependItem( values, data ); } + void InsertItem( unsigned int row, const wxVector &values, wxUIntPtr data = 0 ) + { GetStore()->InsertItem( row, values, data ); } + void DeleteItem( unsigned row ) + { GetStore()->DeleteItem( row ); } + void DeleteAllItems() + { GetStore()->DeleteAllItems(); } + + void SetValue( const wxVariant &value, unsigned int row, unsigned int col ) + { GetStore()->SetValueByRow( value, row, col ); + GetStore()->RowValueChanged( row, col); } + void GetValue( wxVariant &value, unsigned int row, unsigned int col ) + { GetStore()->GetValueByRow( value, row, col ); } + + void SetTextValue( const wxString &value, unsigned int row, unsigned int col ) + { GetStore()->SetValueByRow( value, row, col ); + GetStore()->RowValueChanged( row, col); } + wxString GetTextValue( unsigned int row, unsigned int col ) const + { wxVariant value; GetStore()->GetValueByRow( value, row, col ); return value.GetString(); } + + void SetToggleValue( bool value, unsigned int row, unsigned int col ) + { GetStore()->SetValueByRow( value, row, col ); + GetStore()->RowValueChanged( row, col); } + bool GetToggleValue( unsigned int row, unsigned int col ) const + { wxVariant value; GetStore()->GetValueByRow( value, row, col ); return value.GetBool(); } + + void SetItemData( const wxDataViewItem& item, wxUIntPtr data ) + { GetStore()->SetItemData( item, data ); } + wxUIntPtr GetItemData( const wxDataViewItem& item ) const + { return GetStore()->GetItemData( item ); } + + int GetItemCount() const + { return GetStore()->GetItemCount(); } + + void OnSize( wxSizeEvent &event ); + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewListCtrl) +}; + +//----------------------------------------------------------------------------- +// wxDataViewTreeStore +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewTreeStoreNode +{ +public: + wxDataViewTreeStoreNode( wxDataViewTreeStoreNode *parent, + const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL ); + virtual ~wxDataViewTreeStoreNode(); + + void SetText( const wxString &text ) + { m_text = text; } + wxString GetText() const + { return m_text; } + void SetIcon( const wxIcon &icon ) + { m_icon = icon; } + const wxIcon &GetIcon() const + { return m_icon; } + void SetData( wxClientData *data ) + { if (m_data) delete m_data; m_data = data; } + wxClientData *GetData() const + { return m_data; } + + wxDataViewItem GetItem() const + { return wxDataViewItem( (void*) this ); } + + virtual bool IsContainer() + { return false; } + + wxDataViewTreeStoreNode *GetParent() + { return m_parent; } + +private: + wxDataViewTreeStoreNode *m_parent; + wxString m_text; + wxIcon m_icon; + wxClientData *m_data; +}; + +WX_DECLARE_LIST_WITH_DECL(wxDataViewTreeStoreNode, wxDataViewTreeStoreNodeList, + class WXDLLIMPEXP_ADV); + +class WXDLLIMPEXP_ADV wxDataViewTreeStoreContainerNode: public wxDataViewTreeStoreNode +{ +public: + wxDataViewTreeStoreContainerNode( wxDataViewTreeStoreNode *parent, + const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon, + wxClientData *data = NULL ); + virtual ~wxDataViewTreeStoreContainerNode(); + + const wxDataViewTreeStoreNodeList &GetChildren() const + { return m_children; } + wxDataViewTreeStoreNodeList &GetChildren() + { return m_children; } + + void SetExpandedIcon( const wxIcon &icon ) + { m_iconExpanded = icon; } + const wxIcon &GetExpandedIcon() const + { return m_iconExpanded; } + + void SetExpanded( bool expanded = true ) + { m_isExpanded = expanded; } + bool IsExpanded() const + { return m_isExpanded; } + + virtual bool IsContainer() + { return true; } + +private: + wxDataViewTreeStoreNodeList m_children; + wxIcon m_iconExpanded; + bool m_isExpanded; +}; + +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewTreeStore: public wxDataViewModel +{ +public: + wxDataViewTreeStore(); + ~wxDataViewTreeStore(); + + wxDataViewItem AppendItem( const wxDataViewItem& parent, + const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL ); + wxDataViewItem PrependItem( const wxDataViewItem& parent, + const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL ); + wxDataViewItem InsertItem( const wxDataViewItem& parent, const wxDataViewItem& previous, + const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL ); + + wxDataViewItem PrependContainer( const wxDataViewItem& parent, + const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon, + wxClientData *data = NULL ); + wxDataViewItem AppendContainer( const wxDataViewItem& parent, + const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon, + wxClientData *data = NULL ); + wxDataViewItem InsertContainer( const wxDataViewItem& parent, const wxDataViewItem& previous, + const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon, + wxClientData *data = NULL ); + + wxDataViewItem GetNthChild( const wxDataViewItem& parent, unsigned int pos ) const; + int GetChildCount( const wxDataViewItem& parent ) const; + + void SetItemText( const wxDataViewItem& item, const wxString &text ); + wxString GetItemText( const wxDataViewItem& item ) const; + void SetItemIcon( const wxDataViewItem& item, const wxIcon &icon ); + const wxIcon &GetItemIcon( const wxDataViewItem& item ) const; + void SetItemExpandedIcon( const wxDataViewItem& item, const wxIcon &icon ); + const wxIcon &GetItemExpandedIcon( const wxDataViewItem& item ) const; + void SetItemData( const wxDataViewItem& item, wxClientData *data ); + wxClientData *GetItemData( const wxDataViewItem& item ) const; + + void DeleteItem( const wxDataViewItem& item ); + void DeleteChildren( const wxDataViewItem& item ); + void DeleteAllItems(); + + // implement base methods + + virtual void GetValue( wxVariant &variant, + const wxDataViewItem &item, unsigned int col ) const; + virtual bool SetValue( const wxVariant &variant, + const wxDataViewItem &item, unsigned int col ); + virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const; + virtual bool IsContainer( const wxDataViewItem &item ) const; + virtual unsigned int GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const; + + virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, + unsigned int column, bool ascending ) const; + + virtual bool HasDefaultCompare() const + { return true; } + virtual unsigned int GetColumnCount() const + { return 1; } + virtual wxString GetColumnType( unsigned int WXUNUSED(col) ) const + { return wxT("wxDataViewIconText"); } + + wxDataViewTreeStoreNode *FindNode( const wxDataViewItem &item ) const; + wxDataViewTreeStoreContainerNode *FindContainerNode( const wxDataViewItem &item ) const; + wxDataViewTreeStoreNode *GetRoot() const { return m_root; } + +public: + wxDataViewTreeStoreNode *m_root; +}; + +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewTreeCtrl: public wxDataViewCtrl, + public wxWithImages +{ +public: + wxDataViewTreeCtrl() { } + wxDataViewTreeCtrl(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDV_NO_HEADER | wxDV_ROW_LINES, + const wxValidator& validator = wxDefaultValidator) + { + Create(parent, id, pos, size, style, validator); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDV_NO_HEADER | wxDV_ROW_LINES, + const wxValidator& validator = wxDefaultValidator); + + wxDataViewTreeStore *GetStore() + { return (wxDataViewTreeStore*) GetModel(); } + const wxDataViewTreeStore *GetStore() const + { return (const wxDataViewTreeStore*) GetModel(); } + + bool IsContainer( const wxDataViewItem& item ) const + { return GetStore()->IsContainer(item); } + + wxDataViewItem AppendItem( const wxDataViewItem& parent, + const wxString &text, int icon = NO_IMAGE, wxClientData *data = NULL ); + wxDataViewItem PrependItem( const wxDataViewItem& parent, + const wxString &text, int icon = NO_IMAGE, wxClientData *data = NULL ); + wxDataViewItem InsertItem( const wxDataViewItem& parent, const wxDataViewItem& previous, + const wxString &text, int icon = NO_IMAGE, wxClientData *data = NULL ); + + wxDataViewItem PrependContainer( const wxDataViewItem& parent, + const wxString &text, int icon = NO_IMAGE, int expanded = NO_IMAGE, + wxClientData *data = NULL ); + wxDataViewItem AppendContainer( const wxDataViewItem& parent, + const wxString &text, int icon = NO_IMAGE, int expanded = NO_IMAGE, + wxClientData *data = NULL ); + wxDataViewItem InsertContainer( const wxDataViewItem& parent, const wxDataViewItem& previous, + const wxString &text, int icon = NO_IMAGE, int expanded = NO_IMAGE, + wxClientData *data = NULL ); + + wxDataViewItem GetNthChild( const wxDataViewItem& parent, unsigned int pos ) const + { return GetStore()->GetNthChild(parent, pos); } + int GetChildCount( const wxDataViewItem& parent ) const + { return GetStore()->GetChildCount(parent); } + + void SetItemText( const wxDataViewItem& item, const wxString &text ); + wxString GetItemText( const wxDataViewItem& item ) const + { return GetStore()->GetItemText(item); } + void SetItemIcon( const wxDataViewItem& item, const wxIcon &icon ); + const wxIcon &GetItemIcon( const wxDataViewItem& item ) const + { return GetStore()->GetItemIcon(item); } + void SetItemExpandedIcon( const wxDataViewItem& item, const wxIcon &icon ); + const wxIcon &GetItemExpandedIcon( const wxDataViewItem& item ) const + { return GetStore()->GetItemExpandedIcon(item); } + void SetItemData( const wxDataViewItem& item, wxClientData *data ) + { GetStore()->SetItemData(item,data); } + wxClientData *GetItemData( const wxDataViewItem& item ) const + { return GetStore()->GetItemData(item); } + + void DeleteItem( const wxDataViewItem& item ); + void DeleteChildren( const wxDataViewItem& item ); + void DeleteAllItems(); + + void OnExpanded( wxDataViewEvent &event ); + void OnCollapsed( wxDataViewEvent &event ); + void OnSize( wxSizeEvent &event ); + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewTreeCtrl) +}; + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED wxEVT_DATAVIEW_SELECTION_CHANGED +#define wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED wxEVT_DATAVIEW_ITEM_ACTIVATED +#define wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED wxEVT_DATAVIEW_ITEM_COLLAPSED +#define wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED wxEVT_DATAVIEW_ITEM_EXPANDED +#define wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING wxEVT_DATAVIEW_ITEM_COLLAPSING +#define wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING wxEVT_DATAVIEW_ITEM_EXPANDING +#define wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING wxEVT_DATAVIEW_ITEM_START_EDITING +#define wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED wxEVT_DATAVIEW_ITEM_EDITING_STARTED +#define wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE wxEVT_DATAVIEW_ITEM_EDITING_DONE +#define wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED wxEVT_DATAVIEW_ITEM_VALUE_CHANGED +#define wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU wxEVT_DATAVIEW_ITEM_CONTEXT_MENU +#define wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK wxEVT_DATAVIEW_COLUMN_HEADER_CLICK +#define wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK +#define wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED wxEVT_DATAVIEW_COLUMN_SORTED +#define wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED wxEVT_DATAVIEW_COLUMN_REORDERED +#define wxEVT_COMMAND_DATAVIEW_CACHE_HINT wxEVT_DATAVIEW_CACHE_HINT +#define wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG wxEVT_DATAVIEW_ITEM_BEGIN_DRAG +#define wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE +#define wxEVT_COMMAND_DATAVIEW_ITEM_DROP wxEVT_DATAVIEW_ITEM_DROP + +#endif // wxUSE_DATAVIEWCTRL + +#endif + // _WX_DATAVIEW_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/datectrl.h b/wxmsw/include/wx-3.0/wx/datectrl.h new file mode 100644 index 00000000..6fa4367c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/datectrl.h @@ -0,0 +1,113 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/datectrl.h +// Purpose: implements wxDatePickerCtrl +// Author: Vadim Zeitlin +// Modified by: +// Created: 2005-01-09 +// Copyright: (c) 2005 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DATECTRL_H_ +#define _WX_DATECTRL_H_ + +#include "wx/defs.h" + +#if wxUSE_DATEPICKCTRL + +#include "wx/datetimectrl.h" // the base class + +#define wxDatePickerCtrlNameStr wxT("datectrl") + +// wxDatePickerCtrl styles +enum +{ + // default style on this platform, either wxDP_SPIN or wxDP_DROPDOWN + wxDP_DEFAULT = 0, + + // a spin control-like date picker (not supported in generic version) + wxDP_SPIN = 1, + + // a combobox-like date picker (not supported in mac version) + wxDP_DROPDOWN = 2, + + // always show century in the default date display (otherwise it depends on + // the system date format which may include the century or not) + wxDP_SHOWCENTURY = 4, + + // allow not having any valid date in the control (by default it always has + // some date, today initially if no valid date specified in ctor) + wxDP_ALLOWNONE = 8 +}; + +// ---------------------------------------------------------------------------- +// wxDatePickerCtrl: allow the user to enter the date +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDatePickerCtrlBase : public wxDateTimePickerCtrl +{ +public: + /* + The derived classes should implement ctor and Create() method with the + following signature: + + bool Create(wxWindow *parent, + wxWindowID id, + const wxDateTime& dt = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDP_DEFAULT | wxDP_SHOWCENTURY, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDatePickerCtrlNameStr); + */ + + /* + We inherit the methods to set/get the date from the base class. + + virtual void SetValue(const wxDateTime& dt) = 0; + virtual wxDateTime GetValue() const = 0; + */ + + // And add methods to set/get the allowed valid range for the dates. If + // either/both of them are invalid, there is no corresponding limit and if + // neither is set, GetRange() returns false. + virtual void SetRange(const wxDateTime& dt1, const wxDateTime& dt2) = 0; + virtual bool GetRange(wxDateTime *dt1, wxDateTime *dt2) const = 0; +}; + +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + #include "wx/msw/datectrl.h" + + #define wxHAS_NATIVE_DATEPICKCTRL +#elif defined(__WXOSX_COCOA__) && !defined(__WXUNIVERSAL__) + #include "wx/osx/datectrl.h" + + #define wxHAS_NATIVE_DATEPICKCTRL +#else + #include "wx/generic/datectrl.h" + + class WXDLLIMPEXP_ADV wxDatePickerCtrl : public wxDatePickerCtrlGeneric + { + public: + wxDatePickerCtrl() { } + wxDatePickerCtrl(wxWindow *parent, + wxWindowID id, + const wxDateTime& date = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDP_DEFAULT | wxDP_SHOWCENTURY, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDatePickerCtrlNameStr) + : wxDatePickerCtrlGeneric(parent, id, date, pos, size, style, validator, name) + { + } + + private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDatePickerCtrl) + }; +#endif + +#endif // wxUSE_DATEPICKCTRL + +#endif // _WX_DATECTRL_H_ + diff --git a/wxmsw/include/wx-3.0/wx/dateevt.h b/wxmsw/include/wx-3.0/wx/dateevt.h new file mode 100644 index 00000000..4131ab38 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dateevt.h @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/dateevt.h +// Purpose: declares wxDateEvent class +// Author: Vadim Zeitlin +// Modified by: +// Created: 2005-01-10 +// Copyright: (c) 2005 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DATEEVT_H_ +#define _WX_DATEEVT_H_ + +#include "wx/event.h" +#include "wx/datetime.h" +#include "wx/window.h" + +// ---------------------------------------------------------------------------- +// wxDateEvent: used by wxCalendarCtrl, wxDatePickerCtrl and wxTimePickerCtrl. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDateEvent : public wxCommandEvent +{ +public: + wxDateEvent() { } + wxDateEvent(wxWindow *win, const wxDateTime& dt, wxEventType type) + : wxCommandEvent(type, win->GetId()), + m_date(dt) + { + SetEventObject(win); + } + + const wxDateTime& GetDate() const { return m_date; } + void SetDate(const wxDateTime &date) { m_date = date; } + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxDateEvent(*this); } + +private: + wxDateTime m_date; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDateEvent) +}; + +// ---------------------------------------------------------------------------- +// event types and macros for handling them +// ---------------------------------------------------------------------------- + +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_ADV, wxEVT_DATE_CHANGED, wxDateEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_ADV, wxEVT_TIME_CHANGED, wxDateEvent); + +typedef void (wxEvtHandler::*wxDateEventFunction)(wxDateEvent&); + +#define wxDateEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxDateEventFunction, func) + +#define EVT_DATE_CHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_DATE_CHANGED, id, wxDateEventHandler(fn)) + +#define EVT_TIME_CHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_TIME_CHANGED, id, wxDateEventHandler(fn)) + +#endif // _WX_DATEEVT_H_ + diff --git a/wxmsw/include/wx-3.0/wx/datetime.h b/wxmsw/include/wx-3.0/wx/datetime.h new file mode 100644 index 00000000..f500985f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/datetime.h @@ -0,0 +1,2194 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/datetime.h +// Purpose: declarations of time/date related classes (wxDateTime, +// wxTimeSpan) +// Author: Vadim Zeitlin +// Modified by: +// Created: 10.02.99 +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DATETIME_H +#define _WX_DATETIME_H + +#include "wx/defs.h" + +#if wxUSE_DATETIME + +#ifdef __WXWINCE__ + #include "wx/msw/wince/time.h" +#else + #include +#endif // OS + +#include // for INT_MIN + +#include "wx/longlong.h" +#include "wx/anystr.h" + +class WXDLLIMPEXP_FWD_BASE wxDateTime; +class WXDLLIMPEXP_FWD_BASE wxTimeSpan; +class WXDLLIMPEXP_FWD_BASE wxDateSpan; +#ifdef __WINDOWS__ +struct _SYSTEMTIME; +#endif + +#include "wx/dynarray.h" + +// not all c-runtimes are based on 1/1/1970 being (time_t) 0 +// set this to the corresponding value in seconds 1/1/1970 has on your +// systems c-runtime + +#define WX_TIME_BASE_OFFSET 0 + +/* + * TODO + * + * + 1. Time zones with minutes (make TimeZone a class) + * ? 2. getdate() function like under Solaris + * + 3. text conversion for wxDateSpan + * + 4. pluggable modules for the workdays calculations + * 5. wxDateTimeHolidayAuthority for Easter and other christian feasts + */ + +/* + The three (main) classes declared in this header represent: + + 1. An absolute moment in the time (wxDateTime) + 2. A difference between two moments in the time, positive or negative + (wxTimeSpan) + 3. A logical difference between two dates expressed in + years/months/weeks/days (wxDateSpan) + + The following arithmetic operations are permitted (all others are not): + + addition + -------- + + wxDateTime + wxTimeSpan = wxDateTime + wxDateTime + wxDateSpan = wxDateTime + wxTimeSpan + wxTimeSpan = wxTimeSpan + wxDateSpan + wxDateSpan = wxDateSpan + + subtraction + ------------ + wxDateTime - wxDateTime = wxTimeSpan + wxDateTime - wxTimeSpan = wxDateTime + wxDateTime - wxDateSpan = wxDateTime + wxTimeSpan - wxTimeSpan = wxTimeSpan + wxDateSpan - wxDateSpan = wxDateSpan + + multiplication + -------------- + wxTimeSpan * number = wxTimeSpan + number * wxTimeSpan = wxTimeSpan + wxDateSpan * number = wxDateSpan + number * wxDateSpan = wxDateSpan + + unitary minus + ------------- + -wxTimeSpan = wxTimeSpan + -wxDateSpan = wxDateSpan + + For each binary operation OP (+, -, *) we have the following operatorOP=() as + a method and the method with a symbolic name OPER (Add, Subtract, Multiply) + as a synonym for it and another const method with the same name which returns + the changed copy of the object and operatorOP() as a global function which is + implemented in terms of the const version of OPEN. For the unary - we have + operator-() as a method, Neg() as synonym for it and Negate() which returns + the copy of the object with the changed sign. +*/ + +// an invalid/default date time object which may be used as the default +// argument for arguments of type wxDateTime; it is also returned by all +// functions returning wxDateTime on failure (this is why it is also called +// wxInvalidDateTime) +class WXDLLIMPEXP_FWD_BASE wxDateTime; + +extern WXDLLIMPEXP_DATA_BASE(const char) wxDefaultDateTimeFormat[]; +extern WXDLLIMPEXP_DATA_BASE(const char) wxDefaultTimeSpanFormat[]; +extern WXDLLIMPEXP_DATA_BASE(const wxDateTime) wxDefaultDateTime; + +#define wxInvalidDateTime wxDefaultDateTime + + +// ---------------------------------------------------------------------------- +// conditional compilation +// ---------------------------------------------------------------------------- + +// if configure detected strftime(), we have it too +#ifdef HAVE_STRFTIME + #define wxHAS_STRFTIME +// suppose everyone else has strftime except Win CE unless VC8 is used +#elif !defined(__WXWINCE__) || defined(__VISUALC8__) + #define wxHAS_STRFTIME +#endif + +// ---------------------------------------------------------------------------- +// wxDateTime represents an absolute moment in the time +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxDateTime +{ +public: + // types + // ------------------------------------------------------------------------ + + // a small unsigned integer type for storing things like minutes, + // seconds &c. It should be at least short (i.e. not char) to contain + // the number of milliseconds - it may also be 'int' because there is + // no size penalty associated with it in our code, we don't store any + // data in this format + typedef unsigned short wxDateTime_t; + + // constants + // ------------------------------------------------------------------------ + + // the timezones + enum TZ + { + // the time in the current time zone + Local, + + // zones from GMT (= Greenwich Mean Time): they're guaranteed to be + // consequent numbers, so writing something like `GMT0 + offset' is + // safe if abs(offset) <= 12 + + // underscore stands for minus + GMT_12, GMT_11, GMT_10, GMT_9, GMT_8, GMT_7, + GMT_6, GMT_5, GMT_4, GMT_3, GMT_2, GMT_1, + GMT0, + GMT1, GMT2, GMT3, GMT4, GMT5, GMT6, + GMT7, GMT8, GMT9, GMT10, GMT11, GMT12, GMT13, + // Note that GMT12 and GMT_12 are not the same: there is a difference + // of exactly one day between them + + // some symbolic names for TZ + + // Europe + WET = GMT0, // Western Europe Time + WEST = GMT1, // Western Europe Summer Time + CET = GMT1, // Central Europe Time + CEST = GMT2, // Central Europe Summer Time + EET = GMT2, // Eastern Europe Time + EEST = GMT3, // Eastern Europe Summer Time + MSK = GMT3, // Moscow Time + MSD = GMT4, // Moscow Summer Time + + // US and Canada + AST = GMT_4, // Atlantic Standard Time + ADT = GMT_3, // Atlantic Daylight Time + EST = GMT_5, // Eastern Standard Time + EDT = GMT_4, // Eastern Daylight Saving Time + CST = GMT_6, // Central Standard Time + CDT = GMT_5, // Central Daylight Saving Time + MST = GMT_7, // Mountain Standard Time + MDT = GMT_6, // Mountain Daylight Saving Time + PST = GMT_8, // Pacific Standard Time + PDT = GMT_7, // Pacific Daylight Saving Time + HST = GMT_10, // Hawaiian Standard Time + AKST = GMT_9, // Alaska Standard Time + AKDT = GMT_8, // Alaska Daylight Saving Time + + // Australia + + A_WST = GMT8, // Western Standard Time + A_CST = GMT13 + 1, // Central Standard Time (+9.5) + A_EST = GMT10, // Eastern Standard Time + A_ESST = GMT11, // Eastern Summer Time + + // New Zealand + NZST = GMT12, // Standard Time + NZDT = GMT13, // Daylight Saving Time + + // TODO add more symbolic timezone names here + + // Universal Coordinated Time = the new and politically correct name + // for GMT + UTC = GMT0 + }; + + // the calendar systems we know about: notice that it's valid (for + // this classes purpose anyhow) to work with any of these calendars + // even with the dates before the historical appearance of the + // calendar + enum Calendar + { + Gregorian, // current calendar + Julian // calendar in use since -45 until the 1582 (or later) + + // TODO Hebrew, Chinese, Maya, ... (just kidding) (or then may be not?) + }; + + // the country parameter is used so far for calculating the start and + // the end of DST period and for deciding whether the date is a work + // day or not + // + // TODO move this to intl.h + +// Required for WinCE +#ifdef USA +#undef USA +#endif + + enum Country + { + Country_Unknown, // no special information for this country + Country_Default, // set the default country with SetCountry() method + // or use the default country with any other + + // TODO add more countries (for this we must know about DST and/or + // holidays for this country) + + // Western European countries: we assume that they all follow the same + // DST rules (true or false?) + Country_WesternEurope_Start, + Country_EEC = Country_WesternEurope_Start, + France, + Germany, + UK, + Country_WesternEurope_End = UK, + + Russia, + USA + }; + // symbolic names for the months + enum Month + { + Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec, Inv_Month + }; + + // symbolic names for the weekdays + enum WeekDay + { + Sun, Mon, Tue, Wed, Thu, Fri, Sat, Inv_WeekDay + }; + + // invalid value for the year + enum Year + { + Inv_Year = SHRT_MIN // should hold in wxDateTime_t + }; + + // flags for GetWeekDayName and GetMonthName + enum NameFlags + { + Name_Full = 0x01, // return full name + Name_Abbr = 0x02 // return abbreviated name + }; + + // flags for GetWeekOfYear and GetWeekOfMonth + enum WeekFlags + { + Default_First, // Sunday_First for US, Monday_First for the rest + Monday_First, // week starts with a Monday + Sunday_First // week starts with a Sunday + }; + + // helper classes + // ------------------------------------------------------------------------ + + // a class representing a time zone: basically, this is just an offset + // (in seconds) from GMT + class WXDLLIMPEXP_BASE TimeZone + { + public: + TimeZone(TZ tz); + + // create time zone object with the given offset + TimeZone(long offset = 0) { m_offset = offset; } + + static TimeZone Make(long offset) + { + TimeZone tz; + tz.m_offset = offset; + return tz; + } + + long GetOffset() const { return m_offset; } + + private: + // offset for this timezone from GMT in seconds + long m_offset; + }; + + // standard struct tm is limited to the years from 1900 (because + // tm_year field is the offset from 1900), so we use our own struct + // instead to represent broken down time + // + // NB: this struct should always be kept normalized (i.e. mon should + // be < 12, 1 <= day <= 31 &c), so use AddMonths(), AddDays() + // instead of modifying the member fields directly! + struct WXDLLIMPEXP_BASE Tm + { + wxDateTime_t msec, sec, min, hour, + mday, // Day of the month in 1..31 range. + yday; // Day of the year in 0..365 range. + Month mon; + int year; + + // default ctor inits the object to an invalid value + Tm(); + + // ctor from struct tm and the timezone + Tm(const struct tm& tm, const TimeZone& tz); + + // check that the given date/time is valid (in Gregorian calendar) + bool IsValid() const; + + // get the week day + WeekDay GetWeekDay() // not const because wday may be changed + { + if ( wday == Inv_WeekDay ) + ComputeWeekDay(); + + return (WeekDay)wday; + } + + // add the given number of months to the date keeping it normalized + void AddMonths(int monDiff); + + // add the given number of months to the date keeping it normalized + void AddDays(int dayDiff); + + private: + // compute the weekday from other fields + void ComputeWeekDay(); + + // the timezone we correspond to + TimeZone m_tz; + + // This value can only be accessed via GetWeekDay() and not directly + // because it's not always computed when creating this object and may + // need to be calculated on demand. + wxDateTime_t wday; + }; + + // static methods + // ------------------------------------------------------------------------ + + // set the current country + static void SetCountry(Country country); + // get the current country + static Country GetCountry(); + + // return true if the country is a West European one (in practice, + // this means that the same DST rules as for EEC apply) + static bool IsWestEuropeanCountry(Country country = Country_Default); + + // return the current year + static int GetCurrentYear(Calendar cal = Gregorian); + + // convert the year as returned by wxDateTime::GetYear() to a year + // suitable for BC/AD notation. The difference is that BC year 1 + // corresponds to the year 0 (while BC year 0 didn't exist) and AD + // year N is just year N. + static int ConvertYearToBC(int year); + + // return the current month + static Month GetCurrentMonth(Calendar cal = Gregorian); + + // returns true if the given year is a leap year in the given calendar + static bool IsLeapYear(int year = Inv_Year, Calendar cal = Gregorian); + + // get the century (19 for 1999, 20 for 2000 and -5 for 492 BC) + static int GetCentury(int year); + + // returns the number of days in this year (356 or 355 for Gregorian + // calendar usually :-) + static wxDateTime_t GetNumberOfDays(int year, Calendar cal = Gregorian); + + // get the number of the days in the given month (default value for + // the year means the current one) + static wxDateTime_t GetNumberOfDays(Month month, + int year = Inv_Year, + Calendar cal = Gregorian); + + + // get the full (default) or abbreviated month name in the current + // locale, returns empty string on error + static wxString GetMonthName(Month month, + NameFlags flags = Name_Full); + + // get the standard English full (default) or abbreviated month name + static wxString GetEnglishMonthName(Month month, + NameFlags flags = Name_Full); + + // get the full (default) or abbreviated weekday name in the current + // locale, returns empty string on error + static wxString GetWeekDayName(WeekDay weekday, + NameFlags flags = Name_Full); + + // get the standard English full (default) or abbreviated weekday name + static wxString GetEnglishWeekDayName(WeekDay weekday, + NameFlags flags = Name_Full); + + // get the AM and PM strings in the current locale (may be empty) + static void GetAmPmStrings(wxString *am, wxString *pm); + + // return true if the given country uses DST for this year + static bool IsDSTApplicable(int year = Inv_Year, + Country country = Country_Default); + + // get the beginning of DST for this year, will return invalid object + // if no DST applicable in this year. The default value of the + // parameter means to take the current year. + static wxDateTime GetBeginDST(int year = Inv_Year, + Country country = Country_Default); + // get the end of DST for this year, will return invalid object + // if no DST applicable in this year. The default value of the + // parameter means to take the current year. + static wxDateTime GetEndDST(int year = Inv_Year, + Country country = Country_Default); + + // return the wxDateTime object for the current time + static inline wxDateTime Now(); + + // return the wxDateTime object for the current time with millisecond + // precision (if available on this platform) + static wxDateTime UNow(); + + // return the wxDateTime object for today midnight: i.e. as Now() but + // with time set to 0 + static inline wxDateTime Today(); + + // constructors: you should test whether the constructor succeeded with + // IsValid() function. The values Inv_Month and Inv_Year for the + // parameters mean take current month and/or year values. + // ------------------------------------------------------------------------ + + // default ctor does not initialize the object, use Set()! + wxDateTime() { m_time = wxLongLong(wxINT32_MIN, 0); } + + // from time_t: seconds since the Epoch 00:00:00 UTC, Jan 1, 1970) +#if (!(defined(__VISAGECPP__) && __IBMCPP__ >= 400)) +// VA C++ confuses this with wxDateTime(double jdn) thinking it is a duplicate declaration + inline wxDateTime(time_t timet); +#endif + // from broken down time/date (only for standard Unix range) + inline wxDateTime(const struct tm& tm); + // from broken down time/date (any range) + inline wxDateTime(const Tm& tm); + + // from JDN (beware of rounding errors) + inline wxDateTime(double jdn); + + // from separate values for each component, date set to today + inline wxDateTime(wxDateTime_t hour, + wxDateTime_t minute = 0, + wxDateTime_t second = 0, + wxDateTime_t millisec = 0); + // from separate values for each component with explicit date + inline wxDateTime(wxDateTime_t day, // day of the month + Month month, + int year = Inv_Year, // 1999, not 99 please! + wxDateTime_t hour = 0, + wxDateTime_t minute = 0, + wxDateTime_t second = 0, + wxDateTime_t millisec = 0); +#ifdef __WINDOWS__ + wxDateTime(const struct _SYSTEMTIME& st) + { + SetFromMSWSysTime(st); + } +#endif + + // default copy ctor ok + + // no dtor + + // assignment operators and Set() functions: all non const methods return + // the reference to this object. IsValid() should be used to test whether + // the function succeeded. + // ------------------------------------------------------------------------ + + // set to the current time + inline wxDateTime& SetToCurrent(); + +#if (!(defined(__VISAGECPP__) && __IBMCPP__ >= 400)) +// VA C++ confuses this with wxDateTime(double jdn) thinking it is a duplicate declaration + // set to given time_t value + inline wxDateTime& Set(time_t timet); +#endif + + // set to given broken down time/date + wxDateTime& Set(const struct tm& tm); + + // set to given broken down time/date + inline wxDateTime& Set(const Tm& tm); + + // set to given JDN (beware of rounding errors) + wxDateTime& Set(double jdn); + + // set to given time, date = today + wxDateTime& Set(wxDateTime_t hour, + wxDateTime_t minute = 0, + wxDateTime_t second = 0, + wxDateTime_t millisec = 0); + + // from separate values for each component with explicit date + // (defaults for month and year are the current values) + wxDateTime& Set(wxDateTime_t day, + Month month, + int year = Inv_Year, // 1999, not 99 please! + wxDateTime_t hour = 0, + wxDateTime_t minute = 0, + wxDateTime_t second = 0, + wxDateTime_t millisec = 0); + + // resets time to 00:00:00, doesn't change the date + wxDateTime& ResetTime(); + + // get the date part of this object only, i.e. the object which has the + // same date as this one but time of 00:00:00 + wxDateTime GetDateOnly() const; + + // the following functions don't change the values of the other + // fields, i.e. SetMinute() won't change either hour or seconds value + + // set the year + wxDateTime& SetYear(int year); + // set the month + wxDateTime& SetMonth(Month month); + // set the day of the month + wxDateTime& SetDay(wxDateTime_t day); + // set hour + wxDateTime& SetHour(wxDateTime_t hour); + // set minute + wxDateTime& SetMinute(wxDateTime_t minute); + // set second + wxDateTime& SetSecond(wxDateTime_t second); + // set millisecond + wxDateTime& SetMillisecond(wxDateTime_t millisecond); + + // assignment operator from time_t + wxDateTime& operator=(time_t timet) { return Set(timet); } + + // assignment operator from broken down time/date + wxDateTime& operator=(const struct tm& tm) { return Set(tm); } + + // assignment operator from broken down time/date + wxDateTime& operator=(const Tm& tm) { return Set(tm); } + + // default assignment operator is ok + + // calendar calculations (functions which set the date only leave the time + // unchanged, e.g. don't explicitly zero it): SetXXX() functions modify the + // object itself, GetXXX() ones return a new object. + // ------------------------------------------------------------------------ + + // set to the given week day in the same week as this one + wxDateTime& SetToWeekDayInSameWeek(WeekDay weekday, + WeekFlags flags = Monday_First); + inline wxDateTime GetWeekDayInSameWeek(WeekDay weekday, + WeekFlags flags = Monday_First) const; + + // set to the next week day following this one + wxDateTime& SetToNextWeekDay(WeekDay weekday); + inline wxDateTime GetNextWeekDay(WeekDay weekday) const; + + // set to the previous week day before this one + wxDateTime& SetToPrevWeekDay(WeekDay weekday); + inline wxDateTime GetPrevWeekDay(WeekDay weekday) const; + + // set to Nth occurrence of given weekday in the given month of the + // given year (time is set to 0), return true on success and false on + // failure. n may be positive (1..5) or negative to count from the end + // of the month (see helper function SetToLastWeekDay()) + bool SetToWeekDay(WeekDay weekday, + int n = 1, + Month month = Inv_Month, + int year = Inv_Year); + inline wxDateTime GetWeekDay(WeekDay weekday, + int n = 1, + Month month = Inv_Month, + int year = Inv_Year) const; + + // sets to the last weekday in the given month, year + inline bool SetToLastWeekDay(WeekDay weekday, + Month month = Inv_Month, + int year = Inv_Year); + inline wxDateTime GetLastWeekDay(WeekDay weekday, + Month month = Inv_Month, + int year = Inv_Year); + +#if WXWIN_COMPATIBILITY_2_6 + // sets the date to the given day of the given week in the year, + // returns true on success and false if given date doesn't exist (e.g. + // numWeek is > 53) + // + // these functions are badly defined as they're not the reverse of + // GetWeekOfYear(), use SetToTheWeekOfYear() instead + wxDEPRECATED( bool SetToTheWeek(wxDateTime_t numWeek, + WeekDay weekday = Mon, + WeekFlags flags = Monday_First) ); + wxDEPRECATED( wxDateTime GetWeek(wxDateTime_t numWeek, + WeekDay weekday = Mon, + WeekFlags flags = Monday_First) const ); +#endif // WXWIN_COMPATIBILITY_2_6 + + // returns the date corresponding to the given week day of the given + // week (in ISO notation) of the specified year + static wxDateTime SetToWeekOfYear(int year, + wxDateTime_t numWeek, + WeekDay weekday = Mon); + + // sets the date to the last day of the given (or current) month or the + // given (or current) year + wxDateTime& SetToLastMonthDay(Month month = Inv_Month, + int year = Inv_Year); + inline wxDateTime GetLastMonthDay(Month month = Inv_Month, + int year = Inv_Year) const; + + // sets to the given year day (1..365 or 366) + wxDateTime& SetToYearDay(wxDateTime_t yday); + inline wxDateTime GetYearDay(wxDateTime_t yday) const; + + // The definitions below were taken verbatim from + // + // http://www.capecod.net/~pbaum/date/date0.htm + // + // (Peter Baum's home page) + // + // definition: The Julian Day Number, Julian Day, or JD of a + // particular instant of time is the number of days and fractions of a + // day since 12 hours Universal Time (Greenwich mean noon) on January + // 1 of the year -4712, where the year is given in the Julian + // proleptic calendar. The idea of using this reference date was + // originally proposed by Joseph Scalizer in 1582 to count years but + // it was modified by 19th century astronomers to count days. One + // could have equivalently defined the reference time to be noon of + // November 24, -4713 if were understood that Gregorian calendar rules + // were applied. Julian days are Julian Day Numbers and are not to be + // confused with Julian dates. + // + // definition: The Rata Die number is a date specified as the number + // of days relative to a base date of December 31 of the year 0. Thus + // January 1 of the year 1 is Rata Die day 1. + + // get the Julian Day number (the fractional part specifies the time of + // the day, related to noon - beware of rounding errors!) + double GetJulianDayNumber() const; + double GetJDN() const { return GetJulianDayNumber(); } + + // get the Modified Julian Day number: it is equal to JDN - 2400000.5 + // and so integral MJDs correspond to the midnights (and not noons). + // MJD 0 is Nov 17, 1858 + double GetModifiedJulianDayNumber() const { return GetJDN() - 2400000.5; } + double GetMJD() const { return GetModifiedJulianDayNumber(); } + + // get the Rata Die number + double GetRataDie() const; + + // TODO algorithms for calculating some important dates, such as + // religious holidays (Easter...) or moon/solar eclipses? Some + // algorithms can be found in the calendar FAQ + + + // Timezone stuff: a wxDateTime object constructed using given + // day/month/year/hour/min/sec values is interpreted as this moment in + // local time. Using the functions below, it may be converted to another + // time zone (e.g., the Unix epoch is wxDateTime(1, Jan, 1970).ToGMT()). + // + // These functions try to handle DST internally, but there is no magical + // way to know all rules for it in all countries in the world, so if the + // program can handle it itself (or doesn't want to handle it at all for + // whatever reason), the DST handling can be disabled with noDST. + // ------------------------------------------------------------------------ + + // transform to any given timezone + inline wxDateTime ToTimezone(const TimeZone& tz, bool noDST = false) const; + wxDateTime& MakeTimezone(const TimeZone& tz, bool noDST = false); + + // interpret current value as being in another timezone and transform + // it to local one + inline wxDateTime FromTimezone(const TimeZone& tz, bool noDST = false) const; + wxDateTime& MakeFromTimezone(const TimeZone& tz, bool noDST = false); + + // transform to/from GMT/UTC + wxDateTime ToUTC(bool noDST = false) const { return ToTimezone(UTC, noDST); } + wxDateTime& MakeUTC(bool noDST = false) { return MakeTimezone(UTC, noDST); } + + wxDateTime ToGMT(bool noDST = false) const { return ToUTC(noDST); } + wxDateTime& MakeGMT(bool noDST = false) { return MakeUTC(noDST); } + + wxDateTime FromUTC(bool noDST = false) const + { return FromTimezone(UTC, noDST); } + wxDateTime& MakeFromUTC(bool noDST = false) + { return MakeFromTimezone(UTC, noDST); } + + // is daylight savings time in effect at this moment according to the + // rules of the specified country? + // + // Return value is > 0 if DST is in effect, 0 if it is not and -1 if + // the information is not available (this is compatible with ANSI C) + int IsDST(Country country = Country_Default) const; + + + // accessors: many of them take the timezone parameter which indicates the + // timezone for which to make the calculations and the default value means + // to do it for the current timezone of this machine (even if the function + // only operates with the date it's necessary because a date may wrap as + // result of timezone shift) + // ------------------------------------------------------------------------ + + // is the date valid? + inline bool IsValid() const { return m_time != wxInvalidDateTime.m_time; } + + // get the broken down date/time representation in the given timezone + // + // If you wish to get several time components (day, month and year), + // consider getting the whole Tm strcuture first and retrieving the + // value from it - this is much more efficient + Tm GetTm(const TimeZone& tz = Local) const; + + // get the number of seconds since the Unix epoch - returns (time_t)-1 + // if the value is out of range + inline time_t GetTicks() const; + + // get the century, same as GetCentury(GetYear()) + int GetCentury(const TimeZone& tz = Local) const + { return GetCentury(GetYear(tz)); } + // get the year (returns Inv_Year if date is invalid) + int GetYear(const TimeZone& tz = Local) const + { return GetTm(tz).year; } + // get the month (Inv_Month if date is invalid) + Month GetMonth(const TimeZone& tz = Local) const + { return (Month)GetTm(tz).mon; } + // get the month day (in 1..31 range, 0 if date is invalid) + wxDateTime_t GetDay(const TimeZone& tz = Local) const + { return GetTm(tz).mday; } + // get the day of the week (Inv_WeekDay if date is invalid) + WeekDay GetWeekDay(const TimeZone& tz = Local) const + { return GetTm(tz).GetWeekDay(); } + // get the hour of the day + wxDateTime_t GetHour(const TimeZone& tz = Local) const + { return GetTm(tz).hour; } + // get the minute + wxDateTime_t GetMinute(const TimeZone& tz = Local) const + { return GetTm(tz).min; } + // get the second + wxDateTime_t GetSecond(const TimeZone& tz = Local) const + { return GetTm(tz).sec; } + // get milliseconds + wxDateTime_t GetMillisecond(const TimeZone& tz = Local) const + { return GetTm(tz).msec; } + + // get the day since the year start (1..366, 0 if date is invalid) + wxDateTime_t GetDayOfYear(const TimeZone& tz = Local) const; + // get the week number since the year start (1..52 or 53, 0 if date is + // invalid) + wxDateTime_t GetWeekOfYear(WeekFlags flags = Monday_First, + const TimeZone& tz = Local) const; + // get the week number since the month start (1..5, 0 if date is + // invalid) + wxDateTime_t GetWeekOfMonth(WeekFlags flags = Monday_First, + const TimeZone& tz = Local) const; + + // is this date a work day? This depends on a country, of course, + // because the holidays are different in different countries + bool IsWorkDay(Country country = Country_Default) const; + + // dos date and time format + // ------------------------------------------------------------------------ + + // set from the DOS packed format + wxDateTime& SetFromDOS(unsigned long ddt); + + // pack the date in DOS format + unsigned long GetAsDOS() const; + + // SYSTEMTIME format + // ------------------------------------------------------------------------ +#ifdef __WINDOWS__ + // convert SYSTEMTIME to wxDateTime + wxDateTime& SetFromMSWSysTime(const struct _SYSTEMTIME& st); + + // convert wxDateTime to SYSTEMTIME + void GetAsMSWSysTime(struct _SYSTEMTIME* st) const; + + // same as above but only take date part into account, time is always zero + wxDateTime& SetFromMSWSysDate(const struct _SYSTEMTIME& st); + void GetAsMSWSysDate(struct _SYSTEMTIME* st) const; +#endif // __WINDOWS__ + + // comparison (see also functions below for operator versions) + // ------------------------------------------------------------------------ + + // returns true if the two moments are strictly identical + inline bool IsEqualTo(const wxDateTime& datetime) const; + + // returns true if the date is strictly earlier than the given one + inline bool IsEarlierThan(const wxDateTime& datetime) const; + + // returns true if the date is strictly later than the given one + inline bool IsLaterThan(const wxDateTime& datetime) const; + + // returns true if the date is strictly in the given range + inline bool IsStrictlyBetween(const wxDateTime& t1, + const wxDateTime& t2) const; + + // returns true if the date is in the given range + inline bool IsBetween(const wxDateTime& t1, const wxDateTime& t2) const; + + // do these two objects refer to the same date? + inline bool IsSameDate(const wxDateTime& dt) const; + + // do these two objects have the same time? + inline bool IsSameTime(const wxDateTime& dt) const; + + // are these two objects equal up to given timespan? + inline bool IsEqualUpTo(const wxDateTime& dt, const wxTimeSpan& ts) const; + + inline bool operator<(const wxDateTime& dt) const + { + wxASSERT_MSG( IsValid() && dt.IsValid(), wxT("invalid wxDateTime") ); + return GetValue() < dt.GetValue(); + } + + inline bool operator<=(const wxDateTime& dt) const + { + wxASSERT_MSG( IsValid() && dt.IsValid(), wxT("invalid wxDateTime") ); + return GetValue() <= dt.GetValue(); + } + + inline bool operator>(const wxDateTime& dt) const + { + wxASSERT_MSG( IsValid() && dt.IsValid(), wxT("invalid wxDateTime") ); + return GetValue() > dt.GetValue(); + } + + inline bool operator>=(const wxDateTime& dt) const + { + wxASSERT_MSG( IsValid() && dt.IsValid(), wxT("invalid wxDateTime") ); + return GetValue() >= dt.GetValue(); + } + + inline bool operator==(const wxDateTime& dt) const + { + wxASSERT_MSG( IsValid() && dt.IsValid(), wxT("invalid wxDateTime") ); + return GetValue() == dt.GetValue(); + } + + inline bool operator!=(const wxDateTime& dt) const + { + wxASSERT_MSG( IsValid() && dt.IsValid(), wxT("invalid wxDateTime") ); + return GetValue() != dt.GetValue(); + } + + // arithmetics with dates (see also below for more operators) + // ------------------------------------------------------------------------ + + // return the sum of the date with a time span (positive or negative) + inline wxDateTime Add(const wxTimeSpan& diff) const; + // add a time span (positive or negative) + inline wxDateTime& Add(const wxTimeSpan& diff); + // add a time span (positive or negative) + inline wxDateTime& operator+=(const wxTimeSpan& diff); + inline wxDateTime operator+(const wxTimeSpan& ts) const + { + wxDateTime dt(*this); + dt.Add(ts); + return dt; + } + + // return the difference of the date with a time span + inline wxDateTime Subtract(const wxTimeSpan& diff) const; + // subtract a time span (positive or negative) + inline wxDateTime& Subtract(const wxTimeSpan& diff); + // subtract a time span (positive or negative) + inline wxDateTime& operator-=(const wxTimeSpan& diff); + inline wxDateTime operator-(const wxTimeSpan& ts) const + { + wxDateTime dt(*this); + dt.Subtract(ts); + return dt; + } + + // return the sum of the date with a date span + inline wxDateTime Add(const wxDateSpan& diff) const; + // add a date span (positive or negative) + wxDateTime& Add(const wxDateSpan& diff); + // add a date span (positive or negative) + inline wxDateTime& operator+=(const wxDateSpan& diff); + inline wxDateTime operator+(const wxDateSpan& ds) const + { + wxDateTime dt(*this); + dt.Add(ds); + return dt; + } + + // return the difference of the date with a date span + inline wxDateTime Subtract(const wxDateSpan& diff) const; + // subtract a date span (positive or negative) + inline wxDateTime& Subtract(const wxDateSpan& diff); + // subtract a date span (positive or negative) + inline wxDateTime& operator-=(const wxDateSpan& diff); + inline wxDateTime operator-(const wxDateSpan& ds) const + { + wxDateTime dt(*this); + dt.Subtract(ds); + return dt; + } + + // return the difference between two dates + inline wxTimeSpan Subtract(const wxDateTime& dt) const; + inline wxTimeSpan operator-(const wxDateTime& dt2) const; + + wxDateSpan DiffAsDateSpan(const wxDateTime& dt) const; + + // conversion to/from text + // ------------------------------------------------------------------------ + + // all conversions functions return true to indicate whether parsing + // succeeded or failed and fill in the provided end iterator, which must + // not be NULL, with the location of the character where the parsing + // stopped (this will be end() of the passed string if everything was + // parsed) + + // parse a string in RFC 822 format (found e.g. in mail headers and + // having the form "Wed, 10 Feb 1999 19:07:07 +0100") + bool ParseRfc822Date(const wxString& date, + wxString::const_iterator *end); + + // parse a date/time in the given format (see strptime(3)), fill in + // the missing (in the string) fields with the values of dateDef (by + // default, they will not change if they had valid values or will + // default to Today() otherwise) + bool ParseFormat(const wxString& date, + const wxString& format, + const wxDateTime& dateDef, + wxString::const_iterator *end); + + bool ParseFormat(const wxString& date, + const wxString& format, + wxString::const_iterator *end) + { + return ParseFormat(date, format, wxDefaultDateTime, end); + } + + bool ParseFormat(const wxString& date, + wxString::const_iterator *end) + { + return ParseFormat(date, wxDefaultDateTimeFormat, wxDefaultDateTime, end); + } + + // parse a string containing date, time or both in ISO 8601 format + // + // notice that these functions are new in wx 3.0 and so we don't + // provide compatibility overloads for them + bool ParseISODate(const wxString& date) + { + wxString::const_iterator end; + return ParseFormat(date, wxS("%Y-%m-%d"), &end) && end == date.end(); + } + + bool ParseISOTime(const wxString& time) + { + wxString::const_iterator end; + return ParseFormat(time, wxS("%H:%M:%S"), &end) && end == time.end(); + } + + bool ParseISOCombined(const wxString& datetime, char sep = 'T') + { + wxString::const_iterator end; + const wxString fmt = wxS("%Y-%m-%d") + wxString(sep) + wxS("%H:%M:%S"); + return ParseFormat(datetime, fmt, &end) && end == datetime.end(); + } + + // parse a string containing the date/time in "free" format, this + // function will try to make an educated guess at the string contents + bool ParseDateTime(const wxString& datetime, + wxString::const_iterator *end); + + // parse a string containing the date only in "free" format (less + // flexible than ParseDateTime) + bool ParseDate(const wxString& date, + wxString::const_iterator *end); + + // parse a string containing the time only in "free" format + bool ParseTime(const wxString& time, + wxString::const_iterator *end); + + + // this function accepts strftime()-like format string (default + // argument corresponds to the preferred date and time representation + // for the current locale) and returns the string containing the + // resulting text representation + wxString Format(const wxString& format = wxDefaultDateTimeFormat, + const TimeZone& tz = Local) const; + // preferred date representation for the current locale + wxString FormatDate() const { return Format(wxS("%x")); } + // preferred time representation for the current locale + wxString FormatTime() const { return Format(wxS("%X")); } + // returns the string representing the date in ISO 8601 format + // (YYYY-MM-DD) + wxString FormatISODate() const { return Format(wxS("%Y-%m-%d")); } + // returns the string representing the time in ISO 8601 format + // (HH:MM:SS) + wxString FormatISOTime() const { return Format(wxS("%H:%M:%S")); } + // return the combined date time representation in ISO 8601 format; the + // separator character should be 'T' according to the standard but it + // can also be useful to set it to ' ' + wxString FormatISOCombined(char sep = 'T') const + { return FormatISODate() + sep + FormatISOTime(); } + + + // backwards compatible versions of the parsing functions: they return an + // object representing the next character following the date specification + // (i.e. the one where the scan had to stop) or a special NULL-like object + // on failure + // + // they're not deprecated because a lot of existing code uses them and + // there is no particular harm in keeping them but you should still prefer + // the versions above in the new code + wxAnyStrPtr ParseRfc822Date(const wxString& date) + { + wxString::const_iterator end; + return ParseRfc822Date(date, &end) ? wxAnyStrPtr(date, end) + : wxAnyStrPtr(); + } + + wxAnyStrPtr ParseFormat(const wxString& date, + const wxString& format = wxDefaultDateTimeFormat, + const wxDateTime& dateDef = wxDefaultDateTime) + { + wxString::const_iterator end; + return ParseFormat(date, format, dateDef, &end) ? wxAnyStrPtr(date, end) + : wxAnyStrPtr(); + } + + wxAnyStrPtr ParseDateTime(const wxString& datetime) + { + wxString::const_iterator end; + return ParseDateTime(datetime, &end) ? wxAnyStrPtr(datetime, end) + : wxAnyStrPtr(); + } + + wxAnyStrPtr ParseDate(const wxString& date) + { + wxString::const_iterator end; + return ParseDate(date, &end) ? wxAnyStrPtr(date, end) + : wxAnyStrPtr(); + } + + wxAnyStrPtr ParseTime(const wxString& time) + { + wxString::const_iterator end; + return ParseTime(time, &end) ? wxAnyStrPtr(time, end) + : wxAnyStrPtr(); + } + + // In addition to wxAnyStrPtr versions above we also must provide the + // overloads for C strings as we must return a pointer into the original + // string and not inside a temporary wxString which would have been created + // if the overloads above were used. + // + // And then we also have to provide the overloads for wxCStrData, as usual. + // Unfortunately those ones can't return anything as we don't have any + // sufficiently long-lived wxAnyStrPtr to return from them: any temporary + // strings it would point to would be destroyed when this function returns + // making it impossible to dereference the return value. So we just don't + // return anything from here which at least allows to keep compatibility + // with the code not testing the return value. Other uses of this method + // need to be converted to use one of the new bool-returning overloads + // above. + void ParseRfc822Date(const wxCStrData& date) + { ParseRfc822Date(wxString(date)); } + const char* ParseRfc822Date(const char* date); + const wchar_t* ParseRfc822Date(const wchar_t* date); + + void ParseFormat(const wxCStrData& date, + const wxString& format = wxDefaultDateTimeFormat, + const wxDateTime& dateDef = wxDefaultDateTime) + { ParseFormat(wxString(date), format, dateDef); } + const char* ParseFormat(const char* date, + const wxString& format = wxDefaultDateTimeFormat, + const wxDateTime& dateDef = wxDefaultDateTime); + const wchar_t* ParseFormat(const wchar_t* date, + const wxString& format = wxDefaultDateTimeFormat, + const wxDateTime& dateDef = wxDefaultDateTime); + + void ParseDateTime(const wxCStrData& datetime) + { ParseDateTime(wxString(datetime)); } + const char* ParseDateTime(const char* datetime); + const wchar_t* ParseDateTime(const wchar_t* datetime); + + void ParseDate(const wxCStrData& date) + { ParseDate(wxString(date)); } + const char* ParseDate(const char* date); + const wchar_t* ParseDate(const wchar_t* date); + + void ParseTime(const wxCStrData& time) + { ParseTime(wxString(time)); } + const char* ParseTime(const char* time); + const wchar_t* ParseTime(const wchar_t* time); + + + // implementation + // ------------------------------------------------------------------------ + + // construct from internal representation + wxDateTime(const wxLongLong& time) { m_time = time; } + + // get the internal representation + inline wxLongLong GetValue() const; + + // a helper function to get the current time_t + static time_t GetTimeNow() { return time(NULL); } + + // another one to get the current time broken down + static struct tm *GetTmNow() + { + static struct tm l_CurrentTime; + return GetTmNow(&l_CurrentTime); + } + + // get current time using thread-safe function + static struct tm *GetTmNow(struct tm *tmstruct); + +private: + // the current country - as it's the same for all program objects (unless + // it runs on a _really_ big cluster system :-), this is a static member: + // see SetCountry() and GetCountry() + static Country ms_country; + + // this constant is used to transform a time_t value to the internal + // representation, as time_t is in seconds and we use milliseconds it's + // fixed to 1000 + static const long TIME_T_FACTOR; + + // returns true if we fall in range in which we can use standard ANSI C + // functions + inline bool IsInStdRange() const; + + // the internal representation of the time is the amount of milliseconds + // elapsed since the origin which is set by convention to the UNIX/C epoch + // value: the midnight of January 1, 1970 (UTC) + wxLongLong m_time; +}; + +// ---------------------------------------------------------------------------- +// This class contains a difference between 2 wxDateTime values, so it makes +// sense to add it to wxDateTime and it is the result of subtraction of 2 +// objects of that class. See also wxDateSpan. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxTimeSpan +{ +public: + // constructors + // ------------------------------------------------------------------------ + + // return the timespan for the given number of milliseconds + static wxTimeSpan Milliseconds(wxLongLong ms) { return wxTimeSpan(0, 0, 0, ms); } + static wxTimeSpan Millisecond() { return Milliseconds(1); } + + // return the timespan for the given number of seconds + static wxTimeSpan Seconds(wxLongLong sec) { return wxTimeSpan(0, 0, sec); } + static wxTimeSpan Second() { return Seconds(1); } + + // return the timespan for the given number of minutes + static wxTimeSpan Minutes(long min) { return wxTimeSpan(0, min, 0 ); } + static wxTimeSpan Minute() { return Minutes(1); } + + // return the timespan for the given number of hours + static wxTimeSpan Hours(long hours) { return wxTimeSpan(hours, 0, 0); } + static wxTimeSpan Hour() { return Hours(1); } + + // return the timespan for the given number of days + static wxTimeSpan Days(long days) { return Hours(24 * days); } + static wxTimeSpan Day() { return Days(1); } + + // return the timespan for the given number of weeks + static wxTimeSpan Weeks(long days) { return Days(7 * days); } + static wxTimeSpan Week() { return Weeks(1); } + + // default ctor constructs the 0 time span + wxTimeSpan() { } + + // from separate values for each component, date set to 0 (hours are + // not restricted to 0..24 range, neither are minutes, seconds or + // milliseconds) + inline wxTimeSpan(long hours, + long minutes = 0, + wxLongLong seconds = 0, + wxLongLong milliseconds = 0); + + // default copy ctor is ok + + // no dtor + + // arithmetics with time spans (see also below for more operators) + // ------------------------------------------------------------------------ + + // return the sum of two timespans + inline wxTimeSpan Add(const wxTimeSpan& diff) const; + // add two timespans together + inline wxTimeSpan& Add(const wxTimeSpan& diff); + // add two timespans together + wxTimeSpan& operator+=(const wxTimeSpan& diff) { return Add(diff); } + inline wxTimeSpan operator+(const wxTimeSpan& ts) const + { + return wxTimeSpan(GetValue() + ts.GetValue()); + } + + // return the difference of two timespans + inline wxTimeSpan Subtract(const wxTimeSpan& diff) const; + // subtract another timespan + inline wxTimeSpan& Subtract(const wxTimeSpan& diff); + // subtract another timespan + wxTimeSpan& operator-=(const wxTimeSpan& diff) { return Subtract(diff); } + inline wxTimeSpan operator-(const wxTimeSpan& ts) + { + return wxTimeSpan(GetValue() - ts.GetValue()); + } + + // multiply timespan by a scalar + inline wxTimeSpan Multiply(int n) const; + // multiply timespan by a scalar + inline wxTimeSpan& Multiply(int n); + // multiply timespan by a scalar + wxTimeSpan& operator*=(int n) { return Multiply(n); } + inline wxTimeSpan operator*(int n) const + { + return wxTimeSpan(*this).Multiply(n); + } + + // return this timespan with opposite sign + wxTimeSpan Negate() const { return wxTimeSpan(-GetValue()); } + // negate the value of the timespan + wxTimeSpan& Neg() { m_diff = -GetValue(); return *this; } + // negate the value of the timespan + wxTimeSpan& operator-() { return Neg(); } + + // return the absolute value of the timespan: does _not_ modify the + // object + inline wxTimeSpan Abs() const; + + // there is intentionally no division because we don't want to + // introduce rounding errors in time calculations + + // comparaison (see also operator versions below) + // ------------------------------------------------------------------------ + + // is the timespan null? + bool IsNull() const { return m_diff == 0l; } + // returns true if the timespan is null + bool operator!() const { return !IsNull(); } + + // is the timespan positive? + bool IsPositive() const { return m_diff > 0l; } + + // is the timespan negative? + bool IsNegative() const { return m_diff < 0l; } + + // are two timespans equal? + inline bool IsEqualTo(const wxTimeSpan& ts) const; + // compare two timestamps: works with the absolute values, i.e. -2 + // hours is longer than 1 hour. Also, it will return false if the + // timespans are equal in absolute value. + inline bool IsLongerThan(const wxTimeSpan& ts) const; + // compare two timestamps: works with the absolute values, i.e. 1 + // hour is shorter than -2 hours. Also, it will return false if the + // timespans are equal in absolute value. + bool IsShorterThan(const wxTimeSpan& t) const; + + inline bool operator<(const wxTimeSpan &ts) const + { + return GetValue() < ts.GetValue(); + } + + inline bool operator<=(const wxTimeSpan &ts) const + { + return GetValue() <= ts.GetValue(); + } + + inline bool operator>(const wxTimeSpan &ts) const + { + return GetValue() > ts.GetValue(); + } + + inline bool operator>=(const wxTimeSpan &ts) const + { + return GetValue() >= ts.GetValue(); + } + + inline bool operator==(const wxTimeSpan &ts) const + { + return GetValue() == ts.GetValue(); + } + + inline bool operator!=(const wxTimeSpan &ts) const + { + return GetValue() != ts.GetValue(); + } + + // breaking into days, hours, minutes and seconds + // ------------------------------------------------------------------------ + + // get the max number of weeks in this timespan + inline int GetWeeks() const; + // get the max number of days in this timespan + inline int GetDays() const; + // get the max number of hours in this timespan + inline int GetHours() const; + // get the max number of minutes in this timespan + inline int GetMinutes() const; + // get the max number of seconds in this timespan + inline wxLongLong GetSeconds() const; + // get the number of milliseconds in this timespan + wxLongLong GetMilliseconds() const { return m_diff; } + + // conversion to text + // ------------------------------------------------------------------------ + + // this function accepts strftime()-like format string (default + // argument corresponds to the preferred date and time representation + // for the current locale) and returns the string containing the + // resulting text representation. Notice that only some of format + // specifiers valid for wxDateTime are valid for wxTimeSpan: hours, + // minutes and seconds make sense, but not "PM/AM" string for example. + wxString Format(const wxString& format = wxDefaultTimeSpanFormat) const; + + // implementation + // ------------------------------------------------------------------------ + + // construct from internal representation + wxTimeSpan(const wxLongLong& diff) { m_diff = diff; } + + // get the internal representation + wxLongLong GetValue() const { return m_diff; } + +private: + // the (signed) time span in milliseconds + wxLongLong m_diff; +}; + +// ---------------------------------------------------------------------------- +// This class is a "logical time span" and is useful for implementing program +// logic for such things as "add one month to the date" which, in general, +// doesn't mean to add 60*60*24*31 seconds to it, but to take the same date +// the next month (to understand that this is indeed different consider adding +// one month to Feb, 15 - we want to get Mar, 15, of course). +// +// When adding a month to the date, all lesser components (days, hours, ...) +// won't be changed unless the resulting date would be invalid: for example, +// Jan 31 + 1 month will be Feb 28, not (non existing) Feb 31. +// +// Because of this feature, adding and subtracting back again the same +// wxDateSpan will *not*, in general give back the original date: Feb 28 - 1 +// month will be Jan 28, not Jan 31! +// +// wxDateSpan can be either positive or negative. They may be +// multiplied by scalars which multiply all deltas by the scalar: i.e. 2*(1 +// month and 1 day) is 2 months and 2 days. They can be added together and +// with wxDateTime or wxTimeSpan, but the type of result is different for each +// case. +// +// Beware about weeks: if you specify both weeks and days, the total number of +// days added will be 7*weeks + days! See also GetTotalDays() function. +// +// Equality operators are defined for wxDateSpans. Two datespans are equal if +// they both give the same target date when added to *every* source date. +// Thus wxDateSpan::Months(1) is not equal to wxDateSpan::Days(30), because +// they not give the same date when added to 1 Feb. But wxDateSpan::Days(14) is +// equal to wxDateSpan::Weeks(2) +// +// Finally, notice that for adding hours, minutes &c you don't need this +// class: wxTimeSpan will do the job because there are no subtleties +// associated with those. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxDateSpan +{ +public: + // constructors + // ------------------------------------------------------------------------ + + // this many years/months/weeks/days + wxDateSpan(int years = 0, int months = 0, int weeks = 0, int days = 0) + { + m_years = years; + m_months = months; + m_weeks = weeks; + m_days = days; + } + + // get an object for the given number of days + static wxDateSpan Days(int days) { return wxDateSpan(0, 0, 0, days); } + static wxDateSpan Day() { return Days(1); } + + // get an object for the given number of weeks + static wxDateSpan Weeks(int weeks) { return wxDateSpan(0, 0, weeks, 0); } + static wxDateSpan Week() { return Weeks(1); } + + // get an object for the given number of months + static wxDateSpan Months(int mon) { return wxDateSpan(0, mon, 0, 0); } + static wxDateSpan Month() { return Months(1); } + + // get an object for the given number of years + static wxDateSpan Years(int years) { return wxDateSpan(years, 0, 0, 0); } + static wxDateSpan Year() { return Years(1); } + + // default copy ctor is ok + + // no dtor + + // accessors (all SetXXX() return the (modified) wxDateSpan object) + // ------------------------------------------------------------------------ + + // set number of years + wxDateSpan& SetYears(int n) { m_years = n; return *this; } + // set number of months + wxDateSpan& SetMonths(int n) { m_months = n; return *this; } + // set number of weeks + wxDateSpan& SetWeeks(int n) { m_weeks = n; return *this; } + // set number of days + wxDateSpan& SetDays(int n) { m_days = n; return *this; } + + // get number of years + int GetYears() const { return m_years; } + // get number of months + int GetMonths() const { return m_months; } + // returns 12*GetYears() + GetMonths() + int GetTotalMonths() const { return 12*m_years + m_months; } + // get number of weeks + int GetWeeks() const { return m_weeks; } + // get number of days + int GetDays() const { return m_days; } + // returns 7*GetWeeks() + GetDays() + int GetTotalDays() const { return 7*m_weeks + m_days; } + + // arithmetics with date spans (see also below for more operators) + // ------------------------------------------------------------------------ + + // return sum of two date spans + inline wxDateSpan Add(const wxDateSpan& other) const; + // add another wxDateSpan to us + inline wxDateSpan& Add(const wxDateSpan& other); + // add another wxDateSpan to us + inline wxDateSpan& operator+=(const wxDateSpan& other); + inline wxDateSpan operator+(const wxDateSpan& ds) const + { + return wxDateSpan(GetYears() + ds.GetYears(), + GetMonths() + ds.GetMonths(), + GetWeeks() + ds.GetWeeks(), + GetDays() + ds.GetDays()); + } + + // return difference of two date spans + inline wxDateSpan Subtract(const wxDateSpan& other) const; + // subtract another wxDateSpan from us + inline wxDateSpan& Subtract(const wxDateSpan& other); + // subtract another wxDateSpan from us + inline wxDateSpan& operator-=(const wxDateSpan& other); + inline wxDateSpan operator-(const wxDateSpan& ds) const + { + return wxDateSpan(GetYears() - ds.GetYears(), + GetMonths() - ds.GetMonths(), + GetWeeks() - ds.GetWeeks(), + GetDays() - ds.GetDays()); + } + + // return a copy of this time span with changed sign + inline wxDateSpan Negate() const; + // inverse the sign of this timespan + inline wxDateSpan& Neg(); + // inverse the sign of this timespan + wxDateSpan& operator-() { return Neg(); } + + // return the date span proportional to this one with given factor + inline wxDateSpan Multiply(int factor) const; + // multiply all components by a (signed) number + inline wxDateSpan& Multiply(int factor); + // multiply all components by a (signed) number + inline wxDateSpan& operator*=(int factor) { return Multiply(factor); } + inline wxDateSpan operator*(int n) const + { + return wxDateSpan(*this).Multiply(n); + } + + // ds1 == d2 if and only if for every wxDateTime t t + ds1 == t + ds2 + inline bool operator==(const wxDateSpan& ds) const + { + return GetYears() == ds.GetYears() && + GetMonths() == ds.GetMonths() && + GetTotalDays() == ds.GetTotalDays(); + } + + inline bool operator!=(const wxDateSpan& ds) const + { + return !(*this == ds); + } + +private: + int m_years, + m_months, + m_weeks, + m_days; +}; + +// ---------------------------------------------------------------------------- +// wxDateTimeArray: array of dates. +// ---------------------------------------------------------------------------- + +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxDateTime, wxDateTimeArray, WXDLLIMPEXP_BASE); + +// ---------------------------------------------------------------------------- +// wxDateTimeHolidayAuthority: an object of this class will decide whether a +// given date is a holiday and is used by all functions working with "work +// days". +// +// NB: the base class is an ABC, derived classes must implement the pure +// virtual methods to work with the holidays they correspond to. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxDateTimeHolidayAuthority; +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxDateTimeHolidayAuthority *, + wxHolidayAuthoritiesArray, + class WXDLLIMPEXP_BASE); + +class wxDateTimeHolidaysModule; +class WXDLLIMPEXP_BASE wxDateTimeHolidayAuthority +{ +friend class wxDateTimeHolidaysModule; +public: + // returns true if the given date is a holiday + static bool IsHoliday(const wxDateTime& dt); + + // fills the provided array with all holidays in the given range, returns + // the number of them + static size_t GetHolidaysInRange(const wxDateTime& dtStart, + const wxDateTime& dtEnd, + wxDateTimeArray& holidays); + + // clear the list of holiday authorities + static void ClearAllAuthorities(); + + // add a new holiday authority (the pointer will be deleted by + // wxDateTimeHolidayAuthority) + static void AddAuthority(wxDateTimeHolidayAuthority *auth); + + // the base class must have a virtual dtor + virtual ~wxDateTimeHolidayAuthority(); + +protected: + // this function is called to determine whether a given day is a holiday + virtual bool DoIsHoliday(const wxDateTime& dt) const = 0; + + // this function should fill the array with all holidays between the two + // given dates - it is implemented in the base class, but in a very + // inefficient way (it just iterates over all days and uses IsHoliday() for + // each of them), so it must be overridden in the derived class where the + // base class version may be explicitly used if needed + // + // returns the number of holidays in the given range and fills holidays + // array + virtual size_t DoGetHolidaysInRange(const wxDateTime& dtStart, + const wxDateTime& dtEnd, + wxDateTimeArray& holidays) const = 0; + +private: + // all holiday authorities + static wxHolidayAuthoritiesArray ms_authorities; +}; + +// the holidays for this class are all Saturdays and Sundays +class WXDLLIMPEXP_BASE wxDateTimeWorkDays : public wxDateTimeHolidayAuthority +{ +protected: + virtual bool DoIsHoliday(const wxDateTime& dt) const; + virtual size_t DoGetHolidaysInRange(const wxDateTime& dtStart, + const wxDateTime& dtEnd, + wxDateTimeArray& holidays) const; +}; + +// ============================================================================ +// inline functions implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// private macros +// ---------------------------------------------------------------------------- + +#define MILLISECONDS_PER_DAY 86400000l + +// some broken compilers (HP-UX CC) refuse to compile the "normal" version, but +// using a temp variable always might prevent other compilers from optimising +// it away - hence use of this ugly macro +#ifndef __HPUX__ + #define MODIFY_AND_RETURN(op) return wxDateTime(*this).op +#else + #define MODIFY_AND_RETURN(op) wxDateTime dt(*this); dt.op; return dt +#endif + +// ---------------------------------------------------------------------------- +// wxDateTime construction +// ---------------------------------------------------------------------------- + +inline bool wxDateTime::IsInStdRange() const +{ + // currently we don't know what is the real type of time_t so prefer to err + // on the safe side and limit it to 32 bit values which is safe everywhere + return m_time >= 0l && (m_time / TIME_T_FACTOR) < wxINT32_MAX; +} + +/* static */ +inline wxDateTime wxDateTime::Now() +{ + struct tm tmstruct; + return wxDateTime(*GetTmNow(&tmstruct)); +} + +/* static */ +inline wxDateTime wxDateTime::Today() +{ + wxDateTime dt(Now()); + dt.ResetTime(); + + return dt; +} + +#if (!(defined(__VISAGECPP__) && __IBMCPP__ >= 400)) +inline wxDateTime& wxDateTime::Set(time_t timet) +{ + if ( timet == (time_t)-1 ) + { + m_time = wxInvalidDateTime.m_time; + } + else + { + // assign first to avoid long multiplication overflow! + m_time = timet - WX_TIME_BASE_OFFSET; + m_time *= TIME_T_FACTOR; + } + + return *this; +} +#endif + +inline wxDateTime& wxDateTime::SetToCurrent() +{ + *this = Now(); + return *this; +} + +#if (!(defined(__VISAGECPP__) && __IBMCPP__ >= 400)) +inline wxDateTime::wxDateTime(time_t timet) +{ + Set(timet); +} +#endif + +inline wxDateTime::wxDateTime(const struct tm& tm) +{ + Set(tm); +} + +inline wxDateTime::wxDateTime(const Tm& tm) +{ + Set(tm); +} + +inline wxDateTime::wxDateTime(double jdn) +{ + Set(jdn); +} + +inline wxDateTime& wxDateTime::Set(const Tm& tm) +{ + wxASSERT_MSG( tm.IsValid(), wxT("invalid broken down date/time") ); + + return Set(tm.mday, (Month)tm.mon, tm.year, + tm.hour, tm.min, tm.sec, tm.msec); +} + +inline wxDateTime::wxDateTime(wxDateTime_t hour, + wxDateTime_t minute, + wxDateTime_t second, + wxDateTime_t millisec) +{ + Set(hour, minute, second, millisec); +} + +inline wxDateTime::wxDateTime(wxDateTime_t day, + Month month, + int year, + wxDateTime_t hour, + wxDateTime_t minute, + wxDateTime_t second, + wxDateTime_t millisec) +{ + Set(day, month, year, hour, minute, second, millisec); +} + +// ---------------------------------------------------------------------------- +// wxDateTime accessors +// ---------------------------------------------------------------------------- + +inline wxLongLong wxDateTime::GetValue() const +{ + wxASSERT_MSG( IsValid(), wxT("invalid wxDateTime")); + + return m_time; +} + +inline time_t wxDateTime::GetTicks() const +{ + wxASSERT_MSG( IsValid(), wxT("invalid wxDateTime")); + if ( !IsInStdRange() ) + { + return (time_t)-1; + } + + return (time_t)((m_time / (long)TIME_T_FACTOR).ToLong()) + WX_TIME_BASE_OFFSET; +} + +inline bool wxDateTime::SetToLastWeekDay(WeekDay weekday, + Month month, + int year) +{ + return SetToWeekDay(weekday, -1, month, year); +} + +inline wxDateTime +wxDateTime::GetWeekDayInSameWeek(WeekDay weekday, + WeekFlags WXUNUSED(flags)) const +{ + MODIFY_AND_RETURN( SetToWeekDayInSameWeek(weekday) ); +} + +inline wxDateTime wxDateTime::GetNextWeekDay(WeekDay weekday) const +{ + MODIFY_AND_RETURN( SetToNextWeekDay(weekday) ); +} + +inline wxDateTime wxDateTime::GetPrevWeekDay(WeekDay weekday) const +{ + MODIFY_AND_RETURN( SetToPrevWeekDay(weekday) ); +} + +inline wxDateTime wxDateTime::GetWeekDay(WeekDay weekday, + int n, + Month month, + int year) const +{ + wxDateTime dt(*this); + + return dt.SetToWeekDay(weekday, n, month, year) ? dt : wxInvalidDateTime; +} + +inline wxDateTime wxDateTime::GetLastWeekDay(WeekDay weekday, + Month month, + int year) +{ + wxDateTime dt(*this); + + return dt.SetToLastWeekDay(weekday, month, year) ? dt : wxInvalidDateTime; +} + +inline wxDateTime wxDateTime::GetLastMonthDay(Month month, int year) const +{ + MODIFY_AND_RETURN( SetToLastMonthDay(month, year) ); +} + +inline wxDateTime wxDateTime::GetYearDay(wxDateTime_t yday) const +{ + MODIFY_AND_RETURN( SetToYearDay(yday) ); +} + +// ---------------------------------------------------------------------------- +// wxDateTime comparison +// ---------------------------------------------------------------------------- + +inline bool wxDateTime::IsEqualTo(const wxDateTime& datetime) const +{ + wxASSERT_MSG( IsValid() && datetime.IsValid(), wxT("invalid wxDateTime")); + + return m_time == datetime.m_time; +} + +inline bool wxDateTime::IsEarlierThan(const wxDateTime& datetime) const +{ + wxASSERT_MSG( IsValid() && datetime.IsValid(), wxT("invalid wxDateTime")); + + return m_time < datetime.m_time; +} + +inline bool wxDateTime::IsLaterThan(const wxDateTime& datetime) const +{ + wxASSERT_MSG( IsValid() && datetime.IsValid(), wxT("invalid wxDateTime")); + + return m_time > datetime.m_time; +} + +inline bool wxDateTime::IsStrictlyBetween(const wxDateTime& t1, + const wxDateTime& t2) const +{ + // no need for assert, will be checked by the functions we call + return IsLaterThan(t1) && IsEarlierThan(t2); +} + +inline bool wxDateTime::IsBetween(const wxDateTime& t1, + const wxDateTime& t2) const +{ + // no need for assert, will be checked by the functions we call + return IsEqualTo(t1) || IsEqualTo(t2) || IsStrictlyBetween(t1, t2); +} + +inline bool wxDateTime::IsSameDate(const wxDateTime& dt) const +{ + Tm tm1 = GetTm(), + tm2 = dt.GetTm(); + + return tm1.year == tm2.year && + tm1.mon == tm2.mon && + tm1.mday == tm2.mday; +} + +inline bool wxDateTime::IsSameTime(const wxDateTime& dt) const +{ + // notice that we can't do something like this: + // + // m_time % MILLISECONDS_PER_DAY == dt.m_time % MILLISECONDS_PER_DAY + // + // because we have also to deal with (possibly) different DST settings! + Tm tm1 = GetTm(), + tm2 = dt.GetTm(); + + return tm1.hour == tm2.hour && + tm1.min == tm2.min && + tm1.sec == tm2.sec && + tm1.msec == tm2.msec; +} + +inline bool wxDateTime::IsEqualUpTo(const wxDateTime& dt, + const wxTimeSpan& ts) const +{ + return IsBetween(dt.Subtract(ts), dt.Add(ts)); +} + +// ---------------------------------------------------------------------------- +// wxDateTime arithmetics +// ---------------------------------------------------------------------------- + +inline wxDateTime wxDateTime::Add(const wxTimeSpan& diff) const +{ + wxASSERT_MSG( IsValid(), wxT("invalid wxDateTime")); + + return wxDateTime(m_time + diff.GetValue()); +} + +inline wxDateTime& wxDateTime::Add(const wxTimeSpan& diff) +{ + wxASSERT_MSG( IsValid(), wxT("invalid wxDateTime")); + + m_time += diff.GetValue(); + + return *this; +} + +inline wxDateTime& wxDateTime::operator+=(const wxTimeSpan& diff) +{ + return Add(diff); +} + +inline wxDateTime wxDateTime::Subtract(const wxTimeSpan& diff) const +{ + wxASSERT_MSG( IsValid(), wxT("invalid wxDateTime")); + + return wxDateTime(m_time - diff.GetValue()); +} + +inline wxDateTime& wxDateTime::Subtract(const wxTimeSpan& diff) +{ + wxASSERT_MSG( IsValid(), wxT("invalid wxDateTime")); + + m_time -= diff.GetValue(); + + return *this; +} + +inline wxDateTime& wxDateTime::operator-=(const wxTimeSpan& diff) +{ + return Subtract(diff); +} + +inline wxTimeSpan wxDateTime::Subtract(const wxDateTime& datetime) const +{ + wxASSERT_MSG( IsValid() && datetime.IsValid(), wxT("invalid wxDateTime")); + + return wxTimeSpan(GetValue() - datetime.GetValue()); +} + +inline wxTimeSpan wxDateTime::operator-(const wxDateTime& dt2) const +{ + return this->Subtract(dt2); +} + +inline wxDateTime wxDateTime::Add(const wxDateSpan& diff) const +{ + return wxDateTime(*this).Add(diff); +} + +inline wxDateTime& wxDateTime::Subtract(const wxDateSpan& diff) +{ + return Add(diff.Negate()); +} + +inline wxDateTime wxDateTime::Subtract(const wxDateSpan& diff) const +{ + return wxDateTime(*this).Subtract(diff); +} + +inline wxDateTime& wxDateTime::operator-=(const wxDateSpan& diff) +{ + return Subtract(diff); +} + +inline wxDateTime& wxDateTime::operator+=(const wxDateSpan& diff) +{ + return Add(diff); +} + +// ---------------------------------------------------------------------------- +// wxDateTime and timezones +// ---------------------------------------------------------------------------- + +inline wxDateTime +wxDateTime::ToTimezone(const wxDateTime::TimeZone& tz, bool noDST) const +{ + MODIFY_AND_RETURN( MakeTimezone(tz, noDST) ); +} + +inline wxDateTime +wxDateTime::FromTimezone(const wxDateTime::TimeZone& tz, bool noDST) const +{ + MODIFY_AND_RETURN( MakeFromTimezone(tz, noDST) ); +} + +// ---------------------------------------------------------------------------- +// wxTimeSpan construction +// ---------------------------------------------------------------------------- + +inline wxTimeSpan::wxTimeSpan(long hours, + long minutes, + wxLongLong seconds, + wxLongLong milliseconds) +{ + // assign first to avoid precision loss + m_diff = hours; + m_diff *= 60l; + m_diff += minutes; + m_diff *= 60l; + m_diff += seconds; + m_diff *= 1000l; + m_diff += milliseconds; +} + +// ---------------------------------------------------------------------------- +// wxTimeSpan accessors +// ---------------------------------------------------------------------------- + +inline wxLongLong wxTimeSpan::GetSeconds() const +{ + return m_diff / 1000l; +} + +inline int wxTimeSpan::GetMinutes() const +{ + // For compatibility, this method (and the other accessors) return int, + // even though GetLo() actually returns unsigned long with greater range. + return static_cast((GetSeconds() / 60l).GetLo()); +} + +inline int wxTimeSpan::GetHours() const +{ + return GetMinutes() / 60; +} + +inline int wxTimeSpan::GetDays() const +{ + return GetHours() / 24; +} + +inline int wxTimeSpan::GetWeeks() const +{ + return GetDays() / 7; +} + +// ---------------------------------------------------------------------------- +// wxTimeSpan arithmetics +// ---------------------------------------------------------------------------- + +inline wxTimeSpan wxTimeSpan::Add(const wxTimeSpan& diff) const +{ + return wxTimeSpan(m_diff + diff.GetValue()); +} + +inline wxTimeSpan& wxTimeSpan::Add(const wxTimeSpan& diff) +{ + m_diff += diff.GetValue(); + + return *this; +} + +inline wxTimeSpan wxTimeSpan::Subtract(const wxTimeSpan& diff) const +{ + return wxTimeSpan(m_diff - diff.GetValue()); +} + +inline wxTimeSpan& wxTimeSpan::Subtract(const wxTimeSpan& diff) +{ + m_diff -= diff.GetValue(); + + return *this; +} + +inline wxTimeSpan& wxTimeSpan::Multiply(int n) +{ + m_diff *= (long)n; + + return *this; +} + +inline wxTimeSpan wxTimeSpan::Multiply(int n) const +{ + return wxTimeSpan(m_diff * (long)n); +} + +inline wxTimeSpan wxTimeSpan::Abs() const +{ + return wxTimeSpan(GetValue().Abs()); +} + +inline bool wxTimeSpan::IsEqualTo(const wxTimeSpan& ts) const +{ + return GetValue() == ts.GetValue(); +} + +inline bool wxTimeSpan::IsLongerThan(const wxTimeSpan& ts) const +{ + return GetValue().Abs() > ts.GetValue().Abs(); +} + +inline bool wxTimeSpan::IsShorterThan(const wxTimeSpan& ts) const +{ + return GetValue().Abs() < ts.GetValue().Abs(); +} + +// ---------------------------------------------------------------------------- +// wxDateSpan +// ---------------------------------------------------------------------------- + +inline wxDateSpan& wxDateSpan::operator+=(const wxDateSpan& other) +{ + m_years += other.m_years; + m_months += other.m_months; + m_weeks += other.m_weeks; + m_days += other.m_days; + + return *this; +} + +inline wxDateSpan& wxDateSpan::Add(const wxDateSpan& other) +{ + return *this += other; +} + +inline wxDateSpan wxDateSpan::Add(const wxDateSpan& other) const +{ + wxDateSpan ds(*this); + ds.Add(other); + return ds; +} + +inline wxDateSpan& wxDateSpan::Multiply(int factor) +{ + m_years *= factor; + m_months *= factor; + m_weeks *= factor; + m_days *= factor; + + return *this; +} + +inline wxDateSpan wxDateSpan::Multiply(int factor) const +{ + wxDateSpan ds(*this); + ds.Multiply(factor); + return ds; +} + +inline wxDateSpan wxDateSpan::Negate() const +{ + return wxDateSpan(-m_years, -m_months, -m_weeks, -m_days); +} + +inline wxDateSpan& wxDateSpan::Neg() +{ + m_years = -m_years; + m_months = -m_months; + m_weeks = -m_weeks; + m_days = -m_days; + + return *this; +} + +inline wxDateSpan& wxDateSpan::operator-=(const wxDateSpan& other) +{ + return *this += other.Negate(); +} + +inline wxDateSpan& wxDateSpan::Subtract(const wxDateSpan& other) +{ + return *this -= other; +} + +inline wxDateSpan wxDateSpan::Subtract(const wxDateSpan& other) const +{ + wxDateSpan ds(*this); + ds.Subtract(other); + return ds; +} + +#undef MILLISECONDS_PER_DAY + +#undef MODIFY_AND_RETURN + +// ============================================================================ +// binary operators +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxTimeSpan operators +// ---------------------------------------------------------------------------- + +wxTimeSpan WXDLLIMPEXP_BASE operator*(int n, const wxTimeSpan& ts); + +// ---------------------------------------------------------------------------- +// wxDateSpan +// ---------------------------------------------------------------------------- + +wxDateSpan WXDLLIMPEXP_BASE operator*(int n, const wxDateSpan& ds); + +// ============================================================================ +// other helper functions +// ============================================================================ + +// ---------------------------------------------------------------------------- +// iteration helpers: can be used to write a for loop over enum variable like +// this: +// for ( m = wxDateTime::Jan; m < wxDateTime::Inv_Month; wxNextMonth(m) ) +// ---------------------------------------------------------------------------- + +WXDLLIMPEXP_BASE void wxNextMonth(wxDateTime::Month& m); +WXDLLIMPEXP_BASE void wxPrevMonth(wxDateTime::Month& m); +WXDLLIMPEXP_BASE void wxNextWDay(wxDateTime::WeekDay& wd); +WXDLLIMPEXP_BASE void wxPrevWDay(wxDateTime::WeekDay& wd); + +#endif // wxUSE_DATETIME + +#endif // _WX_DATETIME_H diff --git a/wxmsw/include/wx-3.0/wx/datetimectrl.h b/wxmsw/include/wx-3.0/wx/datetimectrl.h new file mode 100644 index 00000000..30f23dff --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/datetimectrl.h @@ -0,0 +1,47 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/timectrl.h +// Purpose: Declaration of wxDateTimePickerCtrl class. +// Author: Vadim Zeitlin +// Created: 2011-09-22 +// Copyright: (c) 2011 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DATETIME_CTRL_H_ +#define _WX_DATETIME_CTRL_H_ + +#include "wx/defs.h" + +#if wxUSE_DATEPICKCTRL || wxUSE_TIMEPICKCTRL + +#define wxNEEDS_DATETIMEPICKCTRL + +#include "wx/control.h" // the base class + +#include "wx/datetime.h" + +// ---------------------------------------------------------------------------- +// wxDateTimePickerCtrl: Private common base class of wx{Date,Time}PickerCtrl. +// ---------------------------------------------------------------------------- + +// This class is an implementation detail and should not be used directly, only +// use the documented API of wxDateTimePickerCtrl and wxTimePickerCtrl. +class WXDLLIMPEXP_ADV wxDateTimePickerCtrlBase : public wxControl +{ +public: + // Set/get the date or time (in the latter case, time part is ignored). + virtual void SetValue(const wxDateTime& dt) = 0; + virtual wxDateTime GetValue() const = 0; +}; + +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + #include "wx/msw/datetimectrl.h" +#elif defined(__WXOSX_COCOA__) && !defined(__WXUNIVERSAL__) + #include "wx/osx/datetimectrl.h" +#else + typedef wxDateTimePickerCtrlBase wxDateTimePickerCtrl; +#endif + +#endif // wxUSE_DATEPICKCTRL || wxUSE_TIMEPICKCTRL + +#endif // _WX_DATETIME_CTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/datstrm.h b/wxmsw/include/wx-3.0/wx/datstrm.h new file mode 100644 index 00000000..477da30e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/datstrm.h @@ -0,0 +1,204 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/datstrm.h +// Purpose: Data stream classes +// Author: Guilhem Lavaux +// Modified by: Mickael Gilabert +// Created: 28/06/1998 +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DATSTREAM_H_ +#define _WX_DATSTREAM_H_ + +#include "wx/stream.h" +#include "wx/longlong.h" +#include "wx/convauto.h" + +#if wxUSE_STREAMS + +// Common wxDataInputStream and wxDataOutputStream parameters. +class WXDLLIMPEXP_BASE wxDataStreamBase +{ +public: + void BigEndianOrdered(bool be_order) { m_be_order = be_order; } + + // By default we use extended precision (80 bit) format for both float and + // doubles. Call this function to switch to alternative representation in + // which IEEE 754 single precision (32 bits) is used for floats and double + // precision (64 bits) is used for doubles. + void UseBasicPrecisions() + { +#if wxUSE_APPLE_IEEE + m_useExtendedPrecision = false; +#endif // wxUSE_APPLE_IEEE + } + + // UseExtendedPrecision() is not very useful as it corresponds to the + // default value, only call it in your code if you want the compilation + // fail with the error when using wxWidgets library compiled without + // extended precision support. +#if wxUSE_APPLE_IEEE + void UseExtendedPrecision() + { + m_useExtendedPrecision = true; + } +#endif // wxUSE_APPLE_IEEE + +#if wxUSE_UNICODE + void SetConv( const wxMBConv &conv ); + wxMBConv *GetConv() const { return m_conv; } +#endif + +protected: + // Ctor and dtor are both protected, this class is never used directly but + // only by its derived classes. + wxDataStreamBase(const wxMBConv& conv); + ~wxDataStreamBase(); + + + bool m_be_order; + +#if wxUSE_APPLE_IEEE + bool m_useExtendedPrecision; +#endif // wxUSE_APPLE_IEEE + +#if wxUSE_UNICODE + wxMBConv *m_conv; +#endif + + wxDECLARE_NO_COPY_CLASS(wxDataStreamBase); +}; + + +class WXDLLIMPEXP_BASE wxDataInputStream : public wxDataStreamBase +{ +public: + wxDataInputStream(wxInputStream& s, const wxMBConv& conv = wxConvUTF8); + + bool IsOk() { return m_input->IsOk(); } + +#if wxHAS_INT64 + wxUint64 Read64(); +#endif +#if wxUSE_LONGLONG + wxLongLong ReadLL(); +#endif + wxUint32 Read32(); + wxUint16 Read16(); + wxUint8 Read8(); + double ReadDouble(); + float ReadFloat(); + wxString ReadString(); + +#if wxHAS_INT64 + void Read64(wxUint64 *buffer, size_t size); + void Read64(wxInt64 *buffer, size_t size); +#endif +#if defined(wxLongLong_t) && wxUSE_LONGLONG + void Read64(wxULongLong *buffer, size_t size); + void Read64(wxLongLong *buffer, size_t size); +#endif +#if wxUSE_LONGLONG + void ReadLL(wxULongLong *buffer, size_t size); + void ReadLL(wxLongLong *buffer, size_t size); +#endif + void Read32(wxUint32 *buffer, size_t size); + void Read16(wxUint16 *buffer, size_t size); + void Read8(wxUint8 *buffer, size_t size); + void ReadDouble(double *buffer, size_t size); + void ReadFloat(float *buffer, size_t size); + + wxDataInputStream& operator>>(wxString& s); + wxDataInputStream& operator>>(wxInt8& c); + wxDataInputStream& operator>>(wxInt16& i); + wxDataInputStream& operator>>(wxInt32& i); + wxDataInputStream& operator>>(wxUint8& c); + wxDataInputStream& operator>>(wxUint16& i); + wxDataInputStream& operator>>(wxUint32& i); +#if wxHAS_INT64 + wxDataInputStream& operator>>(wxUint64& i); + wxDataInputStream& operator>>(wxInt64& i); +#endif +#if defined(wxLongLong_t) && wxUSE_LONGLONG + wxDataInputStream& operator>>(wxULongLong& i); + wxDataInputStream& operator>>(wxLongLong& i); +#endif + wxDataInputStream& operator>>(double& d); + wxDataInputStream& operator>>(float& f); + +protected: + wxInputStream *m_input; + + wxDECLARE_NO_COPY_CLASS(wxDataInputStream); +}; + +class WXDLLIMPEXP_BASE wxDataOutputStream : public wxDataStreamBase +{ +public: + wxDataOutputStream(wxOutputStream& s, const wxMBConv& conv = wxConvUTF8); + + bool IsOk() { return m_output->IsOk(); } + +#if wxHAS_INT64 + void Write64(wxUint64 i); + void Write64(wxInt64 i); +#endif +#if wxUSE_LONGLONG + void WriteLL(const wxLongLong &ll); + void WriteLL(const wxULongLong &ll); +#endif + void Write32(wxUint32 i); + void Write16(wxUint16 i); + void Write8(wxUint8 i); + void WriteDouble(double d); + void WriteFloat(float f); + void WriteString(const wxString& string); + +#if wxHAS_INT64 + void Write64(const wxUint64 *buffer, size_t size); + void Write64(const wxInt64 *buffer, size_t size); +#endif +#if defined(wxLongLong_t) && wxUSE_LONGLONG + void Write64(const wxULongLong *buffer, size_t size); + void Write64(const wxLongLong *buffer, size_t size); +#endif +#if wxUSE_LONGLONG + void WriteLL(const wxULongLong *buffer, size_t size); + void WriteLL(const wxLongLong *buffer, size_t size); +#endif + void Write32(const wxUint32 *buffer, size_t size); + void Write16(const wxUint16 *buffer, size_t size); + void Write8(const wxUint8 *buffer, size_t size); + void WriteDouble(const double *buffer, size_t size); + void WriteFloat(const float *buffer, size_t size); + + wxDataOutputStream& operator<<(const wxString& string); + wxDataOutputStream& operator<<(wxInt8 c); + wxDataOutputStream& operator<<(wxInt16 i); + wxDataOutputStream& operator<<(wxInt32 i); + wxDataOutputStream& operator<<(wxUint8 c); + wxDataOutputStream& operator<<(wxUint16 i); + wxDataOutputStream& operator<<(wxUint32 i); +#if wxHAS_INT64 + wxDataOutputStream& operator<<(wxUint64 i); + wxDataOutputStream& operator<<(wxInt64 i); +#endif +#if defined(wxLongLong_t) && wxUSE_LONGLONG + wxDataOutputStream& operator<<(const wxULongLong &i); + wxDataOutputStream& operator<<(const wxLongLong &i); +#endif + wxDataOutputStream& operator<<(double d); + wxDataOutputStream& operator<<(float f); + +protected: + wxOutputStream *m_output; + + wxDECLARE_NO_COPY_CLASS(wxDataOutputStream); +}; + +#endif + // wxUSE_STREAMS + +#endif + // _WX_DATSTREAM_H_ diff --git a/wxmsw/include/wx-3.0/wx/dc.h b/wxmsw/include/wx-3.0/wx/dc.h new file mode 100644 index 00000000..d1372050 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dc.h @@ -0,0 +1,1534 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dc.h +// Purpose: wxDC class +// Author: Vadim Zeitlin +// Modified by: +// Created: 05/25/99 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DC_H_BASE_ +#define _WX_DC_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers which we must include here +// ---------------------------------------------------------------------------- + +#include "wx/object.h" // the base class + +#include "wx/intl.h" // for wxLayoutDirection +#include "wx/cursor.h" // we have member variables of these classes +#include "wx/font.h" // so we can't do without them +#include "wx/colour.h" +#include "wx/bitmap.h" // for wxNullBitmap +#include "wx/brush.h" +#include "wx/pen.h" +#include "wx/palette.h" +#include "wx/dynarray.h" +#include "wx/math.h" +#include "wx/image.h" +#include "wx/region.h" +#include "wx/affinematrix2d.h" + +#define wxUSE_NEW_DC 1 + +class WXDLLIMPEXP_FWD_CORE wxDC; +class WXDLLIMPEXP_FWD_CORE wxClientDC; +class WXDLLIMPEXP_FWD_CORE wxPaintDC; +class WXDLLIMPEXP_FWD_CORE wxWindowDC; +class WXDLLIMPEXP_FWD_CORE wxScreenDC; +class WXDLLIMPEXP_FWD_CORE wxMemoryDC; +class WXDLLIMPEXP_FWD_CORE wxPrinterDC; +class WXDLLIMPEXP_FWD_CORE wxPrintData; + +#if wxUSE_GRAPHICS_CONTEXT +class WXDLLIMPEXP_FWD_CORE wxGraphicsContext; +#endif + +// Logical ops +enum wxRasterOperationMode +{ + wxCLEAR, // 0 + wxXOR, // src XOR dst + wxINVERT, // NOT dst + wxOR_REVERSE, // src OR (NOT dst) + wxAND_REVERSE, // src AND (NOT dst) + wxCOPY, // src + wxAND, // src AND dst + wxAND_INVERT, // (NOT src) AND dst + wxNO_OP, // dst + wxNOR, // (NOT src) AND (NOT dst) + wxEQUIV, // (NOT src) XOR dst + wxSRC_INVERT, // (NOT src) + wxOR_INVERT, // (NOT src) OR dst + wxNAND, // (NOT src) OR (NOT dst) + wxOR, // src OR dst + wxSET // 1 +#if WXWIN_COMPATIBILITY_2_8 + ,wxROP_BLACK = wxCLEAR, + wxBLIT_BLACKNESS = wxCLEAR, + wxROP_XORPEN = wxXOR, + wxBLIT_SRCINVERT = wxXOR, + wxROP_NOT = wxINVERT, + wxBLIT_DSTINVERT = wxINVERT, + wxROP_MERGEPENNOT = wxOR_REVERSE, + wxBLIT_00DD0228 = wxOR_REVERSE, + wxROP_MASKPENNOT = wxAND_REVERSE, + wxBLIT_SRCERASE = wxAND_REVERSE, + wxROP_COPYPEN = wxCOPY, + wxBLIT_SRCCOPY = wxCOPY, + wxROP_MASKPEN = wxAND, + wxBLIT_SRCAND = wxAND, + wxROP_MASKNOTPEN = wxAND_INVERT, + wxBLIT_00220326 = wxAND_INVERT, + wxROP_NOP = wxNO_OP, + wxBLIT_00AA0029 = wxNO_OP, + wxROP_NOTMERGEPEN = wxNOR, + wxBLIT_NOTSRCERASE = wxNOR, + wxROP_NOTXORPEN = wxEQUIV, + wxBLIT_00990066 = wxEQUIV, + wxROP_NOTCOPYPEN = wxSRC_INVERT, + wxBLIT_NOTSCRCOPY = wxSRC_INVERT, + wxROP_MERGENOTPEN = wxOR_INVERT, + wxBLIT_MERGEPAINT = wxOR_INVERT, + wxROP_NOTMASKPEN = wxNAND, + wxBLIT_007700E6 = wxNAND, + wxROP_MERGEPEN = wxOR, + wxBLIT_SRCPAINT = wxOR, + wxROP_WHITE = wxSET, + wxBLIT_WHITENESS = wxSET +#endif //WXWIN_COMPATIBILITY_2_8 +}; + +// Flood styles +enum wxFloodFillStyle +{ + wxFLOOD_SURFACE = 1, + wxFLOOD_BORDER +}; + +// Mapping modes +enum wxMappingMode +{ + wxMM_TEXT = 1, + wxMM_METRIC, + wxMM_LOMETRIC, + wxMM_TWIPS, + wxMM_POINTS +}; + +// Description of text characteristics. +struct wxFontMetrics +{ + wxFontMetrics() + { + height = + ascent = + descent = + internalLeading = + externalLeading = + averageWidth = 0; + } + + int height, // Total character height. + ascent, // Part of the height above the baseline. + descent, // Part of the height below the baseline. + internalLeading, // Intra-line spacing. + externalLeading, // Inter-line spacing. + averageWidth; // Average font width, a.k.a. "x-width". +}; + +#if WXWIN_COMPATIBILITY_2_8 + +//----------------------------------------------------------------------------- +// wxDrawObject helper class +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDrawObject +{ +public: + wxDEPRECATED_CONSTRUCTOR(wxDrawObject)() + : m_isBBoxValid(false) + , m_minX(0), m_minY(0), m_maxX(0), m_maxY(0) + { } + + virtual ~wxDrawObject() { } + + virtual void Draw(wxDC&) const { } + + virtual void CalcBoundingBox(wxCoord x, wxCoord y) + { + if ( m_isBBoxValid ) + { + if ( x < m_minX ) m_minX = x; + if ( y < m_minY ) m_minY = y; + if ( x > m_maxX ) m_maxX = x; + if ( y > m_maxY ) m_maxY = y; + } + else + { + m_isBBoxValid = true; + + m_minX = x; + m_minY = y; + m_maxX = x; + m_maxY = y; + } + } + + void ResetBoundingBox() + { + m_isBBoxValid = false; + + m_minX = m_maxX = m_minY = m_maxY = 0; + } + + // Get the final bounding box of the PostScript or Metafile picture. + + wxCoord MinX() const { return m_minX; } + wxCoord MaxX() const { return m_maxX; } + wxCoord MinY() const { return m_minY; } + wxCoord MaxY() const { return m_maxY; } + + //to define the type of object for derived objects + virtual int GetType()=0; + +protected: + //for boundingbox calculation + bool m_isBBoxValid:1; + //for boundingbox calculation + wxCoord m_minX, m_minY, m_maxX, m_maxY; +}; + +#endif // WXWIN_COMPATIBILITY_2_8 + + +//----------------------------------------------------------------------------- +// wxDCFactory +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxDCImpl; + +class WXDLLIMPEXP_CORE wxDCFactory +{ +public: + wxDCFactory() {} + virtual ~wxDCFactory() {} + + virtual wxDCImpl* CreateWindowDC( wxWindowDC *owner, wxWindow *window ) = 0; + virtual wxDCImpl* CreateClientDC( wxClientDC *owner, wxWindow *window ) = 0; + virtual wxDCImpl* CreatePaintDC( wxPaintDC *owner, wxWindow *window ) = 0; + virtual wxDCImpl* CreateMemoryDC( wxMemoryDC *owner ) = 0; + virtual wxDCImpl* CreateMemoryDC( wxMemoryDC *owner, wxBitmap &bitmap ) = 0; + virtual wxDCImpl* CreateMemoryDC( wxMemoryDC *owner, wxDC *dc ) = 0; + virtual wxDCImpl* CreateScreenDC( wxScreenDC *owner ) = 0; +#if wxUSE_PRINTING_ARCHITECTURE + virtual wxDCImpl* CreatePrinterDC( wxPrinterDC *owner, const wxPrintData &data ) = 0; +#endif + + static void Set(wxDCFactory *factory); + static wxDCFactory *Get(); + +private: + static wxDCFactory *m_factory; +}; + +//----------------------------------------------------------------------------- +// wxNativeDCFactory +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxNativeDCFactory: public wxDCFactory +{ +public: + wxNativeDCFactory() {} + + virtual wxDCImpl* CreateWindowDC( wxWindowDC *owner, wxWindow *window ); + virtual wxDCImpl* CreateClientDC( wxClientDC *owner, wxWindow *window ); + virtual wxDCImpl* CreatePaintDC( wxPaintDC *owner, wxWindow *window ); + virtual wxDCImpl* CreateMemoryDC( wxMemoryDC *owner ); + virtual wxDCImpl* CreateMemoryDC( wxMemoryDC *owner, wxBitmap &bitmap ); + virtual wxDCImpl* CreateMemoryDC( wxMemoryDC *owner, wxDC *dc ); + virtual wxDCImpl* CreateScreenDC( wxScreenDC *owner ); +#if wxUSE_PRINTING_ARCHITECTURE + virtual wxDCImpl* CreatePrinterDC( wxPrinterDC *owner, const wxPrintData &data ); +#endif +}; + +//----------------------------------------------------------------------------- +// wxDCImpl +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDCImpl: public wxObject +{ +public: + wxDCImpl( wxDC *owner ); + virtual ~wxDCImpl(); + + wxDC *GetOwner() const { return m_owner; } + + wxWindow* GetWindow() const { return m_window; } + + virtual bool IsOk() const { return m_ok; } + + // query capabilities + + virtual bool CanDrawBitmap() const = 0; + virtual bool CanGetTextExtent() const = 0; + + // get Cairo context + virtual void* GetCairoContext() const + { + return NULL; + } + + virtual void* GetHandle() const { return NULL; } + + // query dimension, colour deps, resolution + + virtual void DoGetSize(int *width, int *height) const = 0; + void GetSize(int *width, int *height) const + { + DoGetSize(width, height); + return ; + } + + wxSize GetSize() const + { + int w, h; + DoGetSize(&w, &h); + return wxSize(w, h); + } + + virtual void DoGetSizeMM(int* width, int* height) const = 0; + + virtual int GetDepth() const = 0; + virtual wxSize GetPPI() const = 0; + + // Right-To-Left (RTL) modes + + virtual void SetLayoutDirection(wxLayoutDirection WXUNUSED(dir)) { } + virtual wxLayoutDirection GetLayoutDirection() const { return wxLayout_Default; } + + // page and document + + virtual bool StartDoc(const wxString& WXUNUSED(message)) { return true; } + virtual void EndDoc() { } + + virtual void StartPage() { } + virtual void EndPage() { } + + // flushing the content of this dc immediately eg onto screen + virtual void Flush() { } + + // bounding box + + virtual void CalcBoundingBox(wxCoord x, wxCoord y) + { + if ( m_isBBoxValid ) + { + if ( x < m_minX ) m_minX = x; + if ( y < m_minY ) m_minY = y; + if ( x > m_maxX ) m_maxX = x; + if ( y > m_maxY ) m_maxY = y; + } + else + { + m_isBBoxValid = true; + + m_minX = x; + m_minY = y; + m_maxX = x; + m_maxY = y; + } + } + void ResetBoundingBox() + { + m_isBBoxValid = false; + + m_minX = m_maxX = m_minY = m_maxY = 0; + } + + wxCoord MinX() const { return m_minX; } + wxCoord MaxX() const { return m_maxX; } + wxCoord MinY() const { return m_minY; } + wxCoord MaxY() const { return m_maxY; } + + // setters and getters + + virtual void SetFont(const wxFont& font) = 0; + virtual const wxFont& GetFont() const { return m_font; } + + virtual void SetPen(const wxPen& pen) = 0; + virtual const wxPen& GetPen() const { return m_pen; } + + virtual void SetBrush(const wxBrush& brush) = 0; + virtual const wxBrush& GetBrush() const { return m_brush; } + + virtual void SetBackground(const wxBrush& brush) = 0; + virtual const wxBrush& GetBackground() const { return m_backgroundBrush; } + + virtual void SetBackgroundMode(int mode) = 0; + virtual int GetBackgroundMode() const { return m_backgroundMode; } + + virtual void SetTextForeground(const wxColour& colour) + { m_textForegroundColour = colour; } + virtual const wxColour& GetTextForeground() const + { return m_textForegroundColour; } + + virtual void SetTextBackground(const wxColour& colour) + { m_textBackgroundColour = colour; } + virtual const wxColour& GetTextBackground() const + { return m_textBackgroundColour; } + +#if wxUSE_PALETTE + virtual void SetPalette(const wxPalette& palette) = 0; +#endif // wxUSE_PALETTE + + // inherit the DC attributes (font and colours) from the given window + // + // this is called automatically when a window, client or paint DC is + // created + virtual void InheritAttributes(wxWindow *win); + + + // logical functions + + virtual void SetLogicalFunction(wxRasterOperationMode function) = 0; + virtual wxRasterOperationMode GetLogicalFunction() const + { return m_logicalFunction; } + + // text measurement + + virtual wxCoord GetCharHeight() const = 0; + virtual wxCoord GetCharWidth() const = 0; + + // The derived classes should really override DoGetFontMetrics() to return + // the correct values in the future but for now provide a default + // implementation in terms of DoGetTextExtent() to avoid breaking the + // compilation of all other ports as wxMSW is the only one to implement it. + virtual void DoGetFontMetrics(int *height, + int *ascent, + int *descent, + int *internalLeading, + int *externalLeading, + int *averageWidth) const; + + virtual void DoGetTextExtent(const wxString& string, + wxCoord *x, wxCoord *y, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + const wxFont *theFont = NULL) const = 0; + virtual void GetMultiLineTextExtent(const wxString& string, + wxCoord *width, + wxCoord *height, + wxCoord *heightLine = NULL, + const wxFont *font = NULL) const; + virtual bool DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const; + + // clearing + + virtual void Clear() = 0; + + // clipping + + // Note that this pure virtual method has an implementation that updates + // the values returned by DoGetClippingBox() and so can be called from the + // derived class overridden version if it makes sense (i.e. if the clipping + // box coordinates are not already updated in some other way). + virtual void DoSetClippingRegion(wxCoord x, wxCoord y, + wxCoord w, wxCoord h) = 0; + + // NB: this function works with device coordinates, not the logical ones! + virtual void DoSetDeviceClippingRegion(const wxRegion& region) = 0; + + virtual void DoGetClippingBox(wxCoord *x, wxCoord *y, + wxCoord *w, wxCoord *h) const + { + if ( x ) + *x = m_clipX1; + if ( y ) + *y = m_clipY1; + if ( w ) + *w = m_clipX2 - m_clipX1; + if ( h ) + *h = m_clipY2 - m_clipY1; + } + + virtual void DestroyClippingRegion() { ResetClipping(); } + + + // coordinates conversions and transforms + + virtual wxCoord DeviceToLogicalX(wxCoord x) const; + virtual wxCoord DeviceToLogicalY(wxCoord y) const; + virtual wxCoord DeviceToLogicalXRel(wxCoord x) const; + virtual wxCoord DeviceToLogicalYRel(wxCoord y) const; + virtual wxCoord LogicalToDeviceX(wxCoord x) const; + virtual wxCoord LogicalToDeviceY(wxCoord y) const; + virtual wxCoord LogicalToDeviceXRel(wxCoord x) const; + virtual wxCoord LogicalToDeviceYRel(wxCoord y) const; + + virtual void SetMapMode(wxMappingMode mode); + virtual wxMappingMode GetMapMode() const { return m_mappingMode; } + + virtual void SetUserScale(double x, double y); + virtual void GetUserScale(double *x, double *y) const + { + if ( x ) *x = m_userScaleX; + if ( y ) *y = m_userScaleY; + } + + virtual void SetLogicalScale(double x, double y); + virtual void GetLogicalScale(double *x, double *y) const + { + if ( x ) *x = m_logicalScaleX; + if ( y ) *y = m_logicalScaleY; + } + + virtual void SetLogicalOrigin(wxCoord x, wxCoord y); + virtual void DoGetLogicalOrigin(wxCoord *x, wxCoord *y) const + { + if ( x ) *x = m_logicalOriginX; + if ( y ) *y = m_logicalOriginY; + } + + virtual void SetDeviceOrigin(wxCoord x, wxCoord y); + virtual void DoGetDeviceOrigin(wxCoord *x, wxCoord *y) const + { + if ( x ) *x = m_deviceOriginX; + if ( y ) *y = m_deviceOriginY; + } + +#if wxUSE_DC_TRANSFORM_MATRIX + // Transform matrix support is not available in most ports right now + // (currently only wxMSW provides it) so do nothing in these methods by + // default. + virtual bool CanUseTransformMatrix() const + { return false; } + virtual bool SetTransformMatrix(const wxAffineMatrix2D& WXUNUSED(matrix)) + { return false; } + virtual wxAffineMatrix2D GetTransformMatrix() const + { return wxAffineMatrix2D(); } + virtual void ResetTransformMatrix() + { } +#endif // wxUSE_DC_TRANSFORM_MATRIX + + virtual void SetDeviceLocalOrigin( wxCoord x, wxCoord y ); + + virtual void ComputeScaleAndOrigin(); + + // this needs to overidden if the axis is inverted + virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp); + + virtual double GetContentScaleFactor() const { return m_contentScaleFactor; } + +#ifdef __WXMSW__ + // Native Windows functions using the underlying HDC don't honour GDI+ + // transformations which may be applied to it. Using this function we can + // transform the coordinates manually before passing them to such functions + // (as in e.g. wxRendererMSW code). It doesn't do anything if this is not a + // wxGCDC. + virtual wxRect MSWApplyGDIPlusTransform(const wxRect& r) const + { + return r; + } +#endif // __WXMSW__ + + + // --------------------------------------------------------- + // the actual drawing API + + virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, + wxFloodFillStyle style = wxFLOOD_SURFACE) = 0; + + virtual void DoGradientFillLinear(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + wxDirection nDirection = wxEAST); + + virtual void DoGradientFillConcentric(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + const wxPoint& circleCenter); + + virtual bool DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const = 0; + + virtual void DoDrawPoint(wxCoord x, wxCoord y) = 0; + virtual void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) = 0; + + virtual void DoDrawArc(wxCoord x1, wxCoord y1, + wxCoord x2, wxCoord y2, + wxCoord xc, wxCoord yc) = 0; + virtual void DoDrawCheckMark(wxCoord x, wxCoord y, + wxCoord width, wxCoord height); + virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, + double sa, double ea) = 0; + + virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) = 0; + virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y, + wxCoord width, wxCoord height, + double radius) = 0; + virtual void DoDrawEllipse(wxCoord x, wxCoord y, + wxCoord width, wxCoord height) = 0; + + virtual void DoCrossHair(wxCoord x, wxCoord y) = 0; + + virtual void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y) = 0; + virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, + bool useMask = false) = 0; + + virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y) = 0; + virtual void DoDrawRotatedText(const wxString& text, + wxCoord x, wxCoord y, double angle) = 0; + + virtual bool DoBlit(wxCoord xdest, wxCoord ydest, + wxCoord width, wxCoord height, + wxDC *source, + wxCoord xsrc, wxCoord ysrc, + wxRasterOperationMode rop = wxCOPY, + bool useMask = false, + wxCoord xsrcMask = wxDefaultCoord, + wxCoord ysrcMask = wxDefaultCoord) = 0; + + virtual bool DoStretchBlit(wxCoord xdest, wxCoord ydest, + wxCoord dstWidth, wxCoord dstHeight, + wxDC *source, + wxCoord xsrc, wxCoord ysrc, + wxCoord srcWidth, wxCoord srcHeight, + wxRasterOperationMode rop = wxCOPY, + bool useMask = false, + wxCoord xsrcMask = wxDefaultCoord, + wxCoord ysrcMask = wxDefaultCoord); + + virtual wxBitmap DoGetAsBitmap(const wxRect *WXUNUSED(subrect)) const + { return wxNullBitmap; } + + + virtual void DoDrawLines(int n, const wxPoint points[], + wxCoord xoffset, wxCoord yoffset ) = 0; + virtual void DrawLines(const wxPointList *list, + wxCoord xoffset, wxCoord yoffset ); + + virtual void DoDrawPolygon(int n, const wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + wxPolygonFillMode fillStyle = wxODDEVEN_RULE) = 0; + virtual void DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + wxPolygonFillMode fillStyle); + void DrawPolygon(const wxPointList *list, + wxCoord xoffset, wxCoord yoffset, + wxPolygonFillMode fillStyle ); + + +#if wxUSE_SPLINES + void DrawSpline(wxCoord x1, wxCoord y1, + wxCoord x2, wxCoord y2, + wxCoord x3, wxCoord y3); + void DrawSpline(int n, const wxPoint points[]); + void DrawSpline(const wxPointList *points) { DoDrawSpline(points); } + + virtual void DoDrawSpline(const wxPointList *points); +#endif + + // --------------------------------------------------------- + // wxMemoryDC Impl API + + virtual void DoSelect(const wxBitmap& WXUNUSED(bmp)) + { } + + virtual const wxBitmap& GetSelectedBitmap() const + { return wxNullBitmap; } + virtual wxBitmap& GetSelectedBitmap() + { return wxNullBitmap; } + + // --------------------------------------------------------- + // wxPrinterDC Impl API + + virtual wxRect GetPaperRect() const + { int w = 0; int h = 0; DoGetSize( &w, &h ); return wxRect(0,0,w,h); } + + virtual int GetResolution() const + { return -1; } + +#if wxUSE_GRAPHICS_CONTEXT + virtual wxGraphicsContext* GetGraphicsContext() const + { return NULL; } + virtual void SetGraphicsContext( wxGraphicsContext* WXUNUSED(ctx) ) + {} +#endif + +private: + wxDC *m_owner; + +protected: + // unset clipping variables (after clipping region was destroyed) + void ResetClipping() + { + m_clipping = false; + + m_clipX1 = m_clipX2 = m_clipY1 = m_clipY2 = 0; + } + +#ifdef __WXWINCE__ + //! Generic method to draw ellipses, circles and arcs with current pen and brush. + /*! \param x Upper left corner of bounding box. + * \param y Upper left corner of bounding box. + * \param w Width of bounding box. + * \param h Height of bounding box. + * \param sa Starting angle of arc + * (counterclockwise, start at 3 o'clock, 360 is full circle). + * \param ea Ending angle of arc. + * \param angle Rotation angle, the Arc will be rotated after + * calculating begin and end. + */ + void DrawEllipticArcRot( wxCoord x, wxCoord y, + wxCoord width, wxCoord height, + double sa = 0, double ea = 0, double angle = 0 ) + { DoDrawEllipticArcRot( x, y, width, height, sa, ea, angle ); } + + void DrawEllipticArcRot( const wxPoint& pt, + const wxSize& sz, + double sa = 0, double ea = 0, double angle = 0 ) + { DoDrawEllipticArcRot( pt.x, pt.y, sz.x, sz.y, sa, ea, angle ); } + + void DrawEllipticArcRot( const wxRect& rect, + double sa = 0, double ea = 0, double angle = 0 ) + { DoDrawEllipticArcRot( rect.x, rect.y, rect.width, rect.height, sa, ea, angle ); } + + virtual void DoDrawEllipticArcRot( wxCoord x, wxCoord y, + wxCoord w, wxCoord h, + double sa = 0, double ea = 0, double angle = 0 ); + + //! Rotates points around center. + /*! This is a quite straight method, it calculates in pixels + * and so it produces rounding errors. + * \param points The points inside will be rotated. + * \param angle Rotating angle (counterclockwise, start at 3 o'clock, 360 is full circle). + * \param center Center of rotation. + */ + void Rotate( wxPointList* points, double angle, wxPoint center = wxPoint(0,0) ); + + // used by DrawEllipticArcRot + // Careful: wxList gets filled with points you have to delete later. + void CalculateEllipticPoints( wxPointList* points, + wxCoord xStart, wxCoord yStart, + wxCoord w, wxCoord h, + double sa, double ea ); +#endif // __WXWINCE__ + + // returns adjustment factor for converting wxFont "point size"; in wx + // it is point size on screen and needs to be multiplied by this value + // for rendering on higher-resolution DCs such as printer ones + static float GetFontPointSizeAdjustment(float dpi); + + // window on which the DC draws or NULL + wxWindow *m_window; + + // flags + bool m_colour:1; + bool m_ok:1; + bool m_clipping:1; + bool m_isInteractive:1; + bool m_isBBoxValid:1; + + // coordinate system variables + + wxCoord m_logicalOriginX, m_logicalOriginY; + wxCoord m_deviceOriginX, m_deviceOriginY; // Usually 0,0, can be change by user + + wxCoord m_deviceLocalOriginX, m_deviceLocalOriginY; // non-zero if native top-left corner + // is not at 0,0. This was the case under + // Mac's GrafPorts (coordinate system + // used toplevel window's origin) and + // e.g. for Postscript, where the native + // origin in the bottom left corner. + double m_logicalScaleX, m_logicalScaleY; + double m_userScaleX, m_userScaleY; + double m_scaleX, m_scaleY; // calculated from logical scale and user scale + + int m_signX, m_signY; // Used by SetAxisOrientation() to invert the axes + + double m_contentScaleFactor; // used by high resolution displays (retina) + + // what is a mm on a screen you don't know the size of? + double m_mm_to_pix_x, + m_mm_to_pix_y; + + // bounding and clipping boxes + wxCoord m_minX, m_minY, m_maxX, m_maxY; + wxCoord m_clipX1, m_clipY1, m_clipX2, m_clipY2; + + wxRasterOperationMode m_logicalFunction; + int m_backgroundMode; + wxMappingMode m_mappingMode; + + wxPen m_pen; + wxBrush m_brush; + wxBrush m_backgroundBrush; + wxColour m_textForegroundColour; + wxColour m_textBackgroundColour; + wxFont m_font; + +#if wxUSE_PALETTE + wxPalette m_palette; + bool m_hasCustomPalette; +#endif // wxUSE_PALETTE + +private: + DECLARE_ABSTRACT_CLASS(wxDCImpl) +}; + + +class WXDLLIMPEXP_CORE wxDC : public wxObject +{ +public: + // copy attributes (font, colours and writing direction) from another DC + void CopyAttributes(const wxDC& dc); + + virtual ~wxDC() { delete m_pimpl; } + + wxDCImpl *GetImpl() + { return m_pimpl; } + const wxDCImpl *GetImpl() const + { return m_pimpl; } + + wxWindow *GetWindow() const + { return m_pimpl->GetWindow(); } + + void *GetHandle() const + { return m_pimpl->GetHandle(); } + + bool IsOk() const + { return m_pimpl && m_pimpl->IsOk(); } + + // query capabilities + + bool CanDrawBitmap() const + { return m_pimpl->CanDrawBitmap(); } + bool CanGetTextExtent() const + { return m_pimpl->CanGetTextExtent(); } + + // query dimension, colour deps, resolution + + void GetSize(int *width, int *height) const + { m_pimpl->DoGetSize(width, height); } + wxSize GetSize() const + { return m_pimpl->GetSize(); } + + void GetSizeMM(int* width, int* height) const + { m_pimpl->DoGetSizeMM(width, height); } + wxSize GetSizeMM() const + { + int w, h; + m_pimpl->DoGetSizeMM(&w, &h); + return wxSize(w, h); + } + + int GetDepth() const + { return m_pimpl->GetDepth(); } + wxSize GetPPI() const + { return m_pimpl->GetPPI(); } + + virtual int GetResolution() const + { return m_pimpl->GetResolution(); } + + double GetContentScaleFactor() const + { return m_pimpl->GetContentScaleFactor(); } + + // Right-To-Left (RTL) modes + + void SetLayoutDirection(wxLayoutDirection dir) + { m_pimpl->SetLayoutDirection( dir ); } + wxLayoutDirection GetLayoutDirection() const + { return m_pimpl->GetLayoutDirection(); } + + // page and document + + bool StartDoc(const wxString& message) + { return m_pimpl->StartDoc(message); } + void EndDoc() + { m_pimpl->EndDoc(); } + + void StartPage() + { m_pimpl->StartPage(); } + void EndPage() + { m_pimpl->EndPage(); } + + // bounding box + + void CalcBoundingBox(wxCoord x, wxCoord y) + { m_pimpl->CalcBoundingBox(x,y); } + void ResetBoundingBox() + { m_pimpl->ResetBoundingBox(); } + + wxCoord MinX() const + { return m_pimpl->MinX(); } + wxCoord MaxX() const + { return m_pimpl->MaxX(); } + wxCoord MinY() const + { return m_pimpl->MinY(); } + wxCoord MaxY() const + { return m_pimpl->MaxY(); } + + // setters and getters + + void SetFont(const wxFont& font) + { m_pimpl->SetFont( font ); } + const wxFont& GetFont() const + { return m_pimpl->GetFont(); } + + void SetPen(const wxPen& pen) + { m_pimpl->SetPen( pen ); } + const wxPen& GetPen() const + { return m_pimpl->GetPen(); } + + void SetBrush(const wxBrush& brush) + { m_pimpl->SetBrush( brush ); } + const wxBrush& GetBrush() const + { return m_pimpl->GetBrush(); } + + void SetBackground(const wxBrush& brush) + { m_pimpl->SetBackground( brush ); } + const wxBrush& GetBackground() const + { return m_pimpl->GetBackground(); } + + void SetBackgroundMode(int mode) + { m_pimpl->SetBackgroundMode( mode ); } + int GetBackgroundMode() const + { return m_pimpl->GetBackgroundMode(); } + + void SetTextForeground(const wxColour& colour) + { m_pimpl->SetTextForeground(colour); } + const wxColour& GetTextForeground() const + { return m_pimpl->GetTextForeground(); } + + void SetTextBackground(const wxColour& colour) + { m_pimpl->SetTextBackground(colour); } + const wxColour& GetTextBackground() const + { return m_pimpl->GetTextBackground(); } + +#if wxUSE_PALETTE + void SetPalette(const wxPalette& palette) + { m_pimpl->SetPalette(palette); } +#endif // wxUSE_PALETTE + + // logical functions + + void SetLogicalFunction(wxRasterOperationMode function) + { m_pimpl->SetLogicalFunction(function); } + wxRasterOperationMode GetLogicalFunction() const + { return m_pimpl->GetLogicalFunction(); } + + // text measurement + + wxCoord GetCharHeight() const + { return m_pimpl->GetCharHeight(); } + wxCoord GetCharWidth() const + { return m_pimpl->GetCharWidth(); } + + wxFontMetrics GetFontMetrics() const + { + wxFontMetrics fm; + m_pimpl->DoGetFontMetrics(&fm.height, &fm.ascent, &fm.descent, + &fm.internalLeading, &fm.externalLeading, + &fm.averageWidth); + return fm; + } + + void GetTextExtent(const wxString& string, + wxCoord *x, wxCoord *y, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + const wxFont *theFont = NULL) const + { m_pimpl->DoGetTextExtent(string, x, y, descent, externalLeading, theFont); } + + wxSize GetTextExtent(const wxString& string) const + { + wxCoord w, h; + m_pimpl->DoGetTextExtent(string, &w, &h); + return wxSize(w, h); + } + + void GetMultiLineTextExtent(const wxString& string, + wxCoord *width, + wxCoord *height, + wxCoord *heightLine = NULL, + const wxFont *font = NULL) const + { m_pimpl->GetMultiLineTextExtent( string, width, height, heightLine, font ); } + + wxSize GetMultiLineTextExtent(const wxString& string) const + { + wxCoord w, h; + m_pimpl->GetMultiLineTextExtent(string, &w, &h); + return wxSize(w, h); + } + + bool GetPartialTextExtents(const wxString& text, wxArrayInt& widths) const + { return m_pimpl->DoGetPartialTextExtents(text, widths); } + + // clearing + + void Clear() + { m_pimpl->Clear(); } + + // clipping + + void SetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height) + { m_pimpl->DoSetClippingRegion(x, y, width, height); } + void SetClippingRegion(const wxPoint& pt, const wxSize& sz) + { m_pimpl->DoSetClippingRegion(pt.x, pt.y, sz.x, sz.y); } + void SetClippingRegion(const wxRect& rect) + { m_pimpl->DoSetClippingRegion(rect.x, rect.y, rect.width, rect.height); } + + // unlike the functions above, the coordinates of the region used in this + // one are in device coordinates, not the logical ones + void SetDeviceClippingRegion(const wxRegion& region) + { m_pimpl->DoSetDeviceClippingRegion(region); } + + // this function is deprecated because its name is confusing: you may + // expect it to work with logical coordinates but, in fact, it does exactly + // the same thing as SetDeviceClippingRegion() + // + // please review the code using it and either replace it with calls to + // SetDeviceClippingRegion() or correct it if it was [wrongly] passing + // logical coordinates to this function + wxDEPRECATED_INLINE(void SetClippingRegion(const wxRegion& region), + SetDeviceClippingRegion(region); ) + + void DestroyClippingRegion() + { m_pimpl->DestroyClippingRegion(); } + + void GetClippingBox(wxCoord *x, wxCoord *y, wxCoord *w, wxCoord *h) const + { m_pimpl->DoGetClippingBox(x, y, w, h); } + void GetClippingBox(wxRect& rect) const + { m_pimpl->DoGetClippingBox(&rect.x, &rect.y, &rect.width, &rect.height); } + + // coordinates conversions and transforms + + wxCoord DeviceToLogicalX(wxCoord x) const + { return m_pimpl->DeviceToLogicalX(x); } + wxCoord DeviceToLogicalY(wxCoord y) const + { return m_pimpl->DeviceToLogicalY(y); } + wxCoord DeviceToLogicalXRel(wxCoord x) const + { return m_pimpl->DeviceToLogicalXRel(x); } + wxCoord DeviceToLogicalYRel(wxCoord y) const + { return m_pimpl->DeviceToLogicalYRel(y); } + wxCoord LogicalToDeviceX(wxCoord x) const + { return m_pimpl->LogicalToDeviceX(x); } + wxCoord LogicalToDeviceY(wxCoord y) const + { return m_pimpl->LogicalToDeviceY(y); } + wxCoord LogicalToDeviceXRel(wxCoord x) const + { return m_pimpl->LogicalToDeviceXRel(x); } + wxCoord LogicalToDeviceYRel(wxCoord y) const + { return m_pimpl->LogicalToDeviceYRel(y); } + + void SetMapMode(wxMappingMode mode) + { m_pimpl->SetMapMode(mode); } + wxMappingMode GetMapMode() const + { return m_pimpl->GetMapMode(); } + + void SetUserScale(double x, double y) + { m_pimpl->SetUserScale(x,y); } + void GetUserScale(double *x, double *y) const + { m_pimpl->GetUserScale( x, y ); } + + void SetLogicalScale(double x, double y) + { m_pimpl->SetLogicalScale( x, y ); } + void GetLogicalScale(double *x, double *y) const + { m_pimpl->GetLogicalScale( x, y ); } + + void SetLogicalOrigin(wxCoord x, wxCoord y) + { m_pimpl->SetLogicalOrigin(x,y); } + void GetLogicalOrigin(wxCoord *x, wxCoord *y) const + { m_pimpl->DoGetLogicalOrigin(x, y); } + wxPoint GetLogicalOrigin() const + { wxCoord x, y; m_pimpl->DoGetLogicalOrigin(&x, &y); return wxPoint(x, y); } + + void SetDeviceOrigin(wxCoord x, wxCoord y) + { m_pimpl->SetDeviceOrigin( x, y); } + void GetDeviceOrigin(wxCoord *x, wxCoord *y) const + { m_pimpl->DoGetDeviceOrigin(x, y); } + wxPoint GetDeviceOrigin() const + { wxCoord x, y; m_pimpl->DoGetDeviceOrigin(&x, &y); return wxPoint(x, y); } + + void SetAxisOrientation(bool xLeftRight, bool yBottomUp) + { m_pimpl->SetAxisOrientation(xLeftRight, yBottomUp); } + +#if wxUSE_DC_TRANSFORM_MATRIX + bool CanUseTransformMatrix() const + { return m_pimpl->CanUseTransformMatrix(); } + + bool SetTransformMatrix(const wxAffineMatrix2D &matrix) + { return m_pimpl->SetTransformMatrix(matrix); } + + wxAffineMatrix2D GetTransformMatrix() const + { return m_pimpl->GetTransformMatrix(); } + + void ResetTransformMatrix() + { m_pimpl->ResetTransformMatrix(); } +#endif // wxUSE_DC_TRANSFORM_MATRIX + + // mostly internal + void SetDeviceLocalOrigin( wxCoord x, wxCoord y ) + { m_pimpl->SetDeviceLocalOrigin( x, y ); } + + + // ----------------------------------------------- + // the actual drawing API + + bool FloodFill(wxCoord x, wxCoord y, const wxColour& col, + wxFloodFillStyle style = wxFLOOD_SURFACE) + { return m_pimpl->DoFloodFill(x, y, col, style); } + bool FloodFill(const wxPoint& pt, const wxColour& col, + wxFloodFillStyle style = wxFLOOD_SURFACE) + { return m_pimpl->DoFloodFill(pt.x, pt.y, col, style); } + + // fill the area specified by rect with a radial gradient, starting from + // initialColour in the centre of the cercle and fading to destColour. + void GradientFillConcentric(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour) + { m_pimpl->DoGradientFillConcentric( rect, initialColour, destColour, + wxPoint(rect.GetWidth() / 2, + rect.GetHeight() / 2)); } + + void GradientFillConcentric(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + const wxPoint& circleCenter) + { m_pimpl->DoGradientFillConcentric(rect, initialColour, destColour, circleCenter); } + + // fill the area specified by rect with a linear gradient + void GradientFillLinear(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + wxDirection nDirection = wxEAST) + { m_pimpl->DoGradientFillLinear(rect, initialColour, destColour, nDirection); } + + bool GetPixel(wxCoord x, wxCoord y, wxColour *col) const + { return m_pimpl->DoGetPixel(x, y, col); } + bool GetPixel(const wxPoint& pt, wxColour *col) const + { return m_pimpl->DoGetPixel(pt.x, pt.y, col); } + + void DrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) + { m_pimpl->DoDrawLine(x1, y1, x2, y2); } + void DrawLine(const wxPoint& pt1, const wxPoint& pt2) + { m_pimpl->DoDrawLine(pt1.x, pt1.y, pt2.x, pt2.y); } + + void CrossHair(wxCoord x, wxCoord y) + { m_pimpl->DoCrossHair(x, y); } + void CrossHair(const wxPoint& pt) + { m_pimpl->DoCrossHair(pt.x, pt.y); } + + void DrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, + wxCoord xc, wxCoord yc) + { m_pimpl->DoDrawArc(x1, y1, x2, y2, xc, yc); } + void DrawArc(const wxPoint& pt1, const wxPoint& pt2, const wxPoint& centre) + { m_pimpl->DoDrawArc(pt1.x, pt1.y, pt2.x, pt2.y, centre.x, centre.y); } + + void DrawCheckMark(wxCoord x, wxCoord y, + wxCoord width, wxCoord height) + { m_pimpl->DoDrawCheckMark(x, y, width, height); } + void DrawCheckMark(const wxRect& rect) + { m_pimpl->DoDrawCheckMark(rect.x, rect.y, rect.width, rect.height); } + + void DrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, + double sa, double ea) + { m_pimpl->DoDrawEllipticArc(x, y, w, h, sa, ea); } + void DrawEllipticArc(const wxPoint& pt, const wxSize& sz, + double sa, double ea) + { m_pimpl->DoDrawEllipticArc(pt.x, pt.y, sz.x, sz.y, sa, ea); } + + void DrawPoint(wxCoord x, wxCoord y) + { m_pimpl->DoDrawPoint(x, y); } + void DrawPoint(const wxPoint& pt) + { m_pimpl->DoDrawPoint(pt.x, pt.y); } + + void DrawLines(int n, const wxPoint points[], + wxCoord xoffset = 0, wxCoord yoffset = 0) + { m_pimpl->DoDrawLines(n, points, xoffset, yoffset); } + void DrawLines(const wxPointList *list, + wxCoord xoffset = 0, wxCoord yoffset = 0) + { m_pimpl->DrawLines( list, xoffset, yoffset ); } +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED( void DrawLines(const wxList *list, + wxCoord xoffset = 0, wxCoord yoffset = 0) ); +#endif // WXWIN_COMPATIBILITY_2_8 + + void DrawPolygon(int n, const wxPoint points[], + wxCoord xoffset = 0, wxCoord yoffset = 0, + wxPolygonFillMode fillStyle = wxODDEVEN_RULE) + { m_pimpl->DoDrawPolygon(n, points, xoffset, yoffset, fillStyle); } + void DrawPolygon(const wxPointList *list, + wxCoord xoffset = 0, wxCoord yoffset = 0, + wxPolygonFillMode fillStyle = wxODDEVEN_RULE) + { m_pimpl->DrawPolygon( list, xoffset, yoffset, fillStyle ); } + void DrawPolyPolygon(int n, const int count[], const wxPoint points[], + wxCoord xoffset = 0, wxCoord yoffset = 0, + wxPolygonFillMode fillStyle = wxODDEVEN_RULE) + { m_pimpl->DoDrawPolyPolygon(n, count, points, xoffset, yoffset, fillStyle); } +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED( void DrawPolygon(const wxList *list, + wxCoord xoffset = 0, wxCoord yoffset = 0, + wxPolygonFillMode fillStyle = wxODDEVEN_RULE) ); +#endif // WXWIN_COMPATIBILITY_2_8 + + void DrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) + { m_pimpl->DoDrawRectangle(x, y, width, height); } + void DrawRectangle(const wxPoint& pt, const wxSize& sz) + { m_pimpl->DoDrawRectangle(pt.x, pt.y, sz.x, sz.y); } + void DrawRectangle(const wxRect& rect) + { m_pimpl->DoDrawRectangle(rect.x, rect.y, rect.width, rect.height); } + + void DrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, + double radius) + { m_pimpl->DoDrawRoundedRectangle(x, y, width, height, radius); } + void DrawRoundedRectangle(const wxPoint& pt, const wxSize& sz, + double radius) + { m_pimpl->DoDrawRoundedRectangle(pt.x, pt.y, sz.x, sz.y, radius); } + void DrawRoundedRectangle(const wxRect& r, double radius) + { m_pimpl->DoDrawRoundedRectangle(r.x, r.y, r.width, r.height, radius); } + + void DrawCircle(wxCoord x, wxCoord y, wxCoord radius) + { m_pimpl->DoDrawEllipse(x - radius, y - radius, 2*radius, 2*radius); } + void DrawCircle(const wxPoint& pt, wxCoord radius) + { m_pimpl->DoDrawEllipse(pt.x - radius, pt.y - radius, 2*radius, 2*radius); } + + void DrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height) + { m_pimpl->DoDrawEllipse(x, y, width, height); } + void DrawEllipse(const wxPoint& pt, const wxSize& sz) + { m_pimpl->DoDrawEllipse(pt.x, pt.y, sz.x, sz.y); } + void DrawEllipse(const wxRect& rect) + { m_pimpl->DoDrawEllipse(rect.x, rect.y, rect.width, rect.height); } + + void DrawIcon(const wxIcon& icon, wxCoord x, wxCoord y) + { m_pimpl->DoDrawIcon(icon, x, y); } + void DrawIcon(const wxIcon& icon, const wxPoint& pt) + { m_pimpl->DoDrawIcon(icon, pt.x, pt.y); } + + void DrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, + bool useMask = false) + { m_pimpl->DoDrawBitmap(bmp, x, y, useMask); } + void DrawBitmap(const wxBitmap &bmp, const wxPoint& pt, + bool useMask = false) + { m_pimpl->DoDrawBitmap(bmp, pt.x, pt.y, useMask); } + + void DrawText(const wxString& text, wxCoord x, wxCoord y) + { m_pimpl->DoDrawText(text, x, y); } + void DrawText(const wxString& text, const wxPoint& pt) + { m_pimpl->DoDrawText(text, pt.x, pt.y); } + + void DrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle) + { m_pimpl->DoDrawRotatedText(text, x, y, angle); } + void DrawRotatedText(const wxString& text, const wxPoint& pt, double angle) + { m_pimpl->DoDrawRotatedText(text, pt.x, pt.y, angle); } + + // this version puts both optional bitmap and the text into the given + // rectangle and aligns is as specified by alignment parameter; it also + // will emphasize the character with the given index if it is != -1 and + // return the bounding rectangle if required + void DrawLabel(const wxString& text, + const wxBitmap& image, + const wxRect& rect, + int alignment = wxALIGN_LEFT | wxALIGN_TOP, + int indexAccel = -1, + wxRect *rectBounding = NULL); + + void DrawLabel(const wxString& text, const wxRect& rect, + int alignment = wxALIGN_LEFT | wxALIGN_TOP, + int indexAccel = -1) + { DrawLabel(text, wxNullBitmap, rect, alignment, indexAccel); } + + bool Blit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, + wxDC *source, wxCoord xsrc, wxCoord ysrc, + wxRasterOperationMode rop = wxCOPY, bool useMask = false, + wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord) + { + return m_pimpl->DoBlit(xdest, ydest, width, height, + source, xsrc, ysrc, rop, useMask, xsrcMask, ysrcMask); + } + bool Blit(const wxPoint& destPt, const wxSize& sz, + wxDC *source, const wxPoint& srcPt, + wxRasterOperationMode rop = wxCOPY, bool useMask = false, + const wxPoint& srcPtMask = wxDefaultPosition) + { + return m_pimpl->DoBlit(destPt.x, destPt.y, sz.x, sz.y, + source, srcPt.x, srcPt.y, rop, useMask, srcPtMask.x, srcPtMask.y); + } + + bool StretchBlit(wxCoord dstX, wxCoord dstY, + wxCoord dstWidth, wxCoord dstHeight, + wxDC *source, + wxCoord srcX, wxCoord srcY, + wxCoord srcWidth, wxCoord srcHeight, + wxRasterOperationMode rop = wxCOPY, bool useMask = false, + wxCoord srcMaskX = wxDefaultCoord, wxCoord srcMaskY = wxDefaultCoord) + { + return m_pimpl->DoStretchBlit(dstX, dstY, dstWidth, dstHeight, + source, srcX, srcY, srcWidth, srcHeight, rop, useMask, srcMaskX, srcMaskY); + } + bool StretchBlit(const wxPoint& dstPt, const wxSize& dstSize, + wxDC *source, const wxPoint& srcPt, const wxSize& srcSize, + wxRasterOperationMode rop = wxCOPY, bool useMask = false, + const wxPoint& srcMaskPt = wxDefaultPosition) + { + return m_pimpl->DoStretchBlit(dstPt.x, dstPt.y, dstSize.x, dstSize.y, + source, srcPt.x, srcPt.y, srcSize.x, srcSize.y, rop, useMask, srcMaskPt.x, srcMaskPt.y); + } + + wxBitmap GetAsBitmap(const wxRect *subrect = (const wxRect *) NULL) const + { + return m_pimpl->DoGetAsBitmap(subrect); + } + +#if wxUSE_SPLINES + void DrawSpline(wxCoord x1, wxCoord y1, + wxCoord x2, wxCoord y2, + wxCoord x3, wxCoord y3) + { m_pimpl->DrawSpline(x1,y1,x2,y2,x3,y3); } + void DrawSpline(int n, const wxPoint points[]) + { m_pimpl->DrawSpline(n,points); } + void DrawSpline(const wxPointList *points) + { m_pimpl->DrawSpline(points); } +#endif // wxUSE_SPLINES + + +#if WXWIN_COMPATIBILITY_2_8 + // for compatibility with the old code when wxCoord was long everywhere + wxDEPRECATED( void GetTextExtent(const wxString& string, + long *x, long *y, + long *descent = NULL, + long *externalLeading = NULL, + const wxFont *theFont = NULL) const ); + wxDEPRECATED( void GetLogicalOrigin(long *x, long *y) const ); + wxDEPRECATED( void GetDeviceOrigin(long *x, long *y) const ); + wxDEPRECATED( void GetClippingBox(long *x, long *y, long *w, long *h) const ); + + wxDEPRECATED( void DrawObject(wxDrawObject* drawobject) ); +#endif // WXWIN_COMPATIBILITY_2_8 + +#ifdef __WXMSW__ + // GetHDC() is the simplest way to retrieve an HDC From a wxDC but only + // works if this wxDC is GDI-based and fails for GDI+ contexts (and + // anything else without HDC, e.g. wxPostScriptDC) + WXHDC GetHDC() const; + + // don't use these methods manually, use GetTempHDC() instead + virtual WXHDC AcquireHDC() { return GetHDC(); } + virtual void ReleaseHDC(WXHDC WXUNUSED(hdc)) { } + + // helper class holding the result of GetTempHDC() with std::auto_ptr<>-like + // semantics, i.e. it is moved when copied + class TempHDC + { + public: + TempHDC(wxDC& dc) + : m_dc(dc), + m_hdc(dc.AcquireHDC()) + { + } + + TempHDC(const TempHDC& thdc) + : m_dc(thdc.m_dc), + m_hdc(thdc.m_hdc) + { + const_cast(thdc).m_hdc = 0; + } + + ~TempHDC() + { + if ( m_hdc ) + m_dc.ReleaseHDC(m_hdc); + } + + WXHDC GetHDC() const { return m_hdc; } + + private: + wxDC& m_dc; + WXHDC m_hdc; + + wxDECLARE_NO_ASSIGN_CLASS(TempHDC); + }; + + // GetTempHDC() also works for wxGCDC (but still not for wxPostScriptDC &c) + TempHDC GetTempHDC() { return TempHDC(*this); } +#endif // __WXMSW__ + +#if wxUSE_GRAPHICS_CONTEXT + virtual wxGraphicsContext* GetGraphicsContext() const + { + return m_pimpl->GetGraphicsContext(); + } + virtual void SetGraphicsContext( wxGraphicsContext* ctx ) + { + m_pimpl->SetGraphicsContext(ctx); + } +#endif + +protected: + // ctor takes ownership of the pointer + wxDC(wxDCImpl *pimpl) : m_pimpl(pimpl) { } + + wxDCImpl * const m_pimpl; + +private: + DECLARE_ABSTRACT_CLASS(wxDC) + wxDECLARE_NO_COPY_CLASS(wxDC); +}; + +// ---------------------------------------------------------------------------- +// helper class: you can use it to temporarily change the DC text colour and +// restore it automatically when the object goes out of scope +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDCTextColourChanger +{ +public: + wxDCTextColourChanger(wxDC& dc) : m_dc(dc), m_colFgOld() { } + + wxDCTextColourChanger(wxDC& dc, const wxColour& col) : m_dc(dc) + { + Set(col); + } + + ~wxDCTextColourChanger() + { + if ( m_colFgOld.IsOk() ) + m_dc.SetTextForeground(m_colFgOld); + } + + void Set(const wxColour& col) + { + if ( !m_colFgOld.IsOk() ) + m_colFgOld = m_dc.GetTextForeground(); + m_dc.SetTextForeground(col); + } + +private: + wxDC& m_dc; + + wxColour m_colFgOld; + + wxDECLARE_NO_COPY_CLASS(wxDCTextColourChanger); +}; + +// ---------------------------------------------------------------------------- +// helper class: you can use it to temporarily change the DC pen and +// restore it automatically when the object goes out of scope +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDCPenChanger +{ +public: + wxDCPenChanger(wxDC& dc, const wxPen& pen) : m_dc(dc), m_penOld(dc.GetPen()) + { + m_dc.SetPen(pen); + } + + ~wxDCPenChanger() + { + if ( m_penOld.IsOk() ) + m_dc.SetPen(m_penOld); + } + +private: + wxDC& m_dc; + + wxPen m_penOld; + + wxDECLARE_NO_COPY_CLASS(wxDCPenChanger); +}; + +// ---------------------------------------------------------------------------- +// helper class: you can use it to temporarily change the DC brush and +// restore it automatically when the object goes out of scope +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDCBrushChanger +{ +public: + wxDCBrushChanger(wxDC& dc, const wxBrush& brush) : m_dc(dc), m_brushOld(dc.GetBrush()) + { + m_dc.SetBrush(brush); + } + + ~wxDCBrushChanger() + { + if ( m_brushOld.IsOk() ) + m_dc.SetBrush(m_brushOld); + } + +private: + wxDC& m_dc; + + wxBrush m_brushOld; + + wxDECLARE_NO_COPY_CLASS(wxDCBrushChanger); +}; + +// ---------------------------------------------------------------------------- +// another small helper class: sets the clipping region in its ctor and +// destroys it in the dtor +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDCClipper +{ +public: + wxDCClipper(wxDC& dc, const wxRegion& r) : m_dc(dc) + { dc.SetClippingRegion(r.GetBox()); } + wxDCClipper(wxDC& dc, const wxRect& r) : m_dc(dc) + { dc.SetClippingRegion(r.x, r.y, r.width, r.height); } + wxDCClipper(wxDC& dc, wxCoord x, wxCoord y, wxCoord w, wxCoord h) : m_dc(dc) + { dc.SetClippingRegion(x, y, w, h); } + + ~wxDCClipper() { m_dc.DestroyClippingRegion(); } + +private: + wxDC& m_dc; + + wxDECLARE_NO_COPY_CLASS(wxDCClipper); +}; + +// ---------------------------------------------------------------------------- +// helper class: you can use it to temporarily change the DC font and +// restore it automatically when the object goes out of scope +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDCFontChanger +{ +public: + wxDCFontChanger(wxDC& dc) + : m_dc(dc), m_fontOld() + { + } + + wxDCFontChanger(wxDC& dc, const wxFont& font) + : m_dc(dc), m_fontOld(dc.GetFont()) + { + m_dc.SetFont(font); + } + + void Set(const wxFont& font) + { + if ( !m_fontOld.IsOk() ) + m_fontOld = m_dc.GetFont(); + m_dc.SetFont(font); + } + + ~wxDCFontChanger() + { + if ( m_fontOld.IsOk() ) + m_dc.SetFont(m_fontOld); + } + +private: + wxDC& m_dc; + + wxFont m_fontOld; + + wxDECLARE_NO_COPY_CLASS(wxDCFontChanger); +}; + + +#endif // _WX_DC_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/dcbuffer.h b/wxmsw/include/wx-3.0/wx/dcbuffer.h new file mode 100644 index 00000000..f4d27c7f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dcbuffer.h @@ -0,0 +1,248 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dcbuffer.h +// Purpose: wxBufferedDC class +// Author: Ron Lee +// Modified by: Vadim Zeitlin (refactored, added bg preservation) +// Created: 16/03/02 +// Copyright: (c) Ron Lee +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCBUFFER_H_ +#define _WX_DCBUFFER_H_ + +#include "wx/dcmemory.h" +#include "wx/dcclient.h" +#include "wx/window.h" + +// Split platforms into two groups - those which have well-working +// double-buffering by default, and those which do not. +#if defined(__WXMAC__) || defined(__WXGTK20__) || defined(__WXDFB__) + #define wxALWAYS_NATIVE_DOUBLE_BUFFER 1 +#else + #define wxALWAYS_NATIVE_DOUBLE_BUFFER 0 +#endif + + +// ---------------------------------------------------------------------------- +// Double buffering helper. +// ---------------------------------------------------------------------------- + +// Assumes the buffer bitmap covers the entire scrolled window, +// and prepares the window DC accordingly +#define wxBUFFER_VIRTUAL_AREA 0x01 + +// Assumes the buffer bitmap only covers the client area; +// does not prepare the window DC +#define wxBUFFER_CLIENT_AREA 0x02 + +// Set when not using specific buffer bitmap. Note that this +// is private style and not returned by GetStyle. +#define wxBUFFER_USES_SHARED_BUFFER 0x04 + +class WXDLLIMPEXP_CORE wxBufferedDC : public wxMemoryDC +{ +public: + // Default ctor, must subsequently call Init for two stage construction. + wxBufferedDC() + : m_dc(NULL), + m_buffer(NULL), + m_style(0) + { + } + + // Construct a wxBufferedDC using a user supplied buffer. + wxBufferedDC(wxDC *dc, + wxBitmap& buffer = wxNullBitmap, + int style = wxBUFFER_CLIENT_AREA) + : m_dc(NULL), m_buffer(NULL) + { + Init(dc, buffer, style); + } + + // Construct a wxBufferedDC with an internal buffer of 'area' + // (where area is usually something like the size of the window + // being buffered) + wxBufferedDC(wxDC *dc, const wxSize& area, int style = wxBUFFER_CLIENT_AREA) + : m_dc(NULL), m_buffer(NULL) + { + Init(dc, area, style); + } + + // The usually desired action in the dtor is to blit the buffer. + virtual ~wxBufferedDC() + { + if ( m_dc ) + UnMask(); + } + + // These reimplement the actions of the ctors for two stage creation + void Init(wxDC *dc, + wxBitmap& buffer = wxNullBitmap, + int style = wxBUFFER_CLIENT_AREA) + { + InitCommon(dc, style); + + m_buffer = &buffer; + + UseBuffer(); + } + + void Init(wxDC *dc, const wxSize &area, int style = wxBUFFER_CLIENT_AREA) + { + InitCommon(dc, style); + + UseBuffer(area.x, area.y); + } + + // Blits the buffer to the dc, and detaches the dc from the buffer (so it + // can be effectively used once only). + // + // Usually called in the dtor or by the dtor of derived classes if the + // BufferedDC must blit before the derived class (which may own the dc it's + // blitting to) is destroyed. + void UnMask(); + + // Set and get the style + void SetStyle(int style) { m_style = style; } + int GetStyle() const { return m_style & ~wxBUFFER_USES_SHARED_BUFFER; } + +private: + // common part of Init()s + void InitCommon(wxDC *dc, int style) + { + wxASSERT_MSG( !m_dc, wxT("wxBufferedDC already initialised") ); + + m_dc = dc; + m_style = style; + } + + // check that the bitmap is valid and use it + void UseBuffer(wxCoord w = -1, wxCoord h = -1); + + // the underlying DC to which we copy everything drawn on this one in + // UnMask() + // + // NB: Without the existence of a wxNullDC, this must be a pointer, else it + // could probably be a reference. + wxDC *m_dc; + + // the buffer (selected in this DC), initially invalid + wxBitmap *m_buffer; + + // the buffering style + int m_style; + + wxSize m_area; + + DECLARE_DYNAMIC_CLASS(wxBufferedDC) + wxDECLARE_NO_COPY_CLASS(wxBufferedDC); +}; + + +// ---------------------------------------------------------------------------- +// Double buffered PaintDC. +// ---------------------------------------------------------------------------- + +// Creates a double buffered wxPaintDC, optionally allowing the +// user to specify their own buffer to use. +class WXDLLIMPEXP_CORE wxBufferedPaintDC : public wxBufferedDC +{ +public: + // If no bitmap is supplied by the user, a temporary one will be created. + wxBufferedPaintDC(wxWindow *window, wxBitmap& buffer, int style = wxBUFFER_CLIENT_AREA) + : m_paintdc(window) + { + // If we're buffering the virtual window, scale the paint DC as well + if (style & wxBUFFER_VIRTUAL_AREA) + window->PrepareDC( m_paintdc ); + + if( buffer.IsOk() ) + Init(&m_paintdc, buffer, style); + else + Init(&m_paintdc, GetBufferedSize(window, style), style); + } + + // If no bitmap is supplied by the user, a temporary one will be created. + wxBufferedPaintDC(wxWindow *window, int style = wxBUFFER_CLIENT_AREA) + : m_paintdc(window) + { + // If we're using the virtual window, scale the paint DC as well + if (style & wxBUFFER_VIRTUAL_AREA) + window->PrepareDC( m_paintdc ); + + Init(&m_paintdc, GetBufferedSize(window, style), style); + } + + // default copy ctor ok. + + virtual ~wxBufferedPaintDC() + { + // We must UnMask here, else by the time the base class + // does it, the PaintDC will have already been destroyed. + UnMask(); + } + +protected: + // return the size needed by the buffer: this depends on whether we're + // buffering just the currently shown part or the total (scrolled) window + static wxSize GetBufferedSize(wxWindow *window, int style) + { + return style & wxBUFFER_VIRTUAL_AREA ? window->GetVirtualSize() + : window->GetClientSize(); + } + +private: + wxPaintDC m_paintdc; + + DECLARE_ABSTRACT_CLASS(wxBufferedPaintDC) + wxDECLARE_NO_COPY_CLASS(wxBufferedPaintDC); +}; + + + +// +// wxAutoBufferedPaintDC is a wxPaintDC in toolkits which have double- +// buffering by default. Otherwise it is a wxBufferedPaintDC. Thus, +// you can only expect it work with a simple constructor that +// accepts single wxWindow* argument. +// +#if wxALWAYS_NATIVE_DOUBLE_BUFFER + #define wxAutoBufferedPaintDCBase wxPaintDC +#else + #define wxAutoBufferedPaintDCBase wxBufferedPaintDC +#endif + +class WXDLLIMPEXP_CORE wxAutoBufferedPaintDC : public wxAutoBufferedPaintDCBase +{ +public: + + wxAutoBufferedPaintDC(wxWindow* win) + : wxAutoBufferedPaintDCBase(win) + { + wxASSERT_MSG( win->GetBackgroundStyle() == wxBG_STYLE_PAINT, + "You need to call SetBackgroundStyle(wxBG_STYLE_PAINT) in ctor, " + "and also, if needed, paint the background in wxEVT_PAINT handler." + ); + } + + virtual ~wxAutoBufferedPaintDC() { } + +private: + wxDECLARE_NO_COPY_CLASS(wxAutoBufferedPaintDC); +}; + + + +// Check if the window is natively double buffered and will return a wxPaintDC +// if it is, a wxBufferedPaintDC otherwise. It is the caller's responsibility +// to delete the wxDC pointer when finished with it. +inline wxDC* wxAutoBufferedPaintDCFactory(wxWindow* window) +{ + if ( window->IsDoubleBuffered() ) + return new wxPaintDC(window); + else + return new wxBufferedPaintDC(window); +} + +#endif // _WX_DCBUFFER_H_ diff --git a/wxmsw/include/wx-3.0/wx/dcclient.h b/wxmsw/include/wx-3.0/wx/dcclient.h new file mode 100644 index 00000000..f4bf74f7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dcclient.h @@ -0,0 +1,62 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dcclient.h +// Purpose: wxClientDC base header +// Author: Julian Smart +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCCLIENT_H_BASE_ +#define _WX_DCCLIENT_H_BASE_ + +#include "wx/dc.h" + +//----------------------------------------------------------------------------- +// wxWindowDC +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxWindowDC : public wxDC +{ +public: + wxWindowDC(wxWindow *win); + +protected: + wxWindowDC(wxDCImpl *impl) : wxDC(impl) { } + +private: + DECLARE_ABSTRACT_CLASS(wxWindowDC) +}; + +//----------------------------------------------------------------------------- +// wxClientDC +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxClientDC : public wxWindowDC +{ +public: + wxClientDC(wxWindow *win); + +protected: + wxClientDC(wxDCImpl *impl) : wxWindowDC(impl) { } + +private: + DECLARE_ABSTRACT_CLASS(wxClientDC) +}; + +//----------------------------------------------------------------------------- +// wxPaintDC +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPaintDC : public wxClientDC +{ +public: + wxPaintDC(wxWindow *win); + +protected: + wxPaintDC(wxDCImpl *impl) : wxClientDC(impl) { } + +private: + DECLARE_ABSTRACT_CLASS(wxPaintDC) +}; + +#endif // _WX_DCCLIENT_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/dcgraph.h b/wxmsw/include/wx-3.0/wx/dcgraph.h new file mode 100644 index 00000000..06cca912 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dcgraph.h @@ -0,0 +1,226 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dcgraph.h +// Purpose: graphics context device bridge header +// Author: Stefan Csomor +// Modified by: +// Created: +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GRAPHICS_DC_H_ +#define _WX_GRAPHICS_DC_H_ + +#if wxUSE_GRAPHICS_CONTEXT + +#include "wx/dc.h" +#include "wx/geometry.h" +#include "wx/graphics.h" + +class WXDLLIMPEXP_FWD_CORE wxWindowDC; + + +class WXDLLIMPEXP_CORE wxGCDC: public wxDC +{ +public: + wxGCDC( const wxWindowDC& dc ); + wxGCDC( const wxMemoryDC& dc ); +#if wxUSE_PRINTING_ARCHITECTURE + wxGCDC( const wxPrinterDC& dc ); +#endif +#if defined(__WXMSW__) && wxUSE_ENH_METAFILE + wxGCDC( const wxEnhMetaFileDC& dc ); +#endif + wxGCDC(wxGraphicsContext* context); + + wxGCDC(); + virtual ~wxGCDC(); + + wxGraphicsContext* GetGraphicsContext() const; + void SetGraphicsContext( wxGraphicsContext* ctx ); + +#ifdef __WXMSW__ + // override wxDC virtual functions to provide access to HDC associated with + // this Graphics object (implemented in src/msw/graphics.cpp) + virtual WXHDC AcquireHDC(); + virtual void ReleaseHDC(WXHDC hdc); +#endif // __WXMSW__ + +private: + DECLARE_DYNAMIC_CLASS(wxGCDC) + wxDECLARE_NO_COPY_CLASS(wxGCDC); +}; + + +class WXDLLIMPEXP_CORE wxGCDCImpl: public wxDCImpl +{ +public: + wxGCDCImpl( wxDC *owner, const wxWindowDC& dc ); + wxGCDCImpl( wxDC *owner, const wxMemoryDC& dc ); +#if wxUSE_PRINTING_ARCHITECTURE + wxGCDCImpl( wxDC *owner, const wxPrinterDC& dc ); +#endif +#if defined(__WXMSW__) && wxUSE_ENH_METAFILE + wxGCDCImpl( wxDC *owner, const wxEnhMetaFileDC& dc ); +#endif + wxGCDCImpl( wxDC *owner ); + + virtual ~wxGCDCImpl(); + + // implement base class pure virtuals + // ---------------------------------- + + virtual void Clear(); + + virtual bool StartDoc( const wxString& message ); + virtual void EndDoc(); + + virtual void StartPage(); + virtual void EndPage(); + + // flushing the content of this dc immediately onto screen + virtual void Flush(); + + virtual void SetFont(const wxFont& font); + virtual void SetPen(const wxPen& pen); + virtual void SetBrush(const wxBrush& brush); + virtual void SetBackground(const wxBrush& brush); + virtual void SetBackgroundMode(int mode); + virtual void SetPalette(const wxPalette& palette); + + virtual void DestroyClippingRegion(); + + virtual wxCoord GetCharHeight() const; + virtual wxCoord GetCharWidth() const; + + virtual bool CanDrawBitmap() const; + virtual bool CanGetTextExtent() const; + virtual int GetDepth() const; + virtual wxSize GetPPI() const; + + virtual void SetLogicalFunction(wxRasterOperationMode function); + + virtual void SetTextForeground(const wxColour& colour); + virtual void SetTextBackground(const wxColour& colour); + + virtual void ComputeScaleAndOrigin(); + + wxGraphicsContext* GetGraphicsContext() const { return m_graphicContext; } + virtual void SetGraphicsContext( wxGraphicsContext* ctx ); + + virtual void* GetHandle() const; + + // the true implementations + virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, + wxFloodFillStyle style = wxFLOOD_SURFACE); + + virtual void DoGradientFillLinear(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + wxDirection nDirection = wxEAST); + + virtual void DoGradientFillConcentric(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + const wxPoint& circleCenter); + + virtual bool DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const; + + virtual void DoDrawPoint(wxCoord x, wxCoord y); + +#if wxUSE_SPLINES + virtual void DoDrawSpline(const wxPointList *points); +#endif + + virtual void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2); + + virtual void DoDrawArc(wxCoord x1, wxCoord y1, + wxCoord x2, wxCoord y2, + wxCoord xc, wxCoord yc); + + virtual void DoDrawCheckMark(wxCoord x, wxCoord y, + wxCoord width, wxCoord height); + + virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, + double sa, double ea); + + virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height); + virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y, + wxCoord width, wxCoord height, + double radius); + virtual void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height); + + virtual void DoCrossHair(wxCoord x, wxCoord y); + + virtual void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y); + virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, + bool useMask = false); + + virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y); + virtual void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, + double angle); + + virtual bool DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, + wxDC *source, wxCoord xsrc, wxCoord ysrc, + wxRasterOperationMode rop = wxCOPY, bool useMask = false, + wxCoord xsrcMask = -1, wxCoord ysrcMask = -1); + + virtual bool DoStretchBlit(wxCoord xdest, wxCoord ydest, + wxCoord dstWidth, wxCoord dstHeight, + wxDC *source, + wxCoord xsrc, wxCoord ysrc, + wxCoord srcWidth, wxCoord srcHeight, + wxRasterOperationMode = wxCOPY, bool useMask = false, + wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord); + + virtual void DoGetSize(int *,int *) const; + virtual void DoGetSizeMM(int* width, int* height) const; + + virtual void DoDrawLines(int n, const wxPoint points[], + wxCoord xoffset, wxCoord yoffset); + virtual void DoDrawPolygon(int n, const wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + wxPolygonFillMode fillStyle = wxODDEVEN_RULE); + virtual void DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + wxPolygonFillMode fillStyle); + + virtual void DoSetDeviceClippingRegion(const wxRegion& region); + virtual void DoSetClippingRegion(wxCoord x, wxCoord y, + wxCoord width, wxCoord height); + + virtual void DoGetTextExtent(const wxString& string, + wxCoord *x, wxCoord *y, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + const wxFont *theFont = NULL) const; + + virtual bool DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const; + +#ifdef __WXMSW__ + virtual wxRect MSWApplyGDIPlusTransform(const wxRect& r) const; +#endif // __WXMSW__ + +protected: + // unused int parameter distinguishes this version, which does not create a + // wxGraphicsContext, in the expectation that the derived class will do it + wxGCDCImpl(wxDC* owner, int); + + // scaling variables + bool m_logicalFunctionSupported; + wxGraphicsMatrix m_matrixOriginal; + wxGraphicsMatrix m_matrixCurrent; + + double m_formerScaleX, m_formerScaleY; + + wxGraphicsContext* m_graphicContext; + +private: + void Init(wxGraphicsContext*); + + DECLARE_CLASS(wxGCDCImpl) + wxDECLARE_NO_COPY_CLASS(wxGCDCImpl); +}; + +#endif // wxUSE_GRAPHICS_CONTEXT +#endif // _WX_GRAPHICS_DC_H_ diff --git a/wxmsw/include/wx-3.0/wx/dcmemory.h b/wxmsw/include/wx-3.0/wx/dcmemory.h new file mode 100644 index 00000000..d5f301c9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dcmemory.h @@ -0,0 +1,44 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dcmemory.h +// Purpose: wxMemoryDC base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCMEMORY_H_BASE_ +#define _WX_DCMEMORY_H_BASE_ + +#include "wx/dc.h" +#include "wx/bitmap.h" + +//----------------------------------------------------------------------------- +// wxMemoryDC +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMemoryDC: public wxDC +{ +public: + wxMemoryDC(); + wxMemoryDC( wxBitmap& bitmap ); + wxMemoryDC( wxDC *dc ); + + // select the given bitmap to draw on it + void SelectObject(wxBitmap& bmp); + + // select the given bitmap for read-only + void SelectObjectAsSource(const wxBitmap& bmp); + + // get selected bitmap + const wxBitmap& GetSelectedBitmap() const; + wxBitmap& GetSelectedBitmap(); + +private: + DECLARE_DYNAMIC_CLASS(wxMemoryDC) +}; + + +#endif + // _WX_DCMEMORY_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/dcmirror.h b/wxmsw/include/wx-3.0/wx/dcmirror.h new file mode 100644 index 00000000..42deb977 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dcmirror.h @@ -0,0 +1,299 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/dcmirror.h +// Purpose: wxMirrorDC class +// Author: Vadim Zeitlin +// Modified by: +// Created: 21.07.2003 +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCMIRROR_H_ +#define _WX_DCMIRROR_H_ + +#include "wx/dc.h" + +// ---------------------------------------------------------------------------- +// wxMirrorDC allows to write the same code for horz/vertical layout +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMirrorDCImpl : public wxDCImpl +{ +public: + // constructs a mirror DC associated with the given real DC + // + // if mirror parameter is true, all vertical and horizontal coordinates are + // exchanged, otherwise this class behaves in exactly the same way as a + // plain DC + wxMirrorDCImpl(wxDC *owner, wxDCImpl& dc, bool mirror) + : wxDCImpl(owner), + m_dc(dc) + { + m_mirror = mirror; + } + + // wxDCBase operations + virtual void Clear() { m_dc.Clear(); } + virtual void SetFont(const wxFont& font) { m_dc.SetFont(font); } + virtual void SetPen(const wxPen& pen) { m_dc.SetPen(pen); } + virtual void SetBrush(const wxBrush& brush) { m_dc.SetBrush(brush); } + virtual void SetBackground(const wxBrush& brush) + { m_dc.SetBackground(brush); } + virtual void SetBackgroundMode(int mode) { m_dc.SetBackgroundMode(mode); } +#if wxUSE_PALETTE + virtual void SetPalette(const wxPalette& palette) + { m_dc.SetPalette(palette); } +#endif // wxUSE_PALETTE + virtual void DestroyClippingRegion() { m_dc.DestroyClippingRegion(); } + virtual wxCoord GetCharHeight() const { return m_dc.GetCharHeight(); } + virtual wxCoord GetCharWidth() const { return m_dc.GetCharWidth(); } + virtual bool CanDrawBitmap() const { return m_dc.CanDrawBitmap(); } + virtual bool CanGetTextExtent() const { return m_dc.CanGetTextExtent(); } + virtual int GetDepth() const { return m_dc.GetDepth(); } + virtual wxSize GetPPI() const { return m_dc.GetPPI(); } + virtual bool IsOk() const { return m_dc.IsOk(); } + virtual void SetMapMode(wxMappingMode mode) { m_dc.SetMapMode(mode); } + virtual void SetUserScale(double x, double y) + { m_dc.SetUserScale(GetX(x, y), GetY(x, y)); } + virtual void SetLogicalOrigin(wxCoord x, wxCoord y) + { m_dc.SetLogicalOrigin(GetX(x, y), GetY(x, y)); } + virtual void SetDeviceOrigin(wxCoord x, wxCoord y) + { m_dc.SetDeviceOrigin(GetX(x, y), GetY(x, y)); } + virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp) + { m_dc.SetAxisOrientation(GetX(xLeftRight, yBottomUp), + GetY(xLeftRight, yBottomUp)); } + virtual void SetLogicalFunction(wxRasterOperationMode function) + { m_dc.SetLogicalFunction(function); } + + virtual void* GetHandle() const + { return m_dc.GetHandle(); } + +protected: + // returns x and y if not mirroring or y and x if mirroring + wxCoord GetX(wxCoord x, wxCoord y) const { return m_mirror ? y : x; } + wxCoord GetY(wxCoord x, wxCoord y) const { return m_mirror ? x : y; } + double GetX(double x, double y) const { return m_mirror ? y : x; } + double GetY(double x, double y) const { return m_mirror ? x : y; } + bool GetX(bool x, bool y) const { return m_mirror ? y : x; } + bool GetY(bool x, bool y) const { return m_mirror ? x : y; } + + // same thing but for pointers + wxCoord *GetX(wxCoord *x, wxCoord *y) const { return m_mirror ? y : x; } + wxCoord *GetY(wxCoord *x, wxCoord *y) const { return m_mirror ? x : y; } + + // exchange x and y components of all points in the array if necessary + wxPoint* Mirror(int n, const wxPoint*& points) const + { + wxPoint* points_alloc = NULL; + if ( m_mirror ) + { + points_alloc = new wxPoint[n]; + for ( int i = 0; i < n; i++ ) + { + points_alloc[i].x = points[i].y; + points_alloc[i].y = points[i].x; + } + points = points_alloc; + } + return points_alloc; + } + + // wxDCBase functions + virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, + wxFloodFillStyle style = wxFLOOD_SURFACE) + { + return m_dc.DoFloodFill(GetX(x, y), GetY(x, y), col, style); + } + + virtual bool DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const + { + return m_dc.DoGetPixel(GetX(x, y), GetY(x, y), col); + } + + + virtual void DoDrawPoint(wxCoord x, wxCoord y) + { + m_dc.DoDrawPoint(GetX(x, y), GetY(x, y)); + } + + virtual void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) + { + m_dc.DoDrawLine(GetX(x1, y1), GetY(x1, y1), GetX(x2, y2), GetY(x2, y2)); + } + + virtual void DoDrawArc(wxCoord x1, wxCoord y1, + wxCoord x2, wxCoord y2, + wxCoord xc, wxCoord yc) + { + wxFAIL_MSG( wxT("this is probably wrong") ); + + m_dc.DoDrawArc(GetX(x1, y1), GetY(x1, y1), + GetX(x2, y2), GetY(x2, y2), + xc, yc); + } + + virtual void DoDrawCheckMark(wxCoord x, wxCoord y, + wxCoord w, wxCoord h) + { + m_dc.DoDrawCheckMark(GetX(x, y), GetY(x, y), + GetX(w, h), GetY(w, h)); + } + + virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, + double sa, double ea) + { + wxFAIL_MSG( wxT("this is probably wrong") ); + + m_dc.DoDrawEllipticArc(GetX(x, y), GetY(x, y), + GetX(w, h), GetY(w, h), + sa, ea); + } + + virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord w, wxCoord h) + { + m_dc.DoDrawRectangle(GetX(x, y), GetY(x, y), GetX(w, h), GetY(w, h)); + } + + virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y, + wxCoord w, wxCoord h, + double radius) + { + m_dc.DoDrawRoundedRectangle(GetX(x, y), GetY(x, y), + GetX(w, h), GetY(w, h), + radius); + } + + virtual void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord w, wxCoord h) + { + m_dc.DoDrawEllipse(GetX(x, y), GetY(x, y), GetX(w, h), GetY(w, h)); + } + + virtual void DoCrossHair(wxCoord x, wxCoord y) + { + m_dc.DoCrossHair(GetX(x, y), GetY(x, y)); + } + + virtual void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y) + { + m_dc.DoDrawIcon(icon, GetX(x, y), GetY(x, y)); + } + + virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, + bool useMask = false) + { + m_dc.DoDrawBitmap(bmp, GetX(x, y), GetY(x, y), useMask); + } + + virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y) + { + // this is never mirrored + m_dc.DoDrawText(text, x, y); + } + + virtual void DoDrawRotatedText(const wxString& text, + wxCoord x, wxCoord y, double angle) + { + // this is never mirrored + m_dc.DoDrawRotatedText(text, x, y, angle); + } + + virtual bool DoBlit(wxCoord xdest, wxCoord ydest, + wxCoord w, wxCoord h, + wxDC *source, wxCoord xsrc, wxCoord ysrc, + wxRasterOperationMode rop = wxCOPY, + bool useMask = false, + wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord) + { + return m_dc.DoBlit(GetX(xdest, ydest), GetY(xdest, ydest), + GetX(w, h), GetY(w, h), + source, GetX(xsrc, ysrc), GetY(xsrc, ysrc), + rop, useMask, + GetX(xsrcMask, ysrcMask), GetX(xsrcMask, ysrcMask)); + } + + virtual void DoGetSize(int *w, int *h) const + { + m_dc.DoGetSize(GetX(w, h), GetY(w, h)); + } + + virtual void DoGetSizeMM(int *w, int *h) const + { + m_dc.DoGetSizeMM(GetX(w, h), GetY(w, h)); + } + + virtual void DoDrawLines(int n, const wxPoint points[], + wxCoord xoffset, wxCoord yoffset) + { + wxPoint* points_alloc = Mirror(n, points); + + m_dc.DoDrawLines(n, points, + GetX(xoffset, yoffset), GetY(xoffset, yoffset)); + + delete[] points_alloc; + } + + virtual void DoDrawPolygon(int n, const wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + wxPolygonFillMode fillStyle = wxODDEVEN_RULE) + { + wxPoint* points_alloc = Mirror(n, points); + + m_dc.DoDrawPolygon(n, points, + GetX(xoffset, yoffset), GetY(xoffset, yoffset), + fillStyle); + + delete[] points_alloc; + } + + virtual void DoSetDeviceClippingRegion(const wxRegion& WXUNUSED(region)) + { + wxFAIL_MSG( wxT("not implemented") ); + } + + virtual void DoSetClippingRegion(wxCoord x, wxCoord y, + wxCoord w, wxCoord h) + { + m_dc.DoSetClippingRegion(GetX(x, y), GetY(x, y), GetX(w, h), GetY(w, h)); + } + + virtual void DoGetTextExtent(const wxString& string, + wxCoord *x, wxCoord *y, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + const wxFont *theFont = NULL) const + { + // never mirrored + m_dc.DoGetTextExtent(string, x, y, descent, externalLeading, theFont); + } + +private: + wxDCImpl& m_dc; + + bool m_mirror; + + wxDECLARE_NO_COPY_CLASS(wxMirrorDCImpl); +}; + +class WXDLLIMPEXP_CORE wxMirrorDC : public wxDC +{ +public: + wxMirrorDC(wxDC& dc, bool mirror) + : wxDC(new wxMirrorDCImpl(this, *dc.GetImpl(), mirror)) + { + m_mirror = mirror; + } + + // helper functions which may be useful for the users of this class + wxSize Reflect(const wxSize& sizeOrig) + { + return m_mirror ? wxSize(sizeOrig.y, sizeOrig.x) : sizeOrig; + } + +private: + bool m_mirror; + + wxDECLARE_NO_COPY_CLASS(wxMirrorDC); +}; + +#endif // _WX_DCMIRROR_H_ + diff --git a/wxmsw/include/wx-3.0/wx/dcprint.h b/wxmsw/include/wx-3.0/wx/dcprint.h new file mode 100644 index 00000000..6d847311 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dcprint.h @@ -0,0 +1,42 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dcprint.h +// Purpose: wxPrinterDC base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCPRINT_H_BASE_ +#define _WX_DCPRINT_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_PRINTING_ARCHITECTURE + +#include "wx/dc.h" + +//----------------------------------------------------------------------------- +// wxPrinterDC +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPrinterDC : public wxDC +{ +public: + wxPrinterDC(); + wxPrinterDC(const wxPrintData& data); + + wxRect GetPaperRect() const; + int GetResolution() const; + +protected: + wxPrinterDC(wxDCImpl *impl) : wxDC(impl) { } + +private: + DECLARE_DYNAMIC_CLASS(wxPrinterDC) +}; + +#endif // wxUSE_PRINTING_ARCHITECTURE + +#endif // _WX_DCPRINT_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/dcps.h b/wxmsw/include/wx-3.0/wx/dcps.h new file mode 100644 index 00000000..659eb595 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dcps.h @@ -0,0 +1,17 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dcps.h +// Purpose: wxPostScriptDC base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCPS_H_BASE_ +#define _WX_DCPS_H_BASE_ + +#include "wx/generic/dcpsg.h" + +#endif + diff --git a/wxmsw/include/wx-3.0/wx/dcscreen.h b/wxmsw/include/wx-3.0/wx/dcscreen.h new file mode 100644 index 00000000..391e91aa --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dcscreen.h @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dcscreen.h +// Purpose: wxScreenDC base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCSCREEN_H_BASE_ +#define _WX_DCSCREEN_H_BASE_ + +#include "wx/defs.h" +#include "wx/dc.h" + +class WXDLLIMPEXP_CORE wxScreenDC : public wxDC +{ +public: + wxScreenDC(); + + static bool StartDrawingOnTop(wxWindow * WXUNUSED(window)) + { return true; } + static bool StartDrawingOnTop(wxRect * WXUNUSED(rect) = NULL) + { return true; } + static bool EndDrawingOnTop() + { return true; } + +private: + DECLARE_DYNAMIC_CLASS(wxScreenDC) +}; + + +#endif + // _WX_DCSCREEN_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/dcsvg.h b/wxmsw/include/wx-3.0/wx/dcsvg.h new file mode 100644 index 00000000..c6485ff1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dcsvg.h @@ -0,0 +1,227 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dcsvg.h +// Purpose: wxSVGFileDC +// Author: Chris Elliott +// Modified by: +// Created: +// Copyright: (c) Chris Elliott +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCSVG_H_ +#define _WX_DCSVG_H_ + +#include "wx/string.h" +#include "wx/dc.h" + +#if wxUSE_SVG + +#define wxSVGVersion wxT("v0100") + +#ifdef __BORLANDC__ +#pragma warn -8008 +#pragma warn -8066 +#endif + +class WXDLLIMPEXP_FWD_BASE wxFileOutputStream; + + + +class WXDLLIMPEXP_FWD_CORE wxSVGFileDC; + +class WXDLLIMPEXP_CORE wxSVGFileDCImpl : public wxDCImpl +{ +public: + wxSVGFileDCImpl( wxSVGFileDC *owner, const wxString &filename, + int width=320, int height=240, double dpi=72.0 ); + + virtual ~wxSVGFileDCImpl(); + + bool IsOk() const { return m_OK; } + + virtual bool CanDrawBitmap() const { return true; } + virtual bool CanGetTextExtent() const { return true; } + + virtual int GetDepth() const + { + wxFAIL_MSG(wxT("wxSVGFILEDC::GetDepth Call not implemented")); + return -1; + } + + virtual void Clear() + { + wxFAIL_MSG(wxT("wxSVGFILEDC::Clear() Call not implemented \nNot sensible for an output file?")); + } + + virtual void DestroyClippingRegion(); + + virtual wxCoord GetCharHeight() const; + virtual wxCoord GetCharWidth() const; + + virtual void SetClippingRegion(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), + wxCoord WXUNUSED(w), wxCoord WXUNUSED(h)) + { + wxFAIL_MSG(wxT("wxSVGFILEDC::SetClippingRegion not implemented")); + } + + virtual void SetPalette(const wxPalette& WXUNUSED(palette)) + { + wxFAIL_MSG(wxT("wxSVGFILEDC::SetPalette not implemented")); + } + + virtual void GetClippingBox(wxCoord *WXUNUSED(x), wxCoord *WXUNUSED(y), + wxCoord *WXUNUSED(w), wxCoord *WXUNUSED(h)) + { + wxFAIL_MSG(wxT("wxSVGFILEDC::GetClippingBox not implemented")); + } + + virtual void SetLogicalFunction(wxRasterOperationMode WXUNUSED(function)) + { + wxFAIL_MSG(wxT("wxSVGFILEDC::SetLogicalFunction Call not implemented")); + } + + virtual wxRasterOperationMode GetLogicalFunction() const + { + wxFAIL_MSG(wxT("wxSVGFILEDC::GetLogicalFunction() not implemented")); + return wxCOPY; + } + + virtual void SetBackground( const wxBrush &brush ); + virtual void SetBackgroundMode( int mode ); + virtual void SetBrush(const wxBrush& brush); + virtual void SetFont(const wxFont& font); + virtual void SetPen(const wxPen& pen); + + virtual void* GetHandle() const { return NULL; } + +private: + virtual bool DoGetPixel(wxCoord, wxCoord, wxColour *) const + { + wxFAIL_MSG(wxT("wxSVGFILEDC::DoGetPixel Call not implemented")); + return true; + } + + virtual bool DoBlit(wxCoord, wxCoord, wxCoord, wxCoord, wxDC *, + wxCoord, wxCoord, wxRasterOperationMode = wxCOPY, + bool = 0, int = -1, int = -1); + + virtual void DoCrossHair(wxCoord, wxCoord) + { + wxFAIL_MSG(wxT("wxSVGFILEDC::CrossHair Call not implemented")); + } + + virtual void DoDrawArc(wxCoord, wxCoord, wxCoord, wxCoord, wxCoord, wxCoord); + + virtual void DoDrawBitmap(const wxBitmap &, wxCoord, wxCoord, bool = false); + + virtual void DoDrawCheckMark(wxCoord x, wxCoord y, wxCoord w, wxCoord h); + + virtual void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord w, wxCoord h); + + virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, + double sa, double ea); + + virtual void DoDrawIcon(const wxIcon &, wxCoord, wxCoord); + + virtual void DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2); + + virtual void DoDrawLines(int n, const wxPoint points[], + wxCoord xoffset = 0, wxCoord yoffset = 0); + + virtual void DoDrawPoint(wxCoord, wxCoord); + + virtual void DoDrawPolygon(int n, const wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + wxPolygonFillMode fillStyle); + + virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord w, wxCoord h); + + virtual void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, + double angle); + + virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y, + wxCoord w, wxCoord h, + double radius = 20) ; + + virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y); + + virtual bool DoFloodFill(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), + const wxColour& WXUNUSED(col), + wxFloodFillStyle WXUNUSED(style) = wxFLOOD_SURFACE) + { + wxFAIL_MSG(wxT("wxSVGFILEDC::DoFloodFill Call not implemented")); + return false; + } + + virtual void DoGetSize(int * x, int *y) const + { + if ( x ) + *x = m_width; + if ( y ) + *y = m_height; + } + + virtual void DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + const wxFont *font = NULL) const; + + virtual void DoSetDeviceClippingRegion(const wxRegion& WXUNUSED(region)) + { + wxFAIL_MSG(wxT("wxSVGFILEDC::DoSetDeviceClippingRegion not yet implemented")); + } + + virtual void DoSetClippingRegion(int x, int y, int width, int height); + + virtual void DoGetSizeMM( int *width, int *height ) const; + + virtual wxSize GetPPI() const; + + void Init (const wxString &filename, int width, int height, double dpi); + + void write( const wxString &s ); + +private: + // If m_graphics_changed is true, close the current element and start a + // new one for the last pen/brush change. + void NewGraphicsIfNeeded(); + + // Open a new graphics group setting up all the attributes according to + // their current values in wxDC. + void DoStartNewGraphics(); + + wxFileOutputStream *m_outfile; + wxString m_filename; + int m_sub_images; // number of png format images we have + bool m_OK; + bool m_graphics_changed; // set by Set{Brush,Pen}() + int m_width, m_height; + double m_dpi; + + // The clipping nesting level is incremented by every call to + // SetClippingRegion() and reset when DestroyClippingRegion() is called. + size_t m_clipNestingLevel; + + // Unique ID for every clipping graphics group: this is simply always + // incremented in each SetClippingRegion() call. + size_t m_clipUniqueId; + + DECLARE_ABSTRACT_CLASS(wxSVGFileDCImpl) +}; + + +class WXDLLIMPEXP_CORE wxSVGFileDC : public wxDC +{ +public: + wxSVGFileDC(const wxString& filename, + int width = 320, + int height = 240, + double dpi = 72.0) + : wxDC(new wxSVGFileDCImpl(this, filename, width, height, dpi)) + { + } +}; + +#endif // wxUSE_SVG + +#endif // _WX_DCSVG_H_ diff --git a/wxmsw/include/wx-3.0/wx/dde.h b/wxmsw/include/wx-3.0/wx/dde.h new file mode 100644 index 00000000..d6524e1f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dde.h @@ -0,0 +1,31 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dde.h +// Purpose: DDE base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DDE_H_BASE_ +#define _WX_DDE_H_BASE_ + +#include "wx/list.h" + +class WXDLLIMPEXP_FWD_BASE wxDDEClient; +class WXDLLIMPEXP_FWD_BASE wxDDEServer; +class WXDLLIMPEXP_FWD_BASE wxDDEConnection; + +WX_DECLARE_USER_EXPORTED_LIST(wxDDEClient, wxDDEClientList, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_LIST(wxDDEServer, wxDDEServerList, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_LIST(wxDDEConnection, wxDDEConnectionList, WXDLLIMPEXP_BASE); + +#if defined(__WINDOWS__) + #include "wx/msw/dde.h" +#else + #error DDE is only supported under Windows +#endif + +#endif + // _WX_DDE_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/debug.h b/wxmsw/include/wx-3.0/wx/debug.h new file mode 100644 index 00000000..f80f7be6 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/debug.h @@ -0,0 +1,496 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/debug.h +// Purpose: Misc debug functions and macros +// Author: Vadim Zeitlin +// Created: 29/01/98 +// Copyright: (c) 1998-2009 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DEBUG_H_ +#define _WX_DEBUG_H_ + +#if !defined(__WXWINCE__) + #include +#endif // systems without assert.h + +#include // for CHAR_BIT used below + +#include "wx/chartype.h" // for __TFILE__ and wxChar +#include "wx/cpp.h" // for __WXFUNCTION__ +#include "wx/dlimpexp.h" // for WXDLLIMPEXP_FWD_BASE + +class WXDLLIMPEXP_FWD_BASE wxString; +class WXDLLIMPEXP_FWD_BASE wxCStrData; + +// ---------------------------------------------------------------------------- +// Defines controlling the debugging macros +// ---------------------------------------------------------------------------- + +/* + wxWidgets can be built with several different levels of debug support + specified by the value of wxDEBUG_LEVEL constant: + + 0: No assertion macros at all, this should only be used when optimizing + for resource-constrained systems (typically embedded ones). + 1: Default level, most of the assertions are enabled. + 2: Maximal (at least for now): asserts which are "expensive" + (performance-wise) or only make sense for finding errors in wxWidgets + itself, as opposed to bugs in applications using it, are also enabled. + */ + +// unless wxDEBUG_LEVEL is predefined (by configure or via wx/setup.h under +// Windows), use the default +#if !defined(wxDEBUG_LEVEL) + #define wxDEBUG_LEVEL 1 +#endif // !defined(wxDEBUG_LEVEL) + +/* + __WXDEBUG__ is defined when wxDEBUG_LEVEL != 0. This is done mostly for + compatibility but it also provides a simpler way to check if asserts and + debug logging is enabled at all. + */ +#if wxDEBUG_LEVEL > 0 + #ifndef __WXDEBUG__ + #define __WXDEBUG__ + #endif +#else + #undef __WXDEBUG__ +#endif + +// Finally there is also a very old WXDEBUG macro not used anywhere at all, it +// is only defined for compatibility. +#ifdef __WXDEBUG__ + #if !defined(WXDEBUG) || !WXDEBUG + #undef WXDEBUG + #define WXDEBUG 1 + #endif // !WXDEBUG +#endif // __WXDEBUG__ + +// ---------------------------------------------------------------------------- +// Handling assertion failures +// ---------------------------------------------------------------------------- + +/* + Type for the function called in case of assert failure, see + wxSetAssertHandler(). + */ +typedef void (*wxAssertHandler_t)(const wxString& file, + int line, + const wxString& func, + const wxString& cond, + const wxString& msg); + +#if wxDEBUG_LEVEL + +// the global assert handler function, if it is NULL asserts don't check their +// conditions +extern WXDLLIMPEXP_DATA_BASE(wxAssertHandler_t) wxTheAssertHandler; + +/* + Sets the function to be called in case of assertion failure. + + The default assert handler forwards to wxApp::OnAssertFailure() whose + default behaviour is, in turn, to show the standard assertion failure + dialog if a wxApp object exists or shows the same dialog itself directly + otherwise. + + While usually it is enough -- and more convenient -- to just override + OnAssertFailure(), to handle all assertion failures, including those + occurring even before wxApp object creation or after its destruction you + need to provide your assertion handler function. + + This function also provides a simple way to disable all asserts: simply + pass NULL pointer to it. Doing this will result in not even evaluating + assert conditions at all, avoiding almost all run-time cost of asserts. + + Notice that this function is not MT-safe, so you should call it before + starting any other threads. + + The return value of this function is the previous assertion handler. It can + be called after any pre-processing by your handler and can also be restored + later if you uninstall your handler. + */ +inline wxAssertHandler_t wxSetAssertHandler(wxAssertHandler_t handler) +{ + const wxAssertHandler_t old = wxTheAssertHandler; + wxTheAssertHandler = handler; + return old; +} + +/* + Reset the default assert handler. + + This may be used to enable asserts, which are disabled by default in this + case, for programs built in release build (NDEBUG defined). + */ +extern void WXDLLIMPEXP_BASE wxSetDefaultAssertHandler(); + +#else // !wxDEBUG_LEVEL + +// provide empty stubs in case assertions are completely disabled +// +// NB: can't use WXUNUSED() here as we're included from wx/defs.h before it is +// defined +inline wxAssertHandler_t wxSetAssertHandler(wxAssertHandler_t /* handler */) +{ + return NULL; +} + +inline void wxSetDefaultAssertHandler() { } + +#endif // wxDEBUG_LEVEL/!wxDEBUG_LEVEL + +// simply a synonym for wxSetAssertHandler(NULL) +inline void wxDisableAsserts() { wxSetAssertHandler(NULL); } + +/* + A macro which disables asserts for applications compiled in release build. + + By default, wxIMPLEMENT_APP (or rather wxIMPLEMENT_WXWIN_MAIN) disable the + asserts in the applications compiled in the release build by calling this. + It does nothing if NDEBUG is not defined. + */ +#ifdef NDEBUG + #define wxDISABLE_ASSERTS_IN_RELEASE_BUILD() wxDisableAsserts() +#else + #define wxDISABLE_ASSERTS_IN_RELEASE_BUILD() +#endif + +#if wxDEBUG_LEVEL + +/* + wxOnAssert() is used by the debugging macros defined below. Different + overloads are needed because these macros can be used with or without wxT(). + + All of them are implemented in src/common/appcmn.cpp and unconditionally + call wxTheAssertHandler so the caller must check that it is non-NULL + (assert macros do it). + */ + +#if wxUSE_UNICODE + +// these overloads are the ones typically used by debugging macros: we have to +// provide wxChar* msg version because it's common to use wxT() in the macros +// and finally, we can't use const wx(char)* msg = NULL, because that would +// be ambiguous +// +// also notice that these functions can't be inline as wxString is not defined +// yet (and can't be as wxString code itself may use assertions) +extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file, + int line, + const char *func, + const char *cond); + +extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file, + int line, + const char *func, + const char *cond, + const char *msg); + +extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file, + int line, + const char *func, + const char *cond, + const wxChar *msg) ; +#endif /* wxUSE_UNICODE */ + +// this version is for compatibility with wx 2.8 Unicode build only, we don't +// use it ourselves any more except in ANSI-only build in which case it is all +// we need +extern WXDLLIMPEXP_BASE void wxOnAssert(const wxChar *file, + int line, + const char *func, + const wxChar *cond, + const wxChar *msg = NULL); + +// these overloads work when msg passed to debug macro is a string and we +// also have to provide wxCStrData overload to resolve ambiguity which would +// otherwise arise from wxASSERT( s.c_str() ) +extern WXDLLIMPEXP_BASE void wxOnAssert(const wxString& file, + int line, + const wxString& func, + const wxString& cond, + const wxString& msg); + +extern WXDLLIMPEXP_BASE void wxOnAssert(const wxString& file, + int line, + const wxString& func, + const wxString& cond); + +extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file, + int line, + const char *func, + const char *cond, + const wxCStrData& msg); + +extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file, + int line, + const char *func, + const char *cond, + const wxString& msg); + +#endif // wxDEBUG_LEVEL + + +// ---------------------------------------------------------------------------- +// Debugging macros +// ---------------------------------------------------------------------------- + +/* + Assertion macros: check if the condition is true and call assert handler + (which will by default notify the user about failure) if it isn't. + + wxASSERT and wxFAIL macros as well as wxTrap() function do nothing at all + if wxDEBUG_LEVEL is 0 however they do check their conditions at default + debug level 1, unlike the previous wxWidgets versions. + + wxASSERT_LEVEL_2 is meant to be used for "expensive" asserts which should + normally be disabled because they have a big impact on performance and so + this macro only does anything if wxDEBUG_LEVEL >= 2. + */ +#if wxDEBUG_LEVEL + // wxTrap() can be used to break into the debugger unconditionally + // (assuming the program is running under debugger, of course). + // + // If possible, we prefer to define it as a macro rather than as a function + // to open the debugger at the position where we trapped and not inside the + // trap function itself which is not very useful. + #if wxCHECK_VISUALC_VERSION(7) + #define wxTrap() __debugbreak() + #else + extern WXDLLIMPEXP_BASE void wxTrap(); + #endif // Win VisualC + + // Global flag used to indicate that assert macros should call wxTrap(): it + // is set by the default assert handler if the user answers yes to the + // question of whether to trap. + extern WXDLLIMPEXP_DATA_BASE(bool) wxTrapInAssert; + + // This macro checks if the condition is true and calls the assert handler + // with the provided message if it isn't and finally traps if the special + // flag indicating that it should do it was set by the handler. + // + // Notice that we don't use the handler return value for compatibility + // reasons (if we changed its return type, we'd need to change wxApp:: + // OnAssertFailure() too which would break user code overriding it), hence + // the need for the ugly global flag. + #define wxASSERT_MSG(cond, msg) \ + wxSTATEMENT_MACRO_BEGIN \ + if ( wxTheAssertHandler && !(cond) && \ + (wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, \ + #cond, msg), wxTrapInAssert) ) \ + { \ + wxTrapInAssert = false; \ + wxTrap(); \ + } \ + wxSTATEMENT_MACRO_END + + // a version without any additional message, don't use unless condition + // itself is fully self-explanatory + #define wxASSERT(cond) wxASSERT_MSG(cond, (const char*)NULL) + + // wxFAIL is a special form of assert: it always triggers (and so is + // usually used in normally unreachable code) + #define wxFAIL_COND_MSG(cond, msg) \ + wxSTATEMENT_MACRO_BEGIN \ + if ( wxTheAssertHandler && \ + (wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, \ + cond, msg), wxTrapInAssert) ) \ + { \ + wxTrapInAssert = false; \ + wxTrap(); \ + } \ + wxSTATEMENT_MACRO_END + + #define wxFAIL_MSG(msg) wxFAIL_COND_MSG("Assert failure", msg) + #define wxFAIL wxFAIL_MSG((const char*)NULL) +#else // !wxDEBUG_LEVEL + #define wxTrap() + + #define wxASSERT(cond) + #define wxASSERT_MSG(cond, msg) + #define wxFAIL + #define wxFAIL_MSG(msg) + #define wxFAIL_COND_MSG(cond, msg) +#endif // wxDEBUG_LEVEL + +#if wxDEBUG_LEVEL >= 2 + #define wxASSERT_LEVEL_2_MSG(cond, msg) wxASSERT_MSG(cond, msg) + #define wxASSERT_LEVEL_2(cond) wxASSERT(cond) +#else // wxDEBUG_LEVEL < 2 + #define wxASSERT_LEVEL_2_MSG(cond, msg) + #define wxASSERT_LEVEL_2(cond) +#endif + +// This is simply a wrapper for the standard abort() which is not available +// under all platforms. +// +// It isn't really debug-related but there doesn't seem to be any better place +// for it, so declare it here and define it in appbase.cpp, together with +// wxTrap(). +extern void WXDLLIMPEXP_BASE wxAbort(); + +/* + wxCHECK macros always check their conditions, setting debug level to 0 only + makes them silent in case of failure, otherwise -- including at default + debug level 1 -- they call the assert handler if the condition is false + + They are supposed to be used only in invalid situation: for example, an + invalid parameter (e.g. a NULL pointer) is passed to a function. Instead of + dereferencing it and causing core dump the function might use + + wxCHECK_RET( p != NULL, "pointer can't be NULL" ) +*/ + +// the generic macro: takes the condition to check, the statement to be executed +// in case the condition is false and the message to pass to the assert handler +#define wxCHECK2_MSG(cond, op, msg) \ + if ( cond ) \ + {} \ + else \ + { \ + wxFAIL_COND_MSG(#cond, msg); \ + op; \ + } \ + struct wxDummyCheckStruct /* just to force a semicolon */ + +// check which returns with the specified return code if the condition fails +#define wxCHECK_MSG(cond, rc, msg) wxCHECK2_MSG(cond, return rc, msg) + +// check that expression is true, "return" if not (also FAILs in debug mode) +#define wxCHECK(cond, rc) wxCHECK_MSG(cond, rc, (const char*)NULL) + +// check that expression is true, perform op if not +#define wxCHECK2(cond, op) wxCHECK2_MSG(cond, op, (const char*)NULL) + +// special form of wxCHECK2: as wxCHECK, but for use in void functions +// +// NB: there is only one form (with msg parameter) and it's intentional: +// there is no other way to tell the caller what exactly went wrong +// from the void function (of course, the function shouldn't be void +// to begin with...) +#define wxCHECK_RET(cond, msg) wxCHECK2_MSG(cond, return, msg) + + +// ---------------------------------------------------------------------------- +// Compile time asserts +// +// Unlike the normal assert and related macros above which are checked during +// the program run-time the macros below will result in a compilation error if +// the condition they check is false. This is usually used to check the +// expressions containing sizeof()s which cannot be tested with the +// preprocessor. If you can use the #if's, do use them as you can give a more +// detailed error message then. +// ---------------------------------------------------------------------------- + +/* + How this works (you don't have to understand it to be able to use the + macros): we rely on the fact that it is invalid to define a named bit field + in a struct of width 0. All the rest are just the hacks to minimize the + possibility of the compiler warnings when compiling this macro: in + particular, this is why we define a struct and not an object (which would + result in a warning about unused variable) and a named struct (otherwise we'd + get a warning about an unnamed struct not used to define an object!). + */ + +#define wxMAKE_UNIQUE_ASSERT_NAME wxMAKE_UNIQUE_NAME(wxAssert_) + +/* + The second argument of this macro must be a valid C++ identifier and not a + string. I.e. you should use it like this: + + wxCOMPILE_TIME_ASSERT( sizeof(int) >= 2, YourIntsAreTooSmall ); + + It may be used both within a function and in the global scope. +*/ +#if defined(__WATCOMC__) + /* avoid "unused symbol" warning */ + #define wxCOMPILE_TIME_ASSERT(expr, msg) \ + class wxMAKE_UNIQUE_ASSERT_NAME { \ + unsigned int msg: expr; \ + wxMAKE_UNIQUE_ASSERT_NAME() { wxUnusedVar(msg); } \ + } +#elif defined( __VMS ) +namespace wxdebug{ + +// HP aCC cannot deal with missing names for template value parameters +template struct STATIC_ASSERTION_FAILURE; + +template <> struct STATIC_ASSERTION_FAILURE { enum { value = 1 }; }; + +// HP aCC cannot deal with missing names for template value parameters +template struct static_assert_test{}; + +} + #define WX_JOIN( X, Y ) X##Y + #define WX_STATIC_ASSERT_BOOL_CAST(x) (bool)(x) + #define wxCOMPILE_TIME_ASSERT(expr, msg) \ + typedef ::wxdebug::static_assert_test<\ + sizeof(::wxdebug::STATIC_ASSERTION_FAILURE< WX_STATIC_ASSERT_BOOL_CAST( expr ) >)>\ + WX_JOIN(wx_static_assert_typedef_, __LINE__) +#else + #define wxCOMPILE_TIME_ASSERT(expr, msg) \ + struct wxMAKE_UNIQUE_ASSERT_NAME { unsigned int msg: expr; } +#endif + +/* + When using VC++ 6 with "Edit and Continue" on, the compiler completely + mishandles __LINE__ and so wxCOMPILE_TIME_ASSERT() doesn't work, provide a + way to make "unique" assert names by specifying a unique prefix explicitly + */ +#define wxMAKE_UNIQUE_ASSERT_NAME2(text) wxCONCAT(wxAssert_, text) + +#define wxCOMPILE_TIME_ASSERT2(expr, msg, text) \ + struct wxMAKE_UNIQUE_ASSERT_NAME2(text) { unsigned int msg: expr; } + +// helpers for wxCOMPILE_TIME_ASSERT below, for private use only +#define wxMAKE_BITSIZE_MSG(type, size) type ## SmallerThan ## size ## Bits + +// a special case of compile time assert: check that the size of the given type +// is at least the given number of bits +#define wxASSERT_MIN_BITSIZE(type, size) \ + wxCOMPILE_TIME_ASSERT(sizeof(type) * CHAR_BIT >= size, \ + wxMAKE_BITSIZE_MSG(type, size)) + + +// ---------------------------------------------------------------------------- +// other miscellaneous debugger-related functions +// ---------------------------------------------------------------------------- + +/* + Return true if we're running under debugger. + + Currently only really works under Win32 and just returns false elsewhere. + */ +#if defined(__WIN32__) + extern bool WXDLLIMPEXP_BASE wxIsDebuggerRunning(); +#else // !Mac + inline bool wxIsDebuggerRunning() { return false; } +#endif // Mac/!Mac + +// An assert helper used to avoid warning when testing constant expressions, +// i.e. wxASSERT( sizeof(int) == 4 ) can generate a compiler warning about +// expression being always true, but not using +// wxASSERT( wxAssertIsEqual(sizeof(int), 4) ) +// +// NB: this is made obsolete by wxCOMPILE_TIME_ASSERT() and should no +// longer be used. +extern bool WXDLLIMPEXP_BASE wxAssertIsEqual(int x, int y); + +// Use of wxFalse instead of false suppresses compiler warnings about testing +// constant expression +extern WXDLLIMPEXP_DATA_BASE(const bool) wxFalse; + +#define wxAssertFailure wxFalse + +// This is similar to WXUNUSED() and useful for parameters which are only used +// in assertions. +#if wxDEBUG_LEVEL + #define WXUNUSED_UNLESS_DEBUG(param) param +#else + #define WXUNUSED_UNLESS_DEBUG(param) WXUNUSED(param) +#endif + + +#endif // _WX_DEBUG_H_ diff --git a/wxmsw/include/wx-3.0/wx/debugrpt.h b/wxmsw/include/wx-3.0/wx/debugrpt.h new file mode 100644 index 00000000..421bede9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/debugrpt.h @@ -0,0 +1,247 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/debugrpt.h +// Purpose: declaration of wxDebugReport class +// Author: Vadim Zeitlin +// Created: 2005-01-17 +// Copyright: (c) 2005 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DEBUGRPT_H_ +#define _WX_DEBUGRPT_H_ + +#include "wx/defs.h" + +#if wxUSE_DEBUGREPORT && wxUSE_XML + +#include "wx/string.h" +#include "wx/arrstr.h" + +class WXDLLIMPEXP_FWD_XML wxXmlNode; + +// ---------------------------------------------------------------------------- +// wxDebugReport: generate a debug report, processing is done in derived class +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_QA wxDebugReport +{ +public: + // this is used for the functions which may report either the current state + // or the state during the last (fatal) exception + enum Context { Context_Current, Context_Exception }; + + + // ctor creates a temporary directory where we create the files which will + // be included in the report, use IsOk() to check for errors + wxDebugReport(); + + // dtor normally destroys the temporary directory created in the ctor (with + // all the files it contains), call Reset() to prevent this from happening + virtual ~wxDebugReport(); + + // return the name of the directory used for this report + const wxString& GetDirectory() const { return m_dir; } + + // return true if the object was successfully initialized + bool IsOk() const { return !GetDirectory().empty(); } + + // reset the directory name we use, the object can't be used any more after + // this as it becomes invalid/uninitialized + void Reset() { m_dir.clear(); } + + + // add another file to the report: the file must already exist, its name + // can be either absolute in which case it is copied to the debug report + // directory or relative to GetDirectory() + // + // description is shown to the user in the report summary + virtual void AddFile(const wxString& filename, const wxString& description); + + // convenience function: write the given text to a file with the given name + // and then add it to the report (the difference with AddFile() is that the + // file will be created by this function and doesn't have to already exist) + bool AddText(const wxString& filename, + const wxString& text, + const wxString& description); + +#if wxUSE_STACKWALKER + // add an XML file containing the current or exception context and the + // stack trace + bool AddCurrentContext() { return AddContext(Context_Current); } + bool AddExceptionContext() { return AddContext(Context_Exception); } + virtual bool AddContext(Context ctx); +#endif + +#if wxUSE_CRASHREPORT + // add a file with crash report + bool AddCurrentDump() { return AddDump(Context_Current); } + bool AddExceptionDump() { return AddDump(Context_Exception); } + virtual bool AddDump(Context ctx); +#endif // wxUSE_CRASHREPORT + + // add all available information to the report + void AddAll(Context context = Context_Exception); + + + // process this report: the base class simply notifies the user that the + // report has been generated, this is usually not enough -- instead you + // should override this method to do something more useful to you + bool Process(); + + // get the name used as base name for various files, by default + // wxApp::GetName() + virtual wxString GetReportName() const; + + // get the files in this report + size_t GetFilesCount() const { return m_files.GetCount(); } + bool GetFile(size_t n, wxString *name, wxString *desc) const; + + // remove the file from report: this is used by wxDebugReportPreview to + // allow the user to remove files potentially containing private + // information from the report + void RemoveFile(const wxString& name); + +protected: +#if wxUSE_STACKWALKER + // used by AddContext() + virtual bool DoAddSystemInfo(wxXmlNode *nodeSystemInfo); + virtual bool DoAddLoadedModules(wxXmlNode *nodeModules); + virtual bool DoAddExceptionInfo(wxXmlNode *nodeContext); + virtual void DoAddCustomContext(wxXmlNode * WXUNUSED(nodeRoot)) { } +#endif + + // used by Process() + virtual bool DoProcess(); + +private: + // name of the report directory + wxString m_dir; + + // the arrays of files in this report and their descriptions + wxArrayString m_files, + m_descriptions; +}; + +#if wxUSE_ZIPSTREAM + +// ---------------------------------------------------------------------------- +// wxDebugReportCompress: compress all files of this debug report in a .ZIP +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_QA wxDebugReportCompress : public wxDebugReport +{ +public: + wxDebugReportCompress() { } + + // you can optionally specify the directory and/or name of the file where + // the debug report should be generated, a default location under the + // directory containing temporary files will be used if you don't + // + // both of these functions should be called before Process()ing the report + // if they're called at all + void SetCompressedFileDirectory(const wxString& dir); + void SetCompressedFileBaseName(const wxString& name); + + // returns the full path of the compressed file (empty if creation failed) + const wxString& GetCompressedFileName() const { return m_zipfile; } + +protected: + virtual bool DoProcess(); + +private: + // user-specified file directory/base name, use defaults if empty + wxString m_zipDir, + m_zipName; + + // full path to the ZIP file we created + wxString m_zipfile; +}; + +// ---------------------------------------------------------------------------- +// wxDebugReportUploader: uploads compressed file using HTTP POST request +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_QA wxDebugReportUpload : public wxDebugReportCompress +{ +public: + // this class will upload the compressed file created by its base class to + // an HTML multipart/form-data form at the specified address + // + // the URL is the base address, input is the name of the "type=file" + // control on the form used for the file name and action is the value of + // the form action field + wxDebugReportUpload(const wxString& url, + const wxString& input, + const wxString& action, + const wxString& curl = wxT("curl")); + +protected: + virtual bool DoProcess(); + + // this function may be overridden in a derived class to show the output + // from curl: this may be an HTML page or anything else that the server + // returned + // + // return value becomes the return value of Process() + virtual bool OnServerReply(const wxArrayString& WXUNUSED(reply)) + { + return true; + } + +private: + // the full URL to use with HTTP POST request + wxString m_uploadURL; + + // the name of the input field containing the file name in the form at + // above URL + wxString m_inputField; + + // the curl command (by default it is just "curl" but could be full path to + // curl or a wrapper script with curl-compatible syntax) + wxString m_curlCmd; +}; + +#endif // wxUSE_ZIPSTREAM + + +// ---------------------------------------------------------------------------- +// wxDebugReportPreview: presents the debug report to the user and allows him +// to veto report entirely or remove some parts of it +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_QA wxDebugReportPreview +{ +public: + // ctor is trivial + wxDebugReportPreview() { } + + // present the report to the user and allow him to modify it by removing + // some or all of the files and, potentially, adding some notes + // + // return true if the report should be processed or false if the user chose + // to cancel report generation or removed all files from it + virtual bool Show(wxDebugReport& dbgrpt) const = 0; + + // dtor is trivial as well but should be virtual for a base class + virtual ~wxDebugReportPreview() { } +}; + +#if wxUSE_GUI + +// ---------------------------------------------------------------------------- +// wxDebugReportPreviewStd: standard debug report preview window +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_QA wxDebugReportPreviewStd : public wxDebugReportPreview +{ +public: + wxDebugReportPreviewStd() { } + + virtual bool Show(wxDebugReport& dbgrpt) const; +}; + +#endif // wxUSE_GUI + +#endif // wxUSE_DEBUGREPORT && wxUSE_XML + +#endif // _WX_DEBUGRPT_H_ diff --git a/wxmsw/include/wx-3.0/wx/defs.h b/wxmsw/include/wx-3.0/wx/defs.h new file mode 100644 index 00000000..203e0f77 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/defs.h @@ -0,0 +1,3526 @@ +/* + * Name: wx/defs.h + * Purpose: Declarations/definitions common to all wx source files + * Author: Julian Smart and others + * Modified by: Ryan Norton (Converted to C) + * Created: 01/02/97 + * Copyright: (c) Julian Smart + * Licence: wxWindows licence + */ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_DEFS_H_ +#define _WX_DEFS_H_ + +/* + NOTE: this symbol will be replaced with "WXWIN_COMPATIBILITY_3_0" as soon + as the development branch for 3.1 is created + */ +#define FUTURE_WXWIN_COMPATIBILITY_3_0 1 +#define wxDEPRECATED_FUTURE( x ) x + +/* ---------------------------------------------------------------------------- */ +/* compiler and OS identification */ +/* ---------------------------------------------------------------------------- */ + +#include "wx/platform.h" + +#ifdef __cplusplus +/* Make sure the environment is set correctly */ +# if defined(__WXMSW__) && defined(__X__) +# error "Target can't be both X and MSW" +# elif !defined(__WXMOTIF__) && \ + !defined(__WXMSW__) && \ + !defined(__WXGTK__) && \ + !defined(__WXPM__) && \ + !defined(__WXOSX_CARBON__) && \ + !defined(__WXOSX_COCOA__) && \ + !defined(__WXOSX_IPHONE__) && \ + !defined(__WXCOCOA__) && \ + !defined(__X__) && \ + !defined(__WXDFB__) && \ + !defined(__WXX11__) && \ + wxUSE_GUI +# ifdef __UNIX__ +# error "No Target! You should use wx-config program for compilation flags!" +# else /* !Unix */ +# error "No Target! You should use supplied makefiles for compilation!" +# endif /* Unix/!Unix */ +# endif +#endif /*__cplusplus*/ + +#ifndef __WXWINDOWS__ + #define __WXWINDOWS__ 1 +#endif + +#ifndef wxUSE_BASE + /* by default consider that this is a monolithic build */ + #define wxUSE_BASE 1 +#endif + +#if !wxUSE_GUI && !defined(__WXBASE__) + #define __WXBASE__ +#endif + +/* suppress some Visual C++ warnings */ +#ifdef __VISUALC__ + /* the only "real" warning here is 4244 but there are just too many of them */ + /* in our code... one day someone should go and fix them but until then... */ +# pragma warning(disable:4097) /* typedef used as class */ +# pragma warning(disable:4201) /* nonstandard extension used: nameless struct/union */ +# pragma warning(disable:4244) /* conversion from double to float */ +# pragma warning(disable:4355) /* 'this' used in base member initializer list */ +# pragma warning(disable:4511) /* copy ctor couldn't be generated */ +# pragma warning(disable:4512) /* operator=() couldn't be generated */ +# pragma warning(disable:4514) /* unreferenced inline func has been removed */ +# pragma warning(disable:4710) /* function not inlined */ + + /* + TODO: this warning should really be enabled as it can be genuinely + useful, check where does it occur in wxWidgets + */ + #pragma warning(disable: 4127) /* conditional expression is constant */ + + /* There are too many false positivies for this one, particularly when + using templates like wxVector */ + /* class 'foo' needs to have dll-interface to be used by clients of + class 'bar'" */ +# pragma warning(disable:4251) + + /* + This is a similar warning which occurs when deriving from standard + containers. MSDN even mentions that it can be ignored in this case + (albeit only in debug build while the warning is the same in release + too and seems equally harmless). + */ +#if wxUSE_STD_CONTAINERS +# pragma warning(disable:4275) +#endif /* wxUSE_STD_CONTAINERS */ + +# ifdef __VISUALC5__ + /* For VC++ 5.0 for release mode, the warning 'C4702: unreachable code */ + /* is buggy, and occurs for code that does actually get executed */ +# ifndef __WXDEBUG__ +# pragma warning(disable:4702) /* unreachable code */ +# endif + + /* The VC++ 5.0 warning 'C4003: not enough actual parameters for macro' + * is incompatible with the wxWidgets headers since it is given when + * parameters are empty but not missing. */ +# pragma warning(disable:4003) /* not enough actual parameters for macro */ +# endif + + /* + VC6 insists on complaining about + + return type for 'wxVector::reverse_iterator::operator ->' is 'T **' + (ie; not a UDT or reference to a UDT. Will produce errors if applied + using infix notation) + + which is perfectly fine because template classes do routinely define + operators which don't make sense for all template parameter values + (besides this warning was removed in subsequent versions). + */ + #ifdef __VISUALC6__ + #pragma warning(disable: 4284) + #endif /* VC6 */ + + /* + When compiling with VC++ 7 /Wp64 option we get thousands of warnings for + conversion from size_t to int or long. Some precious few of them might + be worth looking into but unfortunately it seems infeasible to fix all + the other, harmless ones (e.g. inserting static_cast(s.length()) + everywhere this method is used though we are quite sure that using >4GB + strings is a bad idea anyhow) so just disable it globally for now. + */ + #if wxCHECK_VISUALC_VERSION(7) + /* conversion from 'size_t' to 'unsigned long', possible loss of data */ + #pragma warning(disable:4267) + #endif /* VC++ 7 or later */ + + /* + VC++ 8 gives a warning when using standard functions such as sprintf, + localtime, ... -- stop this madness, unless the user had already done it + */ + #if wxCHECK_VISUALC_VERSION(8) + #ifndef _CRT_SECURE_NO_DEPRECATE + #define _CRT_SECURE_NO_DEPRECATE 1 + #endif + #ifndef _CRT_NON_CONFORMING_SWPRINTFS + #define _CRT_NON_CONFORMING_SWPRINTFS 1 + #endif + #ifndef _SCL_SECURE_NO_WARNINGS + #define _SCL_SECURE_NO_WARNINGS 1 + #endif + #endif /* VC++ 8 */ +#endif /* __VISUALC__ */ + +/* suppress some Borland C++ warnings */ +#ifdef __BORLANDC__ +# pragma warn -inl /* Functions containing reserved words and certain constructs are not expanded inline */ +#endif /* __BORLANDC__ */ + +/* + g++ gives a warning when a class has private dtor if it has no friends but + this is a perfectly valid situation for a ref-counted class which destroys + itself when its ref count drops to 0, so provide a macro to suppress this + warning + */ +#ifdef __GNUG__ +# define wxSUPPRESS_GCC_PRIVATE_DTOR_WARNING(name) \ + friend class wxDummyFriendFor ## name; +#else /* !g++ */ +# define wxSUPPRESS_GCC_PRIVATE_DTOR_WARNING(name) +#endif + +/* + Clang Support + */ + +#ifndef WX_HAS_CLANG_FEATURE +# ifndef __has_feature +# define WX_HAS_CLANG_FEATURE(x) 0 +# else +# define WX_HAS_CLANG_FEATURE(x) __has_feature(x) +# endif +#endif + +/* ---------------------------------------------------------------------------- */ +/* wxWidgets version and compatibility defines */ +/* ---------------------------------------------------------------------------- */ + +#include "wx/version.h" + +/* ============================================================================ */ +/* non portable C++ features */ +/* ============================================================================ */ + +/* ---------------------------------------------------------------------------- */ +/* compiler defects workarounds */ +/* ---------------------------------------------------------------------------- */ + +/* + Digital Unix C++ compiler only defines this symbol for .cxx and .hxx files, + so define it ourselves (newer versions do it for all files, though, and + don't allow it to be redefined) + */ +#if defined(__DECCXX) && !defined(__VMS) && !defined(__cplusplus) +#define __cplusplus +#endif /* __DECCXX */ + +/* Resolves linking problems under HP-UX when compiling with gcc/g++ */ +#if defined(__HPUX__) && defined(__GNUG__) +#define va_list __gnuc_va_list +#endif /* HP-UX */ + +/* Prevents conflicts between sys/types.h and winsock.h with Cygwin, */ +/* when using Windows sockets. */ +#if defined(__CYGWIN__) && defined(__WXMSW__) +#define __USE_W32_SOCKETS +#endif + +/* ---------------------------------------------------------------------------- */ +/* check for native bool type and TRUE/FALSE constants */ +/* ---------------------------------------------------------------------------- */ + +/* for backwards compatibility, also define TRUE and FALSE */ +/* */ +/* note that these definitions should work both in C++ and C code, so don't */ +/* use true/false below */ +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +typedef short int WXTYPE; + + +/* ---------------------------------------------------------------------------- */ +/* other feature tests */ +/* ---------------------------------------------------------------------------- */ + +/* Every ride down a slippery slope begins with a single step.. */ +/* */ +/* Yes, using nested classes is indeed against our coding standards in */ +/* general, but there are places where you can use them to advantage */ +/* without totally breaking ports that cannot use them. If you do, then */ +/* wrap it in this guard, but such cases should still be relatively rare. */ +#define wxUSE_NESTED_CLASSES 1 + +/* check for explicit keyword support */ +#ifndef HAVE_EXPLICIT + #if defined(__VISUALC__) && (__VISUALC__ >= 1100) + /* VC++ 6.0 and 5.0 have explicit (what about earlier versions?) */ + #define HAVE_EXPLICIT + #elif ( defined(__MINGW32__) || defined(__CYGWIN32__) ) \ + && wxCHECK_GCC_VERSION(2, 95) + /* GCC 2.95 has explicit, what about earlier versions? */ + #define HAVE_EXPLICIT + #elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x0520) + /* BC++ 4.52 doesn't support explicit, CBuilder 1 does */ + #define HAVE_EXPLICIT + #elif defined(__DIGITALMARS__) + #define HAVE_EXPLICIT + #elif defined(__WATCOMC__) + #define HAVE_EXPLICIT + #endif +#endif /* !HAVE_EXPLICIT */ + +#ifdef HAVE_EXPLICIT + #define wxEXPLICIT explicit +#else /* !HAVE_EXPLICIT */ + #define wxEXPLICIT +#endif /* HAVE_EXPLICIT/!HAVE_EXPLICIT */ + +/* these macros are obsolete, use the standard C++ casts directly now */ +#define wx_static_cast(t, x) static_cast(x) +#define wx_const_cast(t, x) const_cast(x) +#define wx_reinterpret_cast(t, x) reinterpret_cast(x) + +/* + This one is a wx invention: like static cast but used when we intentionally + truncate from a larger to smaller type, static_cast<> can't be used for it + as it results in warnings when using some compilers (SGI mipspro for example) + */ +#if defined(__INTELC__) && defined(__cplusplus) + template + inline T wx_truncate_cast_impl(X x) + { + #pragma warning(push) + /* implicit conversion of a 64-bit integral type to a smaller integral type */ + #pragma warning(disable: 1682) + /* conversion from "X" to "T" may lose significant bits */ + #pragma warning(disable: 810) + /* non-pointer conversion from "foo" to "bar" may lose significant bits */ + #pragma warning(disable: 2259) + + return x; + + #pragma warning(pop) + } + + #define wx_truncate_cast(t, x) wx_truncate_cast_impl(x) + +#elif defined(__cplusplus) && defined(__VISUALC__) && __VISUALC__ >= 1310 + template + inline T wx_truncate_cast_impl(X x) + { + #pragma warning(push) + /* conversion from 'size_t' to 'type', possible loss of data */ + #pragma warning(disable: 4267) + /* conversion from 'type1' to 'type2', possible loss of data */ + #pragma warning(disable: 4242) + + return x; + + #pragma warning(pop) + } + + #define wx_truncate_cast(t, x) wx_truncate_cast_impl(x) +#else + #define wx_truncate_cast(t, x) ((t)(x)) +#endif + +/* for consistency with wxStatic/DynamicCast defined in wx/object.h */ +#define wxConstCast(obj, className) wx_const_cast(className *, obj) + +#ifndef HAVE_STD_WSTRING + #if defined(__VISUALC__) && (__VISUALC__ >= 1100) + /* VC++ 6.0 and 5.0 have std::wstring (what about earlier versions?) */ + #define HAVE_STD_WSTRING + #elif defined(__MINGW32__) && wxCHECK_GCC_VERSION(3, 3) + /* GCC 3.1 has std::wstring; 3.0 never was in MinGW, 2.95 hasn't it */ + #define HAVE_STD_WSTRING + #endif +#endif + +#ifndef HAVE_STD_STRING_COMPARE + #if defined(__VISUALC__) && (__VISUALC__ >= 1100) + /* VC++ 6.0 and 5.0 have std::string::compare */ + /* (what about earlier versions?) */ + #define HAVE_STD_STRING_COMPARE + #elif ( defined(__MINGW32__) || defined(__CYGWIN32__) ) \ + && wxCHECK_GCC_VERSION(3, 1) + /* GCC 3.1 has std::string::compare; */ + /* 3.0 never was in MinGW, 2.95 hasn't it */ + #define HAVE_STD_STRING_COMPARE + #endif +#endif + +#ifndef HAVE_TR1_TYPE_TRAITS + #if defined(__VISUALC__) && (_MSC_FULL_VER >= 150030729) + #define HAVE_TR1_TYPE_TRAITS + #endif +#endif + +#if defined(__has_include) + #if !defined(HAVE_TYPE_TRAITS) && __has_include() + #define HAVE_TYPE_TRAITS + #endif + + #if !defined(HAVE_TR1_TYPE_TRAITS) && __has_include() + #define HAVE_TR1_TYPE_TRAITS + #endif + + #if !defined(HAVE_STD_UNORDERED_MAP) && __has_include() + #define HAVE_STD_UNORDERED_MAP + #endif + + #if !defined(HAVE_TR1_UNORDERED_MAP) && __has_include() + #define HAVE_TR1_UNORDERED_MAP + #endif + + #if !defined(HAVE_STD_UNORDERED_SET) && __has_include() + #define HAVE_STD_UNORDERED_SET + #endif + + #if !defined(HAVE_TR1_UNORDERED_SET) && __has_include() + #define HAVE_TR1_UNORDERED_SET + #endif +#endif // defined(__has_include) + +/* provide replacement for C99 va_copy() if the compiler doesn't have it */ + +/* could be already defined by configure or the user */ +#ifndef wxVaCopy + /* if va_copy is a macro or configure detected that we have it, use it */ + #if defined(va_copy) || defined(HAVE_VA_COPY) + #define wxVaCopy va_copy + #else /* no va_copy, try to provide a replacement */ + /* + configure tries to determine whether va_list is an array or struct + type, but it may not be used under Windows, so deal with a few + special cases. + */ + + #ifdef __WATCOMC__ + /* Watcom uses array type for va_list except for PPC and Alpha */ + #if !defined(__PPC__) && !defined(__AXP__) + #define VA_LIST_IS_ARRAY + #endif + #endif /* __WATCOMC__ */ + + #if defined(__PPC__) && (defined(_CALL_SYSV) || defined (_WIN32)) + /* + PPC using SysV ABI and NT/PPC are special in that they use an + extra level of indirection. + */ + #define VA_LIST_IS_POINTER + #endif /* SysV or Win32 on __PPC__ */ + + /* + note that we use memmove(), not memcpy(), in case anybody tries + to do wxVaCopy(ap, ap) + */ + #if defined(VA_LIST_IS_POINTER) + #define wxVaCopy(d, s) memmove(*(d), *(s), sizeof(va_list)) + #elif defined(VA_LIST_IS_ARRAY) + #define wxVaCopy(d, s) memmove((d), (s), sizeof(va_list)) + #else /* we can only hope that va_lists are simple lvalues */ + #define wxVaCopy(d, s) ((d) = (s)) + #endif + #endif /* va_copy/!va_copy */ +#endif /* wxVaCopy */ + +#ifndef HAVE_WOSTREAM + /* + Mingw <= 3.4 and all versions of Cygwin don't have std::wostream + */ + #if (defined(__MINGW32__) && !wxCHECK_GCC_VERSION(4, 0)) || \ + defined(__CYGWIN__) + #define wxNO_WOSTREAM + #endif + + /* VC++ doesn't have it in the old iostream library */ + #if defined(__VISUALC__) && wxUSE_IOSTREAMH + #define wxNO_WOSTREAM + #endif + + #ifndef wxNO_WOSTREAM + #define HAVE_WOSTREAM + #endif + + #undef wxNO_WOSTREAM +#endif /* HAVE_WOSTREAM */ + +/* ---------------------------------------------------------------------------- */ +/* other C++ features */ +/* ---------------------------------------------------------------------------- */ + +#ifndef HAVE_PARTIAL_SPECIALIZATION + /* be optimistic by default */ + #define HAVE_PARTIAL_SPECIALIZATION +#endif + +#ifdef __VISUALC__ + #if __VISUALC__ < 1310 + #undef HAVE_PARTIAL_SPECIALIZATION + #endif +#endif /* __VISUALC__ */ + + +#ifndef HAVE_TEMPLATE_OVERLOAD_RESOLUTION + /* assume the compiler can use type or const expressions as template + arguments if it supports partial specialization -- except if it's a + Borland one which can't */ + #if defined(HAVE_PARTIAL_SPECIALIZATION) && !defined(__BORLANDC__) + #define HAVE_TEMPLATE_OVERLOAD_RESOLUTION + #endif /* (HAVE_PARTIAL_SPECIALIZATION) && !defined(__BORLANDC__) */ +#endif /* !defined(HAVE_TEMPLATE_OVERLOAD_RESOLUTION) */ + +/* ---------------------------------------------------------------------------- */ +/* portable calling conventions macros */ +/* ---------------------------------------------------------------------------- */ + +/* stdcall is used for all functions called by Windows under Windows */ +#if defined(__WINDOWS__) + #if defined(__GNUWIN32__) + #define wxSTDCALL __attribute__((stdcall)) + #else + /* both VC++ and Borland understand this */ + #define wxSTDCALL _stdcall + #endif + +#else /* Win */ + /* no such stupidness under Unix */ + #define wxSTDCALL +#endif /* platform */ + +/* LINKAGEMODE mode is empty for everything except OS/2 */ +#ifndef LINKAGEMODE + #define LINKAGEMODE +#endif /* LINKAGEMODE */ + +/* wxCALLBACK should be used for the functions which are called back by */ +/* Windows (such as compare function for wxListCtrl) */ +#if defined(__WIN32__) && !defined(__WXMICROWIN__) + #define wxCALLBACK wxSTDCALL +#else + /* no stdcall under Unix nor Win16 */ + #define wxCALLBACK +#endif /* platform */ + +/* generic calling convention for the extern "C" functions */ + +#if defined(__VISUALC__) + #define wxC_CALLING_CONV _cdecl +#elif defined(__VISAGECPP__) + #define wxC_CALLING_CONV _Optlink +#else /* !Visual C++ */ + #define wxC_CALLING_CONV +#endif /* compiler */ + +/* callling convention for the qsort(3) callback */ +#define wxCMPFUNC_CONV wxC_CALLING_CONV + +/* compatibility :-( */ +#define CMPFUNC_CONV wxCMPFUNC_CONV + +/* DLL import/export declarations */ +#include "wx/dlimpexp.h" + +/* ---------------------------------------------------------------------------- */ +/* Very common macros */ +/* ---------------------------------------------------------------------------- */ + +/* Printf-like attribute definitions to obtain warnings with GNU C/C++ */ +#ifndef WX_ATTRIBUTE_PRINTF +# if defined(__GNUC__) && !wxUSE_UNICODE +# define WX_ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n))) +# else +# define WX_ATTRIBUTE_PRINTF(m, n) +# endif + +# define WX_ATTRIBUTE_PRINTF_1 WX_ATTRIBUTE_PRINTF(1, 2) +# define WX_ATTRIBUTE_PRINTF_2 WX_ATTRIBUTE_PRINTF(2, 3) +# define WX_ATTRIBUTE_PRINTF_3 WX_ATTRIBUTE_PRINTF(3, 4) +# define WX_ATTRIBUTE_PRINTF_4 WX_ATTRIBUTE_PRINTF(4, 5) +# define WX_ATTRIBUTE_PRINTF_5 WX_ATTRIBUTE_PRINTF(5, 6) +#endif /* !defined(WX_ATTRIBUTE_PRINTF) */ + +#ifndef WX_ATTRIBUTE_NORETURN +# if WX_HAS_CLANG_FEATURE(attribute_analyzer_noreturn) +# define WX_ATTRIBUTE_NORETURN __attribute__((analyzer_noreturn)) +# elif defined( __GNUC__ ) +# define WX_ATTRIBUTE_NORETURN __attribute__ ((noreturn)) +# elif wxCHECK_VISUALC_VERSION(7) +# define WX_ATTRIBUTE_NORETURN __declspec(noreturn) +# else +# define WX_ATTRIBUTE_NORETURN +# endif +#endif + +#if defined(__GNUC__) + #define WX_ATTRIBUTE_UNUSED __attribute__ ((unused)) +#else + #define WX_ATTRIBUTE_UNUSED +#endif + +/* + Macros for marking functions as being deprecated. + + The preferred macro in the new code is wxDEPRECATED_MSG() which allows to + explain why is the function deprecated. Almost all the existing code uses + the older wxDEPRECATED() or its variants currently, but this will hopefully + change in the future. + */ + +/* The basic compiler-specific construct to generate a deprecation warning. */ +#ifdef __clang__ + #define wxDEPRECATED_DECL __attribute__((deprecated)) +#elif wxCHECK_GCC_VERSION(3, 1) + #define wxDEPRECATED_DECL __attribute__((deprecated)) +#elif defined(__VISUALC__) && (__VISUALC__ >= 1300) + #define wxDEPRECATED_DECL __declspec(deprecated) +#else + #define wxDEPRECATED_DECL +#endif + +/* + Macro taking the deprecation message. It applies to the next declaration. + + If the compiler doesn't support showing the message, this degrades to a + simple wxDEPRECATED(), i.e. at least gives a warning, if possible. + */ +#if defined(__clang__) && defined(__has_extension) + #if __has_extension(attribute_deprecated_with_message) + #define wxDEPRECATED_MSG(msg) __attribute__((deprecated(msg))) + #else + #define wxDEPRECATED_MSG(msg) __attribute__((deprecated)) + #endif +#elif wxCHECK_GCC_VERSION(4, 5) + #define wxDEPRECATED_MSG(msg) __attribute__((deprecated(msg))) +#elif wxCHECK_VISUALC_VERSION(8) + #define wxDEPRECATED_MSG(msg) __declspec(deprecated("deprecated: " msg)) +#else + #define wxDEPRECATED_MSG(msg) wxDEPRECATED_DECL +#endif + +/* + Macro taking the declaration that it deprecates. Prefer to use + wxDEPRECATED_MSG() instead as it's simpler (wrapping the entire declaration + makes the code unclear) and allows to specify the explanation. + */ +#define wxDEPRECATED(x) wxDEPRECATED_DECL x + +#if defined(__GNUC__) && !wxCHECK_GCC_VERSION(3, 4) + /* + We need to add dummy "inline" to allow gcc < 3.4 to handle the + deprecation attribute on the constructors. + */ + #define wxDEPRECATED_CONSTRUCTOR(x) wxDEPRECATED( inline x) +#else + #define wxDEPRECATED_CONSTRUCTOR(x) wxDEPRECATED(x) +#endif + +/* + Macro which marks the function as being deprecated but also defines it + inline. + + Currently it's defined in the same trivial way in all cases but it could + need a special definition with some other compilers in the future which + explains why do we have it. + */ +#define wxDEPRECATED_INLINE(func, body) wxDEPRECATED(func) { body } + +/* + A macro to define a simple deprecated accessor. + */ +#define wxDEPRECATED_ACCESSOR(func, what) wxDEPRECATED_INLINE(func, return what;) + +/* + Special variant of the macro above which should be used for the functions + which are deprecated but called by wx itself: this often happens with + deprecated virtual functions which are called by the library. + */ +#ifdef WXBUILDING +# define wxDEPRECATED_BUT_USED_INTERNALLY(x) x +#else +# define wxDEPRECATED_BUT_USED_INTERNALLY(x) wxDEPRECATED(x) +#endif + +/* + Macros to suppress and restore gcc warnings, requires g++ >= 4.6 and don't + do anything otherwise. + + Example of use: + + wxGCC_WARNING_SUPPRESS(float-equal) + inline bool wxIsSameDouble(double x, double y) { return x == y; } + wxGCC_WARNING_RESTORE(float-equal) + */ +#if wxCHECK_GCC_VERSION(4, 6) +# define wxGCC_WARNING_SUPPRESS(x) \ + _Pragma (wxSTRINGIZE(GCC diagnostic push)) \ + _Pragma (wxSTRINGIZE(GCC diagnostic ignored wxSTRINGIZE(wxCONCAT(-W,x)))) +# define wxGCC_WARNING_RESTORE(x) \ + _Pragma (wxSTRINGIZE(GCC diagnostic pop)) +#else /* gcc < 4.6 or not gcc at all */ +# define wxGCC_WARNING_SUPPRESS(x) +# define wxGCC_WARNING_RESTORE(x) +#endif + +/* + Combination of the two variants above: should be used for deprecated + functions which are defined inline and are used by wxWidgets itself. + */ +#ifdef WXBUILDING +# define wxDEPRECATED_BUT_USED_INTERNALLY_INLINE(func, body) func { body } +#else +# define wxDEPRECATED_BUT_USED_INTERNALLY_INLINE(func, body) \ + wxDEPRECATED(func) { body } +#endif + +/* NULL declaration: it must be defined as 0 for C++ programs (in particular, */ +/* it must not be defined as "(void *)0" which is standard for C but completely */ +/* breaks C++ code) */ +#if !defined(__HANDHELDPC__) +#include +#endif + +#ifdef __cplusplus + +// everybody gets the assert and other debug macros +#include "wx/debug.h" + + // delete pointer if it is not NULL and NULL it afterwards + template + inline void wxDELETE(T*& ptr) + { + typedef char TypeIsCompleteCheck[sizeof(T)] WX_ATTRIBUTE_UNUSED; + + if ( ptr != NULL ) + { + delete ptr; + ptr = NULL; + } + } + + // delete an array and NULL it (see comments above) + template + inline void wxDELETEA(T*& ptr) + { + typedef char TypeIsCompleteCheck[sizeof(T)] WX_ATTRIBUTE_UNUSED; + + if ( ptr != NULL ) + { + delete [] ptr; + ptr = NULL; + } + } + + // trivial implementation of std::swap() for primitive types + template + inline void wxSwap(T& first, T& second) + { + T tmp(first); + first = second; + second = tmp; + } +#endif /*__cplusplus*/ + +/* size of statically declared array */ +#define WXSIZEOF(array) (sizeof(array)/sizeof(array[0])) + +/* symbolic constant used by all Find()-like functions returning positive */ +/* integer on success as failure indicator */ +#define wxNOT_FOUND (-1) + +/* the default value for some length parameters meaning that the string is */ +/* NUL-terminated */ +#define wxNO_LEN ((size_t)-1) + +/* ---------------------------------------------------------------------------- */ +/* macros dealing with comparison operators */ +/* ---------------------------------------------------------------------------- */ + +/* + Expands into m(op, args...) for each op in the set { ==, !=, <, <=, >, >= }. + */ +#define wxFOR_ALL_COMPARISONS(m) \ + m(==) m(!=) m(>=) m(<=) m(>) m(<) + +#define wxFOR_ALL_COMPARISONS_1(m, x) \ + m(==,x) m(!=,x) m(>=,x) m(<=,x) m(>,x) m(<,x) + +#define wxFOR_ALL_COMPARISONS_2(m, x, y) \ + m(==,x,y) m(!=,x,y) m(>=,x,y) m(<=,x,y) m(>,x,y) m(<,x,y) + +#define wxFOR_ALL_COMPARISONS_3(m, x, y, z) \ + m(==,x,y,z) m(!=,x,y,z) m(>=,x,y,z) m(<=,x,y,z) m(>,x,y,z) m(<,x,y,z) + +/* + These are only used with wxDEFINE_COMPARISON_[BY_]REV: they pass both the + normal and the reversed comparison operators to the macro. + */ +#define wxFOR_ALL_COMPARISONS_2_REV(m, x, y) \ + m(==,x,y,==) m(!=,x,y,!=) m(>=,x,y,<=) \ + m(<=,x,y,>=) m(>,x,y,<) m(<,x,y,>) + +#define wxFOR_ALL_COMPARISONS_3_REV(m, x, y, z) \ + m(==,x,y,z,==) m(!=,x,y,z,!=) m(>=,x,y,z,<=) \ + m(<=,x,y,z,>=) m(>,x,y,z,<) m(<,x,y,z,>) + + +#define wxDEFINE_COMPARISON(op, T1, T2, cmp) \ + inline bool operator op(T1 x, T2 y) { return cmp(x, y, op); } + +#define wxDEFINE_COMPARISON_REV(op, T1, T2, cmp, oprev) \ + inline bool operator op(T2 y, T1 x) { return cmp(x, y, oprev); } + +#define wxDEFINE_COMPARISON_BY_REV(op, T1, T2, oprev) \ + inline bool operator op(T1 x, T2 y) { return y oprev x; } + +/* + Define all 6 comparison operators (==, !=, <, <=, >, >=) for the given + types in the specified order. The implementation is provided by the cmp + macro. Normally wxDEFINE_ALL_COMPARISONS should be used as comparison + operators are usually symmetric. + */ +#define wxDEFINE_COMPARISONS(T1, T2, cmp) \ + wxFOR_ALL_COMPARISONS_3(wxDEFINE_COMPARISON, T1, T2, cmp) + +/* + Define all 6 comparison operators (==, !=, <, <=, >, >=) for the given + types in the specified order, implemented in terms of existing operators + for the reverse order. + */ +#define wxDEFINE_COMPARISONS_BY_REV(T1, T2) \ + wxFOR_ALL_COMPARISONS_2_REV(wxDEFINE_COMPARISON_BY_REV, T1, T2) + +/* + This macro allows to define all 12 comparison operators (6 operators for + both orders of arguments) for the given types using the provided "cmp" + macro to implement the actual comparison: the macro is called with the 2 + arguments names, the first of type T1 and the second of type T2, and the + comparison operator being implemented. + */ +#define wxDEFINE_ALL_COMPARISONS(T1, T2, cmp) \ + wxFOR_ALL_COMPARISONS_3(wxDEFINE_COMPARISON, T1, T2, cmp) \ + wxFOR_ALL_COMPARISONS_3_REV(wxDEFINE_COMPARISON_REV, T1, T2, cmp) + +/* ---------------------------------------------------------------------------- */ +/* macros to avoid compiler warnings */ +/* ---------------------------------------------------------------------------- */ + +/* Macro to cut down on compiler warnings. */ +#if 1 /* there should be no more any compilers needing the "#else" version */ + #define WXUNUSED(identifier) /* identifier */ +#else /* stupid, broken compiler */ + #define WXUNUSED(identifier) identifier +#endif + +/* some arguments are not used in unicode mode */ +#if wxUSE_UNICODE + #define WXUNUSED_IN_UNICODE(param) WXUNUSED(param) +#else + #define WXUNUSED_IN_UNICODE(param) param +#endif + +/* some arguments are not used in WinCE build */ +#ifdef __WXWINCE__ + #define WXUNUSED_IN_WINCE(param) WXUNUSED(param) +#else + #define WXUNUSED_IN_WINCE(param) param +#endif + +/* unused parameters in non stream builds */ +#if wxUSE_STREAMS + #define WXUNUSED_UNLESS_STREAMS(param) param +#else + #define WXUNUSED_UNLESS_STREAMS(param) WXUNUSED(param) +#endif + +/* some compilers give warning about a possibly unused variable if it is */ +/* initialized in both branches of if/else and shut up if it is initialized */ +/* when declared, but other compilers then give warnings about unused variable */ +/* value -- this should satisfy both of them */ +#if defined(__VISUALC__) + #define wxDUMMY_INITIALIZE(val) = val +#else + #define wxDUMMY_INITIALIZE(val) +#endif + +/* sometimes the value of a variable is *really* not used, to suppress the */ +/* resulting warning you may pass it to this function */ +#ifdef __cplusplus +# ifdef __BORLANDC__ +# define wxUnusedVar(identifier) identifier +# else + template + inline void wxUnusedVar(const T& WXUNUSED(t)) { } +# endif +#endif + +/* ---------------------------------------------------------------------------- */ +/* compiler specific settings */ +/* ---------------------------------------------------------------------------- */ + +#if wxONLY_WATCOM_EARLIER_THAN(1,4) + typedef short mode_t; +#endif + +/* where should i put this? we need to make sure of this as it breaks */ +/* the code. */ +#if !wxUSE_IOSTREAMH && defined(__WXDEBUG__) +# ifdef wxUSE_DEBUG_NEW_ALWAYS +# undef wxUSE_DEBUG_NEW_ALWAYS +# define wxUSE_DEBUG_NEW_ALWAYS 0 +# endif +#endif + +/* ---------------------------------------------------------------------------- */ +/* standard wxWidgets types */ +/* ---------------------------------------------------------------------------- */ + +/* the type for screen and DC coordinates */ +typedef int wxCoord; + +enum { wxDefaultCoord = -1 }; + +/* ---------------------------------------------------------------------------- */ +/* define fixed length types */ +/* ---------------------------------------------------------------------------- */ + +#if defined(__MINGW32__) + #include +#endif + +/* chars are always one byte (by definition), shorts are always two (in */ +/* practice) */ + +/* 8bit */ +typedef signed char wxInt8; +typedef unsigned char wxUint8; +typedef wxUint8 wxByte; + + +/* 16bit */ +#ifdef SIZEOF_SHORT + #if SIZEOF_SHORT != 2 + #error "wxWidgets assumes sizeof(short) == 2, please fix the code" + #endif +#else + #define SIZEOF_SHORT 2 +#endif + +typedef signed short wxInt16; +typedef unsigned short wxUint16; + +typedef wxUint16 wxWord; + +/* + things are getting more interesting with ints, longs and pointers + + there are several different standard data models described by this table: + + +-----------+----------------------------+ + |type\model | LP64 ILP64 LLP64 ILP32 LP32| + +-----------+----------------------------+ + |char | 8 8 8 8 8 | + |short | 16 16 16 16 16 | + |int | 32 64 32 32 16 | + |long | 64 64 32 32 32 | + |long long | 64 64 64 -- -- | + |void * | 64 64 64 32 32 | + +-----------+----------------------------+ + + Win16 used LP32 (but we don't support it any longer), Win32 obviously used + ILP32 and Win64 uses LLP64 (a.k.a. P64) + + Under Unix LP64 is the most widely used (the only I've ever seen, in fact) + */ + +/* 32bit */ +#if defined(__WINDOWS__) + #if defined(__WIN32__) + typedef int wxInt32; + typedef unsigned int wxUint32; + + /* + Win64 uses LLP64 model and so ints and longs have the same size as + in Win32. + */ + #ifndef SIZEOF_INT + #define SIZEOF_INT 4 + #endif + + #ifndef SIZEOF_LONG + #define SIZEOF_LONG 4 + #endif + + #ifndef SIZEOF_WCHAR_T + /* Windows uses UTF-16 */ + #define SIZEOF_WCHAR_T 2 + #endif + + #ifndef SIZEOF_SIZE_T + /* + Under Win64 sizeof(size_t) == 8 and so it is neither unsigned + int nor unsigned long! + */ + #ifdef __WIN64__ + #define SIZEOF_SIZE_T 8 + + #undef wxSIZE_T_IS_UINT + #else /* Win32 */ + #define SIZEOF_SIZE_T 4 + + #define wxSIZE_T_IS_UINT + #endif + #undef wxSIZE_T_IS_ULONG + #endif + + #ifndef SIZEOF_VOID_P + #ifdef __WIN64__ + #define SIZEOF_VOID_P 8 + #else /* Win32 */ + #define SIZEOF_VOID_P 4 + #endif /* Win64/32 */ + #endif + #else + #error "Unsupported Windows version" + #endif +#else /* !Windows */ + /* SIZEOF_XXX are normally defined by configure */ + #ifdef SIZEOF_INT + #if SIZEOF_INT == 8 + /* must be ILP64 data model, there is normally a special 32 bit */ + /* type in it but we don't know what it is... */ + #error "No 32bit int type on this platform" + #elif SIZEOF_INT == 4 + typedef int wxInt32; + typedef unsigned int wxUint32; + #elif SIZEOF_INT == 2 + /* must be LP32 */ + #if SIZEOF_LONG != 4 + #error "No 32bit int type on this platform" + #endif + + typedef long wxInt32; + typedef unsigned long wxUint32; + #else + /* wxWidgets is not ready for 128bit systems yet... */ + #error "Unknown sizeof(int) value, what are you compiling for?" + #endif + #else /* !defined(SIZEOF_INT) */ + /* assume default 32bit machine -- what else can we do? */ + wxCOMPILE_TIME_ASSERT( sizeof(int) == 4, IntMustBeExactly4Bytes); + wxCOMPILE_TIME_ASSERT( sizeof(size_t) == 4, SizeTMustBeExactly4Bytes); + wxCOMPILE_TIME_ASSERT( sizeof(void *) == 4, PtrMustBeExactly4Bytes); + + #define SIZEOF_INT 4 + #define SIZEOF_SIZE_T 4 + #define SIZEOF_VOID_P 4 + + typedef int wxInt32; + typedef unsigned int wxUint32; + + #if defined(__MACH__) && !defined(SIZEOF_WCHAR_T) + #define SIZEOF_WCHAR_T 4 + #endif + #if !defined(SIZEOF_WCHAR_T) + /* also assume that sizeof(wchar_t) == 2 (under Unix the most */ + /* common case is 4 but there configure would have defined */ + /* SIZEOF_WCHAR_T for us) */ + /* the most common case */ + wxCOMPILE_TIME_ASSERT( sizeof(wchar_t) == 2, + Wchar_tMustBeExactly2Bytes); + + #define SIZEOF_WCHAR_T 2 + #endif /* !defined(SIZEOF_WCHAR_T) */ + #endif +#endif /* Win/!Win */ + +#ifndef SIZEOF_WCHAR_T + #error "SIZEOF_WCHAR_T must be defined, but isn't" +#endif + +/* also define C99-like sized MIN/MAX constants */ +#define wxINT8_MIN CHAR_MIN +#define wxINT8_MAX CHAR_MAX +#define wxUINT8_MAX UCHAR_MAX + +#define wxINT16_MIN SHRT_MIN +#define wxINT16_MAX SHRT_MAX +#define wxUINT16_MAX USHRT_MAX + +#if SIZEOF_INT == 4 + #define wxINT32_MIN INT_MIN + #define wxINT32_MAX INT_MAX + #define wxUINT32_MAX UINT_MAX +#elif SIZEOF_LONG == 4 + #define wxINT32_MIN LONG_MIN + #define wxINT32_MAX LONG_MAX + #define wxUINT32_MAX ULONG_MAX +#else + #error "Unknown 32 bit type" +#endif + +typedef wxUint32 wxDword; + +#ifdef LLONG_MAX + #define wxINT64_MIN LLONG_MIN + #define wxINT64_MAX LLONG_MAX + #define wxUINT64_MAX ULLONG_MAX +#else + #define wxINT64_MIN (wxLL(-9223372036854775807)-1) + #define wxINT64_MAX wxLL(9223372036854775807) + #define wxUINT64_MAX wxULL(0xFFFFFFFFFFFFFFFF) +#endif + +/* 64 bit */ + +/* NB: we #define and not typedef wxLongLong_t because we use "#ifdef */ +/* wxLongLong_t" in wx/longlong.h */ + +/* wxULongLong_t is set later (usually to unsigned wxLongLong_t) */ + +/* to avoid compilation problems on 64bit machines with ambiguous method calls */ +/* we will need to define this */ +#undef wxLongLongIsLong + +/* + First check for specific compilers which have known 64 bit integer types, + this avoids clashes with SIZEOF_LONG[_LONG] being defined incorrectly for + e.g. MSVC builds (Python.h defines it as 8 even for MSVC). + + Also notice that we check for "long long" before checking for 64 bit long as + we still want to use "long long" and not "long" for wxLongLong_t on 64 bit + architectures to be able to pass wxLongLong_t to the standard functions + prototyped as taking "long long" such as strtoll(). + */ +#if (defined(__VISUALC__) || defined(__INTELC__)) && defined(__WIN32__) + #define wxLongLong_t __int64 + #define wxLongLongSuffix i64 + #define wxLongLongFmtSpec "I64" +#elif defined(__BORLANDC__) && defined(__WIN32__) && (__BORLANDC__ >= 0x520) + #define wxLongLong_t __int64 + #define wxLongLongSuffix i64 + #define wxLongLongFmtSpec "L" +#elif (defined(__WATCOMC__) && (defined(__WIN32__) || defined(__DOS__) || defined(__OS2__))) + #define wxLongLong_t __int64 + #define wxLongLongSuffix i64 + #define wxLongLongFmtSpec "L" +#elif defined(__DIGITALMARS__) + #define wxLongLong_t __int64 + #define wxLongLongSuffix LL + #define wxLongLongFmtSpec "ll" +#elif defined(__MINGW32__) + #define wxLongLong_t long long + #define wxLongLongSuffix ll + #define wxLongLongFmtSpec "I64" +#elif defined(__VISAGECPP__) && __IBMCPP__ >= 400 + #define wxLongLong_t long long +#elif (defined(SIZEOF_LONG_LONG) && SIZEOF_LONG_LONG >= 8) || \ + defined(__GNUC__) || \ + defined(__CYGWIN__) || \ + defined(__WXMICROWIN__) || \ + (defined(__DJGPP__) && __DJGPP__ >= 2) + #define wxLongLong_t long long + #define wxLongLongSuffix ll + #define wxLongLongFmtSpec "ll" +#elif defined(SIZEOF_LONG) && (SIZEOF_LONG == 8) + #define wxLongLong_t long + #define wxLongLongSuffix l + #define wxLongLongFmtSpec "l" + #define wxLongLongIsLong +#endif + + +#ifdef wxLongLong_t + #define wxULongLong_t unsigned wxLongLong_t + + /* + wxLL() and wxULL() macros allow to define 64 bit constants in a + portable way. + */ + #ifndef wxCOMPILER_BROKEN_CONCAT_OPER + #define wxLL(x) wxCONCAT(x, wxLongLongSuffix) + #define wxULL(x) wxCONCAT(x, wxCONCAT(u, wxLongLongSuffix)) + #else + /* + Currently only Borland compiler has broken concatenation operator + and this compiler is known to use [u]i64 suffix. + */ + #define wxLL(x) wxAPPEND_i64(x) + #define wxULL(x) wxAPPEND_ui64(x) + #endif + + typedef wxLongLong_t wxInt64; + typedef wxULongLong_t wxUint64; + + #define wxHAS_INT64 1 + + #ifndef wxLongLongIsLong + #define wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + #endif +#elif wxUSE_LONGLONG + /* these macros allow to define 64 bit constants in a portable way */ + #define wxLL(x) wxLongLong(x) + #define wxULL(x) wxULongLong(x) + + #define wxInt64 wxLongLong + #define wxUint64 wxULongLong + + #define wxHAS_INT64 1 + +#else /* !wxUSE_LONGLONG */ + + #define wxHAS_INT64 0 + +#endif + +/* + Helper macro for conditionally compiling some code only if wxLongLong_t is + available and is a type different from the other integer types (i.e. not + long). + */ +#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + #define wxIF_LONG_LONG_TYPE(x) x +#else + #define wxIF_LONG_LONG_TYPE(x) +#endif + + +/* Make sure ssize_t is defined (a signed type the same size as size_t). */ +/* (HAVE_SSIZE_T is not already defined by configure) */ +#ifndef HAVE_SSIZE_T +#ifdef __MINGW32__ + #if defined(_SSIZE_T_) || defined(_SSIZE_T_DEFINED) + #define HAVE_SSIZE_T + #endif +#elif wxCHECK_WATCOM_VERSION(1,4) + #define HAVE_SSIZE_T +#endif +#endif /* !HAVE_SSIZE_T */ + +/* If we really don't have ssize_t, provide our own version. */ +#ifdef HAVE_SSIZE_T + #ifdef __UNIX__ + #include + #endif +#else /* !HAVE_SSIZE_T */ + #if SIZEOF_SIZE_T == 4 + typedef wxInt32 ssize_t; + #elif SIZEOF_SIZE_T == 8 + typedef wxInt64 ssize_t; + #else + #error "error defining ssize_t, size_t is not 4 or 8 bytes" + #endif + + /* prevent ssize_t redefinitions in other libraries */ + #define HAVE_SSIZE_T +#endif + +/* + We can't rely on Windows _W64 being defined as windows.h may not be + included so define our own equivalent: this should be used with types + like WXLPARAM or WXWPARAM which are 64 bit under Win64 to avoid warnings + each time we cast it to a pointer or a handle (which results in hundreds + of warnings as Win32 API often passes pointers in them) + */ +#if wxCHECK_VISUALC_VERSION(7) + #define wxW64 __w64 +#else + #define wxW64 +#endif + +/* + Define signed and unsigned integral types big enough to contain all of long, + size_t and void *. + */ +#if SIZEOF_LONG >= SIZEOF_VOID_P + /* + Normal case when long is the largest integral type. + */ + typedef long wxIntPtr; + typedef unsigned long wxUIntPtr; +#elif SIZEOF_SIZE_T >= SIZEOF_VOID_P + /* + Win64 case: size_t is the only integral type big enough for "void *". + + Notice that we must use __w64 to avoid warnings about casting pointers + to wxIntPtr (which we do often as this is what it is defined for) in 32 + bit build with MSVC. + */ + typedef wxW64 ssize_t wxIntPtr; + typedef size_t wxUIntPtr; +#else + /* + This should never happen for the current architectures but if you're + using one where it does, please contact wx-dev@lists.wxwidgets.org. + */ + #error "Pointers can't be stored inside integer types." +#endif + +#ifdef __cplusplus +/* And also define a couple of simple functions to cast pointer to/from it. */ +inline wxUIntPtr wxPtrToUInt(const void *p) +{ + /* + VC++ 7.1 gives warnings about casts such as below even when they're + explicit with /Wp64 option, suppress them as we really know what we're + doing here. Same thing with icc with -Wall. + */ +#ifdef __VISUALC__ + #if __VISUALC__ >= 1200 + #pragma warning(push) + #endif + /* pointer truncation from '' to '' */ + #pragma warning(disable: 4311) +#elif defined(__INTELC__) + #pragma warning(push) + /* conversion from pointer to same-sized integral type */ + #pragma warning(disable: 1684) +#endif + + return wx_reinterpret_cast(wxUIntPtr, p); + +#if (defined(__VISUALC__) && __VISUALC__ >= 1200) || defined(__INTELC__) + #pragma warning(pop) +#endif +} + +inline void *wxUIntToPtr(wxUIntPtr p) +{ +#ifdef __VISUALC__ + #if __VISUALC__ >= 1200 + #pragma warning(push) + #endif + /* conversion to type of greater size */ + #pragma warning(disable: 4312) +#elif defined(__INTELC__) + #pragma warning(push) + /* invalid type conversion: "wxUIntPtr={unsigned long}" to "void *" */ + #pragma warning(disable: 171) +#endif + + return wx_reinterpret_cast(void *, p); + +#if (defined(__VISUALC__) && __VISUALC__ >= 1200) || defined(__INTELC__) + #pragma warning(pop) +#endif +} +#endif /*__cplusplus*/ + + + +/* base floating point types */ +/* wxFloat32: 32 bit IEEE float ( 1 sign, 8 exponent bits, 23 fraction bits ) */ +/* wxFloat64: 64 bit IEEE float ( 1 sign, 11 exponent bits, 52 fraction bits ) */ +/* wxDouble: native fastest representation that has at least wxFloat64 */ +/* precision, so use the IEEE types for storage, and this for */ +/* calculations */ + +typedef float wxFloat32; +typedef double wxFloat64; + +typedef double wxDouble; + +/* + Some (non standard) compilers typedef wchar_t as an existing type instead + of treating it as a real fundamental type, set wxWCHAR_T_IS_REAL_TYPE to 0 + for them and to 1 for all the others. + */ +#ifndef wxWCHAR_T_IS_REAL_TYPE + /* + VC++ typedefs wchar_t as unsigned short by default until VC8, that is + unless /Za or /Zc:wchar_t option is used in which case _WCHAR_T_DEFINED + is defined. + */ +# if defined(__VISUALC__) && !defined(_NATIVE_WCHAR_T_DEFINED) +# define wxWCHAR_T_IS_REAL_TYPE 0 +# else /* compiler having standard-conforming wchar_t */ +# define wxWCHAR_T_IS_REAL_TYPE 1 +# endif +#endif /* !defined(wxWCHAR_T_IS_REAL_TYPE) */ + +/* Helper macro for doing something dependent on whether wchar_t is or isn't a + typedef inside another macro. */ +#if wxWCHAR_T_IS_REAL_TYPE + #define wxIF_WCHAR_T_TYPE(x) x +#else /* !wxWCHAR_T_IS_REAL_TYPE */ + #define wxIF_WCHAR_T_TYPE(x) +#endif /* wxWCHAR_T_IS_REAL_TYPE/!wxWCHAR_T_IS_REAL_TYPE */ + +/* + This constant should be used instead of NULL in vararg functions taking + wxChar* arguments: passing NULL (which is the same as 0, unless the compiler + defines it specially, e.g. like gcc does with its __null built-in) doesn't + work in this case as va_arg() wouldn't interpret the integer 0 correctly + when trying to convert it to a pointer on architectures where sizeof(int) is + strictly less than sizeof(void *). + + Examples of places where this must be used include wxFileTypeInfo ctor. + */ +#define wxNullPtr ((void *)NULL) + + +/* Define wxChar16 and wxChar32 */ + +#if SIZEOF_WCHAR_T == 2 + #define wxWCHAR_T_IS_WXCHAR16 + typedef wchar_t wxChar16; +#else + typedef wxUint16 wxChar16; +#endif + +#if SIZEOF_WCHAR_T == 4 + #define wxWCHAR_T_IS_WXCHAR32 + typedef wchar_t wxChar32; +#else + typedef wxUint32 wxChar32; +#endif + + +/* + Helper macro expanding into the given "m" macro invoked with each of the + integer types as parameter (notice that this does not include char/unsigned + char and bool but does include wchar_t). + */ +#define wxDO_FOR_INT_TYPES(m) \ + m(short) \ + m(unsigned short) \ + m(int) \ + m(unsigned int) \ + m(long) \ + m(unsigned long) \ + wxIF_LONG_LONG_TYPE( m(wxLongLong_t) ) \ + wxIF_LONG_LONG_TYPE( m(wxULongLong_t) ) \ + wxIF_WCHAR_T_TYPE( m(wchar_t) ) + +/* + Same as wxDO_FOR_INT_TYPES() but does include char and unsigned char. + + Notice that we use "char" and "unsigned char" here but not "signed char" + which would be more correct as "char" could be unsigned by default. But + wxWidgets code currently supposes that char is signed and we'd need to + clean up assumptions about it, notably in wx/unichar.h, to be able to use + "signed char" here. + */ +#define wxDO_FOR_CHAR_INT_TYPES(m) \ + m(char) \ + m(unsigned char) \ + wxDO_FOR_INT_TYPES(m) + +/* + Same as wxDO_FOR_INT_TYPES() above except that m macro takes the + type as the first argument and some extra argument, passed from this macro + itself, as the second one. + */ +#define wxDO_FOR_INT_TYPES_1(m, arg) \ + m(short, arg) \ + m(unsigned short, arg) \ + m(int, arg) \ + m(unsigned int, arg) \ + m(long, arg) \ + m(unsigned long, arg) \ + wxIF_LONG_LONG_TYPE( m(wxLongLong_t, arg) ) \ + wxIF_LONG_LONG_TYPE( m(wxULongLong_t, arg) ) \ + wxIF_WCHAR_T_TYPE( m(wchar_t, arg) ) + +/* + Combination of wxDO_FOR_CHAR_INT_TYPES() and wxDO_FOR_INT_TYPES_1(): + invokes the given macro with the specified argument as its second parameter + for all char and int types. + */ +#define wxDO_FOR_CHAR_INT_TYPES_1(m, arg) \ + m(char, arg) \ + m(unsigned char, arg) \ + wxDO_FOR_INT_TYPES_1(m, arg) + + +/* ---------------------------------------------------------------------------- */ +/* byte ordering related definition and macros */ +/* ---------------------------------------------------------------------------- */ + +/* byte sex */ + +#define wxBIG_ENDIAN 4321 +#define wxLITTLE_ENDIAN 1234 +#define wxPDP_ENDIAN 3412 + +#ifdef WORDS_BIGENDIAN +#define wxBYTE_ORDER wxBIG_ENDIAN +#else +#define wxBYTE_ORDER wxLITTLE_ENDIAN +#endif + +/* byte swapping */ + +#define wxUINT16_SWAP_ALWAYS(val) \ + ((wxUint16) ( \ + (((wxUint16) (val) & (wxUint16) 0x00ffU) << 8) | \ + (((wxUint16) (val) & (wxUint16) 0xff00U) >> 8))) + +#define wxINT16_SWAP_ALWAYS(val) \ + ((wxInt16) ( \ + (((wxUint16) (val) & (wxUint16) 0x00ffU) << 8) | \ + (((wxUint16) (val) & (wxUint16) 0xff00U) >> 8))) + +#define wxUINT32_SWAP_ALWAYS(val) \ + ((wxUint32) ( \ + (((wxUint32) (val) & (wxUint32) 0x000000ffU) << 24) | \ + (((wxUint32) (val) & (wxUint32) 0x0000ff00U) << 8) | \ + (((wxUint32) (val) & (wxUint32) 0x00ff0000U) >> 8) | \ + (((wxUint32) (val) & (wxUint32) 0xff000000U) >> 24))) + +#define wxINT32_SWAP_ALWAYS(val) \ + ((wxInt32) ( \ + (((wxUint32) (val) & (wxUint32) 0x000000ffU) << 24) | \ + (((wxUint32) (val) & (wxUint32) 0x0000ff00U) << 8) | \ + (((wxUint32) (val) & (wxUint32) 0x00ff0000U) >> 8) | \ + (((wxUint32) (val) & (wxUint32) 0xff000000U) >> 24))) +/* machine specific byte swapping */ + +#ifdef wxLongLong_t + #define wxUINT64_SWAP_ALWAYS(val) \ + ((wxUint64) ( \ + (((wxUint64) (val) & (wxUint64) wxULL(0x00000000000000ff)) << 56) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x000000000000ff00)) << 40) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x0000000000ff0000)) << 24) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x00000000ff000000)) << 8) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x000000ff00000000)) >> 8) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x0000ff0000000000)) >> 24) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x00ff000000000000)) >> 40) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0xff00000000000000)) >> 56))) + + #define wxINT64_SWAP_ALWAYS(val) \ + ((wxInt64) ( \ + (((wxUint64) (val) & (wxUint64) wxULL(0x00000000000000ff)) << 56) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x000000000000ff00)) << 40) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x0000000000ff0000)) << 24) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x00000000ff000000)) << 8) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x000000ff00000000)) >> 8) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x0000ff0000000000)) >> 24) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x00ff000000000000)) >> 40) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0xff00000000000000)) >> 56))) +#elif wxUSE_LONGLONG /* !wxLongLong_t */ + #define wxUINT64_SWAP_ALWAYS(val) \ + ((wxUint64) ( \ + ((wxULongLong(val) & wxULongLong(0L, 0x000000ffU)) << 56) | \ + ((wxULongLong(val) & wxULongLong(0L, 0x0000ff00U)) << 40) | \ + ((wxULongLong(val) & wxULongLong(0L, 0x00ff0000U)) << 24) | \ + ((wxULongLong(val) & wxULongLong(0L, 0xff000000U)) << 8) | \ + ((wxULongLong(val) & wxULongLong(0x000000ffL, 0U)) >> 8) | \ + ((wxULongLong(val) & wxULongLong(0x0000ff00L, 0U)) >> 24) | \ + ((wxULongLong(val) & wxULongLong(0x00ff0000L, 0U)) >> 40) | \ + ((wxULongLong(val) & wxULongLong(0xff000000L, 0U)) >> 56))) + + #define wxINT64_SWAP_ALWAYS(val) \ + ((wxInt64) ( \ + ((wxLongLong(val) & wxLongLong(0L, 0x000000ffU)) << 56) | \ + ((wxLongLong(val) & wxLongLong(0L, 0x0000ff00U)) << 40) | \ + ((wxLongLong(val) & wxLongLong(0L, 0x00ff0000U)) << 24) | \ + ((wxLongLong(val) & wxLongLong(0L, 0xff000000U)) << 8) | \ + ((wxLongLong(val) & wxLongLong(0x000000ffL, 0U)) >> 8) | \ + ((wxLongLong(val) & wxLongLong(0x0000ff00L, 0U)) >> 24) | \ + ((wxLongLong(val) & wxLongLong(0x00ff0000L, 0U)) >> 40) | \ + ((wxLongLong(val) & wxLongLong(0xff000000L, 0U)) >> 56))) +#endif /* wxLongLong_t/!wxLongLong_t */ + +#ifdef WORDS_BIGENDIAN + #define wxUINT16_SWAP_ON_BE(val) wxUINT16_SWAP_ALWAYS(val) + #define wxINT16_SWAP_ON_BE(val) wxINT16_SWAP_ALWAYS(val) + #define wxUINT16_SWAP_ON_LE(val) (val) + #define wxINT16_SWAP_ON_LE(val) (val) + #define wxUINT32_SWAP_ON_BE(val) wxUINT32_SWAP_ALWAYS(val) + #define wxINT32_SWAP_ON_BE(val) wxINT32_SWAP_ALWAYS(val) + #define wxUINT32_SWAP_ON_LE(val) (val) + #define wxINT32_SWAP_ON_LE(val) (val) + #if wxHAS_INT64 + #define wxUINT64_SWAP_ON_BE(val) wxUINT64_SWAP_ALWAYS(val) + #define wxUINT64_SWAP_ON_LE(val) (val) + #define wxINT64_SWAP_ON_BE(val) wxINT64_SWAP_ALWAYS(val) + #define wxINT64_SWAP_ON_LE(val) (val) + #endif +#else + #define wxUINT16_SWAP_ON_LE(val) wxUINT16_SWAP_ALWAYS(val) + #define wxINT16_SWAP_ON_LE(val) wxINT16_SWAP_ALWAYS(val) + #define wxUINT16_SWAP_ON_BE(val) (val) + #define wxINT16_SWAP_ON_BE(val) (val) + #define wxUINT32_SWAP_ON_LE(val) wxUINT32_SWAP_ALWAYS(val) + #define wxINT32_SWAP_ON_LE(val) wxINT32_SWAP_ALWAYS(val) + #define wxUINT32_SWAP_ON_BE(val) (val) + #define wxINT32_SWAP_ON_BE(val) (val) + #if wxHAS_INT64 + #define wxUINT64_SWAP_ON_LE(val) wxUINT64_SWAP_ALWAYS(val) + #define wxUINT64_SWAP_ON_BE(val) (val) + #define wxINT64_SWAP_ON_LE(val) wxINT64_SWAP_ALWAYS(val) + #define wxINT64_SWAP_ON_BE(val) (val) + #endif +#endif + +/* ---------------------------------------------------------------------------- */ +/* template workarounds for buggy compilers */ +/* ---------------------------------------------------------------------------- */ + +#if defined(__GNUC__) && !wxCHECK_GCC_VERSION( 3, 4 ) + /* GCC <= 3.4 has buggy template support */ +# define wxUSE_MEMBER_TEMPLATES 0 +#endif + +#if defined(_MSC_VER) && _MSC_VER <= 1200 + /* MSVC <= 6.0 has buggy template support */ +# define wxUSE_MEMBER_TEMPLATES 0 +# define wxUSE_FUNC_TEMPLATE_POINTER 0 +#endif + +#ifndef wxUSE_MEMBER_TEMPLATES +# define wxUSE_MEMBER_TEMPLATES 1 +#endif + +#ifndef wxUSE_FUNC_TEMPLATE_POINTER +# define wxUSE_FUNC_TEMPLATE_POINTER 1 +#endif + +#if wxUSE_MEMBER_TEMPLATES +# define wxTEMPLATED_MEMBER_CALL( method, type ) method() +# define wxTEMPLATED_MEMBER_FIX( type ) +#else +# define wxTEMPLATED_MEMBER_CALL( method, type ) method((type*)NULL) +# define wxTEMPLATED_MEMBER_FIX( type ) type* =NULL +#endif + +#if defined(_MSC_VER) && _MSC_VER <= 1200 +# define wxTEMPLATED_FUNCTION_FIX( type ), wxTEMPLATED_MEMBER_FIX(type) +# define wxINFUNC_CLASS_TYPE_FIX( type ) typedef type type; +#else +# define wxTEMPLATED_FUNCTION_FIX( type ) +# define wxINFUNC_CLASS_TYPE_FIX( type ) +#endif + +/* ---------------------------------------------------------------------------- */ +/* Geometric flags */ +/* ---------------------------------------------------------------------------- */ + +enum wxGeometryCentre +{ + wxCENTRE = 0x0001, + wxCENTER = wxCENTRE +}; + +/* centering into frame rather than screen (obsolete) */ +#define wxCENTER_FRAME 0x0000 +/* centre on screen rather than parent */ +#define wxCENTRE_ON_SCREEN 0x0002 +#define wxCENTER_ON_SCREEN wxCENTRE_ON_SCREEN + +enum wxOrientation +{ + /* don't change the values of these elements, they are used elsewhere */ + wxHORIZONTAL = 0x0004, + wxVERTICAL = 0x0008, + + wxBOTH = wxVERTICAL | wxHORIZONTAL, + + /* a mask to extract orientation from the combination of flags */ + wxORIENTATION_MASK = wxBOTH +}; + +enum wxDirection +{ + wxLEFT = 0x0010, + wxRIGHT = 0x0020, + wxUP = 0x0040, + wxDOWN = 0x0080, + + wxTOP = wxUP, + wxBOTTOM = wxDOWN, + + wxNORTH = wxUP, + wxSOUTH = wxDOWN, + wxWEST = wxLEFT, + wxEAST = wxRIGHT, + + wxALL = (wxUP | wxDOWN | wxRIGHT | wxLEFT), + + /* a mask to extract direction from the combination of flags */ + wxDIRECTION_MASK = wxALL +}; + +enum wxAlignment +{ + /* + 0 is a valid wxAlignment value (both wxALIGN_LEFT and wxALIGN_TOP + use it) so define a symbolic name for an invalid alignment value + which can be assumed to be different from anything else + */ + wxALIGN_INVALID = -1, + + wxALIGN_NOT = 0x0000, + wxALIGN_CENTER_HORIZONTAL = 0x0100, + wxALIGN_CENTRE_HORIZONTAL = wxALIGN_CENTER_HORIZONTAL, + wxALIGN_LEFT = wxALIGN_NOT, + wxALIGN_TOP = wxALIGN_NOT, + wxALIGN_RIGHT = 0x0200, + wxALIGN_BOTTOM = 0x0400, + wxALIGN_CENTER_VERTICAL = 0x0800, + wxALIGN_CENTRE_VERTICAL = wxALIGN_CENTER_VERTICAL, + + wxALIGN_CENTER = (wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL), + wxALIGN_CENTRE = wxALIGN_CENTER, + + /* a mask to extract alignment from the combination of flags */ + wxALIGN_MASK = 0x0f00 +}; + +/* misc. flags for wxSizer items */ +enum wxSizerFlagBits +{ + /* + wxADJUST_MINSIZE doesn't do anything any more but we still define + it for compatibility. Notice that it may be also predefined (as 0, + hopefully) in the user code in order to use it even in + !WXWIN_COMPATIBILITY_2_8 builds so don't redefine it in such case. + */ +#if WXWIN_COMPATIBILITY_2_8 && !defined(wxADJUST_MINSIZE) + wxADJUST_MINSIZE = 0, +#endif + wxFIXED_MINSIZE = 0x8000, + wxRESERVE_SPACE_EVEN_IF_HIDDEN = 0x0002, + + /* a mask to extract wxSizerFlagBits from combination of flags */ + wxSIZER_FLAG_BITS_MASK = 0x8002 +}; + +enum wxStretch +{ + wxSTRETCH_NOT = 0x0000, + wxSHRINK = 0x1000, + wxGROW = 0x2000, + wxEXPAND = wxGROW, + wxSHAPED = 0x4000, + wxTILE = wxSHAPED | wxFIXED_MINSIZE, + + /* a mask to extract stretch from the combination of flags */ + wxSTRETCH_MASK = 0x7000 /* sans wxTILE */ +}; + +/* border flags: the values are chosen for backwards compatibility */ +enum wxBorder +{ + /* this is different from wxBORDER_NONE as by default the controls do have */ + /* border */ + wxBORDER_DEFAULT = 0, + + wxBORDER_NONE = 0x00200000, + wxBORDER_STATIC = 0x01000000, + wxBORDER_SIMPLE = 0x02000000, + wxBORDER_RAISED = 0x04000000, + wxBORDER_SUNKEN = 0x08000000, + wxBORDER_DOUBLE = 0x10000000, /* deprecated */ + wxBORDER_THEME = wxBORDER_DOUBLE, + + /* a mask to extract border style from the combination of flags */ + wxBORDER_MASK = 0x1f200000 +}; + +/* This makes it easier to specify a 'normal' border for a control */ +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) +#define wxDEFAULT_CONTROL_BORDER wxBORDER_SIMPLE +#else +#define wxDEFAULT_CONTROL_BORDER wxBORDER_SUNKEN +#endif + +/* ---------------------------------------------------------------------------- */ +/* Window style flags */ +/* ---------------------------------------------------------------------------- */ + +/* + * Values are chosen so they can be |'ed in a bit list. + * Some styles are used across more than one group, + * so the values mustn't clash with others in the group. + * Otherwise, numbers can be reused across groups. + */ + +/* + Summary of the bits used by various styles. + + High word, containing styles which can be used with many windows: + + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16| + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | \_ wxFULL_REPAINT_ON_RESIZE + | | | | | | | | | | | | | | \____ wxPOPUP_WINDOW + | | | | | | | | | | | | | \_______ wxWANTS_CHARS + | | | | | | | | | | | | \__________ wxTAB_TRAVERSAL + | | | | | | | | | | | \_____________ wxTRANSPARENT_WINDOW + | | | | | | | | | | \________________ wxBORDER_NONE + | | | | | | | | | \___________________ wxCLIP_CHILDREN + | | | | | | | | \______________________ wxALWAYS_SHOW_SB + | | | | | | | \_________________________ wxBORDER_STATIC + | | | | | | \____________________________ wxBORDER_SIMPLE + | | | | | \_______________________________ wxBORDER_RAISED + | | | | \__________________________________ wxBORDER_SUNKEN + | | | \_____________________________________ wxBORDER_{DOUBLE,THEME} + | | \________________________________________ wxCAPTION/wxCLIP_SIBLINGS + | \___________________________________________ wxHSCROLL + \______________________________________________ wxVSCROLL + + + Low word style bits is class-specific meaning that the same bit can have + different meanings for different controls (e.g. 0x10 is wxCB_READONLY + meaning that the control can't be modified for wxComboBox but wxLB_SORT + meaning that the control should be kept sorted for wxListBox, while + wxLB_SORT has a different value -- and this is just fine). + */ + +/* + * Window (Frame/dialog/subwindow/panel item) style flags + */ +#define wxVSCROLL 0x80000000 +#define wxHSCROLL 0x40000000 +#define wxCAPTION 0x20000000 + +/* New styles (border styles are now in their own enum) */ +#define wxDOUBLE_BORDER wxBORDER_DOUBLE +#define wxSUNKEN_BORDER wxBORDER_SUNKEN +#define wxRAISED_BORDER wxBORDER_RAISED +#define wxBORDER wxBORDER_SIMPLE +#define wxSIMPLE_BORDER wxBORDER_SIMPLE +#define wxSTATIC_BORDER wxBORDER_STATIC +#define wxNO_BORDER wxBORDER_NONE + +/* wxALWAYS_SHOW_SB: instead of hiding the scrollbar when it is not needed, */ +/* disable it - but still show (see also wxLB_ALWAYS_SB style) */ +/* */ +/* NB: as this style is only supported by wxUniversal and wxMSW so far */ +#define wxALWAYS_SHOW_SB 0x00800000 + +/* Clip children when painting, which reduces flicker in e.g. frames and */ +/* splitter windows, but can't be used in a panel where a static box must be */ +/* 'transparent' (panel paints the background for it) */ +#define wxCLIP_CHILDREN 0x00400000 + +/* Note we're reusing the wxCAPTION style because we won't need captions */ +/* for subwindows/controls */ +#define wxCLIP_SIBLINGS 0x20000000 + +#define wxTRANSPARENT_WINDOW 0x00100000 + +/* Add this style to a panel to get tab traversal working outside of dialogs */ +/* (on by default for wxPanel, wxDialog, wxScrolledWindow) */ +#define wxTAB_TRAVERSAL 0x00080000 + +/* Add this style if the control wants to get all keyboard messages (under */ +/* Windows, it won't normally get the dialog navigation key events) */ +#define wxWANTS_CHARS 0x00040000 + +/* Make window retained (Motif only, see src/generic/scrolwing.cpp) + * This is non-zero only under wxMotif, to avoid a clash with wxPOPUP_WINDOW + * on other platforms + */ + +#ifdef __WXMOTIF__ +#define wxRETAINED 0x00020000 +#else +#define wxRETAINED 0x00000000 +#endif +#define wxBACKINGSTORE wxRETAINED + +/* set this flag to create a special popup window: it will be always shown on */ +/* top of other windows, will capture the mouse and will be dismissed when the */ +/* mouse is clicked outside of it or if it loses focus in any other way */ +#define wxPOPUP_WINDOW 0x00020000 + +/* force a full repaint when the window is resized (instead of repainting just */ +/* the invalidated area) */ +#define wxFULL_REPAINT_ON_RESIZE 0x00010000 + +/* obsolete: now this is the default behaviour */ +/* */ +/* don't invalidate the whole window (resulting in a PAINT event) when the */ +/* window is resized (currently, makes sense for wxMSW only) */ +#define wxNO_FULL_REPAINT_ON_RESIZE 0 + +/* A mask which can be used to filter (out) all wxWindow-specific styles. + */ +#define wxWINDOW_STYLE_MASK \ + (wxVSCROLL|wxHSCROLL|wxBORDER_MASK|wxALWAYS_SHOW_SB|wxCLIP_CHILDREN| \ + wxCLIP_SIBLINGS|wxTRANSPARENT_WINDOW|wxTAB_TRAVERSAL|wxWANTS_CHARS| \ + wxRETAINED|wxPOPUP_WINDOW|wxFULL_REPAINT_ON_RESIZE) + +/* + * Extra window style flags (use wxWS_EX prefix to make it clear that they + * should be passed to wxWindow::SetExtraStyle(), not SetWindowStyle()) + */ + +/* by default, TransferDataTo/FromWindow() only work on direct children of the */ +/* window (compatible behaviour), set this flag to make them recursively */ +/* descend into all subwindows */ +#define wxWS_EX_VALIDATE_RECURSIVELY 0x00000001 + +/* wxCommandEvents and the objects of the derived classes are forwarded to the */ +/* parent window and so on recursively by default. Using this flag for the */ +/* given window allows to block this propagation at this window, i.e. prevent */ +/* the events from being propagated further upwards. The dialogs have this */ +/* flag on by default. */ +#define wxWS_EX_BLOCK_EVENTS 0x00000002 + +/* don't use this window as an implicit parent for the other windows: this must */ +/* be used with transient windows as otherwise there is the risk of creating a */ +/* dialog/frame with this window as a parent which would lead to a crash if the */ +/* parent is destroyed before the child */ +#define wxWS_EX_TRANSIENT 0x00000004 + +/* don't paint the window background, we'll assume it will */ +/* be done by a theming engine. This is not yet used but could */ +/* possibly be made to work in the future, at least on Windows */ +#define wxWS_EX_THEMED_BACKGROUND 0x00000008 + +/* this window should always process idle events */ +#define wxWS_EX_PROCESS_IDLE 0x00000010 + +/* this window should always process UI update events */ +#define wxWS_EX_PROCESS_UI_UPDATES 0x00000020 + +/* Draw the window in a metal theme on Mac */ +#define wxFRAME_EX_METAL 0x00000040 +#define wxDIALOG_EX_METAL 0x00000040 + +/* Use this style to add a context-sensitive help to the window (currently for */ +/* Win32 only and it doesn't work if wxMINIMIZE_BOX or wxMAXIMIZE_BOX are used) */ +#define wxWS_EX_CONTEXTHELP 0x00000080 + +/* synonyms for wxWS_EX_CONTEXTHELP for compatibility */ +#define wxFRAME_EX_CONTEXTHELP wxWS_EX_CONTEXTHELP +#define wxDIALOG_EX_CONTEXTHELP wxWS_EX_CONTEXTHELP + +/* Create a window which is attachable to another top level window */ +#define wxFRAME_DRAWER 0x0020 + +/* + * MDI parent frame style flags + * Can overlap with some of the above. + */ + +#define wxFRAME_NO_WINDOW_MENU 0x0100 + +/* + * wxMenuBar style flags + */ +/* use native docking */ +#define wxMB_DOCKABLE 0x0001 + +/* + * wxMenu style flags + */ +#define wxMENU_TEAROFF 0x0001 + +/* + * Apply to all panel items + */ +#define wxCOLOURED 0x0800 +#define wxFIXED_LENGTH 0x0400 + +/* + * Styles for wxListBox + */ +#define wxLB_SORT 0x0010 +#define wxLB_SINGLE 0x0020 +#define wxLB_MULTIPLE 0x0040 +#define wxLB_EXTENDED 0x0080 +/* wxLB_OWNERDRAW is Windows-only */ +#define wxLB_NEEDED_SB 0x0000 +#define wxLB_OWNERDRAW 0x0100 +#define wxLB_ALWAYS_SB 0x0200 +#define wxLB_NO_SB 0x0400 +#define wxLB_HSCROLL wxHSCROLL +/* always show an entire number of rows */ +#define wxLB_INT_HEIGHT 0x0800 + +#if WXWIN_COMPATIBILITY_2_6 + /* deprecated synonyms */ + #define wxPROCESS_ENTER 0x0400 /* wxTE_PROCESS_ENTER */ + #define wxPASSWORD 0x0800 /* wxTE_PASSWORD */ +#endif + +/* + * wxComboBox style flags + */ +#define wxCB_SIMPLE 0x0004 +#define wxCB_SORT 0x0008 +#define wxCB_READONLY 0x0010 +#define wxCB_DROPDOWN 0x0020 + +/* + * wxRadioBox style flags + */ +/* should we number the items from left to right or from top to bottom in a 2d */ +/* radiobox? */ +#define wxRA_LEFTTORIGHT 0x0001 +#define wxRA_TOPTOBOTTOM 0x0002 + +/* New, more intuitive names to specify majorDim argument */ +#define wxRA_SPECIFY_COLS wxHORIZONTAL +#define wxRA_SPECIFY_ROWS wxVERTICAL + +/* Old names for compatibility */ +#define wxRA_HORIZONTAL wxHORIZONTAL +#define wxRA_VERTICAL wxVERTICAL + +/* + * wxRadioButton style flag + */ +#define wxRB_GROUP 0x0004 +#define wxRB_SINGLE 0x0008 + +/* + * wxScrollBar flags + */ +#define wxSB_HORIZONTAL wxHORIZONTAL +#define wxSB_VERTICAL wxVERTICAL + +/* + * wxSpinButton flags. + * Note that a wxSpinCtrl is sometimes defined as a wxTextCtrl, and so the + * flags shouldn't overlap with wxTextCtrl flags that can be used for a single + * line controls (currently we reuse wxTE_CHARWRAP and wxTE_RICH2 neither of + * which makes sense for them). + */ +#define wxSP_HORIZONTAL wxHORIZONTAL /* 4 */ +#define wxSP_VERTICAL wxVERTICAL /* 8 */ +#define wxSP_ARROW_KEYS 0x4000 +#define wxSP_WRAP 0x8000 + +/* + * wxTabCtrl flags + */ +#define wxTC_RIGHTJUSTIFY 0x0010 +#define wxTC_FIXEDWIDTH 0x0020 +#define wxTC_TOP 0x0000 /* default */ +#define wxTC_LEFT 0x0020 +#define wxTC_RIGHT 0x0040 +#define wxTC_BOTTOM 0x0080 +#define wxTC_MULTILINE 0x0200 /* == wxNB_MULTILINE */ +#define wxTC_OWNERDRAW 0x0400 + +/* + * wxStaticBitmap flags + */ +#define wxBI_EXPAND wxEXPAND + +/* + * wxStaticLine flags + */ +#define wxLI_HORIZONTAL wxHORIZONTAL +#define wxLI_VERTICAL wxVERTICAL + + +/* + * extended dialog specifiers. these values are stored in a different + * flag and thus do not overlap with other style flags. note that these + * values do not correspond to the return values of the dialogs (for + * those values, look at the wxID_XXX defines). + */ + +/* wxCENTRE already defined as 0x00000001 */ +#define wxYES 0x00000002 +#define wxOK 0x00000004 +#define wxNO 0x00000008 +#define wxYES_NO (wxYES | wxNO) +#define wxCANCEL 0x00000010 +#define wxAPPLY 0x00000020 +#define wxCLOSE 0x00000040 + +#define wxOK_DEFAULT 0x00000000 /* has no effect (default) */ +#define wxYES_DEFAULT 0x00000000 /* has no effect (default) */ +#define wxNO_DEFAULT 0x00000080 /* only valid with wxYES_NO */ +#define wxCANCEL_DEFAULT 0x80000000 /* only valid with wxCANCEL */ + +#define wxICON_EXCLAMATION 0x00000100 +#define wxICON_HAND 0x00000200 +#define wxICON_WARNING wxICON_EXCLAMATION +#define wxICON_ERROR wxICON_HAND +#define wxICON_QUESTION 0x00000400 +#define wxICON_INFORMATION 0x00000800 +#define wxICON_STOP wxICON_HAND +#define wxICON_ASTERISK wxICON_INFORMATION + +#define wxHELP 0x00001000 +#define wxFORWARD 0x00002000 +#define wxBACKWARD 0x00004000 +#define wxRESET 0x00008000 +#define wxMORE 0x00010000 +#define wxSETUP 0x00020000 +#define wxICON_NONE 0x00040000 +#define wxICON_AUTH_NEEDED 0x00080000 + +#define wxICON_MASK \ + (wxICON_EXCLAMATION|wxICON_HAND|wxICON_QUESTION|wxICON_INFORMATION|wxICON_NONE|wxICON_AUTH_NEEDED) + +/* + * Background styles. See wxWindow::SetBackgroundStyle + */ +enum wxBackgroundStyle +{ + /* + background is erased in the EVT_ERASE_BACKGROUND handler or using + the system default background if no such handler is defined (this + is the default style) + */ + wxBG_STYLE_ERASE, + + /* + background is erased by the system, no EVT_ERASE_BACKGROUND event + is generated at all + */ + wxBG_STYLE_SYSTEM, + + /* + background is erased in EVT_PAINT handler and not erased at all + before it, this should be used if the paint handler paints over + the entire window to avoid flicker + */ + wxBG_STYLE_PAINT, + + + /* this is a Mac-only style, don't use in portable code */ + wxBG_STYLE_TRANSPARENT, + + /* this style is deprecated and doesn't do anything, don't use */ + wxBG_STYLE_COLOUR, + + /* + this style is deprecated and is synonymous with + wxBG_STYLE_PAINT, use the new name + */ + wxBG_STYLE_CUSTOM = wxBG_STYLE_PAINT +}; + +/* + * Key types used by (old style) lists and hashes. + */ +enum wxKeyType +{ + wxKEY_NONE, + wxKEY_INTEGER, + wxKEY_STRING +}; + +/* ---------------------------------------------------------------------------- */ +/* standard IDs */ +/* ---------------------------------------------------------------------------- */ + +/* Standard menu IDs */ +enum wxStandardID +{ + /* + These ids delimit the range used by automatically-generated ids + (i.e. those used when wxID_ANY is specified during construction). + */ +#if defined(__WXMSW__) || wxUSE_AUTOID_MANAGEMENT + /* + On MSW the range is always restricted no matter if id management + is used or not because the native window ids are limited to short + range. On other platforms the range is only restricted if id + management is used so the reference count buffer won't be so big. + */ + wxID_AUTO_LOWEST = -32000, + wxID_AUTO_HIGHEST = -2000, +#else + wxID_AUTO_LOWEST = -1000000, + wxID_AUTO_HIGHEST = -2000, +#endif + + /* no id matches this one when compared to it */ + wxID_NONE = -3, + + /* id for a separator line in the menu (invalid for normal item) */ + wxID_SEPARATOR = -2, + + /* any id: means that we don't care about the id, whether when installing + * an event handler or when creating a new window */ + wxID_ANY = -1, + + + /* all predefined ids are between wxID_LOWEST and wxID_HIGHEST */ + wxID_LOWEST = 4999, + + wxID_OPEN, + wxID_CLOSE, + wxID_NEW, + wxID_SAVE, + wxID_SAVEAS, + wxID_REVERT, + wxID_EXIT, + wxID_UNDO, + wxID_REDO, + wxID_HELP, + wxID_PRINT, + wxID_PRINT_SETUP, + wxID_PAGE_SETUP, + wxID_PREVIEW, + wxID_ABOUT, + wxID_HELP_CONTENTS, + wxID_HELP_INDEX, + wxID_HELP_SEARCH, + wxID_HELP_COMMANDS, + wxID_HELP_PROCEDURES, + wxID_HELP_CONTEXT, + wxID_CLOSE_ALL, + wxID_PREFERENCES, + + wxID_EDIT = 5030, + wxID_CUT, + wxID_COPY, + wxID_PASTE, + wxID_CLEAR, + wxID_FIND, + wxID_DUPLICATE, + wxID_SELECTALL, + wxID_DELETE, + wxID_REPLACE, + wxID_REPLACE_ALL, + wxID_PROPERTIES, + + wxID_VIEW_DETAILS, + wxID_VIEW_LARGEICONS, + wxID_VIEW_SMALLICONS, + wxID_VIEW_LIST, + wxID_VIEW_SORTDATE, + wxID_VIEW_SORTNAME, + wxID_VIEW_SORTSIZE, + wxID_VIEW_SORTTYPE, + + wxID_FILE = 5050, + wxID_FILE1, + wxID_FILE2, + wxID_FILE3, + wxID_FILE4, + wxID_FILE5, + wxID_FILE6, + wxID_FILE7, + wxID_FILE8, + wxID_FILE9, + + /* Standard button and menu IDs */ + wxID_OK = 5100, + wxID_CANCEL, + wxID_APPLY, + wxID_YES, + wxID_NO, + wxID_STATIC, + wxID_FORWARD, + wxID_BACKWARD, + wxID_DEFAULT, + wxID_MORE, + wxID_SETUP, + wxID_RESET, + wxID_CONTEXT_HELP, + wxID_YESTOALL, + wxID_NOTOALL, + wxID_ABORT, + wxID_RETRY, + wxID_IGNORE, + wxID_ADD, + wxID_REMOVE, + + wxID_UP, + wxID_DOWN, + wxID_HOME, + wxID_REFRESH, + wxID_STOP, + wxID_INDEX, + + wxID_BOLD, + wxID_ITALIC, + wxID_JUSTIFY_CENTER, + wxID_JUSTIFY_FILL, + wxID_JUSTIFY_RIGHT, + wxID_JUSTIFY_LEFT, + wxID_UNDERLINE, + wxID_INDENT, + wxID_UNINDENT, + wxID_ZOOM_100, + wxID_ZOOM_FIT, + wxID_ZOOM_IN, + wxID_ZOOM_OUT, + wxID_UNDELETE, + wxID_REVERT_TO_SAVED, + wxID_CDROM, + wxID_CONVERT, + wxID_EXECUTE, + wxID_FLOPPY, + wxID_HARDDISK, + wxID_BOTTOM, + wxID_FIRST, + wxID_LAST, + wxID_TOP, + wxID_INFO, + wxID_JUMP_TO, + wxID_NETWORK, + wxID_SELECT_COLOR, + wxID_SELECT_FONT, + wxID_SORT_ASCENDING, + wxID_SORT_DESCENDING, + wxID_SPELL_CHECK, + wxID_STRIKETHROUGH, + + /* System menu IDs (used by wxUniv): */ + wxID_SYSTEM_MENU = 5200, + wxID_CLOSE_FRAME, + wxID_MOVE_FRAME, + wxID_RESIZE_FRAME, + wxID_MAXIMIZE_FRAME, + wxID_ICONIZE_FRAME, + wxID_RESTORE_FRAME, + + /* MDI window menu ids */ + wxID_MDI_WINDOW_FIRST = 5230, + wxID_MDI_WINDOW_CASCADE = wxID_MDI_WINDOW_FIRST, + wxID_MDI_WINDOW_TILE_HORZ, + wxID_MDI_WINDOW_TILE_VERT, + wxID_MDI_WINDOW_ARRANGE_ICONS, + wxID_MDI_WINDOW_PREV, + wxID_MDI_WINDOW_NEXT, + wxID_MDI_WINDOW_LAST = wxID_MDI_WINDOW_NEXT, + + /* OS X system menu ids */ + wxID_OSX_MENU_FIRST = 5250, + wxID_OSX_HIDE = wxID_OSX_MENU_FIRST, + wxID_OSX_HIDEOTHERS, + wxID_OSX_SHOWALL, + wxID_OSX_MENU_LAST = wxID_OSX_SHOWALL, + + /* IDs used by generic file dialog (13 consecutive starting from this value) */ + wxID_FILEDLGG = 5900, + + /* IDs used by generic file ctrl (4 consecutive starting from this value) */ + wxID_FILECTRL = 5950, + + wxID_HIGHEST = 5999 +}; + +/* ---------------------------------------------------------------------------- */ +/* wxWindowID type (after wxID_XYZ enum, platform detection, and dlimpexp.h) */ +/* ---------------------------------------------------------------------------- */ + +/* special care should be taken with this type under Windows where the real */ +/* window id is unsigned, so we must always do the cast before comparing them */ +/* (or else they would be always different!). Using wxGetWindowId() which does */ +/* the cast itself is recommended. Note that this type can't be unsigned */ +/* because wxID_ANY == -1 is a valid (and largely used) value for window id. */ +#if defined(__cplusplus) && wxUSE_GUI + #include "wx/windowid.h" +#endif + +/* ---------------------------------------------------------------------------- */ +/* other constants */ +/* ---------------------------------------------------------------------------- */ + +/* menu and toolbar item kinds */ +enum wxItemKind +{ + wxITEM_SEPARATOR = -1, + wxITEM_NORMAL, + wxITEM_CHECK, + wxITEM_RADIO, + wxITEM_DROPDOWN, + wxITEM_MAX +}; + +/* + * The possible states of a 3-state checkbox (Compatible + * with the 2-state checkbox). + */ +enum wxCheckBoxState +{ + wxCHK_UNCHECKED, + wxCHK_CHECKED, + wxCHK_UNDETERMINED /* 3-state checkbox only */ +}; + + +/* hit test results */ +enum wxHitTest +{ + wxHT_NOWHERE, + + /* scrollbar */ + wxHT_SCROLLBAR_FIRST = wxHT_NOWHERE, + wxHT_SCROLLBAR_ARROW_LINE_1, /* left or upper arrow to scroll by line */ + wxHT_SCROLLBAR_ARROW_LINE_2, /* right or down */ + wxHT_SCROLLBAR_ARROW_PAGE_1, /* left or upper arrow to scroll by page */ + wxHT_SCROLLBAR_ARROW_PAGE_2, /* right or down */ + wxHT_SCROLLBAR_THUMB, /* on the thumb */ + wxHT_SCROLLBAR_BAR_1, /* bar to the left/above the thumb */ + wxHT_SCROLLBAR_BAR_2, /* bar to the right/below the thumb */ + wxHT_SCROLLBAR_LAST, + + /* window */ + wxHT_WINDOW_OUTSIDE, /* not in this window at all */ + wxHT_WINDOW_INSIDE, /* in the client area */ + wxHT_WINDOW_VERT_SCROLLBAR, /* on the vertical scrollbar */ + wxHT_WINDOW_HORZ_SCROLLBAR, /* on the horizontal scrollbar */ + wxHT_WINDOW_CORNER, /* on the corner between 2 scrollbars */ + + wxHT_MAX +}; + +/* ---------------------------------------------------------------------------- */ +/* Possible SetSize flags */ +/* ---------------------------------------------------------------------------- */ + +/* Use internally-calculated width if -1 */ +#define wxSIZE_AUTO_WIDTH 0x0001 +/* Use internally-calculated height if -1 */ +#define wxSIZE_AUTO_HEIGHT 0x0002 +/* Use internally-calculated width and height if each is -1 */ +#define wxSIZE_AUTO (wxSIZE_AUTO_WIDTH|wxSIZE_AUTO_HEIGHT) +/* Ignore missing (-1) dimensions (use existing). */ +/* For readability only: test for wxSIZE_AUTO_WIDTH/HEIGHT in code. */ +#define wxSIZE_USE_EXISTING 0x0000 +/* Allow -1 as a valid position */ +#define wxSIZE_ALLOW_MINUS_ONE 0x0004 +/* Don't do parent client adjustments (for implementation only) */ +#define wxSIZE_NO_ADJUSTMENTS 0x0008 +/* Change the window position even if it seems to be already correct */ +#define wxSIZE_FORCE 0x0010 +/* Emit size event even if size didn't change */ +#define wxSIZE_FORCE_EVENT 0x0020 + +/* ---------------------------------------------------------------------------- */ +/* GDI descriptions */ +/* ---------------------------------------------------------------------------- */ + +// Hatch styles used by both pen and brush styles. +// +// NB: Do not use these constants directly, they're for internal use only, use +// wxBRUSHSTYLE_XXX_HATCH and wxPENSTYLE_XXX_HATCH instead. +enum wxHatchStyle +{ + wxHATCHSTYLE_INVALID = -1, + + /* + The value of the first style is chosen to fit with + wxDeprecatedGUIConstants values below, don't change it. + */ + wxHATCHSTYLE_FIRST = 111, + wxHATCHSTYLE_BDIAGONAL = wxHATCHSTYLE_FIRST, + wxHATCHSTYLE_CROSSDIAG, + wxHATCHSTYLE_FDIAGONAL, + wxHATCHSTYLE_CROSS, + wxHATCHSTYLE_HORIZONTAL, + wxHATCHSTYLE_VERTICAL, + wxHATCHSTYLE_LAST = wxHATCHSTYLE_VERTICAL +}; + +/* + WARNING: the following styles are deprecated; use the + wxFontFamily, wxFontStyle, wxFontWeight, wxBrushStyle, + wxPenStyle, wxPenCap, wxPenJoin enum values instead! +*/ + +#if FUTURE_WXWIN_COMPATIBILITY_3_0 + +/* don't use any elements of this enum in the new code */ +enum wxDeprecatedGUIConstants +{ + /* Text font families */ + wxDEFAULT = 70, + wxDECORATIVE, + wxROMAN, + wxSCRIPT, + wxSWISS, + wxMODERN, + wxTELETYPE, /* @@@@ */ + + /* Proportional or Fixed width fonts (not yet used) */ + wxVARIABLE = 80, + wxFIXED, + + wxNORMAL = 90, + wxLIGHT, + wxBOLD, + /* Also wxNORMAL for normal (non-italic text) */ + wxITALIC, + wxSLANT, + + /* Pen styles */ + wxSOLID = 100, + wxDOT, + wxLONG_DASH, + wxSHORT_DASH, + wxDOT_DASH, + wxUSER_DASH, + + wxTRANSPARENT, + + /* Brush & Pen Stippling. Note that a stippled pen cannot be dashed!! */ + /* Note also that stippling a Pen IS meaningful, because a Line is */ + wxSTIPPLE_MASK_OPAQUE, /* mask is used for blitting monochrome using text fore and back ground colors */ + wxSTIPPLE_MASK, /* mask is used for masking areas in the stipple bitmap (TO DO) */ + /* drawn with a Pen, and without any Brush -- and it can be stippled. */ + wxSTIPPLE = 110, + + wxBDIAGONAL_HATCH = wxHATCHSTYLE_BDIAGONAL, + wxCROSSDIAG_HATCH = wxHATCHSTYLE_CROSSDIAG, + wxFDIAGONAL_HATCH = wxHATCHSTYLE_FDIAGONAL, + wxCROSS_HATCH = wxHATCHSTYLE_CROSS, + wxHORIZONTAL_HATCH = wxHATCHSTYLE_HORIZONTAL, + wxVERTICAL_HATCH = wxHATCHSTYLE_VERTICAL, + wxFIRST_HATCH = wxHATCHSTYLE_FIRST, + wxLAST_HATCH = wxHATCHSTYLE_LAST +}; +#endif + +/* ToolPanel in wxFrame (VZ: unused?) */ +enum +{ + wxTOOL_TOP = 1, + wxTOOL_BOTTOM, + wxTOOL_LEFT, + wxTOOL_RIGHT +}; + +/* the values of the format constants should be the same as corresponding */ +/* CF_XXX constants in Windows API */ +enum wxDataFormatId +{ + wxDF_INVALID = 0, + wxDF_TEXT = 1, /* CF_TEXT */ + wxDF_BITMAP = 2, /* CF_BITMAP */ + wxDF_METAFILE = 3, /* CF_METAFILEPICT */ + wxDF_SYLK = 4, + wxDF_DIF = 5, + wxDF_TIFF = 6, + wxDF_OEMTEXT = 7, /* CF_OEMTEXT */ + wxDF_DIB = 8, /* CF_DIB */ + wxDF_PALETTE = 9, + wxDF_PENDATA = 10, + wxDF_RIFF = 11, + wxDF_WAVE = 12, + wxDF_UNICODETEXT = 13, + wxDF_ENHMETAFILE = 14, + wxDF_FILENAME = 15, /* CF_HDROP */ + wxDF_LOCALE = 16, + wxDF_PRIVATE = 20, + wxDF_HTML = 30, /* Note: does not correspond to CF_ constant */ + wxDF_MAX +}; + +/* Key codes */ +enum wxKeyCode +{ + WXK_NONE = 0, + + WXK_CONTROL_A = 1, + WXK_CONTROL_B, + WXK_CONTROL_C, + WXK_CONTROL_D, + WXK_CONTROL_E, + WXK_CONTROL_F, + WXK_CONTROL_G, + WXK_CONTROL_H, + WXK_CONTROL_I, + WXK_CONTROL_J, + WXK_CONTROL_K, + WXK_CONTROL_L, + WXK_CONTROL_M, + WXK_CONTROL_N, + WXK_CONTROL_O, + WXK_CONTROL_P, + WXK_CONTROL_Q, + WXK_CONTROL_R, + WXK_CONTROL_S, + WXK_CONTROL_T, + WXK_CONTROL_U, + WXK_CONTROL_V, + WXK_CONTROL_W, + WXK_CONTROL_X, + WXK_CONTROL_Y, + WXK_CONTROL_Z, + + WXK_BACK = 8, /* backspace */ + WXK_TAB = 9, + WXK_RETURN = 13, + WXK_ESCAPE = 27, + + /* values from 33 to 126 are reserved for the standard ASCII characters */ + + WXK_SPACE = 32, + WXK_DELETE = 127, + + /* values from 128 to 255 are reserved for ASCII extended characters + (note that there isn't a single fixed standard for the meaning + of these values; avoid them in portable apps!) */ + + /* These are not compatible with unicode characters. + If you want to get a unicode character from a key event, use + wxKeyEvent::GetUnicodeKey */ + WXK_START = 300, + WXK_LBUTTON, + WXK_RBUTTON, + WXK_CANCEL, + WXK_MBUTTON, + WXK_CLEAR, + WXK_SHIFT, + WXK_ALT, + WXK_CONTROL, + WXK_MENU, + WXK_PAUSE, + WXK_CAPITAL, + WXK_END, + WXK_HOME, + WXK_LEFT, + WXK_UP, + WXK_RIGHT, + WXK_DOWN, + WXK_SELECT, + WXK_PRINT, + WXK_EXECUTE, + WXK_SNAPSHOT, + WXK_INSERT, + WXK_HELP, + WXK_NUMPAD0, + WXK_NUMPAD1, + WXK_NUMPAD2, + WXK_NUMPAD3, + WXK_NUMPAD4, + WXK_NUMPAD5, + WXK_NUMPAD6, + WXK_NUMPAD7, + WXK_NUMPAD8, + WXK_NUMPAD9, + WXK_MULTIPLY, + WXK_ADD, + WXK_SEPARATOR, + WXK_SUBTRACT, + WXK_DECIMAL, + WXK_DIVIDE, + WXK_F1, + WXK_F2, + WXK_F3, + WXK_F4, + WXK_F5, + WXK_F6, + WXK_F7, + WXK_F8, + WXK_F9, + WXK_F10, + WXK_F11, + WXK_F12, + WXK_F13, + WXK_F14, + WXK_F15, + WXK_F16, + WXK_F17, + WXK_F18, + WXK_F19, + WXK_F20, + WXK_F21, + WXK_F22, + WXK_F23, + WXK_F24, + WXK_NUMLOCK, + WXK_SCROLL, + WXK_PAGEUP, + WXK_PAGEDOWN, +#if WXWIN_COMPATIBILITY_2_6 + WXK_PRIOR = WXK_PAGEUP, + WXK_NEXT = WXK_PAGEDOWN, +#endif + + WXK_NUMPAD_SPACE, + WXK_NUMPAD_TAB, + WXK_NUMPAD_ENTER, + WXK_NUMPAD_F1, + WXK_NUMPAD_F2, + WXK_NUMPAD_F3, + WXK_NUMPAD_F4, + WXK_NUMPAD_HOME, + WXK_NUMPAD_LEFT, + WXK_NUMPAD_UP, + WXK_NUMPAD_RIGHT, + WXK_NUMPAD_DOWN, + WXK_NUMPAD_PAGEUP, + WXK_NUMPAD_PAGEDOWN, +#if WXWIN_COMPATIBILITY_2_6 + WXK_NUMPAD_PRIOR = WXK_NUMPAD_PAGEUP, + WXK_NUMPAD_NEXT = WXK_NUMPAD_PAGEDOWN, +#endif + WXK_NUMPAD_END, + WXK_NUMPAD_BEGIN, + WXK_NUMPAD_INSERT, + WXK_NUMPAD_DELETE, + WXK_NUMPAD_EQUAL, + WXK_NUMPAD_MULTIPLY, + WXK_NUMPAD_ADD, + WXK_NUMPAD_SEPARATOR, + WXK_NUMPAD_SUBTRACT, + WXK_NUMPAD_DECIMAL, + WXK_NUMPAD_DIVIDE, + + WXK_WINDOWS_LEFT, + WXK_WINDOWS_RIGHT, + WXK_WINDOWS_MENU , +#ifdef __WXOSX__ + WXK_RAW_CONTROL, +#else + WXK_RAW_CONTROL = WXK_CONTROL, +#endif + WXK_COMMAND = WXK_CONTROL, + + /* Hardware-specific buttons */ + WXK_SPECIAL1 = 193, + WXK_SPECIAL2, + WXK_SPECIAL3, + WXK_SPECIAL4, + WXK_SPECIAL5, + WXK_SPECIAL6, + WXK_SPECIAL7, + WXK_SPECIAL8, + WXK_SPECIAL9, + WXK_SPECIAL10, + WXK_SPECIAL11, + WXK_SPECIAL12, + WXK_SPECIAL13, + WXK_SPECIAL14, + WXK_SPECIAL15, + WXK_SPECIAL16, + WXK_SPECIAL17, + WXK_SPECIAL18, + WXK_SPECIAL19, + WXK_SPECIAL20 +}; + +/* This enum contains bit mask constants used in wxKeyEvent */ +enum wxKeyModifier +{ + wxMOD_NONE = 0x0000, + wxMOD_ALT = 0x0001, + wxMOD_CONTROL = 0x0002, + wxMOD_ALTGR = wxMOD_ALT | wxMOD_CONTROL, + wxMOD_SHIFT = 0x0004, + wxMOD_META = 0x0008, + wxMOD_WIN = wxMOD_META, +#if defined(__WXMAC__) || defined(__WXCOCOA__) + wxMOD_RAW_CONTROL = 0x0010, +#else + wxMOD_RAW_CONTROL = wxMOD_CONTROL, +#endif + wxMOD_CMD = wxMOD_CONTROL, + wxMOD_ALL = 0xffff +}; + +/* Shortcut for easier dialog-unit-to-pixel conversion */ +#define wxDLG_UNIT(parent, pt) parent->ConvertDialogToPixels(pt) + +/* Paper types */ +typedef enum +{ + wxPAPER_NONE, /* Use specific dimensions */ + wxPAPER_LETTER, /* Letter, 8 1/2 by 11 inches */ + wxPAPER_LEGAL, /* Legal, 8 1/2 by 14 inches */ + wxPAPER_A4, /* A4 Sheet, 210 by 297 millimeters */ + wxPAPER_CSHEET, /* C Sheet, 17 by 22 inches */ + wxPAPER_DSHEET, /* D Sheet, 22 by 34 inches */ + wxPAPER_ESHEET, /* E Sheet, 34 by 44 inches */ + wxPAPER_LETTERSMALL, /* Letter Small, 8 1/2 by 11 inches */ + wxPAPER_TABLOID, /* Tabloid, 11 by 17 inches */ + wxPAPER_LEDGER, /* Ledger, 17 by 11 inches */ + wxPAPER_STATEMENT, /* Statement, 5 1/2 by 8 1/2 inches */ + wxPAPER_EXECUTIVE, /* Executive, 7 1/4 by 10 1/2 inches */ + wxPAPER_A3, /* A3 sheet, 297 by 420 millimeters */ + wxPAPER_A4SMALL, /* A4 small sheet, 210 by 297 millimeters */ + wxPAPER_A5, /* A5 sheet, 148 by 210 millimeters */ + wxPAPER_B4, /* B4 sheet, 250 by 354 millimeters */ + wxPAPER_B5, /* B5 sheet, 182-by-257-millimeter paper */ + wxPAPER_FOLIO, /* Folio, 8-1/2-by-13-inch paper */ + wxPAPER_QUARTO, /* Quarto, 215-by-275-millimeter paper */ + wxPAPER_10X14, /* 10-by-14-inch sheet */ + wxPAPER_11X17, /* 11-by-17-inch sheet */ + wxPAPER_NOTE, /* Note, 8 1/2 by 11 inches */ + wxPAPER_ENV_9, /* #9 Envelope, 3 7/8 by 8 7/8 inches */ + wxPAPER_ENV_10, /* #10 Envelope, 4 1/8 by 9 1/2 inches */ + wxPAPER_ENV_11, /* #11 Envelope, 4 1/2 by 10 3/8 inches */ + wxPAPER_ENV_12, /* #12 Envelope, 4 3/4 by 11 inches */ + wxPAPER_ENV_14, /* #14 Envelope, 5 by 11 1/2 inches */ + wxPAPER_ENV_DL, /* DL Envelope, 110 by 220 millimeters */ + wxPAPER_ENV_C5, /* C5 Envelope, 162 by 229 millimeters */ + wxPAPER_ENV_C3, /* C3 Envelope, 324 by 458 millimeters */ + wxPAPER_ENV_C4, /* C4 Envelope, 229 by 324 millimeters */ + wxPAPER_ENV_C6, /* C6 Envelope, 114 by 162 millimeters */ + wxPAPER_ENV_C65, /* C65 Envelope, 114 by 229 millimeters */ + wxPAPER_ENV_B4, /* B4 Envelope, 250 by 353 millimeters */ + wxPAPER_ENV_B5, /* B5 Envelope, 176 by 250 millimeters */ + wxPAPER_ENV_B6, /* B6 Envelope, 176 by 125 millimeters */ + wxPAPER_ENV_ITALY, /* Italy Envelope, 110 by 230 millimeters */ + wxPAPER_ENV_MONARCH, /* Monarch Envelope, 3 7/8 by 7 1/2 inches */ + wxPAPER_ENV_PERSONAL, /* 6 3/4 Envelope, 3 5/8 by 6 1/2 inches */ + wxPAPER_FANFOLD_US, /* US Std Fanfold, 14 7/8 by 11 inches */ + wxPAPER_FANFOLD_STD_GERMAN, /* German Std Fanfold, 8 1/2 by 12 inches */ + wxPAPER_FANFOLD_LGL_GERMAN, /* German Legal Fanfold, 8 1/2 by 13 inches */ + + wxPAPER_ISO_B4, /* B4 (ISO) 250 x 353 mm */ + wxPAPER_JAPANESE_POSTCARD, /* Japanese Postcard 100 x 148 mm */ + wxPAPER_9X11, /* 9 x 11 in */ + wxPAPER_10X11, /* 10 x 11 in */ + wxPAPER_15X11, /* 15 x 11 in */ + wxPAPER_ENV_INVITE, /* Envelope Invite 220 x 220 mm */ + wxPAPER_LETTER_EXTRA, /* Letter Extra 9 \275 x 12 in */ + wxPAPER_LEGAL_EXTRA, /* Legal Extra 9 \275 x 15 in */ + wxPAPER_TABLOID_EXTRA, /* Tabloid Extra 11.69 x 18 in */ + wxPAPER_A4_EXTRA, /* A4 Extra 9.27 x 12.69 in */ + wxPAPER_LETTER_TRANSVERSE, /* Letter Transverse 8 \275 x 11 in */ + wxPAPER_A4_TRANSVERSE, /* A4 Transverse 210 x 297 mm */ + wxPAPER_LETTER_EXTRA_TRANSVERSE, /* Letter Extra Transverse 9\275 x 12 in */ + wxPAPER_A_PLUS, /* SuperA/SuperA/A4 227 x 356 mm */ + wxPAPER_B_PLUS, /* SuperB/SuperB/A3 305 x 487 mm */ + wxPAPER_LETTER_PLUS, /* Letter Plus 8.5 x 12.69 in */ + wxPAPER_A4_PLUS, /* A4 Plus 210 x 330 mm */ + wxPAPER_A5_TRANSVERSE, /* A5 Transverse 148 x 210 mm */ + wxPAPER_B5_TRANSVERSE, /* B5 (JIS) Transverse 182 x 257 mm */ + wxPAPER_A3_EXTRA, /* A3 Extra 322 x 445 mm */ + wxPAPER_A5_EXTRA, /* A5 Extra 174 x 235 mm */ + wxPAPER_B5_EXTRA, /* B5 (ISO) Extra 201 x 276 mm */ + wxPAPER_A2, /* A2 420 x 594 mm */ + wxPAPER_A3_TRANSVERSE, /* A3 Transverse 297 x 420 mm */ + wxPAPER_A3_EXTRA_TRANSVERSE, /* A3 Extra Transverse 322 x 445 mm */ + + wxPAPER_DBL_JAPANESE_POSTCARD,/* Japanese Double Postcard 200 x 148 mm */ + wxPAPER_A6, /* A6 105 x 148 mm */ + wxPAPER_JENV_KAKU2, /* Japanese Envelope Kaku #2 */ + wxPAPER_JENV_KAKU3, /* Japanese Envelope Kaku #3 */ + wxPAPER_JENV_CHOU3, /* Japanese Envelope Chou #3 */ + wxPAPER_JENV_CHOU4, /* Japanese Envelope Chou #4 */ + wxPAPER_LETTER_ROTATED, /* Letter Rotated 11 x 8 1/2 in */ + wxPAPER_A3_ROTATED, /* A3 Rotated 420 x 297 mm */ + wxPAPER_A4_ROTATED, /* A4 Rotated 297 x 210 mm */ + wxPAPER_A5_ROTATED, /* A5 Rotated 210 x 148 mm */ + wxPAPER_B4_JIS_ROTATED, /* B4 (JIS) Rotated 364 x 257 mm */ + wxPAPER_B5_JIS_ROTATED, /* B5 (JIS) Rotated 257 x 182 mm */ + wxPAPER_JAPANESE_POSTCARD_ROTATED,/* Japanese Postcard Rotated 148 x 100 mm */ + wxPAPER_DBL_JAPANESE_POSTCARD_ROTATED,/* Double Japanese Postcard Rotated 148 x 200 mm */ + wxPAPER_A6_ROTATED, /* A6 Rotated 148 x 105 mm */ + wxPAPER_JENV_KAKU2_ROTATED, /* Japanese Envelope Kaku #2 Rotated */ + wxPAPER_JENV_KAKU3_ROTATED, /* Japanese Envelope Kaku #3 Rotated */ + wxPAPER_JENV_CHOU3_ROTATED, /* Japanese Envelope Chou #3 Rotated */ + wxPAPER_JENV_CHOU4_ROTATED, /* Japanese Envelope Chou #4 Rotated */ + wxPAPER_B6_JIS, /* B6 (JIS) 128 x 182 mm */ + wxPAPER_B6_JIS_ROTATED, /* B6 (JIS) Rotated 182 x 128 mm */ + wxPAPER_12X11, /* 12 x 11 in */ + wxPAPER_JENV_YOU4, /* Japanese Envelope You #4 */ + wxPAPER_JENV_YOU4_ROTATED, /* Japanese Envelope You #4 Rotated */ + wxPAPER_P16K, /* PRC 16K 146 x 215 mm */ + wxPAPER_P32K, /* PRC 32K 97 x 151 mm */ + wxPAPER_P32KBIG, /* PRC 32K(Big) 97 x 151 mm */ + wxPAPER_PENV_1, /* PRC Envelope #1 102 x 165 mm */ + wxPAPER_PENV_2, /* PRC Envelope #2 102 x 176 mm */ + wxPAPER_PENV_3, /* PRC Envelope #3 125 x 176 mm */ + wxPAPER_PENV_4, /* PRC Envelope #4 110 x 208 mm */ + wxPAPER_PENV_5, /* PRC Envelope #5 110 x 220 mm */ + wxPAPER_PENV_6, /* PRC Envelope #6 120 x 230 mm */ + wxPAPER_PENV_7, /* PRC Envelope #7 160 x 230 mm */ + wxPAPER_PENV_8, /* PRC Envelope #8 120 x 309 mm */ + wxPAPER_PENV_9, /* PRC Envelope #9 229 x 324 mm */ + wxPAPER_PENV_10, /* PRC Envelope #10 324 x 458 mm */ + wxPAPER_P16K_ROTATED, /* PRC 16K Rotated */ + wxPAPER_P32K_ROTATED, /* PRC 32K Rotated */ + wxPAPER_P32KBIG_ROTATED, /* PRC 32K(Big) Rotated */ + wxPAPER_PENV_1_ROTATED, /* PRC Envelope #1 Rotated 165 x 102 mm */ + wxPAPER_PENV_2_ROTATED, /* PRC Envelope #2 Rotated 176 x 102 mm */ + wxPAPER_PENV_3_ROTATED, /* PRC Envelope #3 Rotated 176 x 125 mm */ + wxPAPER_PENV_4_ROTATED, /* PRC Envelope #4 Rotated 208 x 110 mm */ + wxPAPER_PENV_5_ROTATED, /* PRC Envelope #5 Rotated 220 x 110 mm */ + wxPAPER_PENV_6_ROTATED, /* PRC Envelope #6 Rotated 230 x 120 mm */ + wxPAPER_PENV_7_ROTATED, /* PRC Envelope #7 Rotated 230 x 160 mm */ + wxPAPER_PENV_8_ROTATED, /* PRC Envelope #8 Rotated 309 x 120 mm */ + wxPAPER_PENV_9_ROTATED, /* PRC Envelope #9 Rotated 324 x 229 mm */ + wxPAPER_PENV_10_ROTATED, /* PRC Envelope #10 Rotated 458 x 324 m */ + wxPAPER_A0, /* A0 Sheet 841 x 1189 mm */ + wxPAPER_A1 /* A1 Sheet 594 x 841 mm */ +} wxPaperSize; + +/* Printing orientation */ +enum wxPrintOrientation +{ + wxPORTRAIT = 1, + wxLANDSCAPE +}; + +/* Duplex printing modes + */ + +enum wxDuplexMode +{ + wxDUPLEX_SIMPLEX, /* Non-duplex */ + wxDUPLEX_HORIZONTAL, + wxDUPLEX_VERTICAL +}; + +/* Print quality. + */ + +#define wxPRINT_QUALITY_HIGH -1 +#define wxPRINT_QUALITY_MEDIUM -2 +#define wxPRINT_QUALITY_LOW -3 +#define wxPRINT_QUALITY_DRAFT -4 + +typedef int wxPrintQuality; + +/* Print mode (currently PostScript only) + */ + +enum wxPrintMode +{ + wxPRINT_MODE_NONE = 0, + wxPRINT_MODE_PREVIEW = 1, /* Preview in external application */ + wxPRINT_MODE_FILE = 2, /* Print to file */ + wxPRINT_MODE_PRINTER = 3, /* Send to printer */ + wxPRINT_MODE_STREAM = 4 /* Send postscript data into a stream */ +}; + +/* ---------------------------------------------------------------------------- */ +/* UpdateWindowUI flags */ +/* ---------------------------------------------------------------------------- */ + +enum wxUpdateUI +{ + wxUPDATE_UI_NONE = 0x0000, + wxUPDATE_UI_RECURSE = 0x0001, + wxUPDATE_UI_FROMIDLE = 0x0002 /* Invoked from On(Internal)Idle */ +}; + + +/* ---------------------------------------------------------------------------- */ +/* wxList types */ +/* ---------------------------------------------------------------------------- */ + +/* type of compare function for list sort operation (as in 'qsort'): it should + return a negative value, 0 or positive value if the first element is less + than, equal or greater than the second */ + +typedef int (* LINKAGEMODE wxSortCompareFunction)(const void *elem1, const void *elem2); + +/* wxList iterator function */ +typedef int (* LINKAGEMODE wxListIterateFunction)(void *current); + + +/* ---------------------------------------------------------------------------- */ +/* miscellaneous */ +/* ---------------------------------------------------------------------------- */ + +/* define this macro if font handling is done using the X font names */ +#if (defined(__WXGTK__) && !defined(__WXGTK20__)) || defined(__X__) + #define _WX_X_FONTLIKE +#endif + +/* macro to specify "All Files" on different platforms */ +#if defined(__WXMSW__) || defined(__WXPM__) +# define wxALL_FILES_PATTERN wxT("*.*") +# define wxALL_FILES gettext_noop("All files (*.*)|*.*") +#else +# define wxALL_FILES_PATTERN wxT("*") +# define wxALL_FILES gettext_noop("All files (*)|*") +#endif + +#if defined(__CYGWIN__) && defined(__WXMSW__) +# if wxUSE_STD_CONTAINERS || defined(wxUSE_STD_STRING) + /* + NASTY HACK because the gethostname in sys/unistd.h which the gnu + stl includes and wx builds with by default clash with each other + (windows version 2nd param is int, sys/unistd.h version is unsigned + int). + */ +# define gethostname gethostnameHACK +# include +# undef gethostname +# endif +#endif + +/* --------------------------------------------------------------------------- */ +/* macros that enable wxWidgets apps to be compiled in absence of the */ +/* system headers, although some platform specific types are used in the */ +/* platform specific (implementation) parts of the headers */ +/* --------------------------------------------------------------------------- */ + +#ifdef __DARWIN__ +#define DECLARE_WXOSX_OPAQUE_CFREF( name ) typedef struct __##name* name##Ref; +#define DECLARE_WXOSX_OPAQUE_CONST_CFREF( name ) typedef const struct __##name* name##Ref; +#endif + +#ifdef __WXMAC__ + +#define WX_OPAQUE_TYPE( name ) struct wxOpaque##name + +typedef void* WXHBITMAP; +typedef void* WXHCURSOR; +typedef void* WXRECTPTR; +typedef void* WXPOINTPTR; +typedef void* WXHWND; +typedef void* WXEVENTREF; +typedef void* WXEVENTHANDLERREF; +typedef void* WXEVENTHANDLERCALLREF; +typedef void* WXAPPLEEVENTREF; + +typedef unsigned int WXUINT; +typedef unsigned long WXDWORD; +typedef unsigned short WXWORD; + +typedef WX_OPAQUE_TYPE(PicHandle ) * WXHMETAFILE ; +#if wxOSX_USE_CARBON +typedef struct OpaqueControlRef* WXWidget ; +typedef struct OpaqueWindowPtr* WXWindow ; +typedef struct __AGLPixelFormatRec *WXGLPixelFormat; +typedef struct __AGLContextRec *WXGLContext; +#endif + +typedef void* WXDisplay; + +/* + * core frameworks + */ + +typedef const void * CFTypeRef; + +/* typedef const struct __CFString * CFStringRef; */ + +DECLARE_WXOSX_OPAQUE_CONST_CFREF( CFString ) +typedef struct __CFString * CFMutableStringRef; + +DECLARE_WXOSX_OPAQUE_CFREF( CFRunLoopSource ) +DECLARE_WXOSX_OPAQUE_CONST_CFREF( CTFont ) +DECLARE_WXOSX_OPAQUE_CONST_CFREF( CTFontDescriptor ) + +#define DECLARE_WXOSX_OPAQUE_CGREF( name ) typedef struct name* name##Ref; + +DECLARE_WXOSX_OPAQUE_CGREF( CGColor ) +DECLARE_WXOSX_OPAQUE_CGREF( CGImage ) +DECLARE_WXOSX_OPAQUE_CGREF( CGContext ) +DECLARE_WXOSX_OPAQUE_CGREF( CGFont ) + +typedef CGColorRef WXCOLORREF; +typedef CGImageRef WXCGIMAGEREF; +typedef CGContextRef WXHDC; + +/* + * carbon + */ + +typedef const struct __HIShape * HIShapeRef; +typedef struct __HIShape * HIMutableShapeRef; + +#define DECLARE_WXMAC_OPAQUE_REF( name ) typedef struct Opaque##name* name; + +DECLARE_WXMAC_OPAQUE_REF( PasteboardRef ) +DECLARE_WXMAC_OPAQUE_REF( IconRef ) +DECLARE_WXMAC_OPAQUE_REF( MenuRef ) + +typedef IconRef WXHICON ; +typedef HIShapeRef WXHRGN; +#if wxOSX_USE_CARBON +typedef MenuRef WXHMENU; +#endif + +#endif + +#if defined( __WXCOCOA__ ) || defined(__WXMAC__) + +/* Definitions of 32-bit/64-bit types + * These are typedef'd exactly the same way in newer OS X headers so + * redefinition when real headers are included should not be a problem. If + * it is, the types are being defined wrongly here. + * The purpose of these types is so they can be used from public wx headers. + * and also because the older (pre-Leopard) headers don't define them. + */ + +/* NOTE: We don't pollute namespace with CGFLOAT_MIN/MAX/IS_DOUBLE macros + * since they are unlikely to be needed in a public header. + */ +#if defined(__LP64__) && __LP64__ + typedef double CGFloat; +#else + typedef float CGFloat; +#endif + +#if (defined(__LP64__) && __LP64__) || (defined(NS_BUILD_32_LIKE_64) && NS_BUILD_32_LIKE_64) +typedef long NSInteger; +typedef unsigned long NSUInteger; +#else +typedef int NSInteger; +typedef unsigned int NSUInteger; +#endif + +/* Objective-C type declarations. + * These are to be used in public headers in lieu of NSSomething* because + * Objective-C class names are not available in C/C++ code. + */ + +/* NOTE: This ought to work with other compilers too, but I'm being cautious */ +#if (defined(__GNUC__) && defined(__APPLE__)) +/* It's desirable to have type safety for Objective-C(++) code as it does +at least catch typos of method names among other things. However, it +is not possible to declare an Objective-C class from plain old C or C++ +code. Furthermore, because of C++ name mangling, the type name must +be the same for both C++ and Objective-C++ code. Therefore, we define +what should be a pointer to an Objective-C class as a pointer to a plain +old C struct with the same name. Unfortunately, because the compiler +does not see a struct as an Objective-C class we cannot declare it +as a struct in Objective-C(++) mode. +*/ +#if defined(__OBJC__) +#define DECLARE_WXCOCOA_OBJC_CLASS(klass) \ +@class klass; \ +typedef klass *WX_##klass +#else /* not defined(__OBJC__) */ +#define DECLARE_WXCOCOA_OBJC_CLASS(klass) \ +typedef struct klass *WX_##klass +#endif /* defined(__OBJC__) */ + +#else /* not Apple's gcc */ +#warning "Objective-C types will not be checked by the compiler." +/* NOTE: typedef struct objc_object *id; */ +/* IOW, we're declaring these using the id type without using that name, */ +/* since "id" is used extensively not only within wxWidgets itself, but */ +/* also in wxWidgets application code. The following works fine when */ +/* compiling C(++) code, and works without typesafety for Obj-C(++) code */ +#define DECLARE_WXCOCOA_OBJC_CLASS(klass) \ +typedef struct objc_object *WX_##klass + +#endif /* (defined(__GNUC__) && defined(__APPLE__)) */ + +DECLARE_WXCOCOA_OBJC_CLASS(NSApplication); +DECLARE_WXCOCOA_OBJC_CLASS(NSBitmapImageRep); +DECLARE_WXCOCOA_OBJC_CLASS(NSBox); +DECLARE_WXCOCOA_OBJC_CLASS(NSButton); +DECLARE_WXCOCOA_OBJC_CLASS(NSColor); +DECLARE_WXCOCOA_OBJC_CLASS(NSColorPanel); +DECLARE_WXCOCOA_OBJC_CLASS(NSControl); +DECLARE_WXCOCOA_OBJC_CLASS(NSCursor); +DECLARE_WXCOCOA_OBJC_CLASS(NSEvent); +DECLARE_WXCOCOA_OBJC_CLASS(NSFont); +DECLARE_WXCOCOA_OBJC_CLASS(NSFontDescriptor); +DECLARE_WXCOCOA_OBJC_CLASS(NSFontPanel); +DECLARE_WXCOCOA_OBJC_CLASS(NSImage); +DECLARE_WXCOCOA_OBJC_CLASS(NSLayoutManager); +DECLARE_WXCOCOA_OBJC_CLASS(NSMenu); +DECLARE_WXCOCOA_OBJC_CLASS(NSMenuExtra); +DECLARE_WXCOCOA_OBJC_CLASS(NSMenuItem); +DECLARE_WXCOCOA_OBJC_CLASS(NSMutableArray); +DECLARE_WXCOCOA_OBJC_CLASS(NSNotification); +DECLARE_WXCOCOA_OBJC_CLASS(NSObject); +DECLARE_WXCOCOA_OBJC_CLASS(NSPanel); +DECLARE_WXCOCOA_OBJC_CLASS(NSResponder); +DECLARE_WXCOCOA_OBJC_CLASS(NSScrollView); +DECLARE_WXCOCOA_OBJC_CLASS(NSSound); +DECLARE_WXCOCOA_OBJC_CLASS(NSStatusItem); +DECLARE_WXCOCOA_OBJC_CLASS(NSTableColumn); +DECLARE_WXCOCOA_OBJC_CLASS(NSTableView); +DECLARE_WXCOCOA_OBJC_CLASS(NSTextContainer); +DECLARE_WXCOCOA_OBJC_CLASS(NSTextField); +DECLARE_WXCOCOA_OBJC_CLASS(NSTextStorage); +DECLARE_WXCOCOA_OBJC_CLASS(NSThread); +DECLARE_WXCOCOA_OBJC_CLASS(NSWindow); +DECLARE_WXCOCOA_OBJC_CLASS(NSView); +DECLARE_WXCOCOA_OBJC_CLASS(NSOpenGLContext); +DECLARE_WXCOCOA_OBJC_CLASS(NSOpenGLPixelFormat); +DECLARE_WXCOCOA_OBJC_CLASS( NSPrintInfo ); +#ifndef __WXMAC__ +typedef WX_NSView WXWidget; /* wxWidgets BASE definition */ +#endif +#endif /* __WXCOCOA__ || ( __WXMAC__ &__DARWIN__)*/ + +#ifdef __WXMAC__ + +DECLARE_WXCOCOA_OBJC_CLASS(NSString); + +#if wxOSX_USE_COCOA + +typedef WX_NSWindow WXWindow; +typedef WX_NSView WXWidget; +typedef WX_NSMenu WXHMENU; +typedef WX_NSOpenGLPixelFormat WXGLPixelFormat; +typedef WX_NSOpenGLContext WXGLContext; + +#elif wxOSX_USE_IPHONE + +DECLARE_WXCOCOA_OBJC_CLASS(UIWindow); +DECLARE_WXCOCOA_OBJC_CLASS(UIView); +DECLARE_WXCOCOA_OBJC_CLASS(UIFont); +DECLARE_WXCOCOA_OBJC_CLASS(UIImage); +DECLARE_WXCOCOA_OBJC_CLASS(UIEvent); +DECLARE_WXCOCOA_OBJC_CLASS(NSSet); +DECLARE_WXCOCOA_OBJC_CLASS(EAGLContext); + +typedef WX_UIWindow WXWindow; +typedef WX_UIView WXWidget; +typedef WX_EAGLContext WXGLContext; +typedef WX_NSString* WXGLPixelFormat; + +#endif + +#endif /* __WXMAC__ */ + +/* ABX: check __WIN32__ instead of __WXMSW__ for the same MSWBase in any Win32 port */ +#if defined(__WIN32__) + +/* Stand-ins for Windows types to avoid #including all of windows.h */ + +#ifndef NO_STRICT + #define WX_MSW_DECLARE_HANDLE(type) typedef struct type##__ * WX##type +#else + #define WX_MSW_DECLARE_HANDLE(type) typedef void * WX##type +#endif + +typedef void* WXHANDLE; +WX_MSW_DECLARE_HANDLE(HWND); +WX_MSW_DECLARE_HANDLE(HICON); +WX_MSW_DECLARE_HANDLE(HFONT); +WX_MSW_DECLARE_HANDLE(HMENU); +WX_MSW_DECLARE_HANDLE(HPEN); +WX_MSW_DECLARE_HANDLE(HBRUSH); +WX_MSW_DECLARE_HANDLE(HPALETTE); +WX_MSW_DECLARE_HANDLE(HCURSOR); +WX_MSW_DECLARE_HANDLE(HRGN); +WX_MSW_DECLARE_HANDLE(RECTPTR); +WX_MSW_DECLARE_HANDLE(HACCEL); +WX_MSW_DECLARE_HANDLE(HINSTANCE); +WX_MSW_DECLARE_HANDLE(HBITMAP); +WX_MSW_DECLARE_HANDLE(HIMAGELIST); +WX_MSW_DECLARE_HANDLE(HGLOBAL); +WX_MSW_DECLARE_HANDLE(HDC); +typedef WXHINSTANCE WXHMODULE; + +#undef WX_MSW_DECLARE_HANDLE + +typedef unsigned int WXUINT; +typedef unsigned long WXDWORD; +typedef unsigned short WXWORD; + +typedef unsigned long WXCOLORREF; +typedef void * WXRGNDATA; +typedef struct tagMSG WXMSG; +typedef void * WXHCONV; +typedef void * WXHKEY; +typedef void * WXHTREEITEM; + +typedef void * WXDRAWITEMSTRUCT; +typedef void * WXMEASUREITEMSTRUCT; +typedef void * WXLPCREATESTRUCT; + +#ifdef __WXMSW__ +typedef WXHWND WXWidget; +#endif + +#ifdef __WIN64__ +typedef unsigned __int64 WXWPARAM; +typedef __int64 WXLPARAM; +typedef __int64 WXLRESULT; +#else +typedef wxW64 unsigned int WXWPARAM; +typedef wxW64 long WXLPARAM; +typedef wxW64 long WXLRESULT; +#endif + +#if defined(__GNUWIN32__) || defined(__WXMICROWIN__) +typedef int (*WXFARPROC)(); +#else +typedef int (__stdcall *WXFARPROC)(); +#endif +#endif /* __WIN32__ */ + + +#if defined(__OS2__) +typedef unsigned long DWORD; +typedef unsigned short WORD; +#endif + +#if defined(__WXPM__) || defined(__EMX__) +#ifdef __WXPM__ +/* Stand-ins for OS/2 types, to avoid #including all of os2.h */ +typedef unsigned long WXHWND; +typedef unsigned long WXHANDLE; +typedef unsigned long WXHICON; +typedef unsigned long WXHFONT; +typedef unsigned long WXHMENU; +typedef unsigned long WXHPEN; +typedef unsigned long WXHBRUSH; +typedef unsigned long WXHPALETTE; +typedef unsigned long WXHCURSOR; +typedef unsigned long WXHRGN; +typedef unsigned long WXHACCEL; +typedef unsigned long WXHINSTANCE; +typedef unsigned long WXHMODULE; +typedef unsigned long WXHBITMAP; +typedef unsigned long WXHDC; +typedef unsigned int WXUINT; +typedef unsigned long WXDWORD; +typedef unsigned short WXWORD; + +typedef unsigned long WXCOLORREF; +typedef void * WXMSG; +typedef unsigned long WXHTREEITEM; + +typedef void * WXDRAWITEMSTRUCT; +typedef void * WXMEASUREITEMSTRUCT; +typedef void * WXLPCREATESTRUCT; + +typedef WXHWND WXWidget; +#endif +#ifdef __EMX__ +/* Need a well-known type for WXFARPROC + below. MPARAM is typedef'ed too late. */ +#define WXWPARAM void * +#define WXLPARAM void * +#else +#define WXWPARAM MPARAM +#define WXLPARAM MPARAM +#endif +#define RECT RECTL +#define LOGFONT FATTRS +#define LOWORD SHORT1FROMMP +#define HIWORD SHORT2FROMMP + +typedef unsigned long WXMPARAM; +typedef unsigned long WXMSGID; +typedef void* WXRESULT; +/* typedef int (*WXFARPROC)(); */ +/* some windows handles not defined by PM */ +typedef unsigned long HANDLE; +typedef unsigned long HICON; +typedef unsigned long HFONT; +typedef unsigned long HMENU; +typedef unsigned long HPEN; +typedef unsigned long HBRUSH; +typedef unsigned long HPALETTE; +typedef unsigned long HCURSOR; +typedef unsigned long HINSTANCE; +typedef unsigned long HIMAGELIST; +typedef unsigned long HGLOBAL; +#endif /* WXPM || EMX */ + +#if defined (__WXPM__) +/* WIN32 graphics types for OS/2 GPI */ + +/* RGB under OS2 is more like a PALETTEENTRY struct under Windows so we need a real RGB def */ +#define OS2RGB(r,g,b) ((DWORD)((unsigned char)(b) | ((unsigned char)(g) << 8)) | ((unsigned char)(r) << 16)) + +typedef unsigned long COLORREF; +#define GetRValue(rgb) ((unsigned char)((rgb) >> 16)) +#define GetGValue(rgb) ((unsigned char)(((unsigned short)(rgb)) >> 8)) +#define GetBValue(rgb) ((unsigned char)(rgb)) +#define PALETTEINDEX(i) ((COLORREF)(0x01000000 | (DWORD)(WORD)(i))) +#define PALETTERGB(r,g,b) (0x02000000 | OS2RGB(r,g,b)) +/* OS2's RGB/RGB2 is backwards from this */ +typedef struct tagPALETTEENTRY +{ + char bRed; + char bGreen; + char bBlue; + char bFlags; +} PALETTEENTRY; +typedef struct tagLOGPALETTE +{ + WORD palVersion; + WORD palNumentries; + WORD PALETTEENTRY[1]; +} LOGPALETTE; + +#if (defined(__VISAGECPP__) && (__IBMCPP__ < 400)) || defined (__WATCOMC__) + /* VA 3.0 for some reason needs base data types when typedefing a proc proto??? */ +typedef void* (_System *WXFARPROC)(unsigned long, unsigned long, void*, void*); +#else +#if defined(__EMX__) && !defined(_System) +#define _System +#endif +typedef WXRESULT (_System *WXFARPROC)(WXHWND, WXMSGID, WXWPARAM, WXLPARAM); +#endif + +#endif /* __WXPM__ */ + + +#if defined(__WXMOTIF__) || defined(__WXX11__) +/* Stand-ins for X/Xt/Motif types */ +typedef void* WXWindow; +typedef void* WXWidget; +typedef void* WXAppContext; +typedef void* WXColormap; +typedef void* WXColor; +typedef void WXDisplay; +typedef void WXEvent; +typedef void* WXCursor; +typedef void* WXPixmap; +typedef void* WXFontStructPtr; +typedef void* WXGC; +typedef void* WXRegion; +typedef void* WXFont; +typedef void* WXImage; +typedef void* WXFontList; +typedef void* WXFontSet; +typedef void* WXRendition; +typedef void* WXRenderTable; +typedef void* WXFontType; /* either a XmFontList or XmRenderTable */ +typedef void* WXString; + +typedef unsigned long Atom; /* this might fail on a few architectures */ +typedef long WXPixel; /* safety catch in src/motif/colour.cpp */ + +#endif /* Motif */ + +#ifdef __WXGTK__ + +/* Stand-ins for GLIB types */ +typedef struct _GSList GSList; + +/* Stand-ins for GDK types */ +typedef struct _GdkColor GdkColor; +typedef struct _GdkCursor GdkCursor; +typedef struct _GdkDragContext GdkDragContext; + +#if defined(__WXGTK20__) + typedef struct _GdkAtom* GdkAtom; +#else + typedef unsigned long GdkAtom; +#endif + +#if !defined(__WXGTK3__) + typedef struct _GdkColormap GdkColormap; + typedef struct _GdkFont GdkFont; + typedef struct _GdkGC GdkGC; + typedef struct _GdkRegion GdkRegion; +#endif + +#if defined(__WXGTK3__) + typedef struct _GdkWindow GdkWindow; +#elif defined(__WXGTK20__) + typedef struct _GdkDrawable GdkWindow; + typedef struct _GdkDrawable GdkPixmap; +#else + typedef struct _GdkWindow GdkWindow; + typedef struct _GdkWindow GdkBitmap; + typedef struct _GdkWindow GdkPixmap; +#endif + +/* Stand-ins for GTK types */ +typedef struct _GtkWidget GtkWidget; +typedef struct _GtkRcStyle GtkRcStyle; +typedef struct _GtkAdjustment GtkAdjustment; +typedef struct _GtkToolbar GtkToolbar; +typedef struct _GtkNotebook GtkNotebook; +typedef struct _GtkNotebookPage GtkNotebookPage; +typedef struct _GtkAccelGroup GtkAccelGroup; +typedef struct _GtkSelectionData GtkSelectionData; +typedef struct _GtkTextBuffer GtkTextBuffer; +typedef struct _GtkRange GtkRange; +typedef struct _GtkCellRenderer GtkCellRenderer; + +typedef GtkWidget *WXWidget; + +#ifndef __WXGTK20__ +#define GTK_OBJECT_GET_CLASS(object) (GTK_OBJECT(object)->klass) +#define GTK_CLASS_TYPE(klass) ((klass)->type) +#endif + +#endif /* __WXGTK__ */ + +#if defined(__WXGTK20__) || (defined(__WXX11__) && wxUSE_UNICODE) +#define wxUSE_PANGO 1 +#else +#define wxUSE_PANGO 0 +#endif + +#if wxUSE_PANGO +/* Stand-ins for Pango types */ +typedef struct _PangoContext PangoContext; +typedef struct _PangoLayout PangoLayout; +typedef struct _PangoFontDescription PangoFontDescription; +#endif + +#ifdef __WXDFB__ +/* DirectFB doesn't have the concept of non-TLW window, so use + something arbitrary */ +typedef const void* WXWidget; +#endif /* DFB */ + +/* This is required because of clashing macros in windows.h, which may be */ +/* included before or after wxWidgets classes, and therefore must be */ +/* disabled here before any significant wxWidgets headers are included. */ +#ifdef __cplusplus +#ifdef __WINDOWS__ +#include "wx/msw/winundef.h" +#endif /* __WINDOWS__ */ +#endif /* __cplusplus */ + + +/* include the feature test macros */ +#include "wx/features.h" + +/* --------------------------------------------------------------------------- */ +/* macros to define a class without copy ctor nor assignment operator */ +/* --------------------------------------------------------------------------- */ + +#define wxDECLARE_NO_COPY_CLASS(classname) \ + private: \ + classname(const classname&); \ + classname& operator=(const classname&) + +#define wxDECLARE_NO_COPY_TEMPLATE_CLASS(classname, arg) \ + private: \ + classname(const classname&); \ + classname& operator=(const classname&) + +#define wxDECLARE_NO_COPY_TEMPLATE_CLASS_2(classname, arg1, arg2) \ + private: \ + classname(const classname&); \ + classname& operator=(const classname&) + +#define wxDECLARE_NO_ASSIGN_CLASS(classname) \ + private: \ + classname& operator=(const classname&) + +/* deprecated variants _not_ requiring a semicolon after them */ +#define DECLARE_NO_COPY_CLASS(classname) \ + wxDECLARE_NO_COPY_CLASS(classname); +#define DECLARE_NO_COPY_TEMPLATE_CLASS(classname, arg) \ + wxDECLARE_NO_COPY_TEMPLATE_CLASS(classname, arg); +#define DECLARE_NO_ASSIGN_CLASS(classname) \ + wxDECLARE_NO_ASSIGN_CLASS(classname); + +/* --------------------------------------------------------------------------- */ +/* If a manifest is being automatically generated, add common controls 6 to it */ +/* --------------------------------------------------------------------------- */ + +#if wxUSE_GUI && \ + (!defined wxUSE_NO_MANIFEST || wxUSE_NO_MANIFEST == 0 ) && \ + ( defined _MSC_FULL_VER && _MSC_FULL_VER >= 140040130 ) + +#define WX_CC_MANIFEST(cpu) \ + "/manifestdependency:\"type='win32' \ + name='Microsoft.Windows.Common-Controls' \ + version='6.0.0.0' \ + processorArchitecture='" cpu "' \ + publicKeyToken='6595b64144ccf1df' \ + language='*'\"" + +#if defined _M_IX86 + #pragma comment(linker, WX_CC_MANIFEST("x86")) +#elif defined _M_X64 + #pragma comment(linker, WX_CC_MANIFEST("amd64")) +#elif defined _M_IA64 + #pragma comment(linker, WX_CC_MANIFEST("ia64")) +#else + #pragma comment(linker, WX_CC_MANIFEST("*")) +#endif + +#endif /* !wxUSE_NO_MANIFEST && _MSC_FULL_VER >= 140040130 */ + +/* wxThread and wxProcess priorities */ +enum +{ + wxPRIORITY_MIN = 0u, /* lowest possible priority */ + wxPRIORITY_DEFAULT = 50u, /* normal priority */ + wxPRIORITY_MAX = 100u /* highest possible priority */ +}; + +#endif + /* _WX_DEFS_H_ */ diff --git a/wxmsw/include/wx-3.0/wx/dialog.h b/wxmsw/include/wx-3.0/wx/dialog.h new file mode 100644 index 00000000..71101513 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dialog.h @@ -0,0 +1,441 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dialog.h +// Purpose: wxDialogBase class +// Author: Vadim Zeitlin +// Modified by: +// Created: 29.06.99 +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DIALOG_H_BASE_ +#define _WX_DIALOG_H_BASE_ + +#include "wx/toplevel.h" +#include "wx/containr.h" +#include "wx/sharedptr.h" + +class WXDLLIMPEXP_FWD_CORE wxSizer; +class WXDLLIMPEXP_FWD_CORE wxStdDialogButtonSizer; +class WXDLLIMPEXP_FWD_CORE wxBoxSizer; +class WXDLLIMPEXP_FWD_CORE wxDialogLayoutAdapter; +class WXDLLIMPEXP_FWD_CORE wxDialog; +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxScrolledWindow; +class wxTextSizerWrapper; + +// Also see the bit summary table in wx/toplevel.h. + +#define wxDIALOG_NO_PARENT 0x00000020 // Don't make owned by apps top window + +#ifdef __WXWINCE__ +#define wxDEFAULT_DIALOG_STYLE (wxCAPTION | wxMAXIMIZE | wxCLOSE_BOX | wxNO_BORDER) +#else +#define wxDEFAULT_DIALOG_STYLE (wxCAPTION | wxSYSTEM_MENU | wxCLOSE_BOX) +#endif + +// Layout adaptation levels, for SetLayoutAdaptationLevel + +// Don't do any layout adaptation +#define wxDIALOG_ADAPTATION_NONE 0 + +// Only look for wxStdDialogButtonSizer for non-scrolling part +#define wxDIALOG_ADAPTATION_STANDARD_SIZER 1 + +// Also look for any suitable sizer for non-scrolling part +#define wxDIALOG_ADAPTATION_ANY_SIZER 2 + +// Also look for 'loose' standard buttons for non-scrolling part +#define wxDIALOG_ADAPTATION_LOOSE_BUTTONS 3 + +// Layout adaptation mode, for SetLayoutAdaptationMode +enum wxDialogLayoutAdaptationMode +{ + wxDIALOG_ADAPTATION_MODE_DEFAULT = 0, // use global adaptation enabled status + wxDIALOG_ADAPTATION_MODE_ENABLED = 1, // enable this dialog overriding global status + wxDIALOG_ADAPTATION_MODE_DISABLED = 2 // disable this dialog overriding global status +}; + +enum wxDialogModality +{ + wxDIALOG_MODALITY_NONE = 0, + wxDIALOG_MODALITY_WINDOW_MODAL = 1, + wxDIALOG_MODALITY_APP_MODAL = 2 +}; + +extern WXDLLIMPEXP_DATA_CORE(const char) wxDialogNameStr[]; + +class WXDLLIMPEXP_CORE wxDialogBase : public wxNavigationEnabled +{ +public: + wxDialogBase(); + virtual ~wxDialogBase() { } + + // define public wxDialog methods to be implemented by the derived classes + virtual int ShowModal() = 0; + virtual void EndModal(int retCode) = 0; + virtual bool IsModal() const = 0; + // show the dialog frame-modally (needs a parent), using app-modal + // dialogs on platforms that don't support it + virtual void ShowWindowModal () ; + virtual void SendWindowModalDialogEvent ( wxEventType type ); + +#ifdef wxHAS_EVENT_BIND + template + void ShowWindowModalThenDo(const Functor& onEndModal); +#endif // wxHAS_EVENT_BIND + + // Modal dialogs have a return code - usually the id of the last + // pressed button + void SetReturnCode(int returnCode) { m_returnCode = returnCode; } + int GetReturnCode() const { return m_returnCode; } + + // Set the identifier for the affirmative button: this button will close + // the dialog after validating data and calling TransferDataFromWindow() + void SetAffirmativeId(int affirmativeId); + int GetAffirmativeId() const { return m_affirmativeId; } + + // Set identifier for Esc key translation: the button with this id will + // close the dialog without doing anything else; special value wxID_NONE + // means to not handle Esc at all while wxID_ANY means to map Esc to + // wxID_CANCEL if present and GetAffirmativeId() otherwise + void SetEscapeId(int escapeId); + int GetEscapeId() const { return m_escapeId; } + + // Find the parent to use for modal dialog: try to use the specified parent + // but fall back to the current active window or main application window as + // last resort if it is unsuitable. + // + // As this function is often called from the ctor, the window style may be + // not set yet and hence must be passed explicitly to it so that we could + // check whether it contains wxDIALOG_NO_PARENT bit. + // + // This function always returns a valid top level window or NULL. + wxWindow *GetParentForModalDialog(wxWindow *parent, long style) const; + + // This overload can only be used for already initialized windows, i.e. not + // from the ctor. It uses the current window parent and style. + wxWindow *GetParentForModalDialog() const + { + return GetParentForModalDialog(GetParent(), GetWindowStyle()); + } + +#if wxUSE_STATTEXT // && wxUSE_TEXTCTRL + // splits text up at newlines and places the lines into a vertical + // wxBoxSizer + wxSizer *CreateTextSizer( const wxString& message ); + + // same as above but uses a customized wxTextSizerWrapper to create + // non-standard controls for the lines + wxSizer *CreateTextSizer( const wxString& message, + wxTextSizerWrapper& wrapper ); +#endif // wxUSE_STATTEXT // && wxUSE_TEXTCTRL + + // returns a horizontal wxBoxSizer containing the given buttons + // + // notice that the returned sizer can be NULL if no buttons are put in the + // sizer (this mostly happens under smart phones and other atypical + // platforms which have hardware buttons replacing OK/Cancel and such) + wxSizer *CreateButtonSizer(long flags); + + // returns a sizer containing the given one and a static line separating it + // from the preceding elements if it's appropriate for the current platform + wxSizer *CreateSeparatedSizer(wxSizer *sizer); + + // returns the sizer containing CreateButtonSizer() below a separating + // static line for the platforms which use static lines for items + // separation (i.e. not Mac) + // + // this is just a combination of CreateButtonSizer() and + // CreateSeparatedSizer() + wxSizer *CreateSeparatedButtonSizer(long flags); + +#if wxUSE_BUTTON + wxStdDialogButtonSizer *CreateStdDialogButtonSizer( long flags ); +#endif // wxUSE_BUTTON + + // Do layout adaptation + virtual bool DoLayoutAdaptation(); + + // Can we do layout adaptation? + virtual bool CanDoLayoutAdaptation(); + + // Returns a content window if there is one. This can be used by the layout adapter, for + // example to make the pages of a book control into scrolling windows + virtual wxWindow* GetContentWindow() const { return NULL; } + + // Add an id to the list of main button identifiers that should be in the button sizer + void AddMainButtonId(wxWindowID id) { m_mainButtonIds.Add((int) id); } + wxArrayInt& GetMainButtonIds() { return m_mainButtonIds; } + + // Is this id in the main button id array? + bool IsMainButtonId(wxWindowID id) const { return (m_mainButtonIds.Index((int) id) != wxNOT_FOUND); } + + // Level of adaptation, from none (Level 0) to full (Level 3). To disable adaptation, + // set level 0, for example in your dialog constructor. You might + // do this if you know that you are displaying on a large screen and you don't want the + // dialog changed. + void SetLayoutAdaptationLevel(int level) { m_layoutAdaptationLevel = level; } + int GetLayoutAdaptationLevel() const { return m_layoutAdaptationLevel; } + + /// Override global adaptation enabled/disabled status + void SetLayoutAdaptationMode(wxDialogLayoutAdaptationMode mode) { m_layoutAdaptationMode = mode; } + wxDialogLayoutAdaptationMode GetLayoutAdaptationMode() const { return m_layoutAdaptationMode; } + + // Returns true if the adaptation has been done + void SetLayoutAdaptationDone(bool adaptationDone) { m_layoutAdaptationDone = adaptationDone; } + bool GetLayoutAdaptationDone() const { return m_layoutAdaptationDone; } + + // Set layout adapter class, returning old adapter + static wxDialogLayoutAdapter* SetLayoutAdapter(wxDialogLayoutAdapter* adapter); + static wxDialogLayoutAdapter* GetLayoutAdapter() { return sm_layoutAdapter; } + + // Global switch for layout adaptation + static bool IsLayoutAdaptationEnabled() { return sm_layoutAdaptation; } + static void EnableLayoutAdaptation(bool enable) { sm_layoutAdaptation = enable; } + + // modality kind + virtual wxDialogModality GetModality() const; +protected: + // emulate click of a button with the given id if it's present in the dialog + // + // return true if button was "clicked" or false if we don't have it + bool EmulateButtonClickIfPresent(int id); + + // this function is used by OnCharHook() to decide whether the given key + // should close the dialog + // + // for most platforms the default implementation (which just checks for + // Esc) is sufficient, but Mac port also adds Cmd-. here and other ports + // could do something different if needed + virtual bool IsEscapeKey(const wxKeyEvent& event); + + // end either modal or modeless dialog, for the modal dialog rc is used as + // the dialog return code + void EndDialog(int rc); + + // call Validate() and TransferDataFromWindow() and close dialog with + // wxID_OK return code + void AcceptAndClose(); + + // The return code from modal dialog + int m_returnCode; + + // The identifier for the affirmative button (usually wxID_OK) + int m_affirmativeId; + + // The identifier for cancel button (usually wxID_CANCEL) + int m_escapeId; + + // Flags whether layout adaptation has been done for this dialog + bool m_layoutAdaptationDone; + + // Extra button identifiers to be taken as 'main' button identifiers + // to be placed in the non-scrolling area + wxArrayInt m_mainButtonIds; + + // Adaptation level + int m_layoutAdaptationLevel; + + // Local override for global adaptation enabled status + wxDialogLayoutAdaptationMode m_layoutAdaptationMode; + + // Global layout adapter + static wxDialogLayoutAdapter* sm_layoutAdapter; + + // Global adaptation switch + static bool sm_layoutAdaptation; + +private: + // helper of GetParentForModalDialog(): returns the passed in window if it + // can be used as our parent or NULL if it can't + wxWindow *CheckIfCanBeUsedAsParent(wxWindow *parent) const; + + // Helper of OnCharHook() and OnCloseWindow(): find the appropriate button + // for closing the dialog and send a click event for it. + // + // Return true if we found a button to close the dialog and "clicked" it or + // false otherwise. + bool SendCloseButtonClickEvent(); + + // handle Esc key presses + void OnCharHook(wxKeyEvent& event); + + // handle closing the dialog window + void OnCloseWindow(wxCloseEvent& event); + + // handle the standard buttons + void OnButton(wxCommandEvent& event); + + // update the background colour + void OnSysColourChanged(wxSysColourChangedEvent& event); + + + wxDECLARE_NO_COPY_CLASS(wxDialogBase); + DECLARE_EVENT_TABLE() +}; + +/*! + * Base class for layout adapters - code that, for example, turns a dialog into a + * scrolling dialog if there isn't enough screen space. You can derive further + * adapter classes to do any other kind of adaptation, such as applying a watermark, or adding + * a help mechanism. + */ + +class WXDLLIMPEXP_CORE wxDialogLayoutAdapter: public wxObject +{ + DECLARE_CLASS(wxDialogLayoutAdapter) +public: + wxDialogLayoutAdapter() {} + + // Override this function to indicate that adaptation should be done + virtual bool CanDoLayoutAdaptation(wxDialog* dialog) = 0; + + // Override this function to do the adaptation + virtual bool DoLayoutAdaptation(wxDialog* dialog) = 0; +}; + +/*! + * Standard adapter. Does scrolling adaptation for paged and regular dialogs. + * + */ + +class WXDLLIMPEXP_CORE wxStandardDialogLayoutAdapter: public wxDialogLayoutAdapter +{ + DECLARE_CLASS(wxStandardDialogLayoutAdapter) +public: + wxStandardDialogLayoutAdapter() {} + +// Overrides + + // Indicate that adaptation should be done + virtual bool CanDoLayoutAdaptation(wxDialog* dialog); + + // Do layout adaptation + virtual bool DoLayoutAdaptation(wxDialog* dialog); + +// Implementation + + // Create the scrolled window + virtual wxScrolledWindow* CreateScrolledWindow(wxWindow* parent); + +#if wxUSE_BUTTON + // Find a standard or horizontal box sizer + virtual wxSizer* FindButtonSizer(bool stdButtonSizer, wxDialog* dialog, wxSizer* sizer, int& retBorder, int accumlatedBorder = 0); + + // Check if this sizer contains standard buttons, and so can be repositioned in the dialog + virtual bool IsOrdinaryButtonSizer(wxDialog* dialog, wxBoxSizer* sizer); + + // Check if this is a standard button + virtual bool IsStandardButton(wxDialog* dialog, wxButton* button); + + // Find 'loose' main buttons in the existing layout and add them to the standard dialog sizer + virtual bool FindLooseButtons(wxDialog* dialog, wxStdDialogButtonSizer* buttonSizer, wxSizer* sizer, int& count); +#endif // wxUSE_BUTTON + + // Reparent the controls to the scrolled window, except those in buttonSizer + virtual void ReparentControls(wxWindow* parent, wxWindow* reparentTo, wxSizer* buttonSizer = NULL); + static void DoReparentControls(wxWindow* parent, wxWindow* reparentTo, wxSizer* buttonSizer = NULL); + + // A function to fit the dialog around its contents, and then adjust for screen size. + // If scrolled windows are passed, scrolling is enabled in the required orientation(s). + virtual bool FitWithScrolling(wxDialog* dialog, wxScrolledWindow* scrolledWindow); + virtual bool FitWithScrolling(wxDialog* dialog, wxWindowList& windows); + static bool DoFitWithScrolling(wxDialog* dialog, wxScrolledWindow* scrolledWindow); + static bool DoFitWithScrolling(wxDialog* dialog, wxWindowList& windows); + + // Find whether scrolling will be necessary for the dialog, returning wxVERTICAL, wxHORIZONTAL or both + virtual int MustScroll(wxDialog* dialog, wxSize& windowSize, wxSize& displaySize); + static int DoMustScroll(wxDialog* dialog, wxSize& windowSize, wxSize& displaySize); +}; + +#if defined(__WXUNIVERSAL__) && !defined(__WXMICROWIN__) + #include "wx/univ/dialog.h" +#else + #if defined(__WXMSW__) + #include "wx/msw/dialog.h" + #elif defined(__WXMOTIF__) + #include "wx/motif/dialog.h" + #elif defined(__WXGTK20__) + #include "wx/gtk/dialog.h" + #elif defined(__WXGTK__) + #include "wx/gtk1/dialog.h" + #elif defined(__WXMAC__) + #include "wx/osx/dialog.h" + #elif defined(__WXCOCOA__) + #include "wx/cocoa/dialog.h" + #elif defined(__WXPM__) + #include "wx/os2/dialog.h" + #endif +#endif + +class WXDLLIMPEXP_CORE wxWindowModalDialogEvent : public wxCommandEvent +{ +public: + wxWindowModalDialogEvent (wxEventType commandType = wxEVT_NULL, int id = 0) + : wxCommandEvent(commandType, id) { } + + wxDialog *GetDialog() const + { return wxStaticCast(GetEventObject(), wxDialog); } + + int GetReturnCode() const + { return GetDialog()->GetReturnCode(); } + + virtual wxEvent *Clone() const { return new wxWindowModalDialogEvent (*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxWindowModalDialogEvent ) +}; + +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_WINDOW_MODAL_DIALOG_CLOSED , wxWindowModalDialogEvent ); + +typedef void (wxEvtHandler::*wxWindowModalDialogEventFunction)(wxWindowModalDialogEvent &); + +#define wxWindowModalDialogEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxWindowModalDialogEventFunction, func) + +#define EVT_WINDOW_MODAL_DIALOG_CLOSED(winid, func) \ + wx__DECLARE_EVT1(wxEVT_WINDOW_MODAL_DIALOG_CLOSED, winid, wxWindowModalDialogEventHandler(func)) + +#ifdef wxHAS_EVENT_BIND +template +class wxWindowModalDialogEventFunctor +{ +public: + wxWindowModalDialogEventFunctor(const Functor& f) + : m_f(new Functor(f)) + {} + + void operator()(wxWindowModalDialogEvent& event) + { + if ( m_f ) + { + // We only want to call this handler once. Also, by deleting + // the functor here, its data (such as wxWindowPtr pointing to + // the dialog) are freed immediately after exiting this operator(). + wxSharedPtr functor(m_f); + m_f.reset(); + + (*functor)(event.GetReturnCode()); + } + else // was already called once + { + event.Skip(); + } + } + +private: + wxSharedPtr m_f; +}; + +template +void wxDialogBase::ShowWindowModalThenDo(const Functor& onEndModal) +{ + Bind(wxEVT_WINDOW_MODAL_DIALOG_CLOSED, + wxWindowModalDialogEventFunctor(onEndModal)); + ShowWindowModal(); +} +#endif // wxHAS_EVENT_BIND + +#endif + // _WX_DIALOG_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/dialup.h b/wxmsw/include/wx-3.0/wx/dialup.h new file mode 100644 index 00000000..7688d4a1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dialup.h @@ -0,0 +1,200 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dialup.h +// Purpose: Network related wxWidgets classes and functions +// Author: Vadim Zeitlin +// Modified by: +// Created: 07.07.99 +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DIALUP_H +#define _WX_DIALUP_H + +#if wxUSE_DIALUP_MANAGER + +#include "wx/event.h" + +// ---------------------------------------------------------------------------- +// misc +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxArrayString; + +#define WXDIALUP_MANAGER_DEFAULT_BEACONHOST wxT("www.yahoo.com") + +// ---------------------------------------------------------------------------- +// A class which groups functions dealing with connecting to the network from a +// workstation using dial-up access to the net. There is at most one instance +// of this class in the program accessed via GetDialUpManager(). +// ---------------------------------------------------------------------------- + +/* TODO + * + * 1. more configurability for Unix: i.e. how to initiate the connection, how + * to check for online status, &c. + * 2. a function to enumerate all connections (ISPs) and show a dialog in + * Dial() allowing to choose between them if no ISP given + * 3. add an async version of dialing functions which notify the caller about + * the progress (or may be even start another thread to monitor it) + * 4. the static creation/accessor functions are not MT-safe - but is this + * really crucial? I think we may suppose they're always called from the + * main thread? + */ + +class WXDLLIMPEXP_CORE wxDialUpManager +{ +public: + // this function should create and return the object of the + // platform-specific class derived from wxDialUpManager. It's implemented + // in the platform-specific source files. + static wxDialUpManager *Create(); + + // could the dialup manager be initialized correctly? If this function + // returns false, no other functions will work neither, so it's a good idea + // to call this function and check its result before calling any other + // wxDialUpManager methods + virtual bool IsOk() const = 0; + + // virtual dtor for any base class + virtual ~wxDialUpManager() { } + + // operations + // ---------- + + // fills the array with the names of all possible values for the first + // parameter to Dial() on this machine and returns their number (may be 0) + virtual size_t GetISPNames(wxArrayString& names) const = 0; + + // dial the given ISP, use username and password to authentificate + // + // if no nameOfISP is given, the function will select the default one + // + // if no username/password are given, the function will try to do without + // them, but will ask the user if really needed + // + // if async parameter is false, the function waits until the end of dialing + // and returns true upon successful completion. + // if async is true, the function only initiates the connection and returns + // immediately - the result is reported via events (an event is sent + // anyhow, but if dialing failed it will be a DISCONNECTED one) + virtual bool Dial(const wxString& nameOfISP = wxEmptyString, + const wxString& username = wxEmptyString, + const wxString& password = wxEmptyString, + bool async = true) = 0; + + // returns true if (async) dialing is in progress + virtual bool IsDialing() const = 0; + + // cancel dialing the number initiated with Dial(async = true) + // NB: this won't result in DISCONNECTED event being sent + virtual bool CancelDialing() = 0; + + // hang up the currently active dial up connection + virtual bool HangUp() = 0; + + // online status + // ------------- + + // returns true if the computer has a permanent network connection (i.e. is + // on a LAN) and so there is no need to use Dial() function to go online + // + // NB: this functions tries to guess the result and it is not always + // guaranteed to be correct, so it's better to ask user for + // confirmation or give him a possibility to override it + virtual bool IsAlwaysOnline() const = 0; + + // returns true if the computer is connected to the network: under Windows, + // this just means that a RAS connection exists, under Unix we check that + // the "well-known host" (as specified by SetWellKnownHost) is reachable + virtual bool IsOnline() const = 0; + + // sometimes the built-in logic for determining the online status may fail, + // so, in general, the user should be allowed to override it. This function + // allows to forcefully set the online status - whatever our internal + // algorithm may think about it. + virtual void SetOnlineStatus(bool isOnline = true) = 0; + + // set misc wxDialUpManager options + // -------------------------------- + + // enable automatical checks for the connection status and sending of + // wxEVT_DIALUP_CONNECTED/wxEVT_DIALUP_DISCONNECTED events. The interval + // parameter is only for Unix where we do the check manually: under + // Windows, the notification about the change of connection status is + // instantenous. + // + // Returns false if couldn't set up automatic check for online status. + virtual bool EnableAutoCheckOnlineStatus(size_t nSeconds = 60) = 0; + + // disable automatic check for connection status change - notice that the + // wxEVT_DIALUP_XXX events won't be sent any more neither. + virtual void DisableAutoCheckOnlineStatus() = 0; + + // additional Unix-only configuration + // ---------------------------------- + + // under Unix, the value of well-known host is used to check whether we're + // connected to the internet. It's unused under Windows, but this function + // is always safe to call. The default value is www.yahoo.com. + virtual void SetWellKnownHost(const wxString& hostname, + int portno = 80) = 0; + + // Sets the commands to start up the network and to hang up again. Used by + // the Unix implementations only. + virtual void + SetConnectCommand(const wxString& commandDial = wxT("/usr/bin/pon"), + const wxString& commandHangup = wxT("/usr/bin/poff")) = 0; +}; + +// ---------------------------------------------------------------------------- +// wxDialUpManager events +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxDialUpEvent; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_DIALUP_CONNECTED, wxDialUpEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_DIALUP_DISCONNECTED, wxDialUpEvent ); + +// the event class for the dialup events +class WXDLLIMPEXP_CORE wxDialUpEvent : public wxEvent +{ +public: + wxDialUpEvent(bool isConnected, bool isOwnEvent) : wxEvent(isOwnEvent) + { + SetEventType(isConnected ? wxEVT_DIALUP_CONNECTED + : wxEVT_DIALUP_DISCONNECTED); + } + + // is this a CONNECTED or DISCONNECTED event? + bool IsConnectedEvent() const + { return GetEventType() == wxEVT_DIALUP_CONNECTED; } + + // does this event come from wxDialUpManager::Dial() or from some external + // process (i.e. does it result from our own attempt to establish the + // connection)? + bool IsOwnEvent() const { return m_id != 0; } + + // implement the base class pure virtual + virtual wxEvent *Clone() const { return new wxDialUpEvent(*this); } + +private: + wxDECLARE_NO_ASSIGN_CLASS(wxDialUpEvent); +}; + +// the type of dialup event handler function +typedef void (wxEvtHandler::*wxDialUpEventFunction)(wxDialUpEvent&); + +#define wxDialUpEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxDialUpEventFunction, func) + +// macros to catch dialup events +#define EVT_DIALUP_CONNECTED(func) \ + wx__DECLARE_EVT0(wxEVT_DIALUP_CONNECTED, wxDialUpEventHandler(func)) +#define EVT_DIALUP_DISCONNECTED(func) \ + wx__DECLARE_EVT0(wxEVT_DIALUP_DISCONNECTED, wxDialUpEventHandler(func)) + + +#endif // wxUSE_DIALUP_MANAGER + +#endif // _WX_DIALUP_H diff --git a/wxmsw/include/wx-3.0/wx/dir.h b/wxmsw/include/wx-3.0/wx/dir.h new file mode 100644 index 00000000..f23862e0 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dir.h @@ -0,0 +1,186 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dir.h +// Purpose: wxDir is a class for enumerating the files in a directory +// Author: Vadim Zeitlin +// Modified by: +// Created: 08.12.99 +// Copyright: (c) 1999 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DIR_H_ +#define _WX_DIR_H_ + +#include "wx/longlong.h" +#include "wx/string.h" +#include "wx/filefn.h" // for wxS_DIR_DEFAULT + +class WXDLLIMPEXP_FWD_BASE wxArrayString; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// These flags affect the behaviour of GetFirst/GetNext() and Traverse(). +// They define what types are included in the list of items they produce. +// Note that wxDIR_NO_FOLLOW is relevant only on Unix and ignored under systems +// not supporting symbolic links. +enum wxDirFlags +{ + wxDIR_FILES = 0x0001, // include files + wxDIR_DIRS = 0x0002, // include directories + wxDIR_HIDDEN = 0x0004, // include hidden files + wxDIR_DOTDOT = 0x0008, // include '.' and '..' + wxDIR_NO_FOLLOW = 0x0010, // don't dereference any symlink + + // by default, enumerate everything except '.' and '..' + wxDIR_DEFAULT = wxDIR_FILES | wxDIR_DIRS | wxDIR_HIDDEN +}; + +// these constants are possible return value of wxDirTraverser::OnDir() +enum wxDirTraverseResult +{ + wxDIR_IGNORE = -1, // ignore this directory but continue with others + wxDIR_STOP, // stop traversing + wxDIR_CONTINUE // continue into this directory +}; + +// ---------------------------------------------------------------------------- +// wxDirTraverser: helper class for wxDir::Traverse() +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxDirTraverser +{ +public: + /// a virtual dtor has been provided since this class has virtual members + virtual ~wxDirTraverser() { } + // called for each file found by wxDir::Traverse() + // + // return wxDIR_STOP or wxDIR_CONTINUE from here (wxDIR_IGNORE doesn't + // make sense) + virtual wxDirTraverseResult OnFile(const wxString& filename) = 0; + + // called for each directory found by wxDir::Traverse() + // + // return one of the enum elements defined above + virtual wxDirTraverseResult OnDir(const wxString& dirname) = 0; + + // called for each directory which we couldn't open during our traversal + // of the directory tree + // + // this method can also return either wxDIR_STOP, wxDIR_IGNORE or + // wxDIR_CONTINUE but the latter is treated specially: it means to retry + // opening the directory and so may lead to infinite loop if it is + // returned unconditionally, be careful with this! + // + // the base class version always returns wxDIR_IGNORE + virtual wxDirTraverseResult OnOpenError(const wxString& dirname); +}; + +// ---------------------------------------------------------------------------- +// wxDir: portable equivalent of {open/read/close}dir functions +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxDirData; + +class WXDLLIMPEXP_BASE wxDir +{ +public: + + // ctors + // ----- + + // default, use Open() + wxDir() { m_data = NULL; } + + // opens the directory for enumeration, use IsOpened() to test success + wxDir(const wxString& dir); + + // dtor calls Close() automatically + ~wxDir() { Close(); } + + // open the directory for enumerating + bool Open(const wxString& dir); + + // close the directory, Open() can be called again later + void Close(); + + // returns true if the directory was successfully opened + bool IsOpened() const; + + // get the full name of the directory (without '/' at the end) + wxString GetName() const; + + // Same as GetName() but does include the trailing separator, unless the + // string is empty (only for invalid directories). + wxString GetNameWithSep() const; + + + // file enumeration routines + // ------------------------- + + // start enumerating all files matching filespec (or all files if it is + // empty) and flags, return true on success + bool GetFirst(wxString *filename, + const wxString& filespec = wxEmptyString, + int flags = wxDIR_DEFAULT) const; + + // get next file in the enumeration started with GetFirst() + bool GetNext(wxString *filename) const; + + // return true if this directory has any files in it + bool HasFiles(const wxString& spec = wxEmptyString) const; + + // return true if this directory has any subdirectories + bool HasSubDirs(const wxString& spec = wxEmptyString) const; + + // enumerate all files in this directory and its subdirectories + // + // return the number of files found + size_t Traverse(wxDirTraverser& sink, + const wxString& filespec = wxEmptyString, + int flags = wxDIR_DEFAULT) const; + + // simplest version of Traverse(): get the names of all files under this + // directory into filenames array, return the number of files + static size_t GetAllFiles(const wxString& dirname, + wxArrayString *files, + const wxString& filespec = wxEmptyString, + int flags = wxDIR_DEFAULT); + + // check if there any files matching the given filespec under the given + // directory (i.e. searches recursively), return the file path if found or + // empty string otherwise + static wxString FindFirst(const wxString& dirname, + const wxString& filespec, + int flags = wxDIR_DEFAULT); + +#if wxUSE_LONGLONG + // returns the size of all directories recursively found in given path + static wxULongLong GetTotalSize(const wxString &dir, wxArrayString *filesSkipped = NULL); +#endif // wxUSE_LONGLONG + + + // static utilities for directory management + // (alias to wxFileName's functions for dirs) + // ----------------------------------------- + + // test for existence of a directory with the given name + static bool Exists(const wxString& dir); + + static bool Make(const wxString &dir, int perm = wxS_DIR_DEFAULT, + int flags = 0); + + static bool Remove(const wxString &dir, int flags = 0); + + +private: + friend class wxDirData; + + wxDirData *m_data; + + wxDECLARE_NO_COPY_CLASS(wxDir); +}; + +#endif // _WX_DIR_H_ + diff --git a/wxmsw/include/wx-3.0/wx/dirctrl.h b/wxmsw/include/wx-3.0/wx/dirctrl.h new file mode 100644 index 00000000..1d9d1ba1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dirctrl.h @@ -0,0 +1,17 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dirctrl.h +// Purpose: Directory control base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DIRCTRL_H_BASE_ +#define _WX_DIRCTRL_H_BASE_ + +#include "wx/generic/dirctrlg.h" + +#endif + // _WX_DIRCTRL_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/dirdlg.h b/wxmsw/include/wx-3.0/wx/dirdlg.h new file mode 100644 index 00000000..b7b7474a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dirdlg.h @@ -0,0 +1,138 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dirdlg.h +// Purpose: wxDirDialog base class +// Author: Robert Roebling +// Modified by: +// Created: +// Copyright: (c) Robert Roebling +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DIRDLG_H_BASE_ +#define _WX_DIRDLG_H_BASE_ + +#if wxUSE_DIRDLG + +#include "wx/dialog.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +extern WXDLLIMPEXP_DATA_CORE(const char) wxDirDialogNameStr[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxDirDialogDefaultFolderStr[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxDirSelectorPromptStr[]; + +#define wxDD_CHANGE_DIR 0x0100 +#define wxDD_DIR_MUST_EXIST 0x0200 + +// deprecated, on by default now, use wxDD_DIR_MUST_EXIST to disable it +#define wxDD_NEW_DIR_BUTTON 0 + +#ifdef __WXWINCE__ + #define wxDD_DEFAULT_STYLE wxDEFAULT_DIALOG_STYLE +#else + #define wxDD_DEFAULT_STYLE (wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) +#endif + +//------------------------------------------------------------------------- +// wxDirDialogBase +//------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDirDialogBase : public wxDialog +{ +public: + wxDirDialogBase() {} + wxDirDialogBase(wxWindow *parent, + const wxString& title = wxDirSelectorPromptStr, + const wxString& defaultPath = wxEmptyString, + long style = wxDD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + const wxString& name = wxDirDialogNameStr) + { + Create(parent, title, defaultPath, style, pos, sz, name); + } + + virtual ~wxDirDialogBase() {} + + + bool Create(wxWindow *parent, + const wxString& title = wxDirSelectorPromptStr, + const wxString& defaultPath = wxEmptyString, + long style = wxDD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + const wxString& name = wxDirDialogNameStr) + { + if (!wxDialog::Create(parent, wxID_ANY, title, pos, sz, style, name)) + return false; + m_path = defaultPath; + m_message = title; + return true; + } + +#if WXWIN_COMPATIBILITY_2_6 + + wxDEPRECATED( long GetStyle() const ); + wxDEPRECATED( void SetStyle(long style) ); + +#endif // WXWIN_COMPATIBILITY_2_6 + + virtual void SetMessage(const wxString& message) { m_message = message; } + virtual void SetPath(const wxString& path) { m_path = path; } + + virtual wxString GetMessage() const { return m_message; } + virtual wxString GetPath() const { return m_path; } + +protected: + wxString m_message; + wxString m_path; +}; + + +// Universal and non-port related switches with need for generic implementation +#if defined(__WXUNIVERSAL__) + #include "wx/generic/dirdlgg.h" + #define wxDirDialog wxGenericDirDialog +#elif defined(__WXMSW__) && (!wxUSE_OLE || \ + (defined (__GNUWIN32__) && !wxUSE_NORLANDER_HEADERS)) + #include "wx/generic/dirdlgg.h" + #define wxDirDialog wxGenericDirDialog +#elif defined(__WXMSW__) && defined(__WXWINCE__) && !defined(__HANDHELDPC__) + #include "wx/generic/dirdlgg.h" // MS PocketPC or MS Smartphone + #define wxDirDialog wxGenericDirDialog +#elif defined(__WXMSW__) + #include "wx/msw/dirdlg.h" // Native MSW +#elif defined(__WXGTK20__) + #include "wx/gtk/dirdlg.h" // Native GTK for gtk2.4 +#elif defined(__WXGTK__) + #include "wx/generic/dirdlgg.h" + #define wxDirDialog wxGenericDirDialog +#elif defined(__WXMAC__) + #include "wx/osx/dirdlg.h" // Native Mac +#elif defined(__WXCOCOA__) + #include "wx/cocoa/dirdlg.h" // Native Cocoa +#elif defined(__WXMOTIF__) || \ + defined(__WXX11__) || \ + defined(__WXCOCOA__) || \ + defined(__WXPM__) + #include "wx/generic/dirdlgg.h" // Other ports use generic implementation + #define wxDirDialog wxGenericDirDialog +#endif + +// ---------------------------------------------------------------------------- +// common ::wxDirSelector() function +// ---------------------------------------------------------------------------- + +WXDLLIMPEXP_CORE wxString +wxDirSelector(const wxString& message = wxDirSelectorPromptStr, + const wxString& defaultPath = wxEmptyString, + long style = wxDD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + wxWindow *parent = NULL); + +#endif // wxUSE_DIRDLG + +#endif + // _WX_DIRDLG_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/display.h b/wxmsw/include/wx-3.0/wx/display.h new file mode 100644 index 00000000..46786721 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/display.h @@ -0,0 +1,127 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/display.h +// Purpose: wxDisplay class +// Author: Royce Mitchell III, Vadim Zeitlin +// Created: 06/21/02 +// Copyright: (c) 2002-2006 wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DISPLAY_H_BASE_ +#define _WX_DISPLAY_H_BASE_ + +// NB: no #if wxUSE_DISPLAY here, the display geometry part of this class (but +// not the video mode stuff) is always available but if wxUSE_DISPLAY == 0 +// it becomes just a trivial wrapper around the old wxDisplayXXX() functions + +#if wxUSE_DISPLAY + #include "wx/dynarray.h" + #include "wx/vidmode.h" + + WX_DECLARE_EXPORTED_OBJARRAY(wxVideoMode, wxArrayVideoModes); + + // default, uninitialized, video mode object + extern WXDLLIMPEXP_DATA_CORE(const wxVideoMode) wxDefaultVideoMode; +#endif // wxUSE_DISPLAY + +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxPoint; +class WXDLLIMPEXP_FWD_CORE wxRect; +class WXDLLIMPEXP_FWD_BASE wxString; + +class WXDLLIMPEXP_FWD_CORE wxDisplayFactory; +class WXDLLIMPEXP_FWD_CORE wxDisplayImpl; + +// ---------------------------------------------------------------------------- +// wxDisplay: represents a display/monitor attached to the system +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDisplay +{ +public: + // initialize the object containing all information about the given + // display + // + // the displays are numbered from 0 to GetCount() - 1, 0 is always the + // primary display and the only one which is always supported + wxDisplay(unsigned n = 0); + + // dtor is not virtual as this is a concrete class not meant to be derived + // from + ~wxDisplay(); + + + // return the number of available displays, valid parameters to + // wxDisplay ctor are from 0 up to this number + static unsigned GetCount(); + + // find the display where the given point lies, return wxNOT_FOUND if + // it doesn't belong to any display + static int GetFromPoint(const wxPoint& pt); + + // find the display where the given window lies, return wxNOT_FOUND if it + // is not shown at all + static int GetFromWindow(const wxWindow *window); + + + // return true if the object was initialized successfully + bool IsOk() const { return m_impl != NULL; } + + // get the full display size + wxRect GetGeometry() const; + + // get the client area of the display, i.e. without taskbars and such + wxRect GetClientArea() const; + + // name may be empty + wxString GetName() const; + + // display 0 is usually the primary display + bool IsPrimary() const; + + +#if wxUSE_DISPLAY + // enumerate all video modes supported by this display matching the given + // one (in the sense of wxVideoMode::Match()) + // + // as any mode matches the default value of the argument and there is + // always at least one video mode supported by display, the returned array + // is only empty for the default value of the argument if this function is + // not supported at all on this platform + wxArrayVideoModes + GetModes(const wxVideoMode& mode = wxDefaultVideoMode) const; + + // get current video mode + wxVideoMode GetCurrentMode() const; + + // change current mode, return true if succeeded, false otherwise + // + // for the default value of the argument restores the video mode to default + bool ChangeMode(const wxVideoMode& mode = wxDefaultVideoMode); + + // restore the default video mode (just a more readable synonym) + void ResetMode() { (void)ChangeMode(); } +#endif // wxUSE_DISPLAY + +private: + // returns the factory used to implement our static methods and create new + // displays + static wxDisplayFactory& Factory(); + + // creates the factory object, called by Factory() when it is called for + // the first time and should return a pointer allocated with new (the + // caller will delete it) + // + // this method must be implemented in platform-specific code if + // wxUSE_DISPLAY == 1 (if it is 0 we provide the stub in common code) + static wxDisplayFactory *CreateFactory(); + + + // the real implementation + wxDisplayImpl *m_impl; + + + wxDECLARE_NO_COPY_CLASS(wxDisplay); +}; + +#endif // _WX_DISPLAY_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/display_impl.h b/wxmsw/include/wx-3.0/wx/display_impl.h new file mode 100644 index 00000000..b6674ebf --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/display_impl.h @@ -0,0 +1,109 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/display_impl.h +// Purpose: wxDisplayImpl class declaration +// Author: Vadim Zeitlin +// Created: 2006-03-15 +// Copyright: (c) 2002-2006 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DISPLAY_IMPL_H_BASE_ +#define _WX_DISPLAY_IMPL_H_BASE_ + +#include "wx/gdicmn.h" // for wxRect + +// ---------------------------------------------------------------------------- +// wxDisplayFactory: allows to create wxDisplay objects +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDisplayFactory +{ +public: + wxDisplayFactory() { } + virtual ~wxDisplayFactory() { } + + // create a new display object + // + // it can return a NULL pointer if the display creation failed + virtual wxDisplayImpl *CreateDisplay(unsigned n) = 0; + + // get the total number of displays + virtual unsigned GetCount() = 0; + + // return the display for the given point or wxNOT_FOUND + virtual int GetFromPoint(const wxPoint& pt) = 0; + + // return the display for the given window or wxNOT_FOUND + // + // the window pointer must not be NULL (i.e. caller should check it) + virtual int GetFromWindow(const wxWindow *window); +}; + +// ---------------------------------------------------------------------------- +// wxDisplayImpl: base class for all wxDisplay implementations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDisplayImpl +{ +public: + // virtual dtor for this base class + virtual ~wxDisplayImpl() { } + + + // return the full area of this display + virtual wxRect GetGeometry() const = 0; + + // return the area of the display available for normal windows + virtual wxRect GetClientArea() const { return GetGeometry(); } + + // return the name (may be empty) + virtual wxString GetName() const = 0; + + // return the index of this display + unsigned GetIndex() const { return m_index; } + + // return true if this is the primary monitor (usually one with index 0) + virtual bool IsPrimary() const { return GetIndex() == 0; } + + +#if wxUSE_DISPLAY + // implements wxDisplay::GetModes() + virtual wxArrayVideoModes GetModes(const wxVideoMode& mode) const = 0; + + // get current video mode + virtual wxVideoMode GetCurrentMode() const = 0; + + // change current mode, return true if succeeded, false otherwise + virtual bool ChangeMode(const wxVideoMode& mode) = 0; +#endif // wxUSE_DISPLAY + +protected: + // create the object providing access to the display with the given index + wxDisplayImpl(unsigned n) : m_index(n) { } + + + // the index of this display (0 is always the primary one) + const unsigned m_index; + + + friend class wxDisplayFactory; + + wxDECLARE_NO_COPY_CLASS(wxDisplayImpl); +}; + +// ---------------------------------------------------------------------------- +// wxDisplayFactorySingle +// ---------------------------------------------------------------------------- + +// this is a stub implementation using single/main display only, it is +// available even if wxUSE_DISPLAY == 0 +class WXDLLIMPEXP_CORE wxDisplayFactorySingle : public wxDisplayFactory +{ +public: + virtual wxDisplayImpl *CreateDisplay(unsigned n); + virtual unsigned GetCount() { return 1; } + virtual int GetFromPoint(const wxPoint& pt); +}; + +#endif // _WX_DISPLAY_IMPL_H_BASE_ + diff --git a/wxmsw/include/wx-3.0/wx/dlimpexp.h b/wxmsw/include/wx-3.0/wx/dlimpexp.h new file mode 100644 index 00000000..800b745f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dlimpexp.h @@ -0,0 +1,364 @@ +/* + * Name: wx/dlimpexp.h + * Purpose: Macros for declaring DLL-imported/exported functions + * Author: Vadim Zeitlin + * Modified by: + * Created: 16.10.2003 (extracted from wx/defs.h) + * Copyright: (c) 2003 Vadim Zeitlin + * Licence: wxWindows licence + */ + +/* + This is a C file, not C++ one, do not use C++ comments here! + */ + +#ifndef _WX_DLIMPEXP_H_ +#define _WX_DLIMPEXP_H_ + +#if defined(HAVE_VISIBILITY) +# define WXEXPORT __attribute__ ((visibility("default"))) +# define WXIMPORT __attribute__ ((visibility("default"))) +#elif defined(__WINDOWS__) + /* + __declspec works in BC++ 5 and later, Watcom C++ 11.0 and later as well + as VC++. + */ +# if defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__) +# define WXEXPORT __declspec(dllexport) +# define WXIMPORT __declspec(dllimport) + /* + While gcc also supports __declspec(dllexport), it creates unusably huge + DLL files since gcc 4.5 (while taking horribly long amounts of time), + see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43601. Because of this + we rely on binutils auto export/import support which seems to work + quite well for 4.5+. + */ +# elif defined(__GNUC__) && !wxCHECK_GCC_VERSION(4, 5) + /* + __declspec could be used here too but let's use the native + __attribute__ instead for clarity. + */ +# define WXEXPORT __attribute__((dllexport)) +# define WXIMPORT __attribute__((dllimport)) +# endif +#elif defined(__WXPM__) +# if defined (__WATCOMC__) +# define WXEXPORT __declspec(dllexport) + /* + __declspec(dllimport) prepends __imp to imported symbols. We do NOT + want that! + */ +# define WXIMPORT +# elif defined(__EMX__) +# define WXEXPORT +# define WXIMPORT +# elif (!(defined(__VISAGECPP__) && (__IBMCPP__ < 400 || __IBMC__ < 400 ))) +# define WXEXPORT _Export +# define WXIMPORT _Export +# endif +#elif defined(__CYGWIN__) +# define WXEXPORT __declspec(dllexport) +# define WXIMPORT __declspec(dllimport) +#endif + +/* for other platforms/compilers we don't anything */ +#ifndef WXEXPORT +# define WXEXPORT +# define WXIMPORT +#endif + +/* + We support building wxWidgets as a set of several libraries but we don't + support arbitrary combinations of libs/DLLs: either we build all of them as + DLLs (in which case WXMAKINGDLL is defined) or none (it isn't). + + However we have a problem because we need separate WXDLLIMPEXP versions for + different libraries as, for example, wxString class should be dllexported + when compiled in wxBase and dllimported otherwise, so we do define separate + WXMAKING/USINGDLL_XYZ constants for each component XYZ. + */ +#ifdef WXMAKINGDLL +# if wxUSE_BASE +# define WXMAKINGDLL_BASE +# endif + +# define WXMAKINGDLL_NET +# define WXMAKINGDLL_CORE +# define WXMAKINGDLL_ADV +# define WXMAKINGDLL_QA +# define WXMAKINGDLL_HTML +# define WXMAKINGDLL_GL +# define WXMAKINGDLL_XML +# define WXMAKINGDLL_XRC +# define WXMAKINGDLL_AUI +# define WXMAKINGDLL_PROPGRID +# define WXMAKINGDLL_RIBBON +# define WXMAKINGDLL_RICHTEXT +# define WXMAKINGDLL_MEDIA +# define WXMAKINGDLL_STC +# define WXMAKINGDLL_WEBVIEW +#endif /* WXMAKINGDLL */ + +/* + WXDLLIMPEXP_CORE maps to export declaration when building the DLL, to import + declaration if using it or to nothing at all if we don't use wxWin as DLL + */ +#ifdef WXMAKINGDLL_BASE +# define WXDLLIMPEXP_BASE WXEXPORT +# define WXDLLIMPEXP_DATA_BASE(type) WXEXPORT type +# if defined(HAVE_VISIBILITY) +# define WXDLLIMPEXP_INLINE_BASE WXEXPORT +# else +# define WXDLLIMPEXP_INLINE_BASE +# endif +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_BASE WXIMPORT +# define WXDLLIMPEXP_DATA_BASE(type) WXIMPORT type +# if defined(HAVE_VISIBILITY) +# define WXDLLIMPEXP_INLINE_BASE WXIMPORT +# else +# define WXDLLIMPEXP_INLINE_BASE +# endif +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_BASE +# define WXDLLIMPEXP_DATA_BASE(type) type +# define WXDLLIMPEXP_INLINE_BASE +#endif + +#ifdef WXMAKINGDLL_NET +# define WXDLLIMPEXP_NET WXEXPORT +# define WXDLLIMPEXP_DATA_NET(type) WXEXPORT type +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_NET WXIMPORT +# define WXDLLIMPEXP_DATA_NET(type) WXIMPORT type +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_NET +# define WXDLLIMPEXP_DATA_NET(type) type +#endif + +#ifdef WXMAKINGDLL_CORE +# define WXDLLIMPEXP_CORE WXEXPORT +# define WXDLLIMPEXP_DATA_CORE(type) WXEXPORT type +# if defined(HAVE_VISIBILITY) +# define WXDLLIMPEXP_INLINE_CORE WXEXPORT +# else +# define WXDLLIMPEXP_INLINE_CORE +# endif +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_CORE WXIMPORT +# define WXDLLIMPEXP_DATA_CORE(type) WXIMPORT type +# if defined(HAVE_VISIBILITY) +# define WXDLLIMPEXP_INLINE_CORE WXIMPORT +# else +# define WXDLLIMPEXP_INLINE_CORE +# endif +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_CORE +# define WXDLLIMPEXP_DATA_CORE(type) type +# define WXDLLIMPEXP_INLINE_CORE +#endif + +#ifdef WXMAKINGDLL_ADV +# define WXDLLIMPEXP_ADV WXEXPORT +# define WXDLLIMPEXP_DATA_ADV(type) WXEXPORT type +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_ADV WXIMPORT +# define WXDLLIMPEXP_DATA_ADV(type) WXIMPORT type +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_ADV +# define WXDLLIMPEXP_DATA_ADV(type) type +#endif + +#ifdef WXMAKINGDLL_QA +# define WXDLLIMPEXP_QA WXEXPORT +# define WXDLLIMPEXP_DATA_QA(type) WXEXPORT type +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_QA WXIMPORT +# define WXDLLIMPEXP_DATA_QA(type) WXIMPORT type +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_QA +# define WXDLLIMPEXP_DATA_QA(type) type +#endif + +#ifdef WXMAKINGDLL_HTML +# define WXDLLIMPEXP_HTML WXEXPORT +# define WXDLLIMPEXP_DATA_HTML(type) WXEXPORT type +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_HTML WXIMPORT +# define WXDLLIMPEXP_DATA_HTML(type) WXIMPORT type +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_HTML +# define WXDLLIMPEXP_DATA_HTML(type) type +#endif + +#ifdef WXMAKINGDLL_GL +# define WXDLLIMPEXP_GL WXEXPORT +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_GL WXIMPORT +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_GL +#endif + +#ifdef WXMAKINGDLL_XML +# define WXDLLIMPEXP_XML WXEXPORT +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_XML WXIMPORT +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_XML +#endif + +#ifdef WXMAKINGDLL_XRC +# define WXDLLIMPEXP_XRC WXEXPORT +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_XRC WXIMPORT +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_XRC +#endif + +#ifdef WXMAKINGDLL_AUI +# define WXDLLIMPEXP_AUI WXEXPORT +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_AUI WXIMPORT +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_AUI +#endif + +#ifdef WXMAKINGDLL_PROPGRID +# define WXDLLIMPEXP_PROPGRID WXEXPORT +# define WXDLLIMPEXP_DATA_PROPGRID(type) WXEXPORT type +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_PROPGRID WXIMPORT +# define WXDLLIMPEXP_DATA_PROPGRID(type) WXIMPORT type +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_PROPGRID +# define WXDLLIMPEXP_DATA_PROPGRID(type) type +#endif + +#ifdef WXMAKINGDLL_RIBBON +# define WXDLLIMPEXP_RIBBON WXEXPORT +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_RIBBON WXIMPORT +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_RIBBON +#endif + +#ifdef WXMAKINGDLL_RICHTEXT +# define WXDLLIMPEXP_RICHTEXT WXEXPORT +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_RICHTEXT WXIMPORT +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_RICHTEXT +#endif + +#ifdef WXMAKINGDLL_MEDIA +# define WXDLLIMPEXP_MEDIA WXEXPORT +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_MEDIA WXIMPORT +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_MEDIA +#endif + +#ifdef WXMAKINGDLL_STC +# define WXDLLIMPEXP_STC WXEXPORT +# define WXDLLIMPEXP_DATA_STC(type) WXEXPORT type +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_STC WXIMPORT +# define WXDLLIMPEXP_DATA_STC(type) WXIMPORT type +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_STC +# define WXDLLIMPEXP_DATA_STC(type) type +#endif + +#ifdef WXMAKINGDLL_WEBVIEW +# define WXDLLIMPEXP_WEBVIEW WXEXPORT +# define WXDLLIMPEXP_DATA_WEBVIEW(type) WXEXPORT type +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_WEBVIEW WXIMPORT +# define WXDLLIMPEXP_DATA_WEBVIEW(type) WXIMPORT type +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_WEBVIEW +# define WXDLLIMPEXP_DATA_WEBVIEW(type) type +#endif + +/* + GCC warns about using __attribute__ (and also __declspec in mingw32 case) on + forward declarations while MSVC complains about forward declarations without + __declspec for the classes later declared with it, so we need a separate set + of macros for forward declarations to hide this difference: + */ +#if defined(HAVE_VISIBILITY) || (defined(__WINDOWS__) && defined(__GNUC__)) + #define WXDLLIMPEXP_FWD_BASE + #define WXDLLIMPEXP_FWD_NET + #define WXDLLIMPEXP_FWD_CORE + #define WXDLLIMPEXP_FWD_ADV + #define WXDLLIMPEXP_FWD_QA + #define WXDLLIMPEXP_FWD_HTML + #define WXDLLIMPEXP_FWD_GL + #define WXDLLIMPEXP_FWD_XML + #define WXDLLIMPEXP_FWD_XRC + #define WXDLLIMPEXP_FWD_AUI + #define WXDLLIMPEXP_FWD_PROPGRID + #define WXDLLIMPEXP_FWD_RIBBON + #define WXDLLIMPEXP_FWD_RICHTEXT + #define WXDLLIMPEXP_FWD_MEDIA + #define WXDLLIMPEXP_FWD_STC + #define WXDLLIMPEXP_FWD_WEBVIEW +#else + #define WXDLLIMPEXP_FWD_BASE WXDLLIMPEXP_BASE + #define WXDLLIMPEXP_FWD_NET WXDLLIMPEXP_NET + #define WXDLLIMPEXP_FWD_CORE WXDLLIMPEXP_CORE + #define WXDLLIMPEXP_FWD_ADV WXDLLIMPEXP_ADV + #define WXDLLIMPEXP_FWD_QA WXDLLIMPEXP_QA + #define WXDLLIMPEXP_FWD_HTML WXDLLIMPEXP_HTML + #define WXDLLIMPEXP_FWD_GL WXDLLIMPEXP_GL + #define WXDLLIMPEXP_FWD_XML WXDLLIMPEXP_XML + #define WXDLLIMPEXP_FWD_XRC WXDLLIMPEXP_XRC + #define WXDLLIMPEXP_FWD_AUI WXDLLIMPEXP_AUI + #define WXDLLIMPEXP_FWD_PROPGRID WXDLLIMPEXP_PROPGRID + #define WXDLLIMPEXP_FWD_RIBBON WXDLLIMPEXP_RIBBON + #define WXDLLIMPEXP_FWD_RICHTEXT WXDLLIMPEXP_RICHTEXT + #define WXDLLIMPEXP_FWD_MEDIA WXDLLIMPEXP_MEDIA + #define WXDLLIMPEXP_FWD_STC WXDLLIMPEXP_STC + #define WXDLLIMPEXP_FWD_WEBVIEW WXDLLIMPEXP_WEBVIEW +#endif + +/* for backwards compatibility, define suffix-less versions too */ +#define WXDLLEXPORT WXDLLIMPEXP_CORE +#define WXDLLEXPORT_DATA WXDLLIMPEXP_DATA_CORE + +/* + MSVC up to 6.0 needs to be explicitly told to export template instantiations + used by the DLL clients, use this macro to do it like this: + + template class Foo { ... }; + WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( Foo ) + + (notice that currently we only need this for wxBase and wxCore libraries) + */ +#if defined(__VISUALC__) && (__VISUALC__ <= 1200) + #ifdef WXMAKINGDLL_BASE + #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl) \ + template class WXDLLIMPEXP_BASE decl; + #define WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE(decl) \ + template class WXDLLIMPEXP_CORE decl; + #else + /* + We need to disable this warning when using this macro, as + recommended by Microsoft itself: + + http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b168958 + */ + #pragma warning(disable:4231) + + #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl) \ + extern template class WXDLLIMPEXP_BASE decl; + #define WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE(decl) \ + extern template class WXDLLIMPEXP_CORE decl; + #endif +#else /* not VC <= 6 */ + #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl) + #define WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE(decl) +#endif /* VC6/others */ + +#endif /* _WX_DLIMPEXP_H_ */ + diff --git a/wxmsw/include/wx-3.0/wx/dlist.h b/wxmsw/include/wx-3.0/wx/dlist.h new file mode 100644 index 00000000..b69f617d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dlist.h @@ -0,0 +1,850 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/dlist.h +// Purpose: wxDList which is a template version of wxList +// Author: Robert Roebling +// Created: 18.09.2008 +// Copyright: (c) 2008 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DLIST_H_ +#define _WX_DLIST_H_ + +#include "wx/defs.h" +#include "wx/utils.h" + +#if wxUSE_STD_CONTAINERS + +#include "wx/beforestd.h" +#include +#include +#include +#include "wx/afterstd.h" + +template +class wxDList: public std::list +{ +private: + bool m_destroy; + typedef std::list BaseListType; + typedef wxDList ListType; + +public: + typedef typename BaseListType::iterator iterator; + + class compatibility_iterator + { + private: + /* Workaround for broken VC6 nested class name resolution */ + typedef typename BaseListType::iterator iterator; + friend class wxDList; + + iterator m_iter; + ListType *m_list; + + public: + compatibility_iterator() + : m_iter(), m_list( NULL ) {} + compatibility_iterator( ListType* li, iterator i ) + : m_iter( i ), m_list( li ) {} + compatibility_iterator( const ListType* li, iterator i ) + : m_iter( i ), m_list( const_cast(li) ) {} + + compatibility_iterator* operator->() { return this; } + const compatibility_iterator* operator->() const { return this; } + + bool operator==(const compatibility_iterator& i) const + { + wxASSERT_MSG( m_list && i.m_list, + "comparing invalid iterators is illegal" ); + return (m_list == i.m_list) && (m_iter == i.m_iter); + } + bool operator!=(const compatibility_iterator& i) const + { return !( operator==( i ) ); } + operator bool() const + { return m_list ? m_iter != m_list->end() : false; } + bool operator !() const + { return !( operator bool() ); } + + T* GetData() const { return *m_iter; } + void SetData( T* e ) { *m_iter = e; } + + compatibility_iterator GetNext() const + { + iterator i = m_iter; + return compatibility_iterator( m_list, ++i ); + } + + compatibility_iterator GetPrevious() const + { + if ( m_iter == m_list->begin() ) + return compatibility_iterator(); + + iterator i = m_iter; + return compatibility_iterator( m_list, --i ); + } + + int IndexOf() const + { + return *this ? std::distance( m_list->begin(), m_iter ) + : wxNOT_FOUND; + } + }; + +public: + wxDList() : m_destroy( false ) {} + + ~wxDList() { Clear(); } + + compatibility_iterator Find( const T* e ) const + { + return compatibility_iterator( this, + std::find( const_cast(this)->begin(), + const_cast(this)->end(), e ) ); + } + + bool IsEmpty() const + { return this->empty(); } + size_t GetCount() const + { return this->size(); } + + compatibility_iterator Item( size_t idx ) const + { + iterator i = const_cast(this)->begin(); + std::advance( i, idx ); + return compatibility_iterator( this, i ); + } + + T* operator[](size_t idx) const + { + return Item(idx).GetData(); + } + + compatibility_iterator GetFirst() const + { + return compatibility_iterator( this, const_cast(this)->begin() ); + } + compatibility_iterator GetLast() const + { + iterator i = const_cast(this)->end(); + return compatibility_iterator( this, !(this->empty()) ? --i : i ); + } + compatibility_iterator Member( T* e ) const + { return Find( e ); } + compatibility_iterator Nth( int n ) const + { return Item( n ); } + int IndexOf( T* e ) const + { return Find( e ).IndexOf(); } + + compatibility_iterator Append( T* e ) + { + this->push_back( e ); + return GetLast(); + } + + compatibility_iterator Insert( T* e ) + { + this->push_front( e ); + return compatibility_iterator( this, this->begin() ); + } + + compatibility_iterator Insert( compatibility_iterator & i, T* e ) + { + return compatibility_iterator( this, this->insert( i.m_iter, e ) ); + } + + compatibility_iterator Insert( size_t idx, T* e ) + { + return compatibility_iterator( this, + this->insert( Item( idx ).m_iter, e ) ); + } + + void DeleteContents( bool destroy ) + { m_destroy = destroy; } + + bool GetDeleteContents() const + { return m_destroy; } + + void Erase( const compatibility_iterator& i ) + { + if ( m_destroy ) + delete i->GetData(); + this->erase( i.m_iter ); + } + + bool DeleteNode( const compatibility_iterator& i ) + { + if( i ) + { + Erase( i ); + return true; + } + return false; + } + + bool DeleteObject( T* e ) + { + return DeleteNode( Find( e ) ); + } + + void Clear() + { + if ( m_destroy ) + { + iterator it, en; + for ( it = this->begin(), en = this->end(); it != en; ++it ) + delete *it; + } + this->clear(); + } +}; + +#else // !wxUSE_STD_CONTAINERS + +template +class wxDList +{ +public: + class Node + { + public: + Node(wxDList *list = NULL, + Node *previous = NULL, + Node *next = NULL, + T *data = NULL) + { + m_list = list; + m_previous = previous; + m_next = next; + m_data = data; + if (previous) + previous->m_next = this; + if (next) + next->m_previous = this; + } + + ~Node() + { + // handle the case when we're being deleted from the list by + // the user (i.e. not by the list itself from DeleteNode) - + // we must do it for compatibility with old code + if (m_list != NULL) + m_list->DetachNode(this); + } + + void DeleteData() + { + delete m_data; + } + + Node *GetNext() const { return m_next; } + Node *GetPrevious() const { return m_previous; } + T *GetData() const { return m_data; } + T **GetDataPtr() const { return &(wx_const_cast(nodetype*,this)->m_data); } + void SetData( T *data ) { m_data = data; } + + int IndexOf() const + { + wxCHECK_MSG( m_list, wxNOT_FOUND, + "node doesn't belong to a list in IndexOf" ); + + int i; + Node *prev = m_previous; + for( i = 0; prev; i++ ) + prev = prev->m_previous; + return i; + } + + private: + T *m_data; // user data + Node *m_next, // next and previous nodes in the list + *m_previous; + wxDList *m_list; // list we belong to + + friend class wxDList; + }; + + typedef Node nodetype; + + class compatibility_iterator + { + public: + compatibility_iterator(nodetype *ptr = NULL) : m_ptr(ptr) { } + nodetype *operator->() const { return m_ptr; } + operator nodetype *() const { return m_ptr; } + + private: + nodetype *m_ptr; + }; + +private: + void Init() + { + m_nodeFirst = + m_nodeLast = NULL; + m_count = 0; + m_destroy = false; + } + + void DoDeleteNode( nodetype *node ) + { + if ( m_destroy ) + node->DeleteData(); + // so that the node knows that it's being deleted by the list + node->m_list = NULL; + delete node; + } + + size_t m_count; // number of elements in the list + bool m_destroy; // destroy user data when deleting list items? + nodetype *m_nodeFirst, // pointers to the head and tail of the list + *m_nodeLast; + +public: + wxDList() + { + Init(); + } + + wxDList( const wxDList& list ) + { + Init(); + Assign(list); + } + + wxDList( size_t count, T *elements[] ) + { + Init(); + size_t n; + for (n = 0; n < count; n++) + Append( elements[n] ); + } + + wxDList& operator=( const wxDList& list ) + { + if (&list != this) + Assign(list); + return *this; + } + + ~wxDList() + { + nodetype *each = m_nodeFirst; + while ( each != NULL ) + { + nodetype *next = each->GetNext(); + DoDeleteNode(each); + each = next; + } + } + + void Assign(const wxDList &list) + { + wxASSERT_MSG( !list.m_destroy, + "copying list which owns it's elements is a bad idea" ); + Clear(); + m_destroy = list.m_destroy; + m_nodeFirst = NULL; + m_nodeLast = NULL; + nodetype* node; + for (node = list.GetFirst(); node; node = node->GetNext() ) + Append(node->GetData()); + wxASSERT_MSG( m_count == list.m_count, "logic error in Assign()" ); + } + + nodetype *Append( T *object ) + { + nodetype *node = new nodetype( this, m_nodeLast, NULL, object ); + + if ( !m_nodeFirst ) + { + m_nodeFirst = node; + m_nodeLast = m_nodeFirst; + } + else + { + m_nodeLast->m_next = node; + m_nodeLast = node; + } + m_count++; + return node; + } + + nodetype *Insert( T* object ) + { + return Insert( NULL, object ); + } + + nodetype *Insert( size_t pos, T* object ) + { + if (pos == m_count) + return Append( object ); + else + return Insert( Item(pos), object ); + } + + nodetype *Insert( nodetype *position, T* object ) + { + wxCHECK_MSG( !position || position->m_list == this, NULL, + "can't insert before a node from another list" ); + + // previous and next node for the node being inserted + nodetype *prev, *next; + if ( position ) + { + prev = position->GetPrevious(); + next = position; + } + else + { + // inserting in the beginning of the list + prev = NULL; + next = m_nodeFirst; + } + nodetype *node = new nodetype( this, prev, next, object ); + if ( !m_nodeFirst ) + m_nodeLast = node; + if ( prev == NULL ) + m_nodeFirst = node; + m_count++; + return node; + } + + nodetype *GetFirst() const { return m_nodeFirst; } + nodetype *GetLast() const { return m_nodeLast; } + size_t GetCount() const { return m_count; } + bool IsEmpty() const { return m_count == 0; } + + void DeleteContents(bool destroy) { m_destroy = destroy; } + bool GetDeleteContents() const { return m_destroy; } + + nodetype *Item(size_t index) const + { + for ( nodetype *current = GetFirst(); current; current = current->GetNext() ) + { + if ( index-- == 0 ) + return current; + } + wxFAIL_MSG( "invalid index in Item()" ); + return NULL; + } + + T *operator[](size_t index) const + { + nodetype *node = Item(index); + return node ? node->GetData() : NULL; + } + + nodetype *DetachNode( nodetype *node ) + { + wxCHECK_MSG( node, NULL, "detaching NULL wxNodeBase" ); + wxCHECK_MSG( node->m_list == this, NULL, + "detaching node which is not from this list" ); + // update the list + nodetype **prevNext = node->GetPrevious() ? &node->GetPrevious()->m_next + : &m_nodeFirst; + nodetype **nextPrev = node->GetNext() ? &node->GetNext()->m_previous + : &m_nodeLast; + *prevNext = node->GetNext(); + *nextPrev = node->GetPrevious(); + m_count--; + // mark the node as not belonging to this list any more + node->m_list = NULL; + return node; + } + + void Erase( nodetype *node ) + { + DeleteNode(node); + } + + bool DeleteNode( nodetype *node ) + { + if ( !DetachNode(node) ) + return false; + DoDeleteNode(node); + return true; + } + + bool DeleteObject( T *object ) + { + for ( nodetype *current = GetFirst(); current; current = current->GetNext() ) + { + if ( current->GetData() == object ) + { + DeleteNode(current); + return true; + } + } + // not found + return false; + } + + nodetype *Find(const T *object) const + { + for ( nodetype *current = GetFirst(); current; current = current->GetNext() ) + { + if ( current->GetData() == object ) + return current; + } + // not found + return NULL; + } + + int IndexOf(const T *object) const + { + int n = 0; + for ( nodetype *current = GetFirst(); current; current = current->GetNext() ) + { + if ( current->GetData() == object ) + return n; + n++; + } + return wxNOT_FOUND; + } + + void Clear() + { + nodetype *current = m_nodeFirst; + while ( current ) + { + nodetype *next = current->GetNext(); + DoDeleteNode(current); + current = next; + } + m_nodeFirst = + m_nodeLast = NULL; + m_count = 0; + } + + void Reverse() + { + nodetype * node = m_nodeFirst; + nodetype* tmp; + while (node) + { + // swap prev and next pointers + tmp = node->m_next; + node->m_next = node->m_previous; + node->m_previous = tmp; + // this is the node that was next before swapping + node = tmp; + } + // swap first and last node + tmp = m_nodeFirst; m_nodeFirst = m_nodeLast; m_nodeLast = tmp; + } + + void DeleteNodes(nodetype* first, nodetype* last) + { + nodetype * node = first; + while (node != last) + { + nodetype* next = node->GetNext(); + DeleteNode(node); + node = next; + } + } + + void ForEach(wxListIterateFunction F) + { + for ( nodetype *current = GetFirst(); current; current = current->GetNext() ) + (*F)(current->GetData()); + } + + T *FirstThat(wxListIterateFunction F) + { + for ( nodetype *current = GetFirst(); current; current = current->GetNext() ) + { + if ( (*F)(current->GetData()) ) + return current->GetData(); + } + return NULL; + } + + T *LastThat(wxListIterateFunction F) + { + for ( nodetype *current = GetLast(); current; current = current->GetPrevious() ) + { + if ( (*F)(current->GetData()) ) + return current->GetData(); + } + return NULL; + } + + /* STL interface */ +public: + typedef size_t size_type; + typedef int difference_type; + typedef T* value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + + class iterator + { + public: + typedef nodetype Node; + typedef iterator itor; + typedef T* value_type; + typedef value_type* ptr_type; + typedef value_type& reference; + + Node* m_node; + Node* m_init; + public: + typedef reference reference_type; + typedef ptr_type pointer_type; + + iterator(Node* node, Node* init) : m_node(node), m_init(init) {} + iterator() : m_node(NULL), m_init(NULL) { } + reference_type operator*() const + { return *m_node->GetDataPtr(); } + // ptrop + itor& operator++() { m_node = m_node->GetNext(); return *this; } + const itor operator++(int) + { itor tmp = *this; m_node = m_node->GetNext(); return tmp; } + itor& operator--() + { + m_node = m_node ? m_node->GetPrevious() : m_init; + return *this; + } + const itor operator--(int) + { + itor tmp = *this; + m_node = m_node ? m_node->GetPrevious() : m_init; + return tmp; + } + bool operator!=(const itor& it) const + { return it.m_node != m_node; } + bool operator==(const itor& it) const + { return it.m_node == m_node; } + }; + class const_iterator + { + public: + typedef nodetype Node; + typedef T* value_type; + typedef const value_type& const_reference; + typedef const_iterator itor; + typedef value_type* ptr_type; + + Node* m_node; + Node* m_init; + public: + typedef const_reference reference_type; + typedef const ptr_type pointer_type; + + const_iterator(Node* node, Node* init) + : m_node(node), m_init(init) { } + const_iterator() : m_node(NULL), m_init(NULL) { } + const_iterator(const iterator& it) + : m_node(it.m_node), m_init(it.m_init) { } + reference_type operator*() const + { return *m_node->GetDataPtr(); } + // ptrop + itor& operator++() { m_node = m_node->GetNext(); return *this; } + const itor operator++(int) + { itor tmp = *this; m_node = m_node->GetNext(); return tmp; } + itor& operator--() + { + m_node = m_node ? m_node->GetPrevious() : m_init; + return *this; + } + const itor operator--(int) + { + itor tmp = *this; + m_node = m_node ? m_node->GetPrevious() : m_init; + return tmp; + } + bool operator!=(const itor& it) const + { return it.m_node != m_node; } + bool operator==(const itor& it) const + { return it.m_node == m_node; } + }; + + class reverse_iterator + { + public: + typedef nodetype Node; + typedef T* value_type; + typedef reverse_iterator itor; + typedef value_type* ptr_type; + typedef value_type& reference; + + Node* m_node; + Node* m_init; + public: + typedef reference reference_type; + typedef ptr_type pointer_type; + + reverse_iterator(Node* node, Node* init) + : m_node(node), m_init(init) { } + reverse_iterator() : m_node(NULL), m_init(NULL) { } + reference_type operator*() const + { return *m_node->GetDataPtr(); } + // ptrop + itor& operator++() + { m_node = m_node->GetPrevious(); return *this; } + const itor operator++(int) + { itor tmp = *this; m_node = m_node->GetPrevious(); return tmp; } + itor& operator--() + { m_node = m_node ? m_node->GetNext() : m_init; return *this; } + const itor operator--(int) + { + itor tmp = *this; + m_node = m_node ? m_node->GetNext() : m_init; + return tmp; + } + bool operator!=(const itor& it) const + { return it.m_node != m_node; } + bool operator==(const itor& it) const + { return it.m_node == m_node; } + }; + + class const_reverse_iterator + { + public: + typedef nodetype Node; + typedef T* value_type; + typedef const_reverse_iterator itor; + typedef value_type* ptr_type; + typedef const value_type& const_reference; + + Node* m_node; + Node* m_init; + public: + typedef const_reference reference_type; + typedef const ptr_type pointer_type; + + const_reverse_iterator(Node* node, Node* init) + : m_node(node), m_init(init) { } + const_reverse_iterator() : m_node(NULL), m_init(NULL) { } + const_reverse_iterator(const reverse_iterator& it) + : m_node(it.m_node), m_init(it.m_init) { } + reference_type operator*() const + { return *m_node->GetDataPtr(); } + // ptrop + itor& operator++() + { m_node = m_node->GetPrevious(); return *this; } + const itor operator++(int) + { itor tmp = *this; m_node = m_node->GetPrevious(); return tmp; } + itor& operator--() + { m_node = m_node ? m_node->GetNext() : m_init; return *this;} + const itor operator--(int) + { + itor tmp = *this; + m_node = m_node ? m_node->GetNext() : m_init; + return tmp; + } + bool operator!=(const itor& it) const + { return it.m_node != m_node; } + bool operator==(const itor& it) const + { return it.m_node == m_node; } + }; + + wxEXPLICIT wxDList(size_type n, const_reference v = value_type()) + { assign(n, v); } + wxDList(const const_iterator& first, const const_iterator& last) + { assign(first, last); } + iterator begin() { return iterator(GetFirst(), GetLast()); } + const_iterator begin() const + { return const_iterator(GetFirst(), GetLast()); } + iterator end() { return iterator(NULL, GetLast()); } + const_iterator end() const { return const_iterator(NULL, GetLast()); } + reverse_iterator rbegin() + { return reverse_iterator(GetLast(), GetFirst()); } + const_reverse_iterator rbegin() const + { return const_reverse_iterator(GetLast(), GetFirst()); } + reverse_iterator rend() { return reverse_iterator(NULL, GetFirst()); } + const_reverse_iterator rend() const + { return const_reverse_iterator(NULL, GetFirst()); } + void resize(size_type n, value_type v = value_type()) + { + while (n < size()) + pop_back(); + while (n > size()) + push_back(v); + } + size_type size() const { return GetCount(); } + size_type max_size() const { return INT_MAX; } + bool empty() const { return IsEmpty(); } + reference front() { return *begin(); } + const_reference front() const { return *begin(); } + reference back() { iterator tmp = end(); return *--tmp; } + const_reference back() const { const_iterator tmp = end(); return *--tmp; } + void push_front(const_reference v = value_type()) + { Insert(GetFirst(), v); } + void pop_front() { DeleteNode(GetFirst()); } + void push_back(const_reference v = value_type()) + { Append( v ); } + void pop_back() { DeleteNode(GetLast()); } + void assign(const_iterator first, const const_iterator& last) + { + clear(); + for(; first != last; ++first) + Append(*first); + } + void assign(size_type n, const_reference v = value_type()) + { + clear(); + for(size_type i = 0; i < n; ++i) + Append(v); + } + iterator insert(const iterator& it, const_reference v) + { + if (it == end()) + Append( v ); + else + Insert(it.m_node,v); + iterator itprev(it); + return itprev--; + } + void insert(const iterator& it, size_type n, const_reference v) + { + for(size_type i = 0; i < n; ++i) + Insert(it.m_node, v); + } + void insert(const iterator& it, const_iterator first, const const_iterator& last) + { + for(; first != last; ++first) + Insert(it.m_node, *first); + } + iterator erase(const iterator& it) + { + iterator next = iterator(it.m_node->GetNext(), GetLast()); + DeleteNode(it.m_node); return next; + } + iterator erase(const iterator& first, const iterator& last) + { + iterator next = last; ++next; + DeleteNodes(first.m_node, last.m_node); + return next; + } + void clear() { Clear(); } + void splice(const iterator& it, wxDList& l, const iterator& first, const iterator& last) + { insert(it, first, last); l.erase(first, last); } + void splice(const iterator& it, wxDList& l) + { splice(it, l, l.begin(), l.end() ); } + void splice(const iterator& it, wxDList& l, const iterator& first) + { + iterator tmp = first; ++tmp; + if(it == first || it == tmp) return; + insert(it, *first); + l.erase(first); + } + void remove(const_reference v) + { DeleteObject(v); } + void reverse() + { Reverse(); } + /* void swap(list& l) + { + { size_t t = m_count; m_count = l.m_count; l.m_count = t; } + { bool t = m_destroy; m_destroy = l.m_destroy; l.m_destroy = t; } + { wxNodeBase* t = m_nodeFirst; m_nodeFirst = l.m_nodeFirst; l.m_nodeFirst = t; } + { wxNodeBase* t = m_nodeLast; m_nodeLast = l.m_nodeLast; l.m_nodeLast = t; } + { wxKeyType t = m_keyType; m_keyType = l.m_keyType; l.m_keyType = t; } + } */ +}; + +#endif // wxUSE_STD_CONTAINERS/!wxUSE_STD_CONTAINERS + +#endif // _WX_DLIST_H_ diff --git a/wxmsw/include/wx-3.0/wx/dnd.h b/wxmsw/include/wx-3.0/wx/dnd.h new file mode 100644 index 00000000..9d9f2e25 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dnd.h @@ -0,0 +1,266 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/dnd.h +// Purpose: Drag and drop classes declarations +// Author: Vadim Zeitlin, Robert Roebling +// Modified by: +// Created: 26.05.99 +// Copyright: (c) wxWidgets Team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DND_H_BASE_ +#define _WX_DND_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_DRAG_AND_DROP + +#include "wx/dataobj.h" +#include "wx/cursor.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// flags for wxDropSource::DoDragDrop() +// +// NB: wxDrag_CopyOnly must be 0 (== FALSE) and wxDrag_AllowMove must be 1 +// (== TRUE) for compatibility with the old DoDragDrop(bool) method! +enum +{ + wxDrag_CopyOnly = 0, // allow only copying + wxDrag_AllowMove = 1, // allow moving (copying is always allowed) + wxDrag_DefaultMove = 3 // the default operation is move, not copy +}; + +// result of wxDropSource::DoDragDrop() call +enum wxDragResult +{ + wxDragError, // error prevented the d&d operation from completing + wxDragNone, // drag target didn't accept the data + wxDragCopy, // the data was successfully copied + wxDragMove, // the data was successfully moved (MSW only) + wxDragLink, // operation is a drag-link + wxDragCancel // the operation was cancelled by user (not an error) +}; + +// return true if res indicates that something was done during a dnd operation, +// i.e. is neither error nor none nor cancel +WXDLLIMPEXP_CORE bool wxIsDragResultOk(wxDragResult res); + +// ---------------------------------------------------------------------------- +// wxDropSource is the object you need to create (and call DoDragDrop on it) +// to initiate a drag-and-drop operation +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDropSourceBase +{ +public: + wxDropSourceBase(const wxCursor &cursorCopy = wxNullCursor, + const wxCursor &cursorMove = wxNullCursor, + const wxCursor &cursorStop = wxNullCursor) + : m_cursorCopy(cursorCopy), + m_cursorMove(cursorMove), + m_cursorStop(cursorStop) + { m_data = NULL; } + virtual ~wxDropSourceBase() { } + + // set the data which is transferred by drag and drop + void SetData(wxDataObject& data) + { m_data = &data; } + + wxDataObject *GetDataObject() + { return m_data; } + + // set the icon corresponding to given drag result + void SetCursor(wxDragResult res, const wxCursor& cursor) + { + if ( res == wxDragCopy ) + m_cursorCopy = cursor; + else if ( res == wxDragMove ) + m_cursorMove = cursor; + else + m_cursorStop = cursor; + } + + // start drag action, see enum wxDragResult for return value description + // + // if flags contains wxDrag_AllowMove, moving (and only copying) data is + // allowed, if it contains wxDrag_DefaultMove (which includes the previous + // flag), it is even the default operation + virtual wxDragResult DoDragDrop(int flags = wxDrag_CopyOnly) = 0; + + // override to give feedback depending on the current operation result + // "effect" and return true if you did something, false to let the library + // give the default feedback + virtual bool GiveFeedback(wxDragResult WXUNUSED(effect)) { return false; } + +protected: + const wxCursor& GetCursor(wxDragResult res) const + { + if ( res == wxDragCopy ) + return m_cursorCopy; + else if ( res == wxDragMove ) + return m_cursorMove; + else + return m_cursorStop; + } + + // the data we're dragging + wxDataObject *m_data; + + // the cursors to use for feedback + wxCursor m_cursorCopy, + m_cursorMove, + m_cursorStop; + + wxDECLARE_NO_COPY_CLASS(wxDropSourceBase); +}; + +// ---------------------------------------------------------------------------- +// wxDropTarget should be associated with a window if it wants to be able to +// receive data via drag and drop. +// +// To use this class, you should derive from wxDropTarget and implement +// OnData() pure virtual method. You may also wish to override OnDrop() if you +// want to accept the data only inside some region of the window (this may +// avoid having to copy the data to this application which happens only when +// OnData() is called) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDropTargetBase +{ +public: + // ctor takes a pointer to heap-allocated wxDataObject which will be owned + // by wxDropTarget and deleted by it automatically. If you don't give it + // here, you can use SetDataObject() later. + wxDropTargetBase(wxDataObject *dataObject = NULL) + { m_dataObject = dataObject; m_defaultAction = wxDragNone; } + // dtor deletes our data object + virtual ~wxDropTargetBase() + { delete m_dataObject; } + + // get/set the associated wxDataObject + wxDataObject *GetDataObject() const + { return m_dataObject; } + void SetDataObject(wxDataObject *dataObject) + { if (m_dataObject) delete m_dataObject; + m_dataObject = dataObject; } + + // these functions are called when data is moved over position (x, y) and + // may return either wxDragCopy, wxDragMove or wxDragNone depending on + // what would happen if the data were dropped here. + // + // the last parameter is what would happen by default and is determined by + // the platform-specific logic (for example, under Windows it's wxDragCopy + // if Ctrl key is pressed and wxDragMove otherwise) except that it will + // always be wxDragNone if the carried data is in an unsupported format. + + // called when the mouse enters the window (only once until OnLeave()) + virtual wxDragResult OnEnter(wxCoord x, wxCoord y, wxDragResult def) + { return OnDragOver(x, y, def); } + + // called when the mouse moves in the window - shouldn't take long to + // execute or otherwise mouse movement would be too slow + virtual wxDragResult OnDragOver(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), + wxDragResult def) + { return def; } + + // called when mouse leaves the window: might be used to remove the + // feedback which was given in OnEnter() + virtual void OnLeave() { } + + // this function is called when data is dropped at position (x, y) - if it + // returns true, OnData() will be called immediately afterwards which will + // allow to retrieve the data dropped. + virtual bool OnDrop(wxCoord x, wxCoord y) = 0; + + // called after OnDrop() returns TRUE: you will usually just call + // GetData() from here and, probably, also refresh something to update the + // new data and, finally, return the code indicating how did the operation + // complete (returning default value in case of success and wxDragError on + // failure is usually ok) + virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def) = 0; + + // may be called *only* from inside OnData() and will fill m_dataObject + // with the data from the drop source if it returns true + virtual bool GetData() = 0; + + // sets the default action for drag and drop: + // use wxDragMove or wxDragCopy to set deafult action to move or copy + // and use wxDragNone (default) to set default action specified by + // initialization of draging (see wxDropSourceBase::DoDragDrop()) + void SetDefaultAction(wxDragResult action) + { m_defaultAction = action; } + + // returns default action for drag and drop or + // wxDragNone if this not specified + wxDragResult GetDefaultAction() + { return m_defaultAction; } + +protected: + wxDataObject *m_dataObject; + wxDragResult m_defaultAction; + + wxDECLARE_NO_COPY_CLASS(wxDropTargetBase); +}; + +// ---------------------------------------------------------------------------- +// include platform dependent class declarations +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/ole/dropsrc.h" + #include "wx/msw/ole/droptgt.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/dnd.h" +#elif defined(__WXX11__) + #include "wx/x11/dnd.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/dnd.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/dnd.h" +#elif defined(__WXMAC__) + #include "wx/osx/dnd.h" +#elif defined(__WXPM__) + #include "wx/os2/dnd.h" +#endif + +// ---------------------------------------------------------------------------- +// standard wxDropTarget implementations (implemented in common/dobjcmn.cpp) +// ---------------------------------------------------------------------------- + +// A simple wxDropTarget derived class for text data: you only need to +// override OnDropText() to get something working +class WXDLLIMPEXP_CORE wxTextDropTarget : public wxDropTarget +{ +public: + wxTextDropTarget(); + + virtual bool OnDropText(wxCoord x, wxCoord y, const wxString& text) = 0; + + virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def); + +private: + wxDECLARE_NO_COPY_CLASS(wxTextDropTarget); +}; + +// A drop target which accepts files (dragged from File Manager or Explorer) +class WXDLLIMPEXP_CORE wxFileDropTarget : public wxDropTarget +{ +public: + wxFileDropTarget(); + + // parameters are the number of files and the array of file names + virtual bool OnDropFiles(wxCoord x, wxCoord y, + const wxArrayString& filenames) = 0; + + virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def); + +private: + wxDECLARE_NO_COPY_CLASS(wxFileDropTarget); +}; + +#endif // wxUSE_DRAG_AND_DROP + +#endif // _WX_DND_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/docmdi.h b/wxmsw/include/wx-3.0/wx/docmdi.h new file mode 100644 index 00000000..e7dcb7ad --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/docmdi.h @@ -0,0 +1,100 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/docmdi.h +// Purpose: Frame classes for MDI document/view applications +// Author: Julian Smart +// Created: 01/02/97 +// Copyright: (c) 1997 Julian Smart +// (c) 2010 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DOCMDI_H_ +#define _WX_DOCMDI_H_ + +#include "wx/defs.h" + +#if wxUSE_MDI_ARCHITECTURE + +#include "wx/docview.h" +#include "wx/mdi.h" + +#ifdef __VISUALC6__ + // "non dll-interface class 'wxDocXXXFrameAny<>' used as base interface for + // dll-interface class 'wxDocMDIXXXFrame'" -- this is bogus as the template + // will be DLL-exported but only once it is used as base class here! + #pragma warning (push) + #pragma warning (disable:4275) +#endif + +// Define MDI versions of the doc-view frame classes. Note that we need to +// define them as classes for wxRTTI, otherwise we could simply define them as +// typedefs. + +// ---------------------------------------------------------------------------- +// An MDI document parent frame +// ---------------------------------------------------------------------------- + +typedef + wxDocParentFrameAny wxDocMDIParentFrameBase; + +class WXDLLIMPEXP_CORE wxDocMDIParentFrame : public wxDocMDIParentFrameBase +{ +public: + wxDocMDIParentFrame() : wxDocMDIParentFrameBase() { } + + wxDocMDIParentFrame(wxDocManager *manager, + wxFrame *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + : wxDocMDIParentFrameBase(manager, + parent, id, title, pos, size, style, name) + { + } + +private: + DECLARE_CLASS(wxDocMDIParentFrame) + wxDECLARE_NO_COPY_CLASS(wxDocMDIParentFrame); +}; + +// ---------------------------------------------------------------------------- +// An MDI document child frame +// ---------------------------------------------------------------------------- + +typedef + wxDocChildFrameAny wxDocMDIChildFrameBase; + +class WXDLLIMPEXP_CORE wxDocMDIChildFrame : public wxDocMDIChildFrameBase +{ +public: + wxDocMDIChildFrame() { } + + wxDocMDIChildFrame(wxDocument *doc, + wxView *view, + wxMDIParentFrame *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + : wxDocMDIChildFrameBase(doc, view, + parent, id, title, pos, size, style, name) + { + } + +private: + DECLARE_CLASS(wxDocMDIChildFrame) + wxDECLARE_NO_COPY_CLASS(wxDocMDIChildFrame); +}; + +#ifdef __VISUALC6__ + #pragma warning (pop) +#endif + +#endif // wxUSE_MDI_ARCHITECTURE + +#endif // _WX_DOCMDI_H_ diff --git a/wxmsw/include/wx-3.0/wx/docview.h b/wxmsw/include/wx-3.0/wx/docview.h new file mode 100644 index 00000000..78bf44d4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/docview.h @@ -0,0 +1,1061 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/docview.h +// Purpose: Doc/View classes +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DOCH__ +#define _WX_DOCH__ + +#include "wx/defs.h" + +#if wxUSE_DOC_VIEW_ARCHITECTURE + +#include "wx/list.h" +#include "wx/dlist.h" +#include "wx/string.h" +#include "wx/frame.h" +#include "wx/filehistory.h" +#include "wx/vector.h" + +#if wxUSE_PRINTING_ARCHITECTURE + #include "wx/print.h" +#endif + +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxDocument; +class WXDLLIMPEXP_FWD_CORE wxView; +class WXDLLIMPEXP_FWD_CORE wxDocTemplate; +class WXDLLIMPEXP_FWD_CORE wxDocManager; +class WXDLLIMPEXP_FWD_CORE wxPrintInfo; +class WXDLLIMPEXP_FWD_CORE wxCommandProcessor; +class WXDLLIMPEXP_FWD_BASE wxConfigBase; + +class wxDocChildFrameAnyBase; + +#if wxUSE_STD_IOSTREAM + #include "wx/iosfwrap.h" +#else + #include "wx/stream.h" +#endif + +// Flags for wxDocManager (can be combined). +enum +{ + wxDOC_NEW = 1, + wxDOC_SILENT = 2 +}; + +// Document template flags +enum +{ + wxTEMPLATE_VISIBLE = 1, + wxTEMPLATE_INVISIBLE = 2, + wxDEFAULT_TEMPLATE_FLAGS = wxTEMPLATE_VISIBLE +}; + +#define wxMAX_FILE_HISTORY 9 + +typedef wxVector wxDocVector; +typedef wxVector wxViewVector; +typedef wxVector wxDocTemplateVector; + +class WXDLLIMPEXP_CORE wxDocument : public wxEvtHandler +{ +public: + wxDocument(wxDocument *parent = NULL); + virtual ~wxDocument(); + + // accessors + void SetFilename(const wxString& filename, bool notifyViews = false); + wxString GetFilename() const { return m_documentFile; } + + void SetTitle(const wxString& title) { m_documentTitle = title; } + wxString GetTitle() const { return m_documentTitle; } + + void SetDocumentName(const wxString& name) { m_documentTypeName = name; } + wxString GetDocumentName() const { return m_documentTypeName; } + + // access the flag indicating whether this document had been already saved, + // SetDocumentSaved() is only used internally, don't call it + bool GetDocumentSaved() const { return m_savedYet; } + void SetDocumentSaved(bool saved = true) { m_savedYet = saved; } + + // activate the first view of the document if any + void Activate(); + + // return true if the document hasn't been modified since the last time it + // was saved (implying that it returns false if it was never saved, even if + // the document is not modified) + bool AlreadySaved() const { return !IsModified() && GetDocumentSaved(); } + + virtual bool Close(); + virtual bool Save(); + virtual bool SaveAs(); + virtual bool Revert(); + +#if wxUSE_STD_IOSTREAM + virtual wxSTD ostream& SaveObject(wxSTD ostream& stream); + virtual wxSTD istream& LoadObject(wxSTD istream& stream); +#else + virtual wxOutputStream& SaveObject(wxOutputStream& stream); + virtual wxInputStream& LoadObject(wxInputStream& stream); +#endif + + // Called by wxWidgets + virtual bool OnSaveDocument(const wxString& filename); + virtual bool OnOpenDocument(const wxString& filename); + virtual bool OnNewDocument(); + virtual bool OnCloseDocument(); + + // Prompts for saving if about to close a modified document. Returns true + // if ok to close the document (may have saved in the meantime, or set + // modified to false) + virtual bool OnSaveModified(); + + // if you override, remember to call the default + // implementation (wxDocument::OnChangeFilename) + virtual void OnChangeFilename(bool notifyViews); + + // Called by framework if created automatically by the default document + // manager: gives document a chance to initialise and (usually) create a + // view + virtual bool OnCreate(const wxString& path, long flags); + + // By default, creates a base wxCommandProcessor. + virtual wxCommandProcessor *OnCreateCommandProcessor(); + virtual wxCommandProcessor *GetCommandProcessor() const + { return m_commandProcessor; } + virtual void SetCommandProcessor(wxCommandProcessor *proc) + { m_commandProcessor = proc; } + + // Called after a view is added or removed. The default implementation + // deletes the document if this is there are no more views. + virtual void OnChangedViewList(); + + // Called from OnCloseDocument(), does nothing by default but may be + // overridden. Return value is ignored. + virtual bool DeleteContents(); + + virtual bool Draw(wxDC&); + virtual bool IsModified() const { return m_documentModified; } + virtual void Modify(bool mod); + + virtual bool AddView(wxView *view); + virtual bool RemoveView(wxView *view); + +#ifndef __VISUALC6__ + wxViewVector GetViewsVector() const; +#endif // !__VISUALC6__ + + wxList& GetViews() { return m_documentViews; } + const wxList& GetViews() const { return m_documentViews; } + + wxView *GetFirstView() const; + + virtual void UpdateAllViews(wxView *sender = NULL, wxObject *hint = NULL); + virtual void NotifyClosing(); + + // Remove all views (because we're closing the document) + virtual bool DeleteAllViews(); + + // Other stuff + virtual wxDocManager *GetDocumentManager() const; + virtual wxDocTemplate *GetDocumentTemplate() const + { return m_documentTemplate; } + virtual void SetDocumentTemplate(wxDocTemplate *temp) + { m_documentTemplate = temp; } + + // Get the document name to be shown to the user: the title if there is + // any, otherwise the filename if the document was saved and, finally, + // "unnamed" otherwise + virtual wxString GetUserReadableName() const; + +#if WXWIN_COMPATIBILITY_2_8 + // use GetUserReadableName() instead + wxDEPRECATED_BUT_USED_INTERNALLY( + virtual bool GetPrintableName(wxString& buf) const + ); +#endif // WXWIN_COMPATIBILITY_2_8 + + // Returns a window that can be used as a parent for document-related + // dialogs. Override if necessary. + virtual wxWindow *GetDocumentWindow() const; + + // Returns true if this document is a child document corresponding to a + // part of the parent document and not a disk file as usual. + bool IsChildDocument() const { return m_documentParent != NULL; } + +protected: + wxList m_documentViews; + wxString m_documentFile; + wxString m_documentTitle; + wxString m_documentTypeName; + wxDocTemplate* m_documentTemplate; + bool m_documentModified; + + // if the document parent is non-NULL, it's a pseudo-document corresponding + // to a part of the parent document which can't be saved or loaded + // independently of its parent and is always closed when its parent is + wxDocument* m_documentParent; + + wxCommandProcessor* m_commandProcessor; + bool m_savedYet; + + // Called by OnSaveDocument and OnOpenDocument to implement standard + // Save/Load behaviour. Re-implement in derived class for custom + // behaviour. + virtual bool DoSaveDocument(const wxString& file); + virtual bool DoOpenDocument(const wxString& file); + + // the default implementation of GetUserReadableName() + wxString DoGetUserReadableName() const; + +private: + // list of all documents whose m_documentParent is this one + typedef wxDList DocsList; + DocsList m_childDocuments; + + DECLARE_ABSTRACT_CLASS(wxDocument) + wxDECLARE_NO_COPY_CLASS(wxDocument); +}; + +class WXDLLIMPEXP_CORE wxView: public wxEvtHandler +{ +public: + wxView(); + virtual ~wxView(); + + wxDocument *GetDocument() const { return m_viewDocument; } + virtual void SetDocument(wxDocument *doc); + + wxString GetViewName() const { return m_viewTypeName; } + void SetViewName(const wxString& name) { m_viewTypeName = name; } + + wxWindow *GetFrame() const { return m_viewFrame ; } + void SetFrame(wxWindow *frame) { m_viewFrame = frame; } + + virtual void OnActivateView(bool activate, + wxView *activeView, + wxView *deactiveView); + virtual void OnDraw(wxDC *dc) = 0; + virtual void OnPrint(wxDC *dc, wxObject *info); + virtual void OnUpdate(wxView *sender, wxObject *hint = NULL); + virtual void OnClosingDocument() {} + virtual void OnChangeFilename(); + + // Called by framework if created automatically by the default document + // manager class: gives view a chance to initialise + virtual bool OnCreate(wxDocument *WXUNUSED(doc), long WXUNUSED(flags)) + { return true; } + + // Checks if the view is the last one for the document; if so, asks user + // to confirm save data (if modified). If ok, deletes itself and returns + // true. + virtual bool Close(bool deleteWindow = true); + + // Override to do cleanup/veto close + virtual bool OnClose(bool deleteWindow); + + // A view's window can call this to notify the view it is (in)active. + // The function then notifies the document manager. + virtual void Activate(bool activate); + + wxDocManager *GetDocumentManager() const + { return m_viewDocument->GetDocumentManager(); } + +#if wxUSE_PRINTING_ARCHITECTURE + virtual wxPrintout *OnCreatePrintout(); +#endif + + // implementation only + // ------------------- + + // set the associated frame, it is used to reset its view when we're + // destroyed + void SetDocChildFrame(wxDocChildFrameAnyBase *docChildFrame); + + // get the associated frame, may be NULL during destruction + wxDocChildFrameAnyBase* GetDocChildFrame() const { return m_docChildFrame; } + +protected: + // hook the document into event handlers chain here + virtual bool TryBefore(wxEvent& event); + + wxDocument* m_viewDocument; + wxString m_viewTypeName; + wxWindow* m_viewFrame; + + wxDocChildFrameAnyBase *m_docChildFrame; + +private: + DECLARE_ABSTRACT_CLASS(wxView) + wxDECLARE_NO_COPY_CLASS(wxView); +}; + +// Represents user interface (and other) properties of documents and views +class WXDLLIMPEXP_CORE wxDocTemplate: public wxObject +{ + +friend class WXDLLIMPEXP_FWD_CORE wxDocManager; + +public: + // Associate document and view types. They're for identifying what view is + // associated with what template/document type + wxDocTemplate(wxDocManager *manager, + const wxString& descr, + const wxString& filter, + const wxString& dir, + const wxString& ext, + const wxString& docTypeName, + const wxString& viewTypeName, + wxClassInfo *docClassInfo = NULL, + wxClassInfo *viewClassInfo = NULL, + long flags = wxDEFAULT_TEMPLATE_FLAGS); + + virtual ~wxDocTemplate(); + + // By default, these two member functions dynamically creates document and + // view using dynamic instance construction. Override these if you need a + // different method of construction. + virtual wxDocument *CreateDocument(const wxString& path, long flags = 0); + virtual wxView *CreateView(wxDocument *doc, long flags = 0); + + // Helper method for CreateDocument; also allows you to do your own document + // creation + virtual bool InitDocument(wxDocument* doc, + const wxString& path, + long flags = 0); + + wxString GetDefaultExtension() const { return m_defaultExt; } + wxString GetDescription() const { return m_description; } + wxString GetDirectory() const { return m_directory; } + wxDocManager *GetDocumentManager() const { return m_documentManager; } + void SetDocumentManager(wxDocManager *manager) + { m_documentManager = manager; } + wxString GetFileFilter() const { return m_fileFilter; } + long GetFlags() const { return m_flags; } + virtual wxString GetViewName() const { return m_viewTypeName; } + virtual wxString GetDocumentName() const { return m_docTypeName; } + + void SetFileFilter(const wxString& filter) { m_fileFilter = filter; } + void SetDirectory(const wxString& dir) { m_directory = dir; } + void SetDescription(const wxString& descr) { m_description = descr; } + void SetDefaultExtension(const wxString& ext) { m_defaultExt = ext; } + void SetFlags(long flags) { m_flags = flags; } + + bool IsVisible() const { return (m_flags & wxTEMPLATE_VISIBLE) != 0; } + + wxClassInfo* GetDocClassInfo() const { return m_docClassInfo; } + wxClassInfo* GetViewClassInfo() const { return m_viewClassInfo; } + + virtual bool FileMatchesTemplate(const wxString& path); + +protected: + long m_flags; + wxString m_fileFilter; + wxString m_directory; + wxString m_description; + wxString m_defaultExt; + wxString m_docTypeName; + wxString m_viewTypeName; + wxDocManager* m_documentManager; + + // For dynamic creation of appropriate instances. + wxClassInfo* m_docClassInfo; + wxClassInfo* m_viewClassInfo; + + // Called by CreateDocument and CreateView to create the actual + // document/view object. + // + // By default uses the ClassInfo provided to the constructor. Override + // these functions to provide a different method of creation. + virtual wxDocument *DoCreateDocument(); + virtual wxView *DoCreateView(); + +private: + DECLARE_CLASS(wxDocTemplate) + wxDECLARE_NO_COPY_CLASS(wxDocTemplate); +}; + +// One object of this class may be created in an application, to manage all +// the templates and documents. +class WXDLLIMPEXP_CORE wxDocManager: public wxEvtHandler +{ +public: + // NB: flags are unused, don't pass wxDOC_XXX to this ctor + wxDocManager(long flags = 0, bool initialize = true); + virtual ~wxDocManager(); + + virtual bool Initialize(); + + // Handlers for common user commands + void OnFileClose(wxCommandEvent& event); + void OnFileCloseAll(wxCommandEvent& event); + void OnFileNew(wxCommandEvent& event); + void OnFileOpen(wxCommandEvent& event); + void OnFileRevert(wxCommandEvent& event); + void OnFileSave(wxCommandEvent& event); + void OnFileSaveAs(wxCommandEvent& event); + void OnMRUFile(wxCommandEvent& event); +#if wxUSE_PRINTING_ARCHITECTURE + void OnPrint(wxCommandEvent& event); + void OnPreview(wxCommandEvent& event); + void OnPageSetup(wxCommandEvent& event); +#endif // wxUSE_PRINTING_ARCHITECTURE + void OnUndo(wxCommandEvent& event); + void OnRedo(wxCommandEvent& event); + + // Handlers for UI update commands + void OnUpdateFileOpen(wxUpdateUIEvent& event); + void OnUpdateDisableIfNoDoc(wxUpdateUIEvent& event); + void OnUpdateFileRevert(wxUpdateUIEvent& event); + void OnUpdateFileNew(wxUpdateUIEvent& event); + void OnUpdateFileSave(wxUpdateUIEvent& event); + void OnUpdateFileSaveAs(wxUpdateUIEvent& event); + void OnUpdateUndo(wxUpdateUIEvent& event); + void OnUpdateRedo(wxUpdateUIEvent& event); + + // called when file format detection didn't work, can be overridden to do + // something in this case + virtual void OnOpenFileFailure() { } + + virtual wxDocument *CreateDocument(const wxString& path, long flags = 0); + + // wrapper around CreateDocument() with a more clear name + wxDocument *CreateNewDocument() + { return CreateDocument(wxString(), wxDOC_NEW); } + + virtual wxView *CreateView(wxDocument *doc, long flags = 0); + virtual void DeleteTemplate(wxDocTemplate *temp, long flags = 0); + virtual bool FlushDoc(wxDocument *doc); + virtual wxDocTemplate *MatchTemplate(const wxString& path); + virtual wxDocTemplate *SelectDocumentPath(wxDocTemplate **templates, + int noTemplates, wxString& path, long flags, bool save = false); + virtual wxDocTemplate *SelectDocumentType(wxDocTemplate **templates, + int noTemplates, bool sort = false); + virtual wxDocTemplate *SelectViewType(wxDocTemplate **templates, + int noTemplates, bool sort = false); + virtual wxDocTemplate *FindTemplateForPath(const wxString& path); + + void AssociateTemplate(wxDocTemplate *temp); + void DisassociateTemplate(wxDocTemplate *temp); + + // Find template from document class info, may return NULL. + wxDocTemplate* FindTemplate(const wxClassInfo* documentClassInfo); + + // Find document from file name, may return NULL. + wxDocument* FindDocumentByPath(const wxString& path) const; + + wxDocument *GetCurrentDocument() const; + + void SetMaxDocsOpen(int n) { m_maxDocsOpen = n; } + int GetMaxDocsOpen() const { return m_maxDocsOpen; } + + // Add and remove a document from the manager's list + void AddDocument(wxDocument *doc); + void RemoveDocument(wxDocument *doc); + + // closes all currently open documents + bool CloseDocuments(bool force = true); + + // closes the specified document + bool CloseDocument(wxDocument* doc, bool force = false); + + // Clear remaining documents and templates + bool Clear(bool force = true); + + // Views or windows should inform the document manager + // when a view is going in or out of focus + virtual void ActivateView(wxView *view, bool activate = true); + virtual wxView *GetCurrentView() const { return m_currentView; } + + // This method tries to find an active view harder than GetCurrentView(): + // if the latter is NULL, it also checks if we don't have just a single + // view and returns it then. + wxView *GetAnyUsableView() const; + + +#ifndef __VISUALC6__ + wxDocVector GetDocumentsVector() const; + wxDocTemplateVector GetTemplatesVector() const; +#endif // !__VISUALC6__ + + wxList& GetDocuments() { return m_docs; } + wxList& GetTemplates() { return m_templates; } + + // Return the default name for a new document (by default returns strings + // in the form "unnamed " but can be overridden) + virtual wxString MakeNewDocumentName(); + + // Make a frame title (override this to do something different) + virtual wxString MakeFrameTitle(wxDocument* doc); + + virtual wxFileHistory *OnCreateFileHistory(); + virtual wxFileHistory *GetFileHistory() const { return m_fileHistory; } + + // File history management + virtual void AddFileToHistory(const wxString& file); + virtual void RemoveFileFromHistory(size_t i); + virtual size_t GetHistoryFilesCount() const; + virtual wxString GetHistoryFile(size_t i) const; + virtual void FileHistoryUseMenu(wxMenu *menu); + virtual void FileHistoryRemoveMenu(wxMenu *menu); +#if wxUSE_CONFIG + virtual void FileHistoryLoad(const wxConfigBase& config); + virtual void FileHistorySave(wxConfigBase& config); +#endif // wxUSE_CONFIG + + virtual void FileHistoryAddFilesToMenu(); + virtual void FileHistoryAddFilesToMenu(wxMenu* menu); + + wxString GetLastDirectory() const; + void SetLastDirectory(const wxString& dir) { m_lastDirectory = dir; } + + // Get the current document manager + static wxDocManager* GetDocumentManager() { return sm_docManager; } + +#if wxUSE_PRINTING_ARCHITECTURE + wxPageSetupDialogData& GetPageSetupDialogData() + { return m_pageSetupDialogData; } + const wxPageSetupDialogData& GetPageSetupDialogData() const + { return m_pageSetupDialogData; } +#endif // wxUSE_PRINTING_ARCHITECTURE + +#if WXWIN_COMPATIBILITY_2_8 + // deprecated, override GetDefaultName() instead + wxDEPRECATED_BUT_USED_INTERNALLY( + virtual bool MakeDefaultName(wxString& buf) + ); +#endif + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, use GetHistoryFilesCount() instead + wxDEPRECATED( size_t GetNoHistoryFiles() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + + +protected: + // Called when a file selected from the MRU list doesn't exist any more. + // The default behaviour is to remove the file from the MRU and notify the + // user about it but this method can be overridden to customize it. + virtual void OnMRUFileNotExist(unsigned n, const wxString& filename); + + // Open the MRU file with the given index in our associated file history. + void DoOpenMRUFile(unsigned n); +#if wxUSE_PRINTING_ARCHITECTURE + virtual wxPreviewFrame* CreatePreviewFrame(wxPrintPreviewBase* preview, + wxWindow *parent, + const wxString& title); +#endif // wxUSE_PRINTING_ARCHITECTURE + + // hook the currently active view into event handlers chain here + virtual bool TryBefore(wxEvent& event); + + // return the command processor for the current document, if any + wxCommandProcessor *GetCurrentCommandProcessor() const; + + int m_defaultDocumentNameCounter; + int m_maxDocsOpen; + wxList m_docs; + wxList m_templates; + wxView* m_currentView; + wxFileHistory* m_fileHistory; + wxString m_lastDirectory; + static wxDocManager* sm_docManager; + +#if wxUSE_PRINTING_ARCHITECTURE + wxPageSetupDialogData m_pageSetupDialogData; +#endif // wxUSE_PRINTING_ARCHITECTURE + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxDocManager) + wxDECLARE_NO_COPY_CLASS(wxDocManager); +}; + +#if WXWIN_COMPATIBILITY_2_6 +inline size_t wxDocManager::GetNoHistoryFiles() const +{ + return GetHistoryFilesCount(); +} +#endif // WXWIN_COMPATIBILITY_2_6 + +// ---------------------------------------------------------------------------- +// Base class for child frames -- this is what wxView renders itself into +// +// Notice that this is a mix-in class so it doesn't derive from wxWindow, only +// wxDocChildFrameAny does +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDocChildFrameAnyBase +{ +public: + // default ctor, use Create() after it + wxDocChildFrameAnyBase() + { + m_childDocument = NULL; + m_childView = NULL; + m_win = NULL; + m_lastEvent = NULL; + } + + // full ctor equivalent to using the default one and Create() + wxDocChildFrameAnyBase(wxDocument *doc, wxView *view, wxWindow *win) + { + Create(doc, view, win); + } + + // method which must be called for an object created using the default ctor + // + // note that it returns bool just for consistency with Create() methods in + // other classes, we never return false from here + bool Create(wxDocument *doc, wxView *view, wxWindow *win) + { + m_childDocument = doc; + m_childView = view; + m_win = win; + + if ( view ) + view->SetDocChildFrame(this); + + return true; + } + + // dtor doesn't need to be virtual, an object should never be destroyed via + // a pointer to this class + ~wxDocChildFrameAnyBase() + { + // prevent the view from deleting us if we're being deleted directly + // (and not via Close() + Destroy()) + if ( m_childView ) + m_childView->SetDocChildFrame(NULL); + } + + wxDocument *GetDocument() const { return m_childDocument; } + wxView *GetView() const { return m_childView; } + void SetDocument(wxDocument *doc) { m_childDocument = doc; } + void SetView(wxView *view) { m_childView = view; } + + wxWindow *GetWindow() const { return m_win; } + + // implementation only + + // Check if this event had been just processed in this frame. + bool HasAlreadyProcessed(wxEvent& event) const + { + return m_lastEvent == &event; + } + +protected: + // we're not a wxEvtHandler but we provide this wxEvtHandler-like function + // which is called from TryBefore() of the derived classes to give our view + // a chance to process the message before the frame event handlers are used + bool TryProcessEvent(wxEvent& event); + + // called from EVT_CLOSE handler in the frame: check if we can close and do + // cleanup if so; veto the event otherwise + bool CloseView(wxCloseEvent& event); + + + wxDocument* m_childDocument; + wxView* m_childView; + + // the associated window: having it here is not terribly elegant but it + // allows us to avoid having any virtual functions in this class + wxWindow* m_win; + +private: + // Pointer to the last processed event used to avoid sending the same event + // twice to wxDocManager, from here and from wxDocParentFrameAnyBase. + wxEvent* m_lastEvent; + + wxDECLARE_NO_COPY_CLASS(wxDocChildFrameAnyBase); +}; + +// ---------------------------------------------------------------------------- +// Template implementing child frame concept using the given wxFrame-like class +// +// This is used to define wxDocChildFrame and wxDocMDIChildFrame: ChildFrame is +// a wxFrame or wxMDIChildFrame (although in theory it could be any wxWindow- +// derived class as long as it provided a ctor with the same signature as +// wxFrame and OnActivate() method) and ParentFrame is either wxFrame or +// wxMDIParentFrame. +// ---------------------------------------------------------------------------- + +template +class WXDLLIMPEXP_CORE wxDocChildFrameAny : public ChildFrame, + public wxDocChildFrameAnyBase +{ +public: + typedef ChildFrame BaseClass; + + // default ctor, use Create after it + wxDocChildFrameAny() { } + + // ctor for a frame showing the given view of the specified document + wxDocChildFrameAny(wxDocument *doc, + wxView *view, + ParentFrame *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + { + Create(doc, view, parent, id, title, pos, size, style, name); + } + + bool Create(wxDocument *doc, + wxView *view, + ParentFrame *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + { + if ( !wxDocChildFrameAnyBase::Create(doc, view, this) ) + return false; + + if ( !BaseClass::Create(parent, id, title, pos, size, style, name) ) + return false; + + this->Connect(wxEVT_ACTIVATE, + wxActivateEventHandler(wxDocChildFrameAny::OnActivate)); + this->Connect(wxEVT_CLOSE_WINDOW, + wxCloseEventHandler(wxDocChildFrameAny::OnCloseWindow)); + + return true; + } + + virtual bool Destroy() + { + // FIXME: why exactly do we do this? to avoid activation events during + // destructions maybe? + m_childView = NULL; + return BaseClass::Destroy(); + } + +protected: + // hook the child view into event handlers chain here + virtual bool TryBefore(wxEvent& event) + { + return TryProcessEvent(event) || BaseClass::TryBefore(event); + } + +private: + void OnActivate(wxActivateEvent& event) + { + BaseClass::OnActivate(event); + + if ( m_childView ) + m_childView->Activate(event.GetActive()); + } + + void OnCloseWindow(wxCloseEvent& event) + { + if ( CloseView(event) ) + Destroy(); + //else: vetoed + } + + wxDECLARE_NO_COPY_TEMPLATE_CLASS_2(wxDocChildFrameAny, + ChildFrame, ParentFrame); +}; + +// ---------------------------------------------------------------------------- +// A default child frame: we need to define it as a class just for wxRTTI, +// otherwise we could simply typedef it +// ---------------------------------------------------------------------------- + +#ifdef __VISUALC6__ + // "non dll-interface class 'wxDocChildFrameAny<>' used as base interface + // for dll-interface class 'wxDocChildFrame'" -- this is bogus as the + // template will be DLL-exported but only once it is used as base class + // here! + #pragma warning (push) + #pragma warning (disable:4275) +#endif + +typedef wxDocChildFrameAny wxDocChildFrameBase; + +class WXDLLIMPEXP_CORE wxDocChildFrame : public wxDocChildFrameBase +{ +public: + wxDocChildFrame() + { + } + + wxDocChildFrame(wxDocument *doc, + wxView *view, + wxFrame *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + : wxDocChildFrameBase(doc, view, + parent, id, title, pos, size, style, name) + { + } + + bool Create(wxDocument *doc, + wxView *view, + wxFrame *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + { + return wxDocChildFrameBase::Create + ( + doc, view, + parent, id, title, pos, size, style, name + ); + } + +private: + DECLARE_CLASS(wxDocChildFrame) + wxDECLARE_NO_COPY_CLASS(wxDocChildFrame); +}; + +// ---------------------------------------------------------------------------- +// wxDocParentFrame and related classes. +// +// As with wxDocChildFrame we define a template base class used by both normal +// and MDI versions +// ---------------------------------------------------------------------------- + +// Base class containing type-independent code of wxDocParentFrameAny +// +// Similarly to wxDocChildFrameAnyBase, this class is a mix-in and doesn't +// derive from wxWindow. +class WXDLLIMPEXP_CORE wxDocParentFrameAnyBase +{ +public: + wxDocParentFrameAnyBase(wxWindow* frame) + : m_frame(frame) + { + m_docManager = NULL; + } + + wxDocManager *GetDocumentManager() const { return m_docManager; } + +protected: + // This is similar to wxDocChildFrameAnyBase method with the same name: + // while we're not an event handler ourselves and so can't override + // TryBefore(), we provide a helper that the derived template class can use + // from its TryBefore() implementation. + bool TryProcessEvent(wxEvent& event); + + wxWindow* const m_frame; + wxDocManager *m_docManager; + + wxDECLARE_NO_COPY_CLASS(wxDocParentFrameAnyBase); +}; + +// This is similar to wxDocChildFrameAny and is used to provide common +// implementation for both wxDocParentFrame and wxDocMDIParentFrame +template +class WXDLLIMPEXP_CORE wxDocParentFrameAny : public BaseFrame, + public wxDocParentFrameAnyBase +{ +public: + wxDocParentFrameAny() : wxDocParentFrameAnyBase(this) { } + wxDocParentFrameAny(wxDocManager *manager, + wxFrame *frame, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + : wxDocParentFrameAnyBase(this) + { + Create(manager, frame, id, title, pos, size, style, name); + } + + bool Create(wxDocManager *manager, + wxFrame *frame, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + { + m_docManager = manager; + + if ( !BaseFrame::Create(frame, id, title, pos, size, style, name) ) + return false; + + this->Connect(wxID_EXIT, wxEVT_MENU, + wxCommandEventHandler(wxDocParentFrameAny::OnExit)); + this->Connect(wxEVT_CLOSE_WINDOW, + wxCloseEventHandler(wxDocParentFrameAny::OnCloseWindow)); + + return true; + } + +protected: + // hook the document manager into event handling chain here + virtual bool TryBefore(wxEvent& event) + { + // It is important to send the event to the base class first as + // wxMDIParentFrame overrides its TryBefore() to send the menu events + // to the currently active child frame and the child must get them + // before our own TryProcessEvent() is executed, not afterwards. + return BaseFrame::TryBefore(event) || TryProcessEvent(event); + } + +private: + void OnExit(wxCommandEvent& WXUNUSED(event)) + { + this->Close(); + } + + void OnCloseWindow(wxCloseEvent& event) + { + if ( m_docManager && !m_docManager->Clear(!event.CanVeto()) ) + { + // The user decided not to close finally, abort. + event.Veto(); + } + else + { + // Just skip the event, base class handler will destroy the window. + event.Skip(); + } + } + + + wxDECLARE_NO_COPY_CLASS(wxDocParentFrameAny); +}; + +typedef wxDocParentFrameAny wxDocParentFrameBase; + +class WXDLLIMPEXP_CORE wxDocParentFrame : public wxDocParentFrameBase +{ +public: + wxDocParentFrame() : wxDocParentFrameBase() { } + + wxDocParentFrame(wxDocManager *manager, + wxFrame *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + : wxDocParentFrameBase(manager, + parent, id, title, pos, size, style, name) + { + } + + bool Create(wxDocManager *manager, + wxFrame *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + { + return wxDocParentFrameBase::Create(manager, + parent, id, title, + pos, size, style, name); + } + +private: + DECLARE_CLASS(wxDocParentFrame) + wxDECLARE_NO_COPY_CLASS(wxDocParentFrame); +}; + +#ifdef __VISUALC6__ + // reenable warning 4275 + #pragma warning (pop) +#endif + +// ---------------------------------------------------------------------------- +// Provide simple default printing facilities +// ---------------------------------------------------------------------------- + +#if wxUSE_PRINTING_ARCHITECTURE +class WXDLLIMPEXP_CORE wxDocPrintout : public wxPrintout +{ +public: + wxDocPrintout(wxView *view = NULL, const wxString& title = wxString()); + + // implement wxPrintout methods + virtual bool OnPrintPage(int page); + virtual bool HasPage(int page); + virtual bool OnBeginDocument(int startPage, int endPage); + virtual void GetPageInfo(int *minPage, int *maxPage, + int *selPageFrom, int *selPageTo); + + virtual wxView *GetView() { return m_printoutView; } + +protected: + wxView* m_printoutView; + +private: + DECLARE_DYNAMIC_CLASS(wxDocPrintout) + wxDECLARE_NO_COPY_CLASS(wxDocPrintout); +}; +#endif // wxUSE_PRINTING_ARCHITECTURE + +// For compatibility with existing file formats: +// converts from/to a stream to/from a temporary file. +#if wxUSE_STD_IOSTREAM +bool WXDLLIMPEXP_CORE +wxTransferFileToStream(const wxString& filename, wxSTD ostream& stream); +bool WXDLLIMPEXP_CORE +wxTransferStreamToFile(wxSTD istream& stream, const wxString& filename); +#else +bool WXDLLIMPEXP_CORE +wxTransferFileToStream(const wxString& filename, wxOutputStream& stream); +bool WXDLLIMPEXP_CORE +wxTransferStreamToFile(wxInputStream& stream, const wxString& filename); +#endif // wxUSE_STD_IOSTREAM + + +// these flags are not used anywhere by wxWidgets and kept only for an unlikely +// case of existing user code using them for its own purposes +#if WXWIN_COMPATIBILITY_2_8 +enum +{ + wxDOC_SDI = 1, + wxDOC_MDI, + wxDEFAULT_DOCMAN_FLAGS = wxDOC_SDI +}; +#endif // WXWIN_COMPATIBILITY_2_8 + +#ifndef __VISUALC6__ +inline wxViewVector wxDocument::GetViewsVector() const +{ + return m_documentViews.AsVector(); +} + +inline wxDocVector wxDocManager::GetDocumentsVector() const +{ + return m_docs.AsVector(); +} + +inline wxDocTemplateVector wxDocManager::GetTemplatesVector() const +{ + return m_templates.AsVector(); +} +#endif // !__VISUALC6__ + +#endif // wxUSE_DOC_VIEW_ARCHITECTURE + +#endif // _WX_DOCH__ diff --git a/wxmsw/include/wx-3.0/wx/dragimag.h b/wxmsw/include/wx-3.0/wx/dragimag.h new file mode 100644 index 00000000..4143ca88 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dragimag.h @@ -0,0 +1,53 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dragimag.h +// Purpose: wxDragImage base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DRAGIMAG_H_BASE_ +#define _WX_DRAGIMAG_H_BASE_ + +#if wxUSE_DRAGIMAGE + +class WXDLLIMPEXP_FWD_CORE wxRect; +class WXDLLIMPEXP_FWD_CORE wxMemoryDC; +class WXDLLIMPEXP_FWD_CORE wxDC; + +#if defined(__WXMSW__) +# if defined(__WXUNIVERSAL__) +# include "wx/generic/dragimgg.h" +# define wxDragImage wxGenericDragImage +# else +# include "wx/msw/dragimag.h" +# endif + +#elif defined(__WXMOTIF__) +# include "wx/generic/dragimgg.h" +# define wxDragImage wxGenericDragImage + +#elif defined(__WXGTK__) +# include "wx/generic/dragimgg.h" +# define wxDragImage wxGenericDragImage + +#elif defined(__WXX11__) +# include "wx/generic/dragimgg.h" +# define wxDragImage wxGenericDragImage + +#elif defined(__WXMAC__) +# include "wx/generic/dragimgg.h" +# define wxDragImage wxGenericDragImage + +#elif defined(__WXPM__) +# include "wx/generic/dragimgg.h" +# define wxDragImage wxGenericDragImage + +#endif + +#endif // wxUSE_DRAGIMAGE + +#endif + // _WX_DRAGIMAG_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/dvrenderers.h b/wxmsw/include/wx-3.0/wx/dvrenderers.h new file mode 100644 index 00000000..3f623cf6 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dvrenderers.h @@ -0,0 +1,445 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/dvrenderers.h +// Purpose: Declare all wxDataViewCtrl classes +// Author: Robert Roebling, Vadim Zeitlin +// Created: 2009-11-08 (extracted from wx/dataview.h) +// Copyright: (c) 2006 Robert Roebling +// (c) 2009 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DVRENDERERS_H_ +#define _WX_DVRENDERERS_H_ + +/* + Note about the structure of various headers: they're organized in a more + complicated way than usual because of the various dependencies which are + different for different ports. In any case the only public header, i.e. the + one which can be included directly is wx/dataview.h. It, in turn, includes + this one to define all the renderer classes. + + We define the base wxDataViewRendererBase class first and then include a + port-dependent wx/xxx/dvrenderer.h which defines wxDataViewRenderer itself. + After this we can define wxDataViewRendererCustomBase (and maybe in the + future base classes for other renderers if the need arises, i.e. if there + is any non-trivial code or API which it makes sense to keep in common code) + and include wx/xxx/dvrenderers.h (notice the plural) which defines all the + rest of the renderer classes. + */ + +class WXDLLIMPEXP_FWD_ADV wxDataViewCustomRenderer; + +// ---------------------------------------------------------------------------- +// wxDataViewIconText: helper class used by wxDataViewIconTextRenderer +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewIconText : public wxObject +{ +public: + wxDataViewIconText( const wxString &text = wxEmptyString, + const wxIcon& icon = wxNullIcon ) + : m_text(text), + m_icon(icon) + { } + + wxDataViewIconText( const wxDataViewIconText &other ) + : wxObject(), + m_text(other.m_text), + m_icon(other.m_icon) + { } + + void SetText( const wxString &text ) { m_text = text; } + wxString GetText() const { return m_text; } + void SetIcon( const wxIcon &icon ) { m_icon = icon; } + const wxIcon &GetIcon() const { return m_icon; } + + bool IsSameAs(const wxDataViewIconText& other) const + { + return m_text == other.m_text && m_icon.IsSameAs(other.m_icon); + } + + bool operator==(const wxDataViewIconText& other) const + { + return IsSameAs(other); + } + + bool operator!=(const wxDataViewIconText& other) const + { + return !IsSameAs(other); + } + +private: + wxString m_text; + wxIcon m_icon; + + DECLARE_DYNAMIC_CLASS(wxDataViewIconText) +}; + +DECLARE_VARIANT_OBJECT_EXPORTED(wxDataViewIconText, WXDLLIMPEXP_ADV) + +// ---------------------------------------------------------------------------- +// wxDataViewRendererBase +// ---------------------------------------------------------------------------- + +enum wxDataViewCellMode +{ + wxDATAVIEW_CELL_INERT, + wxDATAVIEW_CELL_ACTIVATABLE, + wxDATAVIEW_CELL_EDITABLE +}; + +enum wxDataViewCellRenderState +{ + wxDATAVIEW_CELL_SELECTED = 1, + wxDATAVIEW_CELL_PRELIT = 2, + wxDATAVIEW_CELL_INSENSITIVE = 4, + wxDATAVIEW_CELL_FOCUSED = 8 +}; + +class WXDLLIMPEXP_ADV wxDataViewRendererBase: public wxObject +{ +public: + wxDataViewRendererBase( const wxString &varianttype, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int alignment = wxDVR_DEFAULT_ALIGNMENT ); + virtual ~wxDataViewRendererBase(); + + virtual bool Validate( wxVariant& WXUNUSED(value) ) + { return true; } + + void SetOwner( wxDataViewColumn *owner ) { m_owner = owner; } + wxDataViewColumn* GetOwner() const { return m_owner; } + + // renderer value and attributes: SetValue() and SetAttr() are called + // before a cell is rendered using this renderer + virtual bool SetValue(const wxVariant& value) = 0; + virtual bool GetValue(wxVariant& value) const = 0; + + virtual void SetAttr(const wxDataViewItemAttr& WXUNUSED(attr)) { } + + virtual void SetEnabled(bool WXUNUSED(enabled)) { } + + wxString GetVariantType() const { return m_variantType; } + + // helper that calls SetValue and SetAttr: + void PrepareForItem(const wxDataViewModel *model, + const wxDataViewItem& item, unsigned column); + + // renderer properties: + virtual void SetMode( wxDataViewCellMode mode ) = 0; + virtual wxDataViewCellMode GetMode() const = 0; + + // NOTE: Set/GetAlignment do not take/return a wxAlignment enum but + // rather an "int"; that's because for rendering cells it's allowed + // to combine alignment flags (e.g. wxALIGN_LEFT|wxALIGN_BOTTOM) + virtual void SetAlignment( int align ) = 0; + virtual int GetAlignment() const = 0; + + // enable or disable (if called with wxELLIPSIZE_NONE) replacing parts of + // the item text (hence this only makes sense for renderers showing + // text...) with ellipsis in order to make it fit the column width + virtual void EnableEllipsize(wxEllipsizeMode mode = wxELLIPSIZE_MIDDLE) = 0; + void DisableEllipsize() { EnableEllipsize(wxELLIPSIZE_NONE); } + + virtual wxEllipsizeMode GetEllipsizeMode() const = 0; + + // in-place editing + virtual bool HasEditorCtrl() const + { return false; } + virtual wxWindow* CreateEditorCtrl(wxWindow * WXUNUSED(parent), + wxRect WXUNUSED(labelRect), + const wxVariant& WXUNUSED(value)) + { return NULL; } + virtual bool GetValueFromEditorCtrl(wxWindow * WXUNUSED(editor), + wxVariant& WXUNUSED(value)) + { return false; } + + virtual bool StartEditing( const wxDataViewItem &item, wxRect labelRect ); + virtual void CancelEditing(); + virtual bool FinishEditing(); + + wxWindow *GetEditorCtrl() { return m_editorCtrl; } + + virtual bool IsCustomRenderer() const { return false; } + + +protected: + // Called from {Cancel,Finish}Editing() to cleanup m_editorCtrl + void DestroyEditControl(); + + // Return the alignment of this renderer if it's specified (i.e. has value + // different from the default wxDVR_DEFAULT_ALIGNMENT) or the alignment of + // the column it is used for otherwise. + // + // Unlike GetAlignment(), this always returns a valid combination of + // wxALIGN_XXX flags (although possibly wxALIGN_NOT) and never returns + // wxDVR_DEFAULT_ALIGNMENT. + int GetEffectiveAlignment() const; + + wxString m_variantType; + wxDataViewColumn *m_owner; + wxWeakRef m_editorCtrl; + wxDataViewItem m_item; // for m_editorCtrl + + // internal utility, may be used anywhere the window associated with the + // renderer is required + wxDataViewCtrl* GetView() const; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRendererBase) +}; + +// include the real wxDataViewRenderer declaration for the native ports +#ifdef wxHAS_GENERIC_DATAVIEWCTRL + // in the generic implementation there is no real wxDataViewRenderer, all + // renderers are custom so it's the same as wxDataViewCustomRenderer and + // wxDataViewCustomRendererBase derives from wxDataViewRendererBase directly + // + // this is a rather ugly hack but unfortunately it just doesn't seem to be + // possible to have the same class hierarchy in all ports and avoid + // duplicating the entire wxDataViewCustomRendererBase in the generic + // wxDataViewRenderer class (well, we could use a mix-in but this would + // make classes hierarchy non linear and arguably even more complex) + #define wxDataViewCustomRendererRealBase wxDataViewRendererBase +#else + #if defined(__WXGTK20__) + #include "wx/gtk/dvrenderer.h" + #elif defined(__WXMAC__) + #include "wx/osx/dvrenderer.h" + #else + #error "unknown native wxDataViewCtrl implementation" + #endif + #define wxDataViewCustomRendererRealBase wxDataViewRenderer +#endif + +// ---------------------------------------------------------------------------- +// wxDataViewCustomRendererBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewCustomRendererBase + : public wxDataViewCustomRendererRealBase +{ +public: + // Constructor must specify the usual renderer parameters which we simply + // pass to the base class + wxDataViewCustomRendererBase(const wxString& varianttype = "string", + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int align = wxDVR_DEFAULT_ALIGNMENT) + : wxDataViewCustomRendererRealBase(varianttype, mode, align) + { + } + + + // Render the item using the current value (returned by GetValue()). + virtual bool Render(wxRect cell, wxDC *dc, int state) = 0; + + // Return the size of the item appropriate to its current value. + virtual wxSize GetSize() const = 0; + + // Define virtual function which are called when a key is pressed on the + // item, clicked or the user starts to drag it: by default they all simply + // return false indicating that the events are not handled + + virtual bool ActivateCell(const wxRect& cell, + wxDataViewModel *model, + const wxDataViewItem & item, + unsigned int col, + const wxMouseEvent* mouseEvent); + + // Deprecated, use (and override) ActivateCell() instead + wxDEPRECATED_BUT_USED_INTERNALLY_INLINE( + virtual bool Activate(wxRect WXUNUSED(cell), + wxDataViewModel *WXUNUSED(model), + const wxDataViewItem & WXUNUSED(item), + unsigned int WXUNUSED(col)), + return false; ) + + // Deprecated, use (and override) ActivateCell() instead + wxDEPRECATED_BUT_USED_INTERNALLY_INLINE( + virtual bool LeftClick(wxPoint WXUNUSED(cursor), + wxRect WXUNUSED(cell), + wxDataViewModel *WXUNUSED(model), + const wxDataViewItem & WXUNUSED(item), + unsigned int WXUNUSED(col)), + return false; ) + + virtual bool StartDrag(const wxPoint& WXUNUSED(cursor), + const wxRect& WXUNUSED(cell), + wxDataViewModel *WXUNUSED(model), + const wxDataViewItem & WXUNUSED(item), + unsigned int WXUNUSED(col) ) + { return false; } + + + // Helper which can be used by Render() implementation in the derived + // classes: it will draw the text in the same manner as the standard + // renderers do. + virtual void RenderText(const wxString& text, + int xoffset, + wxRect cell, + wxDC *dc, + int state); + + + // Override the base class virtual method to simply store the attribute so + // that it can be accessed using GetAttr() from Render() if needed. + virtual void SetAttr(const wxDataViewItemAttr& attr) { m_attr = attr; } + const wxDataViewItemAttr& GetAttr() const { return m_attr; } + + // Store the enabled state of the item so that it can be accessed from + // Render() via GetEnabled() if needed. + virtual void SetEnabled(bool enabled) { m_enabled = enabled; } + bool GetEnabled() const { return m_enabled; } + + + // Implementation only from now on + + // Retrieve the DC to use for drawing. This is implemented in derived + // platform-specific classes. + virtual wxDC *GetDC() = 0; + + // To draw background use the background colour in wxDataViewItemAttr + virtual void RenderBackground(wxDC* dc, const wxRect& rect); + + // Prepare DC to use attributes and call Render(). + void WXCallRender(wxRect rect, wxDC *dc, int state); + + virtual bool IsCustomRenderer() const { return true; } + +protected: + // helper for GetSize() implementations, respects attributes + wxSize GetTextExtent(const wxString& str) const; + +private: + wxDataViewItemAttr m_attr; + bool m_enabled; + + wxDECLARE_NO_COPY_CLASS(wxDataViewCustomRendererBase); +}; + +// include the declaration of all the other renderers to get the real +// wxDataViewCustomRenderer from which we need to inherit below +#ifdef wxHAS_GENERIC_DATAVIEWCTRL + // because of the different renderer classes hierarchy in the generic + // version, as explained above, we can include the header defining + // wxDataViewRenderer only here and not before wxDataViewCustomRendererBase + // declaration as for the native ports + #include "wx/generic/dvrenderer.h" + #include "wx/generic/dvrenderers.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/dvrenderers.h" +#elif defined(__WXMAC__) + #include "wx/osx/dvrenderers.h" +#else + #error "unknown native wxDataViewCtrl implementation" +#endif + +// ---------------------------------------------------------------------------- +// wxDataViewSpinRenderer +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewSpinRenderer: public wxDataViewCustomRenderer +{ +public: + wxDataViewSpinRenderer( int min, int max, + wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE, + int alignment = wxDVR_DEFAULT_ALIGNMENT ); + virtual bool HasEditorCtrl() const { return true; } + virtual wxWindow* CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value ); + virtual bool GetValueFromEditorCtrl( wxWindow* editor, wxVariant &value ); + virtual bool Render( wxRect rect, wxDC *dc, int state ); + virtual wxSize GetSize() const; + virtual bool SetValue( const wxVariant &value ); + virtual bool GetValue( wxVariant &value ) const; + +private: + long m_data; + long m_min,m_max; +}; + +#if defined(wxHAS_GENERIC_DATAVIEWCTRL) || defined(__WXOSX_CARBON__) + +// ---------------------------------------------------------------------------- +// wxDataViewChoiceRenderer +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewChoiceRenderer: public wxDataViewCustomRenderer +{ +public: + wxDataViewChoiceRenderer( const wxArrayString &choices, + wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE, + int alignment = wxDVR_DEFAULT_ALIGNMENT ); + virtual bool HasEditorCtrl() const { return true; } + virtual wxWindow* CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value ); + virtual bool GetValueFromEditorCtrl( wxWindow* editor, wxVariant &value ); + virtual bool Render( wxRect rect, wxDC *dc, int state ); + virtual wxSize GetSize() const; + virtual bool SetValue( const wxVariant &value ); + virtual bool GetValue( wxVariant &value ) const; + + wxString GetChoice(size_t index) const { return m_choices[index]; } + const wxArrayString& GetChoices() const { return m_choices; } + +private: + wxArrayString m_choices; + wxString m_data; +}; + +// ---------------------------------------------------------------------------- +// wxDataViewChoiceByIndexRenderer +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewChoiceByIndexRenderer: public wxDataViewChoiceRenderer +{ +public: + wxDataViewChoiceByIndexRenderer( const wxArrayString &choices, + wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE, + int alignment = wxDVR_DEFAULT_ALIGNMENT ); + + virtual wxWindow* CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value ); + virtual bool GetValueFromEditorCtrl( wxWindow* editor, wxVariant &value ); + + virtual bool SetValue( const wxVariant &value ); + virtual bool GetValue( wxVariant &value ) const; +}; + + +#endif // generic or Carbon versions + +#if defined(wxHAS_GENERIC_DATAVIEWCTRL) || defined(__WXGTK__) + +// ---------------------------------------------------------------------------- +// wxDataViewDateRenderer +// ---------------------------------------------------------------------------- + +#if wxUSE_DATEPICKCTRL +class WXDLLIMPEXP_ADV wxDataViewDateRenderer: public wxDataViewCustomRenderer +{ +public: + wxDataViewDateRenderer(const wxString &varianttype = wxT("datetime"), + wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE, + int align = wxDVR_DEFAULT_ALIGNMENT); + + virtual bool HasEditorCtrl() const { return true; } + virtual wxWindow *CreateEditorCtrl(wxWindow *parent, wxRect labelRect, const wxVariant &value); + virtual bool GetValueFromEditorCtrl(wxWindow* editor, wxVariant &value); + virtual bool SetValue(const wxVariant &value); + virtual bool GetValue(wxVariant& value) const; + virtual bool Render( wxRect cell, wxDC *dc, int state ); + virtual wxSize GetSize() const; + +private: + wxDateTime m_date; +}; +#else // !wxUSE_DATEPICKCTRL +typedef wxDataViewTextRenderer wxDataViewDateRenderer; +#endif + +#endif // generic or GTK+ versions + +// this class is obsolete, its functionality was merged in +// wxDataViewTextRenderer itself now, don't use it any more +#define wxDataViewTextRendererAttr wxDataViewTextRenderer + +#endif // _WX_DVRENDERERS_H_ + diff --git a/wxmsw/include/wx-3.0/wx/dynarray.h b/wxmsw/include/wx-3.0/wx/dynarray.h new file mode 100644 index 00000000..6495030f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dynarray.h @@ -0,0 +1,1072 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/dynarray.h +// Purpose: auto-resizable (i.e. dynamic) array support +// Author: Vadim Zeitlin +// Modified by: +// Created: 12.09.97 +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _DYNARRAY_H +#define _DYNARRAY_H + +#include "wx/defs.h" + +#if wxUSE_STD_CONTAINERS + #include "wx/beforestd.h" + #include + #include + #include "wx/afterstd.h" +#endif + +/* + This header defines the dynamic arrays and object arrays (i.e. arrays which + own their elements). Dynamic means that the arrays grow automatically as + needed. + + These macros are ugly (especially if you look in the sources ;-), but they + allow us to define "template" classes without actually using templates and so + this works with all compilers (and may be also much faster to compile even + with a compiler which does support templates). The arrays defined with these + macros are type-safe. + + Range checking is performed in debug build for both arrays and objarrays but + not in release build - so using an invalid index will just lead to a crash + then. + + Note about memory usage: arrays never shrink automatically (although you may + use Shrink() function explicitly), they only grow, so loading 10 millions in + an array only to delete them 2 lines below might be a bad idea if the array + object is not going to be destroyed soon. However, as it does free memory + when destroyed, it is ok if the array is a local variable. + */ + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +/* + The initial size by which an array grows when an element is added default + value avoids allocate one or two bytes when the array is created which is + rather inefficient +*/ +#define WX_ARRAY_DEFAULT_INITIAL_SIZE (16) + +#define _WX_ERROR_REMOVE "removing inexistent element in wxArray::Remove" + +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +/* + Callback compare function for quick sort. + + It must return negative value, 0 or positive value if the first item is + less than, equal to or greater than the second one. + */ +extern "C" +{ +typedef int (wxCMPFUNC_CONV *CMPFUNC)(const void* pItem1, const void* pItem2); +} + +// ---------------------------------------------------------------------------- +// Base class managing data having size of type 'long' (not used directly) +// +// NB: for efficiency this often used class has no virtual functions (hence no +// virtual table), even dtor is *not* virtual. If used as expected it +// won't create any problems because ARRAYs from DEFINE_ARRAY have no dtor +// at all, so it's not too important if it's not called (this happens when +// you cast "SomeArray *" as "BaseArray *" and then delete it) +// ---------------------------------------------------------------------------- + +#if wxUSE_STD_CONTAINERS + +template +class wxArray_SortFunction +{ +public: + typedef int (wxCMPFUNC_CONV *CMPFUNC)(T* pItem1, T* pItem2); + + wxArray_SortFunction(CMPFUNC f) : m_f(f) { } + bool operator()(const T& i1, const T& i2) + { return m_f((T*)&i1, (T*)&i2) < 0; } +private: + CMPFUNC m_f; +}; + +template +class wxSortedArray_SortFunction +{ +public: + typedef F CMPFUNC; + + wxSortedArray_SortFunction(CMPFUNC f) : m_f(f) { } + bool operator()(const T& i1, const T& i2) + { return m_f(i1, i2) < 0; } +private: + CMPFUNC m_f; +}; + +#define _WX_DECLARE_BASEARRAY(T, name, classexp) \ + typedef int (wxCMPFUNC_CONV *CMPFUN##name)(T pItem1, T pItem2); \ + typedef wxSortedArray_SortFunction name##_Predicate; \ + _WX_DECLARE_BASEARRAY_2(T, name, name##_Predicate, classexp) + +#define _WX_DECLARE_BASEARRAY_2(T, name, predicate, classexp) \ +classexp name : public std::vector \ +{ \ + typedef predicate Predicate; \ + typedef predicate::CMPFUNC SCMPFUNC; \ +public: \ + typedef wxArray_SortFunction::CMPFUNC CMPFUNC; \ + \ +public: \ + typedef T base_type; \ + \ + name() : std::vector() { } \ + name(size_type n) : std::vector(n) { } \ + name(size_type n, const_reference v) : std::vector(n, v) { } \ + template \ + name(InputIterator first, InputIterator last) : std::vector(first, last) { } \ + \ + void Empty() { clear(); } \ + void Clear() { clear(); } \ + void Alloc(size_t uiSize) { reserve(uiSize); } \ + void Shrink() { name tmp(*this); swap(tmp); } \ + \ + size_t GetCount() const { return size(); } \ + void SetCount(size_t n, T v = T()) { resize(n, v); } \ + bool IsEmpty() const { return empty(); } \ + size_t Count() const { return size(); } \ + \ + T& Item(size_t uiIndex) const \ + { wxASSERT( uiIndex < size() ); return (T&)operator[](uiIndex); } \ + T& Last() const { return Item(size() - 1); } \ + \ + int Index(T item, bool bFromEnd = false) const \ + { \ + if ( bFromEnd ) \ + { \ + const const_reverse_iterator b = rbegin(), \ + e = rend(); \ + for ( const_reverse_iterator i = b; i != e; ++i ) \ + if ( *i == item ) \ + return (int)(e - i - 1); \ + } \ + else \ + { \ + const const_iterator b = begin(), \ + e = end(); \ + for ( const_iterator i = b; i != e; ++i ) \ + if ( *i == item ) \ + return (int)(i - b); \ + } \ + \ + return wxNOT_FOUND; \ + } \ + int Index(T lItem, CMPFUNC fnCompare) const \ + { \ + Predicate p((SCMPFUNC)fnCompare); \ + const_iterator i = std::lower_bound(begin(), end(), lItem, p);\ + return i != end() && !p(lItem, *i) ? (int)(i - begin()) \ + : wxNOT_FOUND; \ + } \ + size_t IndexForInsert(T lItem, CMPFUNC fnCompare) const \ + { \ + Predicate p((SCMPFUNC)fnCompare); \ + const_iterator i = std::lower_bound(begin(), end(), lItem, p);\ + return i - begin(); \ + } \ + void Add(T lItem, size_t nInsert = 1) \ + { insert(end(), nInsert, lItem); } \ + size_t Add(T lItem, CMPFUNC fnCompare) \ + { \ + size_t n = IndexForInsert(lItem, fnCompare); \ + Insert(lItem, n); \ + return n; \ + } \ + void Insert(T lItem, size_t uiIndex, size_t nInsert = 1) \ + { insert(begin() + uiIndex, nInsert, lItem); } \ + void Remove(T lItem) \ + { \ + int n = Index(lItem); \ + wxCHECK_RET( n != wxNOT_FOUND, _WX_ERROR_REMOVE ); \ + RemoveAt((size_t)n); \ + } \ + void RemoveAt(size_t uiIndex, size_t nRemove = 1) \ + { erase(begin() + uiIndex, begin() + uiIndex + nRemove); } \ + \ + void Sort(CMPFUNC fCmp) \ + { \ + wxArray_SortFunction p(fCmp); \ + std::sort(begin(), end(), p); \ + } \ +} + +#else // if !wxUSE_STD_CONTAINERS + +#define _WX_DECLARE_BASEARRAY(T, name, classexp) \ +classexp name \ +{ \ + typedef CMPFUNC SCMPFUNC; /* for compatibility wuth wxUSE_STD_CONTAINERS */ \ +public: \ + name(); \ + name(const name& array); \ + name& operator=(const name& src); \ + ~name(); \ + \ + void Empty() { m_nCount = 0; } \ + void Clear(); \ + void Alloc(size_t n) { if ( n > m_nSize ) Realloc(n); } \ + void Shrink(); \ + \ + size_t GetCount() const { return m_nCount; } \ + void SetCount(size_t n, T defval = T()); \ + bool IsEmpty() const { return m_nCount == 0; } \ + size_t Count() const { return m_nCount; } \ + \ + typedef T base_type; \ + \ +protected: \ + T& Item(size_t uiIndex) const \ + { wxASSERT( uiIndex < m_nCount ); return m_pItems[uiIndex]; } \ + T& operator[](size_t uiIndex) const { return Item(uiIndex); } \ + \ + int Index(T lItem, bool bFromEnd = false) const; \ + int Index(T lItem, CMPFUNC fnCompare) const; \ + size_t IndexForInsert(T lItem, CMPFUNC fnCompare) const; \ + void Add(T lItem, size_t nInsert = 1); \ + size_t Add(T lItem, CMPFUNC fnCompare); \ + void Insert(T lItem, size_t uiIndex, size_t nInsert = 1); \ + void Remove(T lItem); \ + void RemoveAt(size_t uiIndex, size_t nRemove = 1); \ + \ + void Sort(CMPFUNC fnCompare); \ + \ + /* *minimal* STL-ish interface, for derived classes */ \ + typedef T value_type; \ + typedef value_type* iterator; \ + typedef const value_type* const_iterator; \ + typedef value_type& reference; \ + typedef const value_type& const_reference; \ + typedef ptrdiff_t difference_type; \ + typedef size_t size_type; \ + \ + void assign(const_iterator first, const_iterator last); \ + void assign(size_type n, const_reference v); \ + size_type capacity() const { return m_nSize; } \ + iterator erase(iterator first, iterator last) \ + { \ + size_type idx = first - begin(); \ + RemoveAt(idx, last - first); \ + return begin() + idx; \ + } \ + iterator erase(iterator it) { return erase(it, it + 1); } \ + void insert(iterator it, size_type n, const value_type& v) \ + { Insert(v, it - begin(), n); } \ + iterator insert(iterator it, const value_type& v = value_type()) \ + { \ + size_type idx = it - begin(); \ + Insert(v, idx); \ + return begin() + idx; \ + } \ + void insert(iterator it, const_iterator first, const_iterator last);\ + void pop_back() { RemoveAt(size() - 1); } \ + void push_back(const value_type& v) { Add(v); } \ + void reserve(size_type n) { Alloc(n); } \ + void resize(size_type count, value_type defval = value_type()) \ + { \ + if ( count < m_nCount ) \ + m_nCount = count; \ + else \ + SetCount(count, defval); \ + } \ + \ + iterator begin() { return m_pItems; } \ + iterator end() { return m_pItems + m_nCount; } \ + const_iterator begin() const { return m_pItems; } \ + const_iterator end() const { return m_pItems + m_nCount; } \ + \ + void swap(name& other) \ + { \ + wxSwap(m_nSize, other.m_nSize); \ + wxSwap(m_nCount, other.m_nCount); \ + wxSwap(m_pItems, other.m_pItems); \ + } \ + \ + /* the following functions may be made directly public because */ \ + /* they don't use the type of the elements at all */ \ +public: \ + void clear() { Clear(); } \ + bool empty() const { return IsEmpty(); } \ + size_type max_size() const { return INT_MAX; } \ + size_type size() const { return GetCount(); } \ + \ +private: \ + void Grow(size_t nIncrement = 0); \ + bool Realloc(size_t nSize); \ + \ + size_t m_nSize, \ + m_nCount; \ + \ + T *m_pItems; \ +} + +#endif // !wxUSE_STD_CONTAINERS + +// ============================================================================ +// The private helper macros containing the core of the array classes +// ============================================================================ + +// Implementation notes: +// +// JACS: Salford C++ doesn't like 'var->operator=' syntax, as in: +// { ((wxBaseArray *)this)->operator=((const wxBaseArray&)src); +// so using a temporary variable instead. +// +// The classes need a (even trivial) ~name() to link under Mac X + +// ---------------------------------------------------------------------------- +// _WX_DEFINE_TYPEARRAY: array for simple types +// ---------------------------------------------------------------------------- + +#if wxUSE_STD_CONTAINERS + +// in STL case we don't need the entire base arrays hack as standard container +// don't suffer from alignment/storage problems as our home-grown do +#define _WX_DEFINE_TYPEARRAY(T, name, base, classexp) \ + _WX_DECLARE_BASEARRAY(T, name, classexp) + +#define _WX_DEFINE_TYPEARRAY_PTR(T, name, base, classexp) \ + _WX_DEFINE_TYPEARRAY(T, name, base, classexp) + +#else // if !wxUSE_STD_CONTAINERS + +// common declaration used by both _WX_DEFINE_TYPEARRAY and +// _WX_DEFINE_TYPEARRAY_PTR +#define _WX_DEFINE_TYPEARRAY_HELPER(T, name, base, classexp, ptrop) \ +wxCOMPILE_TIME_ASSERT2(sizeof(T) <= sizeof(base::base_type), \ + TypeTooBigToBeStoredIn##base, \ + name); \ +typedef int (CMPFUNC_CONV *CMPFUNC##T)(T *pItem1, T *pItem2); \ +classexp name : public base \ +{ \ +public: \ + name() { } \ + ~name() { } \ + \ + T& operator[](size_t uiIndex) const \ + { return (T&)(base::operator[](uiIndex)); } \ + T& Item(size_t uiIndex) const \ + { return (T&)(base::operator[](uiIndex)); } \ + T& Last() const \ + { return (T&)(base::operator[](GetCount() - 1)); } \ + \ + int Index(T lItem, bool bFromEnd = false) const \ + { return base::Index((base_type)lItem, bFromEnd); } \ + \ + void Add(T lItem, size_t nInsert = 1) \ + { base::Add((base_type)lItem, nInsert); } \ + void Insert(T lItem, size_t uiIndex, size_t nInsert = 1) \ + { base::Insert((base_type)lItem, uiIndex, nInsert) ; } \ + \ + void RemoveAt(size_t uiIndex, size_t nRemove = 1) \ + { base::RemoveAt(uiIndex, nRemove); } \ + void Remove(T lItem) \ + { int iIndex = Index(lItem); \ + wxCHECK_RET( iIndex != wxNOT_FOUND, _WX_ERROR_REMOVE); \ + base::RemoveAt((size_t)iIndex); } \ + \ + void Sort(CMPFUNC##T fCmp) { base::Sort((CMPFUNC)fCmp); } \ + \ + /* STL-like interface */ \ +private: \ + typedef base::iterator biterator; \ + typedef base::const_iterator bconst_iterator; \ + typedef base::value_type bvalue_type; \ + typedef base::const_reference bconst_reference; \ +public: \ + typedef T value_type; \ + typedef value_type* pointer; \ + typedef const value_type* const_pointer; \ + typedef value_type* iterator; \ + typedef const value_type* const_iterator; \ + typedef value_type& reference; \ + typedef const value_type& const_reference; \ + typedef base::difference_type difference_type; \ + typedef base::size_type size_type; \ + \ + class reverse_iterator \ + { \ + typedef T value_type; \ + typedef value_type& reference; \ + typedef value_type* pointer; \ + typedef reverse_iterator itor; \ + friend inline itor operator+(int o, const itor& it) \ + { return it.m_ptr - o; } \ + friend inline itor operator+(const itor& it, int o) \ + { return it.m_ptr - o; } \ + friend inline itor operator-(const itor& it, int o) \ + { return it.m_ptr + o; } \ + friend inline difference_type operator-(const itor& i1, \ + const itor& i2) \ + { return i1.m_ptr - i2.m_ptr; } \ + \ + public: \ + pointer m_ptr; \ + reverse_iterator() : m_ptr(NULL) { } \ + reverse_iterator(pointer ptr) : m_ptr(ptr) { } \ + reverse_iterator(const itor& it) : m_ptr(it.m_ptr) { } \ + reference operator*() const { return *m_ptr; } \ + ptrop \ + itor& operator++() { --m_ptr; return *this; } \ + const itor operator++(int) \ + { reverse_iterator tmp = *this; --m_ptr; return tmp; } \ + itor& operator--() { ++m_ptr; return *this; } \ + const itor operator--(int) { itor tmp = *this; ++m_ptr; return tmp; }\ + bool operator ==(const itor& it) const { return m_ptr == it.m_ptr; }\ + bool operator !=(const itor& it) const { return m_ptr != it.m_ptr; }\ + }; \ + \ + class const_reverse_iterator \ + { \ + typedef T value_type; \ + typedef const value_type& reference; \ + typedef const value_type* pointer; \ + typedef const_reverse_iterator itor; \ + friend inline itor operator+(int o, const itor& it) \ + { return it.m_ptr - o; } \ + friend inline itor operator+(const itor& it, int o) \ + { return it.m_ptr - o; } \ + friend inline itor operator-(const itor& it, int o) \ + { return it.m_ptr + o; } \ + friend inline difference_type operator-(const itor& i1, \ + const itor& i2) \ + { return i1.m_ptr - i2.m_ptr; } \ + \ + public: \ + pointer m_ptr; \ + const_reverse_iterator() : m_ptr(NULL) { } \ + const_reverse_iterator(pointer ptr) : m_ptr(ptr) { } \ + const_reverse_iterator(const itor& it) : m_ptr(it.m_ptr) { } \ + const_reverse_iterator(const reverse_iterator& it) : m_ptr(it.m_ptr) { }\ + reference operator*() const { return *m_ptr; } \ + ptrop \ + itor& operator++() { --m_ptr; return *this; } \ + const itor operator++(int) \ + { itor tmp = *this; --m_ptr; return tmp; } \ + itor& operator--() { ++m_ptr; return *this; } \ + const itor operator--(int) { itor tmp = *this; ++m_ptr; return tmp; }\ + bool operator ==(const itor& it) const { return m_ptr == it.m_ptr; }\ + bool operator !=(const itor& it) const { return m_ptr != it.m_ptr; }\ + }; \ + \ + name(size_type n) { assign(n, value_type()); } \ + name(size_type n, const_reference v) { assign(n, v); } \ + name(const_iterator first, const_iterator last) \ + { assign(first, last); } \ + void assign(const_iterator first, const_iterator last) \ + { base::assign((bconst_iterator)first, (bconst_iterator)last); } \ + void assign(size_type n, const_reference v) \ + { base::assign(n, (bconst_reference)v); } \ + reference back() { return *(end() - 1); } \ + const_reference back() const { return *(end() - 1); } \ + iterator begin() { return (iterator)base::begin(); } \ + const_iterator begin() const { return (const_iterator)base::begin(); }\ + size_type capacity() const { return base::capacity(); } \ + iterator end() { return (iterator)base::end(); } \ + const_iterator end() const { return (const_iterator)base::end(); } \ + iterator erase(iterator first, iterator last) \ + { return (iterator)base::erase((biterator)first, (biterator)last); }\ + iterator erase(iterator it) \ + { return (iterator)base::erase((biterator)it); } \ + reference front() { return *begin(); } \ + const_reference front() const { return *begin(); } \ + void insert(iterator it, size_type n, const_reference v) \ + { base::insert((biterator)it, n, (bconst_reference)v); } \ + iterator insert(iterator it, const_reference v = value_type()) \ + { return (iterator)base::insert((biterator)it, (bconst_reference)v); }\ + void insert(iterator it, const_iterator first, const_iterator last) \ + { base::insert((biterator)it, (bconst_iterator)first, \ + (bconst_iterator)last); } \ + void pop_back() { base::pop_back(); } \ + void push_back(const_reference v) \ + { base::push_back((bconst_reference)v); } \ + reverse_iterator rbegin() { return reverse_iterator(end() - 1); } \ + const_reverse_iterator rbegin() const; \ + reverse_iterator rend() { return reverse_iterator(begin() - 1); } \ + const_reverse_iterator rend() const; \ + void reserve(size_type n) { base::reserve(n); } \ + void resize(size_type n, value_type v = value_type()) \ + { base::resize(n, v); } \ + void swap(name& other) { base::swap(other); } \ +} + +#define _WX_PTROP pointer operator->() const { return m_ptr; } +#define _WX_PTROP_NONE + +#define _WX_DEFINE_TYPEARRAY(T, name, base, classexp) \ + _WX_DEFINE_TYPEARRAY_HELPER(T, name, base, classexp, _WX_PTROP) +#define _WX_DEFINE_TYPEARRAY_PTR(T, name, base, classexp) \ + _WX_DEFINE_TYPEARRAY_HELPER(T, name, base, classexp, _WX_PTROP_NONE) + +#endif // !wxUSE_STD_CONTAINERS + +// ---------------------------------------------------------------------------- +// _WX_DEFINE_SORTED_TYPEARRAY: sorted array for simple data types +// cannot handle types with size greater than pointer because of sorting +// ---------------------------------------------------------------------------- + +#define _WX_DEFINE_SORTED_TYPEARRAY_2(T, name, base, defcomp, classexp, comptype)\ +wxCOMPILE_TIME_ASSERT2(sizeof(T) <= sizeof(base::base_type), \ + TypeTooBigToBeStoredInSorted##base, \ + name); \ +classexp name : public base \ +{ \ + typedef comptype SCMPFUNC; \ +public: \ + name(comptype fn defcomp) { m_fnCompare = fn; } \ + \ + name& operator=(const name& src) \ + { base* temp = (base*) this; \ + (*temp) = ((const base&)src); \ + m_fnCompare = src.m_fnCompare; \ + return *this; } \ + \ + T& operator[](size_t uiIndex) const \ + { return (T&)(base::operator[](uiIndex)); } \ + T& Item(size_t uiIndex) const \ + { return (T&)(base::operator[](uiIndex)); } \ + T& Last() const \ + { return (T&)(base::operator[](size() - 1)); } \ + \ + int Index(T lItem) const \ + { return base::Index(lItem, (CMPFUNC)m_fnCompare); } \ + \ + size_t IndexForInsert(T lItem) const \ + { return base::IndexForInsert(lItem, (CMPFUNC)m_fnCompare); } \ + \ + void AddAt(T item, size_t index) \ + { base::insert(begin() + index, item); } \ + \ + size_t Add(T lItem) \ + { return base::Add(lItem, (CMPFUNC)m_fnCompare); } \ + void push_back(T lItem) \ + { Add(lItem); } \ + \ + void RemoveAt(size_t uiIndex, size_t nRemove = 1) \ + { base::erase(begin() + uiIndex, begin() + uiIndex + nRemove); } \ + void Remove(T lItem) \ + { int iIndex = Index(lItem); \ + wxCHECK_RET( iIndex != wxNOT_FOUND, _WX_ERROR_REMOVE ); \ + base::erase(begin() + iIndex); } \ + \ +private: \ + comptype m_fnCompare; \ +} + + +// ---------------------------------------------------------------------------- +// _WX_DECLARE_OBJARRAY: an array for pointers to type T with owning semantics +// ---------------------------------------------------------------------------- + +#define _WX_DECLARE_OBJARRAY(T, name, base, classexp) \ +typedef int (CMPFUNC_CONV *CMPFUNC##T)(T **pItem1, T **pItem2); \ +classexp name : protected base \ +{ \ +typedef int (CMPFUNC_CONV *CMPFUNC##base)(void **pItem1, void **pItem2); \ +typedef base base_array; \ +public: \ + name() { } \ + name(const name& src); \ + name& operator=(const name& src); \ + \ + ~name(); \ + \ + void Alloc(size_t count) { base::reserve(count); } \ + void reserve(size_t count) { base::reserve(count); } \ + size_t GetCount() const { return base_array::size(); } \ + size_t size() const { return base_array::size(); } \ + bool IsEmpty() const { return base_array::empty(); } \ + bool empty() const { return base_array::empty(); } \ + size_t Count() const { return base_array::size(); } \ + void Shrink() { base::Shrink(); } \ + \ + T& operator[](size_t uiIndex) const \ + { return *(T*)base::operator[](uiIndex); } \ + T& Item(size_t uiIndex) const \ + { return *(T*)base::operator[](uiIndex); } \ + T& Last() const \ + { return *(T*)(base::operator[](size() - 1)); } \ + \ + int Index(const T& lItem, bool bFromEnd = false) const; \ + \ + void Add(const T& lItem, size_t nInsert = 1); \ + void Add(const T* pItem) \ + { base::push_back((T*)pItem); } \ + void push_back(const T* pItem) \ + { base::push_back((T*)pItem); } \ + void push_back(const T& lItem) \ + { Add(lItem); } \ + \ + void Insert(const T& lItem, size_t uiIndex, size_t nInsert = 1); \ + void Insert(const T* pItem, size_t uiIndex) \ + { base::insert(begin() + uiIndex, (T*)pItem); } \ + \ + void Empty() { DoEmpty(); base::clear(); } \ + void Clear() { DoEmpty(); base::clear(); } \ + \ + T* Detach(size_t uiIndex) \ + { T* p = (T*)base::operator[](uiIndex); \ + base::erase(begin() + uiIndex); return p; } \ + void RemoveAt(size_t uiIndex, size_t nRemove = 1); \ + \ + void Sort(CMPFUNC##T fCmp) { base::Sort((CMPFUNC##base)fCmp); } \ + \ +private: \ + void DoEmpty(); \ + void DoCopy(const name& src); \ +} + +// ============================================================================ +// The public macros for declaration and definition of the dynamic arrays +// ============================================================================ + +// Please note that for each macro WX_FOO_ARRAY we also have +// WX_FOO_EXPORTED_ARRAY and WX_FOO_USER_EXPORTED_ARRAY which are exactly the +// same except that they use an additional __declspec(dllexport) or equivalent +// under Windows if needed. +// +// The first (just EXPORTED) macros do it if wxWidgets was compiled as a DLL +// and so must be used used inside the library. The second kind (USER_EXPORTED) +// allow the user code to do it when it wants. This is needed if you have a dll +// that wants to export a wxArray daubed with your own import/export goo. +// +// Finally, you can define the macro below as something special to modify the +// arrays defined by a simple WX_FOO_ARRAY as well. By default is empty. +#define wxARRAY_DEFAULT_EXPORT + +// ---------------------------------------------------------------------------- +// WX_DECLARE_BASEARRAY(T, name) declare an array class named "name" containing +// the elements of type T +// ---------------------------------------------------------------------------- + +#define WX_DECLARE_BASEARRAY(T, name) \ + WX_DECLARE_USER_EXPORTED_BASEARRAY(T, name, wxARRAY_DEFAULT_EXPORT) + +#define WX_DECLARE_EXPORTED_BASEARRAY(T, name) \ + WX_DECLARE_USER_EXPORTED_BASEARRAY(T, name, WXDLLIMPEXP_CORE) + +#define WX_DECLARE_USER_EXPORTED_BASEARRAY(T, name, expmode) \ + typedef T _wxArray##name; \ + _WX_DECLARE_BASEARRAY(_wxArray##name, name, class expmode) + +// ---------------------------------------------------------------------------- +// WX_DEFINE_TYPEARRAY(T, name, base) define an array class named "name" deriving +// from class "base" containing the elements of type T +// +// Note that the class defined has only inline function and doesn't take any +// space at all so there is no size penalty for defining multiple array classes +// ---------------------------------------------------------------------------- + +#define WX_DEFINE_TYPEARRAY(T, name, base) \ + WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, class wxARRAY_DEFAULT_EXPORT) + +#define WX_DEFINE_TYPEARRAY_PTR(T, name, base) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, base, class wxARRAY_DEFAULT_EXPORT) + +#define WX_DEFINE_EXPORTED_TYPEARRAY(T, name, base) \ + WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, class WXDLLIMPEXP_CORE) + +#define WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, base) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, base, class WXDLLIMPEXP_CORE) + +#define WX_DEFINE_USER_EXPORTED_TYPEARRAY(T, name, base, expdecl) \ + WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, class expdecl) + +#define WX_DEFINE_USER_EXPORTED_TYPEARRAY_PTR(T, name, base, expdecl) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, base, class expdecl) + +#define WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, classdecl) \ + typedef T _wxArray##name; \ + _WX_DEFINE_TYPEARRAY(_wxArray##name, name, base, classdecl) + +#define WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, base, classdecl) \ + typedef T _wxArray##name; \ + _WX_DEFINE_TYPEARRAY_PTR(_wxArray##name, name, base, classdecl) + +// ---------------------------------------------------------------------------- +// WX_DEFINE_SORTED_TYPEARRAY: this is the same as the previous macro, but it +// defines a sorted array. +// +// Differences: +// 1) it must be given a COMPARE function in ctor which takes 2 items of type +// T* and should return -1, 0 or +1 if the first one is less/greater +// than/equal to the second one. +// 2) the Add() method inserts the item in such was that the array is always +// sorted (it uses the COMPARE function) +// 3) it has no Sort() method because it's always sorted +// 4) Index() method is much faster (the sorted arrays use binary search +// instead of linear one), but Add() is slower. +// 5) there is no Insert() method because you can't insert an item into the +// given position in a sorted array but there is IndexForInsert()/AddAt() +// pair which may be used to optimize a common operation of "insert only if +// not found" +// +// Note that you have to specify the comparison function when creating the +// objects of this array type. If, as in 99% of cases, the comparison function +// is the same for all objects of a class, WX_DEFINE_SORTED_TYPEARRAY_CMP below +// is more convenient. +// +// Summary: use this class when the speed of Index() function is important, use +// the normal arrays otherwise. +// ---------------------------------------------------------------------------- + +// we need a macro which expands to nothing to pass correct number of +// parameters to a nested macro invocation even when we don't have anything to +// pass it +#define wxARRAY_EMPTY + +#define WX_DEFINE_SORTED_TYPEARRAY(T, name, base) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, base, \ + wxARRAY_DEFAULT_EXPORT) + +#define WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, base) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, base, WXDLLIMPEXP_CORE) + +#define WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, base, expmode) \ + typedef T _wxArray##name; \ + typedef int (CMPFUNC_CONV *SCMPFUNC##name)(T pItem1, T pItem2); \ + _WX_DEFINE_SORTED_TYPEARRAY_2(_wxArray##name, name, base, \ + wxARRAY_EMPTY, class expmode, SCMPFUNC##name) + +// ---------------------------------------------------------------------------- +// WX_DEFINE_SORTED_TYPEARRAY_CMP: exactly the same as above but the comparison +// function is provided by this macro and the objects of this class have a +// default constructor which just uses it. +// +// The arguments are: the element type, the comparison function and the array +// name +// +// NB: this is, of course, how WX_DEFINE_SORTED_TYPEARRAY() should have worked +// from the very beginning - unfortunately I didn't think about this earlier +// ---------------------------------------------------------------------------- + +#define WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, base) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, base, \ + wxARRAY_DEFAULT_EXPORT) + +#define WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, base) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, base, \ + WXDLLIMPEXP_CORE) + +#define WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, base, \ + expmode) \ + typedef T _wxArray##name; \ + typedef int (CMPFUNC_CONV *SCMPFUNC##name)(T pItem1, T pItem2); \ + _WX_DEFINE_SORTED_TYPEARRAY_2(_wxArray##name, name, base, = cmpfunc, \ + class expmode, SCMPFUNC##name) + +// ---------------------------------------------------------------------------- +// WX_DECLARE_OBJARRAY(T, name): this macro generates a new array class +// named "name" which owns the objects of type T it contains, i.e. it will +// delete them when it is destroyed. +// +// An element is of type T*, but arguments of type T& are taken (see below!) +// and T& is returned. +// +// Don't use this for simple types such as "int" or "long"! +// +// Note on Add/Insert functions: +// 1) function(T*) gives the object to the array, i.e. it will delete the +// object when it's removed or in the array's dtor +// 2) function(T&) will create a copy of the object and work with it +// +// Also: +// 1) Remove() will delete the object after removing it from the array +// 2) Detach() just removes the object from the array (returning pointer to it) +// +// NB1: Base type T should have an accessible copy ctor if Add(T&) is used +// NB2: Never ever cast a array to it's base type: as dtor is not virtual +// and so you risk having at least the memory leaks and probably worse +// +// Some functions of this class are not inline, so it takes some space to +// define new class from this template even if you don't use it - which is not +// the case for the simple (non-object) array classes +// +// To use an objarray class you must +// #include "dynarray.h" +// WX_DECLARE_OBJARRAY(element_type, list_class_name) +// #include "arrimpl.cpp" +// WX_DEFINE_OBJARRAY(list_class_name) // name must be the same as above! +// +// This is necessary because at the moment of DEFINE_OBJARRAY class parsing the +// element_type must be fully defined (i.e. forward declaration is not +// enough), while WX_DECLARE_OBJARRAY may be done anywhere. The separation of +// two allows to break cicrcular dependencies with classes which have member +// variables of objarray type. +// ---------------------------------------------------------------------------- + +#define WX_DECLARE_OBJARRAY(T, name) \ + WX_DECLARE_USER_EXPORTED_OBJARRAY(T, name, wxARRAY_DEFAULT_EXPORT) + +#define WX_DECLARE_EXPORTED_OBJARRAY(T, name) \ + WX_DECLARE_USER_EXPORTED_OBJARRAY(T, name, WXDLLIMPEXP_CORE) + +#define WX_DECLARE_OBJARRAY_WITH_DECL(T, name, decl) \ + typedef T _wxObjArray##name; \ + _WX_DECLARE_OBJARRAY(_wxObjArray##name, name, wxArrayPtrVoid, decl) + +#define WX_DECLARE_USER_EXPORTED_OBJARRAY(T, name, expmode) \ + WX_DECLARE_OBJARRAY_WITH_DECL(T, name, class expmode) + +// WX_DEFINE_OBJARRAY is going to be redefined when arrimpl.cpp is included, +// try to provoke a human-understandable error if it used incorrectly. +// +// there is no real need for 3 different macros in the DEFINE case but do it +// anyhow for consistency +#define WX_DEFINE_OBJARRAY(name) DidYouIncludeArrimplCpp +#define WX_DEFINE_EXPORTED_OBJARRAY(name) WX_DEFINE_OBJARRAY(name) +#define WX_DEFINE_USER_EXPORTED_OBJARRAY(name) WX_DEFINE_OBJARRAY(name) + +// ---------------------------------------------------------------------------- +// Some commonly used predefined base arrays +// ---------------------------------------------------------------------------- + +WX_DECLARE_USER_EXPORTED_BASEARRAY(const void *, wxBaseArrayPtrVoid, + WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(char, wxBaseArrayChar, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(short, wxBaseArrayShort, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(int, wxBaseArrayInt, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(long, wxBaseArrayLong, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(size_t, wxBaseArraySizeT, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(double, wxBaseArrayDouble, WXDLLIMPEXP_BASE); + +// ---------------------------------------------------------------------------- +// Convenience macros to define arrays from base arrays +// ---------------------------------------------------------------------------- + +#define WX_DEFINE_ARRAY(T, name) \ + WX_DEFINE_TYPEARRAY(T, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_ARRAY_PTR(T, name) \ + WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_EXPORTED_ARRAY(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY(T, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_EXPORTED_ARRAY_PTR(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_ARRAY_WITH_DECL_PTR(T, name, decl) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayPtrVoid, decl) +#define WX_DEFINE_USER_EXPORTED_ARRAY(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, wxBaseArrayPtrVoid, wxARRAY_EMPTY expmode) +#define WX_DEFINE_USER_EXPORTED_ARRAY_PTR(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayPtrVoid, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_ARRAY_CHAR(T, name) \ + WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayChar) +#define WX_DEFINE_EXPORTED_ARRAY_CHAR(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayChar) +#define WX_DEFINE_USER_EXPORTED_ARRAY_CHAR(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayChar, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_ARRAY_SHORT(T, name) \ + WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayShort) +#define WX_DEFINE_EXPORTED_ARRAY_SHORT(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayShort) +#define WX_DEFINE_USER_EXPORTED_ARRAY_SHORT(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayShort, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_ARRAY_INT(T, name) \ + WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayInt) +#define WX_DEFINE_EXPORTED_ARRAY_INT(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayInt) +#define WX_DEFINE_USER_EXPORTED_ARRAY_INT(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayInt, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_ARRAY_LONG(T, name) \ + WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayLong) +#define WX_DEFINE_EXPORTED_ARRAY_LONG(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayLong) +#define WX_DEFINE_USER_EXPORTED_ARRAY_LONG(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayLong, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_ARRAY_SIZE_T(T, name) \ + WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArraySizeT) +#define WX_DEFINE_EXPORTED_ARRAY_SIZE_T(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArraySizeT) +#define WX_DEFINE_USER_EXPORTED_ARRAY_SIZE_T(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArraySizeT, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_ARRAY_DOUBLE(T, name) \ + WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayDouble) +#define WX_DEFINE_EXPORTED_ARRAY_DOUBLE(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayDouble) +#define WX_DEFINE_USER_EXPORTED_ARRAY_DOUBLE(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayDouble, wxARRAY_EMPTY expmode) + +// ---------------------------------------------------------------------------- +// Convenience macros to define sorted arrays from base arrays +// ---------------------------------------------------------------------------- + +#define WX_DEFINE_SORTED_ARRAY(T, name) \ + WX_DEFINE_SORTED_TYPEARRAY(T, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY(T, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY(T, name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayPtrVoid, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_CHAR(T, name) \ + WX_DEFINE_SORTED_TYPEARRAY(T, name, wxBaseArrayChar) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CHAR(T, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArrayChar) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CHAR(T, name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayChar, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_SHORT(T, name) \ + WX_DEFINE_SORTED_TYPEARRAY(T, name, wxBaseArrayShort) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_SHORT(T, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArrayShort) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_SHORT(T, name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayShort, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_INT(T, name) \ + WX_DEFINE_SORTED_TYPEARRAY(T, name, wxBaseArrayInt) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_INT(T, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArrayInt) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_INT(T, name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayInt, expmode) + +#define WX_DEFINE_SORTED_ARRAY_LONG(T, name) \ + WX_DEFINE_SORTED_TYPEARRAY(T, name, wxBaseArrayLong) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_LONG(T, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArrayLong) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_LONG(T, name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayLong, expmode) + +#define WX_DEFINE_SORTED_ARRAY_SIZE_T(T, name) \ + WX_DEFINE_SORTED_TYPEARRAY(T, name, wxBaseArraySizeT) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_SIZE_T(T, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArraySizeT) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_SIZE_T(T, name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArraySizeT, wxARRAY_EMPTY expmode) + +// ---------------------------------------------------------------------------- +// Convenience macros to define sorted arrays from base arrays +// ---------------------------------------------------------------------------- + +#define WX_DEFINE_SORTED_ARRAY_CMP(T, cmpfunc, name) \ + WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CMP(T, cmpfunc, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP(T, cmpfunc, \ + name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ + wxBaseArrayPtrVoid, \ + wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_CMP_CHAR(T, cmpfunc, name) \ + WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayChar) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CMP_CHAR(T, cmpfunc, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayChar) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP_CHAR(T, cmpfunc, \ + name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ + wxBaseArrayChar, \ + wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_CMP_SHORT(T, cmpfunc, name) \ + WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayShort) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CMP_SHORT(T, cmpfunc, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayShort) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP_SHORT(T, cmpfunc, \ + name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ + wxBaseArrayShort, \ + wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_CMP_INT(T, cmpfunc, name) \ + WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayInt) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CMP_INT(T, cmpfunc, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayInt) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP_INT(T, cmpfunc, \ + name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ + wxBaseArrayInt, \ + wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_CMP_LONG(T, cmpfunc, name) \ + WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayLong) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CMP_LONG(T, cmpfunc, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayLong) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP_LONG(T, cmpfunc, \ + name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ + wxBaseArrayLong, \ + wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_CMP_SIZE_T(T, cmpfunc, name) \ + WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArraySizeT) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CMP_SIZE_T(T, cmpfunc, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArraySizeT) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP_SIZE_T(T, cmpfunc, \ + name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ + wxBaseArraySizeT, \ + wxARRAY_EMPTY expmode) + +// ---------------------------------------------------------------------------- +// Some commonly used predefined arrays +// ---------------------------------------------------------------------------- + +WX_DEFINE_USER_EXPORTED_ARRAY_SHORT(short, wxArrayShort, class WXDLLIMPEXP_BASE); +WX_DEFINE_USER_EXPORTED_ARRAY_INT(int, wxArrayInt, class WXDLLIMPEXP_BASE); +WX_DEFINE_USER_EXPORTED_ARRAY_DOUBLE(double, wxArrayDouble, class WXDLLIMPEXP_BASE); +WX_DEFINE_USER_EXPORTED_ARRAY_LONG(long, wxArrayLong, class WXDLLIMPEXP_BASE); +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(void *, wxArrayPtrVoid, class WXDLLIMPEXP_BASE); + +// ----------------------------------------------------------------------------- +// convenience macros +// ----------------------------------------------------------------------------- + +// prepend all element of one array to another one; e.g. if first array contains +// elements X,Y,Z and the second contains A,B,C (in those orders), then the +// first array will be result as A,B,C,X,Y,Z +#define WX_PREPEND_ARRAY(array, other) \ + { \ + size_t wxAAcnt = (other).size(); \ + (array).reserve(wxAAcnt); \ + for ( size_t wxAAn = 0; wxAAn < wxAAcnt; wxAAn++ ) \ + { \ + (array).Insert((other)[wxAAn], wxAAn); \ + } \ + } + +// append all element of one array to another one +#define WX_APPEND_ARRAY(array, other) \ + { \ + size_t wxAAcnt = (other).size(); \ + (array).reserve(wxAAcnt); \ + for ( size_t wxAAn = 0; wxAAn < wxAAcnt; wxAAn++ ) \ + { \ + (array).push_back((other)[wxAAn]); \ + } \ + } + +// delete all array elements +// +// NB: the class declaration of the array elements must be visible from the +// place where you use this macro, otherwise the proper destructor may not +// be called (a decent compiler should give a warning about it, but don't +// count on it)! +#define WX_CLEAR_ARRAY(array) \ + { \ + size_t wxAAcnt = (array).size(); \ + for ( size_t wxAAn = 0; wxAAn < wxAAcnt; wxAAn++ ) \ + { \ + delete (array)[wxAAn]; \ + } \ + \ + (array).clear(); \ + } + +#endif // _DYNARRAY_H diff --git a/wxmsw/include/wx-3.0/wx/dynlib.h b/wxmsw/include/wx-3.0/wx/dynlib.h new file mode 100644 index 00000000..5487ccc9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dynlib.h @@ -0,0 +1,417 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dynlib.h +// Purpose: Dynamic library loading classes +// Author: Guilhem Lavaux, Vadim Zeitlin, Vaclav Slavik +// Modified by: +// Created: 20/07/98 +// Copyright: (c) 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DYNLIB_H__ +#define _WX_DYNLIB_H__ + +#include "wx/defs.h" + +#if wxUSE_DYNLIB_CLASS + +#include "wx/string.h" +#include "wx/dynarray.h" + +// note that we have our own dlerror() implementation under Darwin +#if (defined(HAVE_DLERROR) && !defined(__EMX__)) || defined(__DARWIN__) + #define wxHAVE_DYNLIB_ERROR +#endif + +class WXDLLIMPEXP_FWD_BASE wxDynamicLibraryDetailsCreator; + +// ---------------------------------------------------------------------------- +// conditional compilation +// ---------------------------------------------------------------------------- + +// Note: __OS2__/EMX has to be tested first, since we want to use +// native version, even if configure detected presence of DLOPEN. +#if defined(__OS2__) || defined(__EMX__) || defined(__WINDOWS__) + typedef WXHMODULE wxDllType; +#elif defined(__DARWIN__) + // Don't include dlfcn.h on Darwin, we may be using our own replacements. + typedef void *wxDllType; +#elif defined(HAVE_DLOPEN) + #include + typedef void *wxDllType; +#elif defined(HAVE_SHL_LOAD) + #include + typedef shl_t wxDllType; +#elif defined(__WXMAC__) + #include + typedef CFragConnectionID wxDllType; +#else + #error "Dynamic Loading classes can't be compiled on this platform, sorry." +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +enum wxDLFlags +{ + wxDL_LAZY = 0x00000001, // resolve undefined symbols at first use + // (only works on some Unix versions) + wxDL_NOW = 0x00000002, // resolve undefined symbols on load + // (default, always the case under Win32) + wxDL_GLOBAL = 0x00000004, // export extern symbols to subsequently + // loaded libs. + wxDL_VERBATIM = 0x00000008, // attempt to load the supplied library + // name without appending the usual dll + // filename extension. + + // this flag is obsolete, don't use + wxDL_NOSHARE = 0x00000010, // load new DLL, don't reuse already loaded + // (only for wxPluginManager) + + wxDL_QUIET = 0x00000020, // don't log an error if failed to load + + // this flag is dangerous, for internal use of wxMSW only, don't use at all + // and especially don't use directly, use wxLoadedDLL instead if you really + // do need it + wxDL_GET_LOADED = 0x00000040, // Win32 only: return handle of already + // loaded DLL or NULL otherwise; Unload() + // should not be called so don't forget to + // Detach() if you use this function + + wxDL_DEFAULT = wxDL_NOW // default flags correspond to Win32 +}; + +enum wxDynamicLibraryCategory +{ + wxDL_LIBRARY, // standard library + wxDL_MODULE // loadable module/plugin +}; + +enum wxPluginCategory +{ + wxDL_PLUGIN_GUI, // plugin that uses GUI classes + wxDL_PLUGIN_BASE // wxBase-only plugin +}; + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// when loading a function from a DLL you always have to cast the returned +// "void *" pointer to the correct type and, even more annoyingly, you have to +// repeat this type twice if you want to declare and define a function pointer +// all in one line +// +// this macro makes this slightly less painful by allowing you to specify the +// type only once, as the first parameter, and creating a variable of this type +// called "pfn" initialized with the "name" from the "dynlib" +#define wxDYNLIB_FUNCTION(type, name, dynlib) \ + type pfn ## name = (type)(dynlib).GetSymbol(wxT(#name)) + + +// a more convenient function replacing wxDYNLIB_FUNCTION above +// +// it uses the convention that the type of the function is its name suffixed +// with "_t" but it doesn't define a variable but just assigns the loaded value +// to it and also allows to pass it the prefix to be used instead of hardcoding +// "pfn" (the prefix can be "m_" or "gs_pfn" or whatever) +// +// notice that this function doesn't generate error messages if the symbol +// couldn't be loaded, the caller should generate the appropriate message +#define wxDL_INIT_FUNC(pfx, name, dynlib) \ + pfx ## name = (name ## _t)(dynlib).RawGetSymbol(#name) + +#ifdef __WINDOWS__ + +// same as wxDL_INIT_FUNC() but appends 'A' or 'W' to the function name, see +// wxDynamicLibrary::GetSymbolAorW() +#define wxDL_INIT_FUNC_AW(pfx, name, dynlib) \ + pfx ## name = (name ## _t)(dynlib).GetSymbolAorW(#name) + +#endif // __WINDOWS__ + +// the following macros can be used to redirect a whole library to a class and +// check at run-time if the library is present and contains all required +// methods +// +// notice that they are supposed to be used inside a class which has "m_ok" +// member variable indicating if the library had been successfully loaded + +// helper macros constructing the name of the variable storing the function +// pointer and the name of its type from the function name +#define wxDL_METHOD_NAME(name) m_pfn ## name +#define wxDL_METHOD_TYPE(name) name ## _t + +// parameters are: +// - rettype: return type of the function, e.g. "int" +// - name: name of the function, e.g. "foo" +// - args: function signature in parentheses, e.g. "(int x, int y)" +// - argnames: the names of the parameters in parentheses, e.g. "(x, y)" +// - defret: the value to return if the library wasn't successfully loaded +#define wxDL_METHOD_DEFINE( rettype, name, args, argnames, defret ) \ + typedef rettype (* wxDL_METHOD_TYPE(name)) args ; \ + wxDL_METHOD_TYPE(name) wxDL_METHOD_NAME(name); \ + rettype name args \ + { return m_ok ? wxDL_METHOD_NAME(name) argnames : defret; } + +#define wxDL_VOIDMETHOD_DEFINE( name, args, argnames ) \ + typedef void (* wxDL_METHOD_TYPE(name)) args ; \ + wxDL_METHOD_TYPE(name) wxDL_METHOD_NAME(name); \ + void name args \ + { if ( m_ok ) wxDL_METHOD_NAME(name) argnames ; } + +#define wxDL_METHOD_LOAD(lib, name) \ + wxDL_METHOD_NAME(name) = \ + (wxDL_METHOD_TYPE(name)) lib.GetSymbol(#name, &m_ok); \ + if ( !m_ok ) return false + +// ---------------------------------------------------------------------------- +// wxDynamicLibraryDetails: contains details about a loaded wxDynamicLibrary +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxDynamicLibraryDetails +{ +public: + // ctor, normally never used as these objects are only created by + // wxDynamicLibrary::ListLoaded() + wxDynamicLibraryDetails() { m_address = NULL; m_length = 0; } + + // get the (base) name + wxString GetName() const { return m_name; } + + // get the full path of this object + wxString GetPath() const { return m_path; } + + // get the load address and the extent, return true if this information is + // available + bool GetAddress(void **addr, size_t *len) const + { + if ( !m_address ) + return false; + + if ( addr ) + *addr = m_address; + if ( len ) + *len = m_length; + + return true; + } + + // return the version of the DLL (may be empty if no version info) + wxString GetVersion() const + { + return m_version; + } + +private: + wxString m_name, + m_path, + m_version; + + void *m_address; + size_t m_length; + + friend class wxDynamicLibraryDetailsCreator; +}; + +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxDynamicLibraryDetails, + wxDynamicLibraryDetailsArray, + WXDLLIMPEXP_BASE); + +// ---------------------------------------------------------------------------- +// wxDynamicLibrary: represents a handle to a DLL/shared object +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxDynamicLibrary +{ +public: + // return a valid handle for the main program itself or NULL if back + // linking is not supported by the current platform (e.g. Win32) + static wxDllType GetProgramHandle(); + + // return the platform standard DLL extension (with leading dot) + static wxString GetDllExt(wxDynamicLibraryCategory cat = wxDL_LIBRARY); + + wxDynamicLibrary() : m_handle(0) { } + wxDynamicLibrary(const wxString& libname, int flags = wxDL_DEFAULT) + : m_handle(0) + { + Load(libname, flags); + } + + // NOTE: this class is (deliberately) not virtual, do not attempt + // to use it polymorphically. + ~wxDynamicLibrary() { Unload(); } + + // return true if the library was loaded successfully + bool IsLoaded() const { return m_handle != 0; } + + // load the library with the given name (full or not), return true if ok + bool Load(const wxString& libname, int flags = wxDL_DEFAULT); + + // raw function for loading dynamic libs: always behaves as if + // wxDL_VERBATIM were specified and doesn't log error message if the + // library couldn't be loaded but simply returns NULL + static wxDllType RawLoad(const wxString& libname, int flags = wxDL_DEFAULT); + + // detach the library object from its handle, i.e. prevent the object from + // unloading the library in its dtor -- the caller is now responsible for + // doing this + wxDllType Detach() { wxDllType h = m_handle; m_handle = 0; return h; } + + // unload the given library handle (presumably returned by Detach() before) + static void Unload(wxDllType handle); + + // unload the library, also done automatically in dtor + void Unload() { if ( IsLoaded() ) { Unload(m_handle); m_handle = 0; } } + + // Return the raw handle from dlopen and friends. + wxDllType GetLibHandle() const { return m_handle; } + + // check if the given symbol is present in the library, useful to verify if + // a loadable module is our plugin, for example, without provoking error + // messages from GetSymbol() + bool HasSymbol(const wxString& name) const + { + bool ok; + DoGetSymbol(name, &ok); + return ok; + } + + // resolve a symbol in a loaded DLL, such as a variable or function name. + // 'name' is the (possibly mangled) name of the symbol. (use extern "C" to + // export unmangled names) + // + // Since it is perfectly valid for the returned symbol to actually be NULL, + // that is not always indication of an error. Pass and test the parameter + // 'success' for a true indication of success or failure to load the + // symbol. + // + // Returns a pointer to the symbol on success, or NULL if an error occurred + // or the symbol wasn't found. + void *GetSymbol(const wxString& name, bool *success = NULL) const; + + // low-level version of GetSymbol() + static void *RawGetSymbol(wxDllType handle, const wxString& name); + void *RawGetSymbol(const wxString& name) const + { +#if defined (__WXPM__) || defined(__EMX__) + return GetSymbol(name); +#else + return RawGetSymbol(m_handle, name); +#endif + } + +#ifdef __WINDOWS__ + // this function is useful for loading functions from the standard Windows + // DLLs: such functions have an 'A' (in ANSI build) or 'W' (in Unicode, or + // wide character build) suffix if they take string parameters + static void *RawGetSymbolAorW(wxDllType handle, const wxString& name) + { + return RawGetSymbol + ( + handle, + name + +#if wxUSE_UNICODE + L'W' +#else + 'A' +#endif + ); + } + + void *GetSymbolAorW(const wxString& name) const + { + return RawGetSymbolAorW(m_handle, name); + } +#endif // __WINDOWS__ + + // return all modules/shared libraries in the address space of this process + // + // returns an empty array if not implemented or an error occurred + static wxDynamicLibraryDetailsArray ListLoaded(); + + // return platform-specific name of dynamic library with proper extension + // and prefix (e.g. "foo.dll" on Windows or "libfoo.so" on Linux) + static wxString CanonicalizeName(const wxString& name, + wxDynamicLibraryCategory cat = wxDL_LIBRARY); + + // return name of wxWidgets plugin (adds compiler and version info + // to the filename): + static wxString + CanonicalizePluginName(const wxString& name, + wxPluginCategory cat = wxDL_PLUGIN_GUI); + + // return plugin directory on platforms where it makes sense and empty + // string on others: + static wxString GetPluginsDirectory(); + + +#ifdef __WINDOWS__ + // return the handle (HMODULE/HINSTANCE) of the DLL with the given name + // and/or containing the specified address: for XP and later systems only + // the address is used and the name is ignored but for the previous systems + // only the name (which may be either a full path to the DLL or just its + // base name, possibly even without extension) is used + // + // the returned handle reference count is not incremented so it doesn't + // need to be freed using FreeLibrary() but it also means that it can + // become invalid if the DLL is unloaded + static WXHMODULE MSWGetModuleHandle(const wxString& name, void *addr); +#endif // __WINDOWS__ + +protected: + // common part of GetSymbol() and HasSymbol() + void *DoGetSymbol(const wxString& name, bool *success = 0) const; + +#ifdef wxHAVE_DYNLIB_ERROR + // log the error after a dlxxx() function failure + static void Error(); +#endif // wxHAVE_DYNLIB_ERROR + + + // the handle to DLL or NULL + wxDllType m_handle; + + // no copy ctor/assignment operators (or we'd try to unload the library + // twice) + wxDECLARE_NO_COPY_CLASS(wxDynamicLibrary); +}; + +#ifdef __WINDOWS__ + +// ---------------------------------------------------------------------------- +// wxLoadedDLL is a MSW-only internal helper class allowing to dynamically bind +// to a DLL already loaded into the project address space +// ---------------------------------------------------------------------------- + +class wxLoadedDLL : public wxDynamicLibrary +{ +public: + wxLoadedDLL(const wxString& dllname) + : wxDynamicLibrary(dllname, wxDL_GET_LOADED | wxDL_VERBATIM | wxDL_QUIET) + { + } + + ~wxLoadedDLL() + { + Detach(); + } +}; + +#endif // __WINDOWS__ + +// ---------------------------------------------------------------------------- +// Interesting defines +// ---------------------------------------------------------------------------- + +#define WXDLL_ENTRY_FUNCTION() \ +extern "C" WXEXPORT const wxClassInfo *wxGetClassFirst(); \ +const wxClassInfo *wxGetClassFirst() { \ + return wxClassInfo::GetFirst(); \ +} + +#endif // wxUSE_DYNLIB_CLASS + +#endif // _WX_DYNLIB_H__ diff --git a/wxmsw/include/wx-3.0/wx/dynload.h b/wxmsw/include/wx-3.0/wx/dynload.h new file mode 100644 index 00000000..7cb4d25b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/dynload.h @@ -0,0 +1,155 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dynload.h +// Purpose: Dynamic loading framework +// Author: Ron Lee, David Falkinder, Vadim Zeitlin and a cast of 1000's +// (derived in part from dynlib.cpp (c) 1998 Guilhem Lavaux) +// Modified by: +// Created: 03/12/01 +// Copyright: (c) 2001 Ron Lee +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DYNAMICLOADER_H__ +#define _WX_DYNAMICLOADER_H__ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_DYNAMIC_LOADER + +#include "wx/dynlib.h" +#include "wx/hashmap.h" +#include "wx/module.h" + +class WXDLLIMPEXP_FWD_BASE wxPluginLibrary; + + +WX_DECLARE_STRING_HASH_MAP_WITH_DECL(wxPluginLibrary *, wxDLManifest, + class WXDLLIMPEXP_BASE); +typedef wxDLManifest wxDLImports; + +// --------------------------------------------------------------------------- +// wxPluginLibrary +// --------------------------------------------------------------------------- + +// NOTE: Do not attempt to use a base class pointer to this class. +// wxDL is not virtual and we deliberately hide some of it's +// methods here. +// +// Unless you know exacty why you need to, you probably shouldn't +// instantiate this class directly anyway, use wxPluginManager +// instead. + +class WXDLLIMPEXP_BASE wxPluginLibrary : public wxDynamicLibrary +{ +public: + + static wxDLImports* ms_classes; // Static hash of all imported classes. + + wxPluginLibrary( const wxString &libname, int flags = wxDL_DEFAULT ); + ~wxPluginLibrary(); + + wxPluginLibrary *RefLib(); + bool UnrefLib(); + + // These two are called by the PluginSentinel on (PLUGGABLE) object + // creation/destruction. There is usually no reason for the user to + // call them directly. We have to separate this from the link count, + // since the two are not interchangeable. + + // FIXME: for even better debugging PluginSentinel should register + // the name of the class created too, then we can state + // exactly which object was not destroyed which may be + // difficult to find otherwise. Also this code should + // probably only be active in DEBUG mode, but let's just + // get it right first. + + void RefObj() { ++m_objcount; } + void UnrefObj() + { + wxASSERT_MSG( m_objcount > 0, wxT("Too many objects deleted??") ); + --m_objcount; + } + + // Override/hide some base class methods + + bool IsLoaded() const { return m_linkcount > 0; } + void Unload() { UnrefLib(); } + +private: + + // These pointers may be NULL but if they are not, then m_ourLast follows + // m_ourFirst in the linked list, i.e. can be found by calling GetNext() a + // sufficient number of times. + const wxClassInfo *m_ourFirst; // first class info in this plugin + const wxClassInfo *m_ourLast; // ..and the last one + + size_t m_linkcount; // Ref count of library link calls + size_t m_objcount; // ..and (pluggable) object instantiations. + wxModuleList m_wxmodules; // any wxModules that we initialised. + + void UpdateClasses(); // Update ms_classes + void RestoreClasses(); // Removes this library from ms_classes + void RegisterModules(); // Init any wxModules in the lib. + void UnregisterModules(); // Cleanup any wxModules we installed. + + wxDECLARE_NO_COPY_CLASS(wxPluginLibrary); +}; + + +class WXDLLIMPEXP_BASE wxPluginManager +{ +public: + + // Static accessors. + + static wxPluginLibrary *LoadLibrary( const wxString &libname, + int flags = wxDL_DEFAULT ); + static bool UnloadLibrary(const wxString &libname); + + // Instance methods. + + wxPluginManager() : m_entry(NULL) {} + wxPluginManager(const wxString &libname, int flags = wxDL_DEFAULT) + { + Load(libname, flags); + } + ~wxPluginManager() { if ( IsLoaded() ) Unload(); } + + bool Load(const wxString &libname, int flags = wxDL_DEFAULT); + void Unload(); + + bool IsLoaded() const { return m_entry && m_entry->IsLoaded(); } + void *GetSymbol(const wxString &symbol, bool *success = 0) + { + return m_entry->GetSymbol( symbol, success ); + } + + static void CreateManifest() { ms_manifest = new wxDLManifest(wxKEY_STRING); } + static void ClearManifest() { delete ms_manifest; ms_manifest = NULL; } + +private: + // return the pointer to the entry for the library with given name in + // ms_manifest or NULL if none + static wxPluginLibrary *FindByName(const wxString& name) + { + const wxDLManifest::iterator i = ms_manifest->find(name); + + return i == ms_manifest->end() ? NULL : i->second; + } + + static wxDLManifest* ms_manifest; // Static hash of loaded libs. + wxPluginLibrary* m_entry; // Cache our entry in the manifest. + + // We could allow this class to be copied if we really + // wanted to, but not without modification. + wxDECLARE_NO_COPY_CLASS(wxPluginManager); +}; + + +#endif // wxUSE_DYNAMIC_LOADER +#endif // _WX_DYNAMICLOADER_H__ + diff --git a/wxmsw/include/wx-3.0/wx/editlbox.h b/wxmsw/include/wx-3.0/wx/editlbox.h new file mode 100644 index 00000000..7aad2ac2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/editlbox.h @@ -0,0 +1,99 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/editlbox.h +// Purpose: ListBox with editable items +// Author: Vaclav Slavik +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +#ifndef __WX_EDITLBOX_H__ +#define __WX_EDITLBOX_H__ + +#include "wx/defs.h" + +#if wxUSE_EDITABLELISTBOX + +#include "wx/panel.h" + +class WXDLLIMPEXP_FWD_CORE wxBitmapButton; +class WXDLLIMPEXP_FWD_CORE wxListCtrl; +class WXDLLIMPEXP_FWD_CORE wxListEvent; + +#define wxEL_ALLOW_NEW 0x0100 +#define wxEL_ALLOW_EDIT 0x0200 +#define wxEL_ALLOW_DELETE 0x0400 +#define wxEL_NO_REORDER 0x0800 +#define wxEL_DEFAULT_STYLE (wxEL_ALLOW_NEW | wxEL_ALLOW_EDIT | wxEL_ALLOW_DELETE) + +extern WXDLLIMPEXP_DATA_ADV(const char) wxEditableListBoxNameStr[]; + +// This class provides a composite control that lets the +// user easily enter list of strings + +class WXDLLIMPEXP_ADV wxEditableListBox : public wxPanel +{ +public: + wxEditableListBox() { Init(); } + + wxEditableListBox(wxWindow *parent, wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxEL_DEFAULT_STYLE, + const wxString& name = wxEditableListBoxNameStr) + { + Init(); + Create(parent, id, label, pos, size, style, name); + } + + bool Create(wxWindow *parent, wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxEL_DEFAULT_STYLE, + const wxString& name = wxEditableListBoxNameStr); + + void SetStrings(const wxArrayString& strings); + void GetStrings(wxArrayString& strings) const; + + wxListCtrl* GetListCtrl() { return m_listCtrl; } + wxBitmapButton* GetDelButton() { return m_bDel; } + wxBitmapButton* GetNewButton() { return m_bNew; } + wxBitmapButton* GetUpButton() { return m_bUp; } + wxBitmapButton* GetDownButton() { return m_bDown; } + wxBitmapButton* GetEditButton() { return m_bEdit; } + +protected: + wxBitmapButton *m_bDel, *m_bNew, *m_bUp, *m_bDown, *m_bEdit; + wxListCtrl *m_listCtrl; + int m_selection; + long m_style; + + void Init() + { + m_style = 0; + m_selection = 0; + m_bEdit = m_bNew = m_bDel = m_bUp = m_bDown = NULL; + m_listCtrl = NULL; + } + + void OnItemSelected(wxListEvent& event); + void OnEndLabelEdit(wxListEvent& event); + void OnNewItem(wxCommandEvent& event); + void OnDelItem(wxCommandEvent& event); + void OnEditItem(wxCommandEvent& event); + void OnUpItem(wxCommandEvent& event); + void OnDownItem(wxCommandEvent& event); + + DECLARE_CLASS(wxEditableListBox) + DECLARE_EVENT_TABLE() + +private: + void SwapItems(long i1, long i2); + +}; + +#endif // wxUSE_EDITABLELISTBOX + +#endif // __WX_EDITLBOX_H__ diff --git a/wxmsw/include/wx-3.0/wx/effects.h b/wxmsw/include/wx-3.0/wx/effects.h new file mode 100644 index 00000000..adaf951c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/effects.h @@ -0,0 +1,90 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/effects.h +// Purpose: wxEffects class +// Draws 3D effects. +// Author: Julian Smart et al +// Modified by: +// Created: 25/4/2000 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_EFFECTS_H_ +#define _WX_EFFECTS_H_ + +// this class is deprecated and will be removed in the next wx version +// +// please use wxRenderer::DrawBorder() instead of DrawSunkenEdge(); there is no +// replacement for TileBitmap() but it doesn't seem to be very useful anyhow +#if WXWIN_COMPATIBILITY_2_8 + +/* + * wxEffects: various 3D effects + */ + +#include "wx/object.h" +#include "wx/colour.h" +#include "wx/gdicmn.h" +#include "wx/dc.h" + +class WXDLLIMPEXP_CORE wxEffectsImpl: public wxObject +{ +public: + // Assume system colours + wxEffectsImpl() ; + // Going from lightest to darkest + wxEffectsImpl(const wxColour& highlightColour, const wxColour& lightShadow, + const wxColour& faceColour, const wxColour& mediumShadow, + const wxColour& darkShadow) ; + + // Accessors + wxColour GetHighlightColour() const { return m_highlightColour; } + wxColour GetLightShadow() const { return m_lightShadow; } + wxColour GetFaceColour() const { return m_faceColour; } + wxColour GetMediumShadow() const { return m_mediumShadow; } + wxColour GetDarkShadow() const { return m_darkShadow; } + + void SetHighlightColour(const wxColour& c) { m_highlightColour = c; } + void SetLightShadow(const wxColour& c) { m_lightShadow = c; } + void SetFaceColour(const wxColour& c) { m_faceColour = c; } + void SetMediumShadow(const wxColour& c) { m_mediumShadow = c; } + void SetDarkShadow(const wxColour& c) { m_darkShadow = c; } + + void Set(const wxColour& highlightColour, const wxColour& lightShadow, + const wxColour& faceColour, const wxColour& mediumShadow, + const wxColour& darkShadow) + { + SetHighlightColour(highlightColour); + SetLightShadow(lightShadow); + SetFaceColour(faceColour); + SetMediumShadow(mediumShadow); + SetDarkShadow(darkShadow); + } + + // Draw a sunken edge + void DrawSunkenEdge(wxDC& dc, const wxRect& rect, int borderSize = 1); + + // Tile a bitmap + bool TileBitmap(const wxRect& rect, wxDC& dc, const wxBitmap& bitmap); + +protected: + wxColour m_highlightColour; // Usually white + wxColour m_lightShadow; // Usually light grey + wxColour m_faceColour; // Usually grey + wxColour m_mediumShadow; // Usually dark grey + wxColour m_darkShadow; // Usually black + + DECLARE_CLASS(wxEffectsImpl) +}; + +// current versions of g++ don't generate deprecation warnings for classes +// declared deprecated, so define wxEffects as a typedef instead: this does +// generate warnings with both g++ and VC (which also has no troubles with +// directly deprecating the classes...) +// +// note that this g++ bug (16370) is supposed to be fixed in g++ 4.3.0 +typedef wxEffectsImpl wxDEPRECATED(wxEffects); + +#endif // WXWIN_COMPATIBILITY_2_8 + +#endif // _WX_EFFECTS_H_ diff --git a/wxmsw/include/wx-3.0/wx/encconv.h b/wxmsw/include/wx-3.0/wx/encconv.h new file mode 100644 index 00000000..bc464785 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/encconv.h @@ -0,0 +1,153 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/encconv.h +// Purpose: wxEncodingConverter class for converting between different +// font encodings +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ENCCONV_H_ +#define _WX_ENCCONV_H_ + +#include "wx/defs.h" + +#include "wx/object.h" +#include "wx/fontenc.h" +#include "wx/dynarray.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +enum +{ + wxCONVERT_STRICT, + wxCONVERT_SUBSTITUTE +}; + + +enum +{ + wxPLATFORM_CURRENT = -1, + + wxPLATFORM_UNIX = 0, + wxPLATFORM_WINDOWS, + wxPLATFORM_OS2, + wxPLATFORM_MAC +}; + +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +WX_DEFINE_ARRAY_INT(wxFontEncoding, wxFontEncodingArray); + +//-------------------------------------------------------------------------------- +// wxEncodingConverter +// This class is capable of converting strings between any two +// 8bit encodings/charsets. It can also convert from/to Unicode +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxEncodingConverter : public wxObject +{ + public: + + wxEncodingConverter(); + virtual ~wxEncodingConverter() { if (m_Table) delete[] m_Table; } + + // Initialize conversion. Both output or input encoding may + // be wxFONTENCODING_UNICODE. + // + // All subsequent calls to Convert() will interpret it's argument + // as a string in input_enc encoding and will output string in + // output_enc encoding. + // + // You must call this method before calling Convert. You may call + // it more than once in order to switch to another conversion + // + // Method affects behaviour of Convert() in case input character + // cannot be converted because it does not exist in output encoding: + // wxCONVERT_STRICT -- + // follow behaviour of GNU Recode - just copy unconvertable + // characters to output and don't change them (it's integer + // value will stay the same) + // wxCONVERT_SUBSTITUTE -- + // try some (lossy) substitutions - e.g. replace + // unconvertable latin capitals with acute by ordinary + // capitals, replace en-dash or em-dash by '-' etc. + // both modes guarantee that output string will have same length + // as input string + // + // Returns false if given conversion is impossible, true otherwise + // (conversion may be impossible either if you try to convert + // to Unicode with non-Unicode build of wxWidgets or if input + // or output encoding is not supported.) + bool Init(wxFontEncoding input_enc, wxFontEncoding output_enc, int method = wxCONVERT_STRICT); + + // Convert input string according to settings passed to Init. + // Note that you must call Init before using Convert! + bool Convert(const char* input, char* output) const; + bool Convert(char* str) const { return Convert(str, str); } + wxString Convert(const wxString& input) const; + + bool Convert(const char* input, wchar_t* output) const; + bool Convert(const wchar_t* input, char* output) const; + bool Convert(const wchar_t* input, wchar_t* output) const; + bool Convert(wchar_t* str) const { return Convert(str, str); } + + // Return equivalent(s) for given font that are used + // under given platform. wxPLATFORM_CURRENT means the plaform + // this binary was compiled for + // + // Examples: + // current platform enc returned value + // ----------------------------------------------------- + // unix CP1250 {ISO8859_2} + // unix ISO8859_2 {} + // windows ISO8859_2 {CP1250} + // + // Equivalence is defined in terms of convertibility: + // 2 encodings are equivalent if you can convert text between + // then without losing information (it may - and will - happen + // that you lose special chars like quotation marks or em-dashes + // but you shouldn't lose any diacritics and language-specific + // characters when converting between equivalent encodings). + // + // Convert() method is not limited to converting between + // equivalent encodings, it can convert between arbitrary + // two encodings! + // + // Remember that this function does _NOT_ check for presence of + // fonts in system. It only tells you what are most suitable + // encodings. (It usually returns only one encoding) + // + // Note that argument enc itself may be present in returned array! + // (so that you can -- as a side effect -- detect whether the + // encoding is native for this platform or not) + static wxFontEncodingArray GetPlatformEquivalents(wxFontEncoding enc, int platform = wxPLATFORM_CURRENT); + + // Similar to GetPlatformEquivalent, but this one will return ALL + // equivalent encodings, regardless the platform, including itself. + static wxFontEncodingArray GetAllEquivalents(wxFontEncoding enc); + + // Return true if [any text in] one multibyte encoding can be + // converted to another one losslessly. + // + // Do not call this with wxFONTENCODING_UNICODE, it doesn't make + // sense (always works in one sense and always depends on the text + // to convert in the other) + static bool CanConvert(wxFontEncoding encIn, wxFontEncoding encOut) + { + return GetAllEquivalents(encIn).Index(encOut) != wxNOT_FOUND; + } + + private: + wchar_t *m_Table; + bool m_UnicodeInput, m_UnicodeOutput; + bool m_JustCopy; + + wxDECLARE_NO_COPY_CLASS(wxEncodingConverter); +}; + +#endif // _WX_ENCCONV_H_ diff --git a/wxmsw/include/wx-3.0/wx/encinfo.h b/wxmsw/include/wx-3.0/wx/encinfo.h new file mode 100644 index 00000000..27b14538 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/encinfo.h @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/encinfo.h +// Purpose: declares wxNativeEncodingInfo struct +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.09.2003 (extracted from wx/fontenc.h) +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ENCINFO_H_ +#define _WX_ENCINFO_H_ + +#include "wx/string.h" + +// ---------------------------------------------------------------------------- +// wxNativeEncodingInfo contains all encoding parameters for this platform +// ---------------------------------------------------------------------------- + +// This private structure specifies all the parameters needed to create a font +// with the given encoding on this platform. +// +// Under X, it contains the last 2 elements of the font specifications +// (registry and encoding). +// +// Under Windows, it contains a number which is one of predefined CHARSET_XXX +// values. +// +// Under all platforms it also contains a facename string which should be +// used, if not empty, to create fonts in this encoding (this is the only way +// to create a font of non-standard encoding (like KOI8) under Windows - the +// facename specifies the encoding then) + +struct WXDLLIMPEXP_CORE wxNativeEncodingInfo +{ + wxString facename; // may be empty meaning "any" + wxFontEncoding encoding; // so that we know what this struct represents + +#if defined(__WXMSW__) || \ + defined(__WXPM__) || \ + defined(__WXMAC__) || \ + defined(__WXCOCOA__) // FIXME: __WXCOCOA__ + + wxNativeEncodingInfo() + : facename() + , encoding(wxFONTENCODING_SYSTEM) + , charset(0) /* ANSI_CHARSET */ + { } + + int charset; +#elif defined(_WX_X_FONTLIKE) + wxString xregistry, + xencoding; +#elif defined(wxHAS_UTF8_FONTS) + // ports using UTF-8 for text don't need encoding information for fonts +#else + #error "Unsupported toolkit" +#endif + // this struct is saved in config by wxFontMapper, so it should know to + // serialise itself (implemented in platform-specific code) + bool FromString(const wxString& s); + wxString ToString() const; +}; + +#endif // _WX_ENCINFO_H_ + diff --git a/wxmsw/include/wx-3.0/wx/event.h b/wxmsw/include/wx-3.0/wx/event.h new file mode 100644 index 00000000..61ec19c5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/event.h @@ -0,0 +1,4501 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/event.h +// Purpose: Event classes +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_EVENT_H_ +#define _WX_EVENT_H_ + +#include "wx/defs.h" +#include "wx/cpp.h" +#include "wx/object.h" +#include "wx/clntdata.h" + +#if wxUSE_GUI + #include "wx/gdicmn.h" + #include "wx/cursor.h" + #include "wx/mousestate.h" +#endif + +#include "wx/dynarray.h" +#include "wx/thread.h" +#include "wx/tracker.h" +#include "wx/typeinfo.h" +#include "wx/any.h" + +#ifdef wxHAS_EVENT_BIND + #include "wx/meta/convertible.h" +#endif + +// Currently VC6 and VC7 are known to not be able to compile CallAfter() code, +// so disable it for them. +#if !defined(__VISUALC__) || wxCHECK_VISUALC_VERSION(8) + #include "wx/meta/removeref.h" + + #define wxHAS_CALL_AFTER +#endif + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxList; +class WXDLLIMPEXP_FWD_BASE wxEvent; +class WXDLLIMPEXP_FWD_BASE wxEventFilter; +#if wxUSE_GUI + class WXDLLIMPEXP_FWD_CORE wxDC; + class WXDLLIMPEXP_FWD_CORE wxMenu; + class WXDLLIMPEXP_FWD_CORE wxWindow; + class WXDLLIMPEXP_FWD_CORE wxWindowBase; +#endif // wxUSE_GUI + +// We operate with pointer to members of wxEvtHandler (such functions are used +// as event handlers in the event tables or as arguments to Connect()) but by +// default MSVC uses a restricted (but more efficient) representation of +// pointers to members which can't deal with multiple base classes. To avoid +// mysterious (as the compiler is not good enough to detect this and give a +// sensible error message) errors in the user code as soon as it defines +// classes inheriting from both wxEvtHandler (possibly indirectly, e.g. via +// wxWindow) and something else (including our own wxTrackable but not limited +// to it), we use the special MSVC keyword telling the compiler to use a more +// general pointer to member representation for the classes inheriting from +// wxEvtHandler. +#ifdef __VISUALC__ + #define wxMSVC_FWD_MULTIPLE_BASES __multiple_inheritance +#else + #define wxMSVC_FWD_MULTIPLE_BASES +#endif + +class WXDLLIMPEXP_FWD_BASE wxMSVC_FWD_MULTIPLE_BASES wxEvtHandler; +class wxEventConnectionRef; + +// ---------------------------------------------------------------------------- +// Event types +// ---------------------------------------------------------------------------- + +typedef int wxEventType; + +#define wxEVT_ANY ((wxEventType)-1) + +// this is used to make the event table entry type safe, so that for an event +// handler only a function with proper parameter list can be given. See also +// the wxEVENT_HANDLER_CAST-macro. +#define wxStaticCastEvent(type, val) static_cast(val) + +#define wxDECLARE_EVENT_TABLE_ENTRY(type, winid, idLast, fn, obj) \ + wxEventTableEntry(type, winid, idLast, wxNewEventTableFunctor(type, fn), obj) + +#define wxDECLARE_EVENT_TABLE_TERMINATOR() \ + wxEventTableEntry(wxEVT_NULL, 0, 0, 0, 0) + +// generate a new unique event type +extern WXDLLIMPEXP_BASE wxEventType wxNewEventType(); + +// define macros to create new event types: +#ifdef wxHAS_EVENT_BIND + // events are represented by an instance of wxEventTypeTag and the + // corresponding type must be specified for type-safety checks + + // define a new custom event type, can be used alone or after event + // declaration in the header using one of the macros below + #define wxDEFINE_EVENT( name, type ) \ + const wxEventTypeTag< type > name( wxNewEventType() ) + + // the general version allowing exporting the event type from DLL, used by + // wxWidgets itself + #define wxDECLARE_EXPORTED_EVENT( expdecl, name, type ) \ + extern const expdecl wxEventTypeTag< type > name + + // this is the version which will normally be used in the user code + #define wxDECLARE_EVENT( name, type ) \ + wxDECLARE_EXPORTED_EVENT( wxEMPTY_PARAMETER_VALUE, name, type ) + + + // these macros are only used internally for backwards compatibility and + // allow to define an alias for an existing event type (this is used by + // wxEVT_SPIN_XXX) + #define wxDEFINE_EVENT_ALIAS( name, type, value ) \ + const wxEventTypeTag< type > name( value ) + + #define wxDECLARE_EXPORTED_EVENT_ALIAS( expdecl, name, type ) \ + extern const expdecl wxEventTypeTag< type > name +#else // !wxHAS_EVENT_BIND + // the macros are the same ones as above but defined differently as we only + // use the integer event type values to identify events in this case + + #define wxDEFINE_EVENT( name, type ) \ + const wxEventType name( wxNewEventType() ) + + #define wxDECLARE_EXPORTED_EVENT( expdecl, name, type ) \ + extern const expdecl wxEventType name + #define wxDECLARE_EVENT( name, type ) \ + wxDECLARE_EXPORTED_EVENT( wxEMPTY_PARAMETER_VALUE, name, type ) + + #define wxDEFINE_EVENT_ALIAS( name, type, value ) \ + const wxEventType name = value + #define wxDECLARE_EXPORTED_EVENT_ALIAS( expdecl, name, type ) \ + extern const expdecl wxEventType name +#endif // wxHAS_EVENT_BIND/!wxHAS_EVENT_BIND + +// Try to cast the given event handler to the correct handler type: + +#define wxEVENT_HANDLER_CAST( functype, func ) \ + ( wxObjectEventFunction )( wxEventFunction )wxStaticCastEvent( functype, &func ) + + +#ifdef wxHAS_EVENT_BIND + +// The tag is a type associated to the event type (which is an integer itself, +// in spite of its name) value. It exists in order to be used as a template +// parameter and provide a mapping between the event type values and their +// corresponding wxEvent-derived classes. +template +class wxEventTypeTag +{ +public: + // The class of wxEvent-derived class carried by the events of this type. + typedef T EventClass; + + wxEventTypeTag(wxEventType type) { m_type = type; } + + // Return a wxEventType reference for the initialization of the static + // event tables. See wxEventTableEntry::m_eventType for a more thorough + // explanation. + operator const wxEventType&() const { return m_type; } + +private: + wxEventType m_type; +}; + +#endif // wxHAS_EVENT_BIND + +// These are needed for the functor definitions +typedef void (wxEvtHandler::*wxEventFunction)(wxEvent&); + +// We had some trouble (specifically with eVC for ARM WinCE build) with using +// wxEventFunction in the past so we had introduced wxObjectEventFunction which +// used to be a typedef for a member of wxObject and not wxEvtHandler to work +// around this but as eVC is not really supported any longer we now only keep +// this for backwards compatibility and, despite its name, this is a typedef +// for wxEvtHandler member now -- but if we have the same problem with another +// compiler we can restore its old definition for it. +typedef wxEventFunction wxObjectEventFunction; + +// The event functor which is stored in the static and dynamic event tables: +class WXDLLIMPEXP_BASE wxEventFunctor +{ +public: + virtual ~wxEventFunctor(); + + // Invoke the actual event handler: + virtual void operator()(wxEvtHandler *, wxEvent&) = 0; + + // this function tests whether this functor is matched, for the purpose of + // finding it in an event table in Unbind(), by the given functor: + virtual bool IsMatching(const wxEventFunctor& functor) const = 0; + + // If the functor holds an wxEvtHandler, then get access to it and track + // its lifetime with wxEventConnectionRef: + virtual wxEvtHandler *GetEvtHandler() const + { return NULL; } + + // This is only used to maintain backward compatibility in + // wxAppConsoleBase::CallEventHandler and ensures that an overwritten + // wxAppConsoleBase::HandleEvent is still called for functors which hold an + // wxEventFunction: + virtual wxEventFunction GetEvtMethod() const + { return NULL; } + +private: + WX_DECLARE_ABSTRACT_TYPEINFO(wxEventFunctor) +}; + +// A plain method functor for the untyped legacy event types: +class WXDLLIMPEXP_BASE wxObjectEventFunctor : public wxEventFunctor +{ +public: + wxObjectEventFunctor(wxObjectEventFunction method, wxEvtHandler *handler) + : m_handler( handler ), m_method( method ) + { } + + virtual void operator()(wxEvtHandler *handler, wxEvent& event); + + virtual bool IsMatching(const wxEventFunctor& functor) const + { + if ( wxTypeId(functor) == wxTypeId(*this) ) + { + const wxObjectEventFunctor &other = + static_cast< const wxObjectEventFunctor & >( functor ); + + // FIXME-VC6: amazing but true: replacing "m_method == 0" here + // with "!m_method" makes VC6 crash with an ICE in DLL build (only!) + // Also notice that using "NULL" instead of "0" results in warnings + // about "using NULL in arithmetics" from arm-linux-androideabi-g++ + // 4.4.3 used for wxAndroid build. + + return ( m_method == other.m_method || other.m_method == 0 ) && + ( m_handler == other.m_handler || other.m_handler == NULL ); + } + else + return false; + } + + virtual wxEvtHandler *GetEvtHandler() const + { return m_handler; } + + virtual wxEventFunction GetEvtMethod() const + { return m_method; } + +private: + wxEvtHandler *m_handler; + wxEventFunction m_method; + + // Provide a dummy default ctor for type info purposes + wxObjectEventFunctor() { } + + WX_DECLARE_TYPEINFO_INLINE(wxObjectEventFunctor) +}; + +// Create a functor for the legacy events: used by Connect() +inline wxObjectEventFunctor * +wxNewEventFunctor(const wxEventType& WXUNUSED(evtType), + wxObjectEventFunction method, + wxEvtHandler *handler) +{ + return new wxObjectEventFunctor(method, handler); +} + +// This version is used by wxDECLARE_EVENT_TABLE_ENTRY() +inline wxObjectEventFunctor * +wxNewEventTableFunctor(const wxEventType& WXUNUSED(evtType), + wxObjectEventFunction method) +{ + return new wxObjectEventFunctor(method, NULL); +} + +inline wxObjectEventFunctor +wxMakeEventFunctor(const wxEventType& WXUNUSED(evtType), + wxObjectEventFunction method, + wxEvtHandler *handler) +{ + return wxObjectEventFunctor(method, handler); +} + +#ifdef wxHAS_EVENT_BIND + +namespace wxPrivate +{ + +// helper template defining nested "type" typedef as the event class +// corresponding to the given event type +template struct EventClassOf; + +// the typed events provide the information about the class of the events they +// carry themselves: +template +struct EventClassOf< wxEventTypeTag > +{ + typedef typename wxEventTypeTag::EventClass type; +}; + +// for the old untyped events we don't have information about the exact event +// class carried by them +template <> +struct EventClassOf +{ + typedef wxEvent type; +}; + + +// helper class defining operations different for method functors using an +// object of wxEvtHandler-derived class as handler and the others +template struct HandlerImpl; + +// specialization for handlers deriving from wxEvtHandler +template +struct HandlerImpl +{ + static bool IsEvtHandler() + { return true; } + static T *ConvertFromEvtHandler(wxEvtHandler *p) + { return static_cast(p); } + static wxEvtHandler *ConvertToEvtHandler(T *p) + { return p; } + static wxEventFunction ConvertToEvtMethod(void (T::*f)(A&)) + { return static_cast( + reinterpret_cast(f)); } +}; + +// specialization for handlers not deriving from wxEvtHandler +template +struct HandlerImpl +{ + static bool IsEvtHandler() + { return false; } + static T *ConvertFromEvtHandler(wxEvtHandler *) + { return NULL; } + static wxEvtHandler *ConvertToEvtHandler(T *) + { return NULL; } + static wxEventFunction ConvertToEvtMethod(void (T::*)(A&)) + { return NULL; } +}; + +} // namespace wxPrivate + +// functor forwarding the event to a method of the given object +// +// notice that the object class may be different from the class in which the +// method is defined but it must be convertible to this class +// +// also, the type of the handler parameter doesn't need to be exactly the same +// as EventTag::EventClass but it must be its base class -- this is explicitly +// allowed to handle different events in the same handler taking wxEvent&, for +// example +template + +class wxEventFunctorMethod + : public wxEventFunctor, + private wxPrivate::HandlerImpl + < + Class, + EventArg, + wxConvertibleTo::value != 0 + > +{ +private: + static void CheckHandlerArgument(EventArg *) { } + +public: + // the event class associated with the given event tag + typedef typename wxPrivate::EventClassOf::type EventClass; + + + wxEventFunctorMethod(void (Class::*method)(EventArg&), EventHandler *handler) + : m_handler( handler ), m_method( method ) + { + wxASSERT_MSG( handler || this->IsEvtHandler(), + "handlers defined in non-wxEvtHandler-derived classes " + "must be connected with a valid sink object" ); + + // if you get an error here it means that the signature of the handler + // you're trying to use is not compatible with (i.e. is not the same as + // or a base class of) the real event class used for this event type + CheckHandlerArgument(static_cast(NULL)); + } + + virtual void operator()(wxEvtHandler *handler, wxEvent& event) + { + Class * realHandler = m_handler; + if ( !realHandler ) + { + realHandler = this->ConvertFromEvtHandler(handler); + + // this is not supposed to happen but check for it nevertheless + wxCHECK_RET( realHandler, "invalid event handler" ); + } + + // the real (run-time) type of event is EventClass and we checked in + // the ctor that EventClass can be converted to EventArg, so this cast + // is always valid + (realHandler->*m_method)(static_cast(event)); + } + + virtual bool IsMatching(const wxEventFunctor& functor) const + { + if ( wxTypeId(functor) != wxTypeId(*this) ) + return false; + + typedef wxEventFunctorMethod + ThisFunctor; + + // the cast is valid because wxTypeId()s matched above + const ThisFunctor& other = static_cast(functor); + + return (m_method == other.m_method || other.m_method == NULL) && + (m_handler == other.m_handler || other.m_handler == NULL); + } + + virtual wxEvtHandler *GetEvtHandler() const + { return this->ConvertToEvtHandler(m_handler); } + + virtual wxEventFunction GetEvtMethod() const + { return this->ConvertToEvtMethod(m_method); } + +private: + EventHandler *m_handler; + void (Class::*m_method)(EventArg&); + + // Provide a dummy default ctor for type info purposes + wxEventFunctorMethod() { } + + typedef wxEventFunctorMethod thisClass; + WX_DECLARE_TYPEINFO_INLINE(thisClass) +}; + + +// functor forwarding the event to function (function, static method) +template +class wxEventFunctorFunction : public wxEventFunctor +{ +private: + static void CheckHandlerArgument(EventArg *) { } + +public: + // the event class associated with the given event tag + typedef typename wxPrivate::EventClassOf::type EventClass; + + wxEventFunctorFunction( void ( *handler )( EventArg & )) + : m_handler( handler ) + { + // if you get an error here it means that the signature of the handler + // you're trying to use is not compatible with (i.e. is not the same as + // or a base class of) the real event class used for this event type + CheckHandlerArgument(static_cast(NULL)); + } + + virtual void operator()(wxEvtHandler *WXUNUSED(handler), wxEvent& event) + { + // If you get an error here like "must use .* or ->* to call + // pointer-to-member function" then you probably tried to call + // Bind/Unbind with a method pointer but without a handler pointer or + // NULL as a handler e.g.: + // Unbind( wxEVT_XXX, &EventHandler::method ); + // or + // Unbind( wxEVT_XXX, &EventHandler::method, NULL ) + m_handler(static_cast(event)); + } + + virtual bool IsMatching(const wxEventFunctor &functor) const + { + if ( wxTypeId(functor) != wxTypeId(*this) ) + return false; + + typedef wxEventFunctorFunction ThisFunctor; + + const ThisFunctor& other = static_cast( functor ); + + return m_handler == other.m_handler; + } + +private: + void (*m_handler)(EventArg&); + + // Provide a dummy default ctor for type info purposes + wxEventFunctorFunction() { } + + typedef wxEventFunctorFunction thisClass; + WX_DECLARE_TYPEINFO_INLINE(thisClass) +}; + + +template +class wxEventFunctorFunctor : public wxEventFunctor +{ +public: + typedef typename EventTag::EventClass EventArg; + + wxEventFunctorFunctor(const Functor& handler) + : m_handler(handler), m_handlerAddr(&handler) + { } + + virtual void operator()(wxEvtHandler *WXUNUSED(handler), wxEvent& event) + { + // If you get an error here like "must use '.*' or '->*' to call + // pointer-to-member function" then you probably tried to call + // Bind/Unbind with a method pointer but without a handler pointer or + // NULL as a handler e.g.: + // Unbind( wxEVT_XXX, &EventHandler::method ); + // or + // Unbind( wxEVT_XXX, &EventHandler::method, NULL ) + m_handler(static_cast(event)); + } + + virtual bool IsMatching(const wxEventFunctor &functor) const + { + if ( wxTypeId(functor) != wxTypeId(*this) ) + return false; + + typedef wxEventFunctorFunctor FunctorThis; + + const FunctorThis& other = static_cast(functor); + + // The only reliable/portable way to compare two functors is by + // identity: + return m_handlerAddr == other.m_handlerAddr; + } + +private: + // Store a copy of the functor to prevent using/calling an already + // destroyed instance: + Functor m_handler; + + // Use the address of the original functor for comparison in IsMatching: + const void *m_handlerAddr; + + // Provide a dummy default ctor for type info purposes + wxEventFunctorFunctor() { } + + typedef wxEventFunctorFunctor thisClass; + WX_DECLARE_TYPEINFO_INLINE(thisClass) +}; + +// Create functors for the templatized events, either allocated on the heap for +// wxNewXXX() variants (this is needed in wxEvtHandler::Bind<>() to store them +// in dynamic event table) or just by returning them as temporary objects (this +// is enough for Unbind<>() and we avoid unnecessary heap allocation like this). + + +// Create functors wrapping functions: +template +inline wxEventFunctorFunction * +wxNewEventFunctor(const EventTag&, void (*func)(EventArg &)) +{ + return new wxEventFunctorFunction(func); +} + +template +inline wxEventFunctorFunction +wxMakeEventFunctor(const EventTag&, void (*func)(EventArg &)) +{ + return wxEventFunctorFunction(func); +} + +// Create functors wrapping other functors: +template +inline wxEventFunctorFunctor * +wxNewEventFunctor(const EventTag&, const Functor &func) +{ + return new wxEventFunctorFunctor(func); +} + +template +inline wxEventFunctorFunctor +wxMakeEventFunctor(const EventTag&, const Functor &func) +{ + return wxEventFunctorFunctor(func); +} + +// Create functors wrapping methods: +template + +inline wxEventFunctorMethod * +wxNewEventFunctor(const EventTag&, + void (Class::*method)(EventArg&), + EventHandler *handler) +{ + return new wxEventFunctorMethod( + method, handler); +} + +template + +inline wxEventFunctorMethod +wxMakeEventFunctor(const EventTag&, + void (Class::*method)(EventArg&), + EventHandler *handler) +{ + return wxEventFunctorMethod( + method, handler); +} + +// Create an event functor for the event table via wxDECLARE_EVENT_TABLE_ENTRY: +// in this case we don't have the handler (as it's always the same as the +// object which generated the event) so we must use Class as its type +template +inline wxEventFunctorMethod * +wxNewEventTableFunctor(const EventTag&, void (Class::*method)(EventArg&)) +{ + return new wxEventFunctorMethod( + method, NULL); +} + +#endif // wxHAS_EVENT_BIND + + +// many, but not all, standard event types + + // some generic events +extern WXDLLIMPEXP_BASE const wxEventType wxEVT_NULL; +extern WXDLLIMPEXP_BASE const wxEventType wxEVT_FIRST; +extern WXDLLIMPEXP_BASE const wxEventType wxEVT_USER_FIRST; + + // Need events declared to do this +class WXDLLIMPEXP_FWD_BASE wxIdleEvent; +class WXDLLIMPEXP_FWD_BASE wxThreadEvent; +class WXDLLIMPEXP_FWD_BASE wxAsyncMethodCallEvent; +class WXDLLIMPEXP_FWD_CORE wxCommandEvent; +class WXDLLIMPEXP_FWD_CORE wxMouseEvent; +class WXDLLIMPEXP_FWD_CORE wxFocusEvent; +class WXDLLIMPEXP_FWD_CORE wxChildFocusEvent; +class WXDLLIMPEXP_FWD_CORE wxKeyEvent; +class WXDLLIMPEXP_FWD_CORE wxNavigationKeyEvent; +class WXDLLIMPEXP_FWD_CORE wxSetCursorEvent; +class WXDLLIMPEXP_FWD_CORE wxScrollEvent; +class WXDLLIMPEXP_FWD_CORE wxSpinEvent; +class WXDLLIMPEXP_FWD_CORE wxScrollWinEvent; +class WXDLLIMPEXP_FWD_CORE wxSizeEvent; +class WXDLLIMPEXP_FWD_CORE wxMoveEvent; +class WXDLLIMPEXP_FWD_CORE wxCloseEvent; +class WXDLLIMPEXP_FWD_CORE wxActivateEvent; +class WXDLLIMPEXP_FWD_CORE wxWindowCreateEvent; +class WXDLLIMPEXP_FWD_CORE wxWindowDestroyEvent; +class WXDLLIMPEXP_FWD_CORE wxShowEvent; +class WXDLLIMPEXP_FWD_CORE wxIconizeEvent; +class WXDLLIMPEXP_FWD_CORE wxMaximizeEvent; +class WXDLLIMPEXP_FWD_CORE wxMouseCaptureChangedEvent; +class WXDLLIMPEXP_FWD_CORE wxMouseCaptureLostEvent; +class WXDLLIMPEXP_FWD_CORE wxPaintEvent; +class WXDLLIMPEXP_FWD_CORE wxEraseEvent; +class WXDLLIMPEXP_FWD_CORE wxNcPaintEvent; +class WXDLLIMPEXP_FWD_CORE wxMenuEvent; +class WXDLLIMPEXP_FWD_CORE wxContextMenuEvent; +class WXDLLIMPEXP_FWD_CORE wxSysColourChangedEvent; +class WXDLLIMPEXP_FWD_CORE wxDisplayChangedEvent; +class WXDLLIMPEXP_FWD_CORE wxQueryNewPaletteEvent; +class WXDLLIMPEXP_FWD_CORE wxPaletteChangedEvent; +class WXDLLIMPEXP_FWD_CORE wxJoystickEvent; +class WXDLLIMPEXP_FWD_CORE wxDropFilesEvent; +class WXDLLIMPEXP_FWD_CORE wxInitDialogEvent; +class WXDLLIMPEXP_FWD_CORE wxUpdateUIEvent; +class WXDLLIMPEXP_FWD_CORE wxClipboardTextEvent; +class WXDLLIMPEXP_FWD_CORE wxHelpEvent; + + + // Command events +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_BUTTON, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_CHECKBOX, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_CHOICE, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_LISTBOX, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_LISTBOX_DCLICK, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_CHECKLISTBOX, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MENU, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SLIDER, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_RADIOBOX, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_RADIOBUTTON, wxCommandEvent); + +// wxEVT_SCROLLBAR is deprecated, use wxEVT_SCROLL... events +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLLBAR, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_VLBOX, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMBOBOX, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TOOL_RCLICKED, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TOOL_DROPDOWN, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TOOL_ENTER, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMBOBOX_DROPDOWN, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMBOBOX_CLOSEUP, wxCommandEvent); + + // Thread and asynchronous method call events +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_BASE, wxEVT_THREAD, wxThreadEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_BASE, wxEVT_ASYNC_METHOD_CALL, wxAsyncMethodCallEvent); + + // Mouse event types +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_LEFT_DOWN, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_LEFT_UP, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MIDDLE_DOWN, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MIDDLE_UP, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_RIGHT_DOWN, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_RIGHT_UP, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MOTION, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_ENTER_WINDOW, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_LEAVE_WINDOW, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_LEFT_DCLICK, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MIDDLE_DCLICK, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_RIGHT_DCLICK, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SET_FOCUS, wxFocusEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_KILL_FOCUS, wxFocusEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_CHILD_FOCUS, wxChildFocusEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MOUSEWHEEL, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_AUX1_DOWN, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_AUX1_UP, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_AUX1_DCLICK, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_AUX2_DOWN, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_AUX2_UP, wxMouseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_AUX2_DCLICK, wxMouseEvent); + + // Character input event type +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_CHAR, wxKeyEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_CHAR_HOOK, wxKeyEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_NAVIGATION_KEY, wxNavigationKeyEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_KEY_DOWN, wxKeyEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_KEY_UP, wxKeyEvent); +#if wxUSE_HOTKEY +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_HOTKEY, wxKeyEvent); +#endif +// This is a private event used by wxMSW code only and subject to change or +// disappear in the future. Don't use. +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_AFTER_CHAR, wxKeyEvent); + + // Set cursor event +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SET_CURSOR, wxSetCursorEvent); + + // wxScrollBar and wxSlider event identifiers +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLL_TOP, wxScrollEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLL_BOTTOM, wxScrollEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLL_LINEUP, wxScrollEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLL_LINEDOWN, wxScrollEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLL_PAGEUP, wxScrollEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLL_PAGEDOWN, wxScrollEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLL_THUMBTRACK, wxScrollEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLL_THUMBRELEASE, wxScrollEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLL_CHANGED, wxScrollEvent); + +// Due to a bug in older wx versions, wxSpinEvents were being sent with type of +// wxEVT_SCROLL_LINEUP, wxEVT_SCROLL_LINEDOWN and wxEVT_SCROLL_THUMBTRACK. But +// with the type-safe events in place, these event types are associated with +// wxScrollEvent. To allow handling of spin events, new event types have been +// defined in spinbutt.h/spinnbuttcmn.cpp. To maintain backward compatibility +// the spin event types are being initialized with the scroll event types. + +#if wxUSE_SPINBTN + +wxDECLARE_EXPORTED_EVENT_ALIAS( WXDLLIMPEXP_CORE, wxEVT_SPIN_UP, wxSpinEvent ); +wxDECLARE_EXPORTED_EVENT_ALIAS( WXDLLIMPEXP_CORE, wxEVT_SPIN_DOWN, wxSpinEvent ); +wxDECLARE_EXPORTED_EVENT_ALIAS( WXDLLIMPEXP_CORE, wxEVT_SPIN, wxSpinEvent ); + +#endif + + // Scroll events from wxWindow +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLLWIN_TOP, wxScrollWinEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLLWIN_BOTTOM, wxScrollWinEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLLWIN_LINEUP, wxScrollWinEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLLWIN_LINEDOWN, wxScrollWinEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLLWIN_PAGEUP, wxScrollWinEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLLWIN_PAGEDOWN, wxScrollWinEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLLWIN_THUMBTRACK, wxScrollWinEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLLWIN_THUMBRELEASE, wxScrollWinEvent); + + // System events +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SIZE, wxSizeEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MOVE, wxMoveEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_CLOSE_WINDOW, wxCloseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_END_SESSION, wxCloseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_QUERY_END_SESSION, wxCloseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_ACTIVATE_APP, wxActivateEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_ACTIVATE, wxActivateEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_CREATE, wxWindowCreateEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_DESTROY, wxWindowDestroyEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SHOW, wxShowEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_ICONIZE, wxIconizeEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MAXIMIZE, wxMaximizeEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MOUSE_CAPTURE_CHANGED, wxMouseCaptureChangedEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MOUSE_CAPTURE_LOST, wxMouseCaptureLostEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_PAINT, wxPaintEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_ERASE_BACKGROUND, wxEraseEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_NC_PAINT, wxNcPaintEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MENU_OPEN, wxMenuEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MENU_CLOSE, wxMenuEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MENU_HIGHLIGHT, wxMenuEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_CONTEXT_MENU, wxContextMenuEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SYS_COLOUR_CHANGED, wxSysColourChangedEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_DISPLAY_CHANGED, wxDisplayChangedEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_QUERY_NEW_PALETTE, wxQueryNewPaletteEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_PALETTE_CHANGED, wxPaletteChangedEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_JOY_BUTTON_DOWN, wxJoystickEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_JOY_BUTTON_UP, wxJoystickEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_JOY_MOVE, wxJoystickEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_JOY_ZMOVE, wxJoystickEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_DROP_FILES, wxDropFilesEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_INIT_DIALOG, wxInitDialogEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_BASE, wxEVT_IDLE, wxIdleEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_UPDATE_UI, wxUpdateUIEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SIZING, wxSizeEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MOVING, wxMoveEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MOVE_START, wxMoveEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MOVE_END, wxMoveEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_HIBERNATE, wxActivateEvent); + + // Clipboard events +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT_COPY, wxClipboardTextEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT_CUT, wxClipboardTextEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT_PASTE, wxClipboardTextEvent); + + // Generic command events + // Note: a click is a higher-level event than button down/up +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_LEFT_CLICK, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_LEFT_DCLICK, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_RIGHT_CLICK, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_RIGHT_DCLICK, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_SET_FOCUS, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_KILL_FOCUS, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_ENTER, wxCommandEvent); + + // Help events +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_HELP, wxHelpEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_DETAILED_HELP, wxHelpEvent); + +// these 2 events are the same +#define wxEVT_TOOL wxEVT_MENU + +// ---------------------------------------------------------------------------- +// Compatibility +// ---------------------------------------------------------------------------- + +// this event is also used by wxComboBox and wxSpinCtrl which don't include +// wx/textctrl.h in all ports [yet], so declare it here as well +// +// still, any new code using it should include wx/textctrl.h explicitly +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT, wxCommandEvent); + + +// ---------------------------------------------------------------------------- +// wxEvent(-derived) classes +// ---------------------------------------------------------------------------- + +// the predefined constants for the number of times we propagate event +// upwards window child-parent chain +enum wxEventPropagation +{ + // don't propagate it at all + wxEVENT_PROPAGATE_NONE = 0, + + // propagate it until it is processed + wxEVENT_PROPAGATE_MAX = INT_MAX +}; + +// The different categories for a wxEvent; see wxEvent::GetEventCategory. +// NOTE: they are used as OR-combinable flags by wxEventLoopBase::YieldFor +enum wxEventCategory +{ + // this is the category for those events which are generated to update + // the appearance of the GUI but which (usually) do not comport data + // processing, i.e. which do not provide input or output data + // (e.g. size events, scroll events, etc). + // They are events NOT directly generated by the user's input devices. + wxEVT_CATEGORY_UI = 1, + + // this category groups those events which are generated directly from the + // user through input devices like mouse and keyboard and usually result in + // data to be processed from the application. + // (e.g. mouse clicks, key presses, etc) + wxEVT_CATEGORY_USER_INPUT = 2, + + // this category is for wxSocketEvent + wxEVT_CATEGORY_SOCKET = 4, + + // this category is for wxTimerEvent + wxEVT_CATEGORY_TIMER = 8, + + // this category is for any event used to send notifications from the + // secondary threads to the main one or in general for notifications among + // different threads (which may or may not be user-generated) + wxEVT_CATEGORY_THREAD = 16, + + + // implementation only + + // used in the implementations of wxEventLoopBase::YieldFor + wxEVT_CATEGORY_UNKNOWN = 32, + + // a special category used as an argument to wxEventLoopBase::YieldFor to indicate that + // Yield() should leave all wxEvents on the queue while emptying the native event queue + // (native events will be processed but the wxEvents they generate will be queued) + wxEVT_CATEGORY_CLIPBOARD = 64, + + + // shortcut masks + + // this category groups those events which are emitted in response to + // events of the native toolkit and which typically are not-"delayable". + wxEVT_CATEGORY_NATIVE_EVENTS = wxEVT_CATEGORY_UI|wxEVT_CATEGORY_USER_INPUT, + + // used in wxEventLoopBase::YieldFor to specify all event categories should be processed: + wxEVT_CATEGORY_ALL = + wxEVT_CATEGORY_UI|wxEVT_CATEGORY_USER_INPUT|wxEVT_CATEGORY_SOCKET| \ + wxEVT_CATEGORY_TIMER|wxEVT_CATEGORY_THREAD|wxEVT_CATEGORY_UNKNOWN| \ + wxEVT_CATEGORY_CLIPBOARD +}; + +/* + * wxWidgets events, covering all interesting things that might happen + * (button clicking, resizing, setting text in widgets, etc.). + * + * For each completely new event type, derive a new event class. + * An event CLASS represents a C++ class defining a range of similar event TYPES; + * examples are canvas events, panel item command events. + * An event TYPE is a unique identifier for a particular system event, + * such as a button press or a listbox deselection. + * + */ + +class WXDLLIMPEXP_BASE wxEvent : public wxObject +{ +public: + wxEvent(int winid = 0, wxEventType commandType = wxEVT_NULL ); + + void SetEventType(wxEventType typ) { m_eventType = typ; } + wxEventType GetEventType() const { return m_eventType; } + + wxObject *GetEventObject() const { return m_eventObject; } + void SetEventObject(wxObject *obj) { m_eventObject = obj; } + + long GetTimestamp() const { return m_timeStamp; } + void SetTimestamp(long ts = 0) { m_timeStamp = ts; } + + int GetId() const { return m_id; } + void SetId(int Id) { m_id = Id; } + + // Returns the user data optionally associated with the event handler when + // using Connect() or Bind(). + wxObject *GetEventUserData() const { return m_callbackUserData; } + + // Can instruct event processor that we wish to ignore this event + // (treat as if the event table entry had not been found): this must be done + // to allow the event processing by the base classes (calling event.Skip() + // is the analog of calling the base class version of a virtual function) + void Skip(bool skip = true) { m_skipped = skip; } + bool GetSkipped() const { return m_skipped; } + + // This function is used to create a copy of the event polymorphically and + // all derived classes must implement it because otherwise wxPostEvent() + // for them wouldn't work (it needs to do a copy of the event) + virtual wxEvent *Clone() const = 0; + + // this function is used to selectively process events in wxEventLoopBase::YieldFor + // NOTE: by default it returns wxEVT_CATEGORY_UI just because the major + // part of wxWidgets events belong to that category. + virtual wxEventCategory GetEventCategory() const + { return wxEVT_CATEGORY_UI; } + + // Implementation only: this test is explicitly anti OO and this function + // exists only for optimization purposes. + bool IsCommandEvent() const { return m_isCommandEvent; } + + // Determine if this event should be propagating to the parent window. + bool ShouldPropagate() const + { return m_propagationLevel != wxEVENT_PROPAGATE_NONE; } + + // Stop an event from propagating to its parent window, returns the old + // propagation level value + int StopPropagation() + { + int propagationLevel = m_propagationLevel; + m_propagationLevel = wxEVENT_PROPAGATE_NONE; + return propagationLevel; + } + + // Resume the event propagation by restoring the propagation level + // (returned by StopPropagation()) + void ResumePropagation(int propagationLevel) + { + m_propagationLevel = propagationLevel; + } + + // This method is for internal use only and allows to get the object that + // is propagating this event upwards the window hierarchy, if any. + wxEvtHandler* GetPropagatedFrom() const { return m_propagatedFrom; } + + // This is for internal use only and is only called by + // wxEvtHandler::ProcessEvent() to check whether it's the first time this + // event is being processed + bool WasProcessed() + { + if ( m_wasProcessed ) + return true; + + m_wasProcessed = true; + + return false; + } + + // This is for internal use only and is used for setting, testing and + // resetting of m_willBeProcessedAgain flag. + void SetWillBeProcessedAgain() + { + m_willBeProcessedAgain = true; + } + + bool WillBeProcessedAgain() + { + if ( m_willBeProcessedAgain ) + { + m_willBeProcessedAgain = false; + return true; + } + + return false; + } + + // This is also used only internally by ProcessEvent() to check if it + // should process the event normally or only restrict the search for the + // event handler to this object itself. + bool ShouldProcessOnlyIn(wxEvtHandler *h) const + { + return h == m_handlerToProcessOnlyIn; + } + + // Called to indicate that the result of ShouldProcessOnlyIn() wasn't taken + // into account. The existence of this function may seem counterintuitive + // but unfortunately it's needed by wxScrollHelperEvtHandler, see comments + // there. Don't even think of using this in your own code, this is a gross + // hack and is only needed because of wx complicated history and should + // never be used anywhere else. + void DidntHonourProcessOnlyIn() + { + m_handlerToProcessOnlyIn = NULL; + } + +protected: + wxObject* m_eventObject; + wxEventType m_eventType; + long m_timeStamp; + int m_id; + +public: + // m_callbackUserData is for internal usage only + wxObject* m_callbackUserData; + +private: + // If this handler + wxEvtHandler *m_handlerToProcessOnlyIn; + +protected: + // the propagation level: while it is positive, we propagate the event to + // the parent window (if any) + int m_propagationLevel; + + // The object that the event is being propagated from, initially NULL and + // only set by wxPropagateOnce. + wxEvtHandler* m_propagatedFrom; + + bool m_skipped; + bool m_isCommandEvent; + + // initially false but becomes true as soon as WasProcessed() is called for + // the first time, as this is done only by ProcessEvent() it explains the + // variable name: it becomes true after ProcessEvent() was called at least + // once for this event + bool m_wasProcessed; + + // This one is initially false too, but can be set to true to indicate that + // the event will be passed to another handler if it's not processed in + // this one. + bool m_willBeProcessedAgain; + +protected: + wxEvent(const wxEvent&); // for implementing Clone() + wxEvent& operator=(const wxEvent&); // for derived classes operator=() + +private: + // It needs to access our m_propagationLevel and m_propagatedFrom fields. + friend class WXDLLIMPEXP_FWD_BASE wxPropagateOnce; + + // and this one needs to access our m_handlerToProcessOnlyIn + friend class WXDLLIMPEXP_FWD_BASE wxEventProcessInHandlerOnly; + + + DECLARE_ABSTRACT_CLASS(wxEvent) +}; + +/* + * Helper class to temporarily change an event not to propagate. + */ +class WXDLLIMPEXP_BASE wxPropagationDisabler +{ +public: + wxPropagationDisabler(wxEvent& event) : m_event(event) + { + m_propagationLevelOld = m_event.StopPropagation(); + } + + ~wxPropagationDisabler() + { + m_event.ResumePropagation(m_propagationLevelOld); + } + +private: + wxEvent& m_event; + int m_propagationLevelOld; + + wxDECLARE_NO_COPY_CLASS(wxPropagationDisabler); +}; + +/* + * Helper used to indicate that an event is propagated upwards the window + * hierarchy by the given window. + */ +class WXDLLIMPEXP_BASE wxPropagateOnce +{ +public: + // The handler argument should normally be non-NULL to allow the parent + // event handler to know that it's being used to process an event coming + // from the child, it's only NULL by default for backwards compatibility. + wxPropagateOnce(wxEvent& event, wxEvtHandler* handler = NULL) + : m_event(event), + m_propagatedFromOld(event.m_propagatedFrom) + { + wxASSERT_MSG( m_event.m_propagationLevel > 0, + wxT("shouldn't be used unless ShouldPropagate()!") ); + + m_event.m_propagationLevel--; + m_event.m_propagatedFrom = handler; + } + + ~wxPropagateOnce() + { + m_event.m_propagatedFrom = m_propagatedFromOld; + m_event.m_propagationLevel++; + } + +private: + wxEvent& m_event; + wxEvtHandler* const m_propagatedFromOld; + + wxDECLARE_NO_COPY_CLASS(wxPropagateOnce); +}; + +// A helper object used to temporarily make wxEvent::ShouldProcessOnlyIn() +// return true for the handler passed to its ctor. +class wxEventProcessInHandlerOnly +{ +public: + wxEventProcessInHandlerOnly(wxEvent& event, wxEvtHandler *handler) + : m_event(event), + m_handlerToProcessOnlyInOld(event.m_handlerToProcessOnlyIn) + { + m_event.m_handlerToProcessOnlyIn = handler; + } + + ~wxEventProcessInHandlerOnly() + { + m_event.m_handlerToProcessOnlyIn = m_handlerToProcessOnlyInOld; + } + +private: + wxEvent& m_event; + wxEvtHandler * const m_handlerToProcessOnlyInOld; + + wxDECLARE_NO_COPY_CLASS(wxEventProcessInHandlerOnly); +}; + + +class WXDLLIMPEXP_BASE wxEventBasicPayloadMixin +{ +public: + wxEventBasicPayloadMixin() + : m_commandInt(0), + m_extraLong(0) + { + } + + void SetString(const wxString& s) { m_cmdString = s; } + const wxString& GetString() const { return m_cmdString; } + + void SetInt(int i) { m_commandInt = i; } + int GetInt() const { return m_commandInt; } + + void SetExtraLong(long extraLong) { m_extraLong = extraLong; } + long GetExtraLong() const { return m_extraLong; } + +protected: + // Note: these variables have "cmd" or "command" in their name for backward compatibility: + // they used to be part of wxCommandEvent, not this mixin. + wxString m_cmdString; // String event argument + int m_commandInt; + long m_extraLong; // Additional information (e.g. select/deselect) + + wxDECLARE_NO_ASSIGN_CLASS(wxEventBasicPayloadMixin); +}; + +class WXDLLIMPEXP_BASE wxEventAnyPayloadMixin : public wxEventBasicPayloadMixin +{ +public: + wxEventAnyPayloadMixin() : wxEventBasicPayloadMixin() {} + +#if wxUSE_ANY && (!defined(__VISUALC__) || wxCHECK_VISUALC_VERSION(7)) + template + void SetPayload(const T& payload) + { + m_payload = payload; + } + + template + T GetPayload() const + { + return m_payload.As(); + } + +protected: + wxAny m_payload; +#endif // wxUSE_ANY && (!defined(__VISUALC__) || wxCHECK_VISUALC_VERSION(7)) + + wxDECLARE_NO_ASSIGN_CLASS(wxEventBasicPayloadMixin); +}; + + +// Idle event +/* + wxEVT_IDLE + */ + +// Whether to always send idle events to windows, or +// to only send update events to those with the +// wxWS_EX_PROCESS_IDLE style. + +enum wxIdleMode +{ + // Send idle events to all windows + wxIDLE_PROCESS_ALL, + + // Send idle events to windows that have + // the wxWS_EX_PROCESS_IDLE flag specified + wxIDLE_PROCESS_SPECIFIED +}; + +class WXDLLIMPEXP_BASE wxIdleEvent : public wxEvent +{ +public: + wxIdleEvent() + : wxEvent(0, wxEVT_IDLE), + m_requestMore(false) + { } + wxIdleEvent(const wxIdleEvent& event) + : wxEvent(event), + m_requestMore(event.m_requestMore) + { } + + void RequestMore(bool needMore = true) { m_requestMore = needMore; } + bool MoreRequested() const { return m_requestMore; } + + virtual wxEvent *Clone() const { return new wxIdleEvent(*this); } + + // Specify how wxWidgets will send idle events: to + // all windows, or only to those which specify that they + // will process the events. + static void SetMode(wxIdleMode mode) { sm_idleMode = mode; } + + // Returns the idle event mode + static wxIdleMode GetMode() { return sm_idleMode; } + +protected: + bool m_requestMore; + static wxIdleMode sm_idleMode; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxIdleEvent) +}; + + +// Thread event + +class WXDLLIMPEXP_BASE wxThreadEvent : public wxEvent, + public wxEventAnyPayloadMixin +{ +public: + wxThreadEvent(wxEventType eventType = wxEVT_THREAD, int id = wxID_ANY) + : wxEvent(id, eventType) + { } + + wxThreadEvent(const wxThreadEvent& event) + : wxEvent(event), + wxEventAnyPayloadMixin(event) + { + // make sure our string member (which uses COW, aka refcounting) is not + // shared by other wxString instances: + SetString(GetString().Clone()); + } + + virtual wxEvent *Clone() const + { + return new wxThreadEvent(*this); + } + + // this is important to avoid that calling wxEventLoopBase::YieldFor thread events + // gets processed when this is unwanted: + virtual wxEventCategory GetEventCategory() const + { return wxEVT_CATEGORY_THREAD; } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxThreadEvent) +}; + + +// Asynchronous method call events: these event are processed by wxEvtHandler +// itself and result in a call to its Execute() method which simply calls the +// specified method. The difference with a simple method call is that this is +// done asynchronously, i.e. at some later time, instead of immediately when +// the event object is constructed. + +#ifdef wxHAS_CALL_AFTER + +// This is a base class used to process all method calls. +class wxAsyncMethodCallEvent : public wxEvent +{ +public: + wxAsyncMethodCallEvent(wxObject* object) + : wxEvent(wxID_ANY, wxEVT_ASYNC_METHOD_CALL) + { + SetEventObject(object); + } + + wxAsyncMethodCallEvent(const wxAsyncMethodCallEvent& other) + : wxEvent(other) + { + } + + virtual void Execute() = 0; +}; + +// This is a version for calling methods without parameters. +template +class wxAsyncMethodCallEvent0 : public wxAsyncMethodCallEvent +{ +public: + typedef T ObjectType; + typedef void (ObjectType::*MethodType)(); + + wxAsyncMethodCallEvent0(ObjectType* object, + MethodType method) + : wxAsyncMethodCallEvent(object), + m_object(object), + m_method(method) + { + } + + wxAsyncMethodCallEvent0(const wxAsyncMethodCallEvent0& other) + : wxAsyncMethodCallEvent(other), + m_object(other.m_object), + m_method(other.m_method) + { + } + + virtual wxEvent *Clone() const + { + return new wxAsyncMethodCallEvent0(*this); + } + + virtual void Execute() + { + (m_object->*m_method)(); + } + +private: + ObjectType* const m_object; + const MethodType m_method; +}; + +// This is a version for calling methods with a single parameter. +template +class wxAsyncMethodCallEvent1 : public wxAsyncMethodCallEvent +{ +public: + typedef T ObjectType; + typedef void (ObjectType::*MethodType)(T1 x1); + typedef typename wxRemoveRef::type ParamType1; + + wxAsyncMethodCallEvent1(ObjectType* object, + MethodType method, + const ParamType1& x1) + : wxAsyncMethodCallEvent(object), + m_object(object), + m_method(method), + m_param1(x1) + { + } + + wxAsyncMethodCallEvent1(const wxAsyncMethodCallEvent1& other) + : wxAsyncMethodCallEvent(other), + m_object(other.m_object), + m_method(other.m_method), + m_param1(other.m_param1) + { + } + + virtual wxEvent *Clone() const + { + return new wxAsyncMethodCallEvent1(*this); + } + + virtual void Execute() + { + (m_object->*m_method)(m_param1); + } + +private: + ObjectType* const m_object; + const MethodType m_method; + const ParamType1 m_param1; +}; + +// This is a version for calling methods with two parameters. +template +class wxAsyncMethodCallEvent2 : public wxAsyncMethodCallEvent +{ +public: + typedef T ObjectType; + typedef void (ObjectType::*MethodType)(T1 x1, T2 x2); + typedef typename wxRemoveRef::type ParamType1; + typedef typename wxRemoveRef::type ParamType2; + + wxAsyncMethodCallEvent2(ObjectType* object, + MethodType method, + const ParamType1& x1, + const ParamType2& x2) + : wxAsyncMethodCallEvent(object), + m_object(object), + m_method(method), + m_param1(x1), + m_param2(x2) + { + } + + wxAsyncMethodCallEvent2(const wxAsyncMethodCallEvent2& other) + : wxAsyncMethodCallEvent(other), + m_object(other.m_object), + m_method(other.m_method), + m_param1(other.m_param1), + m_param2(other.m_param2) + { + } + + virtual wxEvent *Clone() const + { + return new wxAsyncMethodCallEvent2(*this); + } + + virtual void Execute() + { + (m_object->*m_method)(m_param1, m_param2); + } + +private: + ObjectType* const m_object; + const MethodType m_method; + const ParamType1 m_param1; + const ParamType2 m_param2; +}; + +// This is a version for calling any functors +template +class wxAsyncMethodCallEventFunctor : public wxAsyncMethodCallEvent +{ +public: + typedef T FunctorType; + + wxAsyncMethodCallEventFunctor(wxObject *object, const FunctorType& fn) + : wxAsyncMethodCallEvent(object), + m_fn(fn) + { + } + + wxAsyncMethodCallEventFunctor(const wxAsyncMethodCallEventFunctor& other) + : wxAsyncMethodCallEvent(other), + m_fn(other.m_fn) + { + } + + virtual wxEvent *Clone() const + { + return new wxAsyncMethodCallEventFunctor(*this); + } + + virtual void Execute() + { + m_fn(); + } + +private: + FunctorType m_fn; +}; + +#endif // wxHAS_CALL_AFTER + + +#if wxUSE_GUI + + +// Item or menu event class +/* + wxEVT_BUTTON + wxEVT_CHECKBOX + wxEVT_CHOICE + wxEVT_LISTBOX + wxEVT_LISTBOX_DCLICK + wxEVT_TEXT + wxEVT_TEXT_ENTER + wxEVT_MENU + wxEVT_SLIDER + wxEVT_RADIOBOX + wxEVT_RADIOBUTTON + wxEVT_SCROLLBAR + wxEVT_VLBOX + wxEVT_COMBOBOX + wxEVT_TOGGLEBUTTON +*/ + +class WXDLLIMPEXP_CORE wxCommandEvent : public wxEvent, + public wxEventBasicPayloadMixin +{ +public: + wxCommandEvent(wxEventType commandType = wxEVT_NULL, int winid = 0); + + wxCommandEvent(const wxCommandEvent& event) + : wxEvent(event), + wxEventBasicPayloadMixin(event), + m_clientData(event.m_clientData), + m_clientObject(event.m_clientObject) + { + // Because GetString() can retrieve the string text only on demand, we + // need to copy it explicitly. + if ( m_cmdString.empty() ) + m_cmdString = event.GetString(); + } + + // Set/Get client data from controls + void SetClientData(void* clientData) { m_clientData = clientData; } + void *GetClientData() const { return m_clientData; } + + // Set/Get client object from controls + void SetClientObject(wxClientData* clientObject) { m_clientObject = clientObject; } + wxClientData *GetClientObject() const { return m_clientObject; } + + // Note: this shadows wxEventBasicPayloadMixin::GetString(), because it does some + // GUI-specific hacks + wxString GetString() const; + + // Get listbox selection if single-choice + int GetSelection() const { return m_commandInt; } + + // Get checkbox value + bool IsChecked() const { return m_commandInt != 0; } + + // true if the listbox event was a selection. + bool IsSelection() const { return (m_extraLong != 0); } + + virtual wxEvent *Clone() const { return new wxCommandEvent(*this); } + virtual wxEventCategory GetEventCategory() const { return wxEVT_CATEGORY_USER_INPUT; } + +protected: + void* m_clientData; // Arbitrary client data + wxClientData* m_clientObject; // Arbitrary client object + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCommandEvent) +}; + +// this class adds a possibility to react (from the user) code to a control +// notification: allow or veto the operation being reported. +class WXDLLIMPEXP_CORE wxNotifyEvent : public wxCommandEvent +{ +public: + wxNotifyEvent(wxEventType commandType = wxEVT_NULL, int winid = 0) + : wxCommandEvent(commandType, winid) + { m_bAllow = true; } + + wxNotifyEvent(const wxNotifyEvent& event) + : wxCommandEvent(event) + { m_bAllow = event.m_bAllow; } + + // veto the operation (usually it's allowed by default) + void Veto() { m_bAllow = false; } + + // allow the operation if it was disabled by default + void Allow() { m_bAllow = true; } + + // for implementation code only: is the operation allowed? + bool IsAllowed() const { return m_bAllow; } + + virtual wxEvent *Clone() const { return new wxNotifyEvent(*this); } + +private: + bool m_bAllow; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxNotifyEvent) +}; + + +// Scroll event class, derived form wxCommandEvent. wxScrollEvents are +// sent by wxSlider and wxScrollBar. +/* + wxEVT_SCROLL_TOP + wxEVT_SCROLL_BOTTOM + wxEVT_SCROLL_LINEUP + wxEVT_SCROLL_LINEDOWN + wxEVT_SCROLL_PAGEUP + wxEVT_SCROLL_PAGEDOWN + wxEVT_SCROLL_THUMBTRACK + wxEVT_SCROLL_THUMBRELEASE + wxEVT_SCROLL_CHANGED +*/ + +class WXDLLIMPEXP_CORE wxScrollEvent : public wxCommandEvent +{ +public: + wxScrollEvent(wxEventType commandType = wxEVT_NULL, + int winid = 0, int pos = 0, int orient = 0); + + int GetOrientation() const { return (int) m_extraLong; } + int GetPosition() const { return m_commandInt; } + void SetOrientation(int orient) { m_extraLong = (long) orient; } + void SetPosition(int pos) { m_commandInt = pos; } + + virtual wxEvent *Clone() const { return new wxScrollEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxScrollEvent) +}; + +// ScrollWin event class, derived fom wxEvent. wxScrollWinEvents +// are sent by wxWindow. +/* + wxEVT_SCROLLWIN_TOP + wxEVT_SCROLLWIN_BOTTOM + wxEVT_SCROLLWIN_LINEUP + wxEVT_SCROLLWIN_LINEDOWN + wxEVT_SCROLLWIN_PAGEUP + wxEVT_SCROLLWIN_PAGEDOWN + wxEVT_SCROLLWIN_THUMBTRACK + wxEVT_SCROLLWIN_THUMBRELEASE +*/ + +class WXDLLIMPEXP_CORE wxScrollWinEvent : public wxEvent +{ +public: + wxScrollWinEvent(wxEventType commandType = wxEVT_NULL, + int pos = 0, int orient = 0); + wxScrollWinEvent(const wxScrollWinEvent& event) : wxEvent(event) + { m_commandInt = event.m_commandInt; + m_extraLong = event.m_extraLong; } + + int GetOrientation() const { return (int) m_extraLong; } + int GetPosition() const { return m_commandInt; } + void SetOrientation(int orient) { m_extraLong = (long) orient; } + void SetPosition(int pos) { m_commandInt = pos; } + + virtual wxEvent *Clone() const { return new wxScrollWinEvent(*this); } + +protected: + int m_commandInt; + long m_extraLong; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxScrollWinEvent) +}; + + + +// Mouse event class + +/* + wxEVT_LEFT_DOWN + wxEVT_LEFT_UP + wxEVT_MIDDLE_DOWN + wxEVT_MIDDLE_UP + wxEVT_RIGHT_DOWN + wxEVT_RIGHT_UP + wxEVT_MOTION + wxEVT_ENTER_WINDOW + wxEVT_LEAVE_WINDOW + wxEVT_LEFT_DCLICK + wxEVT_MIDDLE_DCLICK + wxEVT_RIGHT_DCLICK +*/ + +enum wxMouseWheelAxis +{ + wxMOUSE_WHEEL_VERTICAL, + wxMOUSE_WHEEL_HORIZONTAL +}; + +class WXDLLIMPEXP_CORE wxMouseEvent : public wxEvent, + public wxMouseState +{ +public: + wxMouseEvent(wxEventType mouseType = wxEVT_NULL); + wxMouseEvent(const wxMouseEvent& event) + : wxEvent(event), + wxMouseState(event) + { + Assign(event); + } + + // Was it a button event? (*doesn't* mean: is any button *down*?) + bool IsButton() const { return Button(wxMOUSE_BTN_ANY); } + + // Was it a down event from this (or any) button? + bool ButtonDown(int but = wxMOUSE_BTN_ANY) const; + + // Was it a dclick event from this (or any) button? + bool ButtonDClick(int but = wxMOUSE_BTN_ANY) const; + + // Was it a up event from this (or any) button? + bool ButtonUp(int but = wxMOUSE_BTN_ANY) const; + + // Was this event generated by the given button? + bool Button(int but) const; + + // Get the button which is changing state (wxMOUSE_BTN_NONE if none) + int GetButton() const; + + // Find which event was just generated + bool LeftDown() const { return (m_eventType == wxEVT_LEFT_DOWN); } + bool MiddleDown() const { return (m_eventType == wxEVT_MIDDLE_DOWN); } + bool RightDown() const { return (m_eventType == wxEVT_RIGHT_DOWN); } + bool Aux1Down() const { return (m_eventType == wxEVT_AUX1_DOWN); } + bool Aux2Down() const { return (m_eventType == wxEVT_AUX2_DOWN); } + + bool LeftUp() const { return (m_eventType == wxEVT_LEFT_UP); } + bool MiddleUp() const { return (m_eventType == wxEVT_MIDDLE_UP); } + bool RightUp() const { return (m_eventType == wxEVT_RIGHT_UP); } + bool Aux1Up() const { return (m_eventType == wxEVT_AUX1_UP); } + bool Aux2Up() const { return (m_eventType == wxEVT_AUX2_UP); } + + bool LeftDClick() const { return (m_eventType == wxEVT_LEFT_DCLICK); } + bool MiddleDClick() const { return (m_eventType == wxEVT_MIDDLE_DCLICK); } + bool RightDClick() const { return (m_eventType == wxEVT_RIGHT_DCLICK); } + bool Aux1DClick() const { return (m_eventType == wxEVT_AUX1_DCLICK); } + bool Aux2DClick() const { return (m_eventType == wxEVT_AUX2_DCLICK); } + + // True if a button is down and the mouse is moving + bool Dragging() const + { + return (m_eventType == wxEVT_MOTION) && ButtonIsDown(wxMOUSE_BTN_ANY); + } + + // True if the mouse is moving, and no button is down + bool Moving() const + { + return (m_eventType == wxEVT_MOTION) && !ButtonIsDown(wxMOUSE_BTN_ANY); + } + + // True if the mouse is just entering the window + bool Entering() const { return (m_eventType == wxEVT_ENTER_WINDOW); } + + // True if the mouse is just leaving the window + bool Leaving() const { return (m_eventType == wxEVT_LEAVE_WINDOW); } + + // Returns the number of mouse clicks associated with this event. + int GetClickCount() const { return m_clickCount; } + + // Find the logical position of the event given the DC + wxPoint GetLogicalPosition(const wxDC& dc) const; + + // Get wheel rotation, positive or negative indicates direction of + // rotation. Current devices all send an event when rotation is equal to + // +/-WheelDelta, but this allows for finer resolution devices to be + // created in the future. Because of this you shouldn't assume that one + // event is equal to 1 line or whatever, but you should be able to either + // do partial line scrolling or wait until +/-WheelDelta rotation values + // have been accumulated before scrolling. + int GetWheelRotation() const { return m_wheelRotation; } + + // Get wheel delta, normally 120. This is the threshold for action to be + // taken, and one such action (for example, scrolling one increment) + // should occur for each delta. + int GetWheelDelta() const { return m_wheelDelta; } + + // Gets the axis the wheel operation concerns; wxMOUSE_WHEEL_VERTICAL + // (most common case) or wxMOUSE_WHEEL_HORIZONTAL (for horizontal scrolling + // using e.g. a trackpad). + wxMouseWheelAxis GetWheelAxis() const { return m_wheelAxis; } + + // Returns the configured number of lines (or whatever) to be scrolled per + // wheel action. Defaults to three. + int GetLinesPerAction() const { return m_linesPerAction; } + + // Returns the configured number of columns (or whatever) to be scrolled per + // wheel action. Defaults to three. + int GetColumnsPerAction() const { return m_columnsPerAction; } + + // Is the system set to do page scrolling? + bool IsPageScroll() const { return ((unsigned int)m_linesPerAction == UINT_MAX); } + + virtual wxEvent *Clone() const { return new wxMouseEvent(*this); } + virtual wxEventCategory GetEventCategory() const { return wxEVT_CATEGORY_USER_INPUT; } + + wxMouseEvent& operator=(const wxMouseEvent& event) + { + if (&event != this) + Assign(event); + return *this; + } + +public: + int m_clickCount; + + wxMouseWheelAxis m_wheelAxis; + int m_wheelRotation; + int m_wheelDelta; + int m_linesPerAction; + int m_columnsPerAction; + +protected: + void Assign(const wxMouseEvent& evt); + +private: + DECLARE_DYNAMIC_CLASS(wxMouseEvent) +}; + +// Cursor set event + +/* + wxEVT_SET_CURSOR + */ + +class WXDLLIMPEXP_CORE wxSetCursorEvent : public wxEvent +{ +public: + wxSetCursorEvent(wxCoord x = 0, wxCoord y = 0) + : wxEvent(0, wxEVT_SET_CURSOR), + m_x(x), m_y(y), m_cursor() + { } + + wxSetCursorEvent(const wxSetCursorEvent& event) + : wxEvent(event), + m_x(event.m_x), + m_y(event.m_y), + m_cursor(event.m_cursor) + { } + + wxCoord GetX() const { return m_x; } + wxCoord GetY() const { return m_y; } + + void SetCursor(const wxCursor& cursor) { m_cursor = cursor; } + const wxCursor& GetCursor() const { return m_cursor; } + bool HasCursor() const { return m_cursor.IsOk(); } + + virtual wxEvent *Clone() const { return new wxSetCursorEvent(*this); } + +private: + wxCoord m_x, m_y; + wxCursor m_cursor; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSetCursorEvent) +}; + +// Keyboard input event class + +/* + wxEVT_CHAR + wxEVT_CHAR_HOOK + wxEVT_KEY_DOWN + wxEVT_KEY_UP + wxEVT_HOTKEY + */ + +// key categories: the bit flags for IsKeyInCategory() function +// +// the enum values used may change in future version of wx +// use the named constants only, or bitwise combinations thereof +enum wxKeyCategoryFlags +{ + // arrow keys, on and off numeric keypads + WXK_CATEGORY_ARROW = 1, + + // page up and page down keys, on and off numeric keypads + WXK_CATEGORY_PAGING = 2, + + // home and end keys, on and off numeric keypads + WXK_CATEGORY_JUMP = 4, + + // tab key, on and off numeric keypads + WXK_CATEGORY_TAB = 8, + + // backspace and delete keys, on and off numeric keypads + WXK_CATEGORY_CUT = 16, + + // all keys usually used for navigation + WXK_CATEGORY_NAVIGATION = WXK_CATEGORY_ARROW | + WXK_CATEGORY_PAGING | + WXK_CATEGORY_JUMP +}; + +class WXDLLIMPEXP_CORE wxKeyEvent : public wxEvent, + public wxKeyboardState +{ +public: + wxKeyEvent(wxEventType keyType = wxEVT_NULL); + + // Normal copy ctor and a ctor creating a new event for the same key as the + // given one but a different event type (this is used in implementation + // code only, do not use outside of the library). + wxKeyEvent(const wxKeyEvent& evt); + wxKeyEvent(wxEventType eventType, const wxKeyEvent& evt); + + // get the key code: an ASCII7 char or an element of wxKeyCode enum + int GetKeyCode() const { return (int)m_keyCode; } + + // returns true iff this event's key code is of a certain type + bool IsKeyInCategory(int category) const; + +#if wxUSE_UNICODE + // get the Unicode character corresponding to this key + wxChar GetUnicodeKey() const { return m_uniChar; } +#endif // wxUSE_UNICODE + + // get the raw key code (platform-dependent) + wxUint32 GetRawKeyCode() const { return m_rawCode; } + + // get the raw key flags (platform-dependent) + wxUint32 GetRawKeyFlags() const { return m_rawFlags; } + + // Find the position of the event + void GetPosition(wxCoord *xpos, wxCoord *ypos) const + { + if (xpos) + *xpos = GetX(); + if (ypos) + *ypos = GetY(); + } + + // This version if provided only for backwards compatiblity, don't use. + void GetPosition(long *xpos, long *ypos) const + { + if (xpos) + *xpos = GetX(); + if (ypos) + *ypos = GetY(); + } + + wxPoint GetPosition() const + { return wxPoint(GetX(), GetY()); } + + // Get X position + wxCoord GetX() const; + + // Get Y position + wxCoord GetY() const; + + // Can be called from wxEVT_CHAR_HOOK handler to allow generation of normal + // key events even though the event had been handled (by default they would + // not be generated in this case). + void DoAllowNextEvent() { m_allowNext = true; } + + // Return the value of the "allow next" flag, for internal use only. + bool IsNextEventAllowed() const { return m_allowNext; } + + + virtual wxEvent *Clone() const { return new wxKeyEvent(*this); } + virtual wxEventCategory GetEventCategory() const { return wxEVT_CATEGORY_USER_INPUT; } + + // we do need to copy wxKeyEvent sometimes (in wxTreeCtrl code, for + // example) + wxKeyEvent& operator=(const wxKeyEvent& evt) + { + if ( &evt != this ) + { + wxEvent::operator=(evt); + + // Borland C++ 5.82 doesn't compile an explicit call to an + // implicitly defined operator=() so need to do it this way: + *static_cast(this) = evt; + + DoAssignMembers(evt); + } + return *this; + } + +public: + // Do not use these fields directly, they are initialized on demand, so + // call GetX() and GetY() or GetPosition() instead. + wxCoord m_x, m_y; + + long m_keyCode; + +#if wxUSE_UNICODE + // This contains the full Unicode character + // in a character events in Unicode mode + wxChar m_uniChar; +#endif + + // these fields contain the platform-specific information about + // key that was pressed + wxUint32 m_rawCode; + wxUint32 m_rawFlags; + +private: + // Set the event to propagate if necessary, i.e. if it's of wxEVT_CHAR_HOOK + // type. This is used by all ctors. + void InitPropagation() + { + if ( m_eventType == wxEVT_CHAR_HOOK ) + m_propagationLevel = wxEVENT_PROPAGATE_MAX; + + m_allowNext = false; + } + + // Copy only the event data present in this class, this is used by + // AssignKeyData() and copy ctor. + void DoAssignMembers(const wxKeyEvent& evt) + { + m_x = evt.m_x; + m_y = evt.m_y; + m_hasPosition = evt.m_hasPosition; + + m_keyCode = evt.m_keyCode; + + m_rawCode = evt.m_rawCode; + m_rawFlags = evt.m_rawFlags; +#if wxUSE_UNICODE + m_uniChar = evt.m_uniChar; +#endif + } + + // Initialize m_x and m_y using the current mouse cursor position if + // necessary. + void InitPositionIfNecessary() const; + + // If this flag is true, the normal key events should still be generated + // even if wxEVT_CHAR_HOOK had been handled. By default it is false as + // handling wxEVT_CHAR_HOOK suppresses all the subsequent events. + bool m_allowNext; + + // If true, m_x and m_y were already initialized. If false, try to get them + // when they're requested. + bool m_hasPosition; + + DECLARE_DYNAMIC_CLASS(wxKeyEvent) +}; + +// Size event class +/* + wxEVT_SIZE + */ + +class WXDLLIMPEXP_CORE wxSizeEvent : public wxEvent +{ +public: + wxSizeEvent() : wxEvent(0, wxEVT_SIZE) + { } + wxSizeEvent(const wxSize& sz, int winid = 0) + : wxEvent(winid, wxEVT_SIZE), + m_size(sz) + { } + wxSizeEvent(const wxSizeEvent& event) + : wxEvent(event), + m_size(event.m_size), m_rect(event.m_rect) + { } + wxSizeEvent(const wxRect& rect, int id = 0) + : m_size(rect.GetSize()), m_rect(rect) + { m_eventType = wxEVT_SIZING; m_id = id; } + + wxSize GetSize() const { return m_size; } + void SetSize(wxSize size) { m_size = size; } + wxRect GetRect() const { return m_rect; } + void SetRect(const wxRect& rect) { m_rect = rect; } + + virtual wxEvent *Clone() const { return new wxSizeEvent(*this); } + +public: + // For internal usage only. Will be converted to protected members. + wxSize m_size; + wxRect m_rect; // Used for wxEVT_SIZING + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSizeEvent) +}; + +// Move event class + +/* + wxEVT_MOVE + */ + +class WXDLLIMPEXP_CORE wxMoveEvent : public wxEvent +{ +public: + wxMoveEvent() + : wxEvent(0, wxEVT_MOVE) + { } + wxMoveEvent(const wxPoint& pos, int winid = 0) + : wxEvent(winid, wxEVT_MOVE), + m_pos(pos) + { } + wxMoveEvent(const wxMoveEvent& event) + : wxEvent(event), + m_pos(event.m_pos) + { } + wxMoveEvent(const wxRect& rect, int id = 0) + : m_pos(rect.GetPosition()), m_rect(rect) + { m_eventType = wxEVT_MOVING; m_id = id; } + + wxPoint GetPosition() const { return m_pos; } + void SetPosition(const wxPoint& pos) { m_pos = pos; } + wxRect GetRect() const { return m_rect; } + void SetRect(const wxRect& rect) { m_rect = rect; } + + virtual wxEvent *Clone() const { return new wxMoveEvent(*this); } + +protected: + wxPoint m_pos; + wxRect m_rect; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMoveEvent) +}; + +// Paint event class +/* + wxEVT_PAINT + wxEVT_NC_PAINT + */ + +#if wxDEBUG_LEVEL && (defined(__WXMSW__) || defined(__WXPM__)) + #define wxHAS_PAINT_DEBUG + + // see comments in src/msw|os2/dcclient.cpp where g_isPainting is defined + extern WXDLLIMPEXP_CORE int g_isPainting; +#endif // debug + +class WXDLLIMPEXP_CORE wxPaintEvent : public wxEvent +{ +public: + wxPaintEvent(int Id = 0) + : wxEvent(Id, wxEVT_PAINT) + { +#ifdef wxHAS_PAINT_DEBUG + // set the internal flag for the duration of redrawing + g_isPainting++; +#endif // debug + } + + // default copy ctor and dtor are normally fine, we only need them to keep + // g_isPainting updated in debug build +#ifdef wxHAS_PAINT_DEBUG + wxPaintEvent(const wxPaintEvent& event) + : wxEvent(event) + { + g_isPainting++; + } + + virtual ~wxPaintEvent() + { + g_isPainting--; + } +#endif // debug + + virtual wxEvent *Clone() const { return new wxPaintEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxPaintEvent) +}; + +class WXDLLIMPEXP_CORE wxNcPaintEvent : public wxEvent +{ +public: + wxNcPaintEvent(int winid = 0) + : wxEvent(winid, wxEVT_NC_PAINT) + { } + + virtual wxEvent *Clone() const { return new wxNcPaintEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxNcPaintEvent) +}; + +// Erase background event class +/* + wxEVT_ERASE_BACKGROUND + */ + +class WXDLLIMPEXP_CORE wxEraseEvent : public wxEvent +{ +public: + wxEraseEvent(int Id = 0, wxDC *dc = NULL) + : wxEvent(Id, wxEVT_ERASE_BACKGROUND), + m_dc(dc) + { } + + wxEraseEvent(const wxEraseEvent& event) + : wxEvent(event), + m_dc(event.m_dc) + { } + + wxDC *GetDC() const { return m_dc; } + + virtual wxEvent *Clone() const { return new wxEraseEvent(*this); } + +protected: + wxDC *m_dc; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxEraseEvent) +}; + +// Focus event class +/* + wxEVT_SET_FOCUS + wxEVT_KILL_FOCUS + */ + +class WXDLLIMPEXP_CORE wxFocusEvent : public wxEvent +{ +public: + wxFocusEvent(wxEventType type = wxEVT_NULL, int winid = 0) + : wxEvent(winid, type) + { m_win = NULL; } + + wxFocusEvent(const wxFocusEvent& event) + : wxEvent(event) + { m_win = event.m_win; } + + // The window associated with this event is the window which had focus + // before for SET event and the window which will have focus for the KILL + // one. NB: it may be NULL in both cases! + wxWindow *GetWindow() const { return m_win; } + void SetWindow(wxWindow *win) { m_win = win; } + + virtual wxEvent *Clone() const { return new wxFocusEvent(*this); } + +private: + wxWindow *m_win; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxFocusEvent) +}; + +// wxChildFocusEvent notifies the parent that a child has got the focus: unlike +// wxFocusEvent it is propagated upwards the window chain +class WXDLLIMPEXP_CORE wxChildFocusEvent : public wxCommandEvent +{ +public: + wxChildFocusEvent(wxWindow *win = NULL); + + wxWindow *GetWindow() const { return (wxWindow *)GetEventObject(); } + + virtual wxEvent *Clone() const { return new wxChildFocusEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxChildFocusEvent) +}; + +// Activate event class +/* + wxEVT_ACTIVATE + wxEVT_ACTIVATE_APP + wxEVT_HIBERNATE + */ + +class WXDLLIMPEXP_CORE wxActivateEvent : public wxEvent +{ +public: + // Type of activation. For now we can only detect if it was by mouse or by + // some other method and even this is only available under wxMSW. + enum Reason + { + Reason_Mouse, + Reason_Unknown + }; + + wxActivateEvent(wxEventType type = wxEVT_NULL, bool active = true, + int Id = 0, Reason activationReason = Reason_Unknown) + : wxEvent(Id, type), + m_activationReason(activationReason) + { + m_active = active; + } + wxActivateEvent(const wxActivateEvent& event) + : wxEvent(event) + { + m_active = event.m_active; + m_activationReason = event.m_activationReason; + } + + bool GetActive() const { return m_active; } + Reason GetActivationReason() const { return m_activationReason;} + + virtual wxEvent *Clone() const { return new wxActivateEvent(*this); } + +private: + bool m_active; + Reason m_activationReason; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxActivateEvent) +}; + +// InitDialog event class +/* + wxEVT_INIT_DIALOG + */ + +class WXDLLIMPEXP_CORE wxInitDialogEvent : public wxEvent +{ +public: + wxInitDialogEvent(int Id = 0) + : wxEvent(Id, wxEVT_INIT_DIALOG) + { } + + virtual wxEvent *Clone() const { return new wxInitDialogEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxInitDialogEvent) +}; + +// Miscellaneous menu event class +/* + wxEVT_MENU_OPEN, + wxEVT_MENU_CLOSE, + wxEVT_MENU_HIGHLIGHT, +*/ + +class WXDLLIMPEXP_CORE wxMenuEvent : public wxEvent +{ +public: + wxMenuEvent(wxEventType type = wxEVT_NULL, int winid = 0, wxMenu* menu = NULL) + : wxEvent(winid, type) + { m_menuId = winid; m_menu = menu; } + wxMenuEvent(const wxMenuEvent& event) + : wxEvent(event) + { m_menuId = event.m_menuId; m_menu = event.m_menu; } + + // only for wxEVT_MENU_HIGHLIGHT + int GetMenuId() const { return m_menuId; } + + // only for wxEVT_MENU_OPEN/CLOSE + bool IsPopup() const { return m_menuId == wxID_ANY; } + + // only for wxEVT_MENU_OPEN/CLOSE + wxMenu* GetMenu() const { return m_menu; } + + virtual wxEvent *Clone() const { return new wxMenuEvent(*this); } + +private: + int m_menuId; + wxMenu* m_menu; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMenuEvent) +}; + +// Window close or session close event class +/* + wxEVT_CLOSE_WINDOW, + wxEVT_END_SESSION, + wxEVT_QUERY_END_SESSION + */ + +class WXDLLIMPEXP_CORE wxCloseEvent : public wxEvent +{ +public: + wxCloseEvent(wxEventType type = wxEVT_NULL, int winid = 0) + : wxEvent(winid, type), + m_loggingOff(true), + m_veto(false), // should be false by default + m_canVeto(true) {} + + wxCloseEvent(const wxCloseEvent& event) + : wxEvent(event), + m_loggingOff(event.m_loggingOff), + m_veto(event.m_veto), + m_canVeto(event.m_canVeto) {} + + void SetLoggingOff(bool logOff) { m_loggingOff = logOff; } + bool GetLoggingOff() const + { + // m_loggingOff flag is only used by wxEVT_[QUERY_]END_SESSION, it + // doesn't make sense for wxEVT_CLOSE_WINDOW + wxASSERT_MSG( m_eventType != wxEVT_CLOSE_WINDOW, + wxT("this flag is for end session events only") ); + + return m_loggingOff; + } + + void Veto(bool veto = true) + { + // GetVeto() will return false anyhow... + wxCHECK_RET( m_canVeto, + wxT("call to Veto() ignored (can't veto this event)") ); + + m_veto = veto; + } + void SetCanVeto(bool canVeto) { m_canVeto = canVeto; } + bool CanVeto() const { return m_canVeto; } + bool GetVeto() const { return m_canVeto && m_veto; } + + virtual wxEvent *Clone() const { return new wxCloseEvent(*this); } + +protected: + bool m_loggingOff, + m_veto, + m_canVeto; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCloseEvent) +}; + +/* + wxEVT_SHOW + */ + +class WXDLLIMPEXP_CORE wxShowEvent : public wxEvent +{ +public: + wxShowEvent(int winid = 0, bool show = false) + : wxEvent(winid, wxEVT_SHOW) + { m_show = show; } + wxShowEvent(const wxShowEvent& event) + : wxEvent(event) + { m_show = event.m_show; } + + void SetShow(bool show) { m_show = show; } + + // return true if the window was shown, false if hidden + bool IsShown() const { return m_show; } + +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED( bool GetShow() const { return IsShown(); } ) +#endif + + virtual wxEvent *Clone() const { return new wxShowEvent(*this); } + +protected: + bool m_show; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxShowEvent) +}; + +/* + wxEVT_ICONIZE + */ + +class WXDLLIMPEXP_CORE wxIconizeEvent : public wxEvent +{ +public: + wxIconizeEvent(int winid = 0, bool iconized = true) + : wxEvent(winid, wxEVT_ICONIZE) + { m_iconized = iconized; } + wxIconizeEvent(const wxIconizeEvent& event) + : wxEvent(event) + { m_iconized = event.m_iconized; } + +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED( bool Iconized() const { return IsIconized(); } ) +#endif + // return true if the frame was iconized, false if restored + bool IsIconized() const { return m_iconized; } + + virtual wxEvent *Clone() const { return new wxIconizeEvent(*this); } + +protected: + bool m_iconized; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxIconizeEvent) +}; +/* + wxEVT_MAXIMIZE + */ + +class WXDLLIMPEXP_CORE wxMaximizeEvent : public wxEvent +{ +public: + wxMaximizeEvent(int winid = 0) + : wxEvent(winid, wxEVT_MAXIMIZE) + { } + + virtual wxEvent *Clone() const { return new wxMaximizeEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMaximizeEvent) +}; + +// Joystick event class +/* + wxEVT_JOY_BUTTON_DOWN, + wxEVT_JOY_BUTTON_UP, + wxEVT_JOY_MOVE, + wxEVT_JOY_ZMOVE +*/ + +// Which joystick? Same as Windows ids so no conversion necessary. +enum +{ + wxJOYSTICK1, + wxJOYSTICK2 +}; + +// Which button is down? +enum +{ + wxJOY_BUTTON_ANY = -1, + wxJOY_BUTTON1 = 1, + wxJOY_BUTTON2 = 2, + wxJOY_BUTTON3 = 4, + wxJOY_BUTTON4 = 8 +}; + +class WXDLLIMPEXP_CORE wxJoystickEvent : public wxEvent +{ +protected: + wxPoint m_pos; + int m_zPosition; + int m_buttonChange; // Which button changed? + int m_buttonState; // Which buttons are down? + int m_joyStick; // Which joystick? + +public: + wxJoystickEvent(wxEventType type = wxEVT_NULL, + int state = 0, + int joystick = wxJOYSTICK1, + int change = 0) + : wxEvent(0, type), + m_pos(), + m_zPosition(0), + m_buttonChange(change), + m_buttonState(state), + m_joyStick(joystick) + { + } + wxJoystickEvent(const wxJoystickEvent& event) + : wxEvent(event), + m_pos(event.m_pos), + m_zPosition(event.m_zPosition), + m_buttonChange(event.m_buttonChange), + m_buttonState(event.m_buttonState), + m_joyStick(event.m_joyStick) + { } + + wxPoint GetPosition() const { return m_pos; } + int GetZPosition() const { return m_zPosition; } + int GetButtonState() const { return m_buttonState; } + int GetButtonChange() const { return m_buttonChange; } + int GetJoystick() const { return m_joyStick; } + + void SetJoystick(int stick) { m_joyStick = stick; } + void SetButtonState(int state) { m_buttonState = state; } + void SetButtonChange(int change) { m_buttonChange = change; } + void SetPosition(const wxPoint& pos) { m_pos = pos; } + void SetZPosition(int zPos) { m_zPosition = zPos; } + + // Was it a button event? (*doesn't* mean: is any button *down*?) + bool IsButton() const { return ((GetEventType() == wxEVT_JOY_BUTTON_DOWN) || + (GetEventType() == wxEVT_JOY_BUTTON_UP)); } + + // Was it a move event? + bool IsMove() const { return (GetEventType() == wxEVT_JOY_MOVE); } + + // Was it a zmove event? + bool IsZMove() const { return (GetEventType() == wxEVT_JOY_ZMOVE); } + + // Was it a down event from button 1, 2, 3, 4 or any? + bool ButtonDown(int but = wxJOY_BUTTON_ANY) const + { return ((GetEventType() == wxEVT_JOY_BUTTON_DOWN) && + ((but == wxJOY_BUTTON_ANY) || (but == m_buttonChange))); } + + // Was it a up event from button 1, 2, 3 or any? + bool ButtonUp(int but = wxJOY_BUTTON_ANY) const + { return ((GetEventType() == wxEVT_JOY_BUTTON_UP) && + ((but == wxJOY_BUTTON_ANY) || (but == m_buttonChange))); } + + // Was the given button 1,2,3,4 or any in Down state? + bool ButtonIsDown(int but = wxJOY_BUTTON_ANY) const + { return (((but == wxJOY_BUTTON_ANY) && (m_buttonState != 0)) || + ((m_buttonState & but) == but)); } + + virtual wxEvent *Clone() const { return new wxJoystickEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxJoystickEvent) +}; + +// Drop files event class +/* + wxEVT_DROP_FILES + */ + +class WXDLLIMPEXP_CORE wxDropFilesEvent : public wxEvent +{ +public: + int m_noFiles; + wxPoint m_pos; + wxString* m_files; + + wxDropFilesEvent(wxEventType type = wxEVT_NULL, + int noFiles = 0, + wxString *files = NULL) + : wxEvent(0, type), + m_noFiles(noFiles), + m_pos(), + m_files(files) + { } + + // we need a copy ctor to avoid deleting m_files pointer twice + wxDropFilesEvent(const wxDropFilesEvent& other) + : wxEvent(other), + m_noFiles(other.m_noFiles), + m_pos(other.m_pos), + m_files(NULL) + { + m_files = new wxString[m_noFiles]; + for ( int n = 0; n < m_noFiles; n++ ) + { + m_files[n] = other.m_files[n]; + } + } + + virtual ~wxDropFilesEvent() + { + delete [] m_files; + } + + wxPoint GetPosition() const { return m_pos; } + int GetNumberOfFiles() const { return m_noFiles; } + wxString *GetFiles() const { return m_files; } + + virtual wxEvent *Clone() const { return new wxDropFilesEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDropFilesEvent) +}; + +// Update UI event +/* + wxEVT_UPDATE_UI + */ + +// Whether to always send update events to windows, or +// to only send update events to those with the +// wxWS_EX_PROCESS_UI_UPDATES style. + +enum wxUpdateUIMode +{ + // Send UI update events to all windows + wxUPDATE_UI_PROCESS_ALL, + + // Send UI update events to windows that have + // the wxWS_EX_PROCESS_UI_UPDATES flag specified + wxUPDATE_UI_PROCESS_SPECIFIED +}; + +class WXDLLIMPEXP_CORE wxUpdateUIEvent : public wxCommandEvent +{ +public: + wxUpdateUIEvent(wxWindowID commandId = 0) + : wxCommandEvent(wxEVT_UPDATE_UI, commandId) + { + m_checked = + m_enabled = + m_shown = + m_setEnabled = + m_setShown = + m_setText = + m_setChecked = false; + } + wxUpdateUIEvent(const wxUpdateUIEvent& event) + : wxCommandEvent(event), + m_checked(event.m_checked), + m_enabled(event.m_enabled), + m_shown(event.m_shown), + m_setEnabled(event.m_setEnabled), + m_setShown(event.m_setShown), + m_setText(event.m_setText), + m_setChecked(event.m_setChecked), + m_text(event.m_text) + { } + + bool GetChecked() const { return m_checked; } + bool GetEnabled() const { return m_enabled; } + bool GetShown() const { return m_shown; } + wxString GetText() const { return m_text; } + bool GetSetText() const { return m_setText; } + bool GetSetChecked() const { return m_setChecked; } + bool GetSetEnabled() const { return m_setEnabled; } + bool GetSetShown() const { return m_setShown; } + + void Check(bool check) { m_checked = check; m_setChecked = true; } + void Enable(bool enable) { m_enabled = enable; m_setEnabled = true; } + void Show(bool show) { m_shown = show; m_setShown = true; } + void SetText(const wxString& text) { m_text = text; m_setText = true; } + + // Sets the interval between updates in milliseconds. + // Set to -1 to disable updates, or to 0 to update as frequently as possible. + static void SetUpdateInterval(long updateInterval) { sm_updateInterval = updateInterval; } + + // Returns the current interval between updates in milliseconds + static long GetUpdateInterval() { return sm_updateInterval; } + + // Can we update this window? + static bool CanUpdate(wxWindowBase *win); + + // Reset the update time to provide a delay until the next + // time we should update + static void ResetUpdateTime(); + + // Specify how wxWidgets will send update events: to + // all windows, or only to those which specify that they + // will process the events. + static void SetMode(wxUpdateUIMode mode) { sm_updateMode = mode; } + + // Returns the UI update mode + static wxUpdateUIMode GetMode() { return sm_updateMode; } + + virtual wxEvent *Clone() const { return new wxUpdateUIEvent(*this); } + +protected: + bool m_checked; + bool m_enabled; + bool m_shown; + bool m_setEnabled; + bool m_setShown; + bool m_setText; + bool m_setChecked; + wxString m_text; +#if wxUSE_LONGLONG + static wxLongLong sm_lastUpdate; +#endif + static long sm_updateInterval; + static wxUpdateUIMode sm_updateMode; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxUpdateUIEvent) +}; + +/* + wxEVT_SYS_COLOUR_CHANGED + */ + +// TODO: shouldn't all events record the window ID? +class WXDLLIMPEXP_CORE wxSysColourChangedEvent : public wxEvent +{ +public: + wxSysColourChangedEvent() + : wxEvent(0, wxEVT_SYS_COLOUR_CHANGED) + { } + + virtual wxEvent *Clone() const { return new wxSysColourChangedEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSysColourChangedEvent) +}; + +/* + wxEVT_MOUSE_CAPTURE_CHANGED + The window losing the capture receives this message + (even if it released the capture itself). + */ + +class WXDLLIMPEXP_CORE wxMouseCaptureChangedEvent : public wxEvent +{ +public: + wxMouseCaptureChangedEvent(wxWindowID winid = 0, wxWindow* gainedCapture = NULL) + : wxEvent(winid, wxEVT_MOUSE_CAPTURE_CHANGED), + m_gainedCapture(gainedCapture) + { } + + wxMouseCaptureChangedEvent(const wxMouseCaptureChangedEvent& event) + : wxEvent(event), + m_gainedCapture(event.m_gainedCapture) + { } + + virtual wxEvent *Clone() const { return new wxMouseCaptureChangedEvent(*this); } + + wxWindow* GetCapturedWindow() const { return m_gainedCapture; } + +private: + wxWindow* m_gainedCapture; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMouseCaptureChangedEvent) +}; + +/* + wxEVT_MOUSE_CAPTURE_LOST + The window losing the capture receives this message, unless it released it + it itself or unless wxWindow::CaptureMouse was called on another window + (and so capture will be restored when the new capturer releases it). + */ + +class WXDLLIMPEXP_CORE wxMouseCaptureLostEvent : public wxEvent +{ +public: + wxMouseCaptureLostEvent(wxWindowID winid = 0) + : wxEvent(winid, wxEVT_MOUSE_CAPTURE_LOST) + {} + + wxMouseCaptureLostEvent(const wxMouseCaptureLostEvent& event) + : wxEvent(event) + {} + + virtual wxEvent *Clone() const { return new wxMouseCaptureLostEvent(*this); } + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMouseCaptureLostEvent) +}; + +/* + wxEVT_DISPLAY_CHANGED + */ +class WXDLLIMPEXP_CORE wxDisplayChangedEvent : public wxEvent +{ +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDisplayChangedEvent) + +public: + wxDisplayChangedEvent() + : wxEvent(0, wxEVT_DISPLAY_CHANGED) + { } + + virtual wxEvent *Clone() const { return new wxDisplayChangedEvent(*this); } +}; + +/* + wxEVT_PALETTE_CHANGED + */ + +class WXDLLIMPEXP_CORE wxPaletteChangedEvent : public wxEvent +{ +public: + wxPaletteChangedEvent(wxWindowID winid = 0) + : wxEvent(winid, wxEVT_PALETTE_CHANGED), + m_changedWindow(NULL) + { } + + wxPaletteChangedEvent(const wxPaletteChangedEvent& event) + : wxEvent(event), + m_changedWindow(event.m_changedWindow) + { } + + void SetChangedWindow(wxWindow* win) { m_changedWindow = win; } + wxWindow* GetChangedWindow() const { return m_changedWindow; } + + virtual wxEvent *Clone() const { return new wxPaletteChangedEvent(*this); } + +protected: + wxWindow* m_changedWindow; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxPaletteChangedEvent) +}; + +/* + wxEVT_QUERY_NEW_PALETTE + Indicates the window is getting keyboard focus and should re-do its palette. + */ + +class WXDLLIMPEXP_CORE wxQueryNewPaletteEvent : public wxEvent +{ +public: + wxQueryNewPaletteEvent(wxWindowID winid = 0) + : wxEvent(winid, wxEVT_QUERY_NEW_PALETTE), + m_paletteRealized(false) + { } + wxQueryNewPaletteEvent(const wxQueryNewPaletteEvent& event) + : wxEvent(event), + m_paletteRealized(event.m_paletteRealized) + { } + + // App sets this if it changes the palette. + void SetPaletteRealized(bool realized) { m_paletteRealized = realized; } + bool GetPaletteRealized() const { return m_paletteRealized; } + + virtual wxEvent *Clone() const { return new wxQueryNewPaletteEvent(*this); } + +protected: + bool m_paletteRealized; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxQueryNewPaletteEvent) +}; + +/* + Event generated by dialog navigation keys + wxEVT_NAVIGATION_KEY + */ +// NB: don't derive from command event to avoid being propagated to the parent +class WXDLLIMPEXP_CORE wxNavigationKeyEvent : public wxEvent +{ +public: + wxNavigationKeyEvent() + : wxEvent(0, wxEVT_NAVIGATION_KEY), + m_flags(IsForward | FromTab), // defaults are for TAB + m_focus(NULL) + { + m_propagationLevel = wxEVENT_PROPAGATE_NONE; + } + + wxNavigationKeyEvent(const wxNavigationKeyEvent& event) + : wxEvent(event), + m_flags(event.m_flags), + m_focus(event.m_focus) + { } + + // direction: forward (true) or backward (false) + bool GetDirection() const + { return (m_flags & IsForward) != 0; } + void SetDirection(bool bForward) + { if ( bForward ) m_flags |= IsForward; else m_flags &= ~IsForward; } + + // it may be a window change event (MDI, notebook pages...) or a control + // change event + bool IsWindowChange() const + { return (m_flags & WinChange) != 0; } + void SetWindowChange(bool bIs) + { if ( bIs ) m_flags |= WinChange; else m_flags &= ~WinChange; } + + // Set to true under MSW if the event was generated using the tab key. + // This is required for proper navogation over radio buttons + bool IsFromTab() const + { return (m_flags & FromTab) != 0; } + void SetFromTab(bool bIs) + { if ( bIs ) m_flags |= FromTab; else m_flags &= ~FromTab; } + + // the child which has the focus currently (may be NULL - use + // wxWindow::FindFocus then) + wxWindow* GetCurrentFocus() const { return m_focus; } + void SetCurrentFocus(wxWindow *win) { m_focus = win; } + + // Set flags + void SetFlags(long flags) { m_flags = flags; } + + virtual wxEvent *Clone() const { return new wxNavigationKeyEvent(*this); } + + enum wxNavigationKeyEventFlags + { + IsBackward = 0x0000, + IsForward = 0x0001, + WinChange = 0x0002, + FromTab = 0x0004 + }; + + long m_flags; + wxWindow *m_focus; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxNavigationKeyEvent) +}; + +// Window creation/destruction events: the first is sent as soon as window is +// created (i.e. the underlying GUI object exists), but when the C++ object is +// fully initialized (so virtual functions may be called). The second, +// wxEVT_DESTROY, is sent right before the window is destroyed - again, it's +// still safe to call virtual functions at this moment +/* + wxEVT_CREATE + wxEVT_DESTROY + */ + +class WXDLLIMPEXP_CORE wxWindowCreateEvent : public wxCommandEvent +{ +public: + wxWindowCreateEvent(wxWindow *win = NULL); + + wxWindow *GetWindow() const { return (wxWindow *)GetEventObject(); } + + virtual wxEvent *Clone() const { return new wxWindowCreateEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxWindowCreateEvent) +}; + +class WXDLLIMPEXP_CORE wxWindowDestroyEvent : public wxCommandEvent +{ +public: + wxWindowDestroyEvent(wxWindow *win = NULL); + + wxWindow *GetWindow() const { return (wxWindow *)GetEventObject(); } + + virtual wxEvent *Clone() const { return new wxWindowDestroyEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxWindowDestroyEvent) +}; + +// A help event is sent when the user clicks on a window in context-help mode. +/* + wxEVT_HELP + wxEVT_DETAILED_HELP +*/ + +class WXDLLIMPEXP_CORE wxHelpEvent : public wxCommandEvent +{ +public: + // how was this help event generated? + enum Origin + { + Origin_Unknown, // unrecognized event source + Origin_Keyboard, // event generated from F1 key press + Origin_HelpButton // event from [?] button on the title bar (Windows) + }; + + wxHelpEvent(wxEventType type = wxEVT_NULL, + wxWindowID winid = 0, + const wxPoint& pt = wxDefaultPosition, + Origin origin = Origin_Unknown) + : wxCommandEvent(type, winid), + m_pos(pt), + m_origin(GuessOrigin(origin)) + { } + wxHelpEvent(const wxHelpEvent& event) + : wxCommandEvent(event), + m_pos(event.m_pos), + m_target(event.m_target), + m_link(event.m_link), + m_origin(event.m_origin) + { } + + // Position of event (in screen coordinates) + const wxPoint& GetPosition() const { return m_pos; } + void SetPosition(const wxPoint& pos) { m_pos = pos; } + + // Optional link to further help + const wxString& GetLink() const { return m_link; } + void SetLink(const wxString& link) { m_link = link; } + + // Optional target to display help in. E.g. a window specification + const wxString& GetTarget() const { return m_target; } + void SetTarget(const wxString& target) { m_target = target; } + + virtual wxEvent *Clone() const { return new wxHelpEvent(*this); } + + // optional indication of the event source + Origin GetOrigin() const { return m_origin; } + void SetOrigin(Origin origin) { m_origin = origin; } + +protected: + wxPoint m_pos; + wxString m_target; + wxString m_link; + Origin m_origin; + + // we can try to guess the event origin ourselves, even if none is + // specified in the ctor + static Origin GuessOrigin(Origin origin); + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxHelpEvent) +}; + +// A Clipboard Text event is sent when a window intercepts text copy/cut/paste +// message, i.e. the user has cut/copied/pasted data from/into a text control +// via ctrl-C/X/V, ctrl/shift-del/insert, a popup menu command, etc. +// NOTE : under windows these events are *NOT* generated automatically +// for a Rich Edit text control. +/* +wxEVT_TEXT_COPY +wxEVT_TEXT_CUT +wxEVT_TEXT_PASTE +*/ + +class WXDLLIMPEXP_CORE wxClipboardTextEvent : public wxCommandEvent +{ +public: + wxClipboardTextEvent(wxEventType type = wxEVT_NULL, + wxWindowID winid = 0) + : wxCommandEvent(type, winid) + { } + wxClipboardTextEvent(const wxClipboardTextEvent& event) + : wxCommandEvent(event) + { } + + virtual wxEvent *Clone() const { return new wxClipboardTextEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxClipboardTextEvent) +}; + +// A Context event is sent when the user right clicks on a window or +// presses Shift-F10 +// NOTE : Under windows this is a repackaged WM_CONTETXMENU message +// Under other systems it may have to be generated from a right click event +/* + wxEVT_CONTEXT_MENU +*/ + +class WXDLLIMPEXP_CORE wxContextMenuEvent : public wxCommandEvent +{ +public: + wxContextMenuEvent(wxEventType type = wxEVT_NULL, + wxWindowID winid = 0, + const wxPoint& pt = wxDefaultPosition) + : wxCommandEvent(type, winid), + m_pos(pt) + { } + wxContextMenuEvent(const wxContextMenuEvent& event) + : wxCommandEvent(event), + m_pos(event.m_pos) + { } + + // Position of event (in screen coordinates) + const wxPoint& GetPosition() const { return m_pos; } + void SetPosition(const wxPoint& pos) { m_pos = pos; } + + virtual wxEvent *Clone() const { return new wxContextMenuEvent(*this); } + +protected: + wxPoint m_pos; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxContextMenuEvent) +}; + + +/* TODO + wxEVT_MOUSE_CAPTURE_CHANGED, + wxEVT_SETTING_CHANGED, // WM_WININICHANGE (NT) / WM_SETTINGCHANGE (Win95) +// wxEVT_FONT_CHANGED, // WM_FONTCHANGE: roll into wxEVT_SETTING_CHANGED, but remember to propagate + // wxEVT_FONT_CHANGED to all other windows (maybe). + wxEVT_DRAW_ITEM, // Leave these three as virtual functions in wxControl?? Platform-specific. + wxEVT_MEASURE_ITEM, + wxEVT_COMPARE_ITEM +*/ + +#endif // wxUSE_GUI + + +// ============================================================================ +// event handler and related classes +// ============================================================================ + + +// struct containing the members common to static and dynamic event tables +// entries +struct WXDLLIMPEXP_BASE wxEventTableEntryBase +{ + wxEventTableEntryBase(int winid, int idLast, + wxEventFunctor* fn, wxObject *data) + : m_id(winid), + m_lastId(idLast), + m_fn(fn), + m_callbackUserData(data) + { + wxASSERT_MSG( idLast == wxID_ANY || winid <= idLast, + "invalid IDs range: lower bound > upper bound" ); + } + + wxEventTableEntryBase( const wxEventTableEntryBase &entry ) + : m_id( entry.m_id ), + m_lastId( entry.m_lastId ), + m_fn( entry.m_fn ), + m_callbackUserData( entry.m_callbackUserData ) + { + // This is a 'hack' to ensure that only one instance tries to delete + // the functor pointer. It is safe as long as the only place where the + // copy constructor is being called is when the static event tables are + // being initialized (a temporary instance is created and then this + // constructor is called). + + const_cast( entry ).m_fn = NULL; + } + + ~wxEventTableEntryBase() + { + delete m_fn; + } + + // the range of ids for this entry: if m_lastId == wxID_ANY, the range + // consists only of m_id, otherwise it is m_id..m_lastId inclusive + int m_id, + m_lastId; + + // function/method/functor to call + wxEventFunctor* m_fn; + + // arbitrary user data associated with the callback + wxObject* m_callbackUserData; + +private: + wxDECLARE_NO_ASSIGN_CLASS(wxEventTableEntryBase); +}; + +// an entry from a static event table +struct WXDLLIMPEXP_BASE wxEventTableEntry : public wxEventTableEntryBase +{ + wxEventTableEntry(const int& evType, int winid, int idLast, + wxEventFunctor* fn, wxObject *data) + : wxEventTableEntryBase(winid, idLast, fn, data), + m_eventType(evType) + { } + + // the reference to event type: this allows us to not care about the + // (undefined) order in which the event table entries and the event types + // are initialized: initially the value of this reference might be + // invalid, but by the time it is used for the first time, all global + // objects will have been initialized (including the event type constants) + // and so it will have the correct value when it is needed + const int& m_eventType; + +private: + wxDECLARE_NO_ASSIGN_CLASS(wxEventTableEntry); +}; + +// an entry used in dynamic event table managed by wxEvtHandler::Connect() +struct WXDLLIMPEXP_BASE wxDynamicEventTableEntry : public wxEventTableEntryBase +{ + wxDynamicEventTableEntry(int evType, int winid, int idLast, + wxEventFunctor* fn, wxObject *data) + : wxEventTableEntryBase(winid, idLast, fn, data), + m_eventType(evType) + { } + + // not a reference here as we can't keep a reference to a temporary int + // created to wrap the constant value typically passed to Connect() - nor + // do we need it + int m_eventType; + +private: + wxDECLARE_NO_ASSIGN_CLASS(wxDynamicEventTableEntry); +}; + +// ---------------------------------------------------------------------------- +// wxEventTable: an array of event entries terminated with {0, 0, 0, 0, 0} +// ---------------------------------------------------------------------------- + +struct WXDLLIMPEXP_BASE wxEventTable +{ + const wxEventTable *baseTable; // base event table (next in chain) + const wxEventTableEntry *entries; // bottom of entry array +}; + +// ---------------------------------------------------------------------------- +// wxEventHashTable: a helper of wxEvtHandler to speed up wxEventTable lookups. +// ---------------------------------------------------------------------------- + +WX_DEFINE_ARRAY_PTR(const wxEventTableEntry*, wxEventTableEntryPointerArray); + +class WXDLLIMPEXP_BASE wxEventHashTable +{ +private: + // Internal data structs + struct EventTypeTable + { + wxEventType eventType; + wxEventTableEntryPointerArray eventEntryTable; + }; + typedef EventTypeTable* EventTypeTablePointer; + +public: + // Constructor, needs the event table it needs to hash later on. + // Note: hashing of the event table is not done in the constructor as it + // can be that the event table is not yet full initialize, the hash + // will gets initialized when handling the first event look-up request. + wxEventHashTable(const wxEventTable &table); + // Destructor. + ~wxEventHashTable(); + + // Handle the given event, in other words search the event table hash + // and call self->ProcessEvent() if a match was found. + bool HandleEvent(wxEvent& event, wxEvtHandler *self); + + // Clear table + void Clear(); + +#if wxUSE_MEMORY_TRACING + // Clear all tables: only used to work around problems in memory tracing + // code + static void ClearAll(); +#endif // wxUSE_MEMORY_TRACING + +protected: + // Init the hash table with the entries of the static event table. + void InitHashTable(); + // Helper function of InitHashTable() to insert 1 entry into the hash table. + void AddEntry(const wxEventTableEntry &entry); + // Allocate and init with null pointers the base hash table. + void AllocEventTypeTable(size_t size); + // Grow the hash table in size and transfer all items currently + // in the table to the correct location in the new table. + void GrowEventTypeTable(); + +protected: + const wxEventTable &m_table; + bool m_rebuildHash; + + size_t m_size; + EventTypeTablePointer *m_eventTypeTable; + + static wxEventHashTable* sm_first; + wxEventHashTable* m_previous; + wxEventHashTable* m_next; + + wxDECLARE_NO_COPY_CLASS(wxEventHashTable); +}; + +// ---------------------------------------------------------------------------- +// wxEvtHandler: the base class for all objects handling wxWidgets events +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxEvtHandler : public wxObject + , public wxTrackable +{ +public: + wxEvtHandler(); + virtual ~wxEvtHandler(); + + + // Event handler chain + // ------------------- + + wxEvtHandler *GetNextHandler() const { return m_nextHandler; } + wxEvtHandler *GetPreviousHandler() const { return m_previousHandler; } + virtual void SetNextHandler(wxEvtHandler *handler) { m_nextHandler = handler; } + virtual void SetPreviousHandler(wxEvtHandler *handler) { m_previousHandler = handler; } + + void SetEvtHandlerEnabled(bool enabled) { m_enabled = enabled; } + bool GetEvtHandlerEnabled() const { return m_enabled; } + + void Unlink(); + bool IsUnlinked() const; + + + // Global event filters + // -------------------- + + // Add an event filter whose FilterEvent() method will be called for each + // and every event processed by wxWidgets. The filters are called in LIFO + // order and wxApp is registered as an event filter by default. The pointer + // must remain valid until it's removed with RemoveFilter() and is not + // deleted by wxEvtHandler. + static void AddFilter(wxEventFilter* filter); + + // Remove a filter previously installed with AddFilter(). + static void RemoveFilter(wxEventFilter* filter); + + + // Event queuing and processing + // ---------------------------- + + // Process an event right now: this can only be called from the main + // thread, use QueueEvent() for scheduling the events for + // processing from other threads. + virtual bool ProcessEvent(wxEvent& event); + + // Process an event by calling ProcessEvent and handling any exceptions + // thrown by event handlers. It's mostly useful when processing wx events + // when called from C code (e.g. in GTK+ callback) when the exception + // wouldn't correctly propagate to wxEventLoop. + bool SafelyProcessEvent(wxEvent& event); + // NOTE: uses ProcessEvent() + + // This method tries to process the event in this event handler, including + // any preprocessing done by TryBefore() and all the handlers chained to + // it, but excluding the post-processing done in TryAfter(). + // + // It is meant to be called from ProcessEvent() only and is not virtual, + // additional event handlers can be hooked into the normal event processing + // logic using TryBefore() and TryAfter() hooks. + // + // You can also call it yourself to forward an event to another handler but + // without propagating it upwards if it's unhandled (this is usually + // unwanted when forwarding as the original handler would already do it if + // needed normally). + bool ProcessEventLocally(wxEvent& event); + + // Schedule the given event to be processed later. It takes ownership of + // the event pointer, i.e. it will be deleted later. This is safe to call + // from multiple threads although you still need to ensure that wxString + // fields of the event object are deep copies and not use the same string + // buffer as other wxString objects in this thread. + virtual void QueueEvent(wxEvent *event); + + // Add an event to be processed later: notice that this function is not + // safe to call from threads other than main, use QueueEvent() + virtual void AddPendingEvent(const wxEvent& event) + { + // notice that the thread-safety problem comes from the fact that + // Clone() doesn't make deep copies of wxString fields of wxEvent + // object and so the same wxString could be used from both threads when + // the event object is destroyed in this one -- QueueEvent() avoids + // this problem as the event pointer is not used any more in this + // thread at all after it is called. + QueueEvent(event.Clone()); + } + + void ProcessPendingEvents(); + // NOTE: uses ProcessEvent() + + void DeletePendingEvents(); + +#if wxUSE_THREADS + bool ProcessThreadEvent(const wxEvent& event); + // NOTE: uses AddPendingEvent(); call only from secondary threads +#endif + +#ifdef wxHAS_CALL_AFTER + // Asynchronous method calls: these methods schedule the given method + // pointer for a later call (during the next idle event loop iteration). + // + // Notice that the method is called on this object itself, so the object + // CallAfter() is called on must have the correct dynamic type. + // + // These method can be used from another thread. + + template + void CallAfter(void (T::*method)()) + { + QueueEvent( + new wxAsyncMethodCallEvent0(static_cast(this), method) + ); + } + + // Notice that we use P1 and not T1 for the parameter to allow passing + // parameters that are convertible to the type taken by the method + // instead of being exactly the same, to be closer to the usual method call + // semantics. + template + void CallAfter(void (T::*method)(T1 x1), P1 x1) + { + QueueEvent( + new wxAsyncMethodCallEvent1( + static_cast(this), method, x1) + ); + } + + template + void CallAfter(void (T::*method)(T1 x1, T2 x2), P1 x1, P2 x2) + { + QueueEvent( + new wxAsyncMethodCallEvent2( + static_cast(this), method, x1, x2) + ); + } + + template + void CallAfter(const T& fn) + { + QueueEvent(new wxAsyncMethodCallEventFunctor(this, fn)); + } +#endif // wxHAS_CALL_AFTER + + + // Connecting and disconnecting + // ---------------------------- + + // These functions are used for old, untyped, event handlers and don't + // check that the type of the function passed to them actually matches the + // type of the event. They also only allow connecting events to methods of + // wxEvtHandler-derived classes. + // + // The template Connect() methods below are safer and allow connecting + // events to arbitrary functions or functors -- but require compiler + // support for templates. + + // Dynamic association of a member function handler with the event handler, + // winid and event type + void Connect(int winid, + int lastId, + wxEventType eventType, + wxObjectEventFunction func, + wxObject *userData = NULL, + wxEvtHandler *eventSink = NULL) + { + DoBind(winid, lastId, eventType, + wxNewEventFunctor(eventType, func, eventSink), + userData); + } + + // Convenience function: take just one id + void Connect(int winid, + wxEventType eventType, + wxObjectEventFunction func, + wxObject *userData = NULL, + wxEvtHandler *eventSink = NULL) + { Connect(winid, wxID_ANY, eventType, func, userData, eventSink); } + + // Even more convenient: without id (same as using id of wxID_ANY) + void Connect(wxEventType eventType, + wxObjectEventFunction func, + wxObject *userData = NULL, + wxEvtHandler *eventSink = NULL) + { Connect(wxID_ANY, wxID_ANY, eventType, func, userData, eventSink); } + + bool Disconnect(int winid, + int lastId, + wxEventType eventType, + wxObjectEventFunction func = NULL, + wxObject *userData = NULL, + wxEvtHandler *eventSink = NULL) + { + return DoUnbind(winid, lastId, eventType, + wxMakeEventFunctor(eventType, func, eventSink), + userData ); + } + + bool Disconnect(int winid = wxID_ANY, + wxEventType eventType = wxEVT_NULL, + wxObjectEventFunction func = NULL, + wxObject *userData = NULL, + wxEvtHandler *eventSink = NULL) + { return Disconnect(winid, wxID_ANY, eventType, func, userData, eventSink); } + + bool Disconnect(wxEventType eventType, + wxObjectEventFunction func, + wxObject *userData = NULL, + wxEvtHandler *eventSink = NULL) + { return Disconnect(wxID_ANY, eventType, func, userData, eventSink); } + +#ifdef wxHAS_EVENT_BIND + // Bind functions to an event: + template + void Bind(const EventTag& eventType, + void (*function)(EventArg &), + int winid = wxID_ANY, + int lastId = wxID_ANY, + wxObject *userData = NULL) + { + DoBind(winid, lastId, eventType, + wxNewEventFunctor(eventType, function), + userData); + } + + + template + bool Unbind(const EventTag& eventType, + void (*function)(EventArg &), + int winid = wxID_ANY, + int lastId = wxID_ANY, + wxObject *userData = NULL) + { + return DoUnbind(winid, lastId, eventType, + wxMakeEventFunctor(eventType, function), + userData); + } + + // Bind functors to an event: + template + void Bind(const EventTag& eventType, + const Functor &functor, + int winid = wxID_ANY, + int lastId = wxID_ANY, + wxObject *userData = NULL) + { + DoBind(winid, lastId, eventType, + wxNewEventFunctor(eventType, functor), + userData); + } + + + template + bool Unbind(const EventTag& eventType, + const Functor &functor, + int winid = wxID_ANY, + int lastId = wxID_ANY, + wxObject *userData = NULL) + { + return DoUnbind(winid, lastId, eventType, + wxMakeEventFunctor(eventType, functor), + userData); + } + + + // Bind a method of a class (called on the specified handler which must + // be convertible to this class) object to an event: + + template + void Bind(const EventTag &eventType, + void (Class::*method)(EventArg &), + EventHandler *handler, + int winid = wxID_ANY, + int lastId = wxID_ANY, + wxObject *userData = NULL) + { + DoBind(winid, lastId, eventType, + wxNewEventFunctor(eventType, method, handler), + userData); + } + + template + bool Unbind(const EventTag &eventType, + void (Class::*method)(EventArg&), + EventHandler *handler, + int winid = wxID_ANY, + int lastId = wxID_ANY, + wxObject *userData = NULL ) + { + return DoUnbind(winid, lastId, eventType, + wxMakeEventFunctor(eventType, method, handler), + userData); + } +#endif // wxHAS_EVENT_BIND + + wxList* GetDynamicEventTable() const { return m_dynamicEvents ; } + + // User data can be associated with each wxEvtHandler + void SetClientObject( wxClientData *data ) { DoSetClientObject(data); } + wxClientData *GetClientObject() const { return DoGetClientObject(); } + + void SetClientData( void *data ) { DoSetClientData(data); } + void *GetClientData() const { return DoGetClientData(); } + + + // implementation from now on + // -------------------------- + + // check if the given event table entry matches this event by id (the check + // for the event type should be done by caller) and call the handler if it + // does + // + // return true if the event was processed, false otherwise (no match or the + // handler decided to skip the event) + static bool ProcessEventIfMatchesId(const wxEventTableEntryBase& tableEntry, + wxEvtHandler *handler, + wxEvent& event); + + virtual bool SearchEventTable(wxEventTable& table, wxEvent& event); + bool SearchDynamicEventTable( wxEvent& event ); + + // Avoid problems at exit by cleaning up static hash table gracefully + void ClearEventHashTable() { GetEventHashTable().Clear(); } + void OnSinkDestroyed( wxEvtHandler *sink ); + + +private: + void DoBind(int winid, + int lastId, + wxEventType eventType, + wxEventFunctor *func, + wxObject* userData = NULL); + + bool DoUnbind(int winid, + int lastId, + wxEventType eventType, + const wxEventFunctor& func, + wxObject *userData = NULL); + + static const wxEventTableEntry sm_eventTableEntries[]; + +protected: + // hooks for wxWindow used by ProcessEvent() + // ----------------------------------------- + + // this one is called before trying our own event table to allow plugging + // in the event handlers overriding the default logic, this is used by e.g. + // validators. + virtual bool TryBefore(wxEvent& event); + + // This one is not a hook but just a helper which looks up the handler in + // this object itself. + // + // It is called from ProcessEventLocally() and normally shouldn't be called + // directly as doing it would ignore any chained event handlers + bool TryHereOnly(wxEvent& event); + + // Another helper which simply calls pre-processing hook and then tries to + // handle the event at this handler level. + bool TryBeforeAndHere(wxEvent& event) + { + return TryBefore(event) || TryHereOnly(event); + } + + // this one is called after failing to find the event handle in our own + // table to give a chance to the other windows to process it + // + // base class implementation passes the event to wxTheApp + virtual bool TryAfter(wxEvent& event); + +#if WXWIN_COMPATIBILITY_2_8 + // deprecated method: override TryBefore() instead of this one + wxDEPRECATED_BUT_USED_INTERNALLY_INLINE( + virtual bool TryValidator(wxEvent& WXUNUSED(event)), return false; ) + + wxDEPRECATED_BUT_USED_INTERNALLY_INLINE( + virtual bool TryParent(wxEvent& event), return DoTryApp(event); ) +#endif // WXWIN_COMPATIBILITY_2_8 + + + static const wxEventTable sm_eventTable; + virtual const wxEventTable *GetEventTable() const; + + static wxEventHashTable sm_eventHashTable; + virtual wxEventHashTable& GetEventHashTable() const; + + wxEvtHandler* m_nextHandler; + wxEvtHandler* m_previousHandler; + wxList* m_dynamicEvents; + wxList* m_pendingEvents; + +#if wxUSE_THREADS + // critical section protecting m_pendingEvents + wxCriticalSection m_pendingEventsLock; +#endif // wxUSE_THREADS + + // Is event handler enabled? + bool m_enabled; + + + // The user data: either an object which will be deleted by the container + // when it's deleted or some raw pointer which we do nothing with - only + // one type of data can be used with the given window (i.e. you cannot set + // the void data and then associate the container with wxClientData or vice + // versa) + union + { + wxClientData *m_clientObject; + void *m_clientData; + }; + + // what kind of data do we have? + wxClientDataType m_clientDataType; + + // client data accessors + virtual void DoSetClientObject( wxClientData *data ); + virtual wxClientData *DoGetClientObject() const; + + virtual void DoSetClientData( void *data ); + virtual void *DoGetClientData() const; + + // Search tracker objects for event connection with this sink + wxEventConnectionRef *FindRefInTrackerList(wxEvtHandler *handler); + +private: + // pass the event to wxTheApp instance, called from TryAfter() + bool DoTryApp(wxEvent& event); + + // try to process events in all handlers chained to this one + bool DoTryChain(wxEvent& event); + + // Head of the event filter linked list. + static wxEventFilter* ms_filterList; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxEvtHandler) +}; + +WX_DEFINE_ARRAY_WITH_DECL_PTR(wxEvtHandler *, wxEvtHandlerArray, class WXDLLIMPEXP_BASE); + + +// Define an inline method of wxObjectEventFunctor which couldn't be defined +// before wxEvtHandler declaration: at least Sun CC refuses to compile function +// calls through pointer to member for forward-declared classes (see #12452). +inline void wxObjectEventFunctor::operator()(wxEvtHandler *handler, wxEvent& event) +{ + wxEvtHandler * const realHandler = m_handler ? m_handler : handler; + + (realHandler->*m_method)(event); +} + +// ---------------------------------------------------------------------------- +// wxEventConnectionRef represents all connections between two event handlers +// and enables automatic disconnect when an event handler sink goes out of +// scope. Each connection/disconnect increases/decreases ref count, and +// when it reaches zero the node goes out of scope. +// ---------------------------------------------------------------------------- + +class wxEventConnectionRef : public wxTrackerNode +{ +public: + wxEventConnectionRef() : m_src(NULL), m_sink(NULL), m_refCount(0) { } + wxEventConnectionRef(wxEvtHandler *src, wxEvtHandler *sink) + : m_src(src), m_sink(sink), m_refCount(1) + { + m_sink->AddNode(this); + } + + // The sink is being destroyed + virtual void OnObjectDestroy( ) + { + if ( m_src ) + m_src->OnSinkDestroyed( m_sink ); + delete this; + } + + virtual wxEventConnectionRef *ToEventConnection() { return this; } + + void IncRef() { m_refCount++; } + void DecRef() + { + if ( !--m_refCount ) + { + // The sink holds the only external pointer to this object + if ( m_sink ) + m_sink->RemoveNode(this); + delete this; + } + } + +private: + wxEvtHandler *m_src, + *m_sink; + int m_refCount; + + friend class wxEvtHandler; + + wxDECLARE_NO_ASSIGN_CLASS(wxEventConnectionRef); +}; + +// Post a message to the given event handler which will be processed during the +// next event loop iteration. +// +// Notice that this one is not thread-safe, use wxQueueEvent() +inline void wxPostEvent(wxEvtHandler *dest, const wxEvent& event) +{ + wxCHECK_RET( dest, "need an object to post event to" ); + + dest->AddPendingEvent(event); +} + +// Wrapper around wxEvtHandler::QueueEvent(): adds an event for later +// processing, unlike wxPostEvent it is safe to use from different thread even +// for events with wxString members +inline void wxQueueEvent(wxEvtHandler *dest, wxEvent *event) +{ + wxCHECK_RET( dest, "need an object to queue event for" ); + + dest->QueueEvent(event); +} + +typedef void (wxEvtHandler::*wxEventFunction)(wxEvent&); +typedef void (wxEvtHandler::*wxIdleEventFunction)(wxIdleEvent&); +typedef void (wxEvtHandler::*wxThreadEventFunction)(wxThreadEvent&); + +#define wxEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxEventFunction, func) +#define wxIdleEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxIdleEventFunction, func) +#define wxThreadEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxThreadEventFunction, func) + +#if wxUSE_GUI + +// ---------------------------------------------------------------------------- +// wxEventBlocker: helper class to temporarily disable event handling for a window +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxEventBlocker : public wxEvtHandler +{ +public: + wxEventBlocker(wxWindow *win, wxEventType type = wxEVT_ANY); + virtual ~wxEventBlocker(); + + void Block(wxEventType type) + { + m_eventsToBlock.push_back(type); + } + + virtual bool ProcessEvent(wxEvent& event); + +protected: + wxArrayInt m_eventsToBlock; + wxWindow *m_window; + + wxDECLARE_NO_COPY_CLASS(wxEventBlocker); +}; + +typedef void (wxEvtHandler::*wxCommandEventFunction)(wxCommandEvent&); +typedef void (wxEvtHandler::*wxScrollEventFunction)(wxScrollEvent&); +typedef void (wxEvtHandler::*wxScrollWinEventFunction)(wxScrollWinEvent&); +typedef void (wxEvtHandler::*wxSizeEventFunction)(wxSizeEvent&); +typedef void (wxEvtHandler::*wxMoveEventFunction)(wxMoveEvent&); +typedef void (wxEvtHandler::*wxPaintEventFunction)(wxPaintEvent&); +typedef void (wxEvtHandler::*wxNcPaintEventFunction)(wxNcPaintEvent&); +typedef void (wxEvtHandler::*wxEraseEventFunction)(wxEraseEvent&); +typedef void (wxEvtHandler::*wxMouseEventFunction)(wxMouseEvent&); +typedef void (wxEvtHandler::*wxCharEventFunction)(wxKeyEvent&); +typedef void (wxEvtHandler::*wxFocusEventFunction)(wxFocusEvent&); +typedef void (wxEvtHandler::*wxChildFocusEventFunction)(wxChildFocusEvent&); +typedef void (wxEvtHandler::*wxActivateEventFunction)(wxActivateEvent&); +typedef void (wxEvtHandler::*wxMenuEventFunction)(wxMenuEvent&); +typedef void (wxEvtHandler::*wxJoystickEventFunction)(wxJoystickEvent&); +typedef void (wxEvtHandler::*wxDropFilesEventFunction)(wxDropFilesEvent&); +typedef void (wxEvtHandler::*wxInitDialogEventFunction)(wxInitDialogEvent&); +typedef void (wxEvtHandler::*wxSysColourChangedEventFunction)(wxSysColourChangedEvent&); +typedef void (wxEvtHandler::*wxDisplayChangedEventFunction)(wxDisplayChangedEvent&); +typedef void (wxEvtHandler::*wxUpdateUIEventFunction)(wxUpdateUIEvent&); +typedef void (wxEvtHandler::*wxCloseEventFunction)(wxCloseEvent&); +typedef void (wxEvtHandler::*wxShowEventFunction)(wxShowEvent&); +typedef void (wxEvtHandler::*wxIconizeEventFunction)(wxIconizeEvent&); +typedef void (wxEvtHandler::*wxMaximizeEventFunction)(wxMaximizeEvent&); +typedef void (wxEvtHandler::*wxNavigationKeyEventFunction)(wxNavigationKeyEvent&); +typedef void (wxEvtHandler::*wxPaletteChangedEventFunction)(wxPaletteChangedEvent&); +typedef void (wxEvtHandler::*wxQueryNewPaletteEventFunction)(wxQueryNewPaletteEvent&); +typedef void (wxEvtHandler::*wxWindowCreateEventFunction)(wxWindowCreateEvent&); +typedef void (wxEvtHandler::*wxWindowDestroyEventFunction)(wxWindowDestroyEvent&); +typedef void (wxEvtHandler::*wxSetCursorEventFunction)(wxSetCursorEvent&); +typedef void (wxEvtHandler::*wxNotifyEventFunction)(wxNotifyEvent&); +typedef void (wxEvtHandler::*wxHelpEventFunction)(wxHelpEvent&); +typedef void (wxEvtHandler::*wxContextMenuEventFunction)(wxContextMenuEvent&); +typedef void (wxEvtHandler::*wxMouseCaptureChangedEventFunction)(wxMouseCaptureChangedEvent&); +typedef void (wxEvtHandler::*wxMouseCaptureLostEventFunction)(wxMouseCaptureLostEvent&); +typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent&); + + +#define wxCommandEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxCommandEventFunction, func) +#define wxScrollEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxScrollEventFunction, func) +#define wxScrollWinEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxScrollWinEventFunction, func) +#define wxSizeEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxSizeEventFunction, func) +#define wxMoveEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxMoveEventFunction, func) +#define wxPaintEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxPaintEventFunction, func) +#define wxNcPaintEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxNcPaintEventFunction, func) +#define wxEraseEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxEraseEventFunction, func) +#define wxMouseEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxMouseEventFunction, func) +#define wxCharEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxCharEventFunction, func) +#define wxKeyEventHandler(func) wxCharEventHandler(func) +#define wxFocusEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxFocusEventFunction, func) +#define wxChildFocusEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxChildFocusEventFunction, func) +#define wxActivateEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxActivateEventFunction, func) +#define wxMenuEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxMenuEventFunction, func) +#define wxJoystickEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxJoystickEventFunction, func) +#define wxDropFilesEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxDropFilesEventFunction, func) +#define wxInitDialogEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxInitDialogEventFunction, func) +#define wxSysColourChangedEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxSysColourChangedEventFunction, func) +#define wxDisplayChangedEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxDisplayChangedEventFunction, func) +#define wxUpdateUIEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxUpdateUIEventFunction, func) +#define wxCloseEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxCloseEventFunction, func) +#define wxShowEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxShowEventFunction, func) +#define wxIconizeEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxIconizeEventFunction, func) +#define wxMaximizeEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxMaximizeEventFunction, func) +#define wxNavigationKeyEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxNavigationKeyEventFunction, func) +#define wxPaletteChangedEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxPaletteChangedEventFunction, func) +#define wxQueryNewPaletteEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxQueryNewPaletteEventFunction, func) +#define wxWindowCreateEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxWindowCreateEventFunction, func) +#define wxWindowDestroyEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxWindowDestroyEventFunction, func) +#define wxSetCursorEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxSetCursorEventFunction, func) +#define wxNotifyEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxNotifyEventFunction, func) +#define wxHelpEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxHelpEventFunction, func) +#define wxContextMenuEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxContextMenuEventFunction, func) +#define wxMouseCaptureChangedEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxMouseCaptureChangedEventFunction, func) +#define wxMouseCaptureLostEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxMouseCaptureLostEventFunction, func) +#define wxClipboardTextEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxClipboardTextEventFunction, func) + +#endif // wxUSE_GUI + +// N.B. In GNU-WIN32, you *have* to take the address of a member function +// (use &) or the compiler crashes... + +#define wxDECLARE_EVENT_TABLE() \ + private: \ + static const wxEventTableEntry sm_eventTableEntries[]; \ + protected: \ + static const wxEventTable sm_eventTable; \ + virtual const wxEventTable* GetEventTable() const; \ + static wxEventHashTable sm_eventHashTable; \ + virtual wxEventHashTable& GetEventHashTable() const + +// N.B.: when building DLL with Borland C++ 5.5 compiler, you must initialize +// sm_eventTable before using it in GetEventTable() or the compiler gives +// E2233 (see http://groups.google.com/groups?selm=397dcc8a%241_2%40dnews) + +#define wxBEGIN_EVENT_TABLE(theClass, baseClass) \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define wxBEGIN_EVENT_TABLE_TEMPLATE1(theClass, baseClass, T1) \ + template \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + template \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + template \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + template \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + template \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define wxBEGIN_EVENT_TABLE_TEMPLATE2(theClass, baseClass, T1, T2) \ + template \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + template \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + template \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + template \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + template \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define wxBEGIN_EVENT_TABLE_TEMPLATE3(theClass, baseClass, T1, T2, T3) \ + template \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + template \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + template \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + template \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + template \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define wxBEGIN_EVENT_TABLE_TEMPLATE4(theClass, baseClass, T1, T2, T3, T4) \ + template \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + template \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + template \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + template \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + template \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define wxBEGIN_EVENT_TABLE_TEMPLATE5(theClass, baseClass, T1, T2, T3, T4, T5) \ + template \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + template \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + template \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + template \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + template \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define wxBEGIN_EVENT_TABLE_TEMPLATE7(theClass, baseClass, T1, T2, T3, T4, T5, T6, T7) \ + template \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + template \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + template \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + template \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + template \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define wxBEGIN_EVENT_TABLE_TEMPLATE8(theClass, baseClass, T1, T2, T3, T4, T5, T6, T7, T8) \ + template \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + template \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + template \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + template \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + template \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define wxEND_EVENT_TABLE() \ + wxDECLARE_EVENT_TABLE_TERMINATOR() }; + +/* + * Event table macros + */ + +// helpers for writing shorter code below: declare an event macro taking 2, 1 +// or none ids (the missing ids default to wxID_ANY) +// +// macro arguments: +// - evt one of wxEVT_XXX constants +// - id1, id2 ids of the first/last id +// - fn the function (should be cast to the right type) +#define wx__DECLARE_EVT2(evt, id1, id2, fn) \ + wxDECLARE_EVENT_TABLE_ENTRY(evt, id1, id2, fn, NULL), +#define wx__DECLARE_EVT1(evt, id, fn) \ + wx__DECLARE_EVT2(evt, id, wxID_ANY, fn) +#define wx__DECLARE_EVT0(evt, fn) \ + wx__DECLARE_EVT1(evt, wxID_ANY, fn) + + +// Generic events +#define EVT_CUSTOM(event, winid, func) \ + wx__DECLARE_EVT1(event, winid, wxEventHandler(func)) +#define EVT_CUSTOM_RANGE(event, id1, id2, func) \ + wx__DECLARE_EVT2(event, id1, id2, wxEventHandler(func)) + +// EVT_COMMAND +#define EVT_COMMAND(winid, event, func) \ + wx__DECLARE_EVT1(event, winid, wxCommandEventHandler(func)) + +#define EVT_COMMAND_RANGE(id1, id2, event, func) \ + wx__DECLARE_EVT2(event, id1, id2, wxCommandEventHandler(func)) + +#define EVT_NOTIFY(event, winid, func) \ + wx__DECLARE_EVT1(event, winid, wxNotifyEventHandler(func)) + +#define EVT_NOTIFY_RANGE(event, id1, id2, func) \ + wx__DECLARE_EVT2(event, id1, id2, wxNotifyEventHandler(func)) + +// Miscellaneous +#define EVT_SIZE(func) wx__DECLARE_EVT0(wxEVT_SIZE, wxSizeEventHandler(func)) +#define EVT_SIZING(func) wx__DECLARE_EVT0(wxEVT_SIZING, wxSizeEventHandler(func)) +#define EVT_MOVE(func) wx__DECLARE_EVT0(wxEVT_MOVE, wxMoveEventHandler(func)) +#define EVT_MOVING(func) wx__DECLARE_EVT0(wxEVT_MOVING, wxMoveEventHandler(func)) +#define EVT_MOVE_START(func) wx__DECLARE_EVT0(wxEVT_MOVE_START, wxMoveEventHandler(func)) +#define EVT_MOVE_END(func) wx__DECLARE_EVT0(wxEVT_MOVE_END, wxMoveEventHandler(func)) +#define EVT_CLOSE(func) wx__DECLARE_EVT0(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(func)) +#define EVT_END_SESSION(func) wx__DECLARE_EVT0(wxEVT_END_SESSION, wxCloseEventHandler(func)) +#define EVT_QUERY_END_SESSION(func) wx__DECLARE_EVT0(wxEVT_QUERY_END_SESSION, wxCloseEventHandler(func)) +#define EVT_PAINT(func) wx__DECLARE_EVT0(wxEVT_PAINT, wxPaintEventHandler(func)) +#define EVT_NC_PAINT(func) wx__DECLARE_EVT0(wxEVT_NC_PAINT, wxNcPaintEventHandler(func)) +#define EVT_ERASE_BACKGROUND(func) wx__DECLARE_EVT0(wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(func)) +#define EVT_CHAR(func) wx__DECLARE_EVT0(wxEVT_CHAR, wxCharEventHandler(func)) +#define EVT_KEY_DOWN(func) wx__DECLARE_EVT0(wxEVT_KEY_DOWN, wxKeyEventHandler(func)) +#define EVT_KEY_UP(func) wx__DECLARE_EVT0(wxEVT_KEY_UP, wxKeyEventHandler(func)) +#if wxUSE_HOTKEY +#define EVT_HOTKEY(winid, func) wx__DECLARE_EVT1(wxEVT_HOTKEY, winid, wxCharEventHandler(func)) +#endif +#define EVT_CHAR_HOOK(func) wx__DECLARE_EVT0(wxEVT_CHAR_HOOK, wxCharEventHandler(func)) +#define EVT_MENU_OPEN(func) wx__DECLARE_EVT0(wxEVT_MENU_OPEN, wxMenuEventHandler(func)) +#define EVT_MENU_CLOSE(func) wx__DECLARE_EVT0(wxEVT_MENU_CLOSE, wxMenuEventHandler(func)) +#define EVT_MENU_HIGHLIGHT(winid, func) wx__DECLARE_EVT1(wxEVT_MENU_HIGHLIGHT, winid, wxMenuEventHandler(func)) +#define EVT_MENU_HIGHLIGHT_ALL(func) wx__DECLARE_EVT0(wxEVT_MENU_HIGHLIGHT, wxMenuEventHandler(func)) +#define EVT_SET_FOCUS(func) wx__DECLARE_EVT0(wxEVT_SET_FOCUS, wxFocusEventHandler(func)) +#define EVT_KILL_FOCUS(func) wx__DECLARE_EVT0(wxEVT_KILL_FOCUS, wxFocusEventHandler(func)) +#define EVT_CHILD_FOCUS(func) wx__DECLARE_EVT0(wxEVT_CHILD_FOCUS, wxChildFocusEventHandler(func)) +#define EVT_ACTIVATE(func) wx__DECLARE_EVT0(wxEVT_ACTIVATE, wxActivateEventHandler(func)) +#define EVT_ACTIVATE_APP(func) wx__DECLARE_EVT0(wxEVT_ACTIVATE_APP, wxActivateEventHandler(func)) +#define EVT_HIBERNATE(func) wx__DECLARE_EVT0(wxEVT_HIBERNATE, wxActivateEventHandler(func)) +#define EVT_END_SESSION(func) wx__DECLARE_EVT0(wxEVT_END_SESSION, wxCloseEventHandler(func)) +#define EVT_QUERY_END_SESSION(func) wx__DECLARE_EVT0(wxEVT_QUERY_END_SESSION, wxCloseEventHandler(func)) +#define EVT_DROP_FILES(func) wx__DECLARE_EVT0(wxEVT_DROP_FILES, wxDropFilesEventHandler(func)) +#define EVT_INIT_DIALOG(func) wx__DECLARE_EVT0(wxEVT_INIT_DIALOG, wxInitDialogEventHandler(func)) +#define EVT_SYS_COLOUR_CHANGED(func) wx__DECLARE_EVT0(wxEVT_SYS_COLOUR_CHANGED, wxSysColourChangedEventHandler(func)) +#define EVT_DISPLAY_CHANGED(func) wx__DECLARE_EVT0(wxEVT_DISPLAY_CHANGED, wxDisplayChangedEventHandler(func)) +#define EVT_SHOW(func) wx__DECLARE_EVT0(wxEVT_SHOW, wxShowEventHandler(func)) +#define EVT_MAXIMIZE(func) wx__DECLARE_EVT0(wxEVT_MAXIMIZE, wxMaximizeEventHandler(func)) +#define EVT_ICONIZE(func) wx__DECLARE_EVT0(wxEVT_ICONIZE, wxIconizeEventHandler(func)) +#define EVT_NAVIGATION_KEY(func) wx__DECLARE_EVT0(wxEVT_NAVIGATION_KEY, wxNavigationKeyEventHandler(func)) +#define EVT_PALETTE_CHANGED(func) wx__DECLARE_EVT0(wxEVT_PALETTE_CHANGED, wxPaletteChangedEventHandler(func)) +#define EVT_QUERY_NEW_PALETTE(func) wx__DECLARE_EVT0(wxEVT_QUERY_NEW_PALETTE, wxQueryNewPaletteEventHandler(func)) +#define EVT_WINDOW_CREATE(func) wx__DECLARE_EVT0(wxEVT_CREATE, wxWindowCreateEventHandler(func)) +#define EVT_WINDOW_DESTROY(func) wx__DECLARE_EVT0(wxEVT_DESTROY, wxWindowDestroyEventHandler(func)) +#define EVT_SET_CURSOR(func) wx__DECLARE_EVT0(wxEVT_SET_CURSOR, wxSetCursorEventHandler(func)) +#define EVT_MOUSE_CAPTURE_CHANGED(func) wx__DECLARE_EVT0(wxEVT_MOUSE_CAPTURE_CHANGED, wxMouseCaptureChangedEventHandler(func)) +#define EVT_MOUSE_CAPTURE_LOST(func) wx__DECLARE_EVT0(wxEVT_MOUSE_CAPTURE_LOST, wxMouseCaptureLostEventHandler(func)) + +// Mouse events +#define EVT_LEFT_DOWN(func) wx__DECLARE_EVT0(wxEVT_LEFT_DOWN, wxMouseEventHandler(func)) +#define EVT_LEFT_UP(func) wx__DECLARE_EVT0(wxEVT_LEFT_UP, wxMouseEventHandler(func)) +#define EVT_MIDDLE_DOWN(func) wx__DECLARE_EVT0(wxEVT_MIDDLE_DOWN, wxMouseEventHandler(func)) +#define EVT_MIDDLE_UP(func) wx__DECLARE_EVT0(wxEVT_MIDDLE_UP, wxMouseEventHandler(func)) +#define EVT_RIGHT_DOWN(func) wx__DECLARE_EVT0(wxEVT_RIGHT_DOWN, wxMouseEventHandler(func)) +#define EVT_RIGHT_UP(func) wx__DECLARE_EVT0(wxEVT_RIGHT_UP, wxMouseEventHandler(func)) +#define EVT_MOTION(func) wx__DECLARE_EVT0(wxEVT_MOTION, wxMouseEventHandler(func)) +#define EVT_LEFT_DCLICK(func) wx__DECLARE_EVT0(wxEVT_LEFT_DCLICK, wxMouseEventHandler(func)) +#define EVT_MIDDLE_DCLICK(func) wx__DECLARE_EVT0(wxEVT_MIDDLE_DCLICK, wxMouseEventHandler(func)) +#define EVT_RIGHT_DCLICK(func) wx__DECLARE_EVT0(wxEVT_RIGHT_DCLICK, wxMouseEventHandler(func)) +#define EVT_LEAVE_WINDOW(func) wx__DECLARE_EVT0(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(func)) +#define EVT_ENTER_WINDOW(func) wx__DECLARE_EVT0(wxEVT_ENTER_WINDOW, wxMouseEventHandler(func)) +#define EVT_MOUSEWHEEL(func) wx__DECLARE_EVT0(wxEVT_MOUSEWHEEL, wxMouseEventHandler(func)) +#define EVT_MOUSE_AUX1_DOWN(func) wx__DECLARE_EVT0(wxEVT_AUX1_DOWN, wxMouseEventHandler(func)) +#define EVT_MOUSE_AUX1_UP(func) wx__DECLARE_EVT0(wxEVT_AUX1_UP, wxMouseEventHandler(func)) +#define EVT_MOUSE_AUX1_DCLICK(func) wx__DECLARE_EVT0(wxEVT_AUX1_DCLICK, wxMouseEventHandler(func)) +#define EVT_MOUSE_AUX2_DOWN(func) wx__DECLARE_EVT0(wxEVT_AUX2_DOWN, wxMouseEventHandler(func)) +#define EVT_MOUSE_AUX2_UP(func) wx__DECLARE_EVT0(wxEVT_AUX2_UP, wxMouseEventHandler(func)) +#define EVT_MOUSE_AUX2_DCLICK(func) wx__DECLARE_EVT0(wxEVT_AUX2_DCLICK, wxMouseEventHandler(func)) + +// All mouse events +#define EVT_MOUSE_EVENTS(func) \ + EVT_LEFT_DOWN(func) \ + EVT_LEFT_UP(func) \ + EVT_LEFT_DCLICK(func) \ + EVT_MIDDLE_DOWN(func) \ + EVT_MIDDLE_UP(func) \ + EVT_MIDDLE_DCLICK(func) \ + EVT_RIGHT_DOWN(func) \ + EVT_RIGHT_UP(func) \ + EVT_RIGHT_DCLICK(func) \ + EVT_MOUSE_AUX1_DOWN(func) \ + EVT_MOUSE_AUX1_UP(func) \ + EVT_MOUSE_AUX1_DCLICK(func) \ + EVT_MOUSE_AUX2_DOWN(func) \ + EVT_MOUSE_AUX2_UP(func) \ + EVT_MOUSE_AUX2_DCLICK(func) \ + EVT_MOTION(func) \ + EVT_LEAVE_WINDOW(func) \ + EVT_ENTER_WINDOW(func) \ + EVT_MOUSEWHEEL(func) + +// Scrolling from wxWindow (sent to wxScrolledWindow) +#define EVT_SCROLLWIN_TOP(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_TOP, wxScrollWinEventHandler(func)) +#define EVT_SCROLLWIN_BOTTOM(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_BOTTOM, wxScrollWinEventHandler(func)) +#define EVT_SCROLLWIN_LINEUP(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_LINEUP, wxScrollWinEventHandler(func)) +#define EVT_SCROLLWIN_LINEDOWN(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_LINEDOWN, wxScrollWinEventHandler(func)) +#define EVT_SCROLLWIN_PAGEUP(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_PAGEUP, wxScrollWinEventHandler(func)) +#define EVT_SCROLLWIN_PAGEDOWN(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_PAGEDOWN, wxScrollWinEventHandler(func)) +#define EVT_SCROLLWIN_THUMBTRACK(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_THUMBTRACK, wxScrollWinEventHandler(func)) +#define EVT_SCROLLWIN_THUMBRELEASE(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_THUMBRELEASE, wxScrollWinEventHandler(func)) + +#define EVT_SCROLLWIN(func) \ + EVT_SCROLLWIN_TOP(func) \ + EVT_SCROLLWIN_BOTTOM(func) \ + EVT_SCROLLWIN_LINEUP(func) \ + EVT_SCROLLWIN_LINEDOWN(func) \ + EVT_SCROLLWIN_PAGEUP(func) \ + EVT_SCROLLWIN_PAGEDOWN(func) \ + EVT_SCROLLWIN_THUMBTRACK(func) \ + EVT_SCROLLWIN_THUMBRELEASE(func) + +// Scrolling from wxSlider and wxScrollBar +#define EVT_SCROLL_TOP(func) wx__DECLARE_EVT0(wxEVT_SCROLL_TOP, wxScrollEventHandler(func)) +#define EVT_SCROLL_BOTTOM(func) wx__DECLARE_EVT0(wxEVT_SCROLL_BOTTOM, wxScrollEventHandler(func)) +#define EVT_SCROLL_LINEUP(func) wx__DECLARE_EVT0(wxEVT_SCROLL_LINEUP, wxScrollEventHandler(func)) +#define EVT_SCROLL_LINEDOWN(func) wx__DECLARE_EVT0(wxEVT_SCROLL_LINEDOWN, wxScrollEventHandler(func)) +#define EVT_SCROLL_PAGEUP(func) wx__DECLARE_EVT0(wxEVT_SCROLL_PAGEUP, wxScrollEventHandler(func)) +#define EVT_SCROLL_PAGEDOWN(func) wx__DECLARE_EVT0(wxEVT_SCROLL_PAGEDOWN, wxScrollEventHandler(func)) +#define EVT_SCROLL_THUMBTRACK(func) wx__DECLARE_EVT0(wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler(func)) +#define EVT_SCROLL_THUMBRELEASE(func) wx__DECLARE_EVT0(wxEVT_SCROLL_THUMBRELEASE, wxScrollEventHandler(func)) +#define EVT_SCROLL_CHANGED(func) wx__DECLARE_EVT0(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(func)) + +#define EVT_SCROLL(func) \ + EVT_SCROLL_TOP(func) \ + EVT_SCROLL_BOTTOM(func) \ + EVT_SCROLL_LINEUP(func) \ + EVT_SCROLL_LINEDOWN(func) \ + EVT_SCROLL_PAGEUP(func) \ + EVT_SCROLL_PAGEDOWN(func) \ + EVT_SCROLL_THUMBTRACK(func) \ + EVT_SCROLL_THUMBRELEASE(func) \ + EVT_SCROLL_CHANGED(func) + +// Scrolling from wxSlider and wxScrollBar, with an id +#define EVT_COMMAND_SCROLL_TOP(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_TOP, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_BOTTOM(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_BOTTOM, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_LINEUP(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_LINEUP, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_LINEDOWN(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_LINEDOWN, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_PAGEUP(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_PAGEUP, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_PAGEDOWN(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_PAGEDOWN, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_THUMBTRACK(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_THUMBTRACK, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_THUMBRELEASE(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_THUMBRELEASE, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_CHANGED(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_CHANGED, winid, wxScrollEventHandler(func)) + +#define EVT_COMMAND_SCROLL(winid, func) \ + EVT_COMMAND_SCROLL_TOP(winid, func) \ + EVT_COMMAND_SCROLL_BOTTOM(winid, func) \ + EVT_COMMAND_SCROLL_LINEUP(winid, func) \ + EVT_COMMAND_SCROLL_LINEDOWN(winid, func) \ + EVT_COMMAND_SCROLL_PAGEUP(winid, func) \ + EVT_COMMAND_SCROLL_PAGEDOWN(winid, func) \ + EVT_COMMAND_SCROLL_THUMBTRACK(winid, func) \ + EVT_COMMAND_SCROLL_THUMBRELEASE(winid, func) \ + EVT_COMMAND_SCROLL_CHANGED(winid, func) + +#if WXWIN_COMPATIBILITY_2_6 + // compatibility macros for the old name, deprecated in 2.8 + #define wxEVT_SCROLL_ENDSCROLL wxEVT_SCROLL_CHANGED + #define EVT_COMMAND_SCROLL_ENDSCROLL EVT_COMMAND_SCROLL_CHANGED + #define EVT_SCROLL_ENDSCROLL EVT_SCROLL_CHANGED +#endif // WXWIN_COMPATIBILITY_2_6 + +// Convenience macros for commonly-used commands +#define EVT_CHECKBOX(winid, func) wx__DECLARE_EVT1(wxEVT_CHECKBOX, winid, wxCommandEventHandler(func)) +#define EVT_CHOICE(winid, func) wx__DECLARE_EVT1(wxEVT_CHOICE, winid, wxCommandEventHandler(func)) +#define EVT_LISTBOX(winid, func) wx__DECLARE_EVT1(wxEVT_LISTBOX, winid, wxCommandEventHandler(func)) +#define EVT_LISTBOX_DCLICK(winid, func) wx__DECLARE_EVT1(wxEVT_LISTBOX_DCLICK, winid, wxCommandEventHandler(func)) +#define EVT_MENU(winid, func) wx__DECLARE_EVT1(wxEVT_MENU, winid, wxCommandEventHandler(func)) +#define EVT_MENU_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_MENU, id1, id2, wxCommandEventHandler(func)) +#if defined(__SMARTPHONE__) +# define EVT_BUTTON(winid, func) EVT_MENU(winid, func) +#else +# define EVT_BUTTON(winid, func) wx__DECLARE_EVT1(wxEVT_BUTTON, winid, wxCommandEventHandler(func)) +#endif +#define EVT_SLIDER(winid, func) wx__DECLARE_EVT1(wxEVT_SLIDER, winid, wxCommandEventHandler(func)) +#define EVT_RADIOBOX(winid, func) wx__DECLARE_EVT1(wxEVT_RADIOBOX, winid, wxCommandEventHandler(func)) +#define EVT_RADIOBUTTON(winid, func) wx__DECLARE_EVT1(wxEVT_RADIOBUTTON, winid, wxCommandEventHandler(func)) +// EVT_SCROLLBAR is now obsolete since we use EVT_COMMAND_SCROLL... events +#define EVT_SCROLLBAR(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLLBAR, winid, wxCommandEventHandler(func)) +#define EVT_VLBOX(winid, func) wx__DECLARE_EVT1(wxEVT_VLBOX, winid, wxCommandEventHandler(func)) +#define EVT_COMBOBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMBOBOX, winid, wxCommandEventHandler(func)) +#define EVT_TOOL(winid, func) wx__DECLARE_EVT1(wxEVT_TOOL, winid, wxCommandEventHandler(func)) +#define EVT_TOOL_DROPDOWN(winid, func) wx__DECLARE_EVT1(wxEVT_TOOL_DROPDOWN, winid, wxCommandEventHandler(func)) +#define EVT_TOOL_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_TOOL, id1, id2, wxCommandEventHandler(func)) +#define EVT_TOOL_RCLICKED(winid, func) wx__DECLARE_EVT1(wxEVT_TOOL_RCLICKED, winid, wxCommandEventHandler(func)) +#define EVT_TOOL_RCLICKED_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_TOOL_RCLICKED, id1, id2, wxCommandEventHandler(func)) +#define EVT_TOOL_ENTER(winid, func) wx__DECLARE_EVT1(wxEVT_TOOL_ENTER, winid, wxCommandEventHandler(func)) +#define EVT_CHECKLISTBOX(winid, func) wx__DECLARE_EVT1(wxEVT_CHECKLISTBOX, winid, wxCommandEventHandler(func)) +#define EVT_COMBOBOX_DROPDOWN(winid, func) wx__DECLARE_EVT1(wxEVT_COMBOBOX_DROPDOWN, winid, wxCommandEventHandler(func)) +#define EVT_COMBOBOX_CLOSEUP(winid, func) wx__DECLARE_EVT1(wxEVT_COMBOBOX_CLOSEUP, winid, wxCommandEventHandler(func)) + +// Generic command events +#define EVT_COMMAND_LEFT_CLICK(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_LEFT_CLICK, winid, wxCommandEventHandler(func)) +#define EVT_COMMAND_LEFT_DCLICK(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_LEFT_DCLICK, winid, wxCommandEventHandler(func)) +#define EVT_COMMAND_RIGHT_CLICK(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_RIGHT_CLICK, winid, wxCommandEventHandler(func)) +#define EVT_COMMAND_RIGHT_DCLICK(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_RIGHT_DCLICK, winid, wxCommandEventHandler(func)) +#define EVT_COMMAND_SET_FOCUS(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_SET_FOCUS, winid, wxCommandEventHandler(func)) +#define EVT_COMMAND_KILL_FOCUS(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_KILL_FOCUS, winid, wxCommandEventHandler(func)) +#define EVT_COMMAND_ENTER(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_ENTER, winid, wxCommandEventHandler(func)) + +// Joystick events + +#define EVT_JOY_BUTTON_DOWN(func) wx__DECLARE_EVT0(wxEVT_JOY_BUTTON_DOWN, wxJoystickEventHandler(func)) +#define EVT_JOY_BUTTON_UP(func) wx__DECLARE_EVT0(wxEVT_JOY_BUTTON_UP, wxJoystickEventHandler(func)) +#define EVT_JOY_MOVE(func) wx__DECLARE_EVT0(wxEVT_JOY_MOVE, wxJoystickEventHandler(func)) +#define EVT_JOY_ZMOVE(func) wx__DECLARE_EVT0(wxEVT_JOY_ZMOVE, wxJoystickEventHandler(func)) + +// All joystick events +#define EVT_JOYSTICK_EVENTS(func) \ + EVT_JOY_BUTTON_DOWN(func) \ + EVT_JOY_BUTTON_UP(func) \ + EVT_JOY_MOVE(func) \ + EVT_JOY_ZMOVE(func) + +// Idle event +#define EVT_IDLE(func) wx__DECLARE_EVT0(wxEVT_IDLE, wxIdleEventHandler(func)) + +// Update UI event +#define EVT_UPDATE_UI(winid, func) wx__DECLARE_EVT1(wxEVT_UPDATE_UI, winid, wxUpdateUIEventHandler(func)) +#define EVT_UPDATE_UI_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_UPDATE_UI, id1, id2, wxUpdateUIEventHandler(func)) + +// Help events +#define EVT_HELP(winid, func) wx__DECLARE_EVT1(wxEVT_HELP, winid, wxHelpEventHandler(func)) +#define EVT_HELP_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_HELP, id1, id2, wxHelpEventHandler(func)) +#define EVT_DETAILED_HELP(winid, func) wx__DECLARE_EVT1(wxEVT_DETAILED_HELP, winid, wxHelpEventHandler(func)) +#define EVT_DETAILED_HELP_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_DETAILED_HELP, id1, id2, wxHelpEventHandler(func)) + +// Context Menu Events +#define EVT_CONTEXT_MENU(func) wx__DECLARE_EVT0(wxEVT_CONTEXT_MENU, wxContextMenuEventHandler(func)) +#define EVT_COMMAND_CONTEXT_MENU(winid, func) wx__DECLARE_EVT1(wxEVT_CONTEXT_MENU, winid, wxContextMenuEventHandler(func)) + +// Clipboard text Events +#define EVT_TEXT_CUT(winid, func) wx__DECLARE_EVT1(wxEVT_TEXT_CUT, winid, wxClipboardTextEventHandler(func)) +#define EVT_TEXT_COPY(winid, func) wx__DECLARE_EVT1(wxEVT_TEXT_COPY, winid, wxClipboardTextEventHandler(func)) +#define EVT_TEXT_PASTE(winid, func) wx__DECLARE_EVT1(wxEVT_TEXT_PASTE, winid, wxClipboardTextEventHandler(func)) + +// Thread events +#define EVT_THREAD(id, func) wx__DECLARE_EVT1(wxEVT_THREAD, id, wxThreadEventHandler(func)) + +// ---------------------------------------------------------------------------- +// Helper functions +// ---------------------------------------------------------------------------- + +// This is an ugly hack to allow the use of Bind() instead of Connect() inside +// the library code if the library was built with support for it, here is how +// it is used: +// +// class SomeEventHandlingClass : wxBIND_OR_CONNECT_HACK_BASE_CLASS +// public SomeBaseClass +// { +// public: +// SomeEventHandlingClass(wxWindow *win) +// { +// // connect to the event for the given window +// wxBIND_OR_CONNECT_HACK(win, wxEVT_SOMETHING, wxSomeEventHandler, +// SomeEventHandlingClass::OnSomeEvent, this); +// } +// +// private: +// void OnSomeEvent(wxSomeEvent&) { ... } +// }; +// +// This is *not* meant to be used by library users, it is only defined here +// (and not in a private header) because the base class must be visible from +// other public headers, please do NOT use this in your code, it will be +// removed from future wx versions without warning. +#ifdef wxHAS_EVENT_BIND + #define wxBIND_OR_CONNECT_HACK_BASE_CLASS + #define wxBIND_OR_CONNECT_HACK_ONLY_BASE_CLASS + #define wxBIND_OR_CONNECT_HACK(win, evt, handler, func, obj) \ + win->Bind(evt, &func, obj) +#else // wxHAS_EVENT_BIND + #define wxBIND_OR_CONNECT_HACK_BASE_CLASS public wxEvtHandler, + #define wxBIND_OR_CONNECT_HACK_ONLY_BASE_CLASS : public wxEvtHandler + #define wxBIND_OR_CONNECT_HACK(win, evt, handler, func, obj) \ + win->Connect(evt, handler(func), NULL, obj) +#endif // wxHAS_EVENT_BIND + +#if wxUSE_GUI + +// Find a window with the focus, that is also a descendant of the given window. +// This is used to determine the window to initially send commands to. +WXDLLIMPEXP_CORE wxWindow* wxFindFocusDescendant(wxWindow* ancestor); + +#endif // wxUSE_GUI + + +// ---------------------------------------------------------------------------- +// Compatibility macro aliases +// ---------------------------------------------------------------------------- + +// deprecated variants _not_ requiring a semicolon after them and without wx prefix +// (note that also some wx-prefixed macro do _not_ require a semicolon because +// it's not always possible to force the compire to require it) + +#define DECLARE_EVENT_TABLE_ENTRY(type, winid, idLast, fn, obj) \ + wxDECLARE_EVENT_TABLE_ENTRY(type, winid, idLast, fn, obj) +#define DECLARE_EVENT_TABLE_TERMINATOR() wxDECLARE_EVENT_TABLE_TERMINATOR() +#define DECLARE_EVENT_TABLE() wxDECLARE_EVENT_TABLE(); +#define BEGIN_EVENT_TABLE(a,b) wxBEGIN_EVENT_TABLE(a,b) +#define BEGIN_EVENT_TABLE_TEMPLATE1(a,b,c) wxBEGIN_EVENT_TABLE_TEMPLATE1(a,b,c) +#define BEGIN_EVENT_TABLE_TEMPLATE2(a,b,c,d) wxBEGIN_EVENT_TABLE_TEMPLATE2(a,b,c,d) +#define BEGIN_EVENT_TABLE_TEMPLATE3(a,b,c,d,e) wxBEGIN_EVENT_TABLE_TEMPLATE3(a,b,c,d,e) +#define BEGIN_EVENT_TABLE_TEMPLATE4(a,b,c,d,e,f) wxBEGIN_EVENT_TABLE_TEMPLATE4(a,b,c,d,e,f) +#define BEGIN_EVENT_TABLE_TEMPLATE5(a,b,c,d,e,f,g) wxBEGIN_EVENT_TABLE_TEMPLATE5(a,b,c,d,e,f,g) +#define BEGIN_EVENT_TABLE_TEMPLATE6(a,b,c,d,e,f,g,h) wxBEGIN_EVENT_TABLE_TEMPLATE6(a,b,c,d,e,f,g,h) +#define END_EVENT_TABLE() wxEND_EVENT_TABLE() + +// other obsolete event declaration/definition macros; we don't need them any longer +// but we keep them for compatibility as it doesn't cost us anything anyhow +#define BEGIN_DECLARE_EVENT_TYPES() +#define END_DECLARE_EVENT_TYPES() +#define DECLARE_EXPORTED_EVENT_TYPE(expdecl, name, value) \ + extern expdecl const wxEventType name; +#define DECLARE_EVENT_TYPE(name, value) \ + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_CORE, name, value) +#define DECLARE_LOCAL_EVENT_TYPE(name, value) \ + DECLARE_EXPORTED_EVENT_TYPE(wxEMPTY_PARAMETER_VALUE, name, value) +#define DEFINE_EVENT_TYPE(name) const wxEventType name = wxNewEventType(); +#define DEFINE_LOCAL_EVENT_TYPE(name) DEFINE_EVENT_TYPE(name) + +// alias for backward compatibility with 2.9.0: +#define wxEVT_COMMAND_THREAD wxEVT_THREAD +// other old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_BUTTON_CLICKED wxEVT_BUTTON +#define wxEVT_COMMAND_CHECKBOX_CLICKED wxEVT_CHECKBOX +#define wxEVT_COMMAND_CHOICE_SELECTED wxEVT_CHOICE +#define wxEVT_COMMAND_LISTBOX_SELECTED wxEVT_LISTBOX +#define wxEVT_COMMAND_LISTBOX_DOUBLECLICKED wxEVT_LISTBOX_DCLICK +#define wxEVT_COMMAND_CHECKLISTBOX_TOGGLED wxEVT_CHECKLISTBOX +#define wxEVT_COMMAND_MENU_SELECTED wxEVT_MENU +#define wxEVT_COMMAND_TOOL_CLICKED wxEVT_TOOL +#define wxEVT_COMMAND_SLIDER_UPDATED wxEVT_SLIDER +#define wxEVT_COMMAND_RADIOBOX_SELECTED wxEVT_RADIOBOX +#define wxEVT_COMMAND_RADIOBUTTON_SELECTED wxEVT_RADIOBUTTON +#define wxEVT_COMMAND_SCROLLBAR_UPDATED wxEVT_SCROLLBAR +#define wxEVT_COMMAND_VLBOX_SELECTED wxEVT_VLBOX +#define wxEVT_COMMAND_COMBOBOX_SELECTED wxEVT_COMBOBOX +#define wxEVT_COMMAND_TOOL_RCLICKED wxEVT_TOOL_RCLICKED +#define wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED wxEVT_TOOL_DROPDOWN +#define wxEVT_COMMAND_TOOL_ENTER wxEVT_TOOL_ENTER +#define wxEVT_COMMAND_COMBOBOX_DROPDOWN wxEVT_COMBOBOX_DROPDOWN +#define wxEVT_COMMAND_COMBOBOX_CLOSEUP wxEVT_COMBOBOX_CLOSEUP +#define wxEVT_COMMAND_TEXT_COPY wxEVT_TEXT_COPY +#define wxEVT_COMMAND_TEXT_CUT wxEVT_TEXT_CUT +#define wxEVT_COMMAND_TEXT_PASTE wxEVT_TEXT_PASTE +#define wxEVT_COMMAND_TEXT_UPDATED wxEVT_TEXT + +#endif // _WX_EVENT_H_ diff --git a/wxmsw/include/wx-3.0/wx/eventfilter.h b/wxmsw/include/wx-3.0/wx/eventfilter.h new file mode 100644 index 00000000..30eac4d3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/eventfilter.h @@ -0,0 +1,71 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/eventfilter.h +// Purpose: wxEventFilter class declaration. +// Author: Vadim Zeitlin +// Created: 2011-11-21 +// Copyright: (c) 2011 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_EVENTFILTER_H_ +#define _WX_EVENTFILTER_H_ + +#include "wx/defs.h" + +class WXDLLIMPEXP_FWD_BASE wxEvent; +class WXDLLIMPEXP_FWD_BASE wxEvtHandler; + +// ---------------------------------------------------------------------------- +// wxEventFilter is used with wxEvtHandler::AddFilter() and ProcessEvent(). +// ---------------------------------------------------------------------------- + +class wxEventFilter +{ +public: + // Possible return values for FilterEvent(). + // + // Notice that the values of these enum elements are fixed due to backwards + // compatibility constraints. + enum + { + // Process event as usual. + Event_Skip = -1, + + // Don't process the event normally at all. + Event_Ignore = 0, + + // Event was already handled, don't process it normally. + Event_Processed = 1 + }; + + wxEventFilter() + { + m_next = NULL; + } + + virtual ~wxEventFilter() + { + wxASSERT_MSG( !m_next, "Forgot to call wxEvtHandler::RemoveFilter()?" ); + } + + // This method allows to filter all the events processed by the program, so + // you should try to return quickly from it to avoid slowing down the + // program to a crawl. + // + // Return value should be -1 to continue with the normal event processing, + // or true or false to stop further processing and pretend that the event + // had been already processed or won't be processed at all, respectively. + virtual int FilterEvent(wxEvent& event) = 0; + +private: + // Objects of this class are made to be stored in a linked list in + // wxEvtHandler so put the next node ponter directly in the class itself. + wxEventFilter* m_next; + + // And provide access to it for wxEvtHandler [only]. + friend class wxEvtHandler; + + wxDECLARE_NO_COPY_CLASS(wxEventFilter); +}; + +#endif // _WX_EVENTFILTER_H_ diff --git a/wxmsw/include/wx-3.0/wx/evtloop.h b/wxmsw/include/wx-3.0/wx/evtloop.h new file mode 100644 index 00000000..8dd5d6eb --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/evtloop.h @@ -0,0 +1,435 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/evtloop.h +// Purpose: declares wxEventLoop class +// Author: Vadim Zeitlin +// Modified by: +// Created: 01.06.01 +// Copyright: (c) 2001 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_EVTLOOP_H_ +#define _WX_EVTLOOP_H_ + +#include "wx/event.h" +#include "wx/utils.h" + +// TODO: implement wxEventLoopSource for MSW (it should wrap a HANDLE and be +// monitored using MsgWaitForMultipleObjects()) +#if defined(__WXOSX__) || (defined(__UNIX__) && !defined(__WXMSW__)) + #define wxUSE_EVENTLOOP_SOURCE 1 +#else + #define wxUSE_EVENTLOOP_SOURCE 0 +#endif + +#if wxUSE_EVENTLOOP_SOURCE + class wxEventLoopSource; + class wxEventLoopSourceHandler; +#endif + +/* + NOTE ABOUT wxEventLoopBase::YieldFor LOGIC + ------------------------------------------ + + The YieldFor() function helps to avoid re-entrancy problems and problems + caused by out-of-order event processing + (see "wxYield-like problems" and "wxProgressDialog+threading BUG" wx-dev threads). + + The logic behind YieldFor() is simple: it analyzes the queue of the native + events generated by the underlying GUI toolkit and picks out and processes + only those matching the given mask. + + It's important to note that YieldFor() is used to selectively process the + events generated by the NATIVE toolkit. + Events syntethized by wxWidgets code or by user code are instead selectively + processed thanks to the logic built into wxEvtHandler::ProcessPendingEvents(). + In fact, when wxEvtHandler::ProcessPendingEvents gets called from inside a + YieldFor() call, wxEventLoopBase::IsEventAllowedInsideYield is used to decide + if the pending events for that event handler can be processed. + If all the pending events associated with that event handler result as "not processable", + the event handler "delays" itself calling wxEventLoopBase::DelayPendingEventHandler + (so it's moved: m_handlersWithPendingEvents => m_handlersWithPendingDelayedEvents). + Last, wxEventLoopBase::ProcessPendingEvents() before exiting moves the delayed + event handlers back into the list of handlers with pending events + (m_handlersWithPendingDelayedEvents => m_handlersWithPendingEvents) so that + a later call to ProcessPendingEvents() (possibly outside the YieldFor() call) + will process all pending events as usual. +*/ + +// ---------------------------------------------------------------------------- +// wxEventLoopBase: interface for wxEventLoop +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxEventLoopBase +{ +public: + // trivial, but needed (because of wxEventLoopBase) ctor + wxEventLoopBase(); + + // dtor + virtual ~wxEventLoopBase() { } + + // use this to check whether the event loop was successfully created before + // using it + virtual bool IsOk() const { return true; } + + // returns true if this is the main loop + bool IsMain() const; + +#if wxUSE_EVENTLOOP_SOURCE + // create a new event loop source wrapping the given file descriptor and + // monitor it for events occurring on this descriptor in all event loops + static wxEventLoopSource * + AddSourceForFD(int fd, wxEventLoopSourceHandler *handler, int flags); +#endif // wxUSE_EVENTLOOP_SOURCE + + // dispatch&processing + // ------------------- + + // start the event loop, return the exit code when it is finished + // + // notice that wx ports should override DoRun(), this method is virtual + // only to allow overriding it in the user code for custom event loops + virtual int Run(); + + // is this event loop running now? + // + // notice that even if this event loop hasn't terminated yet but has just + // spawned a nested (e.g. modal) event loop, this would return false + bool IsRunning() const; + + // exit from the loop with the given exit code + // + // this can be only used to exit the currently running loop, use + // ScheduleExit() if this might not be the case + virtual void Exit(int rc = 0); + + // ask the event loop to exit with the given exit code, can be used even if + // this loop is not running right now but the loop must have been started, + // i.e. Run() should have been already called + virtual void ScheduleExit(int rc = 0) = 0; + + // return true if any events are available + virtual bool Pending() const = 0; + + // dispatch a single event, return false if we should exit from the loop + virtual bool Dispatch() = 0; + + // same as Dispatch() but doesn't wait for longer than the specified (in + // ms) timeout, return true if an event was processed, false if we should + // exit the loop or -1 if timeout expired + virtual int DispatchTimeout(unsigned long timeout) = 0; + + // implement this to wake up the loop: usually done by posting a dummy event + // to it (can be called from non main thread) + virtual void WakeUp() = 0; + + + // idle handling + // ------------- + + // make sure that idle events are sent again + virtual void WakeUpIdle(); + + // this virtual function is called when the application + // becomes idle and by default it forwards to wxApp::ProcessIdle() and + // while it can be overridden in a custom event loop, you must call the + // base class version to ensure that idle events are still generated + // + // it should return true if more idle events are needed, false if not + virtual bool ProcessIdle(); + + + // Yield-related hooks + // ------------------- + + // process all currently pending events right now + // + // it is an error to call Yield() recursively unless the value of + // onlyIfNeeded is true + // + // WARNING: this function is dangerous as it can lead to unexpected + // reentrancies (i.e. when called from an event handler it + // may result in calling the same event handler again), use + // with _extreme_ care or, better, don't use at all! + bool Yield(bool onlyIfNeeded = false); + virtual bool YieldFor(long eventsToProcess) = 0; + + // returns true if the main thread is inside a Yield() call + virtual bool IsYielding() const + { return m_isInsideYield; } + + // returns true if events of the given event category should be immediately + // processed inside a wxApp::Yield() call or rather should be queued for + // later processing by the main event loop + virtual bool IsEventAllowedInsideYield(wxEventCategory cat) const + { return (m_eventsToProcessInsideYield & cat) != 0; } + + // no SafeYield hooks since it uses wxWindow which is not available when wxUSE_GUI=0 + + + // active loop + // ----------- + + // return currently active (running) event loop, may be NULL + static wxEventLoopBase *GetActive() { return ms_activeLoop; } + + // set currently active (running) event loop + static void SetActive(wxEventLoopBase* loop); + + +protected: + // real implementation of Run() + virtual int DoRun() = 0; + + // this function should be called before the event loop terminates, whether + // this happens normally (because of Exit() call) or abnormally (because of + // an exception thrown from inside the loop) + virtual void OnExit(); + + // Return true if we're currently inside our Run(), even if another nested + // event loop is currently running, unlike IsRunning() (which should have + // been really called IsActive() but it's too late to change this now). + bool IsInsideRun() const { return m_isInsideRun; } + + + // the pointer to currently active loop + static wxEventLoopBase *ms_activeLoop; + + // should we exit the loop? + bool m_shouldExit; + + // YieldFor() helpers: + bool m_isInsideYield; + long m_eventsToProcessInsideYield; + +private: + // this flag is set on entry into Run() and reset before leaving it + bool m_isInsideRun; + + wxDECLARE_NO_COPY_CLASS(wxEventLoopBase); +}; + +#if defined(__WINDOWS__) || defined(__WXMAC__) || defined(__WXDFB__) || (defined(__UNIX__) && !defined(__WXOSX__)) + +// this class can be used to implement a standard event loop logic using +// Pending() and Dispatch() +// +// it also handles idle processing automatically +class WXDLLIMPEXP_BASE wxEventLoopManual : public wxEventLoopBase +{ +public: + wxEventLoopManual(); + + // sets the "should exit" flag and wakes up the loop so that it terminates + // soon + virtual void ScheduleExit(int rc = 0); + +protected: + // enters a loop calling OnNextIteration(), Pending() and Dispatch() and + // terminating when Exit() is called + virtual int DoRun(); + + // may be overridden to perform some action at the start of each new event + // loop iteration + virtual void OnNextIteration() { } + + + // the loop exit code + int m_exitcode; + +private: + // process all already pending events and dispatch a new one (blocking + // until it appears in the event queue if necessary) + // + // returns the return value of Dispatch() + bool ProcessEvents(); + + wxDECLARE_NO_COPY_CLASS(wxEventLoopManual); +}; + +#endif // platforms using "manual" loop + +// we're moving away from old m_impl wxEventLoop model as otherwise the user +// code doesn't have access to platform-specific wxEventLoop methods and this +// can sometimes be very useful (e.g. under MSW this is necessary for +// integration with MFC) but currently this is not done for all ports yet (e.g. +// wxX11) so fall back to the old wxGUIEventLoop definition below for them + +#if defined(__DARWIN__) + // CoreFoundation-based event loop is currently in wxBase so include it in + // any case too (although maybe it actually shouldn't be there at all) + #include "wx/osx/core/evtloop.h" +#endif + +// include the header defining wxConsoleEventLoop +#if defined(__UNIX__) && !defined(__WXMSW__) + #include "wx/unix/evtloop.h" +#elif defined(__WINDOWS__) + #include "wx/msw/evtloopconsole.h" +#endif + +#if wxUSE_GUI + +// include the appropriate header defining wxGUIEventLoop + +#if defined(__WXMSW__) + #include "wx/msw/evtloop.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/evtloop.h" +#elif defined(__WXOSX__) + #include "wx/osx/evtloop.h" +#elif defined(__WXDFB__) + #include "wx/dfb/evtloop.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/evtloop.h" +#else // other platform + +#include "wx/stopwatch.h" // for wxMilliClock_t + +class WXDLLIMPEXP_FWD_CORE wxEventLoopImpl; + +class WXDLLIMPEXP_CORE wxGUIEventLoop : public wxEventLoopBase +{ +public: + wxGUIEventLoop() { m_impl = NULL; } + virtual ~wxGUIEventLoop(); + + virtual void ScheduleExit(int rc = 0); + virtual bool Pending() const; + virtual bool Dispatch(); + virtual int DispatchTimeout(unsigned long timeout) + { + // TODO: this is, of course, horribly inefficient and a proper wait with + // timeout should be implemented for all ports natively... + const wxMilliClock_t timeEnd = wxGetLocalTimeMillis() + timeout; + for ( ;; ) + { + if ( Pending() ) + return Dispatch(); + + if ( wxGetLocalTimeMillis() >= timeEnd ) + return -1; + } + } + virtual void WakeUp() { } + virtual bool YieldFor(long eventsToProcess); + +protected: + virtual int DoRun(); + + // the pointer to the port specific implementation class + wxEventLoopImpl *m_impl; + + wxDECLARE_NO_COPY_CLASS(wxGUIEventLoop); +}; + +#endif // platforms + +#endif // wxUSE_GUI + +#if wxUSE_GUI + // we use a class rather than a typedef because wxEventLoop is + // forward-declared in many places + class wxEventLoop : public wxGUIEventLoop { }; +#else // !wxUSE_GUI + // we can't define wxEventLoop differently in GUI and base libraries so use + // a #define to still allow writing wxEventLoop in the user code + #if wxUSE_CONSOLE_EVENTLOOP && (defined(__WINDOWS__) || defined(__UNIX__)) + #define wxEventLoop wxConsoleEventLoop + #else // we still must define it somehow for the code below... + #define wxEventLoop wxEventLoopBase + #endif +#endif + +inline bool wxEventLoopBase::IsRunning() const { return GetActive() == this; } + +#if wxUSE_GUI && !defined(__WXOSX__) +// ---------------------------------------------------------------------------- +// wxModalEventLoop +// ---------------------------------------------------------------------------- + +// this is a naive generic implementation which uses wxWindowDisabler to +// implement modality, we will surely need platform-specific implementations +// too, this generic implementation is here only temporarily to see how it +// works +class WXDLLIMPEXP_CORE wxModalEventLoop : public wxGUIEventLoop +{ +public: + wxModalEventLoop(wxWindow *winModal) + { + m_windowDisabler = new wxWindowDisabler(winModal); + } + +protected: + virtual void OnExit() + { + delete m_windowDisabler; + m_windowDisabler = NULL; + + wxGUIEventLoop::OnExit(); + } + +private: + wxWindowDisabler *m_windowDisabler; +}; + +#endif //wxUSE_GUI + +// ---------------------------------------------------------------------------- +// wxEventLoopActivator: helper class for wxEventLoop implementations +// ---------------------------------------------------------------------------- + +// this object sets the wxEventLoop given to the ctor as the currently active +// one and unsets it in its dtor, this is especially useful in presence of +// exceptions but is more tidy even when we don't use them +class wxEventLoopActivator +{ +public: + wxEventLoopActivator(wxEventLoopBase *evtLoop) + { + m_evtLoopOld = wxEventLoopBase::GetActive(); + wxEventLoopBase::SetActive(evtLoop); + } + + ~wxEventLoopActivator() + { + // restore the previously active event loop + wxEventLoopBase::SetActive(m_evtLoopOld); + } + +private: + wxEventLoopBase *m_evtLoopOld; +}; + +#if wxUSE_CONSOLE_EVENTLOOP + +class wxEventLoopGuarantor +{ +public: + wxEventLoopGuarantor() + { + m_evtLoopNew = NULL; + if (!wxEventLoop::GetActive()) + { + m_evtLoopNew = new wxEventLoop; + wxEventLoop::SetActive(m_evtLoopNew); + } + } + + ~wxEventLoopGuarantor() + { + if (m_evtLoopNew) + { + wxEventLoop::SetActive(NULL); + delete m_evtLoopNew; + } + } + +private: + wxEventLoop *m_evtLoopNew; +}; + +#endif // wxUSE_CONSOLE_EVENTLOOP + +#endif // _WX_EVTLOOP_H_ diff --git a/wxmsw/include/wx-3.0/wx/evtloopsrc.h b/wxmsw/include/wx-3.0/wx/evtloopsrc.h new file mode 100644 index 00000000..cb3e5c6a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/evtloopsrc.h @@ -0,0 +1,103 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/evtloopsrc.h +// Purpose: declaration of wxEventLoopSource class +// Author: Vadim Zeitlin +// Created: 2009-10-21 +// Copyright: (c) 2009 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_EVTLOOPSRC_H_ +#define _WX_EVTLOOPSRC_H_ + +// Include the header to get wxUSE_EVENTLOOP_SOURCE definition from it. +#include "wx/evtloop.h" + +// ---------------------------------------------------------------------------- +// wxEventLoopSource: a source of events which may be added to wxEventLoop +// ---------------------------------------------------------------------------- + +// TODO: refactor wxSocket under Unix to reuse wxEventLoopSource instead of +// duplicating much of its logic +// +// TODO: freeze the API and document it + +#if wxUSE_EVENTLOOP_SOURCE + +#define wxTRACE_EVT_SOURCE "EventSource" + +// handler used to process events on event loop sources +class wxEventLoopSourceHandler +{ +public: + // called when descriptor is available for non-blocking read + virtual void OnReadWaiting() = 0; + + // called when descriptor is available for non-blocking write + virtual void OnWriteWaiting() = 0; + + // called when there is exception on descriptor + virtual void OnExceptionWaiting() = 0; + + // virtual dtor for the base class + virtual ~wxEventLoopSourceHandler() { } +}; + +// flags describing which kind of IO events we're interested in +enum +{ + wxEVENT_SOURCE_INPUT = 0x01, + wxEVENT_SOURCE_OUTPUT = 0x02, + wxEVENT_SOURCE_EXCEPTION = 0x04, + wxEVENT_SOURCE_ALL = wxEVENT_SOURCE_INPUT | + wxEVENT_SOURCE_OUTPUT | + wxEVENT_SOURCE_EXCEPTION +}; + +// wxEventLoopSource itself is an ABC and can't be created directly, currently +// the only way to create it is by using wxEventLoop::AddSourceForFD(). +class wxEventLoopSource +{ +public: + // dtor is pure virtual because it must be overridden to remove the source + // from the event loop monitoring it + virtual ~wxEventLoopSource() = 0; + + void SetHandler(wxEventLoopSourceHandler* handler) { m_handler = handler; } + wxEventLoopSourceHandler* GetHandler() const { return m_handler; } + + void SetFlags(int flags) { m_flags = flags; } + int GetFlags() const { return m_flags; } + +protected: + // ctor is only used by the derived classes + wxEventLoopSource(wxEventLoopSourceHandler *handler, int flags) + : m_handler(handler), + m_flags(flags) + { + } + + wxEventLoopSourceHandler* m_handler; + int m_flags; + + wxDECLARE_NO_COPY_CLASS(wxEventLoopSource); +}; + +inline wxEventLoopSource::~wxEventLoopSource() { } + +#if defined(__UNIX__) + #include "wx/unix/evtloopsrc.h" +#endif // __UNIX__ + +#if defined(__WXGTK20__) + #include "wx/gtk/evtloopsrc.h" +#endif + +#if defined(__DARWIN__) + #include "wx/osx/evtloopsrc.h" +#endif + +#endif // wxUSE_EVENTLOOP_SOURCE + +#endif // _WX_EVTLOOPSRC_H_ + diff --git a/wxmsw/include/wx-3.0/wx/except.h b/wxmsw/include/wx-3.0/wx/except.h new file mode 100644 index 00000000..75589163 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/except.h @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/except.h +// Purpose: C++ exception related stuff +// Author: Vadim Zeitlin +// Modified by: +// Created: 17.09.2003 +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_EXCEPT_H_ +#define _WX_EXCEPT_H_ + +#include "wx/defs.h" + +// ---------------------------------------------------------------------------- +// macros working whether wxUSE_EXCEPTIONS is 0 or 1 +// ---------------------------------------------------------------------------- + +// even if the library itself was compiled with exceptions support, the user +// code using it might be compiling with a compiler switch disabling them in +// which cases we shouldn't use try/catch in the headers -- this results in +// compilation errors in e.g. wx/scopeguard.h with at least g++ 4 +#if !wxUSE_EXCEPTIONS || \ + (defined(__GNUG__) && !defined(__EXCEPTIONS)) + #ifndef wxNO_EXCEPTIONS + #define wxNO_EXCEPTIONS + #endif +#endif + +#ifdef wxNO_EXCEPTIONS + #define wxTRY + #define wxCATCH_ALL(code) +#else // do use exceptions + #define wxTRY try + #define wxCATCH_ALL(code) catch ( ... ) { code } +#endif // wxNO_EXCEPTIONS/!wxNO_EXCEPTIONS + +#endif // _WX_EXCEPT_H_ + diff --git a/wxmsw/include/wx-3.0/wx/fdrepdlg.h b/wxmsw/include/wx-3.0/wx/fdrepdlg.h new file mode 100644 index 00000000..709dcb15 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fdrepdlg.h @@ -0,0 +1,203 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fdrepdlg.h +// Purpose: wxFindReplaceDialog class +// Author: Markus Greither and Vadim Zeitlin +// Modified by: +// Created: 23/03/2001 +// Copyright: (c) Markus Greither +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FINDREPLACEDLG_H_ +#define _WX_FINDREPLACEDLG_H_ + +#include "wx/defs.h" + +#if wxUSE_FINDREPLDLG + +#include "wx/dialog.h" + +class WXDLLIMPEXP_FWD_CORE wxFindDialogEvent; +class WXDLLIMPEXP_FWD_CORE wxFindReplaceDialog; +class WXDLLIMPEXP_FWD_CORE wxFindReplaceData; +class WXDLLIMPEXP_FWD_CORE wxFindReplaceDialogImpl; + +// ---------------------------------------------------------------------------- +// Flags for wxFindReplaceData.Flags +// ---------------------------------------------------------------------------- + +// flages used by wxFindDialogEvent::GetFlags() +enum wxFindReplaceFlags +{ + // downward search/replace selected (otherwise - upwards) + wxFR_DOWN = 1, + + // whole word search/replace selected + wxFR_WHOLEWORD = 2, + + // case sensitive search/replace selected (otherwise - case insensitive) + wxFR_MATCHCASE = 4 +}; + +// these flags can be specified in wxFindReplaceDialog ctor or Create() +enum wxFindReplaceDialogStyles +{ + // replace dialog (otherwise find dialog) + wxFR_REPLACEDIALOG = 1, + + // don't allow changing the search direction + wxFR_NOUPDOWN = 2, + + // don't allow case sensitive searching + wxFR_NOMATCHCASE = 4, + + // don't allow whole word searching + wxFR_NOWHOLEWORD = 8 +}; + +// ---------------------------------------------------------------------------- +// wxFindReplaceData: holds Setup Data/Feedback Data for wxFindReplaceDialog +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFindReplaceData : public wxObject +{ +public: + wxFindReplaceData() { Init(); } + wxFindReplaceData(wxUint32 flags) { Init(); SetFlags(flags); } + + // accessors + const wxString& GetFindString() const { return m_FindWhat; } + const wxString& GetReplaceString() const { return m_ReplaceWith; } + + int GetFlags() const { return m_Flags; } + + // setters: may only be called before showing the dialog, no effect later + void SetFlags(wxUint32 flags) { m_Flags = flags; } + + void SetFindString(const wxString& str) { m_FindWhat = str; } + void SetReplaceString(const wxString& str) { m_ReplaceWith = str; } + +protected: + void Init(); + +private: + wxUint32 m_Flags; + wxString m_FindWhat, + m_ReplaceWith; + + friend class wxFindReplaceDialogBase; +}; + +// ---------------------------------------------------------------------------- +// wxFindReplaceDialogBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFindReplaceDialogBase : public wxDialog +{ +public: + // ctors and such + wxFindReplaceDialogBase() { m_FindReplaceData = NULL; } + wxFindReplaceDialogBase(wxWindow * WXUNUSED(parent), + wxFindReplaceData *data, + const wxString& WXUNUSED(title), + int WXUNUSED(style) = 0) + { + m_FindReplaceData = data; + } + + virtual ~wxFindReplaceDialogBase(); + + // find dialog data access + const wxFindReplaceData *GetData() const { return m_FindReplaceData; } + void SetData(wxFindReplaceData *data) { m_FindReplaceData = data; } + + // implementation only, don't use + void Send(wxFindDialogEvent& event); + +protected: + wxFindReplaceData *m_FindReplaceData; + + // the last string we searched for + wxString m_lastSearch; + + wxDECLARE_NO_COPY_CLASS(wxFindReplaceDialogBase); +}; + +// include wxFindReplaceDialog declaration +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) && !defined(__WXWINCE__) + #include "wx/msw/fdrepdlg.h" +#else + #define wxGenericFindReplaceDialog wxFindReplaceDialog + + #include "wx/generic/fdrepdlg.h" +#endif + +// ---------------------------------------------------------------------------- +// wxFindReplaceDialog events +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFindDialogEvent : public wxCommandEvent +{ +public: + wxFindDialogEvent(wxEventType commandType = wxEVT_NULL, int id = 0) + : wxCommandEvent(commandType, id) { } + wxFindDialogEvent(const wxFindDialogEvent& event) + : wxCommandEvent(event), m_strReplace(event.m_strReplace) { } + + int GetFlags() const { return GetInt(); } + wxString GetFindString() const { return GetString(); } + const wxString& GetReplaceString() const { return m_strReplace; } + + wxFindReplaceDialog *GetDialog() const + { return wxStaticCast(GetEventObject(), wxFindReplaceDialog); } + + // implementation only + void SetFlags(int flags) { SetInt(flags); } + void SetFindString(const wxString& str) { SetString(str); } + void SetReplaceString(const wxString& str) { m_strReplace = str; } + + virtual wxEvent *Clone() const { return new wxFindDialogEvent(*this); } + +private: + wxString m_strReplace; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxFindDialogEvent) +}; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FIND, wxFindDialogEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FIND_NEXT, wxFindDialogEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FIND_REPLACE, wxFindDialogEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FIND_REPLACE_ALL, wxFindDialogEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FIND_CLOSE, wxFindDialogEvent ); + +typedef void (wxEvtHandler::*wxFindDialogEventFunction)(wxFindDialogEvent&); + +#define wxFindDialogEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxFindDialogEventFunction, func) + +#define EVT_FIND(id, fn) \ + wx__DECLARE_EVT1(wxEVT_FIND, id, wxFindDialogEventHandler(fn)) + +#define EVT_FIND_NEXT(id, fn) \ + wx__DECLARE_EVT1(wxEVT_FIND_NEXT, id, wxFindDialogEventHandler(fn)) + +#define EVT_FIND_REPLACE(id, fn) \ + wx__DECLARE_EVT1(wxEVT_FIND_REPLACE, id, wxFindDialogEventHandler(fn)) + +#define EVT_FIND_REPLACE_ALL(id, fn) \ + wx__DECLARE_EVT1(wxEVT_FIND_REPLACE_ALL, id, wxFindDialogEventHandler(fn)) + +#define EVT_FIND_CLOSE(id, fn) \ + wx__DECLARE_EVT1(wxEVT_FIND_CLOSE, id, wxFindDialogEventHandler(fn)) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_FIND wxEVT_FIND +#define wxEVT_COMMAND_FIND_NEXT wxEVT_FIND_NEXT +#define wxEVT_COMMAND_FIND_REPLACE wxEVT_FIND_REPLACE +#define wxEVT_COMMAND_FIND_REPLACE_ALL wxEVT_FIND_REPLACE_ALL +#define wxEVT_COMMAND_FIND_CLOSE wxEVT_FIND_CLOSE + +#endif // wxUSE_FINDREPLDLG + +#endif + // _WX_FDREPDLG_H diff --git a/wxmsw/include/wx-3.0/wx/features.h b/wxmsw/include/wx-3.0/wx/features.h new file mode 100644 index 00000000..765f0f7f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/features.h @@ -0,0 +1,126 @@ +/** +* Name: wx/features.h +* Purpose: test macros for the features which might be available in some +* wxWidgets ports but not others +* Author: Vadim Zeitlin +* Modified by: Ryan Norton (Converted to C) +* Created: 18.03.02 +* Copyright: (c) 2002 Vadim Zeitlin +* Licence: wxWindows licence +*/ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_FEATURES_H_ +#define _WX_FEATURES_H_ + +/* radio menu items are currently not implemented in wxMotif, use this + symbol (kept for compatibility from the time when they were not implemented + under other platforms as well) to test for this */ +#if !defined(__WXMOTIF__) + #define wxHAS_RADIO_MENU_ITEMS +#else + #undef wxHAS_RADIO_MENU_ITEMS +#endif + +/* the raw keyboard codes are generated under wxGTK and wxMSW only */ +#if defined(__WXGTK__) || defined(__WXMSW__) || defined(__WXMAC__) \ + || defined(__WXDFB__) + #define wxHAS_RAW_KEY_CODES +#else + #undef wxHAS_RAW_KEY_CODES +#endif + +/* taskbar is implemented in the major ports */ +#if defined(__WXMSW__) || defined(__WXCOCOA__) \ + || defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXX11__) \ + || defined(__WXOSX_MAC__) || defined(__WXCOCOA__) + #define wxHAS_TASK_BAR_ICON +#else + #undef wxUSE_TASKBARICON + #define wxUSE_TASKBARICON 0 + #undef wxHAS_TASK_BAR_ICON +#endif + +/* wxIconLocation appeared in the middle of 2.5.0 so it's handy to have a */ +/* separate define for it */ +#define wxHAS_ICON_LOCATION + +/* same for wxCrashReport */ +#ifdef __WXMSW__ + #define wxHAS_CRASH_REPORT +#else + #undef wxHAS_CRASH_REPORT +#endif + +/* wxRE_ADVANCED is not always available, depending on regex library used + * (it's unavailable only if compiling via configure against system library) */ +#ifndef WX_NO_REGEX_ADVANCED + #define wxHAS_REGEX_ADVANCED +#else + #undef wxHAS_REGEX_ADVANCED +#endif + +/* Pango-based ports and wxDFB use UTF-8 for text and font encodings + * internally and so their fonts can handle any encodings: */ +#if wxUSE_PANGO || defined(__WXDFB__) + #define wxHAS_UTF8_FONTS +#endif + +/* This is defined when the underlying toolkit handles tab traversal natively. + Otherwise we implement it ourselves in wxControlContainer. */ +#ifdef __WXGTK20__ + #define wxHAS_NATIVE_TAB_TRAVERSAL +#endif + +/* This is defined when the compiler provides some type of extended locale + functions. Otherwise, we implement them ourselves to only support the + 'C' locale */ +#if defined(HAVE_LOCALE_T) || \ + (wxCHECK_VISUALC_VERSION(8) && !defined(__WXWINCE__)) + #define wxHAS_XLOCALE_SUPPORT +#else + #undef wxHAS_XLOCALE_SUPPORT +#endif + +/* Direct access to bitmap data is not implemented in all ports yet */ +#if defined(__WXGTK20__) || defined(__WXMAC__) || defined(__WXDFB__) || \ + defined(__WXMSW__) + + /* + These compilers can't deal with templates in wx/rawbmp.h: + - HP aCC for PA-RISC + - Watcom < 1.8 + */ + #if !wxONLY_WATCOM_EARLIER_THAN(1, 8) && \ + !(defined(__HP_aCC) && defined(__hppa)) + #define wxHAS_RAW_BITMAP + #endif +#endif + +/* also define deprecated synonym which exists for compatibility only */ +#ifdef wxHAS_RAW_BITMAP + #define wxHAVE_RAW_BITMAP +#endif + +/* + If this is defined, wxEvtHandler::Bind<>() is available (not all compilers + have the required template support for this and in particular under Windows + where only g++ and MSVC >= 7 currently support it. + + Recent Sun CC versions support this but perhaps older ones can compile this + code too, adjust the version check if this is the case (unfortunately we + can't easily test for the things used in wx/event.h in configure so we have + to maintain these checks manually). The same applies to xlC 7: perhaps + earlier versions can compile this code too but they were not tested. + */ +#if wxCHECK_GCC_VERSION(3, 2) || wxCHECK_VISUALC_VERSION(7) \ + || (defined(__SUNCC__) && __SUNCC__ >= 0x5100) \ + || (defined(__xlC__) && __xlC__ >= 0x700) \ + || defined(__INTELC__) + #define wxHAS_EVENT_BIND +#endif + + +#endif /* _WX_FEATURES_H_ */ + diff --git a/wxmsw/include/wx-3.0/wx/ffile.h b/wxmsw/include/wx-3.0/wx/ffile.h new file mode 100644 index 00000000..91a7c28e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ffile.h @@ -0,0 +1,109 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/ffile.h +// Purpose: wxFFile - encapsulates "FILE *" stream +// Author: Vadim Zeitlin +// Modified by: +// Created: 14.07.99 +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FFILE_H_ +#define _WX_FFILE_H_ + +#include "wx/defs.h" // for wxUSE_FFILE + +#if wxUSE_FFILE + +#include "wx/string.h" +#include "wx/filefn.h" +#include "wx/convauto.h" + +#include + +// ---------------------------------------------------------------------------- +// class wxFFile: standard C stream library IO +// +// NB: for space efficiency this class has no virtual functions, including +// dtor which is _not_ virtual, so it shouldn't be used as a base class. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFFile +{ +public: + // ctors + // ----- + // def ctor + wxFFile() { m_fp = NULL; } + // open specified file (may fail, use IsOpened()) + wxFFile(const wxString& filename, const wxString& mode = wxT("r")); + // attach to (already opened) file + wxFFile(FILE *lfp) { m_fp = lfp; } + + // open/close + // open a file (existing or not - the mode controls what happens) + bool Open(const wxString& filename, const wxString& mode = wxT("r")); + // closes the opened file (this is a NOP if not opened) + bool Close(); + + // assign an existing file descriptor and get it back from wxFFile object + void Attach(FILE *lfp, const wxString& name = wxEmptyString) + { Close(); m_fp = lfp; m_name = name; } + FILE* Detach() { FILE* fpOld = m_fp; m_fp = NULL; return fpOld; } + FILE *fp() const { return m_fp; } + + // read/write (unbuffered) + // read all data from the file into a string (useful for text files) + bool ReadAll(wxString *str, const wxMBConv& conv = wxConvAuto()); + // returns number of bytes read - use Eof() and Error() to see if an error + // occurred or not + size_t Read(void *pBuf, size_t nCount); + // returns the number of bytes written + size_t Write(const void *pBuf, size_t nCount); + // returns true on success + bool Write(const wxString& s, const wxMBConv& conv = wxConvAuto()); + // flush data not yet written + bool Flush(); + + // file pointer operations (return ofsInvalid on failure) + // move ptr ofs bytes related to start/current pos/end of file + bool Seek(wxFileOffset ofs, wxSeekMode mode = wxFromStart); + // move ptr to ofs bytes before the end + bool SeekEnd(wxFileOffset ofs = 0) { return Seek(ofs, wxFromEnd); } + // get current position in the file + wxFileOffset Tell() const; + // get current file length + wxFileOffset Length() const; + + // simple accessors: note that Eof() and Error() may only be called if + // IsOpened()! + // is file opened? + bool IsOpened() const { return m_fp != NULL; } + // is end of file reached? + bool Eof() const { return feof(m_fp) != 0; } + // has an error occurred? + bool Error() const { return ferror(m_fp) != 0; } + // get the file name + const wxString& GetName() const { return m_name; } + // type such as disk or pipe + wxFileKind GetKind() const { return wxGetFileKind(m_fp); } + + // dtor closes the file if opened + ~wxFFile() { Close(); } + +private: + // copy ctor and assignment operator are private because it doesn't make + // sense to copy files this way: attempt to do it will provoke a compile-time + // error. + wxFFile(const wxFFile&); + wxFFile& operator=(const wxFFile&); + + FILE *m_fp; // IO stream or NULL if not opened + + wxString m_name; // the name of the file (for diagnostic messages) +}; + +#endif // wxUSE_FFILE + +#endif // _WX_FFILE_H_ + diff --git a/wxmsw/include/wx-3.0/wx/file.h b/wxmsw/include/wx-3.0/wx/file.h new file mode 100644 index 00000000..00ac471a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/file.h @@ -0,0 +1,190 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/file.h +// Purpose: wxFile - encapsulates low-level "file descriptor" +// wxTempFile - safely replace the old file +// Author: Vadim Zeitlin +// Modified by: +// Created: 29/01/98 +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FILEH__ +#define _WX_FILEH__ + +#include "wx/defs.h" + +#if wxUSE_FILE + +#include "wx/string.h" +#include "wx/filefn.h" +#include "wx/convauto.h" + +// ---------------------------------------------------------------------------- +// class wxFile: raw file IO +// +// NB: for space efficiency this class has no virtual functions, including +// dtor which is _not_ virtual, so it shouldn't be used as a base class. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFile +{ +public: + // more file constants + // ------------------- + // opening mode + enum OpenMode { read, write, read_write, write_append, write_excl }; + // standard values for file descriptor + enum { fd_invalid = -1, fd_stdin, fd_stdout, fd_stderr }; + + // static functions + // ---------------- + // check whether a regular file by this name exists + static bool Exists(const wxString& name); + // check whether we can access the given file in given mode + // (only read and write make sense here) + static bool Access(const wxString& name, OpenMode mode); + + // ctors + // ----- + // def ctor + wxFile() { m_fd = fd_invalid; m_lasterror = 0; } + // open specified file (may fail, use IsOpened()) + wxFile(const wxString& fileName, OpenMode mode = read); + // attach to (already opened) file + wxFile(int lfd) { m_fd = lfd; m_lasterror = 0; } + + // open/close + // create a new file (with the default value of bOverwrite, it will fail if + // the file already exists, otherwise it will overwrite it and succeed) + bool Create(const wxString& fileName, bool bOverwrite = false, + int access = wxS_DEFAULT); + bool Open(const wxString& fileName, OpenMode mode = read, + int access = wxS_DEFAULT); + bool Close(); // Close is a NOP if not opened + + // assign an existing file descriptor and get it back from wxFile object + void Attach(int lfd) { Close(); m_fd = lfd; m_lasterror = 0; } + int Detach() { int fdOld = m_fd; m_fd = fd_invalid; return fdOld; } + int fd() const { return m_fd; } + + // read/write (unbuffered) + // read all data from the file into a string (useful for text files) + bool ReadAll(wxString *str, const wxMBConv& conv = wxConvAuto()); + // returns number of bytes read or wxInvalidOffset on error + ssize_t Read(void *pBuf, size_t nCount); + // returns the number of bytes written + size_t Write(const void *pBuf, size_t nCount); + // returns true on success + bool Write(const wxString& s, const wxMBConv& conv = wxConvAuto()); + // flush data not yet written + bool Flush(); + + // file pointer operations (return wxInvalidOffset on failure) + // move ptr ofs bytes related to start/current offset/end of file + wxFileOffset Seek(wxFileOffset ofs, wxSeekMode mode = wxFromStart); + // move ptr to ofs bytes before the end + wxFileOffset SeekEnd(wxFileOffset ofs = 0) { return Seek(ofs, wxFromEnd); } + // get current offset + wxFileOffset Tell() const; + // get current file length + wxFileOffset Length() const; + + // simple accessors + // is file opened? + bool IsOpened() const { return m_fd != fd_invalid; } + // is end of file reached? + bool Eof() const; + // has an error occurred? + bool Error() const { return m_lasterror != 0; } + // get last errno + int GetLastError() const { return m_lasterror; } + // reset error state + void ClearLastError() { m_lasterror = 0; } + // type such as disk or pipe + wxFileKind GetKind() const { return wxGetFileKind(m_fd); } + + + // dtor closes the file if opened + ~wxFile() { Close(); } + +private: + // copy ctor and assignment operator are private because + // it doesn't make sense to copy files this way: + // attempt to do it will provoke a compile-time error. + wxFile(const wxFile&); + wxFile& operator=(const wxFile&); + + // Copy the value of errno into m_lasterror if rc == -1 and return true in + // this case (indicating that we've got an error). Otherwise return false. + // + // Notice that we use the possibly 64 bit wxFileOffset instead of int here so + // that it works for checking the result of functions such as tell() too. + bool CheckForError(wxFileOffset rc) const; + + + int m_fd; // file descriptor or INVALID_FD if not opened + int m_lasterror; // errno value of last error +}; + +// ---------------------------------------------------------------------------- +// class wxTempFile: if you want to replace another file, create an instance +// of wxTempFile passing the name of the file to be replaced to the ctor. Then +// you can write to wxTempFile and call Commit() function to replace the old +// file (and close this one) or call Discard() to cancel the modification. If +// you call neither of them, dtor will call Discard(). +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxTempFile +{ +public: + // ctors + // default + wxTempFile() { } + // associates the temp file with the file to be replaced and opens it + wxTempFile(const wxString& strName); + + // open the temp file (strName is the name of file to be replaced) + bool Open(const wxString& strName); + + // is the file opened? + bool IsOpened() const { return m_file.IsOpened(); } + // get current file length + wxFileOffset Length() const { return m_file.Length(); } + // move ptr ofs bytes related to start/current offset/end of file + wxFileOffset Seek(wxFileOffset ofs, wxSeekMode mode = wxFromStart) + { return m_file.Seek(ofs, mode); } + // get current offset + wxFileOffset Tell() const { return m_file.Tell(); } + + // I/O (both functions return true on success, false on failure) + bool Write(const void *p, size_t n) { return m_file.Write(p, n) == n; } + bool Write(const wxString& str, const wxMBConv& conv = wxMBConvUTF8()) + { return m_file.Write(str, conv); } + + // flush data: can be called before closing file to ensure that data was + // correctly written out + bool Flush() { return m_file.Flush(); } + + // different ways to close the file + // validate changes and delete the old file of name m_strName + bool Commit(); + // discard changes + void Discard(); + + // dtor calls Discard() if file is still opened + ~wxTempFile(); + +private: + // no copy ctor/assignment operator + wxTempFile(const wxTempFile&); + wxTempFile& operator=(const wxTempFile&); + + wxString m_strName, // name of the file to replace in Commit() + m_strTemp; // temporary file name + wxFile m_file; // the temporary file +}; + +#endif // wxUSE_FILE + +#endif // _WX_FILEH__ diff --git a/wxmsw/include/wx-3.0/wx/fileconf.h b/wxmsw/include/wx-3.0/wx/fileconf.h new file mode 100644 index 00000000..c16129a5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fileconf.h @@ -0,0 +1,263 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/fileconf.h +// Purpose: wxFileConfig derivation of wxConfigBase +// Author: Vadim Zeitlin +// Modified by: +// Created: 07.04.98 (adapted from appconf.cpp) +// Copyright: (c) 1997 Karsten Ballueder & Vadim Zeitlin +// Ballueder@usa.net +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _FILECONF_H +#define _FILECONF_H + +#include "wx/defs.h" + +#if wxUSE_CONFIG + +#include "wx/textfile.h" +#include "wx/string.h" +#include "wx/confbase.h" +#include "wx/filename.h" + +// ---------------------------------------------------------------------------- +// wxFileConfig +// ---------------------------------------------------------------------------- + +/* + wxFileConfig derives from base Config and implements file based config class, + i.e. it uses ASCII disk files to store the information. These files are + alternatively called INI, .conf or .rc in the documentation. They are + organized in groups or sections, which can nest (i.e. a group contains + subgroups, which contain their own subgroups &c). Each group has some + number of entries, which are "key = value" pairs. More precisely, the format + is: + + # comments are allowed after either ';' or '#' (Win/UNIX standard) + + # blank lines (as above) are ignored + + # global entries are members of special (no name) top group + written_for = Windows + platform = Linux + + # the start of the group 'Foo' + [Foo] # may put comments like this also + # following 3 lines are entries + key = value + another_key = " strings with spaces in the beginning should be quoted, \ + otherwise the spaces are lost" + last_key = but you don't have to put " normally (nor quote them, like here) + + # subgroup of the group 'Foo' + # (order is not important, only the name is: separator is '/', as in paths) + [Foo/Bar] + # entries prefixed with "!" are immutable, i.e. can't be changed if they are + # set in the system-wide config file + !special_key = value + bar_entry = whatever + + [Foo/Bar/Fubar] # depth is (theoretically :-) unlimited + # may have the same name as key in another section + bar_entry = whatever not + + You have {read/write/delete}Entry functions (guess what they do) and also + setCurrentPath to select current group. enum{Subgroups/Entries} allow you + to get all entries in the config file (in the current group). Finally, + flush() writes immediately all changed entries to disk (otherwise it would + be done automatically in dtor) + + wxFileConfig manages not less than 2 config files for each program: global + and local (or system and user if you prefer). Entries are read from both of + them and the local entries override the global ones unless the latter is + immutable (prefixed with '!') in which case a warning message is generated + and local value is ignored. Of course, the changes are always written to local + file only. + + The names of these files can be specified in a number of ways. First of all, + you can use the standard convention: using the ctor which takes 'strAppName' + parameter will probably be sufficient for 90% of cases. If, for whatever + reason you wish to use the files with some other names, you can always use the + second ctor. + + wxFileConfig also may automatically expand the values of environment variables + in the entries it reads: for example, if you have an entry + score_file = $HOME/.score + a call to Read(&str, "score_file") will return a complete path to .score file + unless the expansion was previously disabled with SetExpandEnvVars(false) call + (it's on by default, the current status can be retrieved with + IsExpandingEnvVars function). +*/ +class WXDLLIMPEXP_FWD_BASE wxFileConfigGroup; +class WXDLLIMPEXP_FWD_BASE wxFileConfigEntry; +class WXDLLIMPEXP_FWD_BASE wxFileConfigLineList; + +#if wxUSE_STREAMS +class WXDLLIMPEXP_FWD_BASE wxInputStream; +class WXDLLIMPEXP_FWD_BASE wxOutputStream; +#endif // wxUSE_STREAMS + +class WXDLLIMPEXP_BASE wxFileConfig : public wxConfigBase +{ +public: + // construct the "standard" full name for global (system-wide) and + // local (user-specific) config files from the base file name. + // + // the following are the filenames returned by this functions: + // global local + // Unix /etc/file.ext ~/.file + // Win %windir%\file.ext %USERPROFILE%\file.ext + // + // where file is the basename of szFile, ext is its extension + // or .conf (Unix) or .ini (Win) if it has none + static wxFileName GetGlobalFile(const wxString& szFile); + static wxFileName GetLocalFile(const wxString& szFile, int style = 0); + + static wxString GetGlobalFileName(const wxString& szFile) + { + return GetGlobalFile(szFile).GetFullPath(); + } + + static wxString GetLocalFileName(const wxString& szFile, int style = 0) + { + return GetLocalFile(szFile, style).GetFullPath(); + } + + // ctor & dtor + // New constructor: one size fits all. Specify wxCONFIG_USE_LOCAL_FILE or + // wxCONFIG_USE_GLOBAL_FILE to say which files should be used. + wxFileConfig(const wxString& appName = wxEmptyString, + const wxString& vendorName = wxEmptyString, + const wxString& localFilename = wxEmptyString, + const wxString& globalFilename = wxEmptyString, + long style = wxCONFIG_USE_LOCAL_FILE | wxCONFIG_USE_GLOBAL_FILE, + const wxMBConv& conv = wxConvAuto()); + +#if wxUSE_STREAMS + // ctor that takes an input stream. + wxFileConfig(wxInputStream &inStream, const wxMBConv& conv = wxConvAuto()); +#endif // wxUSE_STREAMS + + // dtor will save unsaved data + virtual ~wxFileConfig(); + + // under Unix, set the umask to be used for the file creation, do nothing + // under other systems +#ifdef __UNIX__ + void SetUmask(int mode) { m_umask = mode; } +#else // !__UNIX__ + void SetUmask(int WXUNUSED(mode)) { } +#endif // __UNIX__/!__UNIX__ + + // implement inherited pure virtual functions + virtual void SetPath(const wxString& strPath); + virtual const wxString& GetPath() const; + + virtual bool GetFirstGroup(wxString& str, long& lIndex) const; + virtual bool GetNextGroup (wxString& str, long& lIndex) const; + virtual bool GetFirstEntry(wxString& str, long& lIndex) const; + virtual bool GetNextEntry (wxString& str, long& lIndex) const; + + virtual size_t GetNumberOfEntries(bool bRecursive = false) const; + virtual size_t GetNumberOfGroups(bool bRecursive = false) const; + + virtual bool HasGroup(const wxString& strName) const; + virtual bool HasEntry(const wxString& strName) const; + + virtual bool Flush(bool bCurrentOnly = false); + + virtual bool RenameEntry(const wxString& oldName, const wxString& newName); + virtual bool RenameGroup(const wxString& oldName, const wxString& newName); + + virtual bool DeleteEntry(const wxString& key, bool bGroupIfEmptyAlso = true); + virtual bool DeleteGroup(const wxString& szKey); + virtual bool DeleteAll(); + + // additional, wxFileConfig-specific, functionality +#if wxUSE_STREAMS + // save the entire config file text to the given stream, note that the text + // won't be saved again in dtor when Flush() is called if you use this method + // as it won't be "changed" any more + virtual bool Save(wxOutputStream& os, const wxMBConv& conv = wxConvAuto()); +#endif // wxUSE_STREAMS + +public: + // functions to work with this list + wxFileConfigLineList *LineListAppend(const wxString& str); + wxFileConfigLineList *LineListInsert(const wxString& str, + wxFileConfigLineList *pLine); // NULL => Prepend() + void LineListRemove(wxFileConfigLineList *pLine); + bool LineListIsEmpty(); + +protected: + virtual bool DoReadString(const wxString& key, wxString *pStr) const; + virtual bool DoReadLong(const wxString& key, long *pl) const; +#if wxUSE_BASE64 + virtual bool DoReadBinary(const wxString& key, wxMemoryBuffer* buf) const; +#endif // wxUSE_BASE64 + + virtual bool DoWriteString(const wxString& key, const wxString& szValue); + virtual bool DoWriteLong(const wxString& key, long lValue); +#if wxUSE_BASE64 + virtual bool DoWriteBinary(const wxString& key, const wxMemoryBuffer& buf); +#endif // wxUSE_BASE64 + +private: + // GetXXXFileName helpers: return ('/' terminated) directory names + static wxString GetGlobalDir(); + static wxString GetLocalDir(int style = 0); + + // common part of all ctors (assumes that m_str{Local|Global}File are already + // initialized + void Init(); + + // common part of from dtor and DeleteAll + void CleanUp(); + + // parse the whole file + void Parse(const wxTextBuffer& buffer, bool bLocal); + + // the same as SetPath("/") + void SetRootPath(); + + // real SetPath() implementation, returns true if path could be set or false + // if path doesn't exist and createMissingComponents == false + bool DoSetPath(const wxString& strPath, bool createMissingComponents); + + // set/test the dirty flag + void SetDirty() { m_isDirty = true; } + void ResetDirty() { m_isDirty = false; } + bool IsDirty() const { return m_isDirty; } + + + // member variables + // ---------------- + wxFileConfigLineList *m_linesHead, // head of the linked list + *m_linesTail; // tail + + wxFileName m_fnLocalFile, // local file name passed to ctor + m_fnGlobalFile; // global + wxString m_strPath; // current path (not '/' terminated) + + wxFileConfigGroup *m_pRootGroup, // the top (unnamed) group + *m_pCurrentGroup; // the current group + + wxMBConv *m_conv; + +#ifdef __UNIX__ + int m_umask; // the umask to use for file creation +#endif // __UNIX__ + + bool m_isDirty; // if true, we have unsaved changes + + wxDECLARE_NO_COPY_CLASS(wxFileConfig); + DECLARE_ABSTRACT_CLASS(wxFileConfig) +}; + +#endif + // wxUSE_CONFIG + +#endif + //_FILECONF_H + diff --git a/wxmsw/include/wx-3.0/wx/filectrl.h b/wxmsw/include/wx-3.0/wx/filectrl.h new file mode 100644 index 00000000..e4c302f7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/filectrl.h @@ -0,0 +1,145 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/filectrl.h +// Purpose: Header for wxFileCtrlBase and other common functions used by +// platform-specific wxFileCtrl's +// Author: Diaa M. Sami +// Modified by: +// Created: Jul-07-2007 +// Copyright: (c) Diaa M. Sami +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FILECTRL_H_BASE_ +#define _WX_FILECTRL_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_FILECTRL + +#include "wx/string.h" +#include "wx/event.h" + +enum +{ + wxFC_OPEN = 0x0001, + wxFC_SAVE = 0x0002, + wxFC_MULTIPLE = 0x0004, + wxFC_NOSHOWHIDDEN = 0x0008 +}; + +#define wxFC_DEFAULT_STYLE wxFC_OPEN +extern WXDLLIMPEXP_DATA_CORE(const char) wxFileCtrlNameStr[]; // in filectrlcmn.cpp + +class WXDLLIMPEXP_CORE wxFileCtrlBase +{ +public: + virtual ~wxFileCtrlBase() {} + + virtual void SetWildcard( const wxString& wildCard ) = 0; + virtual void SetFilterIndex( int filterindex ) = 0; + virtual bool SetDirectory( const wxString& dir ) = 0; + + // Selects a certain file. + // In case the filename specified isn't found/couldn't be shown with + // currently selected filter, false is returned and nothing happens + virtual bool SetFilename( const wxString& name ) = 0; + + // chdirs to a certain directory and selects a certain file. + // In case the filename specified isn't found/couldn't be shown with + // currently selected filter, false is returned and if directory exists + // it's chdir'ed to + virtual bool SetPath( const wxString& path ) = 0; + + virtual wxString GetFilename() const = 0; + virtual wxString GetDirectory() const = 0; + virtual wxString GetWildcard() const = 0; + virtual wxString GetPath() const = 0; + virtual void GetPaths( wxArrayString& paths ) const = 0; + virtual void GetFilenames( wxArrayString& files ) const = 0; + virtual int GetFilterIndex() const = 0; + + virtual bool HasMultipleFileSelection() const = 0; + virtual void ShowHidden(bool show) = 0; +}; + +void GenerateFilterChangedEvent( wxFileCtrlBase *fileCtrl, wxWindow *wnd ); +void GenerateFolderChangedEvent( wxFileCtrlBase *fileCtrl, wxWindow *wnd ); +void GenerateSelectionChangedEvent( wxFileCtrlBase *fileCtrl, wxWindow *wnd ); +void GenerateFileActivatedEvent( wxFileCtrlBase *fileCtrl, wxWindow *wnd, const wxString filename = wxEmptyString ); + +#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + #define wxFileCtrl wxGtkFileCtrl + #include "wx/gtk/filectrl.h" +#else + #define wxFileCtrl wxGenericFileCtrl + #include "wx/generic/filectrlg.h" +#endif + +// Some documentation +// On wxEVT_FILECTRL_FILTERCHANGED, only the value returned by GetFilterIndex is +// valid and it represents the (new) current filter index for the wxFileCtrl. +// On wxEVT_FILECTRL_FOLDERCHANGED, only the value returned by GetDirectory is +// valid and it represents the (new) current directory for the wxFileCtrl. +// On wxEVT_FILECTRL_FILEACTIVATED, GetDirectory returns the current directory +// for the wxFileCtrl and GetFiles returns the names of the file(s) activated. +// On wxEVT_FILECTRL_SELECTIONCHANGED, GetDirectory returns the current directory +// for the wxFileCtrl and GetFiles returns the names of the currently selected +// file(s). +// In wxGTK, after each wxEVT_FILECTRL_FOLDERCHANGED, wxEVT_FILECTRL_SELECTIONCHANGED +// is fired automatically once or more with 0 files. +class WXDLLIMPEXP_CORE wxFileCtrlEvent : public wxCommandEvent +{ +public: + wxFileCtrlEvent() {} + wxFileCtrlEvent( wxEventType type, wxObject *evtObject, int id ) + : wxCommandEvent( type, id ) + { + SetEventObject( evtObject ); + } + + // no need for the copy constructor as the default one will be fine. + virtual wxEvent *Clone() const { return new wxFileCtrlEvent( *this ); } + + void SetFiles( const wxArrayString &files ) { m_files = files; } + void SetDirectory( const wxString &directory ) { m_directory = directory; } + void SetFilterIndex( int filterIndex ) { m_filterIndex = filterIndex; } + + wxArrayString GetFiles() const { return m_files; } + wxString GetDirectory() const { return m_directory; } + int GetFilterIndex() const { return m_filterIndex; } + + wxString GetFile() const; + +protected: + int m_filterIndex; + wxString m_directory; + wxArrayString m_files; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN( wxFileCtrlEvent ) +}; + +typedef void ( wxEvtHandler::*wxFileCtrlEventFunction )( wxFileCtrlEvent& ); + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FILECTRL_SELECTIONCHANGED, wxFileCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FILECTRL_FILEACTIVATED, wxFileCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FILECTRL_FOLDERCHANGED, wxFileCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FILECTRL_FILTERCHANGED, wxFileCtrlEvent ); + +#define wxFileCtrlEventHandler(func) \ + wxEVENT_HANDLER_CAST( wxFileCtrlEventFunction, func ) + +#define EVT_FILECTRL_FILEACTIVATED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_FILECTRL_FILEACTIVATED, id, wxFileCtrlEventHandler(fn)) + +#define EVT_FILECTRL_SELECTIONCHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_FILECTRL_SELECTIONCHANGED, id, wxFileCtrlEventHandler(fn)) + +#define EVT_FILECTRL_FOLDERCHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_FILECTRL_FOLDERCHANGED, id, wxFileCtrlEventHandler(fn)) + +#define EVT_FILECTRL_FILTERCHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_FILECTRL_FILTERCHANGED, id, wxFileCtrlEventHandler(fn)) + +#endif // wxUSE_FILECTRL + +#endif // _WX_FILECTRL_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/filedlg.h b/wxmsw/include/wx-3.0/wx/filedlg.h new file mode 100644 index 00000000..d105493c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/filedlg.h @@ -0,0 +1,248 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/filedlg.h +// Purpose: wxFileDialog base header +// Author: Robert Roebling +// Modified by: +// Created: 8/17/99 +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FILEDLG_H_BASE_ +#define _WX_FILEDLG_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_FILEDLG + +#include "wx/dialog.h" +#include "wx/arrstr.h" + +// this symbol is defined for the platforms which support multiple +// ('|'-separated) filters in the file dialog +#if defined(__WXMSW__) || defined(__WXGTK__) || defined(__WXMAC__) + #define wxHAS_MULTIPLE_FILEDLG_FILTERS +#endif + +//---------------------------------------------------------------------------- +// wxFileDialog data +//---------------------------------------------------------------------------- + +/* + The flags below must coexist with the following flags in m_windowStyle + #define wxCAPTION 0x20000000 + #define wxMAXIMIZE 0x00002000 + #define wxCLOSE_BOX 0x00001000 + #define wxSYSTEM_MENU 0x00000800 + wxBORDER_NONE = 0x00200000 + #define wxRESIZE_BORDER 0x00000040 +*/ + +enum +{ + wxFD_OPEN = 0x0001, + wxFD_SAVE = 0x0002, + wxFD_OVERWRITE_PROMPT = 0x0004, + wxFD_FILE_MUST_EXIST = 0x0010, + wxFD_MULTIPLE = 0x0020, + wxFD_CHANGE_DIR = 0x0080, + wxFD_PREVIEW = 0x0100 +}; + +#if WXWIN_COMPATIBILITY_2_6 +enum +{ + wxOPEN = wxFD_OPEN, + wxSAVE = wxFD_SAVE, + wxOVERWRITE_PROMPT = wxFD_OVERWRITE_PROMPT, + wxFILE_MUST_EXIST = wxFD_FILE_MUST_EXIST, + wxMULTIPLE = wxFD_MULTIPLE, + wxCHANGE_DIR = wxFD_CHANGE_DIR +}; +#endif + +#define wxFD_DEFAULT_STYLE wxFD_OPEN + +extern WXDLLIMPEXP_DATA_CORE(const char) wxFileDialogNameStr[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxFileSelectorPromptStr[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxFileSelectorDefaultWildcardStr[]; + +//---------------------------------------------------------------------------- +// wxFileDialogBase +//---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFileDialogBase: public wxDialog +{ +public: + wxFileDialogBase () { Init(); } + + wxFileDialogBase(wxWindow *parent, + const wxString& message = wxFileSelectorPromptStr, + const wxString& defaultDir = wxEmptyString, + const wxString& defaultFile = wxEmptyString, + const wxString& wildCard = wxFileSelectorDefaultWildcardStr, + long style = wxFD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + const wxString& name = wxFileDialogNameStr) + { + Init(); + Create(parent, message, defaultDir, defaultFile, wildCard, style, pos, sz, name); + } + + virtual ~wxFileDialogBase() {} + + + bool Create(wxWindow *parent, + const wxString& message = wxFileSelectorPromptStr, + const wxString& defaultDir = wxEmptyString, + const wxString& defaultFile = wxEmptyString, + const wxString& wildCard = wxFileSelectorDefaultWildcardStr, + long style = wxFD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + const wxString& name = wxFileDialogNameStr); + + bool HasFdFlag(int flag) const { return HasFlag(flag); } + + virtual void SetMessage(const wxString& message) { m_message = message; } + virtual void SetPath(const wxString& path); + virtual void SetDirectory(const wxString& dir); + virtual void SetFilename(const wxString& name); + virtual void SetWildcard(const wxString& wildCard) { m_wildCard = wildCard; } + virtual void SetFilterIndex(int filterIndex) { m_filterIndex = filterIndex; } + + virtual wxString GetMessage() const { return m_message; } + virtual wxString GetPath() const { return m_path; } + virtual void GetPaths(wxArrayString& paths) const { paths.Empty(); paths.Add(m_path); } + virtual wxString GetDirectory() const { return m_dir; } + virtual wxString GetFilename() const { return m_fileName; } + virtual void GetFilenames(wxArrayString& files) const { files.Empty(); files.Add(m_fileName); } + virtual wxString GetWildcard() const { return m_wildCard; } + virtual int GetFilterIndex() const { return m_filterIndex; } + + virtual wxString GetCurrentlySelectedFilename() const + { return m_currentlySelectedFilename; } + + // this function is called with wxFileDialog as parameter and should + // create the window containing the extra controls we want to show in it + typedef wxWindow *(*ExtraControlCreatorFunction)(wxWindow*); + + virtual bool SupportsExtraControl() const { return false; } + + bool SetExtraControlCreator(ExtraControlCreatorFunction creator); + wxWindow *GetExtraControl() const { return m_extraControl; } + + // Utility functions + +#if WXWIN_COMPATIBILITY_2_6 + + wxDEPRECATED( long GetStyle() const ); + wxDEPRECATED( void SetStyle(long style) ); + +#endif // WXWIN_COMPATIBILITY_2_6 + + + // Append first extension to filePath from a ';' separated extensionList + // if filePath = "path/foo.bar" just return it as is + // if filePath = "foo[.]" and extensionList = "*.jpg;*.png" return "foo.jpg" + // if the extension is "*.j?g" (has wildcards) or "jpg" then return filePath + static wxString AppendExtension(const wxString &filePath, + const wxString &extensionList); + +protected: + wxString m_message; + wxString m_dir; + wxString m_path; // Full path + wxString m_fileName; + wxString m_wildCard; + int m_filterIndex; + + // Currently selected, but not yet necessarily accepted by the user, file. + // This should be updated whenever the selection in the control changes by + // the platform-specific code to provide a useful implementation of + // GetCurrentlySelectedFilename(). + wxString m_currentlySelectedFilename; + + wxWindow* m_extraControl; + + // returns true if control is created (if it already exists returns false) + bool CreateExtraControl(); + // return true if SetExtraControlCreator() was called + bool HasExtraControlCreator() const + { return m_extraControlCreator != NULL; } + // get the size of the extra control by creating and deleting it + wxSize GetExtraControlSize(); + +private: + ExtraControlCreatorFunction m_extraControlCreator; + + void Init(); + DECLARE_DYNAMIC_CLASS(wxFileDialogBase) + wxDECLARE_NO_COPY_CLASS(wxFileDialogBase); +}; + + +//---------------------------------------------------------------------------- +// wxFileDialog convenience functions +//---------------------------------------------------------------------------- + +// File selector - backward compatibility +WXDLLIMPEXP_CORE wxString +wxFileSelector(const wxString& message = wxFileSelectorPromptStr, + const wxString& default_path = wxEmptyString, + const wxString& default_filename = wxEmptyString, + const wxString& default_extension = wxEmptyString, + const wxString& wildcard = wxFileSelectorDefaultWildcardStr, + int flags = 0, + wxWindow *parent = NULL, + int x = wxDefaultCoord, int y = wxDefaultCoord); + +// An extended version of wxFileSelector +WXDLLIMPEXP_CORE wxString +wxFileSelectorEx(const wxString& message = wxFileSelectorPromptStr, + const wxString& default_path = wxEmptyString, + const wxString& default_filename = wxEmptyString, + int *indexDefaultExtension = NULL, + const wxString& wildcard = wxFileSelectorDefaultWildcardStr, + int flags = 0, + wxWindow *parent = NULL, + int x = wxDefaultCoord, int y = wxDefaultCoord); + +// Ask for filename to load +WXDLLIMPEXP_CORE wxString +wxLoadFileSelector(const wxString& what, + const wxString& extension, + const wxString& default_name = wxEmptyString, + wxWindow *parent = NULL); + +// Ask for filename to save +WXDLLIMPEXP_CORE wxString +wxSaveFileSelector(const wxString& what, + const wxString& extension, + const wxString& default_name = wxEmptyString, + wxWindow *parent = NULL); + + +#if defined (__WXUNIVERSAL__) + #define wxHAS_GENERIC_FILEDIALOG + #include "wx/generic/filedlgg.h" +#elif defined(__WXMSW__) + #include "wx/msw/filedlg.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/filedlg.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/filedlg.h" // GTK+ > 2.4 has native version +#elif defined(__WXGTK__) + #include "wx/gtk1/filedlg.h" +#elif defined(__WXMAC__) + #include "wx/osx/filedlg.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/filedlg.h" +#elif defined(__WXPM__) + #include "wx/os2/filedlg.h" +#endif + +#endif // wxUSE_FILEDLG + +#endif // _WX_FILEDLG_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/filefn.h b/wxmsw/include/wx-3.0/wx/filefn.h new file mode 100644 index 00000000..95b3051c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/filefn.h @@ -0,0 +1,842 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/filefn.h +// Purpose: File- and directory-related functions +// Author: Julian Smart +// Modified by: +// Created: 29/01/98 +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _FILEFN_H_ +#define _FILEFN_H_ + +#include "wx/list.h" +#include "wx/arrstr.h" + +#ifdef __WXWINCE__ + #include "wx/msw/wince/time.h" + #include "wx/msw/private.h" +#else + #include +#endif + +#ifndef __WXWINCE__ + #include + #include +#endif + +#ifdef __OS2__ +// need to check for __OS2__ first since currently both +// __OS2__ and __UNIX__ are defined. + #include + #include "wx/os2/private.h" + #ifdef __WATCOMC__ + #include + #endif + #include + #ifdef __EMX__ + #include + #endif +#elif defined(__UNIX__) + #include + #include +#endif + +#if defined(__WINDOWS__) && !defined(__WXMICROWIN__) +#if !defined( __GNUWIN32__ ) && !defined(__WXWINCE__) && !defined(__CYGWIN__) + #include + #include + #include +#endif // __WINDOWS__ +#endif // native Win compiler + +#if defined(__DOS__) + #ifdef __WATCOMC__ + #include + #include + #include + #endif + #ifdef __DJGPP__ + #include + #include + #endif +#endif + +#ifdef __BORLANDC__ // Please someone tell me which version of Borland needs + // this (3.1 I believe) and how to test for it. + // If this works for Borland 4.0 as well, then no worries. + #include +#endif + +#ifndef __WXWINCE__ + #include // O_RDONLY &c +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#if defined(__VISUALC__) || defined(__DIGITALMARS__) + typedef int mode_t; +#endif + +#ifdef __WXWINCE__ + typedef long off_t; +#else + // define off_t + #if !defined(__WXMAC__) || defined(__UNIX__) || defined(__MACH__) + #include + #else + typedef long off_t; + #endif +#endif + +#if defined(__VISUALC__) && !defined(__WXWINCE__) + typedef _off_t off_t; +#elif defined(__SYMANTEC__) + typedef long off_t; +#endif + +enum wxSeekMode +{ + wxFromStart, + wxFromCurrent, + wxFromEnd +}; + +enum wxFileKind +{ + wxFILE_KIND_UNKNOWN, + wxFILE_KIND_DISK, // a file supporting seeking to arbitrary offsets + wxFILE_KIND_TERMINAL, // a tty + wxFILE_KIND_PIPE // a pipe +}; + +// we redefine these constants here because S_IREAD &c are _not_ standard +// however, we do assume that the values correspond to the Unix umask bits +enum wxPosixPermissions +{ + // standard Posix names for these permission flags: + wxS_IRUSR = 00400, + wxS_IWUSR = 00200, + wxS_IXUSR = 00100, + + wxS_IRGRP = 00040, + wxS_IWGRP = 00020, + wxS_IXGRP = 00010, + + wxS_IROTH = 00004, + wxS_IWOTH = 00002, + wxS_IXOTH = 00001, + + // longer but more readable synonyms for the constants above: + wxPOSIX_USER_READ = wxS_IRUSR, + wxPOSIX_USER_WRITE = wxS_IWUSR, + wxPOSIX_USER_EXECUTE = wxS_IXUSR, + + wxPOSIX_GROUP_READ = wxS_IRGRP, + wxPOSIX_GROUP_WRITE = wxS_IWGRP, + wxPOSIX_GROUP_EXECUTE = wxS_IXGRP, + + wxPOSIX_OTHERS_READ = wxS_IROTH, + wxPOSIX_OTHERS_WRITE = wxS_IWOTH, + wxPOSIX_OTHERS_EXECUTE = wxS_IXOTH, + + // default mode for the new files: allow reading/writing them to everybody but + // the effective file mode will be set after anding this value with umask and + // so won't include wxS_IW{GRP,OTH} for the default 022 umask value + wxS_DEFAULT = (wxPOSIX_USER_READ | wxPOSIX_USER_WRITE | \ + wxPOSIX_GROUP_READ | wxPOSIX_GROUP_WRITE | \ + wxPOSIX_OTHERS_READ | wxPOSIX_OTHERS_WRITE), + + // default mode for the new directories (see wxFileName::Mkdir): allow + // reading/writing/executing them to everybody, but just like wxS_DEFAULT + // the effective directory mode will be set after anding this value with umask + wxS_DIR_DEFAULT = (wxPOSIX_USER_READ | wxPOSIX_USER_WRITE | wxPOSIX_USER_EXECUTE | \ + wxPOSIX_GROUP_READ | wxPOSIX_GROUP_WRITE | wxPOSIX_GROUP_EXECUTE | \ + wxPOSIX_OTHERS_READ | wxPOSIX_OTHERS_WRITE | wxPOSIX_OTHERS_EXECUTE) +}; + +// ---------------------------------------------------------------------------- +// declare our versions of low level file functions: some compilers prepend +// underscores to the usual names, some also have Unicode versions of them +// ---------------------------------------------------------------------------- + +// Wrappers around Win32 api functions like CreateFile, ReadFile and such +// Implemented in filefnwce.cpp +#if defined( __WXWINCE__) + typedef __int64 wxFileOffset; + #define wxFileOffsetFmtSpec wxT("I64") + WXDLLIMPEXP_BASE int wxCRT_Open(const wxChar *filename, int oflag, int WXUNUSED(pmode)); + WXDLLIMPEXP_BASE int wxCRT_Access(const wxChar *name, int WXUNUSED(how)); + WXDLLIMPEXP_BASE int wxCRT_Chmod(const wxChar *name, int WXUNUSED(how)); + WXDLLIMPEXP_BASE int wxClose(int fd); + WXDLLIMPEXP_BASE int wxFsync(int WXUNUSED(fd)); + WXDLLIMPEXP_BASE int wxRead(int fd, void *buf, unsigned int count); + WXDLLIMPEXP_BASE int wxWrite(int fd, const void *buf, unsigned int count); + WXDLLIMPEXP_BASE int wxEof(int fd); + WXDLLIMPEXP_BASE wxFileOffset wxSeek(int fd, wxFileOffset offset, int origin); + #define wxLSeek wxSeek + WXDLLIMPEXP_BASE wxFileOffset wxTell(int fd); + + // always Unicode under WinCE + #define wxCRT_MkDir _wmkdir + #define wxCRT_RmDir _wrmdir + #define wxCRT_Stat _wstat + #define wxStructStat struct _stat +#elif (defined(__WINDOWS__) || defined(__OS2__)) && \ + ( \ + defined(__VISUALC__) || \ + defined(__MINGW64__) || \ + (defined(__MINGW32__) && !defined(__WINE__) && \ + wxCHECK_W32API_VERSION(0, 5)) || \ + defined(__DMC__) || \ + defined(__WATCOMC__) || \ + defined(__BORLANDC__) \ + ) + + // temporary defines just used immediately below + #undef wxHAS_HUGE_FILES + #undef wxHAS_HUGE_STDIO_FILES + + // detect compilers which have support for huge files + #if defined(__VISUALC__) + #define wxHAS_HUGE_FILES 1 + #elif defined(__MINGW32__) || defined(__MINGW64__) + #define wxHAS_HUGE_FILES 1f + #elif defined(_LARGE_FILES) + #define wxHAS_HUGE_FILES 1 + #endif + + // detect compilers which have support for huge stdio files + #if wxCHECK_VISUALC_VERSION(8) + #define wxHAS_HUGE_STDIO_FILES + #define wxFseek _fseeki64 + #define wxFtell _ftelli64 + #elif wxCHECK_MINGW32_VERSION(3, 5) // mingw-runtime version (not gcc) + #define wxHAS_HUGE_STDIO_FILES + #define wxFseek fseeko64 + #define wxFtell ftello64 + #endif + + // other Windows compilers (DMC, Watcom, and Borland) don't have huge file + // support (or at least not all functions needed for it by wx) currently + + // types + + #ifdef wxHAS_HUGE_FILES + typedef wxLongLong_t wxFileOffset; + #define wxFileOffsetFmtSpec wxLongLongFmtSpec + #else + typedef off_t wxFileOffset; + #endif + + // at least Borland 5.5 doesn't like "struct ::stat" so don't use the scope + // resolution operator present in wxPOSIX_IDENT for it + #ifdef __BORLANDC__ + #define wxPOSIX_STRUCT(s) struct s + #else + #define wxPOSIX_STRUCT(s) struct wxPOSIX_IDENT(s) + #endif + + // Notice that Watcom is the only compiler to have a wide char + // version of struct stat as well as a wide char stat function variant. + // This was dropped since OW 1.4 "for consistency across platforms". + // + // Borland is also special in that it uses _stat with Unicode functions + // (for MSVC compatibility?) but stat with ANSI ones + #ifdef __BORLANDC__ + #if wxHAS_HUGE_FILES + #define wxStructStat struct stati64 + #else + #if wxUSE_UNICODE + #define wxStructStat struct _stat + #else + #define wxStructStat struct stat + #endif + #endif + #else // !__BORLANDC__ + #ifdef wxHAS_HUGE_FILES + #if wxUSE_UNICODE && wxONLY_WATCOM_EARLIER_THAN(1,4) + #define wxStructStat struct _wstati64 + #else + #define wxStructStat struct _stati64 + #endif + #else + #if wxUSE_UNICODE && wxONLY_WATCOM_EARLIER_THAN(1,4) + #define wxStructStat struct _wstat + #else + #define wxStructStat struct _stat + #endif + #endif + #endif // __BORLANDC__/!__BORLANDC__ + + + // functions + + // MSVC and compatible compilers prepend underscores to the POSIX function + // names, other compilers don't and even if their later versions usually do + // define the versions with underscores for MSVC compatibility, it's better + // to avoid using them as they're not present in earlier versions and + // always using the native functions spelling is easier than testing for + // the versions + #if defined(__BORLANDC__) || defined(__DMC__) || defined(__WATCOMC__) || defined(__MINGW64__) + #define wxPOSIX_IDENT(func) ::func + #else // by default assume MSVC-compatible names + #define wxPOSIX_IDENT(func) _ ## func + #define wxHAS_UNDERSCORES_IN_POSIX_IDENTS + #endif + + // first functions not working with strings, i.e. without ANSI/Unicode + // complications + #define wxClose wxPOSIX_IDENT(close) + + #define wxRead wxPOSIX_IDENT(read) + #define wxWrite wxPOSIX_IDENT(write) + + #ifdef wxHAS_HUGE_FILES + #ifndef __MINGW64__ + #define wxSeek wxPOSIX_IDENT(lseeki64) + #define wxLseek wxPOSIX_IDENT(lseeki64) + #define wxTell wxPOSIX_IDENT(telli64) + #else + // unfortunately, mingw-W64 is somewhat inconsistent... + #define wxSeek _lseeki64 + #define wxLseek _lseeki64 + #define wxTell _telli64 + #endif + #else // !wxHAS_HUGE_FILES + #define wxSeek wxPOSIX_IDENT(lseek) + #define wxLseek wxPOSIX_IDENT(lseek) + #define wxTell wxPOSIX_IDENT(tell) + #endif // wxHAS_HUGE_FILES/!wxHAS_HUGE_FILES + + #ifndef __WATCOMC__ + #if !defined(__BORLANDC__) || (__BORLANDC__ > 0x540) + // NB: this one is not POSIX and always has the underscore + #define wxFsync _commit + + // could be already defined by configure (Cygwin) + #ifndef HAVE_FSYNC + #define HAVE_FSYNC + #endif + #endif // BORLANDC + #endif + + #define wxEof wxPOSIX_IDENT(eof) + + // then the functions taking strings + + // first the ANSI versions + #define wxCRT_OpenA wxPOSIX_IDENT(open) + #define wxCRT_AccessA wxPOSIX_IDENT(access) + #define wxCRT_ChmodA wxPOSIX_IDENT(chmod) + #define wxCRT_MkDirA wxPOSIX_IDENT(mkdir) + #define wxCRT_RmDirA wxPOSIX_IDENT(rmdir) + #ifdef wxHAS_HUGE_FILES + // MinGW-64 provides underscore-less versions of all file functions + // except for this one. + #ifdef __MINGW64__ + #define wxCRT_StatA _stati64 + #else + #define wxCRT_StatA wxPOSIX_IDENT(stati64) + #endif + #else + // Unfortunately Watcom is not consistent + #if defined(__OS2__) && defined(__WATCOMC__) + #define wxCRT_StatA _stat + #else + #define wxCRT_StatA wxPOSIX_IDENT(stat) + #endif + #endif + + // then wide char ones + #if wxUSE_UNICODE + // special workaround for buggy wopen() in bcc 5.5 + #if defined(__BORLANDC__) && \ + (__BORLANDC__ >= 0x550 && __BORLANDC__ <= 0x551) + WXDLLIMPEXP_BASE int wxCRT_OpenW(const wxChar *pathname, + int flags, mode_t mode); + #else + #define wxCRT_OpenW _wopen + #endif + + #define wxCRT_AccessW _waccess + #define wxCRT_ChmodW _wchmod + #define wxCRT_MkDirW _wmkdir + #define wxCRT_RmDirW _wrmdir + #ifdef wxHAS_HUGE_FILES + #define wxCRT_StatW _wstati64 + #else + #define wxCRT_StatW _wstat + #endif + #endif // wxUSE_UNICODE + + + // finally the default char-type versions + #if wxUSE_UNICODE + #if wxUSE_UNICODE_MSLU || defined(__WX_STRICT_ANSI_GCC__) + // implement the missing file functions in Win9x ourselves + WXDLLIMPEXP_BASE int wxMSLU__wopen(const wxChar *name, + int flags, int mode); + WXDLLIMPEXP_BASE int wxMSLU__waccess(const wxChar *name, + int mode); + WXDLLIMPEXP_BASE int wxMSLU__wchmod(const wxChar *name, + int mode); + WXDLLIMPEXP_BASE int wxMSLU__wmkdir(const wxChar *name); + WXDLLIMPEXP_BASE int wxMSLU__wrmdir(const wxChar *name); + + WXDLLIMPEXP_BASE int + wxMSLU__wstat(const wxChar *name, wxStructStat *buffer); + + #define wxCRT_Open wxMSLU__wopen + + #define wxCRT_Access wxMSLU__waccess + #define wxCRT_Chmod wxMSLU__wchmod + #define wxCRT_MkDir wxMSLU__wmkdir + #define wxCRT_RmDir wxMSLU__wrmdir + #define wxCRT_Stat wxMSLU__wstat + #else // !wxUSE_UNICODE_MSLU + #define wxCRT_Open wxCRT_OpenW + #define wxCRT_Access wxCRT_AccessW + #define wxCRT_Chmod wxCRT_ChmodW + #define wxCRT_MkDir wxCRT_MkDirW + #define wxCRT_RmDir wxCRT_RmDirW + #define wxCRT_Stat wxCRT_StatW + #endif // wxUSE_UNICODE_MSLU/!wxUSE_UNICODE_MSLU + #else // !wxUSE_UNICODE + #define wxCRT_Open wxCRT_OpenA + #define wxCRT_Access wxCRT_AccessA + #define wxCRT_Chmod wxCRT_ChmodA + #define wxCRT_MkDir wxCRT_MkDirA + #define wxCRT_RmDir wxCRT_RmDirA + #define wxCRT_Stat wxCRT_StatA + #endif // wxUSE_UNICODE/!wxUSE_UNICODE + + + // constants (unless already defined by the user code) + #ifdef wxHAS_UNDERSCORES_IN_POSIX_IDENTS + #ifndef O_RDONLY + #define O_RDONLY _O_RDONLY + #define O_WRONLY _O_WRONLY + #define O_RDWR _O_RDWR + #define O_EXCL _O_EXCL + #define O_CREAT _O_CREAT + #define O_BINARY _O_BINARY + #endif + + #ifndef S_IFMT + #define S_IFMT _S_IFMT + #define S_IFDIR _S_IFDIR + #define S_IFREG _S_IFREG + #endif + #endif // wxHAS_UNDERSCORES_IN_POSIX_IDENTS + + #ifdef wxHAS_HUGE_FILES + // wxFile is present and supports large files. + #if wxUSE_FILE + #define wxHAS_LARGE_FILES + #endif + // wxFFile is present and supports large files + #if wxUSE_FFILE && defined wxHAS_HUGE_STDIO_FILES + #define wxHAS_LARGE_FFILES + #endif + #endif + + // private defines, undefine so that nobody gets tempted to use + #undef wxHAS_HUGE_FILES + #undef wxHAS_HUGE_STDIO_FILES +#else // Unix or Windows using unknown compiler, assume POSIX supported + typedef off_t wxFileOffset; + #ifdef HAVE_LARGEFILE_SUPPORT + #define wxFileOffsetFmtSpec wxLongLongFmtSpec + wxCOMPILE_TIME_ASSERT( sizeof(off_t) == sizeof(wxLongLong_t), + BadFileSizeType ); + // wxFile is present and supports large files + #if wxUSE_FILE + #define wxHAS_LARGE_FILES + #endif + // wxFFile is present and supports large files + #if wxUSE_FFILE && (SIZEOF_LONG == 8 || defined HAVE_FSEEKO) + #define wxHAS_LARGE_FFILES + #endif + #ifdef HAVE_FSEEKO + #define wxFseek fseeko + #define wxFtell ftello + #endif + #else + #define wxFileOffsetFmtSpec wxT("") + #endif + // functions + #define wxClose close + #define wxRead ::read + #define wxWrite ::write + #define wxLseek lseek + #define wxSeek lseek + #define wxFsync fsync + #define wxEof eof + #define wxCRT_MkDir mkdir + #define wxCRT_RmDir rmdir + + #define wxTell(fd) lseek(fd, 0, SEEK_CUR) + + #define wxStructStat struct stat + + #define wxCRT_Open open + #define wxCRT_Stat stat + #define wxCRT_Lstat lstat + #define wxCRT_Access access + #define wxCRT_Chmod chmod + + #define wxHAS_NATIVE_LSTAT +#endif // platforms + +// if the platform doesn't have symlinks, define wxCRT_Lstat to be the same as +// wxCRT_Stat to avoid #ifdefs in the code using it +#ifndef wxHAS_NATIVE_LSTAT + #define wxCRT_Lstat wxCRT_Stat +#endif + +// define wxFseek/wxFtell to large file versions if available (done above) or +// to fseek/ftell if not, to save ifdefs in using code +#ifndef wxFseek + #define wxFseek fseek +#endif +#ifndef wxFtell + #define wxFtell ftell +#endif + +inline int wxAccess(const wxString& path, mode_t mode) + { return wxCRT_Access(path.fn_str(), mode); } +inline int wxChmod(const wxString& path, mode_t mode) + { return wxCRT_Chmod(path.fn_str(), mode); } +inline int wxOpen(const wxString& path, int flags, mode_t mode) + { return wxCRT_Open(path.fn_str(), flags, mode); } + +// FIXME-CE: provide our own implementations of the missing CRT functions +#ifndef __WXWINCE__ +inline int wxStat(const wxString& path, wxStructStat *buf) + { return wxCRT_Stat(path.fn_str(), buf); } +inline int wxLstat(const wxString& path, wxStructStat *buf) + { return wxCRT_Lstat(path.fn_str(), buf); } +inline int wxRmDir(const wxString& path) + { return wxCRT_RmDir(path.fn_str()); } +#if (defined(__WINDOWS__) && !defined(__CYGWIN__)) \ + || (defined(__OS2__) && defined(__WATCOMC__)) +inline int wxMkDir(const wxString& path, mode_t WXUNUSED(mode) = 0) + { return wxCRT_MkDir(path.fn_str()); } +#else +inline int wxMkDir(const wxString& path, mode_t mode) + { return wxCRT_MkDir(path.fn_str(), mode); } +#endif +#endif // !__WXWINCE__ + +#ifdef O_BINARY + #define wxO_BINARY O_BINARY +#else + #define wxO_BINARY 0 +#endif + +#if defined(__VISAGECPP__) && __IBMCPP__ >= 400 +// +// VisualAge C++ V4.0 cannot have any external linkage const decs +// in headers included by more than one primary source +// +extern const int wxInvalidOffset; +#else +const int wxInvalidOffset = -1; +#endif + +// ---------------------------------------------------------------------------- +// functions +// ---------------------------------------------------------------------------- +WXDLLIMPEXP_BASE bool wxFileExists(const wxString& filename); + +// does the path exist? (may have or not '/' or '\\' at the end) +WXDLLIMPEXP_BASE bool wxDirExists(const wxString& pathName); + +WXDLLIMPEXP_BASE bool wxIsAbsolutePath(const wxString& filename); + +// Get filename +WXDLLIMPEXP_BASE wxChar* wxFileNameFromPath(wxChar *path); +WXDLLIMPEXP_BASE wxString wxFileNameFromPath(const wxString& path); + +// Get directory +WXDLLIMPEXP_BASE wxString wxPathOnly(const wxString& path); + +// all deprecated functions below are deprecated in favour of wxFileName's methods +#if WXWIN_COMPATIBILITY_2_8 + +wxDEPRECATED( WXDLLIMPEXP_BASE void wxDos2UnixFilename(char *s) ); +wxDEPRECATED( WXDLLIMPEXP_BASE void wxDos2UnixFilename(wchar_t *s) ); + +wxDEPRECATED_BUT_USED_INTERNALLY( + WXDLLIMPEXP_BASE void wxUnix2DosFilename(char *s) ); +wxDEPRECATED_BUT_USED_INTERNALLY( + WXDLLIMPEXP_BASE void wxUnix2DosFilename(wchar_t *s) ); + +// Strip the extension, in situ +// Deprecated in favour of wxFileName::StripExtension() but notice that their +// behaviour is slightly different, see the manual +wxDEPRECATED( WXDLLIMPEXP_BASE void wxStripExtension(char *buffer) ); +wxDEPRECATED( WXDLLIMPEXP_BASE void wxStripExtension(wchar_t *buffer) ); +wxDEPRECATED( WXDLLIMPEXP_BASE void wxStripExtension(wxString& buffer) ); + +// Get a temporary filename +wxDEPRECATED_BUT_USED_INTERNALLY( WXDLLIMPEXP_BASE wxChar* wxGetTempFileName(const wxString& prefix, wxChar *buf = NULL) ); +wxDEPRECATED_BUT_USED_INTERNALLY( WXDLLIMPEXP_BASE bool wxGetTempFileName(const wxString& prefix, wxString& buf) ); + +// Expand file name (~/ and ${OPENWINHOME}/ stuff) +wxDEPRECATED_BUT_USED_INTERNALLY( WXDLLIMPEXP_BASE char* wxExpandPath(char *dest, const wxString& path) ); +wxDEPRECATED_BUT_USED_INTERNALLY( WXDLLIMPEXP_BASE wchar_t* wxExpandPath(wchar_t *dest, const wxString& path) ); + // DEPRECATED: use wxFileName::Normalize(wxPATH_NORM_ENV_VARS) + +// Contract w.r.t environment ( -> ${OPENWINHOME}/lib) +// and make (if under the home tree) relative to home +// [caller must copy-- volatile] +wxDEPRECATED( +WXDLLIMPEXP_BASE wxChar* wxContractPath(const wxString& filename, + const wxString& envname = wxEmptyString, + const wxString& user = wxEmptyString) ); + // DEPRECATED: use wxFileName::ReplaceEnvVariable and wxFileName::ReplaceHomeDir + +// Destructive removal of /./ and /../ stuff +wxDEPRECATED_BUT_USED_INTERNALLY( WXDLLIMPEXP_BASE char* wxRealPath(char *path) ); +wxDEPRECATED_BUT_USED_INTERNALLY( WXDLLIMPEXP_BASE wchar_t* wxRealPath(wchar_t *path) ); +wxDEPRECATED_BUT_USED_INTERNALLY( WXDLLIMPEXP_BASE wxString wxRealPath(const wxString& path) ); + // DEPRECATED: use wxFileName::Normalize instead + +// Allocate a copy of the full absolute path +wxDEPRECATED( WXDLLIMPEXP_BASE wxChar* wxCopyAbsolutePath(const wxString& path) ); + // DEPRECATED: use wxFileName::MakeAbsolute instead +#endif + +// Get first file name matching given wild card. +// Flags are reserved for future use. +#define wxFILE 1 +#define wxDIR 2 +WXDLLIMPEXP_BASE wxString wxFindFirstFile(const wxString& spec, int flags = wxFILE); +WXDLLIMPEXP_BASE wxString wxFindNextFile(); + +// Does the pattern contain wildcards? +WXDLLIMPEXP_BASE bool wxIsWild(const wxString& pattern); + +// Does the pattern match the text (usually a filename)? +// If dot_special is true, doesn't match * against . (eliminating +// `hidden' dot files) +WXDLLIMPEXP_BASE bool wxMatchWild(const wxString& pattern, const wxString& text, bool dot_special = true); + +// Concatenate two files to form third +WXDLLIMPEXP_BASE bool wxConcatFiles(const wxString& file1, const wxString& file2, const wxString& file3); + +// Copy file1 to file2 +WXDLLIMPEXP_BASE bool wxCopyFile(const wxString& file1, const wxString& file2, + bool overwrite = true); + +// Remove file +WXDLLIMPEXP_BASE bool wxRemoveFile(const wxString& file); + +// Rename file +WXDLLIMPEXP_BASE bool wxRenameFile(const wxString& file1, const wxString& file2, bool overwrite = true); + +// Get current working directory. +#if WXWIN_COMPATIBILITY_2_6 +// If buf is NULL, allocates space using new, else +// copies into buf. +// IMPORTANT NOTE getcwd is know not to work under some releases +// of Win32s 1.3, according to MS release notes! +wxDEPRECATED( WXDLLIMPEXP_BASE wxChar* wxGetWorkingDirectory(wxChar *buf = NULL, int sz = 1000) ); +// new and preferred version of wxGetWorkingDirectory +// NB: can't have the same name because of overloading ambiguity +#endif // WXWIN_COMPATIBILITY_2_6 +WXDLLIMPEXP_BASE wxString wxGetCwd(); + +// Set working directory +WXDLLIMPEXP_BASE bool wxSetWorkingDirectory(const wxString& d); + +// Make directory +WXDLLIMPEXP_BASE bool wxMkdir(const wxString& dir, int perm = wxS_DIR_DEFAULT); + +// Remove directory. Flags reserved for future use. +WXDLLIMPEXP_BASE bool wxRmdir(const wxString& dir, int flags = 0); + +// Return the type of an open file +WXDLLIMPEXP_BASE wxFileKind wxGetFileKind(int fd); +WXDLLIMPEXP_BASE wxFileKind wxGetFileKind(FILE *fp); + +#if WXWIN_COMPATIBILITY_2_6 +// compatibility defines, don't use in new code +wxDEPRECATED( inline bool wxPathExists(const wxChar *pszPathName) ); +inline bool wxPathExists(const wxChar *pszPathName) +{ + return wxDirExists(pszPathName); +} +#endif //WXWIN_COMPATIBILITY_2_6 + +// permissions; these functions work both on files and directories: +WXDLLIMPEXP_BASE bool wxIsWritable(const wxString &path); +WXDLLIMPEXP_BASE bool wxIsReadable(const wxString &path); +WXDLLIMPEXP_BASE bool wxIsExecutable(const wxString &path); + +// ---------------------------------------------------------------------------- +// separators in file names +// ---------------------------------------------------------------------------- + +// between file name and extension +#define wxFILE_SEP_EXT wxT('.') + +// between drive/volume name and the path +#define wxFILE_SEP_DSK wxT(':') + +// between the path components +#define wxFILE_SEP_PATH_DOS wxT('\\') +#define wxFILE_SEP_PATH_UNIX wxT('/') +#define wxFILE_SEP_PATH_MAC wxT(':') +#define wxFILE_SEP_PATH_VMS wxT('.') // VMS also uses '[' and ']' + +// separator in the path list (as in PATH environment variable) +// there is no PATH variable in Classic Mac OS so just use the +// semicolon (it must be different from the file name separator) +// NB: these are strings and not characters on purpose! +#define wxPATH_SEP_DOS wxT(";") +#define wxPATH_SEP_UNIX wxT(":") +#define wxPATH_SEP_MAC wxT(";") + +// platform independent versions +#if defined(__UNIX__) && !defined(__OS2__) + // CYGWIN also uses UNIX settings + #define wxFILE_SEP_PATH wxFILE_SEP_PATH_UNIX + #define wxPATH_SEP wxPATH_SEP_UNIX +#elif defined(__MAC__) + #define wxFILE_SEP_PATH wxFILE_SEP_PATH_MAC + #define wxPATH_SEP wxPATH_SEP_MAC +#else // Windows and OS/2 + #define wxFILE_SEP_PATH wxFILE_SEP_PATH_DOS + #define wxPATH_SEP wxPATH_SEP_DOS +#endif // Unix/Windows + +// this is useful for wxString::IsSameAs(): to compare two file names use +// filename1.IsSameAs(filename2, wxARE_FILENAMES_CASE_SENSITIVE) +#if defined(__UNIX__) && !defined(__DARWIN__) && !defined(__OS2__) + #define wxARE_FILENAMES_CASE_SENSITIVE true +#else // Windows, Mac OS and OS/2 + #define wxARE_FILENAMES_CASE_SENSITIVE false +#endif // Unix/Windows + +// is the char a path separator? +inline bool wxIsPathSeparator(wxChar c) +{ + // under DOS/Windows we should understand both Unix and DOS file separators +#if ( defined(__UNIX__) && !defined(__OS2__) )|| defined(__MAC__) + return c == wxFILE_SEP_PATH; +#else + return c == wxFILE_SEP_PATH_DOS || c == wxFILE_SEP_PATH_UNIX; +#endif +} + +// does the string ends with path separator? +WXDLLIMPEXP_BASE bool wxEndsWithPathSeparator(const wxString& filename); + +#if WXWIN_COMPATIBILITY_2_8 +// split the full path into path (including drive for DOS), name and extension +// (understands both '/' and '\\') +// Deprecated in favour of wxFileName::SplitPath +wxDEPRECATED( WXDLLIMPEXP_BASE void wxSplitPath(const wxString& fileName, + wxString *pstrPath, + wxString *pstrName, + wxString *pstrExt) ); +#endif + +// find a file in a list of directories, returns false if not found +WXDLLIMPEXP_BASE bool wxFindFileInPath(wxString *pStr, const wxString& szPath, const wxString& szFile); + +// Get the OS directory if appropriate (such as the Windows directory). +// On non-Windows platform, probably just return the empty string. +WXDLLIMPEXP_BASE wxString wxGetOSDirectory(); + +#if wxUSE_DATETIME + +// Get file modification time +WXDLLIMPEXP_BASE time_t wxFileModificationTime(const wxString& filename); + +#endif // wxUSE_DATETIME + +// Parses the wildCard, returning the number of filters. +// Returns 0 if none or if there's a problem, +// The arrays will contain an equal number of items found before the error. +// wildCard is in the form: +// "All files (*)|*|Image Files (*.jpeg *.png)|*.jpg;*.png" +WXDLLIMPEXP_BASE int wxParseCommonDialogsFilter(const wxString& wildCard, wxArrayString& descriptions, wxArrayString& filters); + +// ---------------------------------------------------------------------------- +// classes +// ---------------------------------------------------------------------------- + +#ifdef __UNIX__ + +// set umask to the given value in ctor and reset it to the old one in dtor +class WXDLLIMPEXP_BASE wxUmaskChanger +{ +public: + // change the umask to the given one if it is not -1: this allows to write + // the same code whether you really want to change umask or not, as is in + // wxFileConfig::Flush() for example + wxUmaskChanger(int umaskNew) + { + m_umaskOld = umaskNew == -1 ? -1 : (int)umask((mode_t)umaskNew); + } + + ~wxUmaskChanger() + { + if ( m_umaskOld != -1 ) + umask((mode_t)m_umaskOld); + } + +private: + int m_umaskOld; +}; + +// this macro expands to an "anonymous" wxUmaskChanger object under Unix and +// nothing elsewhere +#define wxCHANGE_UMASK(m) wxUmaskChanger wxMAKE_UNIQUE_NAME(umaskChanger_)(m) + +#else // !__UNIX__ + +#define wxCHANGE_UMASK(m) + +#endif // __UNIX__/!__UNIX__ + + +// Path searching +class WXDLLIMPEXP_BASE wxPathList : public wxArrayString +{ +public: + wxPathList() {} + wxPathList(const wxArrayString &arr) + { Add(arr); } + + // Adds all paths in environment variable + void AddEnvList(const wxString& envVariable); + + // Adds given path to this list + bool Add(const wxString& path); + void Add(const wxArrayString &paths); + + // Find the first full path for which the file exists + wxString FindValidPath(const wxString& filename) const; + + // Find the first full path for which the file exists; ensure it's an + // absolute path that gets returned. + wxString FindAbsoluteValidPath(const wxString& filename) const; + + // Given full path and filename, add path to list + bool EnsureFileAccessible(const wxString& path); + +#if WXWIN_COMPATIBILITY_2_6 + // Returns true if the path is in the list + wxDEPRECATED( bool Member(const wxString& path) const ); +#endif +}; + +#endif // _WX_FILEFN_H_ diff --git a/wxmsw/include/wx-3.0/wx/filehistory.h b/wxmsw/include/wx-3.0/wx/filehistory.h new file mode 100644 index 00000000..b6cb1cb5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/filehistory.h @@ -0,0 +1,113 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/filehistory.h +// Purpose: wxFileHistory class +// Author: Julian Smart, Vaclav Slavik +// Created: 2010-05-03 +// Copyright: (c) Julian Smart, Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FILEHISTORY_H_ +#define _WX_FILEHISTORY_H_ + +#include "wx/defs.h" + +#if wxUSE_FILE_HISTORY + +#include "wx/windowid.h" +#include "wx/object.h" +#include "wx/list.h" +#include "wx/string.h" +#include "wx/arrstr.h" + +class WXDLLIMPEXP_FWD_CORE wxMenu; +class WXDLLIMPEXP_FWD_BASE wxConfigBase; +class WXDLLIMPEXP_FWD_BASE wxFileName; + +// ---------------------------------------------------------------------------- +// File history management +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFileHistoryBase : public wxObject +{ +public: + wxFileHistoryBase(size_t maxFiles = 9, wxWindowID idBase = wxID_FILE1); + + // Operations + virtual void AddFileToHistory(const wxString& file); + virtual void RemoveFileFromHistory(size_t i); + virtual int GetMaxFiles() const { return (int)m_fileMaxFiles; } + virtual void UseMenu(wxMenu *menu); + + // Remove menu from the list (MDI child may be closing) + virtual void RemoveMenu(wxMenu *menu); + +#if wxUSE_CONFIG + virtual void Load(const wxConfigBase& config); + virtual void Save(wxConfigBase& config); +#endif // wxUSE_CONFIG + + virtual void AddFilesToMenu(); + virtual void AddFilesToMenu(wxMenu* menu); // Single menu + + // Accessors + virtual wxString GetHistoryFile(size_t i) const { return m_fileHistory[i]; } + virtual size_t GetCount() const { return m_fileHistory.GetCount(); } + + const wxList& GetMenus() const { return m_fileMenus; } + + // Set/get base id + void SetBaseId(wxWindowID baseId) { m_idBase = baseId; } + wxWindowID GetBaseId() const { return m_idBase; } + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, use GetCount() instead + wxDEPRECATED( size_t GetNoHistoryFiles() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + // Last n files + wxArrayString m_fileHistory; + + // Menus to maintain (may need several for an MDI app) + wxList m_fileMenus; + + // Max files to maintain + size_t m_fileMaxFiles; + +private: + // The ID of the first history menu item (Doesn't have to be wxID_FILE1) + wxWindowID m_idBase; + + // Normalize a file name to canonical form. We have a special function for + // this to ensure the same normalization is used everywhere. + static wxString NormalizeFileName(const wxFileName& filename); + + wxDECLARE_NO_COPY_CLASS(wxFileHistoryBase); +}; + +#if WXWIN_COMPATIBILITY_2_6 +inline size_t wxFileHistoryBase::GetNoHistoryFiles() const +{ + return m_fileHistory.GetCount(); +} +#endif // WXWIN_COMPATIBILITY_2_6 + + +#if defined(__WXGTK20__) + #include "wx/gtk/filehistory.h" +#else + // no platform-specific implementation of wxFileHistory yet + class WXDLLIMPEXP_CORE wxFileHistory : public wxFileHistoryBase + { + public: + wxFileHistory(size_t maxFiles = 9, wxWindowID idBase = wxID_FILE1) + : wxFileHistoryBase(maxFiles, idBase) {} + + DECLARE_DYNAMIC_CLASS(wxFileHistory) + }; +#endif + +#endif // wxUSE_FILE_HISTORY + +#endif // _WX_FILEHISTORY_H_ diff --git a/wxmsw/include/wx-3.0/wx/filename.h b/wxmsw/include/wx-3.0/wx/filename.h new file mode 100644 index 00000000..1a16e140 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/filename.h @@ -0,0 +1,645 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/filename.h +// Purpose: wxFileName - encapsulates a file path +// Author: Robert Roebling, Vadim Zeitlin +// Modified by: +// Created: 28.12.00 +// Copyright: (c) 2000 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FILENAME_H_ +#define _WX_FILENAME_H_ + +#include "wx/arrstr.h" +#include "wx/filefn.h" +#include "wx/datetime.h" +#include "wx/intl.h" +#include "wx/longlong.h" +#include "wx/file.h" + +#if wxUSE_FILE +class WXDLLIMPEXP_FWD_BASE wxFile; +#endif + +#if wxUSE_FFILE +class WXDLLIMPEXP_FWD_BASE wxFFile; +#endif + +// this symbol is defined for the platforms where file systems use volumes in +// paths +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__) + #define wxHAS_FILESYSTEM_VOLUMES +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// the various values for the path format: this mainly affects the path +// separator but also whether or not the path has the drive part (as under +// Windows) +enum wxPathFormat +{ + wxPATH_NATIVE = 0, // the path format for the current platform + wxPATH_UNIX, + wxPATH_BEOS = wxPATH_UNIX, + wxPATH_MAC, + wxPATH_DOS, + wxPATH_WIN = wxPATH_DOS, + wxPATH_OS2 = wxPATH_DOS, + wxPATH_VMS, + + wxPATH_MAX // Not a valid value for specifying path format +}; + +// different conventions that may be used with GetHumanReadableSize() +enum wxSizeConvention +{ + wxSIZE_CONV_TRADITIONAL, // 1024 bytes = 1 KB + wxSIZE_CONV_IEC, // 1024 bytes = 1 KiB + wxSIZE_CONV_SI // 1000 bytes = 1 KB +}; + +// the kind of normalization to do with the file name: these values can be +// or'd together to perform several operations at once +enum wxPathNormalize +{ + wxPATH_NORM_ENV_VARS = 0x0001, // replace env vars with their values + wxPATH_NORM_DOTS = 0x0002, // squeeze all .. and . + wxPATH_NORM_TILDE = 0x0004, // Unix only: replace ~ and ~user + wxPATH_NORM_CASE = 0x0008, // if case insensitive => tolower + wxPATH_NORM_ABSOLUTE = 0x0010, // make the path absolute + wxPATH_NORM_LONG = 0x0020, // make the path the long form + wxPATH_NORM_SHORTCUT = 0x0040, // resolve the shortcut, if it is a shortcut + wxPATH_NORM_ALL = 0x00ff & ~wxPATH_NORM_CASE +}; + +// what exactly should GetPath() return? +enum +{ + wxPATH_NO_SEPARATOR = 0x0000, // for symmetry with wxPATH_GET_SEPARATOR + wxPATH_GET_VOLUME = 0x0001, // include the volume if applicable + wxPATH_GET_SEPARATOR = 0x0002 // terminate the path with the separator +}; + +// Mkdir flags +enum +{ + wxPATH_MKDIR_FULL = 0x0001 // create directories recursively +}; + +// Rmdir flags +enum +{ + wxPATH_RMDIR_FULL = 0x0001, // delete with subdirectories if empty + wxPATH_RMDIR_RECURSIVE = 0x0002 // delete all recursively (dangerous!) +}; + +// FileExists flags +enum +{ + wxFILE_EXISTS_REGULAR = 0x0001, // check for existence of a regular file + wxFILE_EXISTS_DIR = 0x0002, // check for existence of a directory + wxFILE_EXISTS_SYMLINK = 0x1004, // check for existence of a symbolic link; + // also sets wxFILE_EXISTS_NO_FOLLOW as + // it would never be satisfied otherwise + wxFILE_EXISTS_DEVICE = 0x0008, // check for existence of a device + wxFILE_EXISTS_FIFO = 0x0016, // check for existence of a FIFO + wxFILE_EXISTS_SOCKET = 0x0032, // check for existence of a socket + // gap for future types + wxFILE_EXISTS_NO_FOLLOW = 0x1000, // don't dereference a contained symlink + wxFILE_EXISTS_ANY = 0x1FFF // check for existence of anything +}; + +#if wxUSE_LONGLONG +// error code of wxFileName::GetSize() +extern WXDLLIMPEXP_DATA_BASE(const wxULongLong) wxInvalidSize; +#endif // wxUSE_LONGLONG + + + +// ---------------------------------------------------------------------------- +// wxFileName: encapsulates a file path +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFileName +{ +public: + // constructors and assignment + + // the usual stuff + wxFileName() { Clear(); } + wxFileName(const wxFileName& filepath) { Assign(filepath); } + + // from a full filename: if it terminates with a '/', a directory path + // is contructed (the name will be empty), otherwise a file name and + // extension are extracted from it + wxFileName( const wxString& fullpath, wxPathFormat format = wxPATH_NATIVE ) + { Assign( fullpath, format ); m_dontFollowLinks = false; } + + // from a directory name and a file name + wxFileName(const wxString& path, + const wxString& name, + wxPathFormat format = wxPATH_NATIVE) + { Assign(path, name, format); m_dontFollowLinks = false; } + + // from a volume, directory name, file base name and extension + wxFileName(const wxString& volume, + const wxString& path, + const wxString& name, + const wxString& ext, + wxPathFormat format = wxPATH_NATIVE) + { Assign(volume, path, name, ext, format); m_dontFollowLinks = false; } + + // from a directory name, file base name and extension + wxFileName(const wxString& path, + const wxString& name, + const wxString& ext, + wxPathFormat format = wxPATH_NATIVE) + { Assign(path, name, ext, format); m_dontFollowLinks = false; } + + // the same for delayed initialization + + void Assign(const wxFileName& filepath); + + void Assign(const wxString& fullpath, + wxPathFormat format = wxPATH_NATIVE); + + void Assign(const wxString& volume, + const wxString& path, + const wxString& name, + const wxString& ext, + bool hasExt, + wxPathFormat format = wxPATH_NATIVE); + + void Assign(const wxString& volume, + const wxString& path, + const wxString& name, + const wxString& ext, + wxPathFormat format = wxPATH_NATIVE) + { Assign(volume, path, name, ext, !ext.empty(), format); } + + void Assign(const wxString& path, + const wxString& name, + wxPathFormat format = wxPATH_NATIVE); + + void Assign(const wxString& path, + const wxString& name, + const wxString& ext, + wxPathFormat format = wxPATH_NATIVE); + + void AssignDir(const wxString& dir, wxPathFormat format = wxPATH_NATIVE); + + // assorted assignment operators + + wxFileName& operator=(const wxFileName& filename) + { if (this != &filename) Assign(filename); return *this; } + + wxFileName& operator=(const wxString& filename) + { Assign(filename); return *this; } + + // reset all components to default, uninitialized state + void Clear(); + + // static pseudo constructors + static wxFileName FileName(const wxString& file, + wxPathFormat format = wxPATH_NATIVE); + static wxFileName DirName(const wxString& dir, + wxPathFormat format = wxPATH_NATIVE); + + // file tests + + // is the filename valid at all? + bool IsOk() const + { + // we're fine if we have the path or the name or if we're a root dir + return m_dirs.size() != 0 || !m_name.empty() || !m_relative || + !m_ext.empty() || m_hasExt; + } + + // does the file with this name exist? + bool FileExists() const; + static bool FileExists( const wxString &file ); + + // does the directory with this name exist? + bool DirExists() const; + static bool DirExists( const wxString &dir ); + + // does anything at all with this name (i.e. file, directory or some + // other file system object such as a device, socket, ...) exist? + bool Exists(int flags = wxFILE_EXISTS_ANY) const; + static bool Exists(const wxString& path, int flags = wxFILE_EXISTS_ANY); + + + // checks on most common flags for files/directories; + // more platform-specific features (like e.g. Unix permissions) are not + // available in wxFileName + + bool IsDirWritable() const { return wxIsWritable(GetPath()); } + static bool IsDirWritable(const wxString &path) { return wxDirExists(path) && wxIsWritable(path); } + + bool IsDirReadable() const { return wxIsReadable(GetPath()); } + static bool IsDirReadable(const wxString &path) { return wxDirExists(path) && wxIsReadable(path); } + + // NOTE: IsDirExecutable() is not present because the meaning of "executable" + // directory is very platform-dependent and also not so useful + + bool IsFileWritable() const { return wxIsWritable(GetFullPath()); } + static bool IsFileWritable(const wxString &path) { return wxFileExists(path) && wxIsWritable(path); } + + bool IsFileReadable() const { return wxIsReadable(GetFullPath()); } + static bool IsFileReadable(const wxString &path) { return wxFileExists(path) && wxIsReadable(path); } + + bool IsFileExecutable() const { return wxIsExecutable(GetFullPath()); } + static bool IsFileExecutable(const wxString &path) { return wxFileExists(path) && wxIsExecutable(path); } + + // set the file permissions to a combination of wxPosixPermissions enum + // values + bool SetPermissions(int permissions); + + + // time functions +#if wxUSE_DATETIME + // set the file last access/mod and creation times + // (any of the pointers may be NULL) + bool SetTimes(const wxDateTime *dtAccess, + const wxDateTime *dtMod, + const wxDateTime *dtCreate) const; + + // set the access and modification times to the current moment + bool Touch() const; + + // return the last access, last modification and create times + // (any of the pointers may be NULL) + bool GetTimes(wxDateTime *dtAccess, + wxDateTime *dtMod, + wxDateTime *dtCreate) const; + + // convenience wrapper: get just the last mod time of the file + wxDateTime GetModificationTime() const + { + wxDateTime dtMod; + (void)GetTimes(NULL, &dtMod, NULL); + return dtMod; + } +#endif // wxUSE_DATETIME + +#if defined( __WXOSX_MAC__ ) && wxOSX_USE_CARBON + bool MacSetTypeAndCreator( wxUint32 type , wxUint32 creator ) ; + bool MacGetTypeAndCreator( wxUint32 *type , wxUint32 *creator ) const; + // gets the 'common' type and creator for a certain extension + static bool MacFindDefaultTypeAndCreator( const wxString& ext , wxUint32 *type , wxUint32 *creator ) ; + // registers application defined extensions and their default type and creator + static void MacRegisterDefaultTypeAndCreator( const wxString& ext , wxUint32 type , wxUint32 creator ) ; + // looks up the appropriate type and creator from the registration and then sets + bool MacSetDefaultTypeAndCreator() ; +#endif + + // various file/dir operations + + // retrieve the value of the current working directory + void AssignCwd(const wxString& volume = wxEmptyString); + static wxString GetCwd(const wxString& volume = wxEmptyString); + + // change the current working directory + bool SetCwd() const; + static bool SetCwd( const wxString &cwd ); + + // get the value of user home (Unix only mainly) + void AssignHomeDir(); + static wxString GetHomeDir(); + + // get the system temporary directory + static wxString GetTempDir(); + +#if wxUSE_FILE || wxUSE_FFILE + // get a temp file name starting with the specified prefix + void AssignTempFileName(const wxString& prefix); + static wxString CreateTempFileName(const wxString& prefix); +#endif // wxUSE_FILE + +#if wxUSE_FILE + // get a temp file name starting with the specified prefix and open the + // file passed to us using this name for writing (atomically if + // possible) + void AssignTempFileName(const wxString& prefix, wxFile *fileTemp); + static wxString CreateTempFileName(const wxString& prefix, + wxFile *fileTemp); +#endif // wxUSE_FILE + +#if wxUSE_FFILE + // get a temp file name starting with the specified prefix and open the + // file passed to us using this name for writing (atomically if + // possible) + void AssignTempFileName(const wxString& prefix, wxFFile *fileTemp); + static wxString CreateTempFileName(const wxString& prefix, + wxFFile *fileTemp); +#endif // wxUSE_FFILE + + // directory creation and removal. + bool Mkdir(int perm = wxS_DIR_DEFAULT, int flags = 0) const; + static bool Mkdir(const wxString &dir, int perm = wxS_DIR_DEFAULT, + int flags = 0); + + bool Rmdir(int flags = 0) const; + static bool Rmdir(const wxString &dir, int flags = 0); + + // operations on the path + + // normalize the path: with the default flags value, the path will be + // made absolute, without any ".." and "." and all environment + // variables will be expanded in it + // + // this may be done using another (than current) value of cwd + bool Normalize(int flags = wxPATH_NORM_ALL, + const wxString& cwd = wxEmptyString, + wxPathFormat format = wxPATH_NATIVE); + + // get a path path relative to the given base directory, i.e. opposite + // of Normalize + // + // pass an empty string to get a path relative to the working directory + // + // returns true if the file name was modified, false if we failed to do + // anything with it (happens when the file is on a different volume, + // for example) + bool MakeRelativeTo(const wxString& pathBase = wxEmptyString, + wxPathFormat format = wxPATH_NATIVE); + + // make the path absolute + // + // this may be done using another (than current) value of cwd + bool MakeAbsolute(const wxString& cwd = wxEmptyString, + wxPathFormat format = wxPATH_NATIVE) + { return Normalize(wxPATH_NORM_DOTS | wxPATH_NORM_ABSOLUTE | + wxPATH_NORM_TILDE, cwd, format); } + + + // If the path is a symbolic link (Unix-only), indicate that all + // filesystem operations on this path should be performed on the link + // itself and not on the file it points to, as is the case by default. + // + // No effect if this is not a symbolic link. + void DontFollowLink() + { + m_dontFollowLinks = true; + } + + // If the path is a symbolic link (Unix-only), returns whether various + // file operations should act on the link itself, or on its target. + // + // This does not test if the path is really a symlink or not. + bool ShouldFollowLink() const + { + return !m_dontFollowLinks; + } + +#if defined(__WIN32__) && !defined(__WXWINCE__) && wxUSE_OLE + // if the path is a shortcut, return the target and optionally, + // the arguments + bool GetShortcutTarget(const wxString& shortcutPath, + wxString& targetFilename, + wxString* arguments = NULL) const; +#endif + +#ifndef __WXWINCE__ + // if the path contains the value of the environment variable named envname + // then this function replaces it with the string obtained from + // wxString::Format(replacementFmtString, value_of_envname_variable) + // + // Example: + // wxFileName fn("/usr/openwin/lib/someFile"); + // fn.ReplaceEnvVariable("OPENWINHOME"); + // // now fn.GetFullPath() == "$OPENWINHOME/lib/someFile" + bool ReplaceEnvVariable(const wxString& envname, + const wxString& replacementFmtString = "$%s", + wxPathFormat format = wxPATH_NATIVE); +#endif + + // replaces, if present in the path, the home directory for the given user + // (see wxGetHomeDir) with a tilde + bool ReplaceHomeDir(wxPathFormat format = wxPATH_NATIVE); + + + // Comparison + + // compares with the rules of the given platforms format + bool SameAs(const wxFileName& filepath, + wxPathFormat format = wxPATH_NATIVE) const; + + // compare with another filename object + bool operator==(const wxFileName& filename) const + { return SameAs(filename); } + bool operator!=(const wxFileName& filename) const + { return !SameAs(filename); } + + // compare with a filename string interpreted as a native file name + bool operator==(const wxString& filename) const + { return SameAs(wxFileName(filename)); } + bool operator!=(const wxString& filename) const + { return !SameAs(wxFileName(filename)); } + + // are the file names of this type cases sensitive? + static bool IsCaseSensitive( wxPathFormat format = wxPATH_NATIVE ); + + // is this filename absolute? + bool IsAbsolute(wxPathFormat format = wxPATH_NATIVE) const; + + // is this filename relative? + bool IsRelative(wxPathFormat format = wxPATH_NATIVE) const + { return !IsAbsolute(format); } + + // Returns the characters that aren't allowed in filenames + // on the specified platform. + static wxString GetForbiddenChars(wxPathFormat format = wxPATH_NATIVE); + + // Information about path format + + // get the string separating the volume from the path for this format, + // return an empty string if this format doesn't support the notion of + // volumes at all + static wxString GetVolumeSeparator(wxPathFormat format = wxPATH_NATIVE); + + // get the string of path separators for this format + static wxString GetPathSeparators(wxPathFormat format = wxPATH_NATIVE); + + // get the string of path terminators, i.e. characters which terminate the + // path + static wxString GetPathTerminators(wxPathFormat format = wxPATH_NATIVE); + + // get the canonical path separator for this format + static wxUniChar GetPathSeparator(wxPathFormat format = wxPATH_NATIVE) + { return GetPathSeparators(format)[0u]; } + + // is the char a path separator for this format? + static bool IsPathSeparator(wxChar ch, wxPathFormat format = wxPATH_NATIVE); + + // is this is a DOS path which beings with a windows unique volume name + // ('\\?\Volume{guid}\')? + static bool IsMSWUniqueVolumeNamePath(const wxString& path, + wxPathFormat format = wxPATH_NATIVE); + + // Dir accessors + size_t GetDirCount() const { return m_dirs.size(); } + bool AppendDir(const wxString& dir); + void PrependDir(const wxString& dir); + bool InsertDir(size_t before, const wxString& dir); + void RemoveDir(size_t pos); + void RemoveLastDir() { RemoveDir(GetDirCount() - 1); } + + // Other accessors + void SetExt( const wxString &ext ) { m_ext = ext; m_hasExt = !m_ext.empty(); } + void ClearExt() { m_ext.clear(); m_hasExt = false; } + void SetEmptyExt() { m_ext.clear(); m_hasExt = true; } + wxString GetExt() const { return m_ext; } + bool HasExt() const { return m_hasExt; } + + void SetName( const wxString &name ) { m_name = name; } + wxString GetName() const { return m_name; } + bool HasName() const { return !m_name.empty(); } + + void SetVolume( const wxString &volume ) { m_volume = volume; } + wxString GetVolume() const { return m_volume; } + bool HasVolume() const { return !m_volume.empty(); } + + // full name is the file name + extension (but without the path) + void SetFullName(const wxString& fullname); + wxString GetFullName() const; + + const wxArrayString& GetDirs() const { return m_dirs; } + + // flags are combination of wxPATH_GET_XXX flags + wxString GetPath(int flags = wxPATH_GET_VOLUME, + wxPathFormat format = wxPATH_NATIVE) const; + + // Replace current path with this one + void SetPath( const wxString &path, wxPathFormat format = wxPATH_NATIVE ); + + // Construct full path with name and ext + wxString GetFullPath( wxPathFormat format = wxPATH_NATIVE ) const; + + // Return the short form of the path (returns identity on non-Windows platforms) + wxString GetShortPath() const; + + // Return the long form of the path (returns identity on non-Windows platforms) + wxString GetLongPath() const; + + // Is this a file or directory (not necessarily an existing one) + bool IsDir() const { return m_name.empty() && m_ext.empty(); } + + // various helpers + + // get the canonical path format for this platform + static wxPathFormat GetFormat( wxPathFormat format = wxPATH_NATIVE ); + + // split a fullpath into the volume, path, (base) name and extension + // (all of the pointers can be NULL) + static void SplitPath(const wxString& fullpath, + wxString *volume, + wxString *path, + wxString *name, + wxString *ext, + bool *hasExt = NULL, + wxPathFormat format = wxPATH_NATIVE); + + static void SplitPath(const wxString& fullpath, + wxString *volume, + wxString *path, + wxString *name, + wxString *ext, + wxPathFormat format) + { + SplitPath(fullpath, volume, path, name, ext, NULL, format); + } + + // compatibility version: volume is part of path + static void SplitPath(const wxString& fullpath, + wxString *path, + wxString *name, + wxString *ext, + wxPathFormat format = wxPATH_NATIVE); + + // split a path into volume and pure path part + static void SplitVolume(const wxString& fullpathWithVolume, + wxString *volume, + wxString *path, + wxPathFormat format = wxPATH_NATIVE); + + // strip the file extension: "foo.bar" => "foo" (but ".baz" => ".baz") + static wxString StripExtension(const wxString& fullpath); + +#ifdef wxHAS_FILESYSTEM_VOLUMES + // return the string representing a file system volume, or drive + static wxString GetVolumeString(char drive, int flags = wxPATH_GET_SEPARATOR); +#endif // wxHAS_FILESYSTEM_VOLUMES + + // File size + +#if wxUSE_LONGLONG + // returns the size of the given filename + wxULongLong GetSize() const; + static wxULongLong GetSize(const wxString &file); + + // returns the size in a human readable form + wxString + GetHumanReadableSize(const wxString& nullsize = wxGetTranslation("Not available"), + int precision = 1, + wxSizeConvention conv = wxSIZE_CONV_TRADITIONAL) const; + static wxString + GetHumanReadableSize(const wxULongLong& sz, + const wxString& nullsize = wxGetTranslation("Not available"), + int precision = 1, + wxSizeConvention conv = wxSIZE_CONV_TRADITIONAL); +#endif // wxUSE_LONGLONG + + + // deprecated methods, don't use any more + // -------------------------------------- + +#ifndef __DIGITALMARS__ + wxString GetPath( bool withSep, wxPathFormat format = wxPATH_NATIVE ) const + { return GetPath(withSep ? wxPATH_GET_SEPARATOR : 0, format); } +#endif + wxString GetPathWithSep(wxPathFormat format = wxPATH_NATIVE ) const + { return GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR, format); } + +private: + // check whether this dir is valid for Append/Prepend/InsertDir() + static bool IsValidDirComponent(const wxString& dir); + + // the drive/volume/device specification (always empty for Unix) + wxString m_volume; + + // the path components of the file + wxArrayString m_dirs; + + // the file name and extension (empty for directories) + wxString m_name, + m_ext; + + // when m_dirs is empty it may mean either that we have no path at all or + // that our path is '/', i.e. the root directory + // + // we use m_relative to distinguish between these two cases, it will be + // true in the former and false in the latter + // + // NB: the path is not absolute just because m_relative is false, it still + // needs the drive (i.e. volume) in some formats (Windows) + bool m_relative; + + // when m_ext is empty, it may be because we don't have any extension or + // because we have an empty extension + // + // the difference is important as file with name "foo" and without + // extension has full name "foo" while with empty extension it is "foo." + bool m_hasExt; + + // by default, symlinks are dereferenced but this flag can be set with + // DontFollowLink() to change this and make different operations work on + // this file path itself instead of the target of the symlink + bool m_dontFollowLinks; +}; + +#endif // _WX_FILENAME_H_ + diff --git a/wxmsw/include/wx-3.0/wx/filepicker.h b/wxmsw/include/wx-3.0/wx/filepicker.h new file mode 100644 index 00000000..5264ddb3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/filepicker.h @@ -0,0 +1,420 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/filepicker.h +// Purpose: wxFilePickerCtrl, wxDirPickerCtrl base header +// Author: Francesco Montorsi +// Modified by: +// Created: 14/4/2006 +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FILEDIRPICKER_H_BASE_ +#define _WX_FILEDIRPICKER_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL + +#include "wx/pickerbase.h" +#include "wx/filename.h" + +class WXDLLIMPEXP_FWD_CORE wxDialog; +class WXDLLIMPEXP_FWD_CORE wxFileDirPickerEvent; + +extern WXDLLIMPEXP_DATA_CORE(const char) wxFilePickerWidgetLabel[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxFilePickerWidgetNameStr[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxFilePickerCtrlNameStr[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxFileSelectorPromptStr[]; + +extern WXDLLIMPEXP_DATA_CORE(const char) wxDirPickerWidgetLabel[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxDirPickerWidgetNameStr[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxDirPickerCtrlNameStr[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxDirSelectorPromptStr[]; + +// ---------------------------------------------------------------------------- +// wxFileDirPickerEvent: used by wxFilePickerCtrl and wxDirPickerCtrl only +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFileDirPickerEvent : public wxCommandEvent +{ +public: + wxFileDirPickerEvent() {} + wxFileDirPickerEvent(wxEventType type, wxObject *generator, int id, const wxString &path) + : wxCommandEvent(type, id), + m_path(path) + { + SetEventObject(generator); + } + + wxString GetPath() const { return m_path; } + void SetPath(const wxString &p) { m_path = p; } + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxFileDirPickerEvent(*this); } + +private: + wxString m_path; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxFileDirPickerEvent) +}; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FILEPICKER_CHANGED, wxFileDirPickerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_DIRPICKER_CHANGED, wxFileDirPickerEvent ); + +// ---------------------------------------------------------------------------- +// event types and macros +// ---------------------------------------------------------------------------- + +typedef void (wxEvtHandler::*wxFileDirPickerEventFunction)(wxFileDirPickerEvent&); + +#define wxFileDirPickerEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxFileDirPickerEventFunction, func) + +#define EVT_FILEPICKER_CHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_FILEPICKER_CHANGED, id, wxFileDirPickerEventHandler(fn)) +#define EVT_DIRPICKER_CHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_DIRPICKER_CHANGED, id, wxFileDirPickerEventHandler(fn)) + +// ---------------------------------------------------------------------------- +// wxFileDirPickerWidgetBase: a generic abstract interface which must be +// implemented by controls used by wxFileDirPickerCtrlBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFileDirPickerWidgetBase +{ +public: + wxFileDirPickerWidgetBase() { } + virtual ~wxFileDirPickerWidgetBase() { } + + // Path here is the name of the selected file or directory. + wxString GetPath() const { return m_path; } + virtual void SetPath(const wxString &str) { m_path=str; } + + // Set the directory to open the file browse dialog at initially. + virtual void SetInitialDirectory(const wxString& dir) = 0; + + // returns the picker widget cast to wxControl + virtual wxControl *AsControl() = 0; + +protected: + virtual void UpdateDialogPath(wxDialog *) = 0; + virtual void UpdatePathFromDialog(wxDialog *) = 0; + + wxString m_path; +}; + +// Styles which must be supported by all controls implementing wxFileDirPickerWidgetBase +// NB: these styles must be defined to carefully-chosen values to +// avoid conflicts with wxButton's styles + +#define wxFLP_OPEN 0x0400 +#define wxFLP_SAVE 0x0800 +#define wxFLP_OVERWRITE_PROMPT 0x1000 +#define wxFLP_FILE_MUST_EXIST 0x2000 +#define wxFLP_CHANGE_DIR 0x4000 +#define wxFLP_SMALL wxPB_SMALL + +// NOTE: wxMULTIPLE is not supported ! + + +#define wxDIRP_DIR_MUST_EXIST 0x0008 +#define wxDIRP_CHANGE_DIR 0x0010 +#define wxDIRP_SMALL wxPB_SMALL + + +// map platform-dependent controls which implement the wxFileDirPickerWidgetBase +// under the name "wxFilePickerWidget" and "wxDirPickerWidget". +// NOTE: wxFileDirPickerCtrlBase will allocate a wx{File|Dir}PickerWidget and this +// requires that all classes being mapped as wx{File|Dir}PickerWidget have the +// same prototype for the contructor... +// since GTK >= 2.6, there is GtkFileButton +#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/filepicker.h" + #define wxFilePickerWidget wxFileButton + #define wxDirPickerWidget wxDirButton +#else + #include "wx/generic/filepickerg.h" + #define wxFilePickerWidget wxGenericFileButton + #define wxDirPickerWidget wxGenericDirButton +#endif + + + +// ---------------------------------------------------------------------------- +// wxFileDirPickerCtrlBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFileDirPickerCtrlBase : public wxPickerBase +{ +public: + wxFileDirPickerCtrlBase() {} + +protected: + // NB: no default values since this function will never be used + // directly by the user and derived classes wouldn't use them + bool CreateBase(wxWindow *parent, + wxWindowID id, + const wxString& path, + const wxString &message, + const wxString &wildcard, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name); + +public: // public API + + wxString GetPath() const; + void SetPath(const wxString &str); + + // Set the directory to open the file browse dialog at initially. + void SetInitialDirectory(const wxString& dir) + { + m_pickerIface->SetInitialDirectory(dir); + } + +public: // internal functions + + void UpdatePickerFromTextCtrl(); + void UpdateTextCtrlFromPicker(); + + // event handler for our picker + void OnFileDirChange(wxFileDirPickerEvent &); + + // TRUE if any textctrl change should update the current working directory + virtual bool IsCwdToUpdate() const = 0; + + // Returns the event type sent by this picker + virtual wxEventType GetEventType() const = 0; + + virtual void DoConnect( wxControl *sender, wxFileDirPickerCtrlBase *eventSink ) = 0; + + // Returns the filtered value currently placed in the text control (if present). + virtual wxString GetTextCtrlValue() const = 0; + +protected: + // creates the picker control + virtual + wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent, + const wxString& path, + const wxString& message, + const wxString& wildcard) = 0; + +protected: + + // m_picker object as wxFileDirPickerWidgetBase interface + wxFileDirPickerWidgetBase *m_pickerIface; +}; + +#endif // wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL + + +#if wxUSE_FILEPICKERCTRL + +// ---------------------------------------------------------------------------- +// wxFilePickerCtrl: platform-independent class which embeds the +// platform-dependent wxFilePickerWidget and, if wxFLP_USE_TEXTCTRL style is +// used, a textctrl next to it. +// ---------------------------------------------------------------------------- + +#define wxFLP_USE_TEXTCTRL (wxPB_USE_TEXTCTRL) + +#ifdef __WXGTK__ + // GTK apps usually don't have a textctrl next to the picker + #define wxFLP_DEFAULT_STYLE (wxFLP_OPEN|wxFLP_FILE_MUST_EXIST) +#else + #define wxFLP_DEFAULT_STYLE (wxFLP_USE_TEXTCTRL|wxFLP_OPEN|wxFLP_FILE_MUST_EXIST) +#endif + +class WXDLLIMPEXP_CORE wxFilePickerCtrl : public wxFileDirPickerCtrlBase +{ +public: + wxFilePickerCtrl() {} + + wxFilePickerCtrl(wxWindow *parent, + wxWindowID id, + const wxString& path = wxEmptyString, + const wxString& message = wxFileSelectorPromptStr, + const wxString& wildcard = wxFileSelectorDefaultWildcardStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxFLP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFilePickerCtrlNameStr) + { + Create(parent, id, path, message, wildcard, pos, size, style, + validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& path = wxEmptyString, + const wxString& message = wxFileSelectorPromptStr, + const wxString& wildcard = wxFileSelectorDefaultWildcardStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxFLP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFilePickerCtrlNameStr); + + void SetFileName(const wxFileName &filename) + { SetPath(filename.GetFullPath()); } + + wxFileName GetFileName() const + { return wxFileName(GetPath()); } + +public: // overrides + + // return the text control value in canonical form + wxString GetTextCtrlValue() const; + + bool IsCwdToUpdate() const + { return HasFlag(wxFLP_CHANGE_DIR); } + + wxEventType GetEventType() const + { return wxEVT_FILEPICKER_CHANGED; } + + virtual void DoConnect( wxControl *sender, wxFileDirPickerCtrlBase *eventSink ) + { + sender->Connect( wxEVT_FILEPICKER_CHANGED, + wxFileDirPickerEventHandler( wxFileDirPickerCtrlBase::OnFileDirChange ), + NULL, eventSink ); + } + + +protected: + virtual + wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent, + const wxString& path, + const wxString& message, + const wxString& wildcard) + { + return new wxFilePickerWidget(parent, wxID_ANY, + wxGetTranslation(wxFilePickerWidgetLabel), + path, message, wildcard, + wxDefaultPosition, wxDefaultSize, + GetPickerStyle(GetWindowStyle())); + } + + // extracts the style for our picker from wxFileDirPickerCtrlBase's style + long GetPickerStyle(long style) const + { + return style & (wxFLP_OPEN | + wxFLP_SAVE | + wxFLP_OVERWRITE_PROMPT | + wxFLP_FILE_MUST_EXIST | + wxFLP_CHANGE_DIR | + wxFLP_USE_TEXTCTRL | + wxFLP_SMALL); + } + +private: + DECLARE_DYNAMIC_CLASS(wxFilePickerCtrl) +}; + +#endif // wxUSE_FILEPICKERCTRL + + +#if wxUSE_DIRPICKERCTRL + +// ---------------------------------------------------------------------------- +// wxDirPickerCtrl: platform-independent class which embeds the +// platform-dependent wxDirPickerWidget and eventually a textctrl +// (see wxDIRP_USE_TEXTCTRL) next to it. +// ---------------------------------------------------------------------------- + +#define wxDIRP_USE_TEXTCTRL (wxPB_USE_TEXTCTRL) + +#ifdef __WXGTK__ + // GTK apps usually don't have a textctrl next to the picker + #define wxDIRP_DEFAULT_STYLE (wxDIRP_DIR_MUST_EXIST) +#else + #define wxDIRP_DEFAULT_STYLE (wxDIRP_USE_TEXTCTRL|wxDIRP_DIR_MUST_EXIST) +#endif + +class WXDLLIMPEXP_CORE wxDirPickerCtrl : public wxFileDirPickerCtrlBase +{ +public: + wxDirPickerCtrl() {} + + wxDirPickerCtrl(wxWindow *parent, wxWindowID id, + const wxString& path = wxEmptyString, + const wxString& message = wxDirSelectorPromptStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDIRP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDirPickerCtrlNameStr) + { + Create(parent, id, path, message, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, wxWindowID id, + const wxString& path = wxEmptyString, + const wxString& message = wxDirSelectorPromptStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDIRP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDirPickerCtrlNameStr); + + void SetDirName(const wxFileName &dirname) + { SetPath(dirname.GetPath()); } + + wxFileName GetDirName() const + { return wxFileName::DirName(GetPath()); } + +public: // overrides + + wxString GetTextCtrlValue() const; + + bool IsCwdToUpdate() const + { return HasFlag(wxDIRP_CHANGE_DIR); } + + wxEventType GetEventType() const + { return wxEVT_DIRPICKER_CHANGED; } + + virtual void DoConnect( wxControl *sender, wxFileDirPickerCtrlBase *eventSink ) + { + sender->Connect( wxEVT_DIRPICKER_CHANGED, + wxFileDirPickerEventHandler( wxFileDirPickerCtrlBase::OnFileDirChange ), + NULL, eventSink ); + } + + +protected: + virtual + wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent, + const wxString& path, + const wxString& message, + const wxString& WXUNUSED(wildcard)) + { + return new wxDirPickerWidget(parent, wxID_ANY, + wxGetTranslation(wxDirPickerWidgetLabel), + path, message, + wxDefaultPosition, wxDefaultSize, + GetPickerStyle(GetWindowStyle())); + } + + // extracts the style for our picker from wxFileDirPickerCtrlBase's style + long GetPickerStyle(long style) const + { + return style & (wxDIRP_DIR_MUST_EXIST | + wxDIRP_CHANGE_DIR | + wxDIRP_USE_TEXTCTRL | + wxDIRP_SMALL); + } + +private: + DECLARE_DYNAMIC_CLASS(wxDirPickerCtrl) +}; + +#endif // wxUSE_DIRPICKERCTRL + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_FILEPICKER_CHANGED wxEVT_FILEPICKER_CHANGED +#define wxEVT_COMMAND_DIRPICKER_CHANGED wxEVT_DIRPICKER_CHANGED + +#endif // _WX_FILEDIRPICKER_H_BASE_ + diff --git a/wxmsw/include/wx-3.0/wx/filesys.h b/wxmsw/include/wx-3.0/wx/filesys.h new file mode 100644 index 00000000..3bd6e426 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/filesys.h @@ -0,0 +1,314 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/filesys.h +// Purpose: class for opening files - virtual file system +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __FILESYS_H__ +#define __FILESYS_H__ + +#include "wx/defs.h" + +#if wxUSE_FILESYSTEM + +#if !wxUSE_STREAMS +#error You cannot compile virtual file systems without wxUSE_STREAMS +#endif + +#if wxUSE_HTML && !wxUSE_FILESYSTEM +#error You cannot compile wxHTML without virtual file systems +#endif + +#include "wx/stream.h" +#include "wx/datetime.h" +#include "wx/filename.h" +#include "wx/hashmap.h" + +class WXDLLIMPEXP_FWD_BASE wxFSFile; +class WXDLLIMPEXP_FWD_BASE wxFileSystemHandler; +class WXDLLIMPEXP_FWD_BASE wxFileSystem; + +//-------------------------------------------------------------------------------- +// wxFSFile +// This class is a file opened using wxFileSystem. It consists of +// input stream, location, mime type & optional anchor +// (in 'index.htm#chapter2', 'chapter2' is anchor) +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFSFile : public wxObject +{ +public: + wxFSFile(wxInputStream *stream, const wxString& loc, + const wxString& mimetype, const wxString& anchor +#if wxUSE_DATETIME + , wxDateTime modif +#endif // wxUSE_DATETIME + ) + { + m_Stream = stream; + m_Location = loc; + m_MimeType = mimetype.Lower(); + m_Anchor = anchor; +#if wxUSE_DATETIME + m_Modif = modif; +#endif // wxUSE_DATETIME + } + + virtual ~wxFSFile() { delete m_Stream; } + + // returns stream. This doesn't give away ownership of the stream object. + wxInputStream *GetStream() const { return m_Stream; } + + // gives away the ownership of the current stream. + wxInputStream *DetachStream() + { + wxInputStream *stream = m_Stream; + m_Stream = NULL; + return stream; + } + + // deletes the current stream and takes ownership of another. + void SetStream(wxInputStream *stream) + { + delete m_Stream; + m_Stream = stream; + } + + // returns file's mime type + const wxString& GetMimeType() const; + + // returns the original location (aka filename) of the file + const wxString& GetLocation() const { return m_Location; } + + const wxString& GetAnchor() const { return m_Anchor; } + +#if wxUSE_DATETIME + wxDateTime GetModificationTime() const { return m_Modif; } +#endif // wxUSE_DATETIME + +private: + wxInputStream *m_Stream; + wxString m_Location; + wxString m_MimeType; + wxString m_Anchor; +#if wxUSE_DATETIME + wxDateTime m_Modif; +#endif // wxUSE_DATETIME + + DECLARE_ABSTRACT_CLASS(wxFSFile) + wxDECLARE_NO_COPY_CLASS(wxFSFile); +}; + + + + + +//-------------------------------------------------------------------------------- +// wxFileSystemHandler +// This class is FS handler for wxFileSystem. It provides +// interface to access certain +// kinds of files (HTPP, FTP, local, tar.gz etc..) +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFileSystemHandler : public wxObject +{ +public: + wxFileSystemHandler() : wxObject() {} + + // returns true if this handler is able to open given location + virtual bool CanOpen(const wxString& location) = 0; + + // opens given file and returns pointer to input stream. + // Returns NULL if opening failed. + // The location is always absolute path. + virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location) = 0; + + // Finds first/next file that matches spec wildcard. flags can be wxDIR for restricting + // the query to directories or wxFILE for files only or 0 for either. + // Returns filename or empty string if no more matching file exists + virtual wxString FindFirst(const wxString& spec, int flags = 0); + virtual wxString FindNext(); + + // Returns MIME type of the file - w/o need to open it + // (default behaviour is that it returns type based on extension) + static wxString GetMimeTypeFromExt(const wxString& location); + +protected: + // returns protocol ("file", "http", "tar" etc.) The last (most right) + // protocol is used: + // {it returns "tar" for "file:subdir/archive.tar.gz#tar:/README.txt"} + static wxString GetProtocol(const wxString& location); + + // returns left part of address: + // {it returns "file:subdir/archive.tar.gz" for "file:subdir/archive.tar.gz#tar:/README.txt"} + static wxString GetLeftLocation(const wxString& location); + + // returns anchor part of address: + // {it returns "anchor" for "file:subdir/archive.tar.gz#tar:/README.txt#anchor"} + // NOTE: anchor is NOT a part of GetLeftLocation()'s return value + static wxString GetAnchor(const wxString& location); + + // returns right part of address: + // {it returns "/README.txt" for "file:subdir/archive.tar.gz#tar:/README.txt"} + static wxString GetRightLocation(const wxString& location); + + DECLARE_ABSTRACT_CLASS(wxFileSystemHandler) +}; + + + + +//-------------------------------------------------------------------------------- +// wxFileSystem +// This class provides simple interface for opening various +// kinds of files (HTPP, FTP, local, tar.gz etc..) +//-------------------------------------------------------------------------------- + +// Open Bit Flags +enum wxFileSystemOpenFlags +{ + wxFS_READ = 1, // Open for reading + wxFS_SEEKABLE = 4 // Returned stream will be seekable +}; + +WX_DECLARE_VOIDPTR_HASH_MAP_WITH_DECL(wxFileSystemHandler*, wxFSHandlerHash, class WXDLLIMPEXP_BASE); + +class WXDLLIMPEXP_BASE wxFileSystem : public wxObject +{ +public: + wxFileSystem() : wxObject() { m_FindFileHandler = NULL;} + virtual ~wxFileSystem(); + + // sets the current location. Every call to OpenFile is + // relative to this location. + // NOTE !! + // unless is_dir = true 'location' is *not* the directory but + // file contained in this directory + // (so ChangePathTo("dir/subdir/xh.htm") sets m_Path to "dir/subdir/") + void ChangePathTo(const wxString& location, bool is_dir = false); + + wxString GetPath() const {return m_Path;} + + // opens given file and returns pointer to input stream. + // Returns NULL if opening failed. + // It first tries to open the file in relative scope + // (based on ChangePathTo()'s value) and then as an absolute + // path. + wxFSFile* OpenFile(const wxString& location, int flags = wxFS_READ); + + // Finds first/next file that matches spec wildcard. flags can be wxDIR for restricting + // the query to directories or wxFILE for files only or 0 for either. + // Returns filename or empty string if no more matching file exists + wxString FindFirst(const wxString& spec, int flags = 0); + wxString FindNext(); + + // find a file in a list of directories, returns false if not found + bool FindFileInPath(wxString *pStr, + const wxString& path, const wxString& file); + + // Adds FS handler. + // In fact, this class is only front-end to the FS handlers :-) + static void AddHandler(wxFileSystemHandler *handler); + + // Removes FS handler + static wxFileSystemHandler* RemoveHandler(wxFileSystemHandler *handler); + + // Returns true if there is a handler which can open the given location. + static bool HasHandlerForPath(const wxString& location); + + // remove all items from the m_Handlers list + static void CleanUpHandlers(); + + // Returns the native path for a file URL + static wxFileName URLToFileName(const wxString& url); + + // Returns the file URL for a native path + static wxString FileNameToURL(const wxFileName& filename); + + +protected: + wxFileSystemHandler *MakeLocal(wxFileSystemHandler *h); + + wxString m_Path; + // the path (location) we are currently in + // this is path, not file! + // (so if you opened test/demo.htm, it is + // "test/", not "test/demo.htm") + wxString m_LastName; + // name of last opened file (full path) + static wxList m_Handlers; + // list of FS handlers + wxFileSystemHandler *m_FindFileHandler; + // handler that succeed in FindFirst query + wxFSHandlerHash m_LocalHandlers; + // Handlers local to this instance + + DECLARE_DYNAMIC_CLASS(wxFileSystem) + wxDECLARE_NO_COPY_CLASS(wxFileSystem); +}; + + +/* + +'location' syntax: + +To determine FS type, we're using standard KDE notation: +file:/absolute/path/file.htm +file:relative_path/xxxxx.html +/some/path/x.file ('file:' is default) +http://www.gnome.org +file:subdir/archive.tar.gz#tar:/README.txt + +special characters : + ':' - FS identificator is before this char + '#' - separator. It can be either HTML anchor ("index.html#news") + (in case there is no ':' in the string to the right from it) + or FS separator + (example : http://www.wxhtml.org/wxhtml-0.1.tar.gz#tar:/include/wxhtml/filesys.h" + this would access tgz archive stored on web) + '/' - directory (path) separator. It is used to determine upper-level path. + HEY! Don't use \ even if you're on Windows! + +*/ + + +class WXDLLIMPEXP_BASE wxLocalFSHandler : public wxFileSystemHandler +{ +public: + virtual bool CanOpen(const wxString& location); + virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); + virtual wxString FindFirst(const wxString& spec, int flags = 0); + virtual wxString FindNext(); + + // wxLocalFSHandler will prefix all filenames with 'root' before accessing + // files on disk. This effectively makes 'root' the top-level directory + // and prevents access to files outside this directory. + // (This is similar to Unix command 'chroot'.) + static void Chroot(const wxString& root) { ms_root = root; } + +protected: + static wxString ms_root; +}; + +// Stream reading data from wxFSFile: this allows to use virtual files with any +// wx functions accepting streams. +class WXDLLIMPEXP_BASE wxFSInputStream : public wxWrapperInputStream +{ +public: + // Notice that wxFS_READ is implied in flags. + wxFSInputStream(const wxString& filename, int flags = 0); + virtual ~wxFSInputStream(); + +private: + wxFSFile* m_file; + + wxDECLARE_NO_COPY_CLASS(wxFSInputStream); +}; + +#endif + // wxUSE_FILESYSTEM + +#endif + // __FILESYS_H__ diff --git a/wxmsw/include/wx-3.0/wx/flags.h b/wxmsw/include/wx-3.0/wx/flags.h new file mode 100644 index 00000000..c45bafab --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/flags.h @@ -0,0 +1,176 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/flags.h +// Purpose: a bitset suited for replacing the current style flags +// Author: Stefan Csomor +// Modified by: +// Created: 27/07/03 +// Copyright: (c) 2003 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SETH__ +#define _WX_SETH__ + +// wxBitset should be applied to an enum, then this can be used like +// bitwise operators but keeps the type safety and information, the +// enums must be in a sequence , their value determines the bit position +// that they represent +// The api is made as close as possible to + +template class wxBitset +{ + friend class wxEnumData ; +public: + // creates a wxBitset<> object with all flags initialized to 0 + wxBitset() { m_data = 0; } + + // created a wxBitset<> object initialized according to the bits of the + // integral value val + wxBitset(unsigned long val) { m_data = val ; } + + // copies the content in the new wxBitset<> object from another one + wxBitset(const wxBitset &src) { m_data = src.m_data; } + + // creates a wxBitset<> object that has the specific flag set + wxBitset(const T el) { m_data |= 1 << el; } + + // returns the integral value that the bits of this object represent + unsigned long to_ulong() const { return m_data ; } + + // assignment + wxBitset &operator =(const wxBitset &rhs) + { + m_data = rhs.m_data; + return *this; + } + + // bitwise or operator, sets all bits that are in rhs and leaves + // the rest unchanged + wxBitset &operator |=(const wxBitset &rhs) + { + m_data |= rhs.m_data; + return *this; + } + + // bitwsie exclusive-or operator, toggles the value of all bits + // that are set in bits and leaves all others unchanged + wxBitset &operator ^=(const wxBitset &rhs) // difference + { + m_data ^= rhs.m_data; + return *this; + } + + // bitwise and operator, resets all bits that are not in rhs and leaves + // all others unchanged + wxBitset &operator &=(const wxBitset &rhs) // intersection + { + m_data &= rhs.m_data; + return *this; + } + + // bitwise or operator, returns a new bitset that has all bits set that set are in + // bitset2 or in this bitset + wxBitset operator |(const wxBitset &bitset2) const // union + { + wxBitset s; + s.m_data = m_data | bitset2.m_data; + return s; + } + + // bitwise exclusive-or operator, returns a new bitset that has all bits set that are set either in + // bitset2 or in this bitset but not in both + wxBitset operator ^(const wxBitset &bitset2) const // difference + { + wxBitset s; + s.m_data = m_data ^ bitset2.m_data; + return s; + } + + // bitwise and operator, returns a new bitset that has all bits set that are set both in + // bitset2 and in this bitset + wxBitset operator &(const wxBitset &bitset2) const // intersection + { + wxBitset s; + s.m_data = m_data & bitset2.m_data; + return s; + } + + // sets appropriate the bit to true + wxBitset& set(const T el) //Add element + { + m_data |= 1 << el; + return *this; + } + + // clears the appropriate flag to false + wxBitset& reset(const T el) //remove element + { + m_data &= ~(1 << el); + return *this; + } + + // clear all flags + wxBitset& reset() + { + m_data = 0; + return *this; + } + + // true if this flag is set + bool test(const T el) const + { + return (m_data & (1 << el)) ? true : false; + } + + // true if no flag is set + bool none() const + { + return m_data == 0; + } + + // true if any flag is set + bool any() const + { + return m_data != 0; + } + + // true if both have the same flags + bool operator ==(const wxBitset &rhs) const + { + return m_data == rhs.m_data; + } + + // true if both differ in their flags set + bool operator !=(const wxBitset &rhs) const + { + return !operator==(rhs); + } + + bool operator[] (const T el) const { return test(el) ; } + +private : + unsigned long m_data; +}; + +#if wxUSE_EXTENDED_RTTI + +#define wxDEFINE_FLAGS( flags ) \ + class WXDLLIMPEXP_BASE flags \ + {\ + public : \ + flags(long data=0) :m_data(data) {} \ + long m_data ;\ + bool operator ==(const flags &rhs) const { return m_data == rhs.m_data; }\ + } ; + +#else + +#define wxDEFINE_FLAGS( flags ) + +#endif + +#if WXWIN_COMPATIBILITY_2_8 + #define WX_DEFINE_FLAGS wxDEFINE_FLAGS +#endif + +#endif diff --git a/wxmsw/include/wx-3.0/wx/fmappriv.h b/wxmsw/include/wx-3.0/wx/fmappriv.h new file mode 100644 index 00000000..66370886 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fmappriv.h @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/fmappriv.h +// Purpose: private wxFontMapper stuff, not to be used by the library users +// Author: Vadim Zeitlin +// Modified by: +// Created: 21.06.2003 (extracted from common/fontmap.cpp) +// Copyright: (c) 1999-2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FMAPPRIV_H_ +#define _WX_FMAPPRIV_H_ + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// a special pseudo encoding which means "don't ask me about this charset +// any more" -- we need it to avoid driving the user crazy with asking him +// time after time about the same charset which he [presumably] doesn't +// have the fonts for +enum { wxFONTENCODING_UNKNOWN = -2 }; + +// the config paths we use +#if wxUSE_CONFIG + +#define FONTMAPPER_ROOT_PATH wxT("/wxWindows/FontMapper") +#define FONTMAPPER_CHARSET_PATH wxT("Charsets") +#define FONTMAPPER_CHARSET_ALIAS_PATH wxT("Aliases") + +#endif // wxUSE_CONFIG + +// ---------------------------------------------------------------------------- +// wxFontMapperPathChanger: change the config path during our lifetime +// ---------------------------------------------------------------------------- + +#if wxUSE_CONFIG && wxUSE_FILECONFIG + +class wxFontMapperPathChanger +{ +public: + wxFontMapperPathChanger(wxFontMapperBase *fontMapper, const wxString& path) + { + m_fontMapper = fontMapper; + m_ok = m_fontMapper->ChangePath(path, &m_pathOld); + } + + bool IsOk() const { return m_ok; } + + ~wxFontMapperPathChanger() + { + if ( IsOk() ) + m_fontMapper->RestorePath(m_pathOld); + } + +private: + // the fontmapper object we're working with + wxFontMapperBase *m_fontMapper; + + // the old path to be restored if m_ok + wxString m_pathOld; + + // have we changed the path successfully? + bool m_ok; + + + wxDECLARE_NO_COPY_CLASS(wxFontMapperPathChanger); +}; + +#endif // wxUSE_CONFIG + +#endif // _WX_FMAPPRIV_H_ + diff --git a/wxmsw/include/wx-3.0/wx/font.h b/wxmsw/include/wx-3.0/wx/font.h new file mode 100644 index 00000000..10a6f0e5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/font.h @@ -0,0 +1,598 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/font.h +// Purpose: wxFontBase class: the interface of wxFont +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.09.99 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONT_H_BASE_ +#define _WX_FONT_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" // for wxDEFAULT &c +#include "wx/fontenc.h" // the font encoding constants +#include "wx/gdiobj.h" // the base class +#include "wx/gdicmn.h" // for wxGDIObjListBase + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxFont; + +// ---------------------------------------------------------------------------- +// font constants +// ---------------------------------------------------------------------------- + +// standard font families: these may be used only for the font creation, it +// doesn't make sense to query an existing font for its font family as, +// especially if the font had been created from a native font description, it +// may be unknown +enum wxFontFamily +{ + wxFONTFAMILY_DEFAULT = wxDEFAULT, + wxFONTFAMILY_DECORATIVE = wxDECORATIVE, + wxFONTFAMILY_ROMAN = wxROMAN, + wxFONTFAMILY_SCRIPT = wxSCRIPT, + wxFONTFAMILY_SWISS = wxSWISS, + wxFONTFAMILY_MODERN = wxMODERN, + wxFONTFAMILY_TELETYPE = wxTELETYPE, + wxFONTFAMILY_MAX, + wxFONTFAMILY_UNKNOWN = wxFONTFAMILY_MAX +}; + +// font styles +enum wxFontStyle +{ + wxFONTSTYLE_NORMAL = wxNORMAL, + wxFONTSTYLE_ITALIC = wxITALIC, + wxFONTSTYLE_SLANT = wxSLANT, + wxFONTSTYLE_MAX +}; + +// font weights +enum wxFontWeight +{ + wxFONTWEIGHT_NORMAL = wxNORMAL, + wxFONTWEIGHT_LIGHT = wxLIGHT, + wxFONTWEIGHT_BOLD = wxBOLD, + wxFONTWEIGHT_MAX +}; + +// Symbolic font sizes as defined in CSS specification. +enum wxFontSymbolicSize +{ + wxFONTSIZE_XX_SMALL = -3, + wxFONTSIZE_X_SMALL, + wxFONTSIZE_SMALL, + wxFONTSIZE_MEDIUM, + wxFONTSIZE_LARGE, + wxFONTSIZE_X_LARGE, + wxFONTSIZE_XX_LARGE +}; + +// the font flag bits for the new font ctor accepting one combined flags word +enum wxFontFlag +{ + // no special flags: font with default weight/slant/anti-aliasing + wxFONTFLAG_DEFAULT = 0, + + // slant flags (default: no slant) + wxFONTFLAG_ITALIC = 1 << 0, + wxFONTFLAG_SLANT = 1 << 1, + + // weight flags (default: medium) + wxFONTFLAG_LIGHT = 1 << 2, + wxFONTFLAG_BOLD = 1 << 3, + + // anti-aliasing flag: force on or off (default: the current system default) + wxFONTFLAG_ANTIALIASED = 1 << 4, + wxFONTFLAG_NOT_ANTIALIASED = 1 << 5, + + // underlined/strikethrough flags (default: no lines) + wxFONTFLAG_UNDERLINED = 1 << 6, + wxFONTFLAG_STRIKETHROUGH = 1 << 7, + + // the mask of all currently used flags + wxFONTFLAG_MASK = wxFONTFLAG_ITALIC | + wxFONTFLAG_SLANT | + wxFONTFLAG_LIGHT | + wxFONTFLAG_BOLD | + wxFONTFLAG_ANTIALIASED | + wxFONTFLAG_NOT_ANTIALIASED | + wxFONTFLAG_UNDERLINED | + wxFONTFLAG_STRIKETHROUGH +}; + +// ---------------------------------------------------------------------------- +// wxFontInfo describes a wxFont +// ---------------------------------------------------------------------------- + +class wxFontInfo +{ +public: + // Default ctor uses the default font size appropriate for the current + // platform. + wxFontInfo() + { InitPointSize(-1); } + + // These ctors specify the font size, either in points or in pixels. + wxEXPLICIT wxFontInfo(int pointSize) + { InitPointSize(pointSize); } + wxEXPLICIT wxFontInfo(const wxSize& pixelSize) : m_pixelSize(pixelSize) + { Init(); } + + // Setters for the various attributes. All of them return the object itself + // so that the calls to them could be chained. + wxFontInfo& Family(wxFontFamily family) + { m_family = family; return *this; } + wxFontInfo& FaceName(const wxString& faceName) + { m_faceName = faceName; return *this; } + + wxFontInfo& Bold(bool bold = true) + { SetFlag(wxFONTFLAG_BOLD, bold); return *this; } + wxFontInfo& Light(bool light = true) + { SetFlag(wxFONTFLAG_LIGHT, light); return *this; } + + wxFontInfo& Italic(bool italic = true) + { SetFlag(wxFONTFLAG_ITALIC, italic); return *this; } + wxFontInfo& Slant(bool slant = true) + { SetFlag(wxFONTFLAG_SLANT, slant); return *this; } + + wxFontInfo& AntiAliased(bool antiAliased = true) + { SetFlag(wxFONTFLAG_ANTIALIASED, antiAliased); return *this; } + wxFontInfo& Underlined(bool underlined = true) + { SetFlag(wxFONTFLAG_UNDERLINED, underlined); return *this; } + wxFontInfo& Strikethrough(bool strikethrough = true) + { SetFlag(wxFONTFLAG_STRIKETHROUGH, strikethrough); return *this; } + + wxFontInfo& Encoding(wxFontEncoding encoding) + { m_encoding = encoding; return *this; } + + + // Set all flags at once. + wxFontInfo& AllFlags(int flags) + { m_flags = flags; return *this; } + + + // Accessors are mostly meant to be used by wxFont itself to extract the + // various pieces of the font description. + + bool IsUsingSizeInPixels() const { return m_pixelSize != wxDefaultSize; } + int GetPointSize() const { return m_pointSize; } + wxSize GetPixelSize() const { return m_pixelSize; } + wxFontFamily GetFamily() const { return m_family; } + const wxString& GetFaceName() const { return m_faceName; } + + wxFontStyle GetStyle() const + { + return m_flags & wxFONTFLAG_ITALIC + ? wxFONTSTYLE_ITALIC + : m_flags & wxFONTFLAG_SLANT + ? wxFONTSTYLE_SLANT + : wxFONTSTYLE_NORMAL; + } + + wxFontWeight GetWeight() const + { + return m_flags & wxFONTFLAG_LIGHT + ? wxFONTWEIGHT_LIGHT + : m_flags & wxFONTFLAG_BOLD + ? wxFONTWEIGHT_BOLD + : wxFONTWEIGHT_NORMAL; + } + + bool IsAntiAliased() const + { + return (m_flags & wxFONTFLAG_ANTIALIASED) != 0; + } + + bool IsUnderlined() const + { + return (m_flags & wxFONTFLAG_UNDERLINED) != 0; + } + + bool IsStrikethrough() const + { + return (m_flags & wxFONTFLAG_STRIKETHROUGH) != 0; + } + + wxFontEncoding GetEncoding() const { return m_encoding; } + + + // Default copy ctor, assignment operator and dtor are OK. + +private: + // Common part of all ctor, initializing everything except the size (which + // is initialized by the ctors themselves). + void Init() + { + m_family = wxFONTFAMILY_DEFAULT; + m_flags = wxFONTFLAG_DEFAULT; + m_encoding = wxFONTENCODING_DEFAULT; + } + + void InitPointSize(int pointSize) + { + Init(); + + m_pointSize = pointSize; + m_pixelSize = wxDefaultSize; + } + + // Turn on or off the given bit in m_flags depending on the value of the + // boolean argument. + void SetFlag(int flag, bool on) + { + if ( on ) + m_flags |= flag; + else + m_flags &= ~flag; + } + + // The size information: if m_pixelSize is valid (!= wxDefaultSize), then + // it is used. Otherwise m_pointSize is used, taking into account that if + // it is == -1, it means that the platform dependent font size should be + // used. + int m_pointSize; + wxSize m_pixelSize; + + wxFontFamily m_family; + wxString m_faceName; + int m_flags; + wxFontEncoding m_encoding; +}; + +// ---------------------------------------------------------------------------- +// wxFontBase represents a font object +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxNativeFontInfo; + +class WXDLLIMPEXP_CORE wxFontBase : public wxGDIObject +{ +public: + /* + derived classes should provide the following ctors: + + wxFont(); + wxFont(const wxFontInfo& info); + wxFont(const wxString& nativeFontInfoString); + wxFont(const wxNativeFontInfo& info); + wxFont(int size, + wxFontFamily family, + wxFontStyle style, + wxFontWeight weight, + bool underlined = false, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); + wxFont(const wxSize& pixelSize, + wxFontFamily family, + wxFontStyle style, + wxFontWeight weight, + bool underlined = false, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); + */ + + // creator function + virtual ~wxFontBase(); + + +#if FUTURE_WXWIN_COMPATIBILITY_3_0 + // from the font components + static wxFont *New( + int pointSize, // size of the font in points + int family, // see wxFontFamily enum + int style, // see wxFontStyle enum + int weight, // see wxFontWeight enum + bool underlined = false, // not underlined by default + const wxString& face = wxEmptyString, // facename + wxFontEncoding encoding = wxFONTENCODING_DEFAULT) // ISO8859-X, ... + { return New(pointSize, (wxFontFamily)family, (wxFontStyle)style, + (wxFontWeight)weight, underlined, face, encoding); } + + // from the font components + static wxFont *New( + const wxSize& pixelSize, // size of the font in pixels + int family, // see wxFontFamily enum + int style, // see wxFontStyle enum + int weight, // see wxFontWeight enum + bool underlined = false, // not underlined by default + const wxString& face = wxEmptyString, // facename + wxFontEncoding encoding = wxFONTENCODING_DEFAULT) // ISO8859-X, ... + { return New(pixelSize, (wxFontFamily)family, (wxFontStyle)style, + (wxFontWeight)weight, underlined, face, encoding); } +#endif + + // from the font components + static wxFont *New( + int pointSize, // size of the font in points + wxFontFamily family, // see wxFontFamily enum + wxFontStyle style, // see wxFontStyle enum + wxFontWeight weight, // see wxFontWeight enum + bool underlined = false, // not underlined by default + const wxString& face = wxEmptyString, // facename + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); // ISO8859-X, ... + + // from the font components + static wxFont *New( + const wxSize& pixelSize, // size of the font in pixels + wxFontFamily family, // see wxFontFamily enum + wxFontStyle style, // see wxFontStyle enum + wxFontWeight weight, // see wxFontWeight enum + bool underlined = false, // not underlined by default + const wxString& face = wxEmptyString, // facename + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); // ISO8859-X, ... + + // from the font components but using the font flags instead of separate + // parameters for each flag + static wxFont *New(int pointSize, + wxFontFamily family, + int flags = wxFONTFLAG_DEFAULT, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); + + + // from the font components but using the font flags instead of separate + // parameters for each flag + static wxFont *New(const wxSize& pixelSize, + wxFontFamily family, + int flags = wxFONTFLAG_DEFAULT, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); + + // from the (opaque) native font description object + static wxFont *New(const wxNativeFontInfo& nativeFontDesc); + + // from the string representation of wxNativeFontInfo + static wxFont *New(const wxString& strNativeFontDesc); + + // comparison + bool operator==(const wxFont& font) const; + bool operator!=(const wxFont& font) const { return !(*this == font); } + + // accessors: get the font characteristics + virtual int GetPointSize() const = 0; + virtual wxSize GetPixelSize() const; + virtual bool IsUsingSizeInPixels() const; + wxFontFamily GetFamily() const; + virtual wxFontStyle GetStyle() const = 0; + virtual wxFontWeight GetWeight() const = 0; + virtual bool GetUnderlined() const = 0; + virtual bool GetStrikethrough() const { return false; } + virtual wxString GetFaceName() const = 0; + virtual wxFontEncoding GetEncoding() const = 0; + virtual const wxNativeFontInfo *GetNativeFontInfo() const = 0; + + virtual bool IsFixedWidth() const; + + wxString GetNativeFontInfoDesc() const; + wxString GetNativeFontInfoUserDesc() const; + + // change the font characteristics + virtual void SetPointSize( int pointSize ) = 0; + virtual void SetPixelSize( const wxSize& pixelSize ); + virtual void SetFamily( wxFontFamily family ) = 0; + virtual void SetStyle( wxFontStyle style ) = 0; + virtual void SetWeight( wxFontWeight weight ) = 0; + + virtual void SetUnderlined( bool underlined ) = 0; + virtual void SetStrikethrough( bool WXUNUSED(strikethrough) ) {} + virtual void SetEncoding(wxFontEncoding encoding) = 0; + virtual bool SetFaceName( const wxString& faceName ); + void SetNativeFontInfo(const wxNativeFontInfo& info) + { DoSetNativeFontInfo(info); } + + bool SetNativeFontInfo(const wxString& info); + bool SetNativeFontInfoUserDesc(const wxString& info); + + // Symbolic font sizes support: set the font size to "large" or "very + // small" either absolutely (i.e. compared to the default font size) or + // relatively to the given font size. + void SetSymbolicSize(wxFontSymbolicSize size); + void SetSymbolicSizeRelativeTo(wxFontSymbolicSize size, int base) + { + SetPointSize(AdjustToSymbolicSize(size, base)); + } + + // Adjust the base size in points according to symbolic size. + static int AdjustToSymbolicSize(wxFontSymbolicSize size, int base); + + + // translate the fonts into human-readable string (i.e. GetStyleString() + // will return "wxITALIC" for an italic font, ...) + wxString GetFamilyString() const; + wxString GetStyleString() const; + wxString GetWeightString() const; + + // the default encoding is used for creating all fonts with default + // encoding parameter + static wxFontEncoding GetDefaultEncoding() { return ms_encodingDefault; } + static void SetDefaultEncoding(wxFontEncoding encoding); + + // this doesn't do anything and is kept for compatibility only +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED_INLINE(void SetNoAntiAliasing(bool no = true), wxUnusedVar(no);); + wxDEPRECATED_INLINE(bool GetNoAntiAliasing() const, return false;) +#endif // WXWIN_COMPATIBILITY_2_8 + +protected: + // the function called by both overloads of SetNativeFontInfo() + virtual void DoSetNativeFontInfo(const wxNativeFontInfo& info); + + // The function called by public GetFamily(): it can return + // wxFONTFAMILY_UNKNOWN unlike the public method (see comment there). + virtual wxFontFamily DoGetFamily() const = 0; + + + // Helper functions to recover wxFONTSTYLE/wxFONTWEIGHT and underlined flag + // values from flags containing a combination of wxFONTFLAG_XXX. + static wxFontStyle GetStyleFromFlags(int flags) + { + return flags & wxFONTFLAG_ITALIC + ? wxFONTSTYLE_ITALIC + : flags & wxFONTFLAG_SLANT + ? wxFONTSTYLE_SLANT + : wxFONTSTYLE_NORMAL; + } + + static wxFontWeight GetWeightFromFlags(int flags) + { + return flags & wxFONTFLAG_LIGHT + ? wxFONTWEIGHT_LIGHT + : flags & wxFONTFLAG_BOLD + ? wxFONTWEIGHT_BOLD + : wxFONTWEIGHT_NORMAL; + } + + static bool GetUnderlinedFromFlags(int flags) + { + return (flags & wxFONTFLAG_UNDERLINED) != 0; + } + + static bool GetStrikethroughFromFlags(int flags) + { + return (flags & wxFONTFLAG_STRIKETHROUGH) != 0; + } + +private: + // the currently default encoding: by default, it's the default system + // encoding, but may be changed by the application using + // SetDefaultEncoding() to make all subsequent fonts created without + // specifying encoding parameter using this encoding + static wxFontEncoding ms_encodingDefault; +}; + +// wxFontBase <-> wxString utilities, used by wxConfig +WXDLLIMPEXP_CORE wxString wxToString(const wxFontBase& font); +WXDLLIMPEXP_CORE bool wxFromString(const wxString& str, wxFontBase* font); + + +#if FUTURE_WXWIN_COMPATIBILITY_3_0 +#define wxDECLARE_FONT_COMPAT_SETTER \ + wxDEPRECATED_FUTURE( void SetFamily(int family) ) \ + { SetFamily((wxFontFamily)family); } \ + wxDEPRECATED_FUTURE( void SetStyle(int style) ) \ + { SetStyle((wxFontStyle)style); } \ + wxDEPRECATED_FUTURE( void SetWeight(int weight) ) \ + { SetWeight((wxFontWeight)weight); } \ + wxDEPRECATED_FUTURE( void SetFamily(wxDeprecatedGUIConstants family) ) \ + { SetFamily((wxFontFamily)family); } \ + wxDEPRECATED_FUTURE( void SetStyle(wxDeprecatedGUIConstants style) ) \ + { SetStyle((wxFontStyle)style); } \ + wxDEPRECATED_FUTURE( void SetWeight(wxDeprecatedGUIConstants weight) ) \ + { SetWeight((wxFontWeight)weight); } +#else +#define wxDECLARE_FONT_COMPAT_SETTER /*empty*/ +#endif + +// this macro must be used in all derived wxFont classes declarations +#define wxDECLARE_COMMON_FONT_METHODS() \ + wxDECLARE_FONT_COMPAT_SETTER \ + \ + /* functions for modifying font in place */ \ + wxFont& MakeBold(); \ + wxFont& MakeItalic(); \ + wxFont& MakeUnderlined(); \ + wxFont& MakeStrikethrough(); \ + wxFont& MakeLarger() { return Scale(1.2f); } \ + wxFont& MakeSmaller() { return Scale(1/1.2f); } \ + wxFont& Scale(float x); \ + /* functions for creating fonts based on this one */ \ + wxFont Bold() const; \ + wxFont Italic() const; \ + wxFont Underlined() const; \ + wxFont Strikethrough() const; \ + wxFont Larger() const { return Scaled(1.2f); } \ + wxFont Smaller() const { return Scaled(1/1.2f); } \ + wxFont Scaled(float x) const + +// include the real class declaration +#if defined(__WXMSW__) + #include "wx/msw/font.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/font.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/font.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/font.h" +#elif defined(__WXX11__) + #include "wx/x11/font.h" +#elif defined(__WXDFB__) + #include "wx/dfb/font.h" +#elif defined(__WXMAC__) + #include "wx/osx/font.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/font.h" +#elif defined(__WXPM__) + #include "wx/os2/font.h" +#endif + +class WXDLLIMPEXP_CORE wxFontList: public wxGDIObjListBase +{ +public: + wxFont *FindOrCreateFont(int pointSize, + wxFontFamily family, + wxFontStyle style, + wxFontWeight weight, + bool underline = false, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); + +#if FUTURE_WXWIN_COMPATIBILITY_3_0 + wxFont *FindOrCreateFont(int pointSize, int family, int style, int weight, + bool underline = false, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT) + { return FindOrCreateFont(pointSize, (wxFontFamily)family, (wxFontStyle)style, + (wxFontWeight)weight, underline, face, encoding); } +#endif + +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( void AddFont(wxFont*) ); + wxDEPRECATED( void RemoveFont(wxFont*) ); +#endif +}; + +extern WXDLLIMPEXP_DATA_CORE(wxFontList*) wxTheFontList; + + +// provide comparison operators to allow code such as +// +// if ( font.GetStyle() == wxFONTSTYLE_SLANT ) +// +// to compile without warnings which it would otherwise provoke from some +// compilers as it compares elements of different enums +#if FUTURE_WXWIN_COMPATIBILITY_3_0 + +// Unfortunately some compilers have ambiguity issues when enum comparisons are +// overloaded so we have to disable the overloads in this case, see +// wxCOMPILER_NO_OVERLOAD_ON_ENUM definition in wx/platform.h for more details. +#ifndef wxCOMPILER_NO_OVERLOAD_ON_ENUM + +inline bool operator==(wxFontFamily s, wxDeprecatedGUIConstants t) +{ return static_cast(s) == static_cast(t); } +inline bool operator!=(wxFontFamily s, wxDeprecatedGUIConstants t) +{ return !(s == t); } +inline bool operator==(wxFontStyle s, wxDeprecatedGUIConstants t) +{ return static_cast(s) == static_cast(t); } +inline bool operator!=(wxFontStyle s, wxDeprecatedGUIConstants t) +{ return !(s == t); } +inline bool operator==(wxFontWeight s, wxDeprecatedGUIConstants t) +{ return static_cast(s) == static_cast(t); } +inline bool operator!=(wxFontWeight s, wxDeprecatedGUIConstants t) +{ return !(s == t); } + +#endif // // wxCOMPILER_NO_OVERLOAD_ON_ENUM + +#endif // FUTURE_WXWIN_COMPATIBILITY_3_0 + +#endif + // _WX_FONT_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/fontdata.h b/wxmsw/include/wx-3.0/wx/fontdata.h new file mode 100644 index 00000000..87571ce9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fontdata.h @@ -0,0 +1,70 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fontdata.h +// Author: Julian Smart +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONTDATA_H_ +#define _WX_FONTDATA_H_ + +#include "wx/font.h" +#include "wx/colour.h" +#include "wx/encinfo.h" + +class WXDLLIMPEXP_CORE wxFontData : public wxObject +{ +public: + wxFontData(); + virtual ~wxFontData(); + + wxFontData(const wxFontData& data); + wxFontData& operator=(const wxFontData& data); + + void SetAllowSymbols(bool flag) { m_allowSymbols = flag; } + bool GetAllowSymbols() const { return m_allowSymbols; } + + void SetColour(const wxColour& colour) { m_fontColour = colour; } + const wxColour& GetColour() const { return m_fontColour; } + + void SetShowHelp(bool flag) { m_showHelp = flag; } + bool GetShowHelp() const { return m_showHelp; } + + void EnableEffects(bool flag) { m_enableEffects = flag; } + bool GetEnableEffects() const { return m_enableEffects; } + + void SetInitialFont(const wxFont& font) { m_initialFont = font; } + wxFont GetInitialFont() const { return m_initialFont; } + + void SetChosenFont(const wxFont& font) { m_chosenFont = font; } + wxFont GetChosenFont() const { return m_chosenFont; } + + void SetRange(int minRange, int maxRange) { m_minSize = minRange; m_maxSize = maxRange; } + + // encoding info is split into 2 parts: the logical wxWin encoding + // (wxFontEncoding) and a structure containing the native parameters for + // it (wxNativeEncodingInfo) + wxFontEncoding GetEncoding() const { return m_encoding; } + void SetEncoding(wxFontEncoding encoding) { m_encoding = encoding; } + + wxNativeEncodingInfo& EncodingInfo() { return m_encodingInfo; } + + + // public for backwards compatibility only: don't use directly + wxColour m_fontColour; + bool m_showHelp; + bool m_allowSymbols; + bool m_enableEffects; + wxFont m_initialFont; + wxFont m_chosenFont; + int m_minSize; + int m_maxSize; + +private: + wxFontEncoding m_encoding; + wxNativeEncodingInfo m_encodingInfo; + + DECLARE_DYNAMIC_CLASS(wxFontData) +}; + +#endif // _WX_FONTDATA_H_ diff --git a/wxmsw/include/wx-3.0/wx/fontdlg.h b/wxmsw/include/wx-3.0/wx/fontdlg.h new file mode 100644 index 00000000..74a6e6fc --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fontdlg.h @@ -0,0 +1,115 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/fontdlg.h +// Purpose: common interface for different wxFontDialog classes +// Author: Vadim Zeitlin +// Modified by: +// Created: 12.05.02 +// Copyright: (c) 1997-2002 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONTDLG_H_BASE_ +#define _WX_FONTDLG_H_BASE_ + +#include "wx/defs.h" // for wxUSE_FONTDLG + +#if wxUSE_FONTDLG + +#include "wx/dialog.h" // the base class +#include "wx/fontdata.h" + +// ---------------------------------------------------------------------------- +// wxFontDialog interface +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFontDialogBase : public wxDialog +{ +public: + // create the font dialog + wxFontDialogBase() { } + wxFontDialogBase(wxWindow *parent) { m_parent = parent; } + wxFontDialogBase(wxWindow *parent, const wxFontData& data) + { m_parent = parent; InitFontData(&data); } + + bool Create(wxWindow *parent) + { return DoCreate(parent); } + bool Create(wxWindow *parent, const wxFontData& data) + { InitFontData(&data); return Create(parent); } + + // retrieve the font data + const wxFontData& GetFontData() const { return m_fontData; } + wxFontData& GetFontData() { return m_fontData; } + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated interface, for compatibility only, don't use + wxDEPRECATED( wxFontDialogBase(wxWindow *parent, const wxFontData *data) ); + + wxDEPRECATED( bool Create(wxWindow *parent, const wxFontData *data) ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + virtual bool DoCreate(wxWindow *parent) { m_parent = parent; return true; } + + void InitFontData(const wxFontData *data = NULL) + { if ( data ) m_fontData = *data; } + + wxFontData m_fontData; + + wxDECLARE_NO_COPY_CLASS(wxFontDialogBase); +}; + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated interface, for compatibility only, don't use +inline wxFontDialogBase::wxFontDialogBase(wxWindow *parent, const wxFontData *data) +{ m_parent = parent; InitFontData(data); } + +inline bool wxFontDialogBase::Create(wxWindow *parent, const wxFontData *data) +{ InitFontData(data); return Create(parent); } +#endif // WXWIN_COMPATIBILITY_2_6 + +// ---------------------------------------------------------------------------- +// platform-specific wxFontDialog implementation +// ---------------------------------------------------------------------------- + +#if defined( __WXOSX_MAC__ ) +//set to 1 to use native mac font and color dialogs +#define USE_NATIVE_FONT_DIALOG_FOR_MACOSX 1 +#else +//not supported on these platforms, leave 0 +#define USE_NATIVE_FONT_DIALOG_FOR_MACOSX 0 +#endif + +#if defined(__WXUNIVERSAL__) || \ + defined(__WXMOTIF__) || \ + defined(__WXCOCOA__) || \ + defined(__WXWINCE__) || \ + defined(__WXGPE__) + + #include "wx/generic/fontdlgg.h" + #define wxFontDialog wxGenericFontDialog +#elif defined(__WXMSW__) + #include "wx/msw/fontdlg.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/fontdlg.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/fontdlg.h" +#elif defined(__WXPM__) + #include "wx/os2/fontdlg.h" +#elif defined(__WXMAC__) + #include "wx/osx/fontdlg.h" +#endif + +// ---------------------------------------------------------------------------- +// global public functions +// ---------------------------------------------------------------------------- + +// get the font from user and return it, returns wxNullFont if the dialog was +// cancelled +WXDLLIMPEXP_CORE wxFont wxGetFontFromUser(wxWindow *parent = NULL, + const wxFont& fontInit = wxNullFont, + const wxString& caption = wxEmptyString); + +#endif // wxUSE_FONTDLG + +#endif + // _WX_FONTDLG_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/fontenc.h b/wxmsw/include/wx-3.0/wx/fontenc.h new file mode 100644 index 00000000..5263997a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fontenc.h @@ -0,0 +1,163 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fontenc.h +// Purpose: wxFontEncoding constants +// Author: Vadim Zeitlin +// Modified by: +// Created: 29.03.00 +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONTENC_H_ +#define _WX_FONTENC_H_ + +// font encodings +enum wxFontEncoding +{ + wxFONTENCODING_SYSTEM = -1, // system default + wxFONTENCODING_DEFAULT, // current default encoding + + // ISO8859 standard defines a number of single-byte charsets + wxFONTENCODING_ISO8859_1, // West European (Latin1) + wxFONTENCODING_ISO8859_2, // Central and East European (Latin2) + wxFONTENCODING_ISO8859_3, // Esperanto (Latin3) + wxFONTENCODING_ISO8859_4, // Baltic (old) (Latin4) + wxFONTENCODING_ISO8859_5, // Cyrillic + wxFONTENCODING_ISO8859_6, // Arabic + wxFONTENCODING_ISO8859_7, // Greek + wxFONTENCODING_ISO8859_8, // Hebrew + wxFONTENCODING_ISO8859_9, // Turkish (Latin5) + wxFONTENCODING_ISO8859_10, // Variation of Latin4 (Latin6) + wxFONTENCODING_ISO8859_11, // Thai + wxFONTENCODING_ISO8859_12, // doesn't exist currently, but put it + // here anyhow to make all ISO8859 + // consecutive numbers + wxFONTENCODING_ISO8859_13, // Baltic (Latin7) + wxFONTENCODING_ISO8859_14, // Latin8 + wxFONTENCODING_ISO8859_15, // Latin9 (a.k.a. Latin0, includes euro) + wxFONTENCODING_ISO8859_MAX, + + // Cyrillic charset soup (see http://czyborra.com/charsets/cyrillic.html) + wxFONTENCODING_KOI8, // KOI8 Russian + wxFONTENCODING_KOI8_U, // KOI8 Ukrainian + wxFONTENCODING_ALTERNATIVE, // same as MS-DOS CP866 + wxFONTENCODING_BULGARIAN, // used under Linux in Bulgaria + + // what would we do without Microsoft? They have their own encodings + // for DOS + wxFONTENCODING_CP437, // original MS-DOS codepage + wxFONTENCODING_CP850, // CP437 merged with Latin1 + wxFONTENCODING_CP852, // CP437 merged with Latin2 + wxFONTENCODING_CP855, // another cyrillic encoding + wxFONTENCODING_CP866, // and another one + // and for Windows + wxFONTENCODING_CP874, // WinThai + wxFONTENCODING_CP932, // Japanese (shift-JIS) + wxFONTENCODING_CP936, // Chinese simplified (GB) + wxFONTENCODING_CP949, // Korean (Hangul charset, a.k.a. EUC-KR) + wxFONTENCODING_CP950, // Chinese (traditional - Big5) + wxFONTENCODING_CP1250, // WinLatin2 + wxFONTENCODING_CP1251, // WinCyrillic + wxFONTENCODING_CP1252, // WinLatin1 + wxFONTENCODING_CP1253, // WinGreek (8859-7) + wxFONTENCODING_CP1254, // WinTurkish + wxFONTENCODING_CP1255, // WinHebrew + wxFONTENCODING_CP1256, // WinArabic + wxFONTENCODING_CP1257, // WinBaltic (same as Latin 7) + wxFONTENCODING_CP1258, // WinVietnamese + wxFONTENCODING_CP1361, // Johab Korean character set. + wxFONTENCODING_CP12_MAX, + + wxFONTENCODING_UTF7, // UTF-7 Unicode encoding + wxFONTENCODING_UTF8, // UTF-8 Unicode encoding + wxFONTENCODING_EUC_JP, // Extended Unix Codepage for Japanese + wxFONTENCODING_UTF16BE, // UTF-16 Big Endian Unicode encoding + wxFONTENCODING_UTF16LE, // UTF-16 Little Endian Unicode encoding + wxFONTENCODING_UTF32BE, // UTF-32 Big Endian Unicode encoding + wxFONTENCODING_UTF32LE, // UTF-32 Little Endian Unicode encoding + + wxFONTENCODING_MACROMAN, // the standard mac encodings + wxFONTENCODING_MACJAPANESE, + wxFONTENCODING_MACCHINESETRAD, + wxFONTENCODING_MACKOREAN, + wxFONTENCODING_MACARABIC, + wxFONTENCODING_MACHEBREW, + wxFONTENCODING_MACGREEK, + wxFONTENCODING_MACCYRILLIC, + wxFONTENCODING_MACDEVANAGARI, + wxFONTENCODING_MACGURMUKHI, + wxFONTENCODING_MACGUJARATI, + wxFONTENCODING_MACORIYA, + wxFONTENCODING_MACBENGALI, + wxFONTENCODING_MACTAMIL, + wxFONTENCODING_MACTELUGU, + wxFONTENCODING_MACKANNADA, + wxFONTENCODING_MACMALAJALAM, + wxFONTENCODING_MACSINHALESE, + wxFONTENCODING_MACBURMESE, + wxFONTENCODING_MACKHMER, + wxFONTENCODING_MACTHAI, + wxFONTENCODING_MACLAOTIAN, + wxFONTENCODING_MACGEORGIAN, + wxFONTENCODING_MACARMENIAN, + wxFONTENCODING_MACCHINESESIMP, + wxFONTENCODING_MACTIBETAN, + wxFONTENCODING_MACMONGOLIAN, + wxFONTENCODING_MACETHIOPIC, + wxFONTENCODING_MACCENTRALEUR, + wxFONTENCODING_MACVIATNAMESE, + wxFONTENCODING_MACARABICEXT, + wxFONTENCODING_MACSYMBOL, + wxFONTENCODING_MACDINGBATS, + wxFONTENCODING_MACTURKISH, + wxFONTENCODING_MACCROATIAN, + wxFONTENCODING_MACICELANDIC, + wxFONTENCODING_MACROMANIAN, + wxFONTENCODING_MACCELTIC, + wxFONTENCODING_MACGAELIC, + wxFONTENCODING_MACKEYBOARD, + + // more CJK encodings (for historical reasons some are already declared + // above) + wxFONTENCODING_ISO2022_JP, // ISO-2022-JP JIS encoding + + wxFONTENCODING_MAX, // highest enumerated encoding value + + wxFONTENCODING_MACMIN = wxFONTENCODING_MACROMAN , + wxFONTENCODING_MACMAX = wxFONTENCODING_MACKEYBOARD , + + // aliases for endian-dependent UTF encodings +#ifdef WORDS_BIGENDIAN + wxFONTENCODING_UTF16 = wxFONTENCODING_UTF16BE, // native UTF-16 + wxFONTENCODING_UTF32 = wxFONTENCODING_UTF32BE, // native UTF-32 +#else // WORDS_BIGENDIAN + wxFONTENCODING_UTF16 = wxFONTENCODING_UTF16LE, // native UTF-16 + wxFONTENCODING_UTF32 = wxFONTENCODING_UTF32LE, // native UTF-32 +#endif // WORDS_BIGENDIAN + + // alias for the native Unicode encoding on this platform + // (this is used by wxEncodingConverter and wxUTFFile only for now) +#if SIZEOF_WCHAR_T == 2 + wxFONTENCODING_UNICODE = wxFONTENCODING_UTF16, +#else // SIZEOF_WCHAR_T == 4 + wxFONTENCODING_UNICODE = wxFONTENCODING_UTF32, +#endif + + // alternative names for Far Eastern encodings + // Chinese + wxFONTENCODING_GB2312 = wxFONTENCODING_CP936, // Simplified Chinese + wxFONTENCODING_BIG5 = wxFONTENCODING_CP950, // Traditional Chinese + + // Japanese (see http://zsigri.tripod.com/fontboard/cjk/jis.html) + wxFONTENCODING_SHIFT_JIS = wxFONTENCODING_CP932, // Shift JIS + + // Korean (CP 949 not actually the same but close enough) + wxFONTENCODING_EUC_KR = wxFONTENCODING_CP949, + wxFONTENCODING_JOHAB = wxFONTENCODING_CP1361, + + // Vietnamese + wxFONTENCODING_VIETNAMESE = wxFONTENCODING_CP1258 +}; + +#endif // _WX_FONTENC_H_ + diff --git a/wxmsw/include/wx-3.0/wx/fontenum.h b/wxmsw/include/wx-3.0/wx/fontenum.h new file mode 100644 index 00000000..782dc7fd --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fontenum.h @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fontenum.h +// Purpose: wxFontEnumerator class for getting available fonts +// Author: Julian Smart, Vadim Zeitlin +// Modified by: extended to enumerate more than just font facenames and works +// not only on Windows now (VZ) +// Created: 04/01/98 +// Copyright: (c) Julian Smart, Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONTENUM_H_ +#define _WX_FONTENUM_H_ + +#include "wx/defs.h" + +#if wxUSE_FONTENUM + +#include "wx/fontenc.h" +#include "wx/arrstr.h" + +// ---------------------------------------------------------------------------- +// wxFontEnumerator enumerates all available fonts on the system or only the +// fonts with given attributes +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFontEnumerator +{ +public: + wxFontEnumerator() {} + + // virtual dtor for the base class + virtual ~wxFontEnumerator() {} + + // start enumerating font facenames (either all of them or those which + // support the given encoding) - will result in OnFacename() being + // called for each available facename (until they are exhausted or + // OnFacename returns false) + virtual bool EnumerateFacenames + ( + wxFontEncoding encoding = wxFONTENCODING_SYSTEM, // all + bool fixedWidthOnly = false + ); + + // enumerate the different encodings either for given font facename or for + // all facenames - will result in OnFontEncoding() being called for each + // available (facename, encoding) couple + virtual bool EnumerateEncodings(const wxString& facename = wxEmptyString); + + // callbacks which are called after one of EnumerateXXX() functions from + // above is invoked - all of them may return false to stop enumeration or + // true to continue with it + + // called by EnumerateFacenames + virtual bool OnFacename(const wxString& WXUNUSED(facename)) + { return true; } + + // called by EnumerateEncodings + virtual bool OnFontEncoding(const wxString& WXUNUSED(facename), + const wxString& WXUNUSED(encoding)) + { return true; } + + + + // convenience function that returns array of facenames. + static wxArrayString + GetFacenames(wxFontEncoding encoding = wxFONTENCODING_SYSTEM, // all + bool fixedWidthOnly = false); + + // convenience function that returns array of all available encodings. + static wxArrayString GetEncodings(const wxString& facename = wxEmptyString); + + // convenience function that returns true if the given face name exist + // in the user's system + static bool IsValidFacename(const wxString &str); + +private: +#ifdef wxHAS_UTF8_FONTS + // helper for ports that only use UTF-8 encoding natively + bool EnumerateEncodingsUTF8(const wxString& facename); +#endif + + wxDECLARE_NO_COPY_CLASS(wxFontEnumerator); +}; + +#endif // wxUSE_FONTENUM + +#endif // _WX_FONTENUM_H_ diff --git a/wxmsw/include/wx-3.0/wx/fontmap.h b/wxmsw/include/wx-3.0/wx/fontmap.h new file mode 100644 index 00000000..c640daa8 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fontmap.h @@ -0,0 +1,289 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fontmap.h +// Purpose: wxFontMapper class +// Author: Vadim Zeitlin +// Modified by: +// Created: 04.11.99 +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONTMAPPER_H_ +#define _WX_FONTMAPPER_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#if wxUSE_FONTMAP + +#include "wx/fontenc.h" // for wxFontEncoding + +#if wxUSE_GUI + #include "wx/fontutil.h" // for wxNativeEncodingInfo +#endif // wxUSE_GUI + +#if wxUSE_CONFIG && wxUSE_FILECONFIG + class WXDLLIMPEXP_FWD_BASE wxConfigBase; +#endif // wxUSE_CONFIG + +class WXDLLIMPEXP_FWD_CORE wxFontMapper; + +#if wxUSE_GUI + class WXDLLIMPEXP_FWD_CORE wxWindow; +#endif // wxUSE_GUI + +// ============================================================================ +// wxFontMapper manages user-definable correspondence between wxWidgets font +// encodings and the fonts present on the machine. +// +// This is a singleton class, font mapper objects can only be accessed using +// wxFontMapper::Get(). +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxFontMapperBase: this is a non-interactive class which just uses its built +// in knowledge of the encodings equivalence +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFontMapperBase +{ +public: + // constructor and such + // --------------------- + + // default ctor + wxFontMapperBase(); + + // virtual dtor for any base class + virtual ~wxFontMapperBase(); + + // return instance of the wxFontMapper singleton + // wxBase code only cares that it's a wxFontMapperBase + // In wxBase, wxFontMapper is only forward declared + // so one cannot implicitly cast from it to wxFontMapperBase. + static wxFontMapperBase *Get(); + + // set the singleton to 'mapper' instance and return previous one + static wxFontMapper *Set(wxFontMapper *mapper); + + // delete the existing font mapper if any + static void Reset(); + + + // translates charset strings to encoding + // -------------------------------------- + + // returns the encoding for the given charset (in the form of RFC 2046) or + // wxFONTENCODING_SYSTEM if couldn't decode it + // + // interactive parameter is ignored in the base class, we behave as if it + // were always false + virtual wxFontEncoding CharsetToEncoding(const wxString& charset, + bool interactive = true); + + // information about supported encodings + // ------------------------------------- + + // get the number of font encodings we know about + static size_t GetSupportedEncodingsCount(); + + // get the n-th supported encoding + static wxFontEncoding GetEncoding(size_t n); + + // return canonical name of this encoding (this is a short string, + // GetEncodingDescription() returns a longer one) + static wxString GetEncodingName(wxFontEncoding encoding); + + // return a list of all names of this encoding (see GetEncodingName) + static const wxChar** GetAllEncodingNames(wxFontEncoding encoding); + + // return user-readable string describing the given encoding + // + // NB: hard-coded now, but might change later (read it from config?) + static wxString GetEncodingDescription(wxFontEncoding encoding); + + // find the encoding corresponding to the given name, inverse of + // GetEncodingName() and less general than CharsetToEncoding() + // + // returns wxFONTENCODING_MAX if the name is not a supported encoding + static wxFontEncoding GetEncodingFromName(const wxString& name); + + + // functions which allow to configure the config object used: by default, + // the global one (from wxConfigBase::Get() will be used) and the default + // root path for the config settings is the string returned by + // GetDefaultConfigPath() + // ---------------------------------------------------------------------- + +#if wxUSE_CONFIG && wxUSE_FILECONFIG + // set the root config path to use (should be an absolute path) + void SetConfigPath(const wxString& prefix); + + // return default config path + static const wxString& GetDefaultConfigPath(); +#endif // wxUSE_CONFIG + + + // returns true for the base class and false for a "real" font mapper object + // (implementation-only) + virtual bool IsDummy() { return true; } + +protected: +#if wxUSE_CONFIG && wxUSE_FILECONFIG + // get the config object we're using -- either the global config object + // or a wxMemoryConfig object created by this class otherwise + wxConfigBase *GetConfig(); + + // gets the root path for our settings -- if it wasn't set explicitly, use + // GetDefaultConfigPath() + const wxString& GetConfigPath(); + + // change to the given (relative) path in the config, return true if ok + // (then GetConfig() will return something !NULL), false if no config + // object + // + // caller should provide a pointer to the string variable which should be + // later passed to RestorePath() + bool ChangePath(const wxString& pathNew, wxString *pathOld); + + // restore the config path after use + void RestorePath(const wxString& pathOld); + + // config object and path (in it) to use + wxConfigBase *m_configDummy; + + wxString m_configRootPath; +#endif // wxUSE_CONFIG + + // the real implementation of the base class version of CharsetToEncoding() + // + // returns wxFONTENCODING_UNKNOWN if encoding is unknown and we shouldn't + // ask the user about it, wxFONTENCODING_SYSTEM if it is unknown but we + // should/could ask the user + int NonInteractiveCharsetToEncoding(const wxString& charset); + +private: + // the global fontmapper object or NULL + static wxFontMapper *sm_instance; + + friend class wxFontMapperPathChanger; + + wxDECLARE_NO_COPY_CLASS(wxFontMapperBase); +}; + +// ---------------------------------------------------------------------------- +// wxFontMapper: interactive extension of wxFontMapperBase +// +// The default implementations of all functions will ask the user if they are +// not capable of finding the answer themselves and store the answer in a +// config file (configurable via SetConfigXXX functions). This behaviour may +// be disabled by giving the value of false to "interactive" parameter. +// However, the functions will always consult the config file to allow the +// user-defined values override the default logic and there is no way to +// disable this -- which shouldn't be ever needed because if "interactive" was +// never true, the config file is never created anyhow. +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + +class WXDLLIMPEXP_CORE wxFontMapper : public wxFontMapperBase +{ +public: + // default ctor + wxFontMapper(); + + // virtual dtor for a base class + virtual ~wxFontMapper(); + + // working with the encodings + // -------------------------- + + // returns the encoding for the given charset (in the form of RFC 2046) or + // wxFONTENCODING_SYSTEM if couldn't decode it + virtual wxFontEncoding CharsetToEncoding(const wxString& charset, + bool interactive = true); + + // find an alternative for the given encoding (which is supposed to not be + // available on this system). If successful, return true and fill info + // structure with the parameters required to create the font, otherwise + // return false + virtual bool GetAltForEncoding(wxFontEncoding encoding, + wxNativeEncodingInfo *info, + const wxString& facename = wxEmptyString, + bool interactive = true); + + // version better suitable for 'public' use. Returns wxFontEcoding + // that can be used it wxFont ctor + bool GetAltForEncoding(wxFontEncoding encoding, + wxFontEncoding *alt_encoding, + const wxString& facename = wxEmptyString, + bool interactive = true); + + // checks whether given encoding is available in given face or not. + // + // if no facename is given (default), return true if it's available in any + // facename at alll. + virtual bool IsEncodingAvailable(wxFontEncoding encoding, + const wxString& facename = wxEmptyString); + + + // configure the appearance of the dialogs we may popup + // ---------------------------------------------------- + + // the parent window for modal dialogs + void SetDialogParent(wxWindow *parent) { m_windowParent = parent; } + + // the title for the dialogs (note that default is quite reasonable) + void SetDialogTitle(const wxString& title) { m_titleDialog = title; } + + // GUI code needs to know it's a wxFontMapper because there + // are additional methods in the subclass. + static wxFontMapper *Get(); + + // pseudo-RTTI since we aren't a wxObject. + virtual bool IsDummy() { return false; } + +protected: + // GetAltForEncoding() helper: tests for the existence of the given + // encoding and saves the result in config if ok - this results in the + // following (desired) behaviour: when an unknown/unavailable encoding is + // requested for the first time, the user is asked about a replacement, + // but if he doesn't choose any and the default logic finds one, it will + // be saved in the config so that the user won't be asked about it any + // more + bool TestAltEncoding(const wxString& configEntry, + wxFontEncoding encReplacement, + wxNativeEncodingInfo *info); + + // the title for our dialogs + wxString m_titleDialog; + + // the parent window for our dialogs + wxWindow *m_windowParent; + +private: + wxDECLARE_NO_COPY_CLASS(wxFontMapper); +}; + +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +// the default font mapper for wxWidgets programs do NOT use! This is for +// backward compatibility, use wxFontMapper::Get() instead +#define wxTheFontMapper (wxFontMapper::Get()) + +#else // !wxUSE_FONTMAP + +#if wxUSE_GUI + // wxEncodingToCodepage (utils.cpp) needs wxGetNativeFontEncoding + #include "wx/fontutil.h" +#endif + +#endif // wxUSE_FONTMAP/!wxUSE_FONTMAP + +#endif // _WX_FONTMAPPER_H_ + diff --git a/wxmsw/include/wx-3.0/wx/fontpicker.h b/wxmsw/include/wx-3.0/wx/fontpicker.h new file mode 100644 index 00000000..1bacc3a4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fontpicker.h @@ -0,0 +1,221 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fontpicker.h +// Purpose: wxFontPickerCtrl base header +// Author: Francesco Montorsi +// Modified by: +// Created: 14/4/2006 +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONTPICKER_H_BASE_ +#define _WX_FONTPICKER_H_BASE_ + +#include "wx/defs.h" + + +#if wxUSE_FONTPICKERCTRL + +#include "wx/pickerbase.h" + + +class WXDLLIMPEXP_FWD_CORE wxFontPickerEvent; + +extern WXDLLIMPEXP_DATA_CORE(const char) wxFontPickerWidgetNameStr[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxFontPickerCtrlNameStr[]; + + +// ---------------------------------------------------------------------------- +// wxFontPickerWidgetBase: a generic abstract interface which must be +// implemented by controls used by wxFontPickerCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFontPickerWidgetBase +{ +public: + wxFontPickerWidgetBase() { m_selectedFont = *wxNORMAL_FONT; } + virtual ~wxFontPickerWidgetBase() {} + + wxFont GetSelectedFont() const + { return m_selectedFont; } + virtual void SetSelectedFont(const wxFont &f) + { m_selectedFont = f; UpdateFont(); } + +protected: + + virtual void UpdateFont() = 0; + + // the current font (may be invalid if none) + // NOTE: don't call this m_font as wxWindow::m_font already exists + wxFont m_selectedFont; +}; + +// Styles which must be supported by all controls implementing wxFontPickerWidgetBase +// NB: these styles must be defined to carefully-chosen values to +// avoid conflicts with wxButton's styles + + +// keeps the label of the button updated with the fontface name + font size +// E.g. choosing "Times New Roman bold, italic with size 10" from the fontdialog, +// updates the wxFontButtonGeneric's label (overwriting any previous label) +// with the "Times New Roman, 10" text (only fontface + fontsize is displayed +// to avoid extralong labels). +#define wxFNTP_FONTDESC_AS_LABEL 0x0008 + +// uses the currently selected font to draw the label of the button +#define wxFNTP_USEFONT_FOR_LABEL 0x0010 + +#define wxFONTBTN_DEFAULT_STYLE \ + (wxFNTP_FONTDESC_AS_LABEL | wxFNTP_USEFONT_FOR_LABEL) + +// native version currently only exists in wxGTK2 +#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/fontpicker.h" + #define wxFontPickerWidget wxFontButton +#else + #include "wx/generic/fontpickerg.h" + #define wxFontPickerWidget wxGenericFontButton +#endif + + +// ---------------------------------------------------------------------------- +// wxFontPickerCtrl specific flags +// ---------------------------------------------------------------------------- + +#define wxFNTP_USE_TEXTCTRL (wxPB_USE_TEXTCTRL) +#define wxFNTP_DEFAULT_STYLE (wxFNTP_FONTDESC_AS_LABEL|wxFNTP_USEFONT_FOR_LABEL) + +// not a style but rather the default value of the maximum pointsize allowed +#define wxFNTP_MAXPOINT_SIZE 100 + + +// ---------------------------------------------------------------------------- +// wxFontPickerCtrl: platform-independent class which embeds the +// platform-dependent wxFontPickerWidget andm if wxFNTP_USE_TEXTCTRL style is +// used, a textctrl next to it. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFontPickerCtrl : public wxPickerBase +{ +public: + wxFontPickerCtrl() + : m_nMaxPointSize(wxFNTP_MAXPOINT_SIZE) + { + } + + virtual ~wxFontPickerCtrl() {} + + + wxFontPickerCtrl(wxWindow *parent, + wxWindowID id, + const wxFont& initial = wxNullFont, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxFNTP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFontPickerCtrlNameStr) + : m_nMaxPointSize(wxFNTP_MAXPOINT_SIZE) + { + Create(parent, id, initial, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxFont& initial = wxNullFont, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxFNTP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFontPickerCtrlNameStr); + + +public: // public API + + // get the font chosen + wxFont GetSelectedFont() const + { return ((wxFontPickerWidget *)m_picker)->GetSelectedFont(); } + + // sets currently displayed font + void SetSelectedFont(const wxFont& f); + + // set/get the max pointsize + void SetMaxPointSize(unsigned int max) + { m_nMaxPointSize=max; } + unsigned int GetMaxPointSize() const + { return m_nMaxPointSize; } + +public: // internal functions + + void UpdatePickerFromTextCtrl(); + void UpdateTextCtrlFromPicker(); + + // event handler for our picker + void OnFontChange(wxFontPickerEvent &); + + // used to convert wxString <-> wxFont + virtual wxString Font2String(const wxFont &font); + virtual wxFont String2Font(const wxString &font); + +protected: + + // extracts the style for our picker from wxFontPickerCtrl's style + long GetPickerStyle(long style) const + { return (style & (wxFNTP_FONTDESC_AS_LABEL|wxFNTP_USEFONT_FOR_LABEL)); } + + // the maximum pointsize allowed to the user + unsigned int m_nMaxPointSize; + +private: + DECLARE_DYNAMIC_CLASS(wxFontPickerCtrl) +}; + + +// ---------------------------------------------------------------------------- +// wxFontPickerEvent: used by wxFontPickerCtrl only +// ---------------------------------------------------------------------------- + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FONTPICKER_CHANGED, wxFontPickerEvent ); + +class WXDLLIMPEXP_CORE wxFontPickerEvent : public wxCommandEvent +{ +public: + wxFontPickerEvent() {} + wxFontPickerEvent(wxObject *generator, int id, const wxFont &f) + : wxCommandEvent(wxEVT_FONTPICKER_CHANGED, id), + m_font(f) + { + SetEventObject(generator); + } + + wxFont GetFont() const { return m_font; } + void SetFont(const wxFont &c) { m_font = c; } + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxFontPickerEvent(*this); } + +private: + wxFont m_font; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxFontPickerEvent) +}; + +// ---------------------------------------------------------------------------- +// event types and macros +// ---------------------------------------------------------------------------- + +typedef void (wxEvtHandler::*wxFontPickerEventFunction)(wxFontPickerEvent&); + +#define wxFontPickerEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxFontPickerEventFunction, func) + +#define EVT_FONTPICKER_CHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_FONTPICKER_CHANGED, id, wxFontPickerEventHandler(fn)) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_FONTPICKER_CHANGED wxEVT_FONTPICKER_CHANGED + + +#endif // wxUSE_FONTPICKERCTRL + +#endif + // _WX_FONTPICKER_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/fontutil.h b/wxmsw/include/wx-3.0/wx/fontutil.h new file mode 100644 index 00000000..a4e0a7d4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fontutil.h @@ -0,0 +1,316 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fontutil.h +// Purpose: font-related helper functions +// Author: Vadim Zeitlin +// Modified by: +// Created: 05.11.99 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// General note: this header is private to wxWidgets and is not supposed to be +// included by user code. The functions declared here are implemented in +// msw/fontutil.cpp for Windows, unix/fontutil.cpp for GTK/Motif &c. + +#ifndef _WX_FONTUTIL_H_ +#define _WX_FONTUTIL_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/font.h" // for wxFont and wxFontEncoding + +#if defined(__WXMSW__) + #include "wx/msw/wrapwin.h" +#endif + +class WXDLLIMPEXP_FWD_BASE wxArrayString; +struct WXDLLIMPEXP_FWD_CORE wxNativeEncodingInfo; + +#if defined(_WX_X_FONTLIKE) + +// the symbolic names for the XLFD fields (with examples for their value) +// +// NB: we suppose that the font always starts with the empty token (font name +// registry field) as we never use nor generate it anyhow +enum wxXLFDField +{ + wxXLFD_FOUNDRY, // adobe + wxXLFD_FAMILY, // courier, times, ... + wxXLFD_WEIGHT, // black, bold, demibold, medium, regular, light + wxXLFD_SLANT, // r/i/o (roman/italique/oblique) + wxXLFD_SETWIDTH, // condensed, expanded, ... + wxXLFD_ADDSTYLE, // whatever - usually nothing + wxXLFD_PIXELSIZE, // size in pixels + wxXLFD_POINTSIZE, // size in points + wxXLFD_RESX, // 72, 75, 100, ... + wxXLFD_RESY, + wxXLFD_SPACING, // m/p/c (monospaced/proportional/character cell) + wxXLFD_AVGWIDTH, // average width in 1/10 pixels + wxXLFD_REGISTRY, // iso8859, rawin, koi8, ... + wxXLFD_ENCODING, // 1, r, r, ... + wxXLFD_MAX +}; + +#endif // _WX_X_FONTLIKE + +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +// wxNativeFontInfo is platform-specific font representation: this struct +// should be considered as opaque font description only used by the native +// functions, the user code can only get the objects of this type from +// somewhere and pass it somewhere else (possibly save them somewhere using +// ToString() and restore them using FromString()) + +class WXDLLIMPEXP_CORE wxNativeFontInfo +{ +public: +#if wxUSE_PANGO + PangoFontDescription *description; + + // Pango font description doesn't have these attributes, so we store them + // separately and handle them ourselves in {To,From}String() methods. + bool m_underlined; + bool m_strikethrough; +#elif defined(_WX_X_FONTLIKE) + // the members can't be accessed directly as we only parse the + // xFontName on demand +private: + // the components of the XLFD + wxString fontElements[wxXLFD_MAX]; + + // the full XLFD + wxString xFontName; + + // true until SetXFontName() is called + bool m_isDefault; + + // return true if we have already initialized fontElements + inline bool HasElements() const; + +public: + // init the elements from an XLFD, return true if ok + bool FromXFontName(const wxString& xFontName); + + // return false if we were never initialized with a valid XLFD + bool IsDefault() const { return m_isDefault; } + + // return the XLFD (using the fontElements if necessary) + wxString GetXFontName() const; + + // get the given XFLD component + wxString GetXFontComponent(wxXLFDField field) const; + + // change the font component + void SetXFontComponent(wxXLFDField field, const wxString& value); + + // set the XFLD + void SetXFontName(const wxString& xFontName); +#elif defined(__WXMSW__) + wxNativeFontInfo(const LOGFONT& lf_) : lf(lf_) { } + + LOGFONT lf; +#elif defined(__WXPM__) + // OS/2 native structures that define a font + FATTRS fa; + FONTMETRICS fm; + FACENAMEDESC fn; +#elif defined(__WXOSX__) +public: + wxNativeFontInfo(const wxNativeFontInfo& info) { Init(info); } + wxNativeFontInfo( int size, + wxFontFamily family, + wxFontStyle style, + wxFontWeight weight, + bool underlined, + const wxString& faceName, + wxFontEncoding encoding) + { Init(size,family,style,weight,underlined,faceName,encoding); } + + ~wxNativeFontInfo() { Free(); } + + wxNativeFontInfo& operator=(const wxNativeFontInfo& info) + { + if (this != &info) + { + Free(); + Init(info); + } + return *this; + } + + void Init(CTFontDescriptorRef descr); + void Init(const wxNativeFontInfo& info); + void Init(int size, + wxFontFamily family, + wxFontStyle style, + wxFontWeight weight, + bool underlined, + const wxString& faceName , + wxFontEncoding encoding); + + void Free(); + void EnsureValid(); + + bool m_descriptorValid; + +#if wxOSX_USE_ATSU_TEXT + bool m_atsuFontValid; + // the atsu font ID + wxUint32 m_atsuFontID; + // the qd styles that are not intrinsic to the font above + wxInt16 m_atsuAdditionalQDStyles; +#if wxOSX_USE_CARBON + wxInt16 m_qdFontFamily; + wxInt16 m_qdFontStyle; +#endif +#endif + + int m_pointSize; + wxFontFamily m_family; + wxFontStyle m_style; + wxFontWeight m_weight; + bool m_underlined; + bool m_strikethrough; + wxString m_faceName; + wxFontEncoding m_encoding; +public : +#else // other platforms + // + // This is a generic implementation that should work on all ports + // without specific support by the port. + // + #define wxNO_NATIVE_FONTINFO + + int pointSize; + wxFontFamily family; + wxFontStyle style; + wxFontWeight weight; + bool underlined; + bool strikethrough; + wxString faceName; + wxFontEncoding encoding; +#endif // platforms + + // default ctor (default copy ctor is ok) + wxNativeFontInfo() { Init(); } + +#if wxUSE_PANGO +private: + void Init(const wxNativeFontInfo& info); + void Free(); + +public: + wxNativeFontInfo(const wxNativeFontInfo& info) { Init(info); } + ~wxNativeFontInfo() { Free(); } + + wxNativeFontInfo& operator=(const wxNativeFontInfo& info) + { + if (this != &info) + { + Free(); + Init(info); + } + return *this; + } +#endif // wxUSE_PANGO + + // reset to the default state + void Init(); + + // init with the parameters of the given font + void InitFromFont(const wxFont& font) + { + // translate all font parameters + SetStyle((wxFontStyle)font.GetStyle()); + SetWeight((wxFontWeight)font.GetWeight()); + SetUnderlined(font.GetUnderlined()); + SetStrikethrough(font.GetStrikethrough()); +#if defined(__WXMSW__) + if ( font.IsUsingSizeInPixels() ) + SetPixelSize(font.GetPixelSize()); + else + SetPointSize(font.GetPointSize()); +#else + SetPointSize(font.GetPointSize()); +#endif + + // set the family/facename + SetFamily((wxFontFamily)font.GetFamily()); + const wxString& facename = font.GetFaceName(); + if ( !facename.empty() ) + { + SetFaceName(facename); + } + + // deal with encoding now (it may override the font family and facename + // so do it after setting them) + SetEncoding(font.GetEncoding()); + } + + // accessors and modifiers for the font elements + int GetPointSize() const; + wxSize GetPixelSize() const; + wxFontStyle GetStyle() const; + wxFontWeight GetWeight() const; + bool GetUnderlined() const; + bool GetStrikethrough() const; + wxString GetFaceName() const; + wxFontFamily GetFamily() const; + wxFontEncoding GetEncoding() const; + + void SetPointSize(int pointsize); + void SetPixelSize(const wxSize& pixelSize); + void SetStyle(wxFontStyle style); + void SetWeight(wxFontWeight weight); + void SetUnderlined(bool underlined); + void SetStrikethrough(bool strikethrough); + bool SetFaceName(const wxString& facename); + void SetFamily(wxFontFamily family); + void SetEncoding(wxFontEncoding encoding); + + // sets the first facename in the given array which is found + // to be valid. If no valid facename is given, sets the + // first valid facename returned by wxFontEnumerator::GetFacenames(). + // Does not return a bool since it cannot fail. + void SetFaceName(const wxArrayString &facenames); + + + // it is important to be able to serialize wxNativeFontInfo objects to be + // able to store them (in config file, for example) + bool FromString(const wxString& s); + wxString ToString() const; + + // we also want to present the native font descriptions to the user in some + // human-readable form (it is not platform independent neither, but can + // hopefully be understood by the user) + bool FromUserString(const wxString& s); + wxString ToUserString() const; +}; + +// ---------------------------------------------------------------------------- +// font-related functions (common) +// ---------------------------------------------------------------------------- + +// translate a wxFontEncoding into native encoding parameter (defined above), +// returning true if an (exact) macth could be found, false otherwise (without +// attempting any substitutions) +WXDLLIMPEXP_CORE bool wxGetNativeFontEncoding(wxFontEncoding encoding, + wxNativeEncodingInfo *info); + +// test for the existence of the font described by this facename/encoding, +// return true if such font(s) exist, false otherwise +WXDLLIMPEXP_CORE bool wxTestFontEncoding(const wxNativeEncodingInfo& info); + +// ---------------------------------------------------------------------------- +// font-related functions (X and GTK) +// ---------------------------------------------------------------------------- + +#ifdef _WX_X_FONTLIKE + #include "wx/unix/fontutil.h" +#endif // X || GDK + +#endif // _WX_FONTUTIL_H_ diff --git a/wxmsw/include/wx-3.0/wx/frame.h b/wxmsw/include/wx-3.0/wx/frame.h new file mode 100644 index 00000000..41927f77 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/frame.h @@ -0,0 +1,275 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/frame.h +// Purpose: wxFrame class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 15.11.99 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FRAME_H_BASE_ +#define _WX_FRAME_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/toplevel.h" // the base class +#include "wx/statusbr.h" + +// the default names for various classs +extern WXDLLIMPEXP_DATA_CORE(const char) wxStatusLineNameStr[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxToolBarNameStr[]; + +class WXDLLIMPEXP_FWD_CORE wxFrame; +class WXDLLIMPEXP_FWD_CORE wxMenuBar; +class WXDLLIMPEXP_FWD_CORE wxMenuItem; +class WXDLLIMPEXP_FWD_CORE wxStatusBar; +class WXDLLIMPEXP_FWD_CORE wxToolBar; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// wxFrame-specific (i.e. not for wxDialog) styles +// +// Also see the bit summary table in wx/toplevel.h. +#define wxFRAME_NO_TASKBAR 0x0002 // No taskbar button (MSW only) +#define wxFRAME_TOOL_WINDOW 0x0004 // No taskbar button, no system menu +#define wxFRAME_FLOAT_ON_PARENT 0x0008 // Always above its parent + +// ---------------------------------------------------------------------------- +// wxFrame is a top-level window with optional menubar, statusbar and toolbar +// +// For each of *bars, a frame may have several of them, but only one is +// managed by the frame, i.e. resized/moved when the frame is and whose size +// is accounted for in client size calculations - all others should be taken +// care of manually. The CreateXXXBar() functions create this, main, XXXBar, +// but the actual creation is done in OnCreateXXXBar() functions which may be +// overridden to create custom objects instead of standard ones when +// CreateXXXBar() is called. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFrameBase : public wxTopLevelWindow +{ +public: + // construction + wxFrameBase(); + virtual ~wxFrameBase(); + + wxFrame *New(wxWindow *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + // frame state + // ----------- + + // get the origin of the client area (which may be different from (0, 0) + // if the frame has a toolbar) in client coordinates + virtual wxPoint GetClientAreaOrigin() const; + + + // menu bar functions + // ------------------ + +#if wxUSE_MENUS + virtual void SetMenuBar(wxMenuBar *menubar); + virtual wxMenuBar *GetMenuBar() const { return m_frameMenuBar; } + + // find the item by id in the frame menu bar: this is an internal function + // and exists mainly in order to be overridden in the MDI parent frame + // which also looks at its active child menu bar + virtual wxMenuItem *FindItemInMenuBar(int menuId) const; + + // generate menu command corresponding to the given menu item + // + // returns true if processed + bool ProcessCommand(wxMenuItem *item); + + // generate menu command corresponding to the given menu command id + // + // returns true if processed + bool ProcessCommand(int winid); +#else + bool ProcessCommand(int WXUNUSED(winid)) { return false; } +#endif // wxUSE_MENUS + + // status bar functions + // -------------------- +#if wxUSE_STATUSBAR + // create the main status bar by calling OnCreateStatusBar() + virtual wxStatusBar* CreateStatusBar(int number = 1, + long style = wxSTB_DEFAULT_STYLE, + wxWindowID winid = 0, + const wxString& name = wxStatusLineNameStr); + // return a new status bar + virtual wxStatusBar *OnCreateStatusBar(int number, + long style, + wxWindowID winid, + const wxString& name); + // get the main status bar + virtual wxStatusBar *GetStatusBar() const { return m_frameStatusBar; } + + // sets the main status bar + virtual void SetStatusBar(wxStatusBar *statBar); + + // forward these to status bar + virtual void SetStatusText(const wxString &text, int number = 0); + virtual void SetStatusWidths(int n, const int widths_field[]); + void PushStatusText(const wxString &text, int number = 0); + void PopStatusText(int number = 0); + + // set the status bar pane the help will be shown in + void SetStatusBarPane(int n) { m_statusBarPane = n; } + int GetStatusBarPane() const { return m_statusBarPane; } +#endif // wxUSE_STATUSBAR + + // toolbar functions + // ----------------- + +#if wxUSE_TOOLBAR + // create main toolbar bycalling OnCreateToolBar() + virtual wxToolBar* CreateToolBar(long style = -1, + wxWindowID winid = wxID_ANY, + const wxString& name = wxToolBarNameStr); + // return a new toolbar + virtual wxToolBar *OnCreateToolBar(long style, + wxWindowID winid, + const wxString& name ); + + // get/set the main toolbar + virtual wxToolBar *GetToolBar() const { return m_frameToolBar; } + virtual void SetToolBar(wxToolBar *toolbar); +#endif // wxUSE_TOOLBAR + + // implementation only from now on + // ------------------------------- + + // event handlers +#if wxUSE_MENUS +#if wxUSE_STATUSBAR + void OnMenuOpen(wxMenuEvent& event); + void OnMenuClose(wxMenuEvent& event); + void OnMenuHighlight(wxMenuEvent& event); +#endif // wxUSE_STATUSBAR + + // send wxUpdateUIEvents for all menu items in the menubar, + // or just for menu if non-NULL + virtual void DoMenuUpdates(wxMenu* menu = NULL); +#endif // wxUSE_MENUS + + // do the UI update processing for this window + virtual void UpdateWindowUI(long flags = wxUPDATE_UI_NONE); + + // Implement internal behaviour (menu updating on some platforms) + virtual void OnInternalIdle(); + +#if wxUSE_MENUS || wxUSE_TOOLBAR + // show help text for the currently selected menu or toolbar item + // (typically in the status bar) or hide it and restore the status bar text + // originally shown before the menu was opened if show == false + virtual void DoGiveHelp(const wxString& text, bool show); +#endif + + virtual bool IsClientAreaChild(const wxWindow *child) const + { + return !IsOneOfBars(child) && wxTopLevelWindow::IsClientAreaChild(child); + } + +protected: + // the frame main menu/status/tool bars + // ------------------------------------ + + // this (non virtual!) function should be called from dtor to delete the + // main menubar, statusbar and toolbar (if any) + void DeleteAllBars(); + + // test whether this window makes part of the frame + virtual bool IsOneOfBars(const wxWindow *win) const; + +#if wxUSE_MENUS + // override to update menu bar position when the frame size changes + virtual void PositionMenuBar() { } + + // override to do something special when the menu bar is being removed + // from the frame + virtual void DetachMenuBar(); + + // override to do something special when the menu bar is attached to the + // frame + virtual void AttachMenuBar(wxMenuBar *menubar); + + // Return true if we should update the menu item state from idle event + // handler or false if we should delay it until the menu is opened. + static bool ShouldUpdateMenuFromIdle(); + + wxMenuBar *m_frameMenuBar; +#endif // wxUSE_MENUS + +#if wxUSE_STATUSBAR && (wxUSE_MENUS || wxUSE_TOOLBAR) + // the saved status bar text overwritten by DoGiveHelp() + wxString m_oldStatusText; + + // the last help string we have shown in the status bar + wxString m_lastHelpShown; +#endif + +#if wxUSE_STATUSBAR + // override to update status bar position (or anything else) when + // something changes + virtual void PositionStatusBar() { } + + // show the help string for the given menu item using DoGiveHelp() if the + // given item does have a help string (as determined by FindInMenuBar()), + // return false if there is no help for such item + bool ShowMenuHelp(int helpid); + + wxStatusBar *m_frameStatusBar; +#endif // wxUSE_STATUSBAR + + + int m_statusBarPane; + +#if wxUSE_TOOLBAR + // override to update status bar position (or anything else) when + // something changes + virtual void PositionToolBar() { } + + wxToolBar *m_frameToolBar; +#endif // wxUSE_TOOLBAR + +#if wxUSE_MENUS && wxUSE_STATUSBAR + DECLARE_EVENT_TABLE() +#endif // wxUSE_MENUS && wxUSE_STATUSBAR + + wxDECLARE_NO_COPY_CLASS(wxFrameBase); +}; + +// include the real class declaration +#if defined(__WXUNIVERSAL__) // && !defined(__WXMICROWIN__) + #include "wx/univ/frame.h" +#else // !__WXUNIVERSAL__ + #if defined(__WXMSW__) + #include "wx/msw/frame.h" + #elif defined(__WXGTK20__) + #include "wx/gtk/frame.h" + #elif defined(__WXGTK__) + #include "wx/gtk1/frame.h" + #elif defined(__WXMOTIF__) + #include "wx/motif/frame.h" + #elif defined(__WXMAC__) + #include "wx/osx/frame.h" + #elif defined(__WXCOCOA__) + #include "wx/cocoa/frame.h" + #elif defined(__WXPM__) + #include "wx/os2/frame.h" + #endif +#endif + +#endif + // _WX_FRAME_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/fs_arc.h b/wxmsw/include/wx-3.0/wx/fs_arc.h new file mode 100644 index 00000000..e65b8fc7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fs_arc.h @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fs_arc.h +// Purpose: Archive file system +// Author: Vaclav Slavik, Mike Wetherell +// Copyright: (c) 1999 Vaclav Slavik, (c) 2006 Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FS_ARC_H_ +#define _WX_FS_ARC_H_ + +#include "wx/defs.h" + +#if wxUSE_FS_ARCHIVE + +#include "wx/filesys.h" +#include "wx/hashmap.h" + +WX_DECLARE_STRING_HASH_MAP(int, wxArchiveFilenameHashMap); + +//--------------------------------------------------------------------------- +// wxArchiveFSHandler +//--------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxArchiveFSHandler : public wxFileSystemHandler +{ +public: + wxArchiveFSHandler(); + virtual bool CanOpen(const wxString& location); + virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); + virtual wxString FindFirst(const wxString& spec, int flags = 0); + virtual wxString FindNext(); + void Cleanup(); + virtual ~wxArchiveFSHandler(); + +private: + class wxArchiveFSCache *m_cache; + wxFileSystem m_fs; + + // these vars are used by FindFirst/Next: + class wxArchiveFSCacheData *m_Archive; + struct wxArchiveFSEntry *m_FindEntry; + wxString m_Pattern, m_BaseDir, m_ZipFile; + bool m_AllowDirs, m_AllowFiles; + wxArchiveFilenameHashMap *m_DirsFound; + + wxString DoFind(); + + wxDECLARE_NO_COPY_CLASS(wxArchiveFSHandler); + DECLARE_DYNAMIC_CLASS(wxArchiveFSHandler) +}; + +#endif // wxUSE_FS_ARCHIVE + +#endif // _WX_FS_ARC_H_ diff --git a/wxmsw/include/wx-3.0/wx/fs_filter.h b/wxmsw/include/wx-3.0/wx/fs_filter.h new file mode 100644 index 00000000..8e8afda4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fs_filter.h @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fs_filter.h +// Purpose: Filter file system handler +// Author: Mike Wetherell +// Copyright: (c) 2006 Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FS_FILTER_H_ +#define _WX_FS_FILTER_H_ + +#include "wx/defs.h" + +#if wxUSE_FILESYSTEM + +#include "wx/filesys.h" + +//--------------------------------------------------------------------------- +// wxFilterFSHandler +//--------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFilterFSHandler : public wxFileSystemHandler +{ +public: + wxFilterFSHandler() : wxFileSystemHandler() { } + virtual ~wxFilterFSHandler() { } + + virtual bool CanOpen(const wxString& location); + virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); + + virtual wxString FindFirst(const wxString& spec, int flags = 0); + virtual wxString FindNext(); + +private: + wxDECLARE_NO_COPY_CLASS(wxFilterFSHandler); +}; + +#endif // wxUSE_FILESYSTEM + +#endif // _WX_FS_FILTER_H_ diff --git a/wxmsw/include/wx-3.0/wx/fs_inet.h b/wxmsw/include/wx-3.0/wx/fs_inet.h new file mode 100644 index 00000000..bde0c695 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fs_inet.h @@ -0,0 +1,33 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fs_inet.h +// Purpose: HTTP and FTP file system +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FS_INET_H_ +#define _WX_FS_INET_H_ + +#include "wx/defs.h" + +#if wxUSE_FILESYSTEM && wxUSE_FS_INET && wxUSE_STREAMS && wxUSE_SOCKETS + +#include "wx/filesys.h" + +// ---------------------------------------------------------------------------- +// wxInternetFSHandler +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_NET wxInternetFSHandler : public wxFileSystemHandler +{ + public: + virtual bool CanOpen(const wxString& location); + virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); +}; + +#endif + // wxUSE_FILESYSTEM && wxUSE_FS_INET && wxUSE_STREAMS && wxUSE_SOCKETS + +#endif // _WX_FS_INET_H_ + diff --git a/wxmsw/include/wx-3.0/wx/fs_mem.h b/wxmsw/include/wx-3.0/wx/fs_mem.h new file mode 100644 index 00000000..6688537c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fs_mem.h @@ -0,0 +1,140 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fs_mem.h +// Purpose: in-memory file system +// Author: Vaclav Slavik +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FS_MEM_H_ +#define _WX_FS_MEM_H_ + +#include "wx/defs.h" + +#if wxUSE_FILESYSTEM + +#include "wx/filesys.h" + +#include "wx/hashmap.h" + +class wxMemoryFSFile; +WX_DECLARE_STRING_HASH_MAP(wxMemoryFSFile *, wxMemoryFSHash); + +#if wxUSE_GUI + #include "wx/bitmap.h" +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// wxMemoryFSHandlerBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMemoryFSHandlerBase : public wxFileSystemHandler +{ +public: + wxMemoryFSHandlerBase(); + virtual ~wxMemoryFSHandlerBase(); + + // Add file to list of files stored in memory. Stored data (bitmap, text or + // raw data) will be copied into private memory stream and available under + // name "memory:" + filename + static void AddFile(const wxString& filename, const wxString& textdata); + static void AddFile(const wxString& filename, const void *binarydata, size_t size); + static void AddFileWithMimeType(const wxString& filename, + const wxString& textdata, + const wxString& mimetype); + static void AddFileWithMimeType(const wxString& filename, + const void *binarydata, size_t size, + const wxString& mimetype); + + // Remove file from memory FS and free occupied memory + static void RemoveFile(const wxString& filename); + + virtual bool CanOpen(const wxString& location); + virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); + virtual wxString FindFirst(const wxString& spec, int flags = 0); + virtual wxString FindNext(); + +protected: + // check that the given file is not already present in m_Hash; logs an + // error and returns false if it does exist + static bool CheckDoesntExist(const wxString& filename); + + // the hash map indexed by the names of the files stored in the memory FS + static wxMemoryFSHash m_Hash; + + // the file name currently being searched for, i.e. the argument of the + // last FindFirst() call or empty string if FindFirst() hasn't been called + // yet or FindNext() didn't find anything + wxString m_findArgument; + + // iterator into m_Hash used by FindFirst/Next(), possibly m_Hash.end() or + // even invalid (can only be used when m_findArgument is not empty) + wxMemoryFSHash::const_iterator m_findIter; +}; + +// ---------------------------------------------------------------------------- +// wxMemoryFSHandler +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + +// add GUI-only operations to the base class +class WXDLLIMPEXP_CORE wxMemoryFSHandler : public wxMemoryFSHandlerBase +{ +public: + // bring the base class versions into the scope, otherwise they would be + // inaccessible in wxMemoryFSHandler + // (unfortunately "using" can't be used as gcc 2.95 doesn't have it...) + static void AddFile(const wxString& filename, const wxString& textdata) + { + wxMemoryFSHandlerBase::AddFile(filename, textdata); + } + + static void AddFile(const wxString& filename, + const void *binarydata, + size_t size) + { + wxMemoryFSHandlerBase::AddFile(filename, binarydata, size); + } + static void AddFileWithMimeType(const wxString& filename, + const wxString& textdata, + const wxString& mimetype) + { + wxMemoryFSHandlerBase::AddFileWithMimeType(filename, + textdata, + mimetype); + } + static void AddFileWithMimeType(const wxString& filename, + const void *binarydata, size_t size, + const wxString& mimetype) + { + wxMemoryFSHandlerBase::AddFileWithMimeType(filename, + binarydata, size, + mimetype); + } + +#if wxUSE_IMAGE + static void AddFile(const wxString& filename, + const wxImage& image, + wxBitmapType type); + + static void AddFile(const wxString& filename, + const wxBitmap& bitmap, + wxBitmapType type); +#endif // wxUSE_IMAGE + +}; + +#else // !wxUSE_GUI + +// just the same thing as the base class in wxBase +class WXDLLIMPEXP_BASE wxMemoryFSHandler : public wxMemoryFSHandlerBase +{ +}; + +#endif // wxUSE_GUI/!wxUSE_GUI + +#endif // wxUSE_FILESYSTEM + +#endif // _WX_FS_MEM_H_ + diff --git a/wxmsw/include/wx-3.0/wx/fs_zip.h b/wxmsw/include/wx-3.0/wx/fs_zip.h new file mode 100644 index 00000000..197a46a5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fs_zip.h @@ -0,0 +1,22 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fs_zip.h +// Purpose: wxZipFSHandler typedef for compatibility +// Author: Mike Wetherell +// Copyright: (c) 2006 Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FS_ZIP_H_ +#define _WX_FS_ZIP_H_ + +#include "wx/defs.h" + +#if wxUSE_FS_ZIP + +#include "wx/fs_arc.h" + +typedef wxArchiveFSHandler wxZipFSHandler; + +#endif // wxUSE_FS_ZIP + +#endif // _WX_FS_ZIP_H_ diff --git a/wxmsw/include/wx-3.0/wx/fswatcher.h b/wxmsw/include/wx-3.0/wx/fswatcher.h new file mode 100644 index 00000000..056780d3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/fswatcher.h @@ -0,0 +1,411 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fswatcher.h +// Purpose: wxFileSystemWatcherBase +// Author: Bartosz Bekier +// Created: 2009-05-23 +// Copyright: (c) 2009 Bartosz Bekier +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FSWATCHER_BASE_H_ +#define _WX_FSWATCHER_BASE_H_ + +#include "wx/defs.h" + +#if wxUSE_FSWATCHER + +#include "wx/log.h" +#include "wx/event.h" +#include "wx/evtloop.h" +#include "wx/filename.h" +#include "wx/dir.h" +#include "wx/hashmap.h" + +#define wxTRACE_FSWATCHER "fswatcher" + +// ---------------------------------------------------------------------------- +// wxFileSystemWatcherEventType & wxFileSystemWatcherEvent +// ---------------------------------------------------------------------------- + +/** + * Possible types of file system events. + * This is a subset that will work fine an all platforms (actually, we will + * see how it works on Mac). + * + * We got 2 types of error events: + * - warning: these are not fatal and further events can still be generated + * - error: indicates fatal error and causes that no more events will happen + */ +enum +{ + wxFSW_EVENT_CREATE = 0x01, + wxFSW_EVENT_DELETE = 0x02, + wxFSW_EVENT_RENAME = 0x04, + wxFSW_EVENT_MODIFY = 0x08, + wxFSW_EVENT_ACCESS = 0x10, + wxFSW_EVENT_ATTRIB = 0x20, // Currently this is wxGTK-only + + // error events + wxFSW_EVENT_WARNING = 0x40, + wxFSW_EVENT_ERROR = 0x80, + wxFSW_EVENT_ALL = wxFSW_EVENT_CREATE | wxFSW_EVENT_DELETE | + wxFSW_EVENT_RENAME | wxFSW_EVENT_MODIFY | + wxFSW_EVENT_ACCESS | wxFSW_EVENT_ATTRIB | + wxFSW_EVENT_WARNING | wxFSW_EVENT_ERROR +#ifdef wxHAS_INOTIFY + ,wxFSW_EVENT_UNMOUNT = 0x2000 +#endif +}; + +// Type of the path watched, used only internally for now. +enum wxFSWPathType +{ + wxFSWPath_None, // Invalid value for an initialized watch. + wxFSWPath_File, // Plain file. + wxFSWPath_Dir, // Watch a directory and the files in it. + wxFSWPath_Tree // Watch a directory and all its children recursively. +}; + +// Type of the warning for the events notifying about them. +enum wxFSWWarningType +{ + wxFSW_WARNING_NONE, + wxFSW_WARNING_GENERAL, + wxFSW_WARNING_OVERFLOW +}; + +/** + * Event containing information about file system change. + */ +class WXDLLIMPEXP_FWD_BASE wxFileSystemWatcherEvent; +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_BASE, wxEVT_FSWATCHER, + wxFileSystemWatcherEvent); + +class WXDLLIMPEXP_BASE wxFileSystemWatcherEvent: public wxEvent +{ +public: + // Constructor for any kind of events, also used as default ctor. + wxFileSystemWatcherEvent(int changeType = 0, int watchid = wxID_ANY) : + wxEvent(watchid, wxEVT_FSWATCHER), + m_changeType(changeType), + m_warningType(wxFSW_WARNING_NONE) + { + } + + // Constructor for the error or warning events. + wxFileSystemWatcherEvent(int changeType, + wxFSWWarningType warningType, + const wxString& errorMsg = wxString(), + int watchid = wxID_ANY) : + wxEvent(watchid, wxEVT_FSWATCHER), + m_changeType(changeType), + m_warningType(warningType), + m_errorMsg(errorMsg) + { + } + + // Constructor for the normal events carrying information about the changes. + wxFileSystemWatcherEvent(int changeType, + const wxFileName& path, const wxFileName& newPath, + int watchid = wxID_ANY) : + wxEvent(watchid, wxEVT_FSWATCHER), + m_changeType(changeType), + m_warningType(wxFSW_WARNING_NONE), + m_path(path), + m_newPath(newPath) + + { + } + + /** + * Returns the path at which the event occurred. + */ + const wxFileName& GetPath() const + { + return m_path; + } + + /** + * Sets the path at which the event occurred + */ + void SetPath(const wxFileName& path) + { + m_path = path; + } + + /** + * In case of rename(move?) events, returns the new path related to the + * event. The "new" means newer in the sense of time. In case of other + * events it returns the same path as GetPath(). + */ + const wxFileName& GetNewPath() const + { + return m_newPath; + } + + /** + * Sets the new path related to the event. See above. + */ + void SetNewPath(const wxFileName& path) + { + m_newPath = path; + } + + /** + * Returns the type of file system event that occurred. + */ + int GetChangeType() const + { + return m_changeType; + } + + virtual wxEvent* Clone() const + { + wxFileSystemWatcherEvent* evt = new wxFileSystemWatcherEvent(*this); + evt->m_errorMsg = m_errorMsg.Clone(); + evt->m_path = wxFileName(m_path.GetFullPath().Clone()); + evt->m_newPath = wxFileName(m_newPath.GetFullPath().Clone()); + evt->m_warningType = m_warningType; + return evt; + } + + virtual wxEventCategory GetEventCategory() const + { + // TODO this has to be merged with "similar" categories and changed + return wxEVT_CATEGORY_UNKNOWN; + } + + /** + * Returns if this error is an error event + */ + bool IsError() const + { + return (m_changeType & (wxFSW_EVENT_ERROR | wxFSW_EVENT_WARNING)) != 0; + } + + wxString GetErrorDescription() const + { + return m_errorMsg; + } + + wxFSWWarningType GetWarningType() const + { + return m_warningType; + } + + /** + * Returns a wxString describing an event useful for debugging or testing + */ + wxString ToString() const; + +protected: + int m_changeType; + wxFSWWarningType m_warningType; + wxFileName m_path; + wxFileName m_newPath; + wxString m_errorMsg; +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxFileSystemWatcherEvent) +}; + +typedef void (wxEvtHandler::*wxFileSystemWatcherEventFunction) + (wxFileSystemWatcherEvent&); + +#define wxFileSystemWatcherEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxFileSystemWatcherEventFunction, func) + +#define EVT_FSWATCHER(winid, func) \ + wx__DECLARE_EVT1(wxEVT_FSWATCHER, winid, wxFileSystemWatcherEventHandler(func)) + +// ---------------------------------------------------------------------------- +// wxFileSystemWatcherBase: interface for wxFileSystemWatcher +// ---------------------------------------------------------------------------- + +// Simple container to store information about one watched path. +class wxFSWatchInfo +{ +public: + wxFSWatchInfo() : + m_events(-1), m_type(wxFSWPath_None), m_refcount(-1) + { + } + + wxFSWatchInfo(const wxString& path, + int events, + wxFSWPathType type, + const wxString& filespec = wxString()) : + m_path(path), m_filespec(filespec), m_events(events), m_type(type), + m_refcount(1) + { + } + + const wxString& GetPath() const + { + return m_path; + } + + const wxString& GetFilespec() const { return m_filespec; } + + int GetFlags() const + { + return m_events; + } + + wxFSWPathType GetType() const + { + return m_type; + } + + // Reference counting of watch entries is used to avoid watching the same + // file system path multiple times (this can happen even accidentally, e.g. + // when you have a recursive watch and then decide to watch some file or + // directory under it separately). + int IncRef() + { + return ++m_refcount; + } + + int DecRef() + { + wxASSERT_MSG( m_refcount > 0, wxS("Trying to decrement a zero count") ); + return --m_refcount; + } + +protected: + wxString m_path; + wxString m_filespec; // For tree watches, holds any filespec to apply + int m_events; + wxFSWPathType m_type; + int m_refcount; +}; + +WX_DECLARE_STRING_HASH_MAP(wxFSWatchInfo, wxFSWatchInfoMap); + +/** + * Encapsulation of platform-specific file system event mechanism + */ +class wxFSWatcherImpl; + +/** + * Main entry point for clients interested in file system events. + * Defines interface that can be used to receive that kind of events. + */ +class WXDLLIMPEXP_BASE wxFileSystemWatcherBase: public wxEvtHandler +{ +public: + wxFileSystemWatcherBase(); + + virtual ~wxFileSystemWatcherBase(); + + /** + * Adds path to currently watched files. Any events concerning this + * particular path will be sent to handler. Optionally a filter can be + * specified to receive only events of particular type. + * + * Please note that when adding a dir, immediate children will be watched + * as well. + */ + virtual bool Add(const wxFileName& path, int events = wxFSW_EVENT_ALL); + + /** + * Like above, but recursively adds every file/dir in the tree rooted in + * path. Additionally a file mask can be specified to include only files + * of particular type. + */ + virtual bool AddTree(const wxFileName& path, int events = wxFSW_EVENT_ALL, + const wxString& filespec = wxEmptyString); + + /** + * Removes path from the list of watched paths. + */ + virtual bool Remove(const wxFileName& path); + + /** + * Same as above, but also removes every file belonging to the tree rooted + * at path. + */ + virtual bool RemoveTree(const wxFileName& path); + + /** + * Clears the list of currently watched paths. + */ + virtual bool RemoveAll(); + + /** + * Returns the number of watched paths + */ + int GetWatchedPathsCount() const; + + /** + * Retrevies all watched paths and places them in wxArrayString. Returns + * the number of paths. + * + * TODO think about API here: we need to return more information (like is + * the path watched recursively) + */ + int GetWatchedPaths(wxArrayString* paths) const; + + wxEvtHandler* GetOwner() const + { + return m_owner; + } + + void SetOwner(wxEvtHandler* handler) + { + if (!handler) + m_owner = this; + else + m_owner = handler; + } + + + // This is a semi-private function used by wxWidgets itself only. + // + // Delegates the real work of adding the path to wxFSWatcherImpl::Add() and + // updates m_watches if the new path was successfully added. + bool AddAny(const wxFileName& path, int events, wxFSWPathType type, + const wxString& filespec = wxString()); + +protected: + + static wxString GetCanonicalPath(const wxFileName& path) + { + wxFileName path_copy = wxFileName(path); + if ( !path_copy.Normalize() ) + { + wxFAIL_MSG(wxString::Format("Unable to normalize path '%s'", + path.GetFullPath())); + return wxEmptyString; + } + + return path_copy.GetFullPath(); + } + + + wxFSWatchInfoMap m_watches; // path=>wxFSWatchInfo map + wxFSWatcherImpl* m_service; // file system events service + wxEvtHandler* m_owner; // handler for file system events + + friend class wxFSWatcherImpl; +}; + +// include the platform specific file defining wxFileSystemWatcher +// inheriting from wxFileSystemWatcherBase + +#ifdef wxHAS_INOTIFY + #include "wx/unix/fswatcher_inotify.h" + #define wxFileSystemWatcher wxInotifyFileSystemWatcher +#elif defined(wxHAS_KQUEUE) + #include "wx/unix/fswatcher_kqueue.h" + #define wxFileSystemWatcher wxKqueueFileSystemWatcher +#elif defined(__WINDOWS__) + #include "wx/msw/fswatcher.h" + #define wxFileSystemWatcher wxMSWFileSystemWatcher +#else + #include "wx/generic/fswatcher.h" + #define wxFileSystemWatcher wxPollingFileSystemWatcher +#endif + +#endif // wxUSE_FSWATCHER + +#endif /* _WX_FSWATCHER_BASE_H_ */ diff --git a/wxmsw/include/wx-3.0/wx/gauge.h b/wxmsw/include/wx-3.0/wx/gauge.h new file mode 100644 index 00000000..93ae86fc --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gauge.h @@ -0,0 +1,126 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gauge.h +// Purpose: wxGauge interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.02.01 +// Copyright: (c) 1996-2001 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GAUGE_H_BASE_ +#define _WX_GAUGE_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_GAUGE + +#include "wx/control.h" + +// ---------------------------------------------------------------------------- +// wxGauge style flags +// ---------------------------------------------------------------------------- + +#define wxGA_HORIZONTAL wxHORIZONTAL +#define wxGA_VERTICAL wxVERTICAL + +// Win32 only, is default (and only) on some other platforms +#define wxGA_SMOOTH 0x0020 + +#if WXWIN_COMPATIBILITY_2_6 + // obsolete style + #define wxGA_PROGRESSBAR 0 +#endif // WXWIN_COMPATIBILITY_2_6 + +// GTK and Mac always have native implementation of the indeterminate mode +// wxMSW has native implementation only if comctl32.dll >= 6.00 +#if !defined(__WXGTK20__) && !defined(__WXMAC__) && !defined(__WXCOCOA__) + #define wxGAUGE_EMULATE_INDETERMINATE_MODE 1 +#else + #define wxGAUGE_EMULATE_INDETERMINATE_MODE 0 +#endif + +extern WXDLLIMPEXP_DATA_CORE(const char) wxGaugeNameStr[]; + +// ---------------------------------------------------------------------------- +// wxGauge: a progress bar +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGaugeBase : public wxControl +{ +public: + wxGaugeBase() { m_rangeMax = m_gaugePos = 0; } + virtual ~wxGaugeBase(); + + bool Create(wxWindow *parent, + wxWindowID id, + int range, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxGA_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxGaugeNameStr); + + // determinate mode API + + // set/get the control range + virtual void SetRange(int range); + virtual int GetRange() const; + + virtual void SetValue(int pos); + virtual int GetValue() const; + + // indeterminate mode API + virtual void Pulse(); + + // simple accessors + bool IsVertical() const { return HasFlag(wxGA_VERTICAL); } + + // appearance params (not implemented for most ports) + virtual void SetShadowWidth(int w); + virtual int GetShadowWidth() const; + + virtual void SetBezelFace(int w); + virtual int GetBezelFace() const; + + // overridden base class virtuals + virtual bool AcceptsFocus() const { return false; } + +protected: + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + // the max position + int m_rangeMax; + + // the current position + int m_gaugePos; + +#if wxGAUGE_EMULATE_INDETERMINATE_MODE + int m_nDirection; // can be wxRIGHT or wxLEFT +#endif + + wxDECLARE_NO_COPY_CLASS(wxGaugeBase); +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/gauge.h" +#elif defined(__WXMSW__) + #include "wx/msw/gauge.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/gauge.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/gauge.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/gauge.h" +#elif defined(__WXMAC__) + #include "wx/osx/gauge.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/gauge.h" +#elif defined(__WXPM__) + #include "wx/os2/gauge.h" +#endif + +#endif // wxUSE_GAUGE + +#endif + // _WX_GAUGE_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/gbsizer.h b/wxmsw/include/wx-3.0/wx/gbsizer.h new file mode 100644 index 00000000..dea46c15 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gbsizer.h @@ -0,0 +1,341 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gbsizer.h +// Purpose: wxGridBagSizer: A sizer that can lay out items in a grid, +// with items at specified cells, and with the option of row +// and/or column spanning +// +// Author: Robin Dunn +// Created: 03-Nov-2003 +// Copyright: (c) Robin Dunn +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __WXGBSIZER_H__ +#define __WXGBSIZER_H__ + +#include "wx/sizer.h" + + +//--------------------------------------------------------------------------- +// Classes to represent a position in the grid and a size of an item in the +// grid, IOW, the number of rows and columns it occupies. I chose to use these +// instead of wxPoint and wxSize because they are (x,y) and usually pixel +// oriented while grids and tables are usually thought of as (row,col) so some +// confusion would definitely result in using wxPoint... +// +// NOTE: This should probably be refactored to a common RowCol data type which +// is used for this and also for wxGridCellCoords. +//--------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGBPosition +{ +public: + wxGBPosition() : m_row(0), m_col(0) {} + wxGBPosition(int row, int col) : m_row(row), m_col(col) {} + + // default copy ctor and assignment operator are okay. + + int GetRow() const { return m_row; } + int GetCol() const { return m_col; } + void SetRow(int row) { m_row = row; } + void SetCol(int col) { m_col = col; } + + bool operator==(const wxGBPosition& p) const { return m_row == p.m_row && m_col == p.m_col; } + bool operator!=(const wxGBPosition& p) const { return !(*this == p); } + +private: + int m_row; + int m_col; +}; + + +class WXDLLIMPEXP_CORE wxGBSpan +{ +public: + wxGBSpan() { Init(); } + wxGBSpan(int rowspan, int colspan) + { + // Initialize the members to valid values as not doing it may result in + // infinite loop in wxGBSizer code if the user passed 0 for any of + // them, see #12934. + Init(); + + SetRowspan(rowspan); + SetColspan(colspan); + } + + // default copy ctor and assignment operator are okay. + + // Factor constructor creating an invalid wxGBSpan: this is mostly supposed + // to be used as return value for functions returning wxGBSpan in case of + // errors. + static wxGBSpan Invalid() + { + return wxGBSpan(NULL); + } + + int GetRowspan() const { return m_rowspan; } + int GetColspan() const { return m_colspan; } + void SetRowspan(int rowspan) + { + wxCHECK_RET( rowspan > 0, "Row span should be strictly positive" ); + + m_rowspan = rowspan; + } + + void SetColspan(int colspan) + { + wxCHECK_RET( colspan > 0, "Column span should be strictly positive" ); + + m_colspan = colspan; + } + + bool operator==(const wxGBSpan& o) const { return m_rowspan == o.m_rowspan && m_colspan == o.m_colspan; } + bool operator!=(const wxGBSpan& o) const { return !(*this == o); } + +private: + // This private ctor is used by Invalid() only. + wxGBSpan(struct InvalidCtorTag*) + { + m_rowspan = + m_colspan = -1; + } + + void Init() + { + m_rowspan = + m_colspan = 1; + } + + int m_rowspan; + int m_colspan; +}; + + +extern WXDLLIMPEXP_DATA_CORE(const wxGBSpan) wxDefaultSpan; + + +//--------------------------------------------------------------------------- +// wxGBSizerItem +//--------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxGridBagSizer; + + +class WXDLLIMPEXP_CORE wxGBSizerItem : public wxSizerItem +{ +public: + // spacer + wxGBSizerItem( int width, + int height, + const wxGBPosition& pos, + const wxGBSpan& span=wxDefaultSpan, + int flag=0, + int border=0, + wxObject* userData=NULL); + + // window + wxGBSizerItem( wxWindow *window, + const wxGBPosition& pos, + const wxGBSpan& span=wxDefaultSpan, + int flag=0, + int border=0, + wxObject* userData=NULL ); + + // subsizer + wxGBSizerItem( wxSizer *sizer, + const wxGBPosition& pos, + const wxGBSpan& span=wxDefaultSpan, + int flag=0, + int border=0, + wxObject* userData=NULL ); + + // default ctor + wxGBSizerItem(); + + + // Get the grid position of the item + wxGBPosition GetPos() const { return m_pos; } + void GetPos(int& row, int& col) const; + + // Get the row and column spanning of the item + wxGBSpan GetSpan() const { return m_span; } + void GetSpan(int& rowspan, int& colspan) const; + + // If the item is already a member of a sizer then first ensure that there + // is no other item that would intersect with this one at the new + // position, then set the new position. Returns true if the change is + // successful and after the next Layout the item will be moved. + bool SetPos( const wxGBPosition& pos ); + + // If the item is already a member of a sizer then first ensure that there + // is no other item that would intersect with this one with its new + // spanning size, then set the new spanning. Returns true if the change + // is successful and after the next Layout the item will be resized. + bool SetSpan( const wxGBSpan& span ); + + // Returns true if this item and the other item intersect + bool Intersects(const wxGBSizerItem& other); + + // Returns true if the given pos/span would intersect with this item. + bool Intersects(const wxGBPosition& pos, const wxGBSpan& span); + + // Get the row and column of the endpoint of this item + void GetEndPos(int& row, int& col); + + + wxGridBagSizer* GetGBSizer() const { return m_gbsizer; } + void SetGBSizer(wxGridBagSizer* sizer) { m_gbsizer = sizer; } + + +protected: + wxGBPosition m_pos; + wxGBSpan m_span; + wxGridBagSizer* m_gbsizer; // so SetPos/SetSpan can check for intersects + + +private: + DECLARE_DYNAMIC_CLASS(wxGBSizerItem) + wxDECLARE_NO_COPY_CLASS(wxGBSizerItem); +}; + + +//--------------------------------------------------------------------------- +// wxGridBagSizer +//--------------------------------------------------------------------------- + + +class WXDLLIMPEXP_CORE wxGridBagSizer : public wxFlexGridSizer +{ +public: + wxGridBagSizer(int vgap = 0, int hgap = 0 ); + + // The Add methods return true if the item was successfully placed at the + // given position, false if something was already there. + wxSizerItem* Add( wxWindow *window, + const wxGBPosition& pos, + const wxGBSpan& span = wxDefaultSpan, + int flag = 0, + int border = 0, + wxObject* userData = NULL ); + wxSizerItem* Add( wxSizer *sizer, + const wxGBPosition& pos, + const wxGBSpan& span = wxDefaultSpan, + int flag = 0, + int border = 0, + wxObject* userData = NULL ); + wxSizerItem* Add( int width, + int height, + const wxGBPosition& pos, + const wxGBSpan& span = wxDefaultSpan, + int flag = 0, + int border = 0, + wxObject* userData = NULL ); + wxSizerItem* Add( wxGBSizerItem *item ); + + + // Get/Set the size used for cells in the grid with no item. + wxSize GetEmptyCellSize() const { return m_emptyCellSize; } + void SetEmptyCellSize(const wxSize& sz) { m_emptyCellSize = sz; } + + // Get the size of the specified cell, including hgap and vgap. Only + // valid after a Layout. + wxSize GetCellSize(int row, int col) const; + + // Get the grid position of the specified item (non-recursive) + wxGBPosition GetItemPosition(wxWindow *window); + wxGBPosition GetItemPosition(wxSizer *sizer); + wxGBPosition GetItemPosition(size_t index); + + // Set the grid position of the specified item. Returns true on success. + // If the move is not allowed (because an item is already there) then + // false is returned. (non-recursive) + bool SetItemPosition(wxWindow *window, const wxGBPosition& pos); + bool SetItemPosition(wxSizer *sizer, const wxGBPosition& pos); + bool SetItemPosition(size_t index, const wxGBPosition& pos); + + // Get the row/col spanning of the specified item (non-recursive) + wxGBSpan GetItemSpan(wxWindow *window); + wxGBSpan GetItemSpan(wxSizer *sizer); + wxGBSpan GetItemSpan(size_t index); + + // Set the row/col spanning of the specified item. Returns true on + // success. If the move is not allowed (because an item is already there) + // then false is returned. (non-recursive) + bool SetItemSpan(wxWindow *window, const wxGBSpan& span); + bool SetItemSpan(wxSizer *sizer, const wxGBSpan& span); + bool SetItemSpan(size_t index, const wxGBSpan& span); + + + // Find the sizer item for the given window or subsizer, returns NULL if + // not found. (non-recursive) + wxGBSizerItem* FindItem(wxWindow* window); + wxGBSizerItem* FindItem(wxSizer* sizer); + + + // Return the sizer item for the given grid cell, or NULL if there is no + // item at that position. (non-recursive) + wxGBSizerItem* FindItemAtPosition(const wxGBPosition& pos); + + + // Return the sizer item located at the point given in pt, or NULL if + // there is no item at that point. The (x,y) coordinates in pt correspond + // to the client coordinates of the window using the sizer for + // layout. (non-recursive) + wxGBSizerItem* FindItemAtPoint(const wxPoint& pt); + + + // Return the sizer item that has a matching user data (it only compares + // pointer values) or NULL if not found. (non-recursive) + wxGBSizerItem* FindItemWithData(const wxObject* userData); + + + // These are what make the sizer do size calculations and layout + virtual void RecalcSizes(); + virtual wxSize CalcMin(); + + + // Look at all items and see if any intersect (or would overlap) the given + // item. Returns true if so, false if there would be no overlap. If an + // excludeItem is given then it will not be checked for intersection, for + // example it may be the item we are checking the position of. + bool CheckForIntersection(wxGBSizerItem* item, wxGBSizerItem* excludeItem = NULL); + bool CheckForIntersection(const wxGBPosition& pos, const wxGBSpan& span, wxGBSizerItem* excludeItem = NULL); + + + // The Add base class virtuals should not be used with this class, but + // we'll try to make them automatically select a location for the item + // anyway. + virtual wxSizerItem* Add( wxWindow *window, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Add( wxSizer *sizer, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Add( int width, int height, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + + // The Insert and Prepend base class virtuals that are not appropriate for + // this class and should not be used. Their implementation in this class + // simply fails. + virtual wxSizerItem* Add( wxSizerItem *item ); + virtual wxSizerItem* Insert( size_t index, wxWindow *window, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Insert( size_t index, wxSizer *sizer, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Insert( size_t index, int width, int height, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Insert( size_t index, wxSizerItem *item ); + virtual wxSizerItem* Prepend( wxWindow *window, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Prepend( wxSizer *sizer, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Prepend( int width, int height, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Prepend( wxSizerItem *item ); + + +protected: + wxGBPosition FindEmptyCell(); + void AdjustForOverflow(); + + wxSize m_emptyCellSize; + + +private: + + DECLARE_CLASS(wxGridBagSizer) + wxDECLARE_NO_COPY_CLASS(wxGridBagSizer); +}; + +//--------------------------------------------------------------------------- +#endif diff --git a/wxmsw/include/wx-3.0/wx/gdicmn.h b/wxmsw/include/wx-3.0/wx/gdicmn.h new file mode 100644 index 00000000..6ce652d4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gdicmn.h @@ -0,0 +1,1111 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gdicmn.h +// Purpose: Common GDI classes, types and declarations +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GDICMNH__ +#define _WX_GDICMNH__ + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- + +#include "wx/defs.h" +#include "wx/list.h" +#include "wx/string.h" +#include "wx/fontenc.h" +#include "wx/hashmap.h" +#include "wx/math.h" + +// --------------------------------------------------------------------------- +// forward declarations +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxBitmap; +class WXDLLIMPEXP_FWD_CORE wxBrush; +class WXDLLIMPEXP_FWD_CORE wxColour; +class WXDLLIMPEXP_FWD_CORE wxCursor; +class WXDLLIMPEXP_FWD_CORE wxFont; +class WXDLLIMPEXP_FWD_CORE wxIcon; +class WXDLLIMPEXP_FWD_CORE wxPalette; +class WXDLLIMPEXP_FWD_CORE wxPen; +class WXDLLIMPEXP_FWD_CORE wxRegion; +class WXDLLIMPEXP_FWD_BASE wxString; +class WXDLLIMPEXP_FWD_CORE wxIconBundle; +class WXDLLIMPEXP_FWD_CORE wxPoint; + +// --------------------------------------------------------------------------- +// constants +// --------------------------------------------------------------------------- + +// Bitmap flags +enum wxBitmapType +{ + wxBITMAP_TYPE_INVALID, // should be == 0 for compatibility! + wxBITMAP_TYPE_BMP, + wxBITMAP_TYPE_BMP_RESOURCE, + wxBITMAP_TYPE_RESOURCE = wxBITMAP_TYPE_BMP_RESOURCE, + wxBITMAP_TYPE_ICO, + wxBITMAP_TYPE_ICO_RESOURCE, + wxBITMAP_TYPE_CUR, + wxBITMAP_TYPE_CUR_RESOURCE, + wxBITMAP_TYPE_XBM, + wxBITMAP_TYPE_XBM_DATA, + wxBITMAP_TYPE_XPM, + wxBITMAP_TYPE_XPM_DATA, + wxBITMAP_TYPE_TIFF, + wxBITMAP_TYPE_TIF = wxBITMAP_TYPE_TIFF, + wxBITMAP_TYPE_TIFF_RESOURCE, + wxBITMAP_TYPE_TIF_RESOURCE = wxBITMAP_TYPE_TIFF_RESOURCE, + wxBITMAP_TYPE_GIF, + wxBITMAP_TYPE_GIF_RESOURCE, + wxBITMAP_TYPE_PNG, + wxBITMAP_TYPE_PNG_RESOURCE, + wxBITMAP_TYPE_JPEG, + wxBITMAP_TYPE_JPEG_RESOURCE, + wxBITMAP_TYPE_PNM, + wxBITMAP_TYPE_PNM_RESOURCE, + wxBITMAP_TYPE_PCX, + wxBITMAP_TYPE_PCX_RESOURCE, + wxBITMAP_TYPE_PICT, + wxBITMAP_TYPE_PICT_RESOURCE, + wxBITMAP_TYPE_ICON, + wxBITMAP_TYPE_ICON_RESOURCE, + wxBITMAP_TYPE_ANI, + wxBITMAP_TYPE_IFF, + wxBITMAP_TYPE_TGA, + wxBITMAP_TYPE_MACCURSOR, + wxBITMAP_TYPE_MACCURSOR_RESOURCE, + + wxBITMAP_TYPE_MAX, + wxBITMAP_TYPE_ANY = 50 +}; + +// Polygon filling mode +enum wxPolygonFillMode +{ + wxODDEVEN_RULE = 1, + wxWINDING_RULE +}; + +// Standard cursors +enum wxStockCursor +{ + wxCURSOR_NONE, // should be 0 + wxCURSOR_ARROW, + wxCURSOR_RIGHT_ARROW, + wxCURSOR_BULLSEYE, + wxCURSOR_CHAR, + wxCURSOR_CROSS, + wxCURSOR_HAND, + wxCURSOR_IBEAM, + wxCURSOR_LEFT_BUTTON, + wxCURSOR_MAGNIFIER, + wxCURSOR_MIDDLE_BUTTON, + wxCURSOR_NO_ENTRY, + wxCURSOR_PAINT_BRUSH, + wxCURSOR_PENCIL, + wxCURSOR_POINT_LEFT, + wxCURSOR_POINT_RIGHT, + wxCURSOR_QUESTION_ARROW, + wxCURSOR_RIGHT_BUTTON, + wxCURSOR_SIZENESW, + wxCURSOR_SIZENS, + wxCURSOR_SIZENWSE, + wxCURSOR_SIZEWE, + wxCURSOR_SIZING, + wxCURSOR_SPRAYCAN, + wxCURSOR_WAIT, + wxCURSOR_WATCH, + wxCURSOR_BLANK, +#ifdef __WXGTK__ + wxCURSOR_DEFAULT, // standard X11 cursor +#endif +#ifdef __WXMAC__ + wxCURSOR_COPY_ARROW , // MacOS Theme Plus arrow +#endif +#ifdef __X__ + // Not yet implemented for Windows + wxCURSOR_CROSS_REVERSE, + wxCURSOR_DOUBLE_ARROW, + wxCURSOR_BASED_ARROW_UP, + wxCURSOR_BASED_ARROW_DOWN, +#endif // X11 + wxCURSOR_ARROWWAIT, +#ifdef __WXMAC__ + wxCURSOR_OPEN_HAND, + wxCURSOR_CLOSED_HAND, +#endif + + wxCURSOR_MAX +}; + +#ifndef __WXGTK__ + #define wxCURSOR_DEFAULT wxCURSOR_ARROW +#endif + +#ifndef __WXMAC__ + // TODO CS supply openhand and closedhand cursors + #define wxCURSOR_OPEN_HAND wxCURSOR_HAND + #define wxCURSOR_CLOSED_HAND wxCURSOR_HAND +#endif + +// --------------------------------------------------------------------------- +// macros +// --------------------------------------------------------------------------- + +#if defined(__WINDOWS__) || defined(__WXPM__) + #define wxHAS_IMAGES_IN_RESOURCES +#endif + +/* Useful macro for creating icons portably, for example: + + wxIcon *icon = new wxICON(sample); + + expands into: + + wxIcon *icon = new wxIcon("sample"); // On Windows + wxIcon *icon = new wxIcon(sample_xpm); // On wxGTK/Linux + */ + +#ifdef __WINDOWS__ + // Load from a resource + #define wxICON(X) wxIcon(wxT(#X)) +#elif defined(__WXPM__) + // Load from a resource + #define wxICON(X) wxIcon(wxT(#X)) +#elif defined(__WXDFB__) + // Initialize from an included XPM + #define wxICON(X) wxIcon( X##_xpm ) +#elif defined(__WXGTK__) + // Initialize from an included XPM + #define wxICON(X) wxIcon( X##_xpm ) +#elif defined(__WXMAC__) + // Initialize from an included XPM + #define wxICON(X) wxIcon( X##_xpm ) +#elif defined(__WXMOTIF__) + // Initialize from an included XPM + #define wxICON(X) wxIcon( X##_xpm ) +#elif defined(__WXX11__) + // Initialize from an included XPM + #define wxICON(X) wxIcon( X##_xpm ) +#else + // This will usually mean something on any platform + #define wxICON(X) wxIcon(wxT(#X)) +#endif // platform + +/* Another macro: this one is for portable creation of bitmaps. We assume that + under Unix bitmaps live in XPMs and under Windows they're in ressources. + */ + +#if defined(__WINDOWS__) || defined(__WXPM__) + #define wxBITMAP(name) wxBitmap(wxT(#name), wxBITMAP_TYPE_BMP_RESOURCE) +#elif defined(__WXGTK__) || \ + defined(__WXMOTIF__) || \ + defined(__WXX11__) || \ + defined(__WXMAC__) || \ + defined(__WXDFB__) || \ + defined(__WXCOCOA__) + // Initialize from an included XPM + #define wxBITMAP(name) wxBitmap(name##_xpm) +#else // other platforms + #define wxBITMAP(name) wxBitmap(name##_xpm, wxBITMAP_TYPE_XPM) +#endif // platform + +// Macro for creating wxBitmap from in-memory PNG data. +// +// It reads PNG data from name_png static byte arrays that can be created using +// e.g. misc/scripts/png2c.py. +// +// This macro exists mostly as a helper for wxBITMAP_PNG() below but also +// because it's slightly more convenient to use than NewFromPNGData() directly. +#define wxBITMAP_PNG_FROM_DATA(name) \ + wxBitmap::NewFromPNGData(name##_png, WXSIZEOF(name##_png)) + +// Similar to wxBITMAP but used for the bitmaps in PNG format. +// +// Under Windows they should be embedded into the resource file using RT_RCDATA +// resource type and under OS X the PNG file with the specified name must be +// available in the resource subdirectory of the bundle. Elsewhere, this is +// exactly the same thing as wxBITMAP_PNG_FROM_DATA() described above. +#if defined(__WINDOWS__) || defined(__WXOSX__) + #define wxBITMAP_PNG(name) wxBitmap(wxS(#name), wxBITMAP_TYPE_PNG_RESOURCE) +#else + #define wxBITMAP_PNG(name) wxBITMAP_PNG_FROM_DATA(name) +#endif + +// =========================================================================== +// classes +// =========================================================================== + +// --------------------------------------------------------------------------- +// wxSize +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSize +{ +public: + // members are public for compatibility, don't use them directly. + int x, y; + + // constructors + wxSize() : x(0), y(0) { } + wxSize(int xx, int yy) : x(xx), y(yy) { } + + // no copy ctor or assignment operator - the defaults are ok + + wxSize& operator+=(const wxSize& sz) { x += sz.x; y += sz.y; return *this; } + wxSize& operator-=(const wxSize& sz) { x -= sz.x; y -= sz.y; return *this; } + wxSize& operator/=(int i) { x /= i; y /= i; return *this; } + wxSize& operator*=(int i) { x *= i; y *= i; return *this; } + wxSize& operator/=(unsigned int i) { x /= i; y /= i; return *this; } + wxSize& operator*=(unsigned int i) { x *= i; y *= i; return *this; } + wxSize& operator/=(long i) { x /= i; y /= i; return *this; } + wxSize& operator*=(long i) { x *= i; y *= i; return *this; } + wxSize& operator/=(unsigned long i) { x /= i; y /= i; return *this; } + wxSize& operator*=(unsigned long i) { x *= i; y *= i; return *this; } + wxSize& operator/=(double i) { x = int(x/i); y = int(y/i); return *this; } + wxSize& operator*=(double i) { x = int(x*i); y = int(y*i); return *this; } + + void IncTo(const wxSize& sz) + { if ( sz.x > x ) x = sz.x; if ( sz.y > y ) y = sz.y; } + void DecTo(const wxSize& sz) + { if ( sz.x < x ) x = sz.x; if ( sz.y < y ) y = sz.y; } + void DecToIfSpecified(const wxSize& sz) + { + if ( sz.x != wxDefaultCoord && sz.x < x ) + x = sz.x; + if ( sz.y != wxDefaultCoord && sz.y < y ) + y = sz.y; + } + + void IncBy(int dx, int dy) { x += dx; y += dy; } + void IncBy(const wxPoint& pt); + void IncBy(const wxSize& sz) { IncBy(sz.x, sz.y); } + void IncBy(int d) { IncBy(d, d); } + + void DecBy(int dx, int dy) { IncBy(-dx, -dy); } + void DecBy(const wxPoint& pt); + void DecBy(const wxSize& sz) { DecBy(sz.x, sz.y); } + void DecBy(int d) { DecBy(d, d); } + + + wxSize& Scale(float xscale, float yscale) + { x = (int)(x*xscale); y = (int)(y*yscale); return *this; } + + // accessors + void Set(int xx, int yy) { x = xx; y = yy; } + void SetWidth(int w) { x = w; } + void SetHeight(int h) { y = h; } + + int GetWidth() const { return x; } + int GetHeight() const { return y; } + + bool IsFullySpecified() const { return x != wxDefaultCoord && y != wxDefaultCoord; } + + // combine this size with the other one replacing the default (i.e. equal + // to wxDefaultCoord) components of this object with those of the other + void SetDefaults(const wxSize& size) + { + if ( x == wxDefaultCoord ) + x = size.x; + if ( y == wxDefaultCoord ) + y = size.y; + } + + // compatibility + int GetX() const { return x; } + int GetY() const { return y; } +}; + +inline bool operator==(const wxSize& s1, const wxSize& s2) +{ + return s1.x == s2.x && s1.y == s2.y; +} + +inline bool operator!=(const wxSize& s1, const wxSize& s2) +{ + return s1.x != s2.x || s1.y != s2.y; +} + +inline wxSize operator+(const wxSize& s1, const wxSize& s2) +{ + return wxSize(s1.x + s2.x, s1.y + s2.y); +} + +inline wxSize operator-(const wxSize& s1, const wxSize& s2) +{ + return wxSize(s1.x - s2.x, s1.y - s2.y); +} + +inline wxSize operator/(const wxSize& s, int i) +{ + return wxSize(s.x / i, s.y / i); +} + +inline wxSize operator*(const wxSize& s, int i) +{ + return wxSize(s.x * i, s.y * i); +} + +inline wxSize operator*(int i, const wxSize& s) +{ + return wxSize(s.x * i, s.y * i); +} + +inline wxSize operator/(const wxSize& s, unsigned int i) +{ + return wxSize(s.x / i, s.y / i); +} + +inline wxSize operator*(const wxSize& s, unsigned int i) +{ + return wxSize(s.x * i, s.y * i); +} + +inline wxSize operator*(unsigned int i, const wxSize& s) +{ + return wxSize(s.x * i, s.y * i); +} + +inline wxSize operator/(const wxSize& s, long i) +{ + return wxSize(s.x / i, s.y / i); +} + +inline wxSize operator*(const wxSize& s, long i) +{ + return wxSize(int(s.x * i), int(s.y * i)); +} + +inline wxSize operator*(long i, const wxSize& s) +{ + return wxSize(int(s.x * i), int(s.y * i)); +} + +inline wxSize operator/(const wxSize& s, unsigned long i) +{ + return wxSize(int(s.x / i), int(s.y / i)); +} + +inline wxSize operator*(const wxSize& s, unsigned long i) +{ + return wxSize(int(s.x * i), int(s.y * i)); +} + +inline wxSize operator*(unsigned long i, const wxSize& s) +{ + return wxSize(int(s.x * i), int(s.y * i)); +} + +inline wxSize operator*(const wxSize& s, double i) +{ + return wxSize(int(s.x * i), int(s.y * i)); +} + +inline wxSize operator*(double i, const wxSize& s) +{ + return wxSize(int(s.x * i), int(s.y * i)); +} + + + +// --------------------------------------------------------------------------- +// Point classes: with real or integer coordinates +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxRealPoint +{ +public: + double x; + double y; + + wxRealPoint() : x(0.0), y(0.0) { } + wxRealPoint(double xx, double yy) : x(xx), y(yy) { } + wxRealPoint(const wxPoint& pt); + + // no copy ctor or assignment operator - the defaults are ok + + //assignment operators + wxRealPoint& operator+=(const wxRealPoint& p) { x += p.x; y += p.y; return *this; } + wxRealPoint& operator-=(const wxRealPoint& p) { x -= p.x; y -= p.y; return *this; } + + wxRealPoint& operator+=(const wxSize& s) { x += s.GetWidth(); y += s.GetHeight(); return *this; } + wxRealPoint& operator-=(const wxSize& s) { x -= s.GetWidth(); y -= s.GetHeight(); return *this; } +}; + + +inline bool operator==(const wxRealPoint& p1, const wxRealPoint& p2) +{ + return wxIsSameDouble(p1.x, p2.x) && wxIsSameDouble(p1.y, p2.y); +} + +inline bool operator!=(const wxRealPoint& p1, const wxRealPoint& p2) +{ + return !(p1 == p2); +} + +inline wxRealPoint operator+(const wxRealPoint& p1, const wxRealPoint& p2) +{ + return wxRealPoint(p1.x + p2.x, p1.y + p2.y); +} + + +inline wxRealPoint operator-(const wxRealPoint& p1, const wxRealPoint& p2) +{ + return wxRealPoint(p1.x - p2.x, p1.y - p2.y); +} + + +inline wxRealPoint operator/(const wxRealPoint& s, int i) +{ + return wxRealPoint(s.x / i, s.y / i); +} + +inline wxRealPoint operator*(const wxRealPoint& s, int i) +{ + return wxRealPoint(s.x * i, s.y * i); +} + +inline wxRealPoint operator*(int i, const wxRealPoint& s) +{ + return wxRealPoint(s.x * i, s.y * i); +} + +inline wxRealPoint operator/(const wxRealPoint& s, unsigned int i) +{ + return wxRealPoint(s.x / i, s.y / i); +} + +inline wxRealPoint operator*(const wxRealPoint& s, unsigned int i) +{ + return wxRealPoint(s.x * i, s.y * i); +} + +inline wxRealPoint operator*(unsigned int i, const wxRealPoint& s) +{ + return wxRealPoint(s.x * i, s.y * i); +} + +inline wxRealPoint operator/(const wxRealPoint& s, long i) +{ + return wxRealPoint(s.x / i, s.y / i); +} + +inline wxRealPoint operator*(const wxRealPoint& s, long i) +{ + return wxRealPoint(s.x * i, s.y * i); +} + +inline wxRealPoint operator*(long i, const wxRealPoint& s) +{ + return wxRealPoint(s.x * i, s.y * i); +} + +inline wxRealPoint operator/(const wxRealPoint& s, unsigned long i) +{ + return wxRealPoint(s.x / i, s.y / i); +} + +inline wxRealPoint operator*(const wxRealPoint& s, unsigned long i) +{ + return wxRealPoint(s.x * i, s.y * i); +} + +inline wxRealPoint operator*(unsigned long i, const wxRealPoint& s) +{ + return wxRealPoint(s.x * i, s.y * i); +} + +inline wxRealPoint operator*(const wxRealPoint& s, double i) +{ + return wxRealPoint(int(s.x * i), int(s.y * i)); +} + +inline wxRealPoint operator*(double i, const wxRealPoint& s) +{ + return wxRealPoint(int(s.x * i), int(s.y * i)); +} + + +// ---------------------------------------------------------------------------- +// wxPoint: 2D point with integer coordinates +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPoint +{ +public: + int x, y; + + wxPoint() : x(0), y(0) { } + wxPoint(int xx, int yy) : x(xx), y(yy) { } + wxPoint(const wxRealPoint& pt) : x(int(pt.x)), y(int(pt.y)) { } + + // no copy ctor or assignment operator - the defaults are ok + + //assignment operators + wxPoint& operator+=(const wxPoint& p) { x += p.x; y += p.y; return *this; } + wxPoint& operator-=(const wxPoint& p) { x -= p.x; y -= p.y; return *this; } + + wxPoint& operator+=(const wxSize& s) { x += s.GetWidth(); y += s.GetHeight(); return *this; } + wxPoint& operator-=(const wxSize& s) { x -= s.GetWidth(); y -= s.GetHeight(); return *this; } + + // check if both components are set/initialized + bool IsFullySpecified() const { return x != wxDefaultCoord && y != wxDefaultCoord; } + + // fill in the unset components with the values from the other point + void SetDefaults(const wxPoint& pt) + { + if ( x == wxDefaultCoord ) + x = pt.x; + if ( y == wxDefaultCoord ) + y = pt.y; + } +}; + + +// comparison +inline bool operator==(const wxPoint& p1, const wxPoint& p2) +{ + return p1.x == p2.x && p1.y == p2.y; +} + +inline bool operator!=(const wxPoint& p1, const wxPoint& p2) +{ + return !(p1 == p2); +} + + +// arithmetic operations (component wise) +inline wxPoint operator+(const wxPoint& p1, const wxPoint& p2) +{ + return wxPoint(p1.x + p2.x, p1.y + p2.y); +} + +inline wxPoint operator-(const wxPoint& p1, const wxPoint& p2) +{ + return wxPoint(p1.x - p2.x, p1.y - p2.y); +} + +inline wxPoint operator+(const wxPoint& p, const wxSize& s) +{ + return wxPoint(p.x + s.x, p.y + s.y); +} + +inline wxPoint operator-(const wxPoint& p, const wxSize& s) +{ + return wxPoint(p.x - s.x, p.y - s.y); +} + +inline wxPoint operator+(const wxSize& s, const wxPoint& p) +{ + return wxPoint(p.x + s.x, p.y + s.y); +} + +inline wxPoint operator-(const wxSize& s, const wxPoint& p) +{ + return wxPoint(s.x - p.x, s.y - p.y); +} + +inline wxPoint operator-(const wxPoint& p) +{ + return wxPoint(-p.x, -p.y); +} + +inline wxPoint operator/(const wxPoint& s, int i) +{ + return wxPoint(s.x / i, s.y / i); +} + +inline wxPoint operator*(const wxPoint& s, int i) +{ + return wxPoint(s.x * i, s.y * i); +} + +inline wxPoint operator*(int i, const wxPoint& s) +{ + return wxPoint(s.x * i, s.y * i); +} + +inline wxPoint operator/(const wxPoint& s, unsigned int i) +{ + return wxPoint(s.x / i, s.y / i); +} + +inline wxPoint operator*(const wxPoint& s, unsigned int i) +{ + return wxPoint(s.x * i, s.y * i); +} + +inline wxPoint operator*(unsigned int i, const wxPoint& s) +{ + return wxPoint(s.x * i, s.y * i); +} + +inline wxPoint operator/(const wxPoint& s, long i) +{ + return wxPoint(s.x / i, s.y / i); +} + +inline wxPoint operator*(const wxPoint& s, long i) +{ + return wxPoint(int(s.x * i), int(s.y * i)); +} + +inline wxPoint operator*(long i, const wxPoint& s) +{ + return wxPoint(int(s.x * i), int(s.y * i)); +} + +inline wxPoint operator/(const wxPoint& s, unsigned long i) +{ + return wxPoint(s.x / i, s.y / i); +} + +inline wxPoint operator*(const wxPoint& s, unsigned long i) +{ + return wxPoint(int(s.x * i), int(s.y * i)); +} + +inline wxPoint operator*(unsigned long i, const wxPoint& s) +{ + return wxPoint(int(s.x * i), int(s.y * i)); +} + +inline wxPoint operator*(const wxPoint& s, double i) +{ + return wxPoint(int(s.x * i), int(s.y * i)); +} + +inline wxPoint operator*(double i, const wxPoint& s) +{ + return wxPoint(int(s.x * i), int(s.y * i)); +} + +WX_DECLARE_LIST_WITH_DECL(wxPoint, wxPointList, class WXDLLIMPEXP_CORE); + +// --------------------------------------------------------------------------- +// wxRect +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxRect +{ +public: + wxRect() + : x(0), y(0), width(0), height(0) + { } + wxRect(int xx, int yy, int ww, int hh) + : x(xx), y(yy), width(ww), height(hh) + { } + wxRect(const wxPoint& topLeft, const wxPoint& bottomRight); + wxRect(const wxPoint& pt, const wxSize& size) + : x(pt.x), y(pt.y), width(size.x), height(size.y) + { } + wxRect(const wxSize& size) + : x(0), y(0), width(size.x), height(size.y) + { } + + // default copy ctor and assignment operators ok + + int GetX() const { return x; } + void SetX(int xx) { x = xx; } + + int GetY() const { return y; } + void SetY(int yy) { y = yy; } + + int GetWidth() const { return width; } + void SetWidth(int w) { width = w; } + + int GetHeight() const { return height; } + void SetHeight(int h) { height = h; } + + wxPoint GetPosition() const { return wxPoint(x, y); } + void SetPosition( const wxPoint &p ) { x = p.x; y = p.y; } + + wxSize GetSize() const { return wxSize(width, height); } + void SetSize( const wxSize &s ) { width = s.GetWidth(); height = s.GetHeight(); } + + bool IsEmpty() const { return (width <= 0) || (height <= 0); } + + int GetLeft() const { return x; } + int GetTop() const { return y; } + int GetBottom() const { return y + height - 1; } + int GetRight() const { return x + width - 1; } + + void SetLeft(int left) { x = left; } + void SetRight(int right) { width = right - x + 1; } + void SetTop(int top) { y = top; } + void SetBottom(int bottom) { height = bottom - y + 1; } + + wxPoint GetTopLeft() const { return GetPosition(); } + wxPoint GetLeftTop() const { return GetTopLeft(); } + void SetTopLeft(const wxPoint &p) { SetPosition(p); } + void SetLeftTop(const wxPoint &p) { SetTopLeft(p); } + + wxPoint GetBottomRight() const { return wxPoint(GetRight(), GetBottom()); } + wxPoint GetRightBottom() const { return GetBottomRight(); } + void SetBottomRight(const wxPoint &p) { SetRight(p.x); SetBottom(p.y); } + void SetRightBottom(const wxPoint &p) { SetBottomRight(p); } + + wxPoint GetTopRight() const { return wxPoint(GetRight(), GetTop()); } + wxPoint GetRightTop() const { return GetTopRight(); } + void SetTopRight(const wxPoint &p) { SetRight(p.x); SetTop(p.y); } + void SetRightTop(const wxPoint &p) { SetTopRight(p); } + + wxPoint GetBottomLeft() const { return wxPoint(GetLeft(), GetBottom()); } + wxPoint GetLeftBottom() const { return GetBottomLeft(); } + void SetBottomLeft(const wxPoint &p) { SetLeft(p.x); SetBottom(p.y); } + void SetLeftBottom(const wxPoint &p) { SetBottomLeft(p); } + + // operations with rect + wxRect& Inflate(wxCoord dx, wxCoord dy); + wxRect& Inflate(const wxSize& d) { return Inflate(d.x, d.y); } + wxRect& Inflate(wxCoord d) { return Inflate(d, d); } + wxRect Inflate(wxCoord dx, wxCoord dy) const + { + wxRect r = *this; + r.Inflate(dx, dy); + return r; + } + + wxRect& Deflate(wxCoord dx, wxCoord dy) { return Inflate(-dx, -dy); } + wxRect& Deflate(const wxSize& d) { return Inflate(-d.x, -d.y); } + wxRect& Deflate(wxCoord d) { return Inflate(-d); } + wxRect Deflate(wxCoord dx, wxCoord dy) const + { + wxRect r = *this; + r.Deflate(dx, dy); + return r; + } + + void Offset(wxCoord dx, wxCoord dy) { x += dx; y += dy; } + void Offset(const wxPoint& pt) { Offset(pt.x, pt.y); } + + wxRect& Intersect(const wxRect& rect); + wxRect Intersect(const wxRect& rect) const + { + wxRect r = *this; + r.Intersect(rect); + return r; + } + + wxRect& Union(const wxRect& rect); + wxRect Union(const wxRect& rect) const + { + wxRect r = *this; + r.Union(rect); + return r; + } + + // return true if the point is (not strcitly) inside the rect + bool Contains(int x, int y) const; + bool Contains(const wxPoint& pt) const { return Contains(pt.x, pt.y); } + // return true if the rectangle 'rect' is (not strictly) inside this rect + bool Contains(const wxRect& rect) const; + +#if WXWIN_COMPATIBILITY_2_6 + // use Contains() instead + wxDEPRECATED( bool Inside(int x, int y) const ); + wxDEPRECATED( bool Inside(const wxPoint& pt) const ); + wxDEPRECATED( bool Inside(const wxRect& rect) const ); +#endif // WXWIN_COMPATIBILITY_2_6 + + // return true if the rectangles have a non empty intersection + bool Intersects(const wxRect& rect) const; + + // like Union() but don't ignore empty rectangles + wxRect& operator+=(const wxRect& rect); + + // intersections of two rectrangles not testing for empty rectangles + wxRect& operator*=(const wxRect& rect); + + // centre this rectangle in the given (usually, but not necessarily, + // larger) one + wxRect CentreIn(const wxRect& r, int dir = wxBOTH) const + { + return wxRect(dir & wxHORIZONTAL ? r.x + (r.width - width)/2 : x, + dir & wxVERTICAL ? r.y + (r.height - height)/2 : y, + width, height); + } + + wxRect CenterIn(const wxRect& r, int dir = wxBOTH) const + { + return CentreIn(r, dir); + } + +public: + int x, y, width, height; +}; + + +// compare rectangles +inline bool operator==(const wxRect& r1, const wxRect& r2) +{ + return (r1.x == r2.x) && (r1.y == r2.y) && + (r1.width == r2.width) && (r1.height == r2.height); +} + +inline bool operator!=(const wxRect& r1, const wxRect& r2) +{ + return !(r1 == r2); +} + +// like Union() but don't treat empty rectangles specially +WXDLLIMPEXP_CORE wxRect operator+(const wxRect& r1, const wxRect& r2); + +// intersections of two rectangles +WXDLLIMPEXP_CORE wxRect operator*(const wxRect& r1, const wxRect& r2); + + + + +#if WXWIN_COMPATIBILITY_2_6 +inline bool wxRect::Inside(int cx, int cy) const { return Contains(cx, cy); } +inline bool wxRect::Inside(const wxPoint& pt) const { return Contains(pt); } +inline bool wxRect::Inside(const wxRect& rect) const { return Contains(rect); } +#endif // WXWIN_COMPATIBILITY_2_6 + + +// define functions which couldn't be defined above because of declarations +// order +inline void wxSize::IncBy(const wxPoint& pt) { IncBy(pt.x, pt.y); } +inline void wxSize::DecBy(const wxPoint& pt) { DecBy(pt.x, pt.y); } + +// --------------------------------------------------------------------------- +// Management of pens, brushes and fonts +// --------------------------------------------------------------------------- + +typedef wxInt8 wxDash; + +class WXDLLIMPEXP_CORE wxGDIObjListBase { +public: + wxGDIObjListBase(); + ~wxGDIObjListBase(); + +protected: + wxList list; +}; + +WX_DECLARE_STRING_HASH_MAP(wxColour*, wxStringToColourHashMap); + +class WXDLLIMPEXP_CORE wxColourDatabase +{ +public: + wxColourDatabase(); + ~wxColourDatabase(); + + // find colour by name or name for the given colour + wxColour Find(const wxString& name) const; + wxString FindName(const wxColour& colour) const; + + // add a new colour to the database + void AddColour(const wxString& name, const wxColour& colour); + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, use Find() instead + wxDEPRECATED( wxColour *FindColour(const wxString& name) ); +#endif // WXWIN_COMPATIBILITY_2_6 + + +#ifdef __WXPM__ + // PM keeps its own type of colour table + long* m_palTable; + size_t m_nSize; +#endif + +private: + // load the database with the built in colour values when called for the + // first time, do nothing after this + void Initialize(); + + wxStringToColourHashMap *m_map; +}; + +class WXDLLIMPEXP_CORE wxResourceCache: public wxList +{ +public: + wxResourceCache() { } +#if !wxUSE_STD_CONTAINERS + wxResourceCache(const unsigned int keyType) : wxList(keyType) { } +#endif + virtual ~wxResourceCache(); +}; + +// --------------------------------------------------------------------------- +// global variables +// --------------------------------------------------------------------------- + + +/* Stock objects + + wxStockGDI creates the stock GDI objects on demand. Pointers to the + created objects are stored in the ms_stockObject array, which is indexed + by the Item enum values. Platorm-specific fonts can be created by + implementing a derived class with an override for the GetFont function. + wxStockGDI operates as a singleton, accessed through the ms_instance + pointer. By default this pointer is set to an instance of wxStockGDI. + A derived class must arrange to set this pointer to an instance of itself. +*/ +class WXDLLIMPEXP_CORE wxStockGDI +{ +public: + enum Item { + BRUSH_BLACK, + BRUSH_BLUE, + BRUSH_CYAN, + BRUSH_GREEN, + BRUSH_YELLOW, + BRUSH_GREY, + BRUSH_LIGHTGREY, + BRUSH_MEDIUMGREY, + BRUSH_RED, + BRUSH_TRANSPARENT, + BRUSH_WHITE, + COLOUR_BLACK, + COLOUR_BLUE, + COLOUR_CYAN, + COLOUR_GREEN, + COLOUR_YELLOW, + COLOUR_LIGHTGREY, + COLOUR_RED, + COLOUR_WHITE, + CURSOR_CROSS, + CURSOR_HOURGLASS, + CURSOR_STANDARD, + FONT_ITALIC, + FONT_NORMAL, + FONT_SMALL, + FONT_SWISS, + PEN_BLACK, + PEN_BLACKDASHED, + PEN_BLUE, + PEN_CYAN, + PEN_GREEN, + PEN_YELLOW, + PEN_GREY, + PEN_LIGHTGREY, + PEN_MEDIUMGREY, + PEN_RED, + PEN_TRANSPARENT, + PEN_WHITE, + ITEMCOUNT + }; + + wxStockGDI(); + virtual ~wxStockGDI(); + static void DeleteAll(); + + static wxStockGDI& instance() { return *ms_instance; } + + static const wxBrush* GetBrush(Item item); + static const wxColour* GetColour(Item item); + static const wxCursor* GetCursor(Item item); + // Can be overridden by platform-specific derived classes + virtual const wxFont* GetFont(Item item); + static const wxPen* GetPen(Item item); + +protected: + static wxStockGDI* ms_instance; + + static wxObject* ms_stockObject[ITEMCOUNT]; + + wxDECLARE_NO_COPY_CLASS(wxStockGDI); +}; + +#define wxITALIC_FONT wxStockGDI::instance().GetFont(wxStockGDI::FONT_ITALIC) +#define wxNORMAL_FONT wxStockGDI::instance().GetFont(wxStockGDI::FONT_NORMAL) +#define wxSMALL_FONT wxStockGDI::instance().GetFont(wxStockGDI::FONT_SMALL) +#define wxSWISS_FONT wxStockGDI::instance().GetFont(wxStockGDI::FONT_SWISS) + +#define wxBLACK_DASHED_PEN wxStockGDI::GetPen(wxStockGDI::PEN_BLACKDASHED) +#define wxBLACK_PEN wxStockGDI::GetPen(wxStockGDI::PEN_BLACK) +#define wxBLUE_PEN wxStockGDI::GetPen(wxStockGDI::PEN_BLUE) +#define wxCYAN_PEN wxStockGDI::GetPen(wxStockGDI::PEN_CYAN) +#define wxGREEN_PEN wxStockGDI::GetPen(wxStockGDI::PEN_GREEN) +#define wxYELLOW_PEN wxStockGDI::GetPen(wxStockGDI::PEN_YELLOW) +#define wxGREY_PEN wxStockGDI::GetPen(wxStockGDI::PEN_GREY) +#define wxLIGHT_GREY_PEN wxStockGDI::GetPen(wxStockGDI::PEN_LIGHTGREY) +#define wxMEDIUM_GREY_PEN wxStockGDI::GetPen(wxStockGDI::PEN_MEDIUMGREY) +#define wxRED_PEN wxStockGDI::GetPen(wxStockGDI::PEN_RED) +#define wxTRANSPARENT_PEN wxStockGDI::GetPen(wxStockGDI::PEN_TRANSPARENT) +#define wxWHITE_PEN wxStockGDI::GetPen(wxStockGDI::PEN_WHITE) + +#define wxBLACK_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_BLACK) +#define wxBLUE_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_BLUE) +#define wxCYAN_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_CYAN) +#define wxGREEN_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_GREEN) +#define wxYELLOW_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_YELLOW) +#define wxGREY_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_GREY) +#define wxLIGHT_GREY_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_LIGHTGREY) +#define wxMEDIUM_GREY_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_MEDIUMGREY) +#define wxRED_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_RED) +#define wxTRANSPARENT_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_TRANSPARENT) +#define wxWHITE_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_WHITE) + +#define wxBLACK wxStockGDI::GetColour(wxStockGDI::COLOUR_BLACK) +#define wxBLUE wxStockGDI::GetColour(wxStockGDI::COLOUR_BLUE) +#define wxCYAN wxStockGDI::GetColour(wxStockGDI::COLOUR_CYAN) +#define wxGREEN wxStockGDI::GetColour(wxStockGDI::COLOUR_GREEN) +#define wxYELLOW wxStockGDI::GetColour(wxStockGDI::COLOUR_YELLOW) +#define wxLIGHT_GREY wxStockGDI::GetColour(wxStockGDI::COLOUR_LIGHTGREY) +#define wxRED wxStockGDI::GetColour(wxStockGDI::COLOUR_RED) +#define wxWHITE wxStockGDI::GetColour(wxStockGDI::COLOUR_WHITE) + +#define wxCROSS_CURSOR wxStockGDI::GetCursor(wxStockGDI::CURSOR_CROSS) +#define wxHOURGLASS_CURSOR wxStockGDI::GetCursor(wxStockGDI::CURSOR_HOURGLASS) +#define wxSTANDARD_CURSOR wxStockGDI::GetCursor(wxStockGDI::CURSOR_STANDARD) + +// 'Null' objects +extern WXDLLIMPEXP_DATA_CORE(wxBitmap) wxNullBitmap; +extern WXDLLIMPEXP_DATA_CORE(wxIcon) wxNullIcon; +extern WXDLLIMPEXP_DATA_CORE(wxCursor) wxNullCursor; +extern WXDLLIMPEXP_DATA_CORE(wxPen) wxNullPen; +extern WXDLLIMPEXP_DATA_CORE(wxBrush) wxNullBrush; +extern WXDLLIMPEXP_DATA_CORE(wxPalette) wxNullPalette; +extern WXDLLIMPEXP_DATA_CORE(wxFont) wxNullFont; +extern WXDLLIMPEXP_DATA_CORE(wxColour) wxNullColour; +extern WXDLLIMPEXP_DATA_CORE(wxIconBundle) wxNullIconBundle; + +extern WXDLLIMPEXP_DATA_CORE(wxColourDatabase*) wxTheColourDatabase; + +extern WXDLLIMPEXP_DATA_CORE(const char) wxPanelNameStr[]; + +extern WXDLLIMPEXP_DATA_CORE(const wxSize) wxDefaultSize; +extern WXDLLIMPEXP_DATA_CORE(const wxPoint) wxDefaultPosition; + +// --------------------------------------------------------------------------- +// global functions +// --------------------------------------------------------------------------- + +// resource management +extern void WXDLLIMPEXP_CORE wxInitializeStockLists(); +extern void WXDLLIMPEXP_CORE wxDeleteStockLists(); + +// is the display colour (or monochrome)? +extern bool WXDLLIMPEXP_CORE wxColourDisplay(); + +// Returns depth of screen +extern int WXDLLIMPEXP_CORE wxDisplayDepth(); +#define wxGetDisplayDepth wxDisplayDepth + +// get the display size +extern void WXDLLIMPEXP_CORE wxDisplaySize(int *width, int *height); +extern wxSize WXDLLIMPEXP_CORE wxGetDisplaySize(); +extern void WXDLLIMPEXP_CORE wxDisplaySizeMM(int *width, int *height); +extern wxSize WXDLLIMPEXP_CORE wxGetDisplaySizeMM(); +extern wxSize WXDLLIMPEXP_CORE wxGetDisplayPPI(); + +// Get position and size of the display workarea +extern void WXDLLIMPEXP_CORE wxClientDisplayRect(int *x, int *y, int *width, int *height); +extern wxRect WXDLLIMPEXP_CORE wxGetClientDisplayRect(); + +// set global cursor +extern void WXDLLIMPEXP_CORE wxSetCursor(const wxCursor& cursor); + +#endif + // _WX_GDICMNH__ diff --git a/wxmsw/include/wx-3.0/wx/gdiobj.h b/wxmsw/include/wx-3.0/wx/gdiobj.h new file mode 100644 index 00000000..903dfe08 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gdiobj.h @@ -0,0 +1,92 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gdiobj.h +// Purpose: wxGDIObject base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GDIOBJ_H_BASE_ +#define _WX_GDIOBJ_H_BASE_ + +#include "wx/object.h" + +// ---------------------------------------------------------------------------- +// wxGDIRefData is the base class for wxXXXData structures which contain the +// real data for the GDI object and are shared among all wxWin objects sharing +// the same native GDI object +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGDIRefData : public wxObjectRefData +{ +public: + // Default ctor which needs to be defined just because we use + // wxDECLARE_NO_COPY_CLASS() below. + wxGDIRefData() { } + + // override this in the derived classes to check if this data object is + // really fully initialized + virtual bool IsOk() const { return true; } + +private: + wxDECLARE_NO_COPY_CLASS(wxGDIRefData); +}; + +// ---------------------------------------------------------------------------- +// wxGDIObject: base class for bitmaps, pens, brushes, ... +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGDIObject : public wxObject +{ +public: + // checks if the object can be used + virtual bool IsOk() const + { + // the cast here is safe because the derived classes always create + // wxGDIRefData objects + return m_refData && static_cast(m_refData)->IsOk(); + } + + // don't use in the new code, use IsOk() instead + bool IsNull() const { return m_refData == NULL; } + + // older version, for backwards compatibility only (but not deprecated + // because it's still widely used) + bool Ok() const { return IsOk(); } + +#if defined(__WXMSW__) || defined(__WXPM__) + // Creates the resource + virtual bool RealizeResource() { return false; } + + // Frees the resource + virtual bool FreeResource(bool WXUNUSED(force) = false) { return false; } + + virtual bool IsFree() const { return false; } + + // Returns handle. + virtual WXHANDLE GetResourceHandle() const { return 0; } +#endif // defined(__WXMSW__) || defined(__WXPM__) + +protected: + // replace base class functions using wxObjectRefData with our own which + // use wxGDIRefData to ensure that we always work with data objects of the + // correct type (i.e. derived from wxGDIRefData) + virtual wxObjectRefData *CreateRefData() const + { + return CreateGDIRefData(); + } + + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const + { + return CloneGDIRefData(static_cast(data)); + } + + virtual wxGDIRefData *CreateGDIRefData() const = 0; + virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const = 0; + + DECLARE_DYNAMIC_CLASS(wxGDIObject) +}; + +#endif // _WX_GDIOBJ_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/generic/aboutdlgg.h b/wxmsw/include/wx-3.0/wx/generic/aboutdlgg.h new file mode 100644 index 00000000..36e0cad4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/aboutdlgg.h @@ -0,0 +1,102 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/aboutdlgg.h +// Purpose: generic wxAboutBox() implementation +// Author: Vadim Zeitlin +// Created: 2006-10-07 +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_ABOUTDLGG_H_ +#define _WX_GENERIC_ABOUTDLGG_H_ + +#include "wx/defs.h" + +#if wxUSE_ABOUTDLG + +#include "wx/dialog.h" + +class WXDLLIMPEXP_FWD_ADV wxAboutDialogInfo; +class WXDLLIMPEXP_FWD_CORE wxSizer; +class WXDLLIMPEXP_FWD_CORE wxSizerFlags; + +// Under GTK and OS X "About" dialogs are not supposed to be modal, unlike MSW +// and, presumably, all the other platforms. +#ifndef wxUSE_MODAL_ABOUT_DIALOG + #if defined(__WXGTK__) || defined(__WXMAC__) + #define wxUSE_MODAL_ABOUT_DIALOG 0 + #else + #define wxUSE_MODAL_ABOUT_DIALOG 1 + #endif +#endif // wxUSE_MODAL_ABOUT_DIALOG not defined + +// ---------------------------------------------------------------------------- +// wxGenericAboutDialog: generic "About" dialog implementation +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGenericAboutDialog : public wxDialog +{ +public: + // constructors and Create() method + // -------------------------------- + + // default ctor, you must use Create() to really initialize the dialog + wxGenericAboutDialog() { Init(); } + + // ctor which fully initializes the object + wxGenericAboutDialog(const wxAboutDialogInfo& info, wxWindow* parent = NULL) + { + Init(); + + (void)Create(info, parent); + } + + // this method must be called if and only if the default ctor was used + bool Create(const wxAboutDialogInfo& info, wxWindow* parent = NULL); + +protected: + // this virtual method may be overridden to add some more controls to the + // dialog + // + // notice that for this to work you must call Create() from the derived + // class ctor and not use the base class ctor directly as otherwise the + // virtual function of the derived class wouldn't be called + virtual void DoAddCustomControls() { } + + // add arbitrary control to the text sizer contents with the specified + // flags + void AddControl(wxWindow *win, const wxSizerFlags& flags); + + // add arbitrary control to the text sizer contents and center it + void AddControl(wxWindow *win); + + // add the text, if it's not empty, to the text sizer contents + void AddText(const wxString& text); + +#if wxUSE_COLLPANE + // add a wxCollapsiblePane containing the given text + void AddCollapsiblePane(const wxString& title, const wxString& text); +#endif // wxUSE_COLLPANE + +private: + // common part of all ctors + void Init() { m_sizerText = NULL; } + +#if !wxUSE_MODAL_ABOUT_DIALOG + // An explicit handler for deleting the dialog when it's closed is needed + // when we show it non-modally. + void OnCloseWindow(wxCloseEvent& event); + void OnOK(wxCommandEvent& event); +#endif // !wxUSE_MODAL_ABOUT_DIALOG + + wxSizer *m_sizerText; +}; + +// unlike wxAboutBox which can show either the native or generic about dialog, +// this function always shows the generic one +WXDLLIMPEXP_ADV void wxGenericAboutBox(const wxAboutDialogInfo& info, wxWindow* parent = NULL); + +#endif // wxUSE_ABOUTDLG + +#endif // _WX_GENERIC_ABOUTDLGG_H_ + diff --git a/wxmsw/include/wx-3.0/wx/generic/accel.h b/wxmsw/include/wx-3.0/wx/generic/accel.h new file mode 100644 index 00000000..44f8e07e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/accel.h @@ -0,0 +1,49 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/accel.h +// Purpose: wxAcceleratorTable class +// Author: Robert Roebling +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_ACCEL_H_ +#define _WX_GENERIC_ACCEL_H_ + +class WXDLLIMPEXP_FWD_CORE wxKeyEvent; + +// ---------------------------------------------------------------------------- +// wxAcceleratorTable +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxAcceleratorTable : public wxObject +{ +public: + wxAcceleratorTable(); + wxAcceleratorTable(int n, const wxAcceleratorEntry entries[]); + virtual ~wxAcceleratorTable(); + + bool Ok() const { return IsOk(); } + bool IsOk() const; + + void Add(const wxAcceleratorEntry& entry); + void Remove(const wxAcceleratorEntry& entry); + + // implementation + // -------------- + + wxMenuItem *GetMenuItem(const wxKeyEvent& event) const; + int GetCommand(const wxKeyEvent& event) const; + + const wxAcceleratorEntry *GetEntry(const wxKeyEvent& event) const; + +protected: + // ref counting code + virtual wxObjectRefData *CreateRefData() const; + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + +private: + DECLARE_DYNAMIC_CLASS(wxAcceleratorTable) +}; + +#endif // _WX_GENERIC_ACCEL_H_ + diff --git a/wxmsw/include/wx-3.0/wx/generic/bmpcbox.h b/wxmsw/include/wx-3.0/wx/generic/bmpcbox.h new file mode 100644 index 00000000..d5e5cbb1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/bmpcbox.h @@ -0,0 +1,136 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/bmpcbox.h +// Purpose: wxBitmapComboBox +// Author: Jaakko Salli +// Modified by: +// Created: Aug-30-2006 +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_BMPCBOX_H_ +#define _WX_GENERIC_BMPCBOX_H_ + + +#define wxGENERIC_BITMAPCOMBOBOX 1 + +#include "wx/odcombo.h" + +// ---------------------------------------------------------------------------- +// wxBitmapComboBox: a wxComboBox that allows images to be shown +// in front of string items. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxBitmapComboBox : public wxOwnerDrawnComboBox, + public wxBitmapComboBoxBase +{ +public: + + // ctors and such + wxBitmapComboBox() : wxOwnerDrawnComboBox(), wxBitmapComboBoxBase() + { + Init(); + } + + wxBitmapComboBox(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, + const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxBitmapComboBoxNameStr) + : wxOwnerDrawnComboBox(), + wxBitmapComboBoxBase() + { + Init(); + + (void)Create(parent, id, value, pos, size, n, + choices, style, validator, name); + } + + wxBitmapComboBox(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxBitmapComboBoxNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + int n, + const wxString choices[], + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxBitmapComboBoxNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxBitmapComboBoxNameStr); + + virtual ~wxBitmapComboBox(); + + // Adds item with image to the end of the combo box. + int Append(const wxString& item, const wxBitmap& bitmap = wxNullBitmap); + int Append(const wxString& item, const wxBitmap& bitmap, void *clientData); + int Append(const wxString& item, const wxBitmap& bitmap, wxClientData *clientData); + + // Inserts item with image into the list before pos. Not valid for wxCB_SORT + // styles, use Append instead. + int Insert(const wxString& item, const wxBitmap& bitmap, unsigned int pos); + int Insert(const wxString& item, const wxBitmap& bitmap, + unsigned int pos, void *clientData); + int Insert(const wxString& item, const wxBitmap& bitmap, + unsigned int pos, wxClientData *clientData); + + // Sets the image for the given item. + virtual void SetItemBitmap(unsigned int n, const wxBitmap& bitmap); + virtual bool SetFont(const wxFont& font); + +protected: + + virtual void OnDrawBackground(wxDC& dc, const wxRect& rect, int item, int flags) const; + virtual void OnDrawItem(wxDC& dc, const wxRect& rect, int item, int flags) const; + virtual wxCoord OnMeasureItem(size_t item) const; + virtual wxCoord OnMeasureItemWidth(size_t item) const; + + // Event handlers + void OnSize(wxSizeEvent& event); + + virtual wxSize DoGetBestSize() const; + + virtual wxItemContainer* GetItemContainer() { return this; } + virtual wxWindow* GetControl() { return this; } + + // wxItemContainer implementation + virtual int DoInsertItems(const wxArrayStringsAdapter & items, + unsigned int pos, + void **clientData, wxClientDataType type); + virtual void DoClear(); + virtual void DoDeleteOneItem(unsigned int n); + +private: + bool m_inResize; + + void Init(); + + DECLARE_EVENT_TABLE() + + DECLARE_DYNAMIC_CLASS(wxBitmapComboBox) +}; + +#endif // _WX_GENERIC_BMPCBOX_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/busyinfo.h b/wxmsw/include/wx-3.0/wx/generic/busyinfo.h new file mode 100644 index 00000000..7f56edb2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/busyinfo.h @@ -0,0 +1,41 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/busyinfo.h +// Purpose: Information window (when app is busy) +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BUSYINFO_H_ +#define _WX_BUSYINFO_H_ + +#include "wx/defs.h" + +#if wxUSE_BUSYINFO + +#include "wx/object.h" + +class WXDLLIMPEXP_FWD_CORE wxFrame; +class WXDLLIMPEXP_FWD_CORE wxWindow; + +//-------------------------------------------------------------------------------- +// wxBusyInfo +// Displays progress information +// Can be used in exactly same way as wxBusyCursor +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxBusyInfo : public wxObject +{ +public: + wxBusyInfo(const wxString& message, wxWindow *parent = NULL); + + virtual ~wxBusyInfo(); + +private: + wxFrame *m_InfoFrame; + + wxDECLARE_NO_COPY_CLASS(wxBusyInfo); +}; + +#endif // wxUSE_BUSYINFO +#endif // _WX_BUSYINFO_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/buttonbar.h b/wxmsw/include/wx-3.0/wx/generic/buttonbar.h new file mode 100644 index 00000000..e933a3ca --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/buttonbar.h @@ -0,0 +1,123 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/buttonbar.h +// Purpose: wxButtonToolBar declaration +// Author: Julian Smart, after Robert Roebling, Vadim Zeitlin, SciTech +// Modified by: +// Created: 2006-04-13 +// Copyright: (c) Julian Smart, Robert Roebling, Vadim Zeitlin, +// SciTech Software, Inc. +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BUTTONBAR_H_ +#define _WX_BUTTONBAR_H_ + +#include "wx/bmpbuttn.h" +#include "wx/toolbar.h" + +class WXDLLIMPEXP_FWD_CORE wxButtonToolBarTool; + +// ---------------------------------------------------------------------------- +// wxButtonToolBar +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxButtonToolBar : public wxToolBarBase +{ +public: + // construction/destruction + wxButtonToolBar() { Init(); } + wxButtonToolBar(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxToolBarNameStr) + { + Init(); + + Create(parent, id, pos, size, style, name); + } + + bool Create( wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxToolBarNameStr ); + + virtual ~wxButtonToolBar(); + + virtual bool Realize(); + + virtual void SetToolShortHelp(int id, const wxString& helpString); + virtual wxToolBarToolBase *FindToolForPosition(wxCoord x, wxCoord y) const; + +protected: + // common part of all ctors + void Init(); + + // implement base class pure virtuals + virtual bool DoInsertTool(size_t pos, wxToolBarToolBase *tool); + virtual bool DoDeleteTool(size_t pos, wxToolBarToolBase *tool); + + virtual void DoEnableTool(wxToolBarToolBase *tool, bool enable); + virtual void DoToggleTool(wxToolBarToolBase *tool, bool toggle); + virtual void DoSetToggle(wxToolBarToolBase *tool, bool toggle); + + virtual wxToolBarToolBase *CreateTool(int id, + const wxString& label, + const wxBitmap& bmpNormal, + const wxBitmap& bmpDisabled, + wxItemKind kind, + wxObject *clientData, + const wxString& shortHelp, + const wxString& longHelp); + virtual wxToolBarToolBase *CreateTool(wxControl *control, + const wxString& label); + + virtual wxSize DoGetBestClientSize() const; + + // calculate layout + void DoLayout(); + + // get the bounding rect for the given tool + wxRect GetToolRect(wxToolBarToolBase *tool) const; + + // get the rect limits depending on the orientation: top/bottom for a + // vertical toolbar, left/right for a horizontal one + void GetRectLimits(const wxRect& rect, wxCoord *start, wxCoord *end) const; + + // receives button commands + void OnCommand(wxCommandEvent& event); + + // paints a border + void OnPaint(wxPaintEvent& event); + + // detects mouse clicks outside buttons + void OnLeftUp(wxMouseEvent& event); + +private: + // have we calculated the positions of our tools? + bool m_needsLayout; + + // the width of a separator + wxCoord m_widthSeparator; + + // the total size of all toolbar elements + wxCoord m_maxWidth, + m_maxHeight; + + // the height of a label + int m_labelHeight; + + // the space above the label + int m_labelMargin; + +private: + DECLARE_DYNAMIC_CLASS(wxButtonToolBar) + DECLARE_EVENT_TABLE() +}; + +#endif + // _WX_BUTTONBAR_H_ + diff --git a/wxmsw/include/wx-3.0/wx/generic/calctrlg.h b/wxmsw/include/wx-3.0/wx/generic/calctrlg.h new file mode 100644 index 00000000..8e430b62 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/calctrlg.h @@ -0,0 +1,316 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/calctrlg.h +// Purpose: generic implementation of date-picker control +// Author: Vadim Zeitlin +// Modified by: +// Created: 29.12.99 +// Copyright: (c) 1999 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_CALCTRLG_H +#define _WX_GENERIC_CALCTRLG_H + +#include "wx/control.h" // the base class +#include "wx/dcclient.h" // for wxPaintDC + +class WXDLLIMPEXP_FWD_CORE wxComboBox; +class WXDLLIMPEXP_FWD_CORE wxStaticText; +class WXDLLIMPEXP_FWD_CORE wxSpinCtrl; +class WXDLLIMPEXP_FWD_CORE wxSpinEvent; + +// ---------------------------------------------------------------------------- +// wxGenericCalendarCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGenericCalendarCtrl : public wxCalendarCtrlBase +{ +public: + // construction + wxGenericCalendarCtrl() { Init(); } + wxGenericCalendarCtrl(wxWindow *parent, + wxWindowID id, + const wxDateTime& date = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCAL_SHOW_HOLIDAYS, + const wxString& name = wxCalendarNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxDateTime& date = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCAL_SHOW_HOLIDAYS, + const wxString& name = wxCalendarNameStr); + + virtual ~wxGenericCalendarCtrl(); + + virtual bool Destroy(); + + // set/get the current date + // ------------------------ + + virtual bool SetDate(const wxDateTime& date); + virtual wxDateTime GetDate() const { return m_date; } + + + // set/get the range in which selection can occur + // --------------------------------------------- + + virtual bool SetDateRange(const wxDateTime& lowerdate = wxDefaultDateTime, + const wxDateTime& upperdate = wxDefaultDateTime); + + virtual bool GetDateRange(wxDateTime *lowerdate, wxDateTime *upperdate) const; + + // these functions are for generic version only, don't use them but use the + // Set/GetDateRange() above instead + bool SetLowerDateLimit(const wxDateTime& date = wxDefaultDateTime); + const wxDateTime& GetLowerDateLimit() const { return m_lowdate; } + bool SetUpperDateLimit(const wxDateTime& date = wxDefaultDateTime); + const wxDateTime& GetUpperDateLimit() const { return m_highdate; } + + + // calendar mode + // ------------- + + // some calendar styles can't be changed after the control creation by + // just using SetWindowStyle() and Refresh() and the functions below + // should be used instead for them + + // corresponds to wxCAL_NO_MONTH_CHANGE bit + virtual bool EnableMonthChange(bool enable = true); + + // corresponds to wxCAL_NO_YEAR_CHANGE bit, deprecated, generic only + void EnableYearChange(bool enable = true); + + + // customization + // ------------- + + virtual void Mark(size_t day, bool mark); + + // all other functions in this section are for generic version only + + // header colours are used for painting the weekdays at the top + virtual void SetHeaderColours(const wxColour& colFg, const wxColour& colBg) + { + m_colHeaderFg = colFg; + m_colHeaderBg = colBg; + } + + virtual const wxColour& GetHeaderColourFg() const { return m_colHeaderFg; } + virtual const wxColour& GetHeaderColourBg() const { return m_colHeaderBg; } + + // highlight colour is used for the currently selected date + virtual void SetHighlightColours(const wxColour& colFg, const wxColour& colBg) + { + m_colHighlightFg = colFg; + m_colHighlightBg = colBg; + } + + virtual const wxColour& GetHighlightColourFg() const { return m_colHighlightFg; } + virtual const wxColour& GetHighlightColourBg() const { return m_colHighlightBg; } + + // holiday colour is used for the holidays (if style & wxCAL_SHOW_HOLIDAYS) + virtual void SetHolidayColours(const wxColour& colFg, const wxColour& colBg) + { + m_colHolidayFg = colFg; + m_colHolidayBg = colBg; + } + + virtual const wxColour& GetHolidayColourFg() const { return m_colHolidayFg; } + virtual const wxColour& GetHolidayColourBg() const { return m_colHolidayBg; } + + virtual wxCalendarDateAttr *GetAttr(size_t day) const + { + wxCHECK_MSG( day > 0 && day < 32, NULL, wxT("invalid day") ); + + return m_attrs[day - 1]; + } + + virtual void SetAttr(size_t day, wxCalendarDateAttr *attr) + { + wxCHECK_RET( day > 0 && day < 32, wxT("invalid day") ); + + delete m_attrs[day - 1]; + m_attrs[day - 1] = attr; + } + + virtual void ResetAttr(size_t day) { SetAttr(day, NULL); } + + virtual void SetHoliday(size_t day); + + virtual wxCalendarHitTestResult HitTest(const wxPoint& pos, + wxDateTime *date = NULL, + wxDateTime::WeekDay *wd = NULL); + + // implementation only from now on + // ------------------------------- + + // forward these functions to all subcontrols + virtual bool Enable(bool enable = true); + virtual bool Show(bool show = true); + + virtual void SetWindowStyleFlag(long style); + + virtual wxVisualAttributes GetDefaultAttributes() const + { return GetClassDefaultAttributes(GetWindowVariant()); } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + void OnSysColourChanged(wxSysColourChangedEvent& event); + +protected: + // override some base class virtuals + virtual wxSize DoGetBestSize() const; + virtual void DoMoveWindow(int x, int y, int width, int height); + virtual void DoGetSize(int *width, int *height) const; + +private: + // common part of all ctors + void Init(); + + // startup colours and reinitialization after colour changes in system + void InitColours(); + + // event handlers + void OnPaint(wxPaintEvent& event); + void OnClick(wxMouseEvent& event); + void OnDClick(wxMouseEvent& event); + void OnChar(wxKeyEvent& event); + void OnMonthChange(wxCommandEvent& event); + + void HandleYearChange(wxCommandEvent& event); + void OnYearChange(wxSpinEvent& event); + void OnYearTextChange(wxCommandEvent& event); + + // (re)calc m_widthCol and m_heightRow + void RecalcGeometry(); + + // set the date and send the notification + void SetDateAndNotify(const wxDateTime& date); + + // get the week (row, in range 1..6) for the given date + size_t GetWeek(const wxDateTime& date) const; + + // get the date from which we start drawing days + wxDateTime GetStartDate() const; + + // get the first/last days of the week corresponding to the current style + wxDateTime::WeekDay GetWeekStart() const + { + return HasFlag(wxCAL_MONDAY_FIRST) ? wxDateTime::Mon + : wxDateTime::Sun; + } + + wxDateTime::WeekDay GetWeekEnd() const + { + return HasFlag(wxCAL_MONDAY_FIRST) ? wxDateTime::Sun + : wxDateTime::Sat; + } + + + // is this date shown? + bool IsDateShown(const wxDateTime& date) const; + + // is this date in the currently allowed range? + bool IsDateInRange(const wxDateTime& date) const; + + // adjust the date to the currently allowed range, return true if it was + // changed + bool AdjustDateToRange(wxDateTime *date) const; + + // redraw the given date + void RefreshDate(const wxDateTime& date); + + // change the date inside the same month/year + void ChangeDay(const wxDateTime& date); + + // deprecated + bool AllowYearChange() const + { + return !(GetWindowStyle() & wxCAL_NO_YEAR_CHANGE); + } + + // show the correct controls + void ShowCurrentControls(); + + // create the month combo and year spin controls + void CreateMonthComboBox(); + void CreateYearSpinCtrl(); + +public: + // get the currently shown control for month/year + wxControl *GetMonthControl() const; + wxControl *GetYearControl() const; + +private: + virtual void ResetHolidayAttrs(); + virtual void RefreshHolidays() { Refresh(); } + + // OnPaint helper-methods + + // Highlight the [fromdate : todate] range using pen and brush + void HighlightRange(wxPaintDC* dc, const wxDateTime& fromdate, const wxDateTime& todate, const wxPen* pen, const wxBrush* brush); + + // Get the "coordinates" for the date relative to the month currently displayed. + // using (day, week): upper left coord is (1, 1), lower right coord is (7, 6) + // if the date isn't visible (-1, -1) is put in (day, week) and false is returned + bool GetDateCoord(const wxDateTime& date, int *day, int *week) const; + + // Set the flag for SetDate(): otherwise it would overwrite the year + // typed in by the user + void SetUserChangedYear() { m_userChangedYear = true; } + + + // the subcontrols + wxStaticText *m_staticMonth; + wxComboBox *m_comboMonth; + + wxStaticText *m_staticYear; + wxSpinCtrl *m_spinYear; + + // the current selection + wxDateTime m_date; + + // the date-range + wxDateTime m_lowdate; + wxDateTime m_highdate; + + // default attributes + wxColour m_colHighlightFg, + m_colHighlightBg, + m_colHolidayFg, + m_colHolidayBg, + m_colHeaderFg, + m_colHeaderBg, + m_colBackground, + m_colSurrounding; + + // the attributes for each of the month days + wxCalendarDateAttr *m_attrs[31]; + + // the width and height of one column/row in the calendar + wxCoord m_widthCol, + m_heightRow, + m_rowOffset, + m_calendarWeekWidth; + + wxRect m_leftArrowRect, + m_rightArrowRect; + + // the week day names + wxString m_weekdays[7]; + + // true if SetDate() is being called as the result of changing the year in + // the year control + bool m_userChangedYear; + + DECLARE_DYNAMIC_CLASS(wxGenericCalendarCtrl) + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxGenericCalendarCtrl); +}; + +#endif // _WX_GENERIC_CALCTRLG_H diff --git a/wxmsw/include/wx-3.0/wx/generic/caret.h b/wxmsw/include/wx-3.0/wx/generic/caret.h new file mode 100644 index 00000000..67041cf2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/caret.h @@ -0,0 +1,94 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/caret.h +// Purpose: generic wxCaret class +// Author: Vadim Zeitlin (original code by Robert Roebling) +// Modified by: +// Created: 25.05.99 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CARET_H_ +#define _WX_CARET_H_ + +#include "wx/timer.h" +#include "wx/dc.h" +#include "wx/overlay.h" + +#ifdef wxHAS_NATIVE_OVERLAY + #define wxHAS_CARET_USING_OVERLAYS +#endif + +class WXDLLIMPEXP_FWD_CORE wxCaret; + +class WXDLLIMPEXP_CORE wxCaretTimer : public wxTimer +{ +public: + wxCaretTimer(wxCaret *caret); + virtual void Notify(); + +private: + wxCaret *m_caret; +}; + +class WXDLLIMPEXP_CORE wxCaret : public wxCaretBase +{ +public: + // ctors + // ----- + // default - use Create() + wxCaret() : m_timer(this) { InitGeneric(); } + // creates a block caret associated with the given window + wxCaret(wxWindowBase *window, int width, int height) + : wxCaretBase(window, width, height), m_timer(this) { InitGeneric(); } + wxCaret(wxWindowBase *window, const wxSize& size) + : wxCaretBase(window, size), m_timer(this) { InitGeneric(); } + + virtual ~wxCaret(); + + // implementation + // -------------- + + // called by wxWindow (not using the event tables) + virtual void OnSetFocus(); + virtual void OnKillFocus(); + + // called by wxCaretTimer + void OnTimer(); + +protected: + virtual void DoShow(); + virtual void DoHide(); + virtual void DoMove(); + virtual void DoSize(); + + // blink the caret once + void Blink(); + + // refresh the caret + void Refresh(); + + // draw the caret on the given DC + void DoDraw(wxDC *dc, wxWindow* win); + +private: + // GTK specific initialization + void InitGeneric(); + +#ifdef wxHAS_CARET_USING_OVERLAYS + // the overlay for displaying the caret + wxOverlay m_overlay; +#else + // the bitmap holding the part of window hidden by the caret when it was + // at (m_xOld, m_yOld) + wxBitmap m_bmpUnderCaret; + int m_xOld, + m_yOld; +#endif + + wxCaretTimer m_timer; + bool m_blinkedOut, // true => caret hidden right now + m_hasFocus; // true => our window has focus +}; + +#endif // _WX_CARET_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/choicdgg.h b/wxmsw/include/wx-3.0/wx/generic/choicdgg.h new file mode 100644 index 00000000..2d92b442 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/choicdgg.h @@ -0,0 +1,464 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/choicdgg.h +// Purpose: Generic choice dialogs +// Author: Julian Smart +// Modified by: 03.11.00: VZ to add wxArrayString and multiple sel functions +// Created: 01/02/97 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_CHOICDGG_H_ +#define _WX_GENERIC_CHOICDGG_H_ + +#include "wx/dynarray.h" +#include "wx/dialog.h" + +class WXDLLIMPEXP_FWD_CORE wxListBoxBase; + +// ---------------------------------------------------------------------------- +// some (ugly...) constants +// ---------------------------------------------------------------------------- + +#define wxCHOICE_HEIGHT 150 +#define wxCHOICE_WIDTH 200 + +#ifdef __WXWINCE__ +#define wxCHOICEDLG_STYLE \ + (wxDEFAULT_DIALOG_STYLE | wxOK | wxCANCEL | wxCENTRE) +#else +#define wxCHOICEDLG_STYLE \ + (wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxOK | wxCANCEL | wxCENTRE) +#endif + +// ---------------------------------------------------------------------------- +// wxAnyChoiceDialog: a base class for dialogs containing a listbox +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxAnyChoiceDialog : public wxDialog +{ +public: + wxAnyChoiceDialog() { } + + wxAnyChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, const wxString *choices, + long styleDlg = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition, + long styleLbox = wxLB_ALWAYS_SB) + { + (void)Create(parent, message, caption, n, choices, + styleDlg, pos, styleLbox); + } + wxAnyChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + long styleDlg = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition, + long styleLbox = wxLB_ALWAYS_SB) + { + (void)Create(parent, message, caption, choices, + styleDlg, pos, styleLbox); + } + + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, const wxString *choices, + long styleDlg = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition, + long styleLbox = wxLB_ALWAYS_SB); + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + long styleDlg = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition, + long styleLbox = wxLB_ALWAYS_SB); + +protected: + wxListBoxBase *m_listbox; + + virtual wxListBoxBase *CreateList(int n, + const wxString *choices, + long styleLbox); + + wxDECLARE_NO_COPY_CLASS(wxAnyChoiceDialog); +}; + +// ---------------------------------------------------------------------------- +// wxSingleChoiceDialog: a dialog with single selection listbox +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSingleChoiceDialog : public wxAnyChoiceDialog +{ +public: + wxSingleChoiceDialog() + { + m_selection = -1; + } + + wxSingleChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, + const wxString *choices, + void **clientData = NULL, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition) + { + Create(parent, message, caption, n, choices, clientData, style, pos); + } + + wxSingleChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + void **clientData = NULL, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition) + { + Create(parent, message, caption, choices, clientData, style, pos); + } + + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, + const wxString *choices, + void **clientData = NULL, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition); + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + void **clientData = NULL, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition); + + void SetSelection(int sel); + int GetSelection() const { return m_selection; } + wxString GetStringSelection() const { return m_stringSelection; } + void* GetSelectionData() const { return m_clientData; } + +#if WXWIN_COMPATIBILITY_2_8 + // Deprecated overloads taking "char**" client data. + wxDEPRECATED_CONSTRUCTOR + ( + wxSingleChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, + const wxString *choices, + char **clientData, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition) + ) + { + Create(parent, message, caption, n, choices, + (void**)clientData, style, pos); + } + + wxDEPRECATED_CONSTRUCTOR + ( + wxSingleChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + char **clientData, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition) + ) + { + Create(parent, message, caption, choices, + (void**)clientData, style, pos); + } + + wxDEPRECATED_INLINE + ( + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, + const wxString *choices, + char **clientData, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition), + return Create(parent, message, caption, n, choices, + (void**)clientData, style, pos); + ) + + wxDEPRECATED_INLINE + ( + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + char **clientData, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition), + return Create(parent, message, caption, choices, + (void**)clientData, style, pos); + ) + + // NB: no need to make it return wxChar, it's untyped + wxDEPRECATED_ACCESSOR + ( + char* GetSelectionClientData() const, + (char*)GetSelectionData() + ) +#endif // WXWIN_COMPATIBILITY_2_8 + + // implementation from now on + void OnOK(wxCommandEvent& event); +#ifndef __SMARTPHONE__ + void OnListBoxDClick(wxCommandEvent& event); +#endif +#ifdef __WXWINCE__ + void OnJoystickButtonDown(wxJoystickEvent& event); +#endif + +protected: + int m_selection; + wxString m_stringSelection; + + void DoChoice(); + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxSingleChoiceDialog) + DECLARE_EVENT_TABLE() +}; + +// ---------------------------------------------------------------------------- +// wxMultiChoiceDialog: a dialog with multi selection listbox +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMultiChoiceDialog : public wxAnyChoiceDialog +{ +public: + wxMultiChoiceDialog() { } + + wxMultiChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, + const wxString *choices, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition) + { + (void)Create(parent, message, caption, n, choices, style, pos); + } + wxMultiChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition) + { + (void)Create(parent, message, caption, choices, style, pos); + } + + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, + const wxString *choices, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition); + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition); + + void SetSelections(const wxArrayInt& selections); + wxArrayInt GetSelections() const { return m_selections; } + + // implementation from now on + virtual bool TransferDataFromWindow(); + +protected: +#if wxUSE_CHECKLISTBOX + virtual wxListBoxBase *CreateList(int n, + const wxString *choices, + long styleLbox); +#endif // wxUSE_CHECKLISTBOX + + wxArrayInt m_selections; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxMultiChoiceDialog) +}; + +// ---------------------------------------------------------------------------- +// wrapper functions which can be used to get selection(s) from the user +// ---------------------------------------------------------------------------- + +// get the user selection as a string +WXDLLIMPEXP_CORE wxString wxGetSingleChoice(const wxString& message, + const wxString& caption, + const wxArrayString& choices, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT, + int initialSelection = 0); + +WXDLLIMPEXP_CORE wxString wxGetSingleChoice(const wxString& message, + const wxString& caption, + int n, const wxString *choices, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT, + int initialSelection = 0); + +WXDLLIMPEXP_CORE wxString wxGetSingleChoice(const wxString& message, + const wxString& caption, + const wxArrayString& choices, + int initialSelection, + wxWindow *parent = NULL); + +WXDLLIMPEXP_CORE wxString wxGetSingleChoice(const wxString& message, + const wxString& caption, + int n, const wxString *choices, + int initialSelection, + wxWindow *parent = NULL); + +// Same as above but gets position in list of strings, instead of string, +// or -1 if no selection +WXDLLIMPEXP_CORE int wxGetSingleChoiceIndex(const wxString& message, + const wxString& caption, + const wxArrayString& choices, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT, + int initialSelection = 0); + +WXDLLIMPEXP_CORE int wxGetSingleChoiceIndex(const wxString& message, + const wxString& caption, + int n, const wxString *choices, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT, + int initialSelection = 0); + +WXDLLIMPEXP_CORE int wxGetSingleChoiceIndex(const wxString& message, + const wxString& caption, + const wxArrayString& choices, + int initialSelection, + wxWindow *parent = NULL); + +WXDLLIMPEXP_CORE int wxGetSingleChoiceIndex(const wxString& message, + const wxString& caption, + int n, const wxString *choices, + int initialSelection, + wxWindow *parent = NULL); + +// Return client data instead or NULL if canceled +WXDLLIMPEXP_CORE void* wxGetSingleChoiceData(const wxString& message, + const wxString& caption, + const wxArrayString& choices, + void **client_data, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT, + int initialSelection = 0); + +WXDLLIMPEXP_CORE void* wxGetSingleChoiceData(const wxString& message, + const wxString& caption, + int n, const wxString *choices, + void **client_data, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT, + int initialSelection = 0); + +WXDLLIMPEXP_CORE void* wxGetSingleChoiceData(const wxString& message, + const wxString& caption, + const wxArrayString& choices, + void **client_data, + int initialSelection, + wxWindow *parent = NULL); + + +WXDLLIMPEXP_CORE void* wxGetSingleChoiceData(const wxString& message, + const wxString& caption, + int n, const wxString *choices, + void **client_data, + int initialSelection, + wxWindow *parent = NULL); + +// fill the array with the indices of the chosen items, it will be empty +// if no items were selected or Cancel was pressed - return the number of +// selections or -1 if cancelled +WXDLLIMPEXP_CORE int wxGetSelectedChoices(wxArrayInt& selections, + const wxString& message, + const wxString& caption, + int n, const wxString *choices, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT); + +WXDLLIMPEXP_CORE int wxGetSelectedChoices(wxArrayInt& selections, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT); + +#if WXWIN_COMPATIBILITY_2_8 +// fill the array with the indices of the chosen items, it will be empty +// if no items were selected or Cancel was pressed - return the number of +// selections +wxDEPRECATED( WXDLLIMPEXP_CORE size_t wxGetMultipleChoices(wxArrayInt& selections, + const wxString& message, + const wxString& caption, + int n, const wxString *choices, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT) ); + +wxDEPRECATED( WXDLLIMPEXP_CORE size_t wxGetMultipleChoices(wxArrayInt& selections, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT)); +#endif // WXWIN_COMPATIBILITY_2_8 + +#endif // _WX_GENERIC_CHOICDGG_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/colrdlgg.h b/wxmsw/include/wx-3.0/wx/generic/colrdlgg.h new file mode 100644 index 00000000..a83abd8c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/colrdlgg.h @@ -0,0 +1,116 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/colrdlgg.h +// Purpose: wxGenericColourDialog +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COLORDLGG_H_ +#define _WX_COLORDLGG_H_ + +#include "wx/gdicmn.h" +#include "wx/dialog.h" + +#define wxID_ADD_CUSTOM 3000 + +#if wxUSE_SLIDER + + #define wxID_RED_SLIDER 3001 + #define wxID_GREEN_SLIDER 3002 + #define wxID_BLUE_SLIDER 3003 + + class WXDLLIMPEXP_FWD_CORE wxSlider; + +#endif // wxUSE_SLIDER + +class WXDLLIMPEXP_CORE wxGenericColourDialog : public wxDialog +{ +public: + wxGenericColourDialog(); + wxGenericColourDialog(wxWindow *parent, + wxColourData *data = NULL); + virtual ~wxGenericColourDialog(); + + bool Create(wxWindow *parent, wxColourData *data = NULL); + + wxColourData &GetColourData() { return m_colourData; } + + virtual int ShowModal(); + + // Internal functions + void OnMouseEvent(wxMouseEvent& event); + void OnPaint(wxPaintEvent& event); + + virtual void CalculateMeasurements(); + virtual void CreateWidgets(); + virtual void InitializeColours(); + + virtual void PaintBasicColours(wxDC& dc); + virtual void PaintCustomColours(wxDC& dc); + virtual void PaintCustomColour(wxDC& dc); + virtual void PaintHighlight(wxDC& dc, bool draw); + + virtual void OnBasicColourClick(int which); + virtual void OnCustomColourClick(int which); + + void OnAddCustom(wxCommandEvent& event); + +#if wxUSE_SLIDER + void OnRedSlider(wxCommandEvent& event); + void OnGreenSlider(wxCommandEvent& event); + void OnBlueSlider(wxCommandEvent& event); +#endif // wxUSE_SLIDER + + void OnCloseWindow(wxCloseEvent& event); + +protected: + wxColourData m_colourData; + + // Area reserved for grids of colours + wxRect m_standardColoursRect; + wxRect m_customColoursRect; + wxRect m_singleCustomColourRect; + + // Size of each colour rectangle + wxPoint m_smallRectangleSize; + + // For single customizable colour + wxPoint m_customRectangleSize; + + // Grid spacing (between rectangles) + int m_gridSpacing; + + // Section spacing (between left and right halves of dialog box) + int m_sectionSpacing; + + // 48 'standard' colours + wxColour m_standardColours[48]; + + // 16 'custom' colours + wxColour m_customColours[16]; + + // Which colour is selected? An index into one of the two areas. + int m_colourSelection; + int m_whichKind; // 1 for standard colours, 2 for custom colours, + +#if wxUSE_SLIDER + wxSlider *m_redSlider; + wxSlider *m_greenSlider; + wxSlider *m_blueSlider; +#endif // wxUSE_SLIDER + + int m_buttonY; + + int m_okButtonX; + int m_customButtonX; + + // static bool colourDialogCancelled; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGenericColourDialog) +}; + +#endif // _WX_COLORDLGG_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/combo.h b/wxmsw/include/wx-3.0/wx/generic/combo.h new file mode 100644 index 00000000..f271563a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/combo.h @@ -0,0 +1,172 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/combo.h +// Purpose: Generic wxComboCtrl +// Author: Jaakko Salli +// Modified by: +// Created: Apr-30-2006 +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_COMBOCTRL_H_ +#define _WX_GENERIC_COMBOCTRL_H_ + +#if wxUSE_COMBOCTRL + +// Only define generic if native doesn't have all the features +#if !defined(wxCOMBOCONTROL_FULLY_FEATURED) + +// ---------------------------------------------------------------------------- +// Generic wxComboCtrl +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + +// all actions of single line text controls are supported + +// popup/dismiss the choice window +#define wxACTION_COMBOBOX_POPUP wxT("popup") +#define wxACTION_COMBOBOX_DISMISS wxT("dismiss") + +#endif + +#include "wx/dcbuffer.h" + +extern WXDLLIMPEXP_DATA_CORE(const char) wxComboBoxNameStr[]; + +class WXDLLIMPEXP_CORE wxGenericComboCtrl : public wxComboCtrlBase +{ +public: + // ctors and such + wxGenericComboCtrl() : wxComboCtrlBase() { Init(); } + + wxGenericComboCtrl(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr) + : wxComboCtrlBase() + { + Init(); + + (void)Create(parent, id, value, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + virtual ~wxGenericComboCtrl(); + + void SetCustomPaintWidth( int width ); + + virtual bool IsKeyPopupToggle(const wxKeyEvent& event) const; + + static int GetFeatures() { return wxComboCtrlFeatures::All; } + +#if defined(__WXUNIVERSAL__) + // we have our own input handler and our own actions + virtual bool PerformAction(const wxControlAction& action, + long numArg = 0l, + const wxString& strArg = wxEmptyString); +#endif + +protected: + + // Dummies for platform-specific wxTextEntry implementations +#if defined(__WXUNIVERSAL__) + // Looks like there's nothing we need to override here +#elif defined(__WXMOTIF__) + virtual WXWidget GetTextWidget() const { return NULL; } +#elif defined(__WXGTK__) +#if defined(__WXGTK20__) + virtual GtkEditable *GetEditable() const { return NULL; } + virtual GtkEntry *GetEntry() const { return NULL; } +#endif +#elif defined(__WXMAC__) + // Looks like there's nothing we need to override here +#elif defined(__WXPM__) + virtual WXHWND GetEditHWND() const { return NULL; } +#endif + + // For better transparent background rendering + virtual bool HasTransparentBackground() + { + #if wxALWAYS_NATIVE_DOUBLE_BUFFER + #ifdef __WXGTK__ + // Sanity check for GTK+ + return IsDoubleBuffered(); + #else + return true; + #endif + #else + return false; + #endif + } + + // Mandatory virtuals + virtual void OnResize(); + + // Event handlers + void OnPaintEvent( wxPaintEvent& event ); + void OnMouseEvent( wxMouseEvent& event ); + +private: + void Init(); + + DECLARE_EVENT_TABLE() + + DECLARE_DYNAMIC_CLASS(wxGenericComboCtrl) +}; + + +#ifndef _WX_COMBOCONTROL_H_ + +// If native wxComboCtrl was not defined, then prepare a simple +// front-end so that wxRTTI works as expected. + +class WXDLLIMPEXP_CORE wxComboCtrl : public wxGenericComboCtrl +{ +public: + wxComboCtrl() : wxGenericComboCtrl() {} + + wxComboCtrl(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr) + : wxGenericComboCtrl() + { + (void)Create(parent, id, value, pos, size, style, validator, name); + } + + virtual ~wxComboCtrl() {} + +protected: + +private: + DECLARE_DYNAMIC_CLASS(wxComboCtrl) +}; + +#endif // _WX_COMBOCONTROL_H_ + +#else + +#define wxGenericComboCtrl wxComboCtrl + +#endif // !defined(wxCOMBOCONTROL_FULLY_FEATURED) + +#endif // wxUSE_COMBOCTRL +#endif + // _WX_GENERIC_COMBOCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/custombgwin.h b/wxmsw/include/wx-3.0/wx/generic/custombgwin.h new file mode 100644 index 00000000..80041954 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/custombgwin.h @@ -0,0 +1,95 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/custombgwin.h +// Purpose: Generic implementation of wxCustomBackgroundWindow. +// Author: Vadim Zeitlin +// Created: 2011-10-10 +// Copyright: (c) 2011 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_CUSTOMBGWIN_H_ +#define _WX_GENERIC_CUSTOMBGWIN_H_ + +#include "wx/bitmap.h" + +// A helper to avoid template bloat: this class contains all type-independent +// code of wxCustomBackgroundWindow<> below. +class wxCustomBackgroundWindowGenericBase : public wxCustomBackgroundWindowBase +{ +public: + wxCustomBackgroundWindowGenericBase() { } + +protected: + void DoEraseBackground(wxEraseEvent& event, wxWindow* win) + { + wxDC& dc = *event.GetDC(); + + const wxSize clientSize = win->GetClientSize(); + const wxSize bitmapSize = m_bitmapBg.GetSize(); + + for ( int x = 0; x < clientSize.x; x += bitmapSize.x ) + { + for ( int y = 0; y < clientSize.y; y += bitmapSize.y ) + { + dc.DrawBitmap(m_bitmapBg, x, y); + } + } + } + + + // The bitmap used for painting the background if valid. + wxBitmap m_bitmapBg; + + + wxDECLARE_NO_COPY_CLASS(wxCustomBackgroundWindowGenericBase); +}; + +// ---------------------------------------------------------------------------- +// wxCustomBackgroundWindow +// ---------------------------------------------------------------------------- + +template +class wxCustomBackgroundWindow : public W, + public wxCustomBackgroundWindowGenericBase +{ +public: + typedef W BaseWindowClass; + + wxCustomBackgroundWindow() { } + +protected: + virtual void DoSetBackgroundBitmap(const wxBitmap& bmp) + { + m_bitmapBg = bmp; + + if ( m_bitmapBg.IsOk() ) + { + BaseWindowClass::Connect + ( + wxEVT_ERASE_BACKGROUND, + wxEraseEventHandler(wxCustomBackgroundWindow::OnEraseBackground) + ); + } + else + { + BaseWindowClass::Disconnect + ( + wxEVT_ERASE_BACKGROUND, + wxEraseEventHandler(wxCustomBackgroundWindow::OnEraseBackground) + ); + } + } + +private: + // Event handler for erasing the background which is only used when we have + // a valid background bitmap. + void OnEraseBackground(wxEraseEvent& event) + { + DoEraseBackground(event, this); + } + + + wxDECLARE_NO_COPY_TEMPLATE_CLASS(wxCustomBackgroundWindow, W); +}; + +#endif // _WX_GENERIC_CUSTOMBGWIN_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/dataview.h b/wxmsw/include/wx-3.0/wx/generic/dataview.h new file mode 100644 index 00000000..f3ac8ee5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/dataview.h @@ -0,0 +1,292 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/dataview.h +// Purpose: wxDataViewCtrl generic implementation header +// Author: Robert Roebling +// Modified By: Bo Yang +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __GENERICDATAVIEWCTRLH__ +#define __GENERICDATAVIEWCTRLH__ + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/list.h" +#include "wx/control.h" +#include "wx/scrolwin.h" +#include "wx/icon.h" +#include "wx/vector.h" + +class WXDLLIMPEXP_FWD_ADV wxDataViewMainWindow; +class WXDLLIMPEXP_FWD_ADV wxDataViewHeaderWindow; + +// --------------------------------------------------------- +// wxDataViewColumn +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewColumn : public wxDataViewColumnBase +{ +public: + wxDataViewColumn(const wxString& title, + wxDataViewRenderer *renderer, + unsigned int model_column, + int width = wxDVC_DEFAULT_WIDTH, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE) + : wxDataViewColumnBase(renderer, model_column), + m_title(title) + { + Init(width, align, flags); + } + + wxDataViewColumn(const wxBitmap& bitmap, + wxDataViewRenderer *renderer, + unsigned int model_column, + int width = wxDVC_DEFAULT_WIDTH, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE) + : wxDataViewColumnBase(bitmap, renderer, model_column) + { + Init(width, align, flags); + } + + // implement wxHeaderColumnBase methods + virtual void SetTitle(const wxString& title) { m_title = title; UpdateDisplay(); } + virtual wxString GetTitle() const { return m_title; } + + virtual void SetWidth(int width) { m_width = width; UpdateDisplay(); } + virtual int GetWidth() const; + + virtual void SetMinWidth(int minWidth) { m_minWidth = minWidth; UpdateDisplay(); } + virtual int GetMinWidth() const { return m_minWidth; } + + virtual void SetAlignment(wxAlignment align) { m_align = align; UpdateDisplay(); } + virtual wxAlignment GetAlignment() const { return m_align; } + + virtual void SetFlags(int flags) { m_flags = flags; UpdateDisplay(); } + virtual int GetFlags() const { return m_flags; } + + virtual bool IsSortKey() const { return m_sort; } + + virtual void UnsetAsSortKey(); + + virtual void SetSortOrder(bool ascending); + + virtual bool IsSortOrderAscending() const { return m_sortAscending; } + + virtual void SetBitmap( const wxBitmap& bitmap ) { wxDataViewColumnBase::SetBitmap(bitmap); UpdateDisplay(); } + + +private: + // common part of all ctors + void Init(int width, wxAlignment align, int flags); + + void UpdateDisplay(); + + wxString m_title; + int m_width, + m_minWidth; + wxAlignment m_align; + int m_flags; + bool m_sort, + m_sortAscending; + + friend class wxDataViewHeaderWindowBase; + friend class wxDataViewHeaderWindow; + friend class wxDataViewHeaderWindowMSW; +}; + +// --------------------------------------------------------- +// wxDataViewCtrl +// --------------------------------------------------------- + +WX_DECLARE_LIST_WITH_DECL(wxDataViewColumn, wxDataViewColumnList, + class WXDLLIMPEXP_ADV); + +class WXDLLIMPEXP_ADV wxDataViewCtrl : public wxDataViewCtrlBase, + public wxScrollHelper +{ + friend class wxDataViewMainWindow; + friend class wxDataViewHeaderWindowBase; + friend class wxDataViewHeaderWindow; + friend class wxDataViewHeaderWindowMSW; + friend class wxDataViewColumn; + +public: + wxDataViewCtrl() : wxScrollHelper(this) + { + Init(); + } + + wxDataViewCtrl( wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDataViewCtrlNameStr ) + : wxScrollHelper(this) + { + Create(parent, id, pos, size, style, validator, name); + } + + virtual ~wxDataViewCtrl(); + + void Init(); + + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDataViewCtrlNameStr); + + virtual bool AssociateModel( wxDataViewModel *model ); + + virtual bool AppendColumn( wxDataViewColumn *col ); + virtual bool PrependColumn( wxDataViewColumn *col ); + virtual bool InsertColumn( unsigned int pos, wxDataViewColumn *col ); + + virtual void DoSetExpanderColumn(); + virtual void DoSetIndent(); + + virtual unsigned int GetColumnCount() const; + virtual wxDataViewColumn* GetColumn( unsigned int pos ) const; + virtual bool DeleteColumn( wxDataViewColumn *column ); + virtual bool ClearColumns(); + virtual int GetColumnPosition( const wxDataViewColumn *column ) const; + + virtual wxDataViewColumn *GetSortingColumn() const; + + virtual int GetSelectedItemsCount() const; + virtual int GetSelections( wxDataViewItemArray & sel ) const; + virtual void SetSelections( const wxDataViewItemArray & sel ); + virtual void Select( const wxDataViewItem & item ); + virtual void Unselect( const wxDataViewItem & item ); + virtual bool IsSelected( const wxDataViewItem & item ) const; + + virtual void SelectAll(); + virtual void UnselectAll(); + + virtual void EnsureVisible( const wxDataViewItem & item, + const wxDataViewColumn *column = NULL ); + virtual void HitTest( const wxPoint & point, wxDataViewItem & item, + wxDataViewColumn* &column ) const; + virtual wxRect GetItemRect( const wxDataViewItem & item, + const wxDataViewColumn *column = NULL ) const; + + virtual bool SetRowHeight( int rowHeight ); + + virtual void Expand( const wxDataViewItem & item ); + virtual void Collapse( const wxDataViewItem & item ); + virtual bool IsExpanded( const wxDataViewItem & item ) const; + + virtual void SetFocus(); + + virtual bool SetFont(const wxFont & font); + +#if wxUSE_DRAG_AND_DROP + virtual bool EnableDragSource( const wxDataFormat &format ); + virtual bool EnableDropTarget( const wxDataFormat &format ); +#endif // wxUSE_DRAG_AND_DROP + + virtual wxBorder GetDefaultBorder() const; + + virtual void EditItem(const wxDataViewItem& item, const wxDataViewColumn *column); + + // These methods are specific to generic wxDataViewCtrl implementation and + // should not be used in portable code. + wxColour GetAlternateRowColour() const { return m_alternateRowColour; } + void SetAlternateRowColour(const wxColour& colour); + +protected: + virtual void EnsureVisible( int row, int column ); + + // Notice that row here may be invalid (i.e. >= GetRowCount()), this is not + // an error and this function simply returns an invalid item in this case. + virtual wxDataViewItem GetItemByRow( unsigned int row ) const; + virtual int GetRowByItem( const wxDataViewItem & item ) const; + + int GetSortingColumnIndex() const { return m_sortingColumnIdx; } + void SetSortingColumnIndex(int idx) { m_sortingColumnIdx = idx; } + +public: // utility functions not part of the API + + // returns the "best" width for the idx-th column + unsigned int GetBestColumnWidth(int idx) const; + + // called by header window after reorder + void ColumnMoved( wxDataViewColumn* col, unsigned int new_pos ); + + // update the display after a change to an individual column + void OnColumnChange(unsigned int idx); + + // update after a change to the number of columns + void OnColumnsCountChanged(); + + wxWindow *GetMainWindow() { return (wxWindow*) m_clientArea; } + + // return the index of the given column in m_cols + int GetColumnIndex(const wxDataViewColumn *column) const; + + // Return the index of the column having the given model index. + int GetModelColumnIndex(unsigned int model_column) const; + + // return the column displayed at the given position in the control + wxDataViewColumn *GetColumnAt(unsigned int pos) const; + + virtual wxDataViewColumn *GetCurrentColumn() const; + + virtual void OnInternalIdle(); + +private: + virtual wxDataViewItem DoGetCurrentItem() const; + virtual void DoSetCurrentItem(const wxDataViewItem& item); + + void InvalidateColBestWidths(); + void InvalidateColBestWidth(int idx); + void UpdateColWidths(); + + wxDataViewColumnList m_cols; + // cached column best widths information, values are for + // respective columns from m_cols and the arrays have same size + struct CachedColWidthInfo + { + CachedColWidthInfo() : width(0), dirty(true) {} + int width; // cached width or 0 if not computed + bool dirty; // column was invalidated, header needs updating + }; + wxVector m_colsBestWidths; + // This indicates that at least one entry in m_colsBestWidths has 'dirty' + // flag set. It's cheaper to check one flag in OnInternalIdle() than to + // iterate over m_colsBestWidths to check if anything needs to be done. + bool m_colsDirty; + + wxDataViewModelNotifier *m_notifier; + wxDataViewMainWindow *m_clientArea; + wxDataViewHeaderWindow *m_headerArea; + + // user defined color to draw row lines, may be invalid + wxColour m_alternateRowColour; + + // the index of the column currently used for sorting or -1 + int m_sortingColumnIdx; + +private: + void OnSize( wxSizeEvent &event ); + virtual wxSize GetSizeAvailableForScrollTarget(const wxSize& size); + + // we need to return a special WM_GETDLGCODE value to process just the + // arrows but let the other navigation characters through +#ifdef __WXMSW__ + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); +#endif // __WXMSW__ + + WX_FORWARD_TO_SCROLL_HELPER() + +private: + DECLARE_DYNAMIC_CLASS(wxDataViewCtrl) + wxDECLARE_NO_COPY_CLASS(wxDataViewCtrl); + DECLARE_EVENT_TABLE() +}; + + +#endif // __GENERICDATAVIEWCTRLH__ diff --git a/wxmsw/include/wx-3.0/wx/generic/datectrl.h b/wxmsw/include/wx-3.0/wx/generic/datectrl.h new file mode 100644 index 00000000..47e65663 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/datectrl.h @@ -0,0 +1,96 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/datectrl.h +// Purpose: generic wxDatePickerCtrl implementation +// Author: Andreas Pflug +// Modified by: +// Created: 2005-01-19 +// Copyright: (c) 2005 Andreas Pflug +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_DATECTRL_H_ +#define _WX_GENERIC_DATECTRL_H_ + +#include "wx/compositewin.h" + +class WXDLLIMPEXP_FWD_CORE wxComboCtrl; + +class WXDLLIMPEXP_FWD_ADV wxCalendarCtrl; +class WXDLLIMPEXP_FWD_ADV wxCalendarComboPopup; + +class WXDLLIMPEXP_ADV wxDatePickerCtrlGeneric + : public wxCompositeWindow +{ +public: + // creating the control + wxDatePickerCtrlGeneric() { Init(); } + virtual ~wxDatePickerCtrlGeneric(); + wxDatePickerCtrlGeneric(wxWindow *parent, + wxWindowID id, + const wxDateTime& date = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDP_DEFAULT | wxDP_SHOWCENTURY, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDatePickerCtrlNameStr) + { + Init(); + + (void)Create(parent, id, date, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxDateTime& date = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDP_DEFAULT | wxDP_SHOWCENTURY, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDatePickerCtrlNameStr); + + // wxDatePickerCtrl methods + void SetValue(const wxDateTime& date); + wxDateTime GetValue() const; + + bool GetRange(wxDateTime *dt1, wxDateTime *dt2) const; + void SetRange(const wxDateTime &dt1, const wxDateTime &dt2); + + bool SetDateRange(const wxDateTime& lowerdate = wxDefaultDateTime, + const wxDateTime& upperdate = wxDefaultDateTime); + + // extra methods available only in this (generic) implementation + wxCalendarCtrl *GetCalendar() const; + + + // implementation only from now on + // ------------------------------- + + // overridden base class methods + virtual bool Destroy(); + +protected: + virtual wxSize DoGetBestSize() const; + +private: + void Init(); + + // return the list of the windows composing this one + virtual wxWindowList GetCompositeWindowParts() const; + + void OnText(wxCommandEvent &event); + void OnSize(wxSizeEvent& event); + void OnFocus(wxFocusEvent& event); + +#ifdef __WXOSX_COCOA__ + virtual void OSXGenerateEvent(const wxDateTime& WXUNUSED(dt)) { } +#endif + + wxComboCtrl* m_combo; + wxCalendarComboPopup* m_popup; + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxDatePickerCtrlGeneric); +}; + +#endif // _WX_GENERIC_DATECTRL_H_ + diff --git a/wxmsw/include/wx-3.0/wx/generic/dcpsg.h b/wxmsw/include/wx-3.0/wx/generic/dcpsg.h new file mode 100644 index 00000000..ea423475 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/dcpsg.h @@ -0,0 +1,159 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/dcpsg.h +// Purpose: wxPostScriptDC class +// Author: Julian Smart and others +// Modified by: +// Copyright: (c) Julian Smart and Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCPSG_H_ +#define _WX_DCPSG_H_ + +#include "wx/defs.h" + +#if wxUSE_PRINTING_ARCHITECTURE && wxUSE_POSTSCRIPT + +#include "wx/dc.h" +#include "wx/dcprint.h" +#include "wx/dialog.h" +#include "wx/module.h" +#include "wx/cmndata.h" +#include "wx/strvararg.h" + +//----------------------------------------------------------------------------- +// wxPostScriptDC +//----------------------------------------------------------------------------- + + +class WXDLLIMPEXP_CORE wxPostScriptDC : public wxDC +{ +public: + wxPostScriptDC(); + + // Recommended constructor + wxPostScriptDC(const wxPrintData& printData); + +private: + DECLARE_DYNAMIC_CLASS(wxPostScriptDC) +}; + +class WXDLLIMPEXP_CORE wxPostScriptDCImpl : public wxDCImpl +{ +public: + wxPostScriptDCImpl( wxPrinterDC *owner ); + wxPostScriptDCImpl( wxPrinterDC *owner, const wxPrintData& data ); + wxPostScriptDCImpl( wxPostScriptDC *owner ); + wxPostScriptDCImpl( wxPostScriptDC *owner, const wxPrintData& data ); + + void Init(); + + virtual ~wxPostScriptDCImpl(); + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const; + + bool CanDrawBitmap() const { return true; } + + void Clear(); + void SetFont( const wxFont& font ); + void SetPen( const wxPen& pen ); + void SetBrush( const wxBrush& brush ); + void SetLogicalFunction( wxRasterOperationMode function ); + void SetBackground( const wxBrush& brush ); + + void DestroyClippingRegion(); + + bool StartDoc(const wxString& message); + void EndDoc(); + void StartPage(); + void EndPage(); + + wxCoord GetCharHeight() const; + wxCoord GetCharWidth() const; + bool CanGetTextExtent() const { return true; } + + // Resolution in pixels per logical inch + wxSize GetPPI() const; + + virtual void ComputeScaleAndOrigin(); + + void SetBackgroundMode(int WXUNUSED(mode)) { } + void SetPalette(const wxPalette& WXUNUSED(palette)) { } + + void SetPrintData(const wxPrintData& data); + wxPrintData& GetPrintData() { return m_printData; } + + virtual int GetDepth() const { return 24; } + + void PsPrint( const wxString& psdata ); + + // Overrridden for wxPrinterDC Impl + + virtual int GetResolution() const; + virtual wxRect GetPaperRect() const; + + virtual void* GetHandle() const { return NULL; } + +protected: + bool DoFloodFill(wxCoord x1, wxCoord y1, const wxColour &col, + wxFloodFillStyle style = wxFLOOD_SURFACE); + bool DoGetPixel(wxCoord x1, wxCoord y1, wxColour *col) const; + void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2); + void DoCrossHair(wxCoord x, wxCoord y) ; + void DoDrawArc(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2,wxCoord xc,wxCoord yc); + void DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea); + void DoDrawPoint(wxCoord x, wxCoord y); + void DoDrawLines(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0); + void DoDrawPolygon(int n, const wxPoint points[], + wxCoord xoffset = 0, wxCoord yoffset = 0, + wxPolygonFillMode fillStyle = wxODDEVEN_RULE); + void DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], + wxCoord xoffset = 0, wxCoord yoffset = 0, + wxPolygonFillMode fillStyle = wxODDEVEN_RULE); + void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height); + void DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius = 20); + void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height); +#if wxUSE_SPLINES + void DoDrawSpline(const wxPointList *points); +#endif + bool DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, + wxDC *source, wxCoord xsrc, wxCoord ysrc, + wxRasterOperationMode rop = wxCOPY, bool useMask = false, + wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord); + void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y); + void DoDrawBitmap(const wxBitmap& bitmap, wxCoord x, wxCoord y, bool useMask = false); + void DoDrawText(const wxString& text, wxCoord x, wxCoord y); + void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle); + void DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height); + void DoSetDeviceClippingRegion( const wxRegion &WXUNUSED(clip)) + { + wxFAIL_MSG( "not implemented" ); + } + void DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + const wxFont *theFont = NULL) const; + void DoGetSize(int* width, int* height) const; + void DoGetSizeMM(int *width, int *height) const; + + FILE* m_pstream; // PostScript output stream + unsigned char m_currentRed; + unsigned char m_currentGreen; + unsigned char m_currentBlue; + int m_pageNumber; + bool m_clipping; + double m_underlinePosition; + double m_underlineThickness; + wxPrintData m_printData; + double m_pageHeight; + +private: + DECLARE_DYNAMIC_CLASS(wxPostScriptDCImpl) +}; + +#endif + // wxUSE_POSTSCRIPT && wxUSE_PRINTING_ARCHITECTURE + +#endif + // _WX_DCPSG_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/dirctrlg.h b/wxmsw/include/wx-3.0/wx/generic/dirctrlg.h new file mode 100644 index 00000000..bdaa3df3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/dirctrlg.h @@ -0,0 +1,318 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/dirctrlg.h +// Purpose: wxGenericDirCtrl class +// Builds on wxDirCtrl class written by Robert Roebling for the +// wxFile application, modified by Harm van der Heijden. +// Further modified for Windows. +// Author: Robert Roebling, Harm van der Heijden, Julian Smart et al +// Modified by: +// Created: 21/3/2000 +// Copyright: (c) Robert Roebling, Harm van der Heijden, Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DIRCTRL_H_ +#define _WX_DIRCTRL_H_ + +#if wxUSE_DIRDLG + +#include "wx/treectrl.h" +#include "wx/dialog.h" +#include "wx/dirdlg.h" +#include "wx/choice.h" + +//----------------------------------------------------------------------------- +// classes +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_BASE wxHashTable; + +//----------------------------------------------------------------------------- +// Extra styles for wxGenericDirCtrl +//----------------------------------------------------------------------------- + +enum +{ + // Only allow directory viewing/selection, no files + wxDIRCTRL_DIR_ONLY = 0x0010, + // When setting the default path, select the first file in the directory + wxDIRCTRL_SELECT_FIRST = 0x0020, + // Show the filter list + wxDIRCTRL_SHOW_FILTERS = 0x0040, + // Use 3D borders on internal controls + wxDIRCTRL_3D_INTERNAL = 0x0080, + // Editable labels + wxDIRCTRL_EDIT_LABELS = 0x0100, + // Allow multiple selection + wxDIRCTRL_MULTIPLE = 0x0200 +}; + +//----------------------------------------------------------------------------- +// wxDirItemData +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDirItemData : public wxTreeItemData +{ +public: + wxDirItemData(const wxString& path, const wxString& name, bool isDir); + virtual ~wxDirItemData(){} + void SetNewDirName(const wxString& path); + + bool HasSubDirs() const; + bool HasFiles(const wxString& spec = wxEmptyString) const; + + wxString m_path, m_name; + bool m_isHidden; + bool m_isExpanded; + bool m_isDir; +}; + +//----------------------------------------------------------------------------- +// wxDirCtrl +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxDirFilterListCtrl; + +class WXDLLIMPEXP_CORE wxGenericDirCtrl: public wxControl +{ +public: + wxGenericDirCtrl(); + wxGenericDirCtrl(wxWindow *parent, const wxWindowID id = wxID_ANY, + const wxString &dir = wxDirDialogDefaultFolderStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDIRCTRL_3D_INTERNAL, + const wxString& filter = wxEmptyString, + int defaultFilter = 0, + const wxString& name = wxTreeCtrlNameStr ) + { + Init(); + Create(parent, id, dir, pos, size, style, filter, defaultFilter, name); + } + + bool Create(wxWindow *parent, const wxWindowID id = wxID_ANY, + const wxString &dir = wxDirDialogDefaultFolderStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDIRCTRL_3D_INTERNAL, + const wxString& filter = wxEmptyString, + int defaultFilter = 0, + const wxString& name = wxTreeCtrlNameStr ); + + virtual void Init(); + + virtual ~wxGenericDirCtrl(); + + void OnExpandItem(wxTreeEvent &event ); + void OnCollapseItem(wxTreeEvent &event ); + void OnBeginEditItem(wxTreeEvent &event ); + void OnEndEditItem(wxTreeEvent &event ); + void OnTreeSelChange(wxTreeEvent &event); + void OnItemActivated(wxTreeEvent &event); + void OnSize(wxSizeEvent &event ); + + // Try to expand as much of the given path as possible. + virtual bool ExpandPath(const wxString& path); + // collapse the path + virtual bool CollapsePath(const wxString& path); + + // Accessors + + virtual inline wxString GetDefaultPath() const { return m_defaultPath; } + virtual void SetDefaultPath(const wxString& path) { m_defaultPath = path; } + + // Get dir or filename + virtual wxString GetPath() const; + virtual void GetPaths(wxArrayString& paths) const; + + // Get selected filename path only (else empty string). + // I.e. don't count a directory as a selection + virtual wxString GetFilePath() const; + virtual void GetFilePaths(wxArrayString& paths) const; + virtual void SetPath(const wxString& path); + + virtual void SelectPath(const wxString& path, bool select = true); + virtual void SelectPaths(const wxArrayString& paths); + + virtual void ShowHidden( bool show ); + virtual bool GetShowHidden() { return m_showHidden; } + + virtual wxString GetFilter() const { return m_filter; } + virtual void SetFilter(const wxString& filter); + + virtual int GetFilterIndex() const { return m_currentFilter; } + virtual void SetFilterIndex(int n); + + virtual wxTreeItemId GetRootId() { return m_rootId; } + + virtual wxTreeCtrl* GetTreeCtrl() const { return m_treeCtrl; } + virtual wxDirFilterListCtrl* GetFilterListCtrl() const { return m_filterListCtrl; } + + virtual void UnselectAll(); + + // Helper + virtual void SetupSections(); + + // Find the child that matches the first part of 'path'. + // E.g. if a child path is "/usr" and 'path' is "/usr/include" + // then the child for /usr is returned. + // If the path string has been used (we're at the leaf), done is set to true + virtual wxTreeItemId FindChild(wxTreeItemId parentId, const wxString& path, bool& done); + + wxString GetPath(wxTreeItemId itemId) const; + + // Resize the components of the control + virtual void DoResize(); + + // Collapse & expand the tree, thus re-creating it from scratch: + virtual void ReCreateTree(); + + // Collapse the entire tree + virtual void CollapseTree(); + + // overridden base class methods + virtual void SetFocus(); + +protected: + virtual void ExpandRoot(); + virtual void ExpandDir(wxTreeItemId parentId); + virtual void CollapseDir(wxTreeItemId parentId); + virtual const wxTreeItemId AddSection(const wxString& path, const wxString& name, int imageId = 0); + virtual wxTreeItemId AppendItem (const wxTreeItemId & parent, + const wxString & text, + int image = -1, int selectedImage = -1, + wxTreeItemData * data = NULL); + //void FindChildFiles(wxTreeItemId id, int dirFlags, wxArrayString& filenames); + virtual wxTreeCtrl* CreateTreeCtrl(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long treeStyle); + + // Extract description and actual filter from overall filter string + bool ExtractWildcard(const wxString& filterStr, int n, wxString& filter, wxString& description); + +private: + void PopulateNode(wxTreeItemId node); + wxDirItemData* GetItemData(wxTreeItemId itemId); + + bool m_showHidden; + wxTreeItemId m_rootId; + wxString m_defaultPath; // Starting path + long m_styleEx; // Extended style + wxString m_filter; // Wildcards in same format as per wxFileDialog + int m_currentFilter; // The current filter index + wxString m_currentFilterStr; // Current filter string + wxTreeCtrl* m_treeCtrl; + wxDirFilterListCtrl* m_filterListCtrl; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGenericDirCtrl) + wxDECLARE_NO_COPY_CLASS(wxGenericDirCtrl); +}; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_DIRCTRL_SELECTIONCHANGED, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_DIRCTRL_FILEACTIVATED, wxTreeEvent ); + +#define wx__DECLARE_DIRCTRL_EVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_DIRCTRL_ ## evt, id, wxTreeEventHandler(fn)) + +#define EVT_DIRCTRL_SELECTIONCHANGED(id, fn) wx__DECLARE_DIRCTRL_EVT(SELECTIONCHANGED, id, fn) +#define EVT_DIRCTRL_FILEACTIVATED(id, fn) wx__DECLARE_DIRCTRL_EVT(FILEACTIVATED, id, fn) + +//----------------------------------------------------------------------------- +// wxDirFilterListCtrl +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDirFilterListCtrl: public wxChoice +{ +public: + wxDirFilterListCtrl() { Init(); } + wxDirFilterListCtrl(wxGenericDirCtrl* parent, const wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0) + { + Init(); + Create(parent, id, pos, size, style); + } + + bool Create(wxGenericDirCtrl* parent, const wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0); + + void Init(); + + virtual ~wxDirFilterListCtrl() {} + + //// Operations + void FillFilterList(const wxString& filter, int defaultFilter); + + //// Events + void OnSelFilter(wxCommandEvent& event); + +protected: + wxGenericDirCtrl* m_dirCtrl; + + DECLARE_EVENT_TABLE() + DECLARE_CLASS(wxDirFilterListCtrl) + wxDECLARE_NO_COPY_CLASS(wxDirFilterListCtrl); +}; + +#if !defined(__WXMSW__) && !defined(__WXMAC__) && !defined(__WXPM__) + #define wxDirCtrl wxGenericDirCtrl +#endif + +// Symbols for accessing individual controls +#define wxID_TREECTRL 7000 +#define wxID_FILTERLISTCTRL 7001 + +#endif // wxUSE_DIRDLG + +//------------------------------------------------------------------------- +// wxFileIconsTable - use wxTheFileIconsTable which is created as necessary +//------------------------------------------------------------------------- + +#if wxUSE_DIRDLG || wxUSE_FILEDLG || wxUSE_FILECTRL + +class WXDLLIMPEXP_FWD_CORE wxImageList; + +class WXDLLIMPEXP_CORE wxFileIconsTable +{ +public: + wxFileIconsTable(); + ~wxFileIconsTable(); + + enum iconId_Type + { + folder, + folder_open, + computer, + drive, + cdrom, + floppy, + removeable, + file, + executable + }; + + int GetIconID(const wxString& extension, const wxString& mime = wxEmptyString); + wxImageList *GetSmallImageList(); + +protected: + void Create(); // create on first use + + wxImageList *m_smallImageList; + wxHashTable *m_HashTable; +}; + +// The global fileicons table +extern WXDLLIMPEXP_DATA_CORE(wxFileIconsTable *) wxTheFileIconsTable; + +#endif // wxUSE_DIRDLG || wxUSE_FILEDLG || wxUSE_FILECTRL + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_DIRCTRL_SELECTIONCHANGED wxEVT_DIRCTRL_SELECTIONCHANGED +#define wxEVT_COMMAND_DIRCTRL_FILEACTIVATED wxEVT_DIRCTRL_FILEACTIVATED + +#endif + // _WX_DIRCTRLG_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/dragimgg.h b/wxmsw/include/wx-3.0/wx/generic/dragimgg.h new file mode 100644 index 00000000..9c90e163 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/dragimgg.h @@ -0,0 +1,271 @@ +////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/dragimgg.h +// Purpose: wxDragImage class: a kind of a cursor, that can cope +// with more sophisticated images +// Author: Julian Smart +// Modified by: +// Created: 29/2/2000 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DRAGIMGG_H_ +#define _WX_DRAGIMGG_H_ + +#include "wx/bitmap.h" +#include "wx/icon.h" +#include "wx/cursor.h" +#include "wx/treectrl.h" +#include "wx/listctrl.h" +#include "wx/log.h" +#include "wx/overlay.h" + +/* + To use this class, create a wxDragImage when you start dragging, for example: + + void MyTreeCtrl::OnBeginDrag(wxTreeEvent& event) + { +#ifdef __WXMSW__ + ::UpdateWindow((HWND) GetHWND()); // We need to implement this in wxWidgets +#endif + + CaptureMouse(); + + m_dragImage = new wxDragImage(* this, itemId); + m_dragImage->BeginDrag(wxPoint(0, 0), this); + m_dragImage->Move(pt, this); + m_dragImage->Show(this); + ... + } + + In your OnMouseMove function, hide the image, do any display updating required, + then move and show the image again: + + void MyTreeCtrl::OnMouseMove(wxMouseEvent& event) + { + if (m_dragMode == MY_TREE_DRAG_NONE) + { + event.Skip(); + return; + } + + // Prevent screen corruption by hiding the image + if (m_dragImage) + m_dragImage->Hide(this); + + // Do some updating of the window, such as highlighting the drop target + ... + +#ifdef __WXMSW__ + if (updateWindow) + ::UpdateWindow((HWND) GetHWND()); +#endif + + // Move and show the image again + m_dragImage->Move(event.GetPosition(), this); + m_dragImage->Show(this); + } + + Eventually we end the drag and delete the drag image. + + void MyTreeCtrl::OnLeftUp(wxMouseEvent& event) + { + ... + + // End the drag and delete the drag image + if (m_dragImage) + { + m_dragImage->EndDrag(this); + delete m_dragImage; + m_dragImage = NULL; + } + ReleaseMouse(); + } +*/ + +/* + * wxGenericDragImage + */ + +class WXDLLIMPEXP_CORE wxGenericDragImage: public wxObject +{ +public: + + // Ctors & dtor + //////////////////////////////////////////////////////////////////////////// + + wxGenericDragImage(const wxCursor& cursor = wxNullCursor) + { + Init(); + Create(cursor); + } + + wxGenericDragImage(const wxBitmap& image, const wxCursor& cursor = wxNullCursor) + { + Init(); + + Create(image, cursor); + } + + wxGenericDragImage(const wxIcon& image, const wxCursor& cursor = wxNullCursor) + { + Init(); + + Create(image, cursor); + } + + wxGenericDragImage(const wxString& str, const wxCursor& cursor = wxNullCursor) + { + Init(); + + Create(str, cursor); + } + +#if WXWIN_COMPATIBILITY_2_6 + // don't use in new code, use versions without hot spot parameter + wxDEPRECATED( wxGenericDragImage(const wxCursor& cursor, const wxPoint& cursorHotspot) ); + wxDEPRECATED( wxGenericDragImage(const wxBitmap& image, const wxCursor& cursor, const wxPoint& cursorHotspot) ); + wxDEPRECATED( wxGenericDragImage(const wxIcon& image, const wxCursor& cursor, const wxPoint& cursorHotspot) ); + wxDEPRECATED( wxGenericDragImage(const wxString& str, const wxCursor& cursor, const wxPoint& cursorHotspot) ); + wxDEPRECATED( bool Create(const wxCursor& cursor, const wxPoint& cursorHotspot) ); + wxDEPRECATED( bool Create(const wxBitmap& image, const wxCursor& cursor, const wxPoint& cursorHotspot) ); + wxDEPRECATED( bool Create(const wxIcon& image, const wxCursor& cursor, const wxPoint& cursorHotspot) ); + wxDEPRECATED( bool Create(const wxString& str, const wxCursor& cursor, const wxPoint& cursorHotspot) ); +#endif // WXWIN_COMPATIBILITY_2_6 + +#if wxUSE_TREECTRL + wxGenericDragImage(const wxTreeCtrl& treeCtrl, wxTreeItemId& id) + { + Init(); + + Create(treeCtrl, id); + } +#endif + +#if wxUSE_LISTCTRL + wxGenericDragImage(const wxListCtrl& listCtrl, long id) + { + Init(); + + Create(listCtrl, id); + } +#endif + + virtual ~wxGenericDragImage(); + + // Attributes + //////////////////////////////////////////////////////////////////////////// + +#ifdef wxHAS_NATIVE_OVERLAY + // backing store is not used when native overlays are + void SetBackingBitmap(wxBitmap* WXUNUSED(bitmap)) { } +#else + // For efficiency, tell wxGenericDragImage to use a bitmap that's already + // created (e.g. from last drag) + void SetBackingBitmap(wxBitmap* bitmap) { m_pBackingBitmap = bitmap; } +#endif // wxHAS_NATIVE_OVERLAY/!wxHAS_NATIVE_OVERLAY + + // Operations + //////////////////////////////////////////////////////////////////////////// + + // Create a drag image with a virtual image (need to override DoDrawImage, GetImageRect) + bool Create(const wxCursor& cursor = wxNullCursor); + + // Create a drag image from a bitmap and optional cursor + bool Create(const wxBitmap& image, const wxCursor& cursor = wxNullCursor); + + // Create a drag image from an icon and optional cursor + bool Create(const wxIcon& image, const wxCursor& cursor = wxNullCursor); + + // Create a drag image from a string and optional cursor + bool Create(const wxString& str, const wxCursor& cursor = wxNullCursor); + +#if wxUSE_TREECTRL + // Create a drag image for the given tree control item + bool Create(const wxTreeCtrl& treeCtrl, wxTreeItemId& id); +#endif + +#if wxUSE_LISTCTRL + // Create a drag image for the given list control item + bool Create(const wxListCtrl& listCtrl, long id); +#endif + + // Begin drag. hotspot is the location of the drag position relative to the upper-left + // corner of the image. + bool BeginDrag(const wxPoint& hotspot, wxWindow* window, bool fullScreen = false, wxRect* rect = NULL); + + // Begin drag. hotspot is the location of the drag position relative to the upper-left + // corner of the image. This is full screen only. fullScreenRect gives the + // position of the window on the screen, to restrict the drag to. + bool BeginDrag(const wxPoint& hotspot, wxWindow* window, wxWindow* fullScreenRect); + + // End drag + bool EndDrag(); + + // Move the image: call from OnMouseMove. Pt is in window client coordinates if window + // is non-NULL, or in screen coordinates if NULL. + bool Move(const wxPoint& pt); + + // Show the image + bool Show(); + + // Hide the image + bool Hide(); + + // Implementation + //////////////////////////////////////////////////////////////////////////// + + void Init(); + + // Override this if you are using a virtual image (drawing your own image) + virtual wxRect GetImageRect(const wxPoint& pos) const; + + // Override this if you are using a virtual image (drawing your own image) + virtual bool DoDrawImage(wxDC& dc, const wxPoint& pos) const; + + // Override this if you wish to draw the window contents to the backing bitmap + // yourself. This can be desirable if you wish to avoid flicker by not having to + // redraw the window itself before dragging in order to be graphic-minus-dragged-objects. + // Instead, paint the drag image's backing bitmap to be correct, and leave the window + // to be updated only when dragging the objects away (thus giving a smoother appearance). + virtual bool UpdateBackingFromWindow(wxDC& windowDC, wxMemoryDC& destDC, + const wxRect& sourceRect, const wxRect& destRect) const; + + // Erase and redraw simultaneously if possible + virtual bool RedrawImage(const wxPoint& oldPos, const wxPoint& newPos, bool eraseOld, bool drawNew); + +protected: + wxBitmap m_bitmap; + wxIcon m_icon; + wxCursor m_cursor; + wxCursor m_oldCursor; +// wxPoint m_hotspot; + wxPoint m_offset; // The hostpot value passed to BeginDrag + wxPoint m_position; + bool m_isDirty; + bool m_isShown; + wxWindow* m_window; + wxDC* m_windowDC; + +#ifdef wxHAS_NATIVE_OVERLAY + wxOverlay m_overlay; + wxDCOverlay* m_dcOverlay; +#else + // Stores the window contents while we're dragging the image around + wxBitmap m_backingBitmap; + wxBitmap* m_pBackingBitmap; // Pointer to existing backing bitmap + // (pass to wxGenericDragImage as an efficiency measure) + // A temporary bitmap for repairing/redrawing + wxBitmap m_repairBitmap; +#endif // !wxHAS_NATIVE_OVERLAY + + wxRect m_boundingRect; + bool m_fullScreen; + +private: + DECLARE_DYNAMIC_CLASS(wxGenericDragImage) + wxDECLARE_NO_COPY_CLASS(wxGenericDragImage); +}; + +#endif + // _WX_DRAGIMGG_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/dvrenderer.h b/wxmsw/include/wx-3.0/wx/generic/dvrenderer.h new file mode 100644 index 00000000..75889a81 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/dvrenderer.h @@ -0,0 +1,67 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/dvrenderer.h +// Purpose: wxDataViewRenderer for generic wxDataViewCtrl implementation +// Author: Robert Roebling, Vadim Zeitlin +// Created: 2009-11-07 (extracted from wx/generic/dataview.h) +// Copyright: (c) 2006 Robert Roebling +// (c) 2009 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_DVRENDERER_H_ +#define _WX_GENERIC_DVRENDERER_H_ + +// ---------------------------------------------------------------------------- +// wxDataViewRenderer +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewRenderer: public wxDataViewCustomRendererBase +{ +public: + wxDataViewRenderer( const wxString &varianttype, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int align = wxDVR_DEFAULT_ALIGNMENT ); + virtual ~wxDataViewRenderer(); + + virtual wxDC *GetDC(); + + virtual void SetAlignment( int align ); + virtual int GetAlignment() const; + + virtual void EnableEllipsize(wxEllipsizeMode mode = wxELLIPSIZE_MIDDLE) + { m_ellipsizeMode = mode; } + virtual wxEllipsizeMode GetEllipsizeMode() const + { return m_ellipsizeMode; } + + virtual void SetMode( wxDataViewCellMode mode ) + { m_mode = mode; } + virtual wxDataViewCellMode GetMode() const + { return m_mode; } + + // implementation + + // This callback is used by generic implementation of wxDVC itself. It's + // different from the corresponding ActivateCell() method which should only + // be overridable for the custom renderers while the generic implementation + // uses this one for all of them, including the standard ones. + + virtual bool WXActivateCell(const wxRect& WXUNUSED(cell), + wxDataViewModel *WXUNUSED(model), + const wxDataViewItem & WXUNUSED(item), + unsigned int WXUNUSED(col), + const wxMouseEvent* WXUNUSED(mouseEvent)) + { return false; } + +private: + int m_align; + wxDataViewCellMode m_mode; + + wxEllipsizeMode m_ellipsizeMode; + + wxDC *m_dc; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRenderer) +}; + +#endif // _WX_GENERIC_DVRENDERER_H_ + diff --git a/wxmsw/include/wx-3.0/wx/generic/dvrenderers.h b/wxmsw/include/wx-3.0/wx/generic/dvrenderers.h new file mode 100644 index 00000000..6f80c773 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/dvrenderers.h @@ -0,0 +1,183 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/dvrenderers.h +// Purpose: All generic wxDataViewCtrl renderer classes +// Author: Robert Roebling, Vadim Zeitlin +// Created: 2009-11-07 (extracted from wx/generic/dataview.h) +// Copyright: (c) 2006 Robert Roebling +// (c) 2009 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_DVRENDERERS_H_ +#define _WX_GENERIC_DVRENDERERS_H_ + +// --------------------------------------------------------- +// wxDataViewCustomRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewCustomRenderer: public wxDataViewRenderer +{ +public: + wxDataViewCustomRenderer( const wxString &varianttype = wxT("string"), + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int align = wxDVR_DEFAULT_ALIGNMENT ); + + + // see the explanation of the following WXOnXXX() methods in wx/generic/dvrenderer.h + + virtual bool WXActivateCell(const wxRect& cell, + wxDataViewModel *model, + const wxDataViewItem& item, + unsigned int col, + const wxMouseEvent *mouseEvent) + { + return ActivateCell(cell, model, item, col, mouseEvent); + } + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCustomRenderer) +}; + + +// --------------------------------------------------------- +// wxDataViewTextRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewTextRenderer: public wxDataViewRenderer +{ +public: + wxDataViewTextRenderer( const wxString &varianttype = wxT("string"), + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int align = wxDVR_DEFAULT_ALIGNMENT ); + + bool SetValue( const wxVariant &value ); + bool GetValue( wxVariant &value ) const; + + virtual bool Render(wxRect cell, wxDC *dc, int state); + virtual wxSize GetSize() const; + + // in-place editing + virtual bool HasEditorCtrl() const; + virtual wxWindow* CreateEditorCtrl( wxWindow *parent, wxRect labelRect, + const wxVariant &value ); + virtual bool GetValueFromEditorCtrl( wxWindow* editor, wxVariant &value ); + +protected: + wxString m_text; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewBitmapRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewBitmapRenderer: public wxDataViewRenderer +{ +public: + wxDataViewBitmapRenderer( const wxString &varianttype = wxT("wxBitmap"), + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int align = wxDVR_DEFAULT_ALIGNMENT ); + + bool SetValue( const wxVariant &value ); + bool GetValue( wxVariant &value ) const; + + bool Render( wxRect cell, wxDC *dc, int state ); + wxSize GetSize() const; + +private: + wxIcon m_icon; + wxBitmap m_bitmap; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewBitmapRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewToggleRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewToggleRenderer: public wxDataViewRenderer +{ +public: + wxDataViewToggleRenderer( const wxString &varianttype = wxT("bool"), + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int align = wxDVR_DEFAULT_ALIGNMENT ); + + bool SetValue( const wxVariant &value ); + bool GetValue( wxVariant &value ) const; + + bool Render( wxRect cell, wxDC *dc, int state ); + wxSize GetSize() const; + + // Implementation only, don't use nor override + virtual bool WXActivateCell(const wxRect& cell, + wxDataViewModel *model, + const wxDataViewItem& item, + unsigned int col, + const wxMouseEvent *mouseEvent); +private: + bool m_toggle; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewToggleRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewProgressRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewProgressRenderer: public wxDataViewRenderer +{ +public: + wxDataViewProgressRenderer( const wxString &label = wxEmptyString, + const wxString &varianttype = wxT("long"), + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int align = wxDVR_DEFAULT_ALIGNMENT ); + + bool SetValue( const wxVariant &value ); + bool GetValue( wxVariant& value ) const; + + virtual bool Render(wxRect cell, wxDC *dc, int state); + virtual wxSize GetSize() const; + +private: + wxString m_label; + int m_value; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewProgressRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewIconTextRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewIconTextRenderer: public wxDataViewRenderer +{ +public: + wxDataViewIconTextRenderer( const wxString &varianttype = wxT("wxDataViewIconText"), + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int align = wxDVR_DEFAULT_ALIGNMENT ); + + bool SetValue( const wxVariant &value ); + bool GetValue( wxVariant &value ) const; + + virtual bool Render(wxRect cell, wxDC *dc, int state); + virtual wxSize GetSize() const; + + virtual bool HasEditorCtrl() const { return true; } + virtual wxWindow* CreateEditorCtrl( wxWindow *parent, wxRect labelRect, + const wxVariant &value ); + virtual bool GetValueFromEditorCtrl( wxWindow* editor, wxVariant &value ); + +private: + wxDataViewIconText m_value; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewIconTextRenderer) +}; + +#endif // _WX_GENERIC_DVRENDERERS_H_ + diff --git a/wxmsw/include/wx-3.0/wx/generic/fdrepdlg.h b/wxmsw/include/wx-3.0/wx/generic/fdrepdlg.h new file mode 100644 index 00000000..d1ad8d1b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/fdrepdlg.h @@ -0,0 +1,70 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/fdrepdlg.h +// Purpose: wxGenericFindReplaceDialog class +// Author: Markus Greither +// Modified by: +// Created: 25/05/2001 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_FDREPDLG_H_ +#define _WX_GENERIC_FDREPDLG_H_ + +class WXDLLIMPEXP_FWD_CORE wxCheckBox; +class WXDLLIMPEXP_FWD_CORE wxRadioBox; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; + +// ---------------------------------------------------------------------------- +// wxGenericFindReplaceDialog: dialog for searching / replacing text +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGenericFindReplaceDialog : public wxFindReplaceDialogBase +{ +public: + wxGenericFindReplaceDialog() { Init(); } + + wxGenericFindReplaceDialog(wxWindow *parent, + wxFindReplaceData *data, + const wxString& title, + int style = 0) + { + Init(); + + (void)Create(parent, data, title, style); + } + + bool Create(wxWindow *parent, + wxFindReplaceData *data, + const wxString& title, + int style = 0); + +protected: + void Init(); + + void SendEvent(const wxEventType& evtType); + + void OnFind(wxCommandEvent& event); + void OnReplace(wxCommandEvent& event); + void OnReplaceAll(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event); + + void OnUpdateFindUI(wxUpdateUIEvent& event); + + void OnCloseWindow(wxCloseEvent& event); + + wxCheckBox *m_chkCase, + *m_chkWord; + + wxRadioBox *m_radioDir; + + wxTextCtrl *m_textFind, + *m_textRepl; + +private: + DECLARE_DYNAMIC_CLASS(wxGenericFindReplaceDialog) + + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_GENERIC_FDREPDLG_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/filectrlg.h b/wxmsw/include/wx-3.0/wx/generic/filectrlg.h new file mode 100644 index 00000000..ba26118d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/filectrlg.h @@ -0,0 +1,303 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/filectrlg.h +// Purpose: wxGenericFileCtrl Header +// Author: Diaa M. Sami +// Modified by: +// Created: Jul-07-2007 +// Copyright: (c) Diaa M. Sami +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_FILECTRL_H_ +#define _WX_GENERIC_FILECTRL_H_ + +#if wxUSE_FILECTRL + +#include "wx/containr.h" +#include "wx/listctrl.h" +#include "wx/filectrl.h" +#include "wx/filename.h" + +class WXDLLIMPEXP_FWD_CORE wxCheckBox; +class WXDLLIMPEXP_FWD_CORE wxChoice; +class WXDLLIMPEXP_FWD_CORE wxStaticText; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; + +extern WXDLLIMPEXP_DATA_CORE(const char) wxFileSelectorDefaultWildcardStr[]; + +//----------------------------------------------------------------------------- +// wxFileData - a class to hold the file info for the wxFileListCtrl +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFileData +{ +public: + enum fileType + { + is_file = 0x0000, + is_dir = 0x0001, + is_link = 0x0002, + is_exe = 0x0004, + is_drive = 0x0008 + }; + + wxFileData() { Init(); } + // Full copy constructor + wxFileData( const wxFileData& fileData ) { Copy(fileData); } + // Create a filedata from this information + wxFileData( const wxString &filePath, const wxString &fileName, + fileType type, int image_id ); + + // make a full copy of the other wxFileData + void Copy( const wxFileData &other ); + + // (re)read the extra data about the file from the system + void ReadData(); + + // get the name of the file, dir, drive + wxString GetFileName() const { return m_fileName; } + // get the full path + name of the file, dir, path + wxString GetFilePath() const { return m_filePath; } + // Set the path + name and name of the item + void SetNewName( const wxString &filePath, const wxString &fileName ); + + // Get the size of the file in bytes + wxFileOffset GetSize() const { return m_size; } + // Get the type of file, either file extension or , , + wxString GetFileType() const; + // get the last modification time + wxDateTime GetDateTime() const { return m_dateTime; } + // Get the time as a formatted string + wxString GetModificationTime() const; + // in UNIX get rwx for file, in MSW get attributes ARHS + wxString GetPermissions() const { return m_permissions; } + // Get the id of the image used in a wxImageList + int GetImageId() const { return m_image; } + + bool IsFile() const { return !IsDir() && !IsLink() && !IsDrive(); } + bool IsDir() const { return (m_type & is_dir ) != 0; } + bool IsLink() const { return (m_type & is_link ) != 0; } + bool IsExe() const { return (m_type & is_exe ) != 0; } + bool IsDrive() const { return (m_type & is_drive) != 0; } + + // Get/Set the type of file, file/dir/drive/link + int GetType() const { return m_type; } + + // the wxFileListCtrl fields in report view + enum fileListFieldType + { + FileList_Name, + FileList_Size, + FileList_Type, + FileList_Time, +#if defined(__UNIX__) || defined(__WIN32__) + FileList_Perm, +#endif // defined(__UNIX__) || defined(__WIN32__) + FileList_Max + }; + + // Get the entry for report view of wxFileListCtrl + wxString GetEntry( fileListFieldType num ) const; + + // Get a string representation of the file info + wxString GetHint() const; + // initialize a wxListItem attributes + void MakeItem( wxListItem &item ); + + // operators + wxFileData& operator = (const wxFileData& fd) { Copy(fd); return *this; } + +protected: + wxString m_fileName; + wxString m_filePath; + wxFileOffset m_size; + wxDateTime m_dateTime; + wxString m_permissions; + int m_type; + int m_image; + +private: + void Init(); +}; + +//----------------------------------------------------------------------------- +// wxFileListCtrl +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFileListCtrl : public wxListCtrl +{ +public: + wxFileListCtrl(); + wxFileListCtrl( wxWindow *win, + wxWindowID id, + const wxString &wild, + bool showHidden, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLC_LIST, + const wxValidator &validator = wxDefaultValidator, + const wxString &name = wxT("filelist") ); + virtual ~wxFileListCtrl(); + + virtual void ChangeToListMode(); + virtual void ChangeToReportMode(); + virtual void ChangeToSmallIconMode(); + virtual void ShowHidden( bool show = true ); + bool GetShowHidden() const { return m_showHidden; } + + virtual long Add( wxFileData *fd, wxListItem &item ); + virtual void UpdateItem(const wxListItem &item); + virtual void UpdateFiles(); + virtual void MakeDir(); + virtual void GoToParentDir(); + virtual void GoToHomeDir(); + virtual void GoToDir( const wxString &dir ); + virtual void SetWild( const wxString &wild ); + wxString GetWild() const { return m_wild; } + wxString GetDir() const { return m_dirName; } + + void OnListDeleteItem( wxListEvent &event ); + void OnListDeleteAllItems( wxListEvent &event ); + void OnListEndLabelEdit( wxListEvent &event ); + void OnListColClick( wxListEvent &event ); + + virtual void SortItems(wxFileData::fileListFieldType field, bool forward); + bool GetSortDirection() const { return m_sort_forward; } + wxFileData::fileListFieldType GetSortField() const { return m_sort_field; } + +protected: + void FreeItemData(wxListItem& item); + void FreeAllItemsData(); + + wxString m_dirName; + bool m_showHidden; + wxString m_wild; + + bool m_sort_forward; + wxFileData::fileListFieldType m_sort_field; + +private: + DECLARE_DYNAMIC_CLASS(wxFileListCtrl) + DECLARE_EVENT_TABLE() +}; + +class WXDLLIMPEXP_CORE wxGenericFileCtrl : public wxNavigationEnabled, + public wxFileCtrlBase +{ +public: + wxGenericFileCtrl() + { + m_ignoreChanges = false; + } + + wxGenericFileCtrl ( wxWindow *parent, + wxWindowID id, + const wxString& defaultDirectory = wxEmptyString, + const wxString& defaultFilename = wxEmptyString, + const wxString& wildCard = wxFileSelectorDefaultWildcardStr, + long style = wxFC_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxString& name = wxFileCtrlNameStr ) + { + m_ignoreChanges = false; + Create(parent, id, defaultDirectory, defaultFilename, wildCard, + style, pos, size, name ); + } + + virtual ~wxGenericFileCtrl() {} + + bool Create( wxWindow *parent, + wxWindowID id, + const wxString& defaultDirectory = wxEmptyString, + const wxString& defaultFileName = wxEmptyString, + const wxString& wildCard = wxFileSelectorDefaultWildcardStr, + long style = wxFC_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxString& name = wxFileCtrlNameStr ); + + virtual void SetWildcard( const wxString& wildCard ); + virtual void SetFilterIndex( int filterindex ); + virtual bool SetDirectory( const wxString& dir ); + + // Selects a certain file. + // In case the filename specified isn't found/couldn't be shown with + // currently selected filter, false is returned and nothing happens + virtual bool SetFilename( const wxString& name ); + + // Changes to a certain directory and selects a certain file. + // In case the filename specified isn't found/couldn't be shown with + // currently selected filter, false is returned and if directory exists + // it's chdir'ed to + virtual bool SetPath( const wxString& path ); + + virtual wxString GetFilename() const; + virtual wxString GetDirectory() const; + virtual wxString GetWildcard() const { return this->m_wildCard; } + virtual wxString GetPath() const; + virtual void GetPaths( wxArrayString& paths ) const; + virtual void GetFilenames( wxArrayString& files ) const; + virtual int GetFilterIndex() const { return m_filterIndex; } + + virtual bool HasMultipleFileSelection() const + { return HasFlag(wxFC_MULTIPLE); } + virtual void ShowHidden(bool show) { m_list->ShowHidden( show ); } + + void GoToParentDir(); + void GoToHomeDir(); + + // get the directory currently shown in the control: this can be different + // from GetDirectory() if the user entered a full path (with a path other + // than the one currently shown in the control) in the text control + // manually + wxString GetShownDirectory() const { return m_list->GetDir(); } + + wxFileListCtrl *GetFileList() { return m_list; } + + void ChangeToReportMode() { m_list->ChangeToReportMode(); } + void ChangeToListMode() { m_list->ChangeToListMode(); } + + +private: + void OnChoiceFilter( wxCommandEvent &event ); + void OnCheck( wxCommandEvent &event ); + void OnActivated( wxListEvent &event ); + void OnTextEnter( wxCommandEvent &WXUNUSED( event ) ); + void OnTextChange( wxCommandEvent &WXUNUSED( event ) ); + void OnSelected( wxListEvent &event ); + void HandleAction( const wxString &fn ); + + void DoSetFilterIndex( int filterindex ); + void UpdateControls(); + + // the first of these methods can only be used for the controls with single + // selection (i.e. without wxFC_MULTIPLE style), the second one in any case + wxFileName DoGetFileName() const; + void DoGetFilenames( wxArrayString& filenames, bool fullPath ) const; + + int m_style; + + wxString m_filterExtension; + wxChoice *m_choice; + wxTextCtrl *m_text; + wxFileListCtrl *m_list; + wxCheckBox *m_check; + wxStaticText *m_static; + + wxString m_dir; + wxString m_fileName; + wxString m_wildCard; // wild card in one string as we got it + + int m_filterIndex; + bool m_inSelected; + bool m_ignoreChanges; + bool m_noSelChgEvent; // suppress selection changed events. + + DECLARE_DYNAMIC_CLASS( wxGenericFileCtrl ) + DECLARE_EVENT_TABLE() +}; + +#endif // wxUSE_FILECTRL + +#endif // _WX_GENERIC_FILECTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/filepickerg.h b/wxmsw/include/wx-3.0/wx/generic/filepickerg.h new file mode 100644 index 00000000..d88daa55 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/filepickerg.h @@ -0,0 +1,221 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/filepickerg.h +// Purpose: wxGenericFileDirButton, wxGenericFileButton, wxGenericDirButton +// Author: Francesco Montorsi +// Modified by: +// Created: 14/4/2006 +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FILEDIRPICKER_H_ +#define _WX_FILEDIRPICKER_H_ + +#include "wx/button.h" +#include "wx/filedlg.h" +#include "wx/dirdlg.h" + + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_DIRPICKER_CHANGED, wxFileDirPickerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FILEPICKER_CHANGED, wxFileDirPickerEvent ); + + +//----------------------------------------------------------------------------- +// wxGenericFileDirButton: a button which brings up a wx{File|Dir}Dialog +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGenericFileDirButton : public wxButton, + public wxFileDirPickerWidgetBase +{ +public: + wxGenericFileDirButton() { Init(); } + wxGenericFileDirButton(wxWindow *parent, + wxWindowID id, + const wxString& label = wxFilePickerWidgetLabel, + const wxString& path = wxEmptyString, + const wxString &message = wxFileSelectorPromptStr, + const wxString &wildcard = wxFileSelectorDefaultWildcardStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFilePickerWidgetNameStr) + { + Init(); + Create(parent, id, label, path, message, wildcard, + pos, size, style, validator, name); + } + + virtual wxControl *AsControl() { return this; } + +public: // overridable + + virtual wxDialog *CreateDialog() = 0; + + virtual wxWindow *GetDialogParent() + { return GetParent(); } + + virtual wxEventType GetEventType() const = 0; + + virtual void SetInitialDirectory(const wxString& dir); + +public: + + bool Create(wxWindow *parent, wxWindowID id, + const wxString& label = wxFilePickerWidgetLabel, + const wxString& path = wxEmptyString, + const wxString &message = wxFileSelectorPromptStr, + const wxString &wildcard = wxFileSelectorDefaultWildcardStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFilePickerWidgetNameStr); + + // event handler for the click + void OnButtonClick(wxCommandEvent &); + +protected: + wxString m_message, m_wildcard; + + // we just store the style passed to the ctor here instead of passing it to + // wxButton as some of our bits can conflict with wxButton styles and it + // just doesn't make sense to use picker styles for wxButton anyhow + long m_pickerStyle; + + // Initial directory set by SetInitialDirectory() call or empty. + wxString m_initialDir; + +private: + // common part of all ctors + void Init() { m_pickerStyle = -1; } +}; + + +//----------------------------------------------------------------------------- +// wxGenericFileButton: a button which brings up a wxFileDialog +//----------------------------------------------------------------------------- + +#define wxFILEBTN_DEFAULT_STYLE (wxFLP_OPEN) + +class WXDLLIMPEXP_CORE wxGenericFileButton : public wxGenericFileDirButton +{ +public: + wxGenericFileButton() {} + wxGenericFileButton(wxWindow *parent, + wxWindowID id, + const wxString& label = wxFilePickerWidgetLabel, + const wxString& path = wxEmptyString, + const wxString &message = wxFileSelectorPromptStr, + const wxString &wildcard = wxFileSelectorDefaultWildcardStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxFILEBTN_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFilePickerWidgetNameStr) + { + Create(parent, id, label, path, message, wildcard, + pos, size, style, validator, name); + } + +public: // overridable + + virtual long GetDialogStyle() const + { + // the derived class must initialize it if it doesn't use the + // non-default wxGenericFileDirButton ctor + wxASSERT_MSG( m_pickerStyle != -1, + "forgot to initialize m_pickerStyle?" ); + + + long filedlgstyle = 0; + + if ( m_pickerStyle & wxFLP_OPEN ) + filedlgstyle |= wxFD_OPEN; + if ( m_pickerStyle & wxFLP_SAVE ) + filedlgstyle |= wxFD_SAVE; + if ( m_pickerStyle & wxFLP_OVERWRITE_PROMPT ) + filedlgstyle |= wxFD_OVERWRITE_PROMPT; + if ( m_pickerStyle & wxFLP_FILE_MUST_EXIST ) + filedlgstyle |= wxFD_FILE_MUST_EXIST; + if ( m_pickerStyle & wxFLP_CHANGE_DIR ) + filedlgstyle |= wxFD_CHANGE_DIR; + + return filedlgstyle; + } + + virtual wxDialog *CreateDialog(); + + wxEventType GetEventType() const + { return wxEVT_FILEPICKER_CHANGED; } + +protected: + void UpdateDialogPath(wxDialog *p) + { wxStaticCast(p, wxFileDialog)->SetPath(m_path); } + void UpdatePathFromDialog(wxDialog *p) + { m_path = wxStaticCast(p, wxFileDialog)->GetPath(); } + +private: + DECLARE_DYNAMIC_CLASS(wxGenericFileButton) +}; + + +//----------------------------------------------------------------------------- +// wxGenericDirButton: a button which brings up a wxDirDialog +//----------------------------------------------------------------------------- + +#define wxDIRBTN_DEFAULT_STYLE 0 + +class WXDLLIMPEXP_CORE wxGenericDirButton : public wxGenericFileDirButton +{ +public: + wxGenericDirButton() {} + wxGenericDirButton(wxWindow *parent, + wxWindowID id, + const wxString& label = wxDirPickerWidgetLabel, + const wxString& path = wxEmptyString, + const wxString &message = wxDirSelectorPromptStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDIRBTN_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDirPickerWidgetNameStr) + { + Create(parent, id, label, path, message, wxEmptyString, + pos, size, style, validator, name); + } + +public: // overridable + + virtual long GetDialogStyle() const + { + long dirdlgstyle = wxDD_DEFAULT_STYLE; + + if ( m_pickerStyle & wxDIRP_DIR_MUST_EXIST ) + dirdlgstyle |= wxDD_DIR_MUST_EXIST; + if ( m_pickerStyle & wxDIRP_CHANGE_DIR ) + dirdlgstyle |= wxDD_CHANGE_DIR; + + return dirdlgstyle; + } + + virtual wxDialog *CreateDialog(); + + wxEventType GetEventType() const + { return wxEVT_DIRPICKER_CHANGED; } + +protected: + void UpdateDialogPath(wxDialog *p) + { wxStaticCast(p, wxDirDialog)->SetPath(m_path); } + void UpdatePathFromDialog(wxDialog *p) + { m_path = wxStaticCast(p, wxDirDialog)->GetPath(); } + +private: + DECLARE_DYNAMIC_CLASS(wxGenericDirButton) +}; + +// old wxEVT_COMMAND_* constants +//#define wxEVT_COMMAND_DIRPICKER_CHANGED wxEVT_DIRPICKER_CHANGED +//#define wxEVT_COMMAND_FILEPICKER_CHANGED wxEVT_FILEPICKER_CHANGED + +#endif // _WX_FILEDIRPICKER_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/fontdlgg.h b/wxmsw/include/wx-3.0/wx/generic/fontdlgg.h new file mode 100644 index 00000000..a16fa6e2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/fontdlgg.h @@ -0,0 +1,109 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/fontdlgg.h +// Purpose: wxGenericFontDialog +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_FONTDLGG_H +#define _WX_GENERIC_FONTDLGG_H + +#include "wx/gdicmn.h" +#include "wx/font.h" + +#ifdef __WXWINCE__ +#define USE_SPINCTRL_FOR_POINT_SIZE 1 +class WXDLLIMPEXP_FWD_CORE wxSpinEvent; +#else +#define USE_SPINCTRL_FOR_POINT_SIZE 0 +#endif + +/* + * FONT DIALOG + */ + +class WXDLLIMPEXP_FWD_CORE wxChoice; +class WXDLLIMPEXP_FWD_CORE wxText; +class WXDLLIMPEXP_FWD_CORE wxCheckBox; +class WXDLLIMPEXP_FWD_CORE wxFontPreviewer; + +enum +{ + wxID_FONT_UNDERLINE = 3000, + wxID_FONT_STYLE, + wxID_FONT_WEIGHT, + wxID_FONT_FAMILY, + wxID_FONT_COLOUR, + wxID_FONT_SIZE +}; + +class WXDLLIMPEXP_CORE wxGenericFontDialog : public wxFontDialogBase +{ +public: + wxGenericFontDialog() { Init(); } + wxGenericFontDialog(wxWindow *parent) + : wxFontDialogBase(parent) { Init(); } + wxGenericFontDialog(wxWindow *parent, const wxFontData& data) + : wxFontDialogBase(parent, data) { Init(); } + virtual ~wxGenericFontDialog(); + + virtual int ShowModal(); + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, for backwards compatibility only + wxDEPRECATED( wxGenericFontDialog(wxWindow *parent, const wxFontData *data) ); +#endif // WXWIN_COMPATIBILITY_2_6 + + // Internal functions + void OnCloseWindow(wxCloseEvent& event); + + virtual void CreateWidgets(); + virtual void InitializeFont(); + + void OnChangeFont(wxCommandEvent& event); + +#if USE_SPINCTRL_FOR_POINT_SIZE + void OnChangeSize(wxSpinEvent& event); +#endif + +protected: + + virtual bool DoCreate(wxWindow *parent); + +private: + + // common part of all ctors + void Init(); + + void DoChangeFont(); + + wxFont m_dialogFont; + + wxChoice *m_familyChoice; + wxChoice *m_styleChoice; + wxChoice *m_weightChoice; + wxChoice *m_colourChoice; + wxCheckBox *m_underLineCheckBox; + +#if !USE_SPINCTRL_FOR_POINT_SIZE + wxChoice *m_pointSizeChoice; +#endif + + wxFontPreviewer *m_previewer; + bool m_useEvents; + + // static bool fontDialogCancelled; + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGenericFontDialog) +}; + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, for backwards compatibility only +inline wxGenericFontDialog::wxGenericFontDialog(wxWindow *parent, const wxFontData *data) + :wxFontDialogBase(parent) { Init(); InitFontData(data); Create(parent); } +#endif // WXWIN_COMPATIBILITY_2_6 + +#endif // _WX_GENERIC_FONTDLGG_H diff --git a/wxmsw/include/wx-3.0/wx/generic/fswatcher.h b/wxmsw/include/wx-3.0/wx/generic/fswatcher.h new file mode 100644 index 00000000..efd7631b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/fswatcher.h @@ -0,0 +1,25 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/fswatcher.h +// Purpose: wxPollingFileSystemWatcher +// Author: Bartosz Bekier +// Created: 2009-05-26 +// Copyright: (c) 2009 Bartosz Bekier +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FSWATCHER_GENERIC_H_ +#define _WX_FSWATCHER_GENERIC_H_ + +#include "wx/defs.h" + +#if wxUSE_FSWATCHER + +class WXDLLIMPEXP_BASE wxPollingFileSystemWatcher : public wxFileSystemWatcherBase +{ +public: + +}; + +#endif // wxUSE_FSWATCHER + +#endif /* _WX_FSWATCHER_GENERIC_H_ */ diff --git a/wxmsw/include/wx-3.0/wx/generic/grid.h b/wxmsw/include/wx-3.0/wx/generic/grid.h new file mode 100644 index 00000000..c58cec37 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/grid.h @@ -0,0 +1,2723 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/grid.h +// Purpose: wxGrid and related classes +// Author: Michael Bedward (based on code by Julian Smart, Robin Dunn) +// Modified by: Santiago Palacios +// Created: 1/08/1999 +// Copyright: (c) Michael Bedward +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_GRID_H_ +#define _WX_GENERIC_GRID_H_ + +#include "wx/defs.h" + +#if wxUSE_GRID + +#include "wx/hashmap.h" + +#include "wx/scrolwin.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +extern WXDLLIMPEXP_DATA_ADV(const char) wxGridNameStr[]; + +// Default parameters for wxGrid +// +#define WXGRID_DEFAULT_NUMBER_ROWS 10 +#define WXGRID_DEFAULT_NUMBER_COLS 10 +#if defined(__WXMSW__) || defined(__WXGTK20__) +#define WXGRID_DEFAULT_ROW_HEIGHT 25 +#else +#define WXGRID_DEFAULT_ROW_HEIGHT 30 +#endif // __WXMSW__ +#define WXGRID_DEFAULT_COL_WIDTH 80 +#define WXGRID_DEFAULT_COL_LABEL_HEIGHT 32 +#define WXGRID_DEFAULT_ROW_LABEL_WIDTH 82 +#define WXGRID_LABEL_EDGE_ZONE 2 +#define WXGRID_MIN_ROW_HEIGHT 15 +#define WXGRID_MIN_COL_WIDTH 15 +#define WXGRID_DEFAULT_SCROLLBAR_WIDTH 16 + +// type names for grid table values +#define wxGRID_VALUE_STRING wxT("string") +#define wxGRID_VALUE_BOOL wxT("bool") +#define wxGRID_VALUE_NUMBER wxT("long") +#define wxGRID_VALUE_FLOAT wxT("double") +#define wxGRID_VALUE_CHOICE wxT("choice") + +#define wxGRID_VALUE_TEXT wxGRID_VALUE_STRING +#define wxGRID_VALUE_LONG wxGRID_VALUE_NUMBER + +// magic constant which tells (to some functions) to automatically calculate +// the appropriate size +#define wxGRID_AUTOSIZE (-1) + +// many wxGrid methods work either with columns or rows, this enum is used for +// the parameter indicating which one should it be +enum wxGridDirection +{ + wxGRID_COLUMN, + wxGRID_ROW +}; + +// Flags used with wxGrid::Render() to select parts of the grid to draw. +enum wxGridRenderStyle +{ + wxGRID_DRAW_ROWS_HEADER = 0x001, + wxGRID_DRAW_COLS_HEADER = 0x002, + wxGRID_DRAW_CELL_LINES = 0x004, + wxGRID_DRAW_BOX_RECT = 0x008, + wxGRID_DRAW_SELECTION = 0x010, + wxGRID_DRAW_DEFAULT = wxGRID_DRAW_ROWS_HEADER | + wxGRID_DRAW_COLS_HEADER | + wxGRID_DRAW_CELL_LINES | + wxGRID_DRAW_BOX_RECT +}; + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_ADV wxGrid; +class WXDLLIMPEXP_FWD_ADV wxGridCellAttr; +class WXDLLIMPEXP_FWD_ADV wxGridCellAttrProviderData; +class WXDLLIMPEXP_FWD_ADV wxGridColLabelWindow; +class WXDLLIMPEXP_FWD_ADV wxGridCornerLabelWindow; +class WXDLLIMPEXP_FWD_ADV wxGridRowLabelWindow; +class WXDLLIMPEXP_FWD_ADV wxGridWindow; +class WXDLLIMPEXP_FWD_ADV wxGridTypeRegistry; +class WXDLLIMPEXP_FWD_ADV wxGridSelection; + +class WXDLLIMPEXP_FWD_CORE wxHeaderCtrl; +class WXDLLIMPEXP_FWD_CORE wxCheckBox; +class WXDLLIMPEXP_FWD_CORE wxComboBox; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +#if wxUSE_SPINCTRL +class WXDLLIMPEXP_FWD_CORE wxSpinCtrl; +#endif + +class wxGridFixedIndicesSet; + +class wxGridOperations; +class wxGridRowOperations; +class wxGridColumnOperations; +class wxGridDirectionOperations; + + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +#define wxSafeIncRef(p) if ( p ) (p)->IncRef() +#define wxSafeDecRef(p) if ( p ) (p)->DecRef() + +// ---------------------------------------------------------------------------- +// wxGridCellWorker: common base class for wxGridCellRenderer and +// wxGridCellEditor +// +// NB: this is more an implementation convenience than a design issue, so this +// class is not documented and is not public at all +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGridCellWorker : public wxClientDataContainer, public wxRefCounter +{ +public: + wxGridCellWorker() { } + + // interpret renderer parameters: arbitrary string whose interpretation is + // left to the derived classes + virtual void SetParameters(const wxString& params); + +protected: + // virtual dtor for any base class - private because only DecRef() can + // delete us + virtual ~wxGridCellWorker(); + +private: + // suppress the stupid gcc warning about the class having private dtor and + // no friends + friend class wxGridCellWorkerDummyFriend; +}; + +// ---------------------------------------------------------------------------- +// wxGridCellRenderer: this class is responsible for actually drawing the cell +// in the grid. You may pass it to the wxGridCellAttr (below) to change the +// format of one given cell or to wxGrid::SetDefaultRenderer() to change the +// view of all cells. This is an ABC, you will normally use one of the +// predefined derived classes or derive your own class from it. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGridCellRenderer : public wxGridCellWorker +{ +public: + // draw the given cell on the provided DC inside the given rectangle + // using the style specified by the attribute and the default or selected + // state corresponding to the isSelected value. + // + // this pure virtual function has a default implementation which will + // prepare the DC using the given attribute: it will draw the rectangle + // with the bg colour from attr and set the text colour and font + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected) = 0; + + // get the preferred size of the cell for its contents + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col) = 0; + + // create a new object which is the copy of this one + virtual wxGridCellRenderer *Clone() const = 0; +}; + +// ---------------------------------------------------------------------------- +// wxGridCellEditor: This class is responsible for providing and manipulating +// the in-place edit controls for the grid. Instances of wxGridCellEditor +// (actually, instances of derived classes since it is an ABC) can be +// associated with the cell attributes for individual cells, rows, columns, or +// even for the entire grid. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGridCellEditor : public wxGridCellWorker +{ +public: + wxGridCellEditor(); + + bool IsCreated() const { return m_control != NULL; } + wxControl* GetControl() const { return m_control; } + void SetControl(wxControl* control) { m_control = control; } + + wxGridCellAttr* GetCellAttr() const { return m_attr; } + void SetCellAttr(wxGridCellAttr* attr) { m_attr = attr; } + + // Creates the actual edit control + virtual void Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler) = 0; + + // Size and position the edit control + virtual void SetSize(const wxRect& rect); + + // Show or hide the edit control, use the specified attributes to set + // colours/fonts for it + virtual void Show(bool show, wxGridCellAttr *attr = NULL); + + // Draws the part of the cell not occupied by the control: the base class + // version just fills it with background colour from the attribute + virtual void PaintBackground(wxDC& dc, + const wxRect& rectCell, + const wxGridCellAttr& attr); + + + // The methods called by wxGrid when a cell is edited: first BeginEdit() is + // called, then EndEdit() is and if it returns true and if the change is + // not vetoed by a user-defined event handler, finally ApplyEdit() is called + + // Fetch the value from the table and prepare the edit control + // to begin editing. Set the focus to the edit control. + virtual void BeginEdit(int row, int col, wxGrid* grid) = 0; + + // Returns false if nothing changed, otherwise returns true and return the + // new value in its string form in the newval output parameter. + // + // This should also store the new value in its real type internally so that + // it could be used by ApplyEdit() but it must not modify the grid as the + // change could still be vetoed. + virtual bool EndEdit(int row, int col, const wxGrid *grid, + const wxString& oldval, wxString *newval) = 0; + + // Complete the editing of the current cell by storing the value saved by + // the previous call to EndEdit() in the grid + virtual void ApplyEdit(int row, int col, wxGrid* grid) = 0; + + + // Reset the value in the control back to its starting value + virtual void Reset() = 0; + + // return true to allow the given key to start editing: the base class + // version only checks that the event has no modifiers. The derived + // classes are supposed to do "if ( base::IsAcceptedKey() && ... )" in + // their IsAcceptedKey() implementation, although, of course, it is not a + // mandatory requirment. + // + // NB: if the key is F2 (special), editing will always start and this + // method will not be called at all (but StartingKey() will) + virtual bool IsAcceptedKey(wxKeyEvent& event); + + // If the editor is enabled by pressing keys on the grid, this will be + // called to let the editor do something about that first key if desired + virtual void StartingKey(wxKeyEvent& event); + + // if the editor is enabled by clicking on the cell, this method will be + // called + virtual void StartingClick(); + + // Some types of controls on some platforms may need some help + // with the Return key. + virtual void HandleReturn(wxKeyEvent& event); + + // Final cleanup + virtual void Destroy(); + + // create a new object which is the copy of this one + virtual wxGridCellEditor *Clone() const = 0; + + // added GetValue so we can get the value which is in the control + virtual wxString GetValue() const = 0; + +protected: + // the dtor is private because only DecRef() can delete us + virtual ~wxGridCellEditor(); + + // the control we show on screen + wxControl* m_control; + + // a temporary pointer to the attribute being edited + wxGridCellAttr* m_attr; + + // if we change the colours/font of the control from the default ones, we + // must restore the default later and we save them here between calls to + // Show(true) and Show(false) + wxColour m_colFgOld, + m_colBgOld; + wxFont m_fontOld; + + // suppress the stupid gcc warning about the class having private dtor and + // no friends + friend class wxGridCellEditorDummyFriend; + + wxDECLARE_NO_COPY_CLASS(wxGridCellEditor); +}; + +// ---------------------------------------------------------------------------- +// wxGridHeaderRenderer and company: like wxGridCellRenderer but for headers +// ---------------------------------------------------------------------------- + +// Base class for corner window renderer: it is the simplest of all renderers +// and only has a single function +class WXDLLIMPEXP_ADV wxGridCornerHeaderRenderer +{ +public: + // Draw the border around the corner window. + virtual void DrawBorder(const wxGrid& grid, + wxDC& dc, + wxRect& rect) const = 0; + + // make the dtor of a class with virtual functions virtual to avoid g++ + // warnings, even though this class is not supposed to be used + // polymorphically + virtual ~wxGridCornerHeaderRenderer() { } +}; + + +// Base class for the row/column header cells renderers +class WXDLLIMPEXP_ADV wxGridHeaderLabelsRenderer + : public wxGridCornerHeaderRenderer +{ +public: + // Draw header cell label + virtual void DrawLabel(const wxGrid& grid, + wxDC& dc, + const wxString& value, + const wxRect& rect, + int horizAlign, + int vertAlign, + int textOrientation) const; +}; + +// Currently the row/column/corner renders don't need any methods other than +// those already in wxGridHeaderLabelsRenderer but still define separate classes +// for them for future extensions and also for better type safety (i.e. to +// avoid inadvertently using a column header renderer for the row headers) +class WXDLLIMPEXP_ADV wxGridRowHeaderRenderer + : public wxGridHeaderLabelsRenderer +{ +}; + +class WXDLLIMPEXP_ADV wxGridColumnHeaderRenderer + : public wxGridHeaderLabelsRenderer +{ +}; + +// Also define the default renderers which are used by wxGridCellAttrProvider +// by default +class WXDLLIMPEXP_ADV wxGridRowHeaderRendererDefault + : public wxGridRowHeaderRenderer +{ +public: + virtual void DrawBorder(const wxGrid& grid, + wxDC& dc, + wxRect& rect) const; +}; + +// Column header cells renderers +class WXDLLIMPEXP_ADV wxGridColumnHeaderRendererDefault + : public wxGridColumnHeaderRenderer +{ +public: + virtual void DrawBorder(const wxGrid& grid, + wxDC& dc, + wxRect& rect) const; +}; + +// Header corner renderer +class WXDLLIMPEXP_ADV wxGridCornerHeaderRendererDefault + : public wxGridCornerHeaderRenderer +{ +public: + virtual void DrawBorder(const wxGrid& grid, + wxDC& dc, + wxRect& rect) const; +}; + + +// ---------------------------------------------------------------------------- +// wxGridCellAttr: this class can be used to alter the cells appearance in +// the grid by changing their colour/font/... from default. An object of this +// class may be returned by wxGridTable::GetAttr(). +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGridCellAttr : public wxClientDataContainer, public wxRefCounter +{ +public: + enum wxAttrKind + { + Any, + Default, + Cell, + Row, + Col, + Merged + }; + + // ctors + wxGridCellAttr(wxGridCellAttr *attrDefault = NULL) + { + Init(attrDefault); + + SetAlignment(wxALIGN_INVALID, wxALIGN_INVALID); + } + + // VZ: considering the number of members wxGridCellAttr has now, this ctor + // seems to be pretty useless... may be we should just remove it? + wxGridCellAttr(const wxColour& colText, + const wxColour& colBack, + const wxFont& font, + int hAlign, + int vAlign) + : m_colText(colText), m_colBack(colBack), m_font(font) + { + Init(); + SetAlignment(hAlign, vAlign); + } + + // creates a new copy of this object + wxGridCellAttr *Clone() const; + void MergeWith(wxGridCellAttr *mergefrom); + + // setters + void SetTextColour(const wxColour& colText) { m_colText = colText; } + void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; } + void SetFont(const wxFont& font) { m_font = font; } + void SetAlignment(int hAlign, int vAlign) + { + m_hAlign = hAlign; + m_vAlign = vAlign; + } + void SetSize(int num_rows, int num_cols); + void SetOverflow(bool allow = true) + { m_overflow = allow ? Overflow : SingleCell; } + void SetReadOnly(bool isReadOnly = true) + { m_isReadOnly = isReadOnly ? ReadOnly : ReadWrite; } + + // takes ownership of the pointer + void SetRenderer(wxGridCellRenderer *renderer) + { wxSafeDecRef(m_renderer); m_renderer = renderer; } + void SetEditor(wxGridCellEditor* editor) + { wxSafeDecRef(m_editor); m_editor = editor; } + + void SetKind(wxAttrKind kind) { m_attrkind = kind; } + + // accessors + bool HasTextColour() const { return m_colText.IsOk(); } + bool HasBackgroundColour() const { return m_colBack.IsOk(); } + bool HasFont() const { return m_font.IsOk(); } + bool HasAlignment() const + { + return m_hAlign != wxALIGN_INVALID || m_vAlign != wxALIGN_INVALID; + } + bool HasRenderer() const { return m_renderer != NULL; } + bool HasEditor() const { return m_editor != NULL; } + bool HasReadWriteMode() const { return m_isReadOnly != Unset; } + bool HasOverflowMode() const { return m_overflow != UnsetOverflow; } + bool HasSize() const { return m_sizeRows != 1 || m_sizeCols != 1; } + + const wxColour& GetTextColour() const; + const wxColour& GetBackgroundColour() const; + const wxFont& GetFont() const; + void GetAlignment(int *hAlign, int *vAlign) const; + + // unlike GetAlignment() which always overwrites its output arguments with + // the alignment values to use, falling back on default alignment if this + // attribute doesn't have any, this function will preserve the values of + // parameters on entry if the corresponding alignment is not set in this + // attribute meaning that they can be initialized to default alignment (and + // also that they must be initialized, unlike with GetAlignment()) + void GetNonDefaultAlignment(int *hAlign, int *vAlign) const; + + void GetSize(int *num_rows, int *num_cols) const; + bool GetOverflow() const + { return m_overflow != SingleCell; } + wxGridCellRenderer *GetRenderer(const wxGrid* grid, int row, int col) const; + wxGridCellEditor *GetEditor(const wxGrid* grid, int row, int col) const; + + bool IsReadOnly() const { return m_isReadOnly == wxGridCellAttr::ReadOnly; } + + wxAttrKind GetKind() { return m_attrkind; } + + void SetDefAttr(wxGridCellAttr* defAttr) { m_defGridAttr = defAttr; } + +protected: + // the dtor is private because only DecRef() can delete us + virtual ~wxGridCellAttr() + { + wxSafeDecRef(m_renderer); + wxSafeDecRef(m_editor); + } + +private: + enum wxAttrReadMode + { + Unset = -1, + ReadWrite, + ReadOnly + }; + + enum wxAttrOverflowMode + { + UnsetOverflow = -1, + Overflow, + SingleCell + }; + + // the common part of all ctors + void Init(wxGridCellAttr *attrDefault = NULL); + + + wxColour m_colText, + m_colBack; + wxFont m_font; + int m_hAlign, + m_vAlign; + int m_sizeRows, + m_sizeCols; + + wxAttrOverflowMode m_overflow; + + wxGridCellRenderer* m_renderer; + wxGridCellEditor* m_editor; + wxGridCellAttr* m_defGridAttr; + + wxAttrReadMode m_isReadOnly; + + wxAttrKind m_attrkind; + + // use Clone() instead + wxDECLARE_NO_COPY_CLASS(wxGridCellAttr); + + // suppress the stupid gcc warning about the class having private dtor and + // no friends + friend class wxGridCellAttrDummyFriend; +}; + +// ---------------------------------------------------------------------------- +// wxGridCellAttrProvider: class used by wxGridTableBase to retrieve/store the +// cell attributes. +// ---------------------------------------------------------------------------- + +// implementation note: we separate it from wxGridTableBase because we wish to +// avoid deriving a new table class if possible, and sometimes it will be +// enough to just derive another wxGridCellAttrProvider instead +// +// the default implementation is reasonably efficient for the generic case, +// but you might still wish to implement your own for some specific situations +// if you have performance problems with the stock one +class WXDLLIMPEXP_ADV wxGridCellAttrProvider : public wxClientDataContainer +{ +public: + wxGridCellAttrProvider(); + virtual ~wxGridCellAttrProvider(); + + // DecRef() must be called on the returned pointer + virtual wxGridCellAttr *GetAttr(int row, int col, + wxGridCellAttr::wxAttrKind kind ) const; + + // all these functions take ownership of the pointer, don't call DecRef() + // on it + virtual void SetAttr(wxGridCellAttr *attr, int row, int col); + virtual void SetRowAttr(wxGridCellAttr *attr, int row); + virtual void SetColAttr(wxGridCellAttr *attr, int col); + + // these functions must be called whenever some rows/cols are deleted + // because the internal data must be updated then + void UpdateAttrRows( size_t pos, int numRows ); + void UpdateAttrCols( size_t pos, int numCols ); + + + // get renderers for the given row/column header label and the corner + // window: unlike cell renderers, these objects are not reference counted + // and are never NULL so they are returned by reference + virtual const wxGridColumnHeaderRenderer& GetColumnHeaderRenderer(int col); + virtual const wxGridRowHeaderRenderer& GetRowHeaderRenderer(int row); + virtual const wxGridCornerHeaderRenderer& GetCornerRenderer(); + +private: + void InitData(); + + wxGridCellAttrProviderData *m_data; + + wxDECLARE_NO_COPY_CLASS(wxGridCellAttrProvider); +}; + +// ---------------------------------------------------------------------------- +// wxGridCellCoords: location of a cell in the grid +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGridCellCoords +{ +public: + wxGridCellCoords() { m_row = m_col = -1; } + wxGridCellCoords( int r, int c ) { m_row = r; m_col = c; } + + // default copy ctor is ok + + int GetRow() const { return m_row; } + void SetRow( int n ) { m_row = n; } + int GetCol() const { return m_col; } + void SetCol( int n ) { m_col = n; } + void Set( int row, int col ) { m_row = row; m_col = col; } + + wxGridCellCoords& operator=( const wxGridCellCoords& other ) + { + if ( &other != this ) + { + m_row=other.m_row; + m_col=other.m_col; + } + return *this; + } + + bool operator==( const wxGridCellCoords& other ) const + { + return (m_row == other.m_row && m_col == other.m_col); + } + + bool operator!=( const wxGridCellCoords& other ) const + { + return (m_row != other.m_row || m_col != other.m_col); + } + + bool operator!() const + { + return (m_row == -1 && m_col == -1 ); + } + +private: + int m_row; + int m_col; +}; + + +// For comparisons... +// +extern WXDLLIMPEXP_ADV wxGridCellCoords wxGridNoCellCoords; +extern WXDLLIMPEXP_ADV wxRect wxGridNoCellRect; + +// An array of cell coords... +// +WX_DECLARE_OBJARRAY_WITH_DECL(wxGridCellCoords, wxGridCellCoordsArray, + class WXDLLIMPEXP_ADV); + +// ---------------------------------------------------------------------------- +// Grid table classes +// ---------------------------------------------------------------------------- + +// the abstract base class +class WXDLLIMPEXP_ADV wxGridTableBase : public wxObject, + public wxClientDataContainer +{ +public: + wxGridTableBase(); + virtual ~wxGridTableBase(); + + // You must override these functions in a derived table class + // + + // return the number of rows and columns in this table + virtual int GetNumberRows() = 0; + virtual int GetNumberCols() = 0; + + // the methods above are unfortunately non-const even though they should + // have been const -- but changing it now is not possible any longer as it + // would break the existing code overriding them, so instead we provide + // these const synonyms which can be used from const-correct code + int GetRowsCount() const + { return const_cast(this)->GetNumberRows(); } + int GetColsCount() const + { return const_cast(this)->GetNumberCols(); } + + + virtual bool IsEmptyCell( int row, int col ) + { + return GetValue(row, col).empty(); + } + + bool IsEmpty(const wxGridCellCoords& coord) + { + return IsEmptyCell(coord.GetRow(), coord.GetCol()); + } + + virtual wxString GetValue( int row, int col ) = 0; + virtual void SetValue( int row, int col, const wxString& value ) = 0; + + // Data type determination and value access + virtual wxString GetTypeName( int row, int col ); + virtual bool CanGetValueAs( int row, int col, const wxString& typeName ); + virtual bool CanSetValueAs( int row, int col, const wxString& typeName ); + + virtual long GetValueAsLong( int row, int col ); + virtual double GetValueAsDouble( int row, int col ); + virtual bool GetValueAsBool( int row, int col ); + + virtual void SetValueAsLong( int row, int col, long value ); + virtual void SetValueAsDouble( int row, int col, double value ); + virtual void SetValueAsBool( int row, int col, bool value ); + + // For user defined types + virtual void* GetValueAsCustom( int row, int col, const wxString& typeName ); + virtual void SetValueAsCustom( int row, int col, const wxString& typeName, void* value ); + + + // Overriding these is optional + // + virtual void SetView( wxGrid *grid ) { m_view = grid; } + virtual wxGrid * GetView() const { return m_view; } + + virtual void Clear() {} + virtual bool InsertRows( size_t pos = 0, size_t numRows = 1 ); + virtual bool AppendRows( size_t numRows = 1 ); + virtual bool DeleteRows( size_t pos = 0, size_t numRows = 1 ); + virtual bool InsertCols( size_t pos = 0, size_t numCols = 1 ); + virtual bool AppendCols( size_t numCols = 1 ); + virtual bool DeleteCols( size_t pos = 0, size_t numCols = 1 ); + + virtual wxString GetRowLabelValue( int row ); + virtual wxString GetColLabelValue( int col ); + virtual void SetRowLabelValue( int WXUNUSED(row), const wxString& ) {} + virtual void SetColLabelValue( int WXUNUSED(col), const wxString& ) {} + + // Attribute handling + // + + // give us the attr provider to use - we take ownership of the pointer + void SetAttrProvider(wxGridCellAttrProvider *attrProvider); + + // get the currently used attr provider (may be NULL) + wxGridCellAttrProvider *GetAttrProvider() const { return m_attrProvider; } + + // Does this table allow attributes? Default implementation creates + // a wxGridCellAttrProvider if necessary. + virtual bool CanHaveAttributes(); + + // by default forwarded to wxGridCellAttrProvider if any. May be + // overridden to handle attributes directly in the table. + virtual wxGridCellAttr *GetAttr( int row, int col, + wxGridCellAttr::wxAttrKind kind ); + + + // these functions take ownership of the pointer + virtual void SetAttr(wxGridCellAttr* attr, int row, int col); + virtual void SetRowAttr(wxGridCellAttr *attr, int row); + virtual void SetColAttr(wxGridCellAttr *attr, int col); + +private: + wxGrid * m_view; + wxGridCellAttrProvider *m_attrProvider; + + DECLARE_ABSTRACT_CLASS(wxGridTableBase) + wxDECLARE_NO_COPY_CLASS(wxGridTableBase); +}; + + +// ---------------------------------------------------------------------------- +// wxGridTableMessage +// ---------------------------------------------------------------------------- + +// IDs for messages sent from grid table to view +// +enum wxGridTableRequest +{ + wxGRIDTABLE_REQUEST_VIEW_GET_VALUES = 2000, + wxGRIDTABLE_REQUEST_VIEW_SEND_VALUES, + wxGRIDTABLE_NOTIFY_ROWS_INSERTED, + wxGRIDTABLE_NOTIFY_ROWS_APPENDED, + wxGRIDTABLE_NOTIFY_ROWS_DELETED, + wxGRIDTABLE_NOTIFY_COLS_INSERTED, + wxGRIDTABLE_NOTIFY_COLS_APPENDED, + wxGRIDTABLE_NOTIFY_COLS_DELETED +}; + +class WXDLLIMPEXP_ADV wxGridTableMessage +{ +public: + wxGridTableMessage(); + wxGridTableMessage( wxGridTableBase *table, int id, + int comInt1 = -1, + int comInt2 = -1 ); + + void SetTableObject( wxGridTableBase *table ) { m_table = table; } + wxGridTableBase * GetTableObject() const { return m_table; } + void SetId( int id ) { m_id = id; } + int GetId() { return m_id; } + void SetCommandInt( int comInt1 ) { m_comInt1 = comInt1; } + int GetCommandInt() { return m_comInt1; } + void SetCommandInt2( int comInt2 ) { m_comInt2 = comInt2; } + int GetCommandInt2() { return m_comInt2; } + +private: + wxGridTableBase *m_table; + int m_id; + int m_comInt1; + int m_comInt2; + + wxDECLARE_NO_COPY_CLASS(wxGridTableMessage); +}; + + + +// ------ wxGridStringArray +// A 2-dimensional array of strings for data values +// + +WX_DECLARE_OBJARRAY_WITH_DECL(wxArrayString, wxGridStringArray, + class WXDLLIMPEXP_ADV); + + + +// ------ wxGridStringTable +// +// Simplest type of data table for a grid for small tables of strings +// that are stored in memory +// + +class WXDLLIMPEXP_ADV wxGridStringTable : public wxGridTableBase +{ +public: + wxGridStringTable(); + wxGridStringTable( int numRows, int numCols ); + + // these are pure virtual in wxGridTableBase + // + virtual int GetNumberRows() { return static_cast(m_data.size()); } + virtual int GetNumberCols() { return m_numCols; } + virtual wxString GetValue( int row, int col ); + virtual void SetValue( int row, int col, const wxString& s ); + + // overridden functions from wxGridTableBase + // + void Clear(); + bool InsertRows( size_t pos = 0, size_t numRows = 1 ); + bool AppendRows( size_t numRows = 1 ); + bool DeleteRows( size_t pos = 0, size_t numRows = 1 ); + bool InsertCols( size_t pos = 0, size_t numCols = 1 ); + bool AppendCols( size_t numCols = 1 ); + bool DeleteCols( size_t pos = 0, size_t numCols = 1 ); + + void SetRowLabelValue( int row, const wxString& ); + void SetColLabelValue( int col, const wxString& ); + wxString GetRowLabelValue( int row ); + wxString GetColLabelValue( int col ); + +private: + wxGridStringArray m_data; + + // notice that while we don't need to store the number of our rows as it's + // always equal to the size of m_data array, we do need to store the number + // of our columns as we can't retrieve it from m_data when the number of + // rows is 0 (see #10818) + int m_numCols; + + // These only get used if you set your own labels, otherwise the + // GetRow/ColLabelValue functions return wxGridTableBase defaults + // + wxArrayString m_rowLabels; + wxArrayString m_colLabels; + + DECLARE_DYNAMIC_CLASS_NO_COPY( wxGridStringTable ) +}; + + + +// ============================================================================ +// Grid view classes +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxGridSizesInfo stores information about sizes of the rows or columns. +// +// It assumes that most of the columns or rows have default size and so stores +// the default size separately and uses a hash to map column or row numbers to +// their non default size for those which don't have the default size. +// ---------------------------------------------------------------------------- + +// hash map to store positions as the keys and sizes as the values +WX_DECLARE_HASH_MAP_WITH_DECL( unsigned, int, wxIntegerHash, wxIntegerEqual, + wxUnsignedToIntHashMap, class WXDLLIMPEXP_ADV ); + +struct WXDLLIMPEXP_ADV wxGridSizesInfo +{ + // default ctor, initialize m_sizeDefault and m_customSizes later + wxGridSizesInfo() { } + + // ctor used by wxGrid::Get{Col,Row}Sizes() + wxGridSizesInfo(int defSize, const wxArrayInt& allSizes); + + // default copy ctor, assignment operator and dtor are ok + + // Get the size of the element with the given index + int GetSize(unsigned pos) const; + + + // default size + int m_sizeDefault; + + // position -> size map containing all elements with non-default size + wxUnsignedToIntHashMap m_customSizes; +}; + +// ---------------------------------------------------------------------------- +// wxGrid +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGrid : public wxScrolledWindow +{ +public: + // possible selection modes + enum wxGridSelectionModes + { + wxGridSelectCells = 0, // allow selecting anything + wxGridSelectRows = 1, // allow selecting only entire rows + wxGridSelectColumns = 2, // allow selecting only entire columns + wxGridSelectRowsOrColumns = wxGridSelectRows | wxGridSelectColumns + }; + + // Different behaviour of the TAB key when the end (or the beginning, for + // Shift-TAB) of the current row is reached: + enum TabBehaviour + { + Tab_Stop, // Do nothing, this is default. + Tab_Wrap, // Move to the next (or previous) row. + Tab_Leave // Move to the next (or previous) control. + }; + + // creation and destruction + // ------------------------ + + // ctor and Create() create the grid window, as with the other controls + wxGrid() { Init(); } + + wxGrid(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxWANTS_CHARS, + const wxString& name = wxGridNameStr) + { + Init(); + + Create(parent, id, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxWANTS_CHARS, + const wxString& name = wxGridNameStr); + + virtual ~wxGrid(); + + // however to initialize grid data either CreateGrid() or SetTable() must + // be also called + + // this is basically equivalent to + // + // SetTable(new wxGridStringTable(numRows, numCols), true, selmode) + // + bool CreateGrid( int numRows, int numCols, + wxGridSelectionModes selmode = wxGridSelectCells ); + + bool SetTable( wxGridTableBase *table, + bool takeOwnership = false, + wxGridSelectionModes selmode = wxGridSelectCells ); + + bool ProcessTableMessage(wxGridTableMessage&); + + wxGridTableBase *GetTable() const { return m_table; } + + + void SetSelectionMode(wxGridSelectionModes selmode); + wxGridSelectionModes GetSelectionMode() const; + + // ------ grid dimensions + // + int GetNumberRows() const { return m_numRows; } + int GetNumberCols() const { return m_numCols; } + + + // ------ display update functions + // + wxArrayInt CalcRowLabelsExposed( const wxRegion& reg ) const; + + wxArrayInt CalcColLabelsExposed( const wxRegion& reg ) const; + wxGridCellCoordsArray CalcCellsExposed( const wxRegion& reg ) const; + + + void ClearGrid(); + bool InsertRows(int pos = 0, int numRows = 1, bool updateLabels = true) + { + return DoModifyLines(&wxGridTableBase::InsertRows, + pos, numRows, updateLabels); + } + bool InsertCols(int pos = 0, int numCols = 1, bool updateLabels = true) + { + return DoModifyLines(&wxGridTableBase::InsertCols, + pos, numCols, updateLabels); + } + + bool AppendRows(int numRows = 1, bool updateLabels = true) + { + return DoAppendLines(&wxGridTableBase::AppendRows, numRows, updateLabels); + } + bool AppendCols(int numCols = 1, bool updateLabels = true) + { + return DoAppendLines(&wxGridTableBase::AppendCols, numCols, updateLabels); + } + + bool DeleteRows(int pos = 0, int numRows = 1, bool updateLabels = true) + { + return DoModifyLines(&wxGridTableBase::DeleteRows, + pos, numRows, updateLabels); + } + bool DeleteCols(int pos = 0, int numCols = 1, bool updateLabels = true) + { + return DoModifyLines(&wxGridTableBase::DeleteCols, + pos, numCols, updateLabels); + } + + void DrawGridCellArea( wxDC& dc , const wxGridCellCoordsArray& cells ); + void DrawGridSpace( wxDC& dc ); + void DrawCellBorder( wxDC& dc, const wxGridCellCoords& ); + void DrawAllGridLines( wxDC& dc, const wxRegion & reg ); + void DrawCell( wxDC& dc, const wxGridCellCoords& ); + void DrawHighlight(wxDC& dc, const wxGridCellCoordsArray& cells); + + // this function is called when the current cell highlight must be redrawn + // and may be overridden by the user + virtual void DrawCellHighlight( wxDC& dc, const wxGridCellAttr *attr ); + + virtual void DrawRowLabels( wxDC& dc, const wxArrayInt& rows ); + virtual void DrawRowLabel( wxDC& dc, int row ); + + virtual void DrawColLabels( wxDC& dc, const wxArrayInt& cols ); + virtual void DrawColLabel( wxDC& dc, int col ); + + virtual void DrawCornerLabel(wxDC& dc); + + // ------ Cell text drawing functions + // + void DrawTextRectangle( wxDC& dc, const wxString&, const wxRect&, + int horizontalAlignment = wxALIGN_LEFT, + int verticalAlignment = wxALIGN_TOP, + int textOrientation = wxHORIZONTAL ) const; + + void DrawTextRectangle( wxDC& dc, const wxArrayString& lines, const wxRect&, + int horizontalAlignment = wxALIGN_LEFT, + int verticalAlignment = wxALIGN_TOP, + int textOrientation = wxHORIZONTAL ) const; + + // ------ grid render function for printing + // + void Render( wxDC& dc, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxGridCellCoords& topLeft = wxGridCellCoords(-1, -1), + const wxGridCellCoords& bottomRight = wxGridCellCoords(-1, -1), + int style = wxGRID_DRAW_DEFAULT ); + + // Split a string containing newline characters into an array of + // strings and return the number of lines + // + void StringToLines( const wxString& value, wxArrayString& lines ) const; + + void GetTextBoxSize( const wxDC& dc, + const wxArrayString& lines, + long *width, long *height ) const; + + + // ------ + // Code that does a lot of grid modification can be enclosed + // between BeginBatch() and EndBatch() calls to avoid screen + // flicker + // + void BeginBatch() { m_batchCount++; } + void EndBatch(); + + int GetBatchCount() { return m_batchCount; } + + virtual void Refresh(bool eraseb = true, const wxRect* rect = NULL); + + // Use this, rather than wxWindow::Refresh(), to force an + // immediate repainting of the grid. Has no effect if you are + // already inside a BeginBatch / EndBatch block. + // + // This function is necessary because wxGrid has a minimal OnPaint() + // handler to reduce screen flicker. + // + void ForceRefresh(); + + + // ------ edit control functions + // + bool IsEditable() const { return m_editable; } + void EnableEditing( bool edit ); + + void EnableCellEditControl( bool enable = true ); + void DisableCellEditControl() { EnableCellEditControl(false); } + bool CanEnableCellControl() const; + bool IsCellEditControlEnabled() const; + bool IsCellEditControlShown() const; + + bool IsCurrentCellReadOnly() const; + + void ShowCellEditControl(); + void HideCellEditControl(); + void SaveEditControlValue(); + + + // ------ grid location functions + // Note that all of these functions work with the logical coordinates of + // grid cells and labels so you will need to convert from device + // coordinates for mouse events etc. + // + wxGridCellCoords XYToCell(int x, int y) const; + void XYToCell(int x, int y, wxGridCellCoords& coords) const + { coords = XYToCell(x, y); } + wxGridCellCoords XYToCell(const wxPoint& pos) const + { return XYToCell(pos.x, pos.y); } + + // these functions return the index of the row/columns corresponding to the + // given logical position in pixels + // + // if clipToMinMax is false (default, wxNOT_FOUND is returned if the + // position is outside any row/column, otherwise the first/last element is + // returned in this case + int YToRow( int y, bool clipToMinMax = false ) const; + int XToCol( int x, bool clipToMinMax = false ) const; + + int YToEdgeOfRow( int y ) const; + int XToEdgeOfCol( int x ) const; + + wxRect CellToRect( int row, int col ) const; + wxRect CellToRect( const wxGridCellCoords& coords ) const + { return CellToRect( coords.GetRow(), coords.GetCol() ); } + + int GetGridCursorRow() const { return m_currentCellCoords.GetRow(); } + int GetGridCursorCol() const { return m_currentCellCoords.GetCol(); } + + // check to see if a cell is either wholly visible (the default arg) or + // at least partially visible in the grid window + // + bool IsVisible( int row, int col, bool wholeCellVisible = true ) const; + bool IsVisible( const wxGridCellCoords& coords, bool wholeCellVisible = true ) const + { return IsVisible( coords.GetRow(), coords.GetCol(), wholeCellVisible ); } + void MakeCellVisible( int row, int col ); + void MakeCellVisible( const wxGridCellCoords& coords ) + { MakeCellVisible( coords.GetRow(), coords.GetCol() ); } + + + // ------ grid cursor movement functions + // + void SetGridCursor(int row, int col) { SetCurrentCell(row, col); } + void SetGridCursor(const wxGridCellCoords& c) { SetCurrentCell(c); } + + void GoToCell(int row, int col) + { + if ( SetCurrentCell(row, col) ) + MakeCellVisible(row, col); + } + + void GoToCell(const wxGridCellCoords& coords) + { + if ( SetCurrentCell(coords) ) + MakeCellVisible(coords); + } + + bool MoveCursorUp( bool expandSelection ); + bool MoveCursorDown( bool expandSelection ); + bool MoveCursorLeft( bool expandSelection ); + bool MoveCursorRight( bool expandSelection ); + bool MovePageDown(); + bool MovePageUp(); + bool MoveCursorUpBlock( bool expandSelection ); + bool MoveCursorDownBlock( bool expandSelection ); + bool MoveCursorLeftBlock( bool expandSelection ); + bool MoveCursorRightBlock( bool expandSelection ); + + void SetTabBehaviour(TabBehaviour behaviour) { m_tabBehaviour = behaviour; } + + + // ------ label and gridline formatting + // + int GetDefaultRowLabelSize() const { return WXGRID_DEFAULT_ROW_LABEL_WIDTH; } + int GetRowLabelSize() const { return m_rowLabelWidth; } + int GetDefaultColLabelSize() const { return WXGRID_DEFAULT_COL_LABEL_HEIGHT; } + int GetColLabelSize() const { return m_colLabelHeight; } + wxColour GetLabelBackgroundColour() const { return m_labelBackgroundColour; } + wxColour GetLabelTextColour() const { return m_labelTextColour; } + wxFont GetLabelFont() const { return m_labelFont; } + void GetRowLabelAlignment( int *horiz, int *vert ) const; + void GetColLabelAlignment( int *horiz, int *vert ) const; + int GetColLabelTextOrientation() const; + wxString GetRowLabelValue( int row ) const; + wxString GetColLabelValue( int col ) const; + + wxColour GetCellHighlightColour() const { return m_cellHighlightColour; } + int GetCellHighlightPenWidth() const { return m_cellHighlightPenWidth; } + int GetCellHighlightROPenWidth() const { return m_cellHighlightROPenWidth; } + + // this one will use wxHeaderCtrl for the column labels + void UseNativeColHeader(bool native = true); + + // this one will still draw them manually but using the native renderer + // instead of using the same appearance as for the row labels + void SetUseNativeColLabels( bool native = true ); + + void SetRowLabelSize( int width ); + void SetColLabelSize( int height ); + void HideRowLabels() { SetRowLabelSize( 0 ); } + void HideColLabels() { SetColLabelSize( 0 ); } + void SetLabelBackgroundColour( const wxColour& ); + void SetLabelTextColour( const wxColour& ); + void SetLabelFont( const wxFont& ); + void SetRowLabelAlignment( int horiz, int vert ); + void SetColLabelAlignment( int horiz, int vert ); + void SetColLabelTextOrientation( int textOrientation ); + void SetRowLabelValue( int row, const wxString& ); + void SetColLabelValue( int col, const wxString& ); + void SetCellHighlightColour( const wxColour& ); + void SetCellHighlightPenWidth(int width); + void SetCellHighlightROPenWidth(int width); + + + // interactive grid mouse operations control + // ----------------------------------------- + + // functions globally enabling row/column interactive resizing (enabled by + // default) + void EnableDragRowSize( bool enable = true ); + void DisableDragRowSize() { EnableDragRowSize( false ); } + + void EnableDragColSize( bool enable = true ); + void DisableDragColSize() { EnableDragColSize( false ); } + + // if interactive resizing is enabled, some rows/columns can still have + // fixed size + void DisableRowResize(int row) { DoDisableLineResize(row, m_setFixedRows); } + void DisableColResize(int col) { DoDisableLineResize(col, m_setFixedCols); } + + // these functions return whether the given row/column can be + // effectively resized: for this interactive resizing must be enabled + // and this index must not have been passed to DisableRow/ColResize() + bool CanDragRowSize(int row) const + { return m_canDragRowSize && DoCanResizeLine(row, m_setFixedRows); } + bool CanDragColSize(int col) const + { return m_canDragColSize && DoCanResizeLine(col, m_setFixedCols); } + + // interactive column reordering (disabled by default) + void EnableDragColMove( bool enable = true ); + void DisableDragColMove() { EnableDragColMove( false ); } + bool CanDragColMove() const { return m_canDragColMove; } + + // interactive resizing of grid cells (enabled by default) + void EnableDragGridSize(bool enable = true); + void DisableDragGridSize() { EnableDragGridSize(false); } + bool CanDragGridSize() const { return m_canDragGridSize; } + + // interactive dragging of cells (disabled by default) + void EnableDragCell( bool enable = true ); + void DisableDragCell() { EnableDragCell( false ); } + bool CanDragCell() const { return m_canDragCell; } + + + // grid lines + // ---------- + + // enable or disable drawing of the lines + void EnableGridLines(bool enable = true); + bool GridLinesEnabled() const { return m_gridLinesEnabled; } + + // by default grid lines stop at last column/row, but this may be changed + void ClipHorzGridLines(bool clip) + { DoClipGridLines(m_gridLinesClipHorz, clip); } + void ClipVertGridLines(bool clip) + { DoClipGridLines(m_gridLinesClipVert, clip); } + bool AreHorzGridLinesClipped() const { return m_gridLinesClipHorz; } + bool AreVertGridLinesClipped() const { return m_gridLinesClipVert; } + + // this can be used to change the global grid lines colour + void SetGridLineColour(const wxColour& col); + wxColour GetGridLineColour() const { return m_gridLineColour; } + + // these methods may be overridden to customize individual grid lines + // appearance + virtual wxPen GetDefaultGridLinePen(); + virtual wxPen GetRowGridLinePen(int row); + virtual wxPen GetColGridLinePen(int col); + + + // attributes + // ---------- + + // this sets the specified attribute for this cell or in this row/col + void SetAttr(int row, int col, wxGridCellAttr *attr); + void SetRowAttr(int row, wxGridCellAttr *attr); + void SetColAttr(int col, wxGridCellAttr *attr); + + // the grid can cache attributes for the recently used cells (currently it + // only caches one attribute for the most recently used one) and might + // notice that its value in the attribute provider has changed -- if this + // happens, call this function to force it + void RefreshAttr(int row, int col); + + // returns the attribute we may modify in place: a new one if this cell + // doesn't have any yet or the existing one if it does + // + // DecRef() must be called on the returned pointer, as usual + wxGridCellAttr *GetOrCreateCellAttr(int row, int col) const; + + + // shortcuts for setting the column parameters + + // set the format for the data in the column: default is string + void SetColFormatBool(int col); + void SetColFormatNumber(int col); + void SetColFormatFloat(int col, int width = -1, int precision = -1); + void SetColFormatCustom(int col, const wxString& typeName); + + // ------ row and col formatting + // + int GetDefaultRowSize() const; + int GetRowSize( int row ) const; + bool IsRowShown(int row) const { return GetRowSize(row) != 0; } + int GetDefaultColSize() const; + int GetColSize( int col ) const; + bool IsColShown(int col) const { return GetColSize(col) != 0; } + wxColour GetDefaultCellBackgroundColour() const; + wxColour GetCellBackgroundColour( int row, int col ) const; + wxColour GetDefaultCellTextColour() const; + wxColour GetCellTextColour( int row, int col ) const; + wxFont GetDefaultCellFont() const; + wxFont GetCellFont( int row, int col ) const; + void GetDefaultCellAlignment( int *horiz, int *vert ) const; + void GetCellAlignment( int row, int col, int *horiz, int *vert ) const; + bool GetDefaultCellOverflow() const; + bool GetCellOverflow( int row, int col ) const; + + // this function returns 1 in num_rows and num_cols for normal cells, + // positive numbers for a cell spanning multiple columns/rows (as set with + // SetCellSize()) and _negative_ numbers corresponding to the offset of the + // top left cell of the span from this one for the other cells covered by + // this cell + // + // the return value is CellSpan_None, CellSpan_Main or CellSpan_Inside for + // each of these cases respectively + enum CellSpan + { + CellSpan_Inside = -1, + CellSpan_None = 0, + CellSpan_Main + }; + + CellSpan GetCellSize( int row, int col, int *num_rows, int *num_cols ) const; + + wxSize GetCellSize(const wxGridCellCoords& coords) + { + wxSize s; + GetCellSize(coords.GetRow(), coords.GetCol(), &s.x, &s.y); + return s; + } + + // ------ row and col sizes + void SetDefaultRowSize( int height, bool resizeExistingRows = false ); + void SetRowSize( int row, int height ); + void HideRow(int row) { DoSetRowSize(row, 0); } + void ShowRow(int row) { DoSetRowSize(row, -1); } + + void SetDefaultColSize( int width, bool resizeExistingCols = false ); + void SetColSize( int col, int width ); + void HideCol(int col) { DoSetColSize(col, 0); } + void ShowCol(int col) { DoSetColSize(col, -1); } + + // the row and column sizes can be also set all at once using + // wxGridSizesInfo which holds all of them at once + + wxGridSizesInfo GetColSizes() const + { return wxGridSizesInfo(GetDefaultColSize(), m_colWidths); } + wxGridSizesInfo GetRowSizes() const + { return wxGridSizesInfo(GetDefaultRowSize(), m_rowHeights); } + + void SetColSizes(const wxGridSizesInfo& sizeInfo); + void SetRowSizes(const wxGridSizesInfo& sizeInfo); + + + // ------- columns (only, for now) reordering + + // columns index <-> positions mapping: by default, the position of the + // column is the same as its index, but the columns can also be reordered + // (either by calling SetColPos() explicitly or by the user dragging the + // columns around) in which case their indices don't correspond to their + // positions on display any longer + // + // internally we always work with indices except for the functions which + // have "Pos" in their names (and which work with columns, not pixels) and + // only the display and hit testing code really cares about display + // positions at all + + // set the positions of all columns at once (this method uses the same + // conventions as wxHeaderCtrl::SetColumnsOrder() for the order array) + void SetColumnsOrder(const wxArrayInt& order); + + // return the column index corresponding to the given (valid) position + int GetColAt(int pos) const + { + return m_colAt.empty() ? pos : m_colAt[pos]; + } + + // reorder the columns so that the column with the given index is now shown + // as the position pos + void SetColPos(int idx, int pos); + + // return the position at which the column with the given index is + // displayed: notice that this is a slow operation as we don't maintain the + // reverse mapping currently + int GetColPos(int idx) const + { + if ( m_colAt.IsEmpty() ) + return idx; + + for ( int i = 0; i < m_numCols; i++ ) + { + if ( m_colAt[i] == idx ) + return i; + } + + wxFAIL_MSG( "invalid column index" ); + + return wxNOT_FOUND; + } + + // reset the columns positions to the default order + void ResetColPos(); + + + // automatically size the column or row to fit to its contents, if + // setAsMin is true, this optimal width will also be set as minimal width + // for this column + void AutoSizeColumn( int col, bool setAsMin = true ) + { AutoSizeColOrRow(col, setAsMin, wxGRID_COLUMN); } + void AutoSizeRow( int row, bool setAsMin = true ) + { AutoSizeColOrRow(row, setAsMin, wxGRID_ROW); } + + // auto size all columns (very ineffective for big grids!) + void AutoSizeColumns( bool setAsMin = true ) + { (void)SetOrCalcColumnSizes(false, setAsMin); } + + void AutoSizeRows( bool setAsMin = true ) + { (void)SetOrCalcRowSizes(false, setAsMin); } + + // auto size the grid, that is make the columns/rows of the "right" size + // and also set the grid size to just fit its contents + void AutoSize(); + + // Note for both AutoSizeRowLabelSize and AutoSizeColLabelSize: + // If col equals to wxGRID_AUTOSIZE value then function autosizes labels column + // instead of data column. Note that this operation may be slow for large + // tables. + // autosize row height depending on label text + void AutoSizeRowLabelSize( int row ); + + // autosize column width depending on label text + void AutoSizeColLabelSize( int col ); + + // column won't be resized to be lesser width - this must be called during + // the grid creation because it won't resize the column if it's already + // narrower than the minimal width + void SetColMinimalWidth( int col, int width ); + void SetRowMinimalHeight( int row, int width ); + + /* These members can be used to query and modify the minimal + * acceptable size of grid rows and columns. Call this function in + * your code which creates the grid if you want to display cells + * with a size smaller than the default acceptable minimum size. + * Like the members SetColMinimalWidth and SetRowMinimalWidth, + * the existing rows or columns will not be checked/resized. + */ + void SetColMinimalAcceptableWidth( int width ); + void SetRowMinimalAcceptableHeight( int width ); + int GetColMinimalAcceptableWidth() const; + int GetRowMinimalAcceptableHeight() const; + + void SetDefaultCellBackgroundColour( const wxColour& ); + void SetCellBackgroundColour( int row, int col, const wxColour& ); + void SetDefaultCellTextColour( const wxColour& ); + + void SetCellTextColour( int row, int col, const wxColour& ); + void SetDefaultCellFont( const wxFont& ); + void SetCellFont( int row, int col, const wxFont& ); + void SetDefaultCellAlignment( int horiz, int vert ); + void SetCellAlignment( int row, int col, int horiz, int vert ); + void SetDefaultCellOverflow( bool allow ); + void SetCellOverflow( int row, int col, bool allow ); + void SetCellSize( int row, int col, int num_rows, int num_cols ); + + // takes ownership of the pointer + void SetDefaultRenderer(wxGridCellRenderer *renderer); + void SetCellRenderer(int row, int col, wxGridCellRenderer *renderer); + wxGridCellRenderer *GetDefaultRenderer() const; + wxGridCellRenderer* GetCellRenderer(int row, int col) const; + + // takes ownership of the pointer + void SetDefaultEditor(wxGridCellEditor *editor); + void SetCellEditor(int row, int col, wxGridCellEditor *editor); + wxGridCellEditor *GetDefaultEditor() const; + wxGridCellEditor* GetCellEditor(int row, int col) const; + + + + // ------ cell value accessors + // + wxString GetCellValue( int row, int col ) const + { + if ( m_table ) + { + return m_table->GetValue( row, col ); + } + else + { + return wxEmptyString; + } + } + + wxString GetCellValue( const wxGridCellCoords& coords ) const + { return GetCellValue( coords.GetRow(), coords.GetCol() ); } + + void SetCellValue( int row, int col, const wxString& s ); + void SetCellValue( const wxGridCellCoords& coords, const wxString& s ) + { SetCellValue( coords.GetRow(), coords.GetCol(), s ); } + + // returns true if the cell can't be edited + bool IsReadOnly(int row, int col) const; + + // make the cell editable/readonly + void SetReadOnly(int row, int col, bool isReadOnly = true); + + // ------ select blocks of cells + // + void SelectRow( int row, bool addToSelected = false ); + void SelectCol( int col, bool addToSelected = false ); + + void SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol, + bool addToSelected = false ); + + void SelectBlock( const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight, + bool addToSelected = false ) + { SelectBlock( topLeft.GetRow(), topLeft.GetCol(), + bottomRight.GetRow(), bottomRight.GetCol(), + addToSelected ); } + + void SelectAll(); + + bool IsSelection() const; + + // ------ deselect blocks or cells + // + void DeselectRow( int row ); + void DeselectCol( int col ); + void DeselectCell( int row, int col ); + + void ClearSelection(); + + bool IsInSelection( int row, int col ) const; + + bool IsInSelection( const wxGridCellCoords& coords ) const + { return IsInSelection( coords.GetRow(), coords.GetCol() ); } + + wxGridCellCoordsArray GetSelectedCells() const; + wxGridCellCoordsArray GetSelectionBlockTopLeft() const; + wxGridCellCoordsArray GetSelectionBlockBottomRight() const; + wxArrayInt GetSelectedRows() const; + wxArrayInt GetSelectedCols() const; + + // This function returns the rectangle that encloses the block of cells + // limited by TopLeft and BottomRight cell in device coords and clipped + // to the client size of the grid window. + // + wxRect BlockToDeviceRect( const wxGridCellCoords & topLeft, + const wxGridCellCoords & bottomRight ) const; + + // Access or update the selection fore/back colours + wxColour GetSelectionBackground() const + { return m_selectionBackground; } + wxColour GetSelectionForeground() const + { return m_selectionForeground; } + + void SetSelectionBackground(const wxColour& c) { m_selectionBackground = c; } + void SetSelectionForeground(const wxColour& c) { m_selectionForeground = c; } + + + // Methods for a registry for mapping data types to Renderers/Editors + void RegisterDataType(const wxString& typeName, + wxGridCellRenderer* renderer, + wxGridCellEditor* editor); + // DJC MAPTEK + virtual wxGridCellEditor* GetDefaultEditorForCell(int row, int col) const; + wxGridCellEditor* GetDefaultEditorForCell(const wxGridCellCoords& c) const + { return GetDefaultEditorForCell(c.GetRow(), c.GetCol()); } + virtual wxGridCellRenderer* GetDefaultRendererForCell(int row, int col) const; + virtual wxGridCellEditor* GetDefaultEditorForType(const wxString& typeName) const; + virtual wxGridCellRenderer* GetDefaultRendererForType(const wxString& typeName) const; + + // grid may occupy more space than needed for its rows/columns, this + // function allows to set how big this extra space is + void SetMargins(int extraWidth, int extraHeight) + { + m_extraWidth = extraWidth; + m_extraHeight = extraHeight; + + CalcDimensions(); + } + + // Accessors for component windows + wxWindow* GetGridWindow() const { return (wxWindow*)m_gridWin; } + wxWindow* GetGridRowLabelWindow() const { return (wxWindow*)m_rowLabelWin; } + wxWindow* GetGridColLabelWindow() const { return m_colWindow; } + wxWindow* GetGridCornerLabelWindow() const { return (wxWindow*)m_cornerLabelWin; } + + // This one can only be called if we are using the native header window + wxHeaderCtrl *GetGridColHeader() const + { + wxASSERT_MSG( m_useNativeHeader, "no column header window" ); + + // static_cast<> doesn't work without the full class declaration in + // view and we prefer to avoid adding more compile-time dependencies + // even at the cost of using reinterpret_cast<> + return reinterpret_cast(m_colWindow); + } + + // Allow adjustment of scroll increment. The default is (15, 15). + void SetScrollLineX(int x) { m_xScrollPixelsPerLine = x; } + void SetScrollLineY(int y) { m_yScrollPixelsPerLine = y; } + int GetScrollLineX() const { return m_xScrollPixelsPerLine; } + int GetScrollLineY() const { return m_yScrollPixelsPerLine; } + + // ------- drag and drop +#if wxUSE_DRAG_AND_DROP + virtual void SetDropTarget(wxDropTarget *dropTarget); +#endif // wxUSE_DRAG_AND_DROP + + + // ------- sorting support + + // wxGrid doesn't support sorting on its own but it can indicate the sort + // order in the column header (currently only if native header control is + // used though) + + // return the column currently displaying the sort indicator or wxNOT_FOUND + // if none + int GetSortingColumn() const { return m_sortCol; } + + // return true if this column is currently used for sorting + bool IsSortingBy(int col) const { return GetSortingColumn() == col; } + + // return the current sorting order (on GetSortingColumn()): true for + // ascending sort and false for descending; it doesn't make sense to call + // it if GetSortingColumn() returns wxNOT_FOUND + bool IsSortOrderAscending() const { return m_sortIsAscending; } + + // set the sorting column (or unsets any existing one if wxNOT_FOUND) and + // the order in which to sort + void SetSortingColumn(int col, bool ascending = true); + + // unset any existing sorting column + void UnsetSortingColumn() { SetSortingColumn(wxNOT_FOUND); } + +#if WXWIN_COMPATIBILITY_2_8 + // ------ For compatibility with previous wxGrid only... + // + // ************************************************ + // ** Don't use these in new code because they ** + // ** are liable to disappear in a future ** + // ** revision ** + // ************************************************ + // + + wxGrid( wxWindow *parent, + int x, int y, int w = wxDefaultCoord, int h = wxDefaultCoord, + long style = wxWANTS_CHARS, + const wxString& name = wxPanelNameStr ) + { + Init(); + Create(parent, wxID_ANY, wxPoint(x, y), wxSize(w, h), style, name); + } + + void SetCellValue( const wxString& val, int row, int col ) + { SetCellValue( row, col, val ); } + + void UpdateDimensions() + { CalcDimensions(); } + + int GetRows() const { return GetNumberRows(); } + int GetCols() const { return GetNumberCols(); } + int GetCursorRow() const { return GetGridCursorRow(); } + int GetCursorColumn() const { return GetGridCursorCol(); } + + int GetScrollPosX() const { return 0; } + int GetScrollPosY() const { return 0; } + + void SetScrollX( int WXUNUSED(x) ) { } + void SetScrollY( int WXUNUSED(y) ) { } + + void SetColumnWidth( int col, int width ) + { SetColSize( col, width ); } + + int GetColumnWidth( int col ) const + { return GetColSize( col ); } + + void SetRowHeight( int row, int height ) + { SetRowSize( row, height ); } + + // GetRowHeight() is below + + int GetViewHeight() const // returned num whole rows visible + { return 0; } + + int GetViewWidth() const // returned num whole cols visible + { return 0; } + + void SetLabelSize( int orientation, int sz ) + { + if ( orientation == wxHORIZONTAL ) + SetColLabelSize( sz ); + else + SetRowLabelSize( sz ); + } + + int GetLabelSize( int orientation ) const + { + if ( orientation == wxHORIZONTAL ) + return GetColLabelSize(); + else + return GetRowLabelSize(); + } + + void SetLabelAlignment( int orientation, int align ) + { + if ( orientation == wxHORIZONTAL ) + SetColLabelAlignment( align, wxALIGN_INVALID ); + else + SetRowLabelAlignment( align, wxALIGN_INVALID ); + } + + int GetLabelAlignment( int orientation, int WXUNUSED(align) ) const + { + int h, v; + if ( orientation == wxHORIZONTAL ) + { + GetColLabelAlignment( &h, &v ); + return h; + } + else + { + GetRowLabelAlignment( &h, &v ); + return h; + } + } + + void SetLabelValue( int orientation, const wxString& val, int pos ) + { + if ( orientation == wxHORIZONTAL ) + SetColLabelValue( pos, val ); + else + SetRowLabelValue( pos, val ); + } + + wxString GetLabelValue( int orientation, int pos) const + { + if ( orientation == wxHORIZONTAL ) + return GetColLabelValue( pos ); + else + return GetRowLabelValue( pos ); + } + + wxFont GetCellTextFont() const + { return m_defaultCellAttr->GetFont(); } + + wxFont GetCellTextFont(int WXUNUSED(row), int WXUNUSED(col)) const + { return m_defaultCellAttr->GetFont(); } + + void SetCellTextFont(const wxFont& fnt) + { SetDefaultCellFont( fnt ); } + + void SetCellTextFont(const wxFont& fnt, int row, int col) + { SetCellFont( row, col, fnt ); } + + void SetCellTextColour(const wxColour& val, int row, int col) + { SetCellTextColour( row, col, val ); } + + void SetCellTextColour(const wxColour& col) + { SetDefaultCellTextColour( col ); } + + void SetCellBackgroundColour(const wxColour& col) + { SetDefaultCellBackgroundColour( col ); } + + void SetCellBackgroundColour(const wxColour& colour, int row, int col) + { SetCellBackgroundColour( row, col, colour ); } + + bool GetEditable() const { return IsEditable(); } + void SetEditable( bool edit = true ) { EnableEditing( edit ); } + bool GetEditInPlace() const { return IsCellEditControlEnabled(); } + + void SetEditInPlace(bool WXUNUSED(edit) = true) { } + + void SetCellAlignment( int align, int row, int col) + { SetCellAlignment(row, col, align, wxALIGN_CENTER); } + void SetCellAlignment( int WXUNUSED(align) ) {} + void SetCellBitmap(wxBitmap *WXUNUSED(bitmap), int WXUNUSED(row), int WXUNUSED(col)) + { } + void SetDividerPen(const wxPen& WXUNUSED(pen)) { } + wxPen& GetDividerPen() const; + void OnActivate(bool WXUNUSED(active)) {} + + // ******** End of compatibility functions ********** + + + + // ------ control IDs + enum { wxGRID_CELLCTRL = 2000, + wxGRID_TOPCTRL }; + + // ------ control types + enum { wxGRID_TEXTCTRL = 2100, + wxGRID_CHECKBOX, + wxGRID_CHOICE, + wxGRID_COMBOBOX }; + + wxDEPRECATED_INLINE(bool CanDragRowSize() const, return m_canDragRowSize; ) + wxDEPRECATED_INLINE(bool CanDragColSize() const, return m_canDragColSize; ) +#endif // WXWIN_COMPATIBILITY_2_8 + + + // override some base class functions + virtual bool Enable(bool enable = true); + virtual wxWindow *GetMainWindowOfCompositeControl() + { return (wxWindow*)m_gridWin; } + virtual void Fit(); + + // implementation only + void CancelMouseCapture(); + +protected: + virtual wxSize DoGetBestSize() const; + + bool m_created; + + wxGridWindow *m_gridWin; + wxGridCornerLabelWindow *m_cornerLabelWin; + wxGridRowLabelWindow *m_rowLabelWin; + + // the real type of the column window depends on m_useNativeHeader value: + // if it is true, its dynamic type is wxHeaderCtrl, otherwise it is + // wxGridColLabelWindow, use accessors below when the real type matters + wxWindow *m_colWindow; + + wxGridColLabelWindow *GetColLabelWindow() const + { + wxASSERT_MSG( !m_useNativeHeader, "no column label window" ); + + return reinterpret_cast(m_colWindow); + } + + wxGridTableBase *m_table; + bool m_ownTable; + + int m_numRows; + int m_numCols; + + wxGridCellCoords m_currentCellCoords; + + // the corners of the block being currently selected or wxGridNoCellCoords + wxGridCellCoords m_selectedBlockTopLeft; + wxGridCellCoords m_selectedBlockBottomRight; + + // when selecting blocks of cells (either from the keyboard using Shift + // with cursor keys, or by dragging the mouse), the selection is anchored + // at m_currentCellCoords which defines one of the corners of the rectangle + // being selected -- and this variable defines the other corner, i.e. it's + // either m_selectedBlockTopLeft or m_selectedBlockBottomRight depending on + // which of them is not m_currentCellCoords + // + // if no block selection is in process, it is set to wxGridNoCellCoords + wxGridCellCoords m_selectedBlockCorner; + + wxGridSelection *m_selection; + + wxColour m_selectionBackground; + wxColour m_selectionForeground; + + // NB: *never* access m_row/col arrays directly because they are created + // on demand, *always* use accessor functions instead! + + // init the m_rowHeights/Bottoms arrays with default values + void InitRowHeights(); + + int m_defaultRowHeight; + int m_minAcceptableRowHeight; + wxArrayInt m_rowHeights; + wxArrayInt m_rowBottoms; + + // init the m_colWidths/Rights arrays + void InitColWidths(); + + int m_defaultColWidth; + int m_minAcceptableColWidth; + wxArrayInt m_colWidths; + wxArrayInt m_colRights; + + int m_sortCol; + bool m_sortIsAscending; + + bool m_useNativeHeader, + m_nativeColumnLabels; + + // get the col/row coords + int GetColWidth(int col) const; + int GetColLeft(int col) const; + int GetColRight(int col) const; + + // this function must be public for compatibility... +public: + int GetRowHeight(int row) const; +protected: + + int GetRowTop(int row) const; + int GetRowBottom(int row) const; + + int m_rowLabelWidth; + int m_colLabelHeight; + + // the size of the margin left to the right and bottom of the cell area + int m_extraWidth, + m_extraHeight; + + wxColour m_labelBackgroundColour; + wxColour m_labelTextColour; + wxFont m_labelFont; + + int m_rowLabelHorizAlign; + int m_rowLabelVertAlign; + int m_colLabelHorizAlign; + int m_colLabelVertAlign; + int m_colLabelTextOrientation; + + bool m_defaultRowLabelValues; + bool m_defaultColLabelValues; + + wxColour m_gridLineColour; + bool m_gridLinesEnabled; + bool m_gridLinesClipHorz, + m_gridLinesClipVert; + wxColour m_cellHighlightColour; + int m_cellHighlightPenWidth; + int m_cellHighlightROPenWidth; + + + // common part of AutoSizeColumn/Row() and GetBestSize() + int SetOrCalcColumnSizes(bool calcOnly, bool setAsMin = true); + int SetOrCalcRowSizes(bool calcOnly, bool setAsMin = true); + + // common part of AutoSizeColumn/Row() + void AutoSizeColOrRow(int n, bool setAsMin, wxGridDirection direction); + + // Calculate the minimum acceptable size for labels area + wxCoord CalcColOrRowLabelAreaMinSize(wxGridDirection direction); + + // if a column has a minimal width, it will be the value for it in this + // hash table + wxLongToLongHashMap m_colMinWidths, + m_rowMinHeights; + + // get the minimal width of the given column/row + int GetColMinimalWidth(int col) const; + int GetRowMinimalHeight(int col) const; + + // do we have some place to store attributes in? + bool CanHaveAttributes() const; + + // cell attribute cache (currently we only cache 1, may be will do + // more/better later) + struct CachedAttr + { + int row, col; + wxGridCellAttr *attr; + } m_attrCache; + + // invalidates the attribute cache + void ClearAttrCache(); + + // adds an attribute to cache + void CacheAttr(int row, int col, wxGridCellAttr *attr) const; + + // looks for an attr in cache, returns true if found + bool LookupAttr(int row, int col, wxGridCellAttr **attr) const; + + // looks for the attr in cache, if not found asks the table and caches the + // result + wxGridCellAttr *GetCellAttr(int row, int col) const; + wxGridCellAttr *GetCellAttr(const wxGridCellCoords& coords ) const + { return GetCellAttr( coords.GetRow(), coords.GetCol() ); } + + // the default cell attr object for cells that don't have their own + wxGridCellAttr* m_defaultCellAttr; + + + bool m_inOnKeyDown; + int m_batchCount; + + + wxGridTypeRegistry* m_typeRegistry; + + enum CursorMode + { + WXGRID_CURSOR_SELECT_CELL, + WXGRID_CURSOR_RESIZE_ROW, + WXGRID_CURSOR_RESIZE_COL, + WXGRID_CURSOR_SELECT_ROW, + WXGRID_CURSOR_SELECT_COL, + WXGRID_CURSOR_MOVE_COL + }; + + // this method not only sets m_cursorMode but also sets the correct cursor + // for the given mode and, if captureMouse is not false releases the mouse + // if it was captured and captures it if it must be captured + // + // for this to work, you should always use it and not set m_cursorMode + // directly! + void ChangeCursorMode(CursorMode mode, + wxWindow *win = NULL, + bool captureMouse = true); + + wxWindow *m_winCapture; // the window which captured the mouse + + // this variable is used not for finding the correct current cursor but + // mainly for finding out what is going to happen if the mouse starts being + // dragged right now + // + // by default it is WXGRID_CURSOR_SELECT_CELL meaning that nothing else is + // going on, and it is set to one of RESIZE/SELECT/MOVE values while the + // corresponding operation will be started if the user starts dragging the + // mouse from the current position + CursorMode m_cursorMode; + + + //Column positions + wxArrayInt m_colAt; + + bool m_canDragRowSize; + bool m_canDragColSize; + bool m_canDragColMove; + bool m_canDragGridSize; + bool m_canDragCell; + + // the last position (horizontal or vertical depending on whether the user + // is resizing a column or a row) where a row or column separator line was + // dragged by the user or -1 of there is no drag operation in progress + int m_dragLastPos; + int m_dragRowOrCol; + + // true if a drag operation is in progress; when this is true, + // m_startDragPos is valid, i.e. not wxDefaultPosition + bool m_isDragging; + + // the position (in physical coordinates) where the user started dragging + // the mouse or wxDefaultPosition if mouse isn't being dragged + // + // notice that this can be != wxDefaultPosition while m_isDragging is still + // false because we wait until the mouse is moved some distance away before + // setting m_isDragging to true + wxPoint m_startDragPos; + + bool m_waitForSlowClick; + + wxGridCellCoords m_selectionStart; + + wxCursor m_rowResizeCursor; + wxCursor m_colResizeCursor; + + bool m_editable; // applies to whole grid + bool m_cellEditCtrlEnabled; // is in-place edit currently shown? + + TabBehaviour m_tabBehaviour; // determines how the TAB key behaves + + void Init(); // common part of all ctors + void Create(); + void CreateColumnWindow(); + void CalcDimensions(); + void CalcWindowSizes(); + bool Redimension( wxGridTableMessage& ); + + + // generate the appropriate grid event and return -1 if it was vetoed, 1 if + // it was processed (but not vetoed) and 0 if it wasn't processed + int SendEvent(const wxEventType evtType, + int row, int col, + const wxMouseEvent& e); + int SendEvent(const wxEventType evtType, + const wxGridCellCoords& coords, + const wxMouseEvent& e) + { return SendEvent(evtType, coords.GetRow(), coords.GetCol(), e); } + int SendEvent(const wxEventType evtType, + int row, int col, + const wxString& s = wxString()); + int SendEvent(const wxEventType evtType, + const wxGridCellCoords& coords, + const wxString& s = wxString()) + { return SendEvent(evtType, coords.GetRow(), coords.GetCol(), s); } + int SendEvent(const wxEventType evtType, const wxString& s = wxString()) + { return SendEvent(evtType, m_currentCellCoords, s); } + + // send wxEVT_GRID_{ROW,COL}_SIZE or wxEVT_GRID_COL_AUTO_SIZE, return true + // if the event was processed, false otherwise + bool SendGridSizeEvent(wxEventType type, + int row, int col, + const wxMouseEvent& mouseEv); + + void OnPaint( wxPaintEvent& ); + void OnSize( wxSizeEvent& ); + void OnKeyDown( wxKeyEvent& ); + void OnKeyUp( wxKeyEvent& ); + void OnChar( wxKeyEvent& ); + void OnEraseBackground( wxEraseEvent& ); + void OnHideEditor( wxCommandEvent& ); + + + bool SetCurrentCell( const wxGridCellCoords& coords ); + bool SetCurrentCell( int row, int col ) + { return SetCurrentCell( wxGridCellCoords(row, col) ); } + + + // this function is called to extend the block being currently selected + // from mouse and keyboard event handlers + void UpdateBlockBeingSelected(int topRow, int leftCol, + int bottomRow, int rightCol); + + void UpdateBlockBeingSelected(const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight) + { UpdateBlockBeingSelected(topLeft.GetRow(), topLeft.GetCol(), + bottomRight.GetRow(), bottomRight.GetCol()); } + + // ------ functions to get/send data (see also public functions) + // + bool GetModelValues(); + bool SetModelValues(); + + friend class WXDLLIMPEXP_FWD_ADV wxGridSelection; + friend class wxGridRowOperations; + friend class wxGridColumnOperations; + + // they call our private Process{{Corner,Col,Row}Label,GridCell}MouseEvent() + friend class wxGridCornerLabelWindow; + friend class wxGridColLabelWindow; + friend class wxGridRowLabelWindow; + friend class wxGridWindow; + friend class wxGridHeaderRenderer; + + friend class wxGridHeaderCtrl; + +private: + + // implement wxScrolledWindow method to return m_gridWin size + virtual wxSize GetSizeAvailableForScrollTarget(const wxSize& size); + + // redraw the grid lines, should be called after changing their attributes + void RedrawGridLines(); + + // draw all grid lines in the given cell region (unlike the public + // DrawAllGridLines() which just draws all of them) + void DrawRangeGridLines(wxDC& dc, const wxRegion& reg, + const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight); + + // draw all lines from top to bottom row and left to right column in the + // rectangle determined by (top, left)-(bottom, right) -- but notice that + // the caller must have set up the clipping correctly, this rectangle is + // only used here for optimization + void DoDrawGridLines(wxDC& dc, + int top, int left, + int bottom, int right, + int topRow, int leftCol, + int bottomRight, int rightCol); + + // common part of Clip{Horz,Vert}GridLines + void DoClipGridLines(bool& var, bool clip); + + // update the sorting indicator shown in the specified column (whose index + // must be valid) + // + // this will use GetSortingColumn() and IsSortOrderAscending() to determine + // the sorting indicator to effectively show + void UpdateColumnSortingIndicator(int col); + + // update the grid after changing the columns order (common part of + // SetColPos() and ResetColPos()) + void RefreshAfterColPosChange(); + + + // return the position (not index) of the column at the given logical pixel + // position + // + // this always returns a valid position, even if the coordinate is out of + // bounds (in which case first/last column is returned) + int XToPos(int x) const; + + + // event handlers and their helpers + // -------------------------------- + + // process mouse drag event in WXGRID_CURSOR_SELECT_CELL mode + bool DoGridCellDrag(wxMouseEvent& event, + const wxGridCellCoords& coords, + bool isFirstDrag); + + // process row/column resizing drag event + void DoGridLineDrag(wxMouseEvent& event, const wxGridOperations& oper); + + // process mouse drag event in the grid window + void DoGridDragEvent(wxMouseEvent& event, const wxGridCellCoords& coords); + + // process different clicks on grid cells + void DoGridCellLeftDown(wxMouseEvent& event, + const wxGridCellCoords& coords, + const wxPoint& pos); + void DoGridCellLeftDClick(wxMouseEvent& event, + const wxGridCellCoords& coords, + const wxPoint& pos); + void DoGridCellLeftUp(wxMouseEvent& event, const wxGridCellCoords& coords); + + // process movement (but not dragging) event in the grid cell area + void DoGridMouseMoveEvent(wxMouseEvent& event, + const wxGridCellCoords& coords, + const wxPoint& pos); + + // process mouse events in the grid window + void ProcessGridCellMouseEvent(wxMouseEvent& event); + + // process mouse events in the row/column labels/corner windows + void ProcessRowLabelMouseEvent(wxMouseEvent& event); + void ProcessColLabelMouseEvent(wxMouseEvent& event); + void ProcessCornerLabelMouseEvent(wxMouseEvent& event); + + void DoColHeaderClick(int col); + + void DoStartResizeCol(int col); + void DoUpdateResizeCol(int x); + void DoUpdateResizeColWidth(int w); + void DoStartMoveCol(int col); + + void DoEndDragResizeRow(const wxMouseEvent& event); + void DoEndDragResizeCol(const wxMouseEvent& event); + void DoEndMoveCol(int pos); + + // process a TAB keypress + void DoGridProcessTab(wxKeyboardState& kbdState); + + // common implementations of methods defined for both rows and columns + void DeselectLine(int line, const wxGridOperations& oper); + bool DoEndDragResizeLine(const wxGridOperations& oper); + int PosToLinePos(int pos, bool clipToMinMax, + const wxGridOperations& oper) const; + int PosToLine(int pos, bool clipToMinMax, + const wxGridOperations& oper) const; + int PosToEdgeOfLine(int pos, const wxGridOperations& oper) const; + + bool DoMoveCursor(bool expandSelection, + const wxGridDirectionOperations& diroper); + bool DoMoveCursorByPage(const wxGridDirectionOperations& diroper); + bool DoMoveCursorByBlock(bool expandSelection, + const wxGridDirectionOperations& diroper); + void AdvanceToNextNonEmpty(wxGridCellCoords& coords, + const wxGridDirectionOperations& diroper); + + // common part of {Insert,Delete}{Rows,Cols} + bool DoModifyLines(bool (wxGridTableBase::*funcModify)(size_t, size_t), + int pos, int num, bool updateLabels); + // Append{Rows,Cols} is a bit different because of one less parameter + bool DoAppendLines(bool (wxGridTableBase::*funcAppend)(size_t), + int num, bool updateLabels); + + // common part of Set{Col,Row}Sizes + void DoSetSizes(const wxGridSizesInfo& sizeInfo, + const wxGridOperations& oper); + + // common part of Disable{Row,Col}Resize and CanDrag{Row,Col}Size + void DoDisableLineResize(int line, wxGridFixedIndicesSet *& setFixed); + bool DoCanResizeLine(int line, const wxGridFixedIndicesSet *setFixed) const; + + // Helper of Render(): get grid size, origin offset and fill cell arrays + void GetRenderSizes( const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight, + wxPoint& pointOffSet, wxSize& sizeGrid, + wxGridCellCoordsArray& renderCells, + wxArrayInt& arrayCols, wxArrayInt& arrayRows ); + + // Helper of Render(): set the scale to draw the cells at the right size. + void SetRenderScale( wxDC& dc, const wxPoint& pos, const wxSize& size, + const wxSize& sizeGrid ); + + // Helper of Render(): get render start position from passed parameter + wxPoint GetRenderPosition( wxDC& dc, const wxPoint& position ); + + // Helper of Render(): draws a box around the rendered area + void DoRenderBox( wxDC& dc, const int& style, + const wxPoint& pointOffSet, + const wxSize& sizeCellArea, + const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight ); + + // Implementation of public Set{Row,Col}Size() and {Hide,Show}{Row,Col}(). + // They interpret their height or width parameter slightly different from + // the public methods where -1 in it means "auto fit to the label" for the + // compatibility reasons. Here it means "show a previously hidden row or + // column" while 0 means "hide it" just as in the public methods. And any + // positive values are handled naturally, i.e. they just specify the size. + void DoSetRowSize( int row, int height ); + void DoSetColSize( int col, int width ); + + + // these sets contain the indices of fixed, i.e. non-resizable + // interactively, grid rows or columns and are NULL if there are no fixed + // elements (which is the default) + wxGridFixedIndicesSet *m_setFixedRows, + *m_setFixedCols; + + DECLARE_DYNAMIC_CLASS( wxGrid ) + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxGrid); +}; + +// ---------------------------------------------------------------------------- +// wxGridUpdateLocker prevents updates to a grid during its lifetime +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGridUpdateLocker +{ +public: + // if the pointer is NULL, Create() can be called later + wxGridUpdateLocker(wxGrid *grid = NULL) + { + Init(grid); + } + + // can be called if ctor was used with a NULL pointer, must not be called + // more than once + void Create(wxGrid *grid) + { + wxASSERT_MSG( !m_grid, wxT("shouldn't be called more than once") ); + + Init(grid); + } + + ~wxGridUpdateLocker() + { + if ( m_grid ) + m_grid->EndBatch(); + } + +private: + void Init(wxGrid *grid) + { + m_grid = grid; + if ( m_grid ) + m_grid->BeginBatch(); + } + + wxGrid *m_grid; + + wxDECLARE_NO_COPY_CLASS(wxGridUpdateLocker); +}; + +// ---------------------------------------------------------------------------- +// Grid event class and event types +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGridEvent : public wxNotifyEvent, + public wxKeyboardState +{ +public: + wxGridEvent() + : wxNotifyEvent() + { + Init(-1, -1, -1, -1, false); + } + + wxGridEvent(int id, + wxEventType type, + wxObject* obj, + int row = -1, int col = -1, + int x = -1, int y = -1, + bool sel = true, + const wxKeyboardState& kbd = wxKeyboardState()) + : wxNotifyEvent(type, id), + wxKeyboardState(kbd) + { + Init(row, col, x, y, sel); + SetEventObject(obj); + } + + // explicitly specifying inline allows gcc < 3.4 to + // handle the deprecation attribute even in the constructor. + wxDEPRECATED_CONSTRUCTOR( + wxGridEvent(int id, + wxEventType type, + wxObject* obj, + int row, int col, + int x, int y, + bool sel, + bool control, + bool shift = false, bool alt = false, bool meta = false)); + + virtual int GetRow() { return m_row; } + virtual int GetCol() { return m_col; } + wxPoint GetPosition() { return wxPoint( m_x, m_y ); } + bool Selecting() { return m_selecting; } + + virtual wxEvent *Clone() const { return new wxGridEvent(*this); } + +protected: + int m_row; + int m_col; + int m_x; + int m_y; + bool m_selecting; + +private: + void Init(int row, int col, int x, int y, bool sel) + { + m_row = row; + m_col = col; + m_x = x; + m_y = y; + m_selecting = sel; + } + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxGridEvent) +}; + +class WXDLLIMPEXP_ADV wxGridSizeEvent : public wxNotifyEvent, + public wxKeyboardState +{ +public: + wxGridSizeEvent() + : wxNotifyEvent() + { + Init(-1, -1, -1); + } + + wxGridSizeEvent(int id, + wxEventType type, + wxObject* obj, + int rowOrCol = -1, + int x = -1, int y = -1, + const wxKeyboardState& kbd = wxKeyboardState()) + : wxNotifyEvent(type, id), + wxKeyboardState(kbd) + { + Init(rowOrCol, x, y); + + SetEventObject(obj); + } + + wxDEPRECATED_CONSTRUCTOR( + wxGridSizeEvent(int id, + wxEventType type, + wxObject* obj, + int rowOrCol, + int x, int y, + bool control, + bool shift = false, + bool alt = false, + bool meta = false) ); + + int GetRowOrCol() { return m_rowOrCol; } + wxPoint GetPosition() { return wxPoint( m_x, m_y ); } + + virtual wxEvent *Clone() const { return new wxGridSizeEvent(*this); } + +protected: + int m_rowOrCol; + int m_x; + int m_y; + +private: + void Init(int rowOrCol, int x, int y) + { + m_rowOrCol = rowOrCol; + m_x = x; + m_y = y; + } + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxGridSizeEvent) +}; + + +class WXDLLIMPEXP_ADV wxGridRangeSelectEvent : public wxNotifyEvent, + public wxKeyboardState +{ +public: + wxGridRangeSelectEvent() + : wxNotifyEvent() + { + Init(wxGridNoCellCoords, wxGridNoCellCoords, false); + } + + wxGridRangeSelectEvent(int id, + wxEventType type, + wxObject* obj, + const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight, + bool sel = true, + const wxKeyboardState& kbd = wxKeyboardState()) + : wxNotifyEvent(type, id), + wxKeyboardState(kbd) + { + Init(topLeft, bottomRight, sel); + + SetEventObject(obj); + } + + wxDEPRECATED_CONSTRUCTOR( + wxGridRangeSelectEvent(int id, + wxEventType type, + wxObject* obj, + const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight, + bool sel, + bool control, + bool shift = false, + bool alt = false, + bool meta = false) ); + + wxGridCellCoords GetTopLeftCoords() { return m_topLeft; } + wxGridCellCoords GetBottomRightCoords() { return m_bottomRight; } + int GetTopRow() { return m_topLeft.GetRow(); } + int GetBottomRow() { return m_bottomRight.GetRow(); } + int GetLeftCol() { return m_topLeft.GetCol(); } + int GetRightCol() { return m_bottomRight.GetCol(); } + bool Selecting() { return m_selecting; } + + virtual wxEvent *Clone() const { return new wxGridRangeSelectEvent(*this); } + +protected: + void Init(const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight, + bool selecting) + { + m_topLeft = topLeft; + m_bottomRight = bottomRight; + m_selecting = selecting; + } + + wxGridCellCoords m_topLeft; + wxGridCellCoords m_bottomRight; + bool m_selecting; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxGridRangeSelectEvent) +}; + + +class WXDLLIMPEXP_ADV wxGridEditorCreatedEvent : public wxCommandEvent +{ +public: + wxGridEditorCreatedEvent() + : wxCommandEvent() + { + m_row = 0; + m_col = 0; + m_ctrl = NULL; + } + + wxGridEditorCreatedEvent(int id, wxEventType type, wxObject* obj, + int row, int col, wxControl* ctrl); + + int GetRow() { return m_row; } + int GetCol() { return m_col; } + wxControl* GetControl() { return m_ctrl; } + void SetRow(int row) { m_row = row; } + void SetCol(int col) { m_col = col; } + void SetControl(wxControl* ctrl) { m_ctrl = ctrl; } + + virtual wxEvent *Clone() const { return new wxGridEditorCreatedEvent(*this); } + +private: + int m_row; + int m_col; + wxControl* m_ctrl; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxGridEditorCreatedEvent) +}; + + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_LEFT_CLICK, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_RIGHT_DCLICK, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_LABEL_LEFT_DCLICK, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_LABEL_RIGHT_DCLICK, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_ROW_SIZE, wxGridSizeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_SIZE, wxGridSizeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_AUTO_SIZE, wxGridSizeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_RANGE_SELECT, wxGridRangeSelectEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_CHANGING, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_CHANGED, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_SELECT_CELL, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_EDITOR_SHOWN, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_EDITOR_HIDDEN, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_EDITOR_CREATED, wxGridEditorCreatedEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_BEGIN_DRAG, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_MOVE, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_SORT, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_TABBING, wxGridEvent ); + +typedef void (wxEvtHandler::*wxGridEventFunction)(wxGridEvent&); +typedef void (wxEvtHandler::*wxGridSizeEventFunction)(wxGridSizeEvent&); +typedef void (wxEvtHandler::*wxGridRangeSelectEventFunction)(wxGridRangeSelectEvent&); +typedef void (wxEvtHandler::*wxGridEditorCreatedEventFunction)(wxGridEditorCreatedEvent&); + +#define wxGridEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxGridEventFunction, func) + +#define wxGridSizeEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxGridSizeEventFunction, func) + +#define wxGridRangeSelectEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxGridRangeSelectEventFunction, func) + +#define wxGridEditorCreatedEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxGridEditorCreatedEventFunction, func) + +#define wx__DECLARE_GRIDEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_GRID_ ## evt, id, wxGridEventHandler(fn)) + +#define wx__DECLARE_GRIDSIZEEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_GRID_ ## evt, id, wxGridSizeEventHandler(fn)) + +#define wx__DECLARE_GRIDRANGESELEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_GRID_ ## evt, id, wxGridRangeSelectEventHandler(fn)) + +#define wx__DECLARE_GRIDEDITOREVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_GRID_ ## evt, id, wxGridEditorCreatedEventHandler(fn)) + +#define EVT_GRID_CMD_CELL_LEFT_CLICK(id, fn) wx__DECLARE_GRIDEVT(CELL_LEFT_CLICK, id, fn) +#define EVT_GRID_CMD_CELL_RIGHT_CLICK(id, fn) wx__DECLARE_GRIDEVT(CELL_RIGHT_CLICK, id, fn) +#define EVT_GRID_CMD_CELL_LEFT_DCLICK(id, fn) wx__DECLARE_GRIDEVT(CELL_LEFT_DCLICK, id, fn) +#define EVT_GRID_CMD_CELL_RIGHT_DCLICK(id, fn) wx__DECLARE_GRIDEVT(CELL_RIGHT_DCLICK, id, fn) +#define EVT_GRID_CMD_LABEL_LEFT_CLICK(id, fn) wx__DECLARE_GRIDEVT(LABEL_LEFT_CLICK, id, fn) +#define EVT_GRID_CMD_LABEL_RIGHT_CLICK(id, fn) wx__DECLARE_GRIDEVT(LABEL_RIGHT_CLICK, id, fn) +#define EVT_GRID_CMD_LABEL_LEFT_DCLICK(id, fn) wx__DECLARE_GRIDEVT(LABEL_LEFT_DCLICK, id, fn) +#define EVT_GRID_CMD_LABEL_RIGHT_DCLICK(id, fn) wx__DECLARE_GRIDEVT(LABEL_RIGHT_DCLICK, id, fn) +#define EVT_GRID_CMD_ROW_SIZE(id, fn) wx__DECLARE_GRIDSIZEEVT(ROW_SIZE, id, fn) +#define EVT_GRID_CMD_COL_SIZE(id, fn) wx__DECLARE_GRIDSIZEEVT(COL_SIZE, id, fn) +#define EVT_GRID_CMD_COL_AUTO_SIZE(id, fn) wx__DECLARE_GRIDSIZEEVT(COL_AUTO_SIZE, id, fn) +#define EVT_GRID_CMD_COL_MOVE(id, fn) wx__DECLARE_GRIDEVT(COL_MOVE, id, fn) +#define EVT_GRID_CMD_COL_SORT(id, fn) wx__DECLARE_GRIDEVT(COL_SORT, id, fn) +#define EVT_GRID_CMD_RANGE_SELECT(id, fn) wx__DECLARE_GRIDRANGESELEVT(RANGE_SELECT, id, fn) +#define EVT_GRID_CMD_CELL_CHANGING(id, fn) wx__DECLARE_GRIDEVT(CELL_CHANGING, id, fn) +#define EVT_GRID_CMD_CELL_CHANGED(id, fn) wx__DECLARE_GRIDEVT(CELL_CHANGED, id, fn) +#define EVT_GRID_CMD_SELECT_CELL(id, fn) wx__DECLARE_GRIDEVT(SELECT_CELL, id, fn) +#define EVT_GRID_CMD_EDITOR_SHOWN(id, fn) wx__DECLARE_GRIDEVT(EDITOR_SHOWN, id, fn) +#define EVT_GRID_CMD_EDITOR_HIDDEN(id, fn) wx__DECLARE_GRIDEVT(EDITOR_HIDDEN, id, fn) +#define EVT_GRID_CMD_EDITOR_CREATED(id, fn) wx__DECLARE_GRIDEDITOREVT(EDITOR_CREATED, id, fn) +#define EVT_GRID_CMD_CELL_BEGIN_DRAG(id, fn) wx__DECLARE_GRIDEVT(CELL_BEGIN_DRAG, id, fn) +#define EVT_GRID_CMD_TABBING(id, fn) wx__DECLARE_GRIDEVT(TABBING, id, fn) + +// same as above but for any id (exists mainly for backwards compatibility but +// then it's also true that you rarely have multiple grid in the same window) +#define EVT_GRID_CELL_LEFT_CLICK(fn) EVT_GRID_CMD_CELL_LEFT_CLICK(wxID_ANY, fn) +#define EVT_GRID_CELL_RIGHT_CLICK(fn) EVT_GRID_CMD_CELL_RIGHT_CLICK(wxID_ANY, fn) +#define EVT_GRID_CELL_LEFT_DCLICK(fn) EVT_GRID_CMD_CELL_LEFT_DCLICK(wxID_ANY, fn) +#define EVT_GRID_CELL_RIGHT_DCLICK(fn) EVT_GRID_CMD_CELL_RIGHT_DCLICK(wxID_ANY, fn) +#define EVT_GRID_LABEL_LEFT_CLICK(fn) EVT_GRID_CMD_LABEL_LEFT_CLICK(wxID_ANY, fn) +#define EVT_GRID_LABEL_RIGHT_CLICK(fn) EVT_GRID_CMD_LABEL_RIGHT_CLICK(wxID_ANY, fn) +#define EVT_GRID_LABEL_LEFT_DCLICK(fn) EVT_GRID_CMD_LABEL_LEFT_DCLICK(wxID_ANY, fn) +#define EVT_GRID_LABEL_RIGHT_DCLICK(fn) EVT_GRID_CMD_LABEL_RIGHT_DCLICK(wxID_ANY, fn) +#define EVT_GRID_ROW_SIZE(fn) EVT_GRID_CMD_ROW_SIZE(wxID_ANY, fn) +#define EVT_GRID_COL_SIZE(fn) EVT_GRID_CMD_COL_SIZE(wxID_ANY, fn) +#define EVT_GRID_COL_AUTO_SIZE(fn) EVT_GRID_CMD_COL_AUTO_SIZE(wxID_ANY, fn) +#define EVT_GRID_COL_MOVE(fn) EVT_GRID_CMD_COL_MOVE(wxID_ANY, fn) +#define EVT_GRID_COL_SORT(fn) EVT_GRID_CMD_COL_SORT(wxID_ANY, fn) +#define EVT_GRID_RANGE_SELECT(fn) EVT_GRID_CMD_RANGE_SELECT(wxID_ANY, fn) +#define EVT_GRID_CELL_CHANGING(fn) EVT_GRID_CMD_CELL_CHANGING(wxID_ANY, fn) +#define EVT_GRID_CELL_CHANGED(fn) EVT_GRID_CMD_CELL_CHANGED(wxID_ANY, fn) +#define EVT_GRID_SELECT_CELL(fn) EVT_GRID_CMD_SELECT_CELL(wxID_ANY, fn) +#define EVT_GRID_EDITOR_SHOWN(fn) EVT_GRID_CMD_EDITOR_SHOWN(wxID_ANY, fn) +#define EVT_GRID_EDITOR_HIDDEN(fn) EVT_GRID_CMD_EDITOR_HIDDEN(wxID_ANY, fn) +#define EVT_GRID_EDITOR_CREATED(fn) EVT_GRID_CMD_EDITOR_CREATED(wxID_ANY, fn) +#define EVT_GRID_CELL_BEGIN_DRAG(fn) EVT_GRID_CMD_CELL_BEGIN_DRAG(wxID_ANY, fn) +#define EVT_GRID_TABBING(fn) EVT_GRID_CMD_TABBING(wxID_ANY, fn) + +// we used to have a single wxEVT_GRID_CELL_CHANGE event but it was split into +// wxEVT_GRID_CELL_CHANGING and CHANGED ones in wx 2.9.0, however the CHANGED +// is basically the same as the old CHANGE event so we keep the name for +// compatibility +#if WXWIN_COMPATIBILITY_2_8 + #define wxEVT_GRID_CELL_CHANGE wxEVT_GRID_CELL_CHANGED + + #define EVT_GRID_CMD_CELL_CHANGE EVT_GRID_CMD_CELL_CHANGED + #define EVT_GRID_CELL_CHANGE EVT_GRID_CELL_CHANGED +#endif // WXWIN_COMPATIBILITY_2_8 + +#if 0 // TODO: implement these ? others ? + +extern const int wxEVT_GRID_CREATE_CELL; +extern const int wxEVT_GRID_CHANGE_LABELS; +extern const int wxEVT_GRID_CHANGE_SEL_LABEL; + +#define EVT_GRID_CREATE_CELL(fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CREATE_CELL, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxGridEventFunction, &fn ), NULL ), +#define EVT_GRID_CHANGE_LABELS(fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CHANGE_LABELS, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxGridEventFunction, &fn ), NULL ), +#define EVT_GRID_CHANGE_SEL_LABEL(fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CHANGE_SEL_LABEL, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxGridEventFunction, &fn ), NULL ), + +#endif + +#endif // wxUSE_GRID +#endif // _WX_GENERIC_GRID_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/gridctrl.h b/wxmsw/include/wx-3.0/wx/generic/gridctrl.h new file mode 100644 index 00000000..efcb233c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/gridctrl.h @@ -0,0 +1,276 @@ +/////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/gridctrl.h +// Purpose: wxGrid controls +// Author: Paul Gammans, Roger Gammans +// Modified by: +// Created: 11/04/2001 +// Copyright: (c) The Computer Surgery (paul@compsurg.co.uk) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_GRIDCTRL_H_ +#define _WX_GENERIC_GRIDCTRL_H_ + +#include "wx/grid.h" + +#if wxUSE_GRID + +#define wxGRID_VALUE_CHOICEINT wxT("choiceint") +#define wxGRID_VALUE_DATETIME wxT("datetime") + + +// the default renderer for the cells containing string data +class WXDLLIMPEXP_ADV wxGridCellStringRenderer : public wxGridCellRenderer +{ +public: + // draw the string + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected); + + // return the string extent + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col); + + virtual wxGridCellRenderer *Clone() const + { return new wxGridCellStringRenderer; } + +protected: + // set the text colours before drawing + void SetTextColoursAndFont(const wxGrid& grid, + const wxGridCellAttr& attr, + wxDC& dc, + bool isSelected); + + // calc the string extent for given string/font + wxSize DoGetBestSize(const wxGridCellAttr& attr, + wxDC& dc, + const wxString& text); +}; + +// the default renderer for the cells containing numeric (long) data +class WXDLLIMPEXP_ADV wxGridCellNumberRenderer : public wxGridCellStringRenderer +{ +public: + // draw the string right aligned + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected); + + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col); + + virtual wxGridCellRenderer *Clone() const + { return new wxGridCellNumberRenderer; } + +protected: + wxString GetString(const wxGrid& grid, int row, int col); +}; + +class WXDLLIMPEXP_ADV wxGridCellFloatRenderer : public wxGridCellStringRenderer +{ +public: + wxGridCellFloatRenderer(int width = -1, + int precision = -1, + int format = wxGRID_FLOAT_FORMAT_DEFAULT); + + // get/change formatting parameters + int GetWidth() const { return m_width; } + void SetWidth(int width) { m_width = width; m_format.clear(); } + int GetPrecision() const { return m_precision; } + void SetPrecision(int precision) { m_precision = precision; m_format.clear(); } + int GetFormat() const { return m_style; } + void SetFormat(int format) { m_style = format; m_format.clear(); } + + // draw the string right aligned with given width/precision + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected); + + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col); + + // parameters string format is "width[,precision[,format]]" + // with format being one of f|e|g|E|F|G + virtual void SetParameters(const wxString& params); + + virtual wxGridCellRenderer *Clone() const; + +protected: + wxString GetString(const wxGrid& grid, int row, int col); + +private: + // formatting parameters + int m_width, + m_precision; + + int m_style; + wxString m_format; +}; + +// renderer for boolean fields +class WXDLLIMPEXP_ADV wxGridCellBoolRenderer : public wxGridCellRenderer +{ +public: + // draw a check mark or nothing + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected); + + // return the checkmark size + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col); + + virtual wxGridCellRenderer *Clone() const + { return new wxGridCellBoolRenderer; } + +private: + static wxSize ms_sizeCheckMark; +}; + + +#if wxUSE_DATETIME + +#include "wx/datetime.h" + +// the default renderer for the cells containing times and dates +class WXDLLIMPEXP_ADV wxGridCellDateTimeRenderer : public wxGridCellStringRenderer +{ +public: + wxGridCellDateTimeRenderer(const wxString& outformat = wxDefaultDateTimeFormat, + const wxString& informat = wxDefaultDateTimeFormat); + + // draw the string right aligned + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected); + + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col); + + virtual wxGridCellRenderer *Clone() const; + + // output strptime()-like format string + virtual void SetParameters(const wxString& params); + +protected: + wxString GetString(const wxGrid& grid, int row, int col); + + wxString m_iformat; + wxString m_oformat; + wxDateTime m_dateDef; + wxDateTime::TimeZone m_tz; +}; + +#endif // wxUSE_DATETIME + +// renders a number using the corresponding text string +class WXDLLIMPEXP_ADV wxGridCellEnumRenderer : public wxGridCellStringRenderer +{ +public: + wxGridCellEnumRenderer( const wxString& choices = wxEmptyString ); + + // draw the string right aligned + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected); + + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col); + + virtual wxGridCellRenderer *Clone() const; + + // parameters string format is "item1[,item2[...,itemN]]" where itemN will + // be used if the cell value is N-1 + virtual void SetParameters(const wxString& params); + +protected: + wxString GetString(const wxGrid& grid, int row, int col); + + wxArrayString m_choices; +}; + + +class WXDLLIMPEXP_ADV wxGridCellAutoWrapStringRenderer : public wxGridCellStringRenderer +{ +public: + wxGridCellAutoWrapStringRenderer() : wxGridCellStringRenderer() { } + + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected); + + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col); + + virtual wxGridCellRenderer *Clone() const + { return new wxGridCellAutoWrapStringRenderer; } + +private: + wxArrayString GetTextLines( wxGrid& grid, + wxDC& dc, + const wxGridCellAttr& attr, + const wxRect& rect, + int row, int col); + + // Helper methods of GetTextLines() + + // Break a single logical line of text into several physical lines, all of + // which are added to the lines array. The lines are broken at maxWidth and + // the dc is used for measuring text extent only. + void BreakLine(wxDC& dc, + const wxString& logicalLine, + wxCoord maxWidth, + wxArrayString& lines); + + // Break a word, which is supposed to be wider than maxWidth, into several + // lines, which are added to lines array and the last, incomplete, of which + // is returned in line output parameter. + // + // Returns the width of the last line. + wxCoord BreakWord(wxDC& dc, + const wxString& word, + wxCoord maxWidth, + wxArrayString& lines, + wxString& line); + + +}; + +#endif // wxUSE_GRID +#endif // _WX_GENERIC_GRIDCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/grideditors.h b/wxmsw/include/wx-3.0/wx/generic/grideditors.h new file mode 100644 index 00000000..c45106d3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/grideditors.h @@ -0,0 +1,374 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/grideditors.h +// Purpose: wxGridCellEditorEvtHandler and wxGrid editors +// Author: Michael Bedward (based on code by Julian Smart, Robin Dunn) +// Modified by: Santiago Palacios +// Created: 1/08/1999 +// Copyright: (c) Michael Bedward +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_GRID_EDITORS_H_ +#define _WX_GENERIC_GRID_EDITORS_H_ + +#include "wx/defs.h" + +#if wxUSE_GRID + +#include "wx/scopedptr.h" + +class wxGridCellEditorEvtHandler : public wxEvtHandler +{ +public: + wxGridCellEditorEvtHandler(wxGrid* grid, wxGridCellEditor* editor) + : m_grid(grid), + m_editor(editor), + m_inSetFocus(false) + { + } + + void OnKillFocus(wxFocusEvent& event); + void OnKeyDown(wxKeyEvent& event); + void OnChar(wxKeyEvent& event); + + void SetInSetFocus(bool inSetFocus) { m_inSetFocus = inSetFocus; } + +private: + wxGrid *m_grid; + wxGridCellEditor *m_editor; + + // Work around the fact that a focus kill event can be sent to + // a combobox within a set focus event. + bool m_inSetFocus; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGridCellEditorEvtHandler) + wxDECLARE_NO_COPY_CLASS(wxGridCellEditorEvtHandler); +}; + + +#if wxUSE_TEXTCTRL + +// the editor for string/text data +class WXDLLIMPEXP_ADV wxGridCellTextEditor : public wxGridCellEditor +{ +public: + wxEXPLICIT wxGridCellTextEditor(size_t maxChars = 0); + + virtual void Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler); + virtual void SetSize(const wxRect& rect); + + virtual void PaintBackground(wxDC& dc, + const wxRect& rectCell, + const wxGridCellAttr& attr); + + virtual bool IsAcceptedKey(wxKeyEvent& event); + virtual void BeginEdit(int row, int col, wxGrid* grid); + virtual bool EndEdit(int row, int col, const wxGrid* grid, + const wxString& oldval, wxString *newval); + virtual void ApplyEdit(int row, int col, wxGrid* grid); + + virtual void Reset(); + virtual void StartingKey(wxKeyEvent& event); + virtual void HandleReturn(wxKeyEvent& event); + + // parameters string format is "max_width" + virtual void SetParameters(const wxString& params); + virtual void SetValidator(const wxValidator& validator); + + virtual wxGridCellEditor *Clone() const; + + // added GetValue so we can get the value which is in the control + virtual wxString GetValue() const; + +protected: + wxTextCtrl *Text() const { return (wxTextCtrl *)m_control; } + + // parts of our virtual functions reused by the derived classes + void DoCreate(wxWindow* parent, wxWindowID id, wxEvtHandler* evtHandler, + long style = 0); + void DoBeginEdit(const wxString& startValue); + void DoReset(const wxString& startValue); + +private: + size_t m_maxChars; // max number of chars allowed + wxScopedPtr m_validator; + wxString m_value; + + wxDECLARE_NO_COPY_CLASS(wxGridCellTextEditor); +}; + +// the editor for numeric (long) data +class WXDLLIMPEXP_ADV wxGridCellNumberEditor : public wxGridCellTextEditor +{ +public: + // allows to specify the range - if min == max == -1, no range checking is + // done + wxGridCellNumberEditor(int min = -1, int max = -1); + + virtual void Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler); + + virtual bool IsAcceptedKey(wxKeyEvent& event); + virtual void BeginEdit(int row, int col, wxGrid* grid); + virtual bool EndEdit(int row, int col, const wxGrid* grid, + const wxString& oldval, wxString *newval); + virtual void ApplyEdit(int row, int col, wxGrid* grid); + + virtual void Reset(); + virtual void StartingKey(wxKeyEvent& event); + + // parameters string format is "min,max" + virtual void SetParameters(const wxString& params); + + virtual wxGridCellEditor *Clone() const + { return new wxGridCellNumberEditor(m_min, m_max); } + + // added GetValue so we can get the value which is in the control + virtual wxString GetValue() const; + +protected: +#if wxUSE_SPINCTRL + wxSpinCtrl *Spin() const { return (wxSpinCtrl *)m_control; } +#endif + + // if HasRange(), we use wxSpinCtrl - otherwise wxTextCtrl + bool HasRange() const + { +#if wxUSE_SPINCTRL + return m_min != m_max; +#else + return false; +#endif + } + + // string representation of our value + wxString GetString() const + { return wxString::Format(wxT("%ld"), m_value); } + +private: + int m_min, + m_max; + + long m_value; + + wxDECLARE_NO_COPY_CLASS(wxGridCellNumberEditor); +}; + + +enum wxGridCellFloatFormat +{ + // Decimal floating point (%f) + wxGRID_FLOAT_FORMAT_FIXED = 0x0010, + + // Scientific notation (mantise/exponent) using e character (%e) + wxGRID_FLOAT_FORMAT_SCIENTIFIC = 0x0020, + + // Use the shorter of %e or %f (%g) + wxGRID_FLOAT_FORMAT_COMPACT = 0x0040, + + // To use in combination with one of the above formats (%F/%E/%G) + wxGRID_FLOAT_FORMAT_UPPER = 0x0080, + + // Format used by default. + wxGRID_FLOAT_FORMAT_DEFAULT = wxGRID_FLOAT_FORMAT_FIXED, + + // A mask to extract format from the combination of flags. + wxGRID_FLOAT_FORMAT_MASK = wxGRID_FLOAT_FORMAT_FIXED | + wxGRID_FLOAT_FORMAT_SCIENTIFIC | + wxGRID_FLOAT_FORMAT_COMPACT | + wxGRID_FLOAT_FORMAT_UPPER +}; + +// the editor for floating point numbers (double) data +class WXDLLIMPEXP_ADV wxGridCellFloatEditor : public wxGridCellTextEditor +{ +public: + wxGridCellFloatEditor(int width = -1, + int precision = -1, + int format = wxGRID_FLOAT_FORMAT_DEFAULT); + + virtual void Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler); + + virtual bool IsAcceptedKey(wxKeyEvent& event); + virtual void BeginEdit(int row, int col, wxGrid* grid); + virtual bool EndEdit(int row, int col, const wxGrid* grid, + const wxString& oldval, wxString *newval); + virtual void ApplyEdit(int row, int col, wxGrid* grid); + + virtual void Reset(); + virtual void StartingKey(wxKeyEvent& event); + + virtual wxGridCellEditor *Clone() const + { return new wxGridCellFloatEditor(m_width, m_precision); } + + // parameters string format is "width[,precision[,format]]" + // format to choose beween f|e|g|E|G (f is used by default) + virtual void SetParameters(const wxString& params); + +protected: + // string representation of our value + wxString GetString(); + +private: + int m_width, + m_precision; + double m_value; + + int m_style; + wxString m_format; + + wxDECLARE_NO_COPY_CLASS(wxGridCellFloatEditor); +}; + +#endif // wxUSE_TEXTCTRL + +#if wxUSE_CHECKBOX + +// the editor for boolean data +class WXDLLIMPEXP_ADV wxGridCellBoolEditor : public wxGridCellEditor +{ +public: + wxGridCellBoolEditor() { } + + virtual void Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler); + + virtual void SetSize(const wxRect& rect); + virtual void Show(bool show, wxGridCellAttr *attr = NULL); + + virtual bool IsAcceptedKey(wxKeyEvent& event); + virtual void BeginEdit(int row, int col, wxGrid* grid); + virtual bool EndEdit(int row, int col, const wxGrid* grid, + const wxString& oldval, wxString *newval); + virtual void ApplyEdit(int row, int col, wxGrid* grid); + + virtual void Reset(); + virtual void StartingClick(); + virtual void StartingKey(wxKeyEvent& event); + + virtual wxGridCellEditor *Clone() const + { return new wxGridCellBoolEditor; } + + // added GetValue so we can get the value which is in the control, see + // also UseStringValues() + virtual wxString GetValue() const; + + // set the string values returned by GetValue() for the true and false + // states, respectively + static void UseStringValues(const wxString& valueTrue = wxT("1"), + const wxString& valueFalse = wxEmptyString); + + // return true if the given string is equal to the string representation of + // true value which we currently use + static bool IsTrueValue(const wxString& value); + +protected: + wxCheckBox *CBox() const { return (wxCheckBox *)m_control; } + +private: + bool m_value; + + static wxString ms_stringValues[2]; + + wxDECLARE_NO_COPY_CLASS(wxGridCellBoolEditor); +}; + +#endif // wxUSE_CHECKBOX + +#if wxUSE_COMBOBOX + +// the editor for string data allowing to choose from the list of strings +class WXDLLIMPEXP_ADV wxGridCellChoiceEditor : public wxGridCellEditor +{ +public: + // if !allowOthers, user can't type a string not in choices array + wxGridCellChoiceEditor(size_t count = 0, + const wxString choices[] = NULL, + bool allowOthers = false); + wxGridCellChoiceEditor(const wxArrayString& choices, + bool allowOthers = false); + + virtual void Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler); + + virtual void SetSize(const wxRect& rect); + + virtual void PaintBackground(wxDC& dc, + const wxRect& rectCell, + const wxGridCellAttr& attr); + + virtual void BeginEdit(int row, int col, wxGrid* grid); + virtual bool EndEdit(int row, int col, const wxGrid* grid, + const wxString& oldval, wxString *newval); + virtual void ApplyEdit(int row, int col, wxGrid* grid); + + virtual void Reset(); + + // parameters string format is "item1[,item2[...,itemN]]" + virtual void SetParameters(const wxString& params); + + virtual wxGridCellEditor *Clone() const; + + // added GetValue so we can get the value which is in the control + virtual wxString GetValue() const; + +protected: + wxComboBox *Combo() const { return (wxComboBox *)m_control; } + + wxString m_value; + wxArrayString m_choices; + bool m_allowOthers; + + wxDECLARE_NO_COPY_CLASS(wxGridCellChoiceEditor); +}; + +#endif // wxUSE_COMBOBOX + +#if wxUSE_COMBOBOX + +class WXDLLIMPEXP_ADV wxGridCellEnumEditor : public wxGridCellChoiceEditor +{ +public: + wxGridCellEnumEditor( const wxString& choices = wxEmptyString ); + virtual ~wxGridCellEnumEditor() {} + + virtual wxGridCellEditor* Clone() const; + + virtual void BeginEdit(int row, int col, wxGrid* grid); + virtual bool EndEdit(int row, int col, const wxGrid* grid, + const wxString& oldval, wxString *newval); + virtual void ApplyEdit(int row, int col, wxGrid* grid); + +private: + long m_index; + + wxDECLARE_NO_COPY_CLASS(wxGridCellEnumEditor); +}; + +#endif // wxUSE_COMBOBOX + +class WXDLLIMPEXP_ADV wxGridCellAutoWrapStringEditor : public wxGridCellTextEditor +{ +public: + wxGridCellAutoWrapStringEditor() : wxGridCellTextEditor() { } + virtual void Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler); + + virtual wxGridCellEditor *Clone() const + { return new wxGridCellAutoWrapStringEditor; } + + wxDECLARE_NO_COPY_CLASS(wxGridCellAutoWrapStringEditor); +}; + +#endif // wxUSE_GRID + +#endif // _WX_GENERIC_GRID_EDITORS_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/gridsel.h b/wxmsw/include/wx-3.0/wx/generic/gridsel.h new file mode 100644 index 00000000..76135532 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/gridsel.h @@ -0,0 +1,115 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/gridsel.h +// Purpose: wxGridSelection +// Author: Stefan Neis +// Modified by: +// Created: 20/02/2000 +// Copyright: (c) Stefan Neis +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_GRIDSEL_H_ +#define _WX_GENERIC_GRIDSEL_H_ + +#include "wx/defs.h" + +#if wxUSE_GRID + +#include "wx/grid.h" + +class WXDLLIMPEXP_ADV wxGridSelection +{ +public: + wxGridSelection(wxGrid *grid, + wxGrid::wxGridSelectionModes sel = wxGrid::wxGridSelectCells); + + bool IsSelection(); + bool IsInSelection(int row, int col); + bool IsInSelection(const wxGridCellCoords& coords) + { + return IsInSelection(coords.GetRow(), coords.GetCol()); + } + + void SetSelectionMode(wxGrid::wxGridSelectionModes selmode); + wxGrid::wxGridSelectionModes GetSelectionMode() { return m_selectionMode; } + void SelectRow(int row, const wxKeyboardState& kbd = wxKeyboardState()); + void SelectCol(int col, const wxKeyboardState& kbd = wxKeyboardState()); + void SelectBlock(int topRow, int leftCol, + int bottomRow, int rightCol, + const wxKeyboardState& kbd = wxKeyboardState(), + bool sendEvent = true ); + void SelectBlock(const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight, + const wxKeyboardState& kbd = wxKeyboardState(), + bool sendEvent = true ) + { + SelectBlock(topLeft.GetRow(), topLeft.GetCol(), + bottomRight.GetRow(), bottomRight.GetCol(), + kbd, sendEvent); + } + + void SelectCell(int row, int col, + const wxKeyboardState& kbd = wxKeyboardState(), + bool sendEvent = true); + void SelectCell(const wxGridCellCoords& coords, + const wxKeyboardState& kbd = wxKeyboardState(), + bool sendEvent = true) + { + SelectCell(coords.GetRow(), coords.GetCol(), kbd, sendEvent); + } + + void ToggleCellSelection(int row, int col, + const wxKeyboardState& kbd = wxKeyboardState()); + void ToggleCellSelection(const wxGridCellCoords& coords, + const wxKeyboardState& kbd = wxKeyboardState()) + { + ToggleCellSelection(coords.GetRow(), coords.GetCol(), kbd); + } + + void ClearSelection(); + + void UpdateRows( size_t pos, int numRows ); + void UpdateCols( size_t pos, int numCols ); + +private: + int BlockContain( int topRow1, int leftCol1, + int bottomRow1, int rightCol1, + int topRow2, int leftCol2, + int bottomRow2, int rightCol2 ); + // returns 1, if Block1 contains Block2, + // -1, if Block2 contains Block1, + // 0, otherwise + + int BlockContainsCell( int topRow, int leftCol, + int bottomRow, int rightCol, + int row, int col ) + // returns 1, if Block contains Cell, + // 0, otherwise + { + return ( topRow <= row && row <= bottomRow && + leftCol <= col && col <= rightCol ); + } + + void SelectBlockNoEvent(int topRow, int leftCol, + int bottomRow, int rightCol) + { + SelectBlock(topRow, leftCol, bottomRow, rightCol, + wxKeyboardState(), false); + } + + wxGridCellCoordsArray m_cellSelection; + wxGridCellCoordsArray m_blockSelectionTopLeft; + wxGridCellCoordsArray m_blockSelectionBottomRight; + wxArrayInt m_rowSelection; + wxArrayInt m_colSelection; + + wxGrid *m_grid; + wxGrid::wxGridSelectionModes m_selectionMode; + + friend class WXDLLIMPEXP_FWD_ADV wxGrid; + + wxDECLARE_NO_COPY_CLASS(wxGridSelection); +}; + +#endif // wxUSE_GRID +#endif // _WX_GENERIC_GRIDSEL_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/headerctrlg.h b/wxmsw/include/wx-3.0/wx/generic/headerctrlg.h new file mode 100644 index 00000000..d2eceb2b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/headerctrlg.h @@ -0,0 +1,181 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/headerctrlg.h +// Purpose: Generic wxHeaderCtrl implementation +// Author: Vadim Zeitlin +// Created: 2008-12-01 +// Copyright: (c) 2008 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_HEADERCTRLG_H_ +#define _WX_GENERIC_HEADERCTRLG_H_ + +#include "wx/event.h" +#include "wx/vector.h" +#include "wx/overlay.h" + +// ---------------------------------------------------------------------------- +// wxHeaderCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxHeaderCtrl : public wxHeaderCtrlBase +{ +public: + wxHeaderCtrl() + { + Init(); + } + + wxHeaderCtrl(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHD_DEFAULT_STYLE, + const wxString& name = wxHeaderCtrlNameStr) + { + Init(); + + Create(parent, id, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHD_DEFAULT_STYLE, + const wxString& name = wxHeaderCtrlNameStr); + + virtual ~wxHeaderCtrl(); + +protected: + virtual wxSize DoGetBestSize() const; + + +private: + // implement base class pure virtuals + virtual void DoSetCount(unsigned int count); + virtual unsigned int DoGetCount() const; + virtual void DoUpdate(unsigned int idx); + + virtual void DoScrollHorz(int dx); + + virtual void DoSetColumnsOrder(const wxArrayInt& order); + virtual wxArrayInt DoGetColumnsOrder() const; + + // common part of all ctors + void Init(); + + // event handlers + void OnPaint(wxPaintEvent& event); + void OnMouse(wxMouseEvent& event); + void OnKeyDown(wxKeyEvent& event); + void OnCaptureLost(wxMouseCaptureLostEvent& event); + + // move the column with given idx at given position (this doesn't generate + // any events but does refresh the display) + void DoMoveCol(unsigned int idx, unsigned int pos); + + // return the horizontal start position of the given column in physical + // coordinates + int GetColStart(unsigned int idx) const; + + // and the end position + int GetColEnd(unsigned int idx) const; + + // refresh the given column [only]; idx must be valid + void RefreshCol(unsigned int idx); + + // refresh the given column if idx is valid + void RefreshColIfNotNone(unsigned int idx); + + // refresh all the controls starting from (and including) the given one + void RefreshColsAfter(unsigned int idx); + + // return the column at the given position or -1 if it is beyond the + // rightmost column and put true into onSeparator output parameter if the + // position is near the divider at the right end of this column (notice + // that this means that we return column 0 even if the position is over + // column 1 but close enough to the divider separating it from column 0) + unsigned int FindColumnAtPoint(int x, bool *onSeparator = NULL) const; + + // return true if a drag resizing operation is currently in progress + bool IsResizing() const; + + // return true if a drag reordering operation is currently in progress + bool IsReordering() const; + + // return true if any drag operation is currently in progress + bool IsDragging() const { return IsResizing() || IsReordering(); } + + // end any drag operation currently in progress (resizing or reordering) + void EndDragging(); + + // cancel the drag operation currently in progress and generate an event + // about it + void CancelDragging(); + + // start (if m_colBeingResized is -1) or continue resizing the column + // + // this generates wxEVT_HEADER_BEGIN_RESIZE/RESIZING events and can + // cancel the operation if the user handler decides so + void StartOrContinueResizing(unsigned int col, int xPhysical); + + // end the resizing operation currently in progress and generate an event + // about it with its cancelled flag set if xPhysical is -1 + void EndResizing(int xPhysical); + + // same functions as above but for column moving/reordering instead of + // resizing + void StartReordering(unsigned int col, int xPhysical); + + // returns true if we did drag the column somewhere else or false if we + // didn't really move it -- in this case we consider that no reordering + // took place and that a normal column click event should be generated + bool EndReordering(int xPhysical); + + // constrain the given position to be larger than the start position of the + // given column plus its minimal width and return the effective width + int ConstrainByMinWidth(unsigned int col, int& xPhysical); + + // update the information displayed while a column is being moved around + void UpdateReorderingMarker(int xPhysical); + + // clear any overlaid markers + void ClearMarkers(); + + + // number of columns in the control currently + unsigned int m_numColumns; + + // index of the column under mouse or -1 if none + unsigned int m_hover; + + // the column being resized or -1 if there is no resizing operation in + // progress + unsigned int m_colBeingResized; + + // the column being moved or -1 if there is no reordering operation in + // progress + unsigned int m_colBeingReordered; + + // the distance from the start of m_colBeingReordered and the mouse + // position when the user started to drag it + int m_dragOffset; + + // the horizontal scroll offset + int m_scrollOffset; + + // the overlay display used during the dragging operations + wxOverlay m_overlay; + + // the indices of the column appearing at the given position on the display + // (its size is always m_numColumns) + wxArrayInt m_colIndices; + + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxHeaderCtrl); +}; + +#endif // _WX_GENERIC_HEADERCTRLG_H_ + diff --git a/wxmsw/include/wx-3.0/wx/generic/helpext.h b/wxmsw/include/wx-3.0/wx/generic/helpext.h new file mode 100644 index 00000000..fe0c3e7e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/helpext.h @@ -0,0 +1,105 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/helpext.h +// Purpose: an external help controller for wxWidgets +// Author: Karsten Ballueder (Ballueder@usa.net) +// Modified by: +// Copyright: (c) Karsten Ballueder 1998 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __WX_HELPEXT_H_ +#define __WX_HELPEXT_H_ + +#if wxUSE_HELP + + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/helpbase.h" + + +// ---------------------------------------------------------------------------- +// wxExtHelpController +// ---------------------------------------------------------------------------- + +// This class implements help via an external browser. +class WXDLLIMPEXP_ADV wxExtHelpController : public wxHelpControllerBase +{ +public: + wxExtHelpController(wxWindow* parentWindow = NULL); + virtual ~wxExtHelpController(); + +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED(void SetBrowser(const wxString& browsername = wxEmptyString, bool isNetscape = false) ); +#endif + + // Set viewer: new name for SetBrowser + virtual void SetViewer(const wxString& viewer = wxEmptyString, + long flags = wxHELP_NETSCAPE); + + virtual bool Initialize(const wxString& dir, int WXUNUSED(server)) + { return Initialize(dir); } + + virtual bool Initialize(const wxString& dir); + virtual bool LoadFile(const wxString& file = wxEmptyString); + virtual bool DisplayContents(void); + virtual bool DisplaySection(int sectionNo); + virtual bool DisplaySection(const wxString& section); + virtual bool DisplayBlock(long blockNo); + virtual bool KeywordSearch(const wxString& k, + wxHelpSearchMode mode = wxHELP_SEARCH_ALL); + + virtual bool Quit(void); + virtual void OnQuit(void); + + virtual bool DisplayHelp(const wxString &) ; + + virtual void SetFrameParameters(const wxString& WXUNUSED(title), + const wxSize& WXUNUSED(size), + const wxPoint& WXUNUSED(pos) = wxDefaultPosition, + bool WXUNUSED(newFrameEachTime) = false) + { + // does nothing by default + } + + virtual wxFrame *GetFrameParameters(wxSize *WXUNUSED(size) = NULL, + wxPoint *WXUNUSED(pos) = NULL, + bool *WXUNUSED(newFrameEachTime) = NULL) + { + return NULL; // does nothing by default + } + +protected: + // Filename of currently active map file. + wxString m_helpDir; + + // How many entries do we have in the map file? + int m_NumOfEntries; + + // A list containing all id,url,documentation triples. + wxList *m_MapList; + +private: + // parse a single line of the map file (called by LoadFile()) + // + // return true if the line was valid or false otherwise + bool ParseMapFileLine(const wxString& line); + + // Deletes the list and all objects. + void DeleteList(void); + + + // How to call the html viewer. + wxString m_BrowserName; + + // Is the viewer a variant of netscape? + bool m_BrowserIsNetscape; + + DECLARE_CLASS(wxExtHelpController) +}; + +#endif // wxUSE_HELP + +#endif // __WX_HELPEXT_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/hyperlink.h b/wxmsw/include/wx-3.0/wx/generic/hyperlink.h new file mode 100644 index 00000000..eb733888 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/hyperlink.h @@ -0,0 +1,144 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/hyperlink.h +// Purpose: Hyperlink control +// Author: David Norris , Otto Wyss +// Modified by: Ryan Norton, Francesco Montorsi +// Created: 04/02/2005 +// Copyright: (c) 2005 David Norris +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERICHYPERLINKCTRL_H_ +#define _WX_GENERICHYPERLINKCTRL_H_ + +// ---------------------------------------------------------------------------- +// wxGenericHyperlinkCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGenericHyperlinkCtrl : public wxHyperlinkCtrlBase +{ +public: + // Default constructor (for two-step construction). + wxGenericHyperlinkCtrl() { Init(); } + + // Constructor. + wxGenericHyperlinkCtrl(wxWindow *parent, + wxWindowID id, + const wxString& label, const wxString& url, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHL_DEFAULT_STYLE, + const wxString& name = wxHyperlinkCtrlNameStr) + { + Init(); + (void) Create(parent, id, label, url, pos, size, style, name); + } + + // Creation function (for two-step construction). + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label, const wxString& url, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHL_DEFAULT_STYLE, + const wxString& name = wxHyperlinkCtrlNameStr); + + + // get/set + wxColour GetHoverColour() const { return m_hoverColour; } + void SetHoverColour(const wxColour &colour) { m_hoverColour = colour; } + + wxColour GetNormalColour() const { return m_normalColour; } + void SetNormalColour(const wxColour &colour); + + wxColour GetVisitedColour() const { return m_visitedColour; } + void SetVisitedColour(const wxColour &colour); + + wxString GetURL() const { return m_url; } + void SetURL (const wxString &url) { m_url=url; } + + void SetVisited(bool visited = true) { m_visited=visited; } + bool GetVisited() const { return m_visited; } + + // NOTE: also wxWindow::Set/GetLabel, wxWindow::Set/GetBackgroundColour, + // wxWindow::Get/SetFont, wxWindow::Get/SetCursor are important ! + + +protected: + // Helper used by this class itself and native MSW implementation that + // connects OnRightUp() and OnPopUpCopy() handlers. + void ConnectMenuHandlers(); + + // event handlers + + // Renders the hyperlink. + void OnPaint(wxPaintEvent& event); + + // Handle set/kill focus events (invalidate for painting focus rect) + void OnFocus(wxFocusEvent& event); + + // Fire a HyperlinkEvent on space + void OnChar(wxKeyEvent& event); + + // Returns the wxRect of the label of this hyperlink. + // This is different from the clientsize's rectangle when + // clientsize != bestsize and this rectangle is influenced + // by the alignment of the label (wxHL_ALIGN_*). + wxRect GetLabelRect() const; + + // If the click originates inside the bounding box of the label, + // a flag is set so that an event will be fired when the left + // button is released. + void OnLeftDown(wxMouseEvent& event); + + // If the click both originated and finished inside the bounding box + // of the label, a HyperlinkEvent is fired. + void OnLeftUp(wxMouseEvent& event); + void OnRightUp(wxMouseEvent& event); + + // Changes the cursor to a hand, if the mouse is inside the label's + // bounding box. + void OnMotion(wxMouseEvent& event); + + // Changes the cursor back to the default, if necessary. + void OnLeaveWindow(wxMouseEvent& event); + + // handles "Copy URL" menuitem + void OnPopUpCopy(wxCommandEvent& event); + + // overridden base class virtuals + + // Returns the best size for the window, which is the size needed + // to display the text label. + virtual wxSize DoGetBestClientSize() const; + + // creates a context menu with "Copy URL" menuitem + virtual void DoContextMenu(const wxPoint &); + +private: + // Common part of all ctors. + void Init(); + + // URL associated with the link. This is transmitted inside + // the HyperlinkEvent fired when the user clicks on the label. + wxString m_url; + + // Foreground colours for various link types. + // NOTE: wxWindow::m_backgroundColour is used for background, + // wxWindow::m_foregroundColour is used to render non-visited links + wxColour m_hoverColour; + wxColour m_normalColour; + wxColour m_visitedColour; + + // True if the mouse cursor is inside the label's bounding box. + bool m_rollover; + + // True if the link has been clicked before. + bool m_visited; + + // True if a click is in progress (left button down) and the click + // originated inside the label's bounding box. + bool m_clicking; +}; + +#endif // _WX_GENERICHYPERLINKCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/icon.h b/wxmsw/include/wx-3.0/wx/generic/icon.h new file mode 100644 index 00000000..7a336d37 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/icon.h @@ -0,0 +1,62 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/icon.h +// Purpose: wxIcon implementation for ports where it's same as wxBitmap +// Author: Julian Smart +// Modified by: +// Created: 17/09/98 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_ICON_H_ +#define _WX_GENERIC_ICON_H_ + +#include "wx/bitmap.h" + +//----------------------------------------------------------------------------- +// wxIcon +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxIcon: public wxBitmap +{ +public: + wxIcon(); + + wxIcon(const char* const* bits); +#ifdef wxNEEDS_CHARPP + wxIcon(char **bits); +#endif + + // For compatibility with wxMSW where desired size is sometimes required to + // distinguish between multiple icons in a resource. + wxIcon( const wxString& filename, + wxBitmapType type = wxICON_DEFAULT_TYPE, + int WXUNUSED(desiredWidth)=-1, int WXUNUSED(desiredHeight)=-1 ) : + wxBitmap(filename, type) + { + } + + wxIcon(const wxIconLocation& loc) + : wxBitmap(loc.GetFileName(), wxBITMAP_TYPE_ANY) + { + } + + bool LoadFile(const wxString& name, wxBitmapType flags, + int WXUNUSED(desiredWidth), int WXUNUSED(desiredHeight)) + { return wxBitmap::LoadFile(name, flags); } + + // unhide the base class version + virtual bool LoadFile(const wxString& name, + wxBitmapType flags = wxICON_DEFAULT_TYPE) + { return wxBitmap::LoadFile(name, flags); } + + // create from bitmap (which should have a mask unless it's monochrome): + // there shouldn't be any implicit bitmap -> icon conversion (i.e. no + // ctors, assignment operators...), but it's ok to have such function + void CopyFromBitmap(const wxBitmap& bmp); + +private: + DECLARE_DYNAMIC_CLASS(wxIcon) +}; + +#endif // _WX_GENERIC_ICON_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/imaglist.h b/wxmsw/include/wx-3.0/wx/generic/imaglist.h new file mode 100644 index 00000000..8fc145e0 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/imaglist.h @@ -0,0 +1,79 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/imaglist.h +// Purpose: +// Author: Robert Roebling +// Created: 01/02/97 +// Copyright: (c) 1998 Robert Roebling and Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGLISTG_H_ +#define _WX_IMAGLISTG_H_ + +#include "wx/list.h" + +class WXDLLIMPEXP_FWD_CORE wxDC; +class WXDLLIMPEXP_FWD_CORE wxBitmap; +class WXDLLIMPEXP_FWD_CORE wxIcon; +class WXDLLIMPEXP_FWD_CORE wxColour; + + +class WXDLLIMPEXP_CORE wxGenericImageList: public wxObject +{ +public: + wxGenericImageList() { m_width = m_height = 0; } + wxGenericImageList( int width, int height, bool mask = true, int initialCount = 1 ); + virtual ~wxGenericImageList(); + bool Create( int width, int height, bool mask = true, int initialCount = 1 ); + bool Create(); + + virtual int GetImageCount() const; + virtual bool GetSize( int index, int &width, int &height ) const; + + int Add( const wxBitmap& bitmap ); + int Add( const wxBitmap& bitmap, const wxBitmap& mask ); + int Add( const wxBitmap& bitmap, const wxColour& maskColour ); + wxBitmap GetBitmap(int index) const; + wxIcon GetIcon(int index) const; + bool Replace( int index, const wxBitmap &bitmap ); + bool Replace( int index, const wxBitmap &bitmap, const wxBitmap& mask ); + bool Remove( int index ); + bool RemoveAll(); + + virtual bool Draw(int index, wxDC& dc, int x, int y, + int flags = wxIMAGELIST_DRAW_NORMAL, + bool solidBackground = false); + + // Internal use only + const wxBitmap *GetBitmapPtr(int index) const; +private: + wxObjectList m_images; + + int m_width; + int m_height; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxGenericImageList) +}; + +#ifndef wxHAS_NATIVE_IMAGELIST + +/* + * wxImageList has to be a real class or we have problems with + * the run-time information. + */ + +class WXDLLIMPEXP_CORE wxImageList: public wxGenericImageList +{ + DECLARE_DYNAMIC_CLASS(wxImageList) + +public: + wxImageList() {} + + wxImageList( int width, int height, bool mask = true, int initialCount = 1 ) + : wxGenericImageList(width, height, mask, initialCount) + { + } +}; +#endif // !wxHAS_NATIVE_IMAGELIST + +#endif // _WX_IMAGLISTG_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/infobar.h b/wxmsw/include/wx-3.0/wx/generic/infobar.h new file mode 100644 index 00000000..781698cc --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/infobar.h @@ -0,0 +1,132 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/infobar.h +// Purpose: generic wxInfoBar class declaration +// Author: Vadim Zeitlin +// Created: 2009-07-28 +// Copyright: (c) 2009 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_INFOBAR_H_ +#define _WX_GENERIC_INFOBAR_H_ + +class WXDLLIMPEXP_FWD_CORE wxBitmapButton; +class WXDLLIMPEXP_FWD_CORE wxStaticBitmap; +class WXDLLIMPEXP_FWD_CORE wxStaticText; + +// ---------------------------------------------------------------------------- +// wxInfoBar +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxInfoBarGeneric : public wxInfoBarBase +{ +public: + // the usual ctors and Create() but remember that info bar is created + // hidden + wxInfoBarGeneric() { Init(); } + + wxInfoBarGeneric(wxWindow *parent, wxWindowID winid = wxID_ANY) + { + Init(); + Create(parent, winid); + } + + bool Create(wxWindow *parent, wxWindowID winid = wxID_ANY); + + + // implement base class methods + // ---------------------------- + + virtual void ShowMessage(const wxString& msg, + int flags = wxICON_INFORMATION); + + virtual void Dismiss(); + + virtual void AddButton(wxWindowID btnid, const wxString& label = wxString()); + + virtual void RemoveButton(wxWindowID btnid); + + // methods specific to this version + // -------------------------------- + + // set the effect(s) to use when showing/hiding the bar, may be + // wxSHOW_EFFECT_NONE to disable any effects entirely + // + // by default, slide to bottom/top is used when it's positioned on the top + // of the window for showing/hiding it and top/bottom when it's positioned + // at the bottom + void SetShowHideEffects(wxShowEffect showEffect, wxShowEffect hideEffect) + { + m_showEffect = showEffect; + m_hideEffect = hideEffect; + } + + // get effect used when showing/hiding the window + wxShowEffect GetShowEffect() const; + wxShowEffect GetHideEffect() const; + + // set the duration of animation used when showing/hiding the bar, in ms + void SetEffectDuration(int duration) { m_effectDuration = duration; } + + // get the currently used effect animation duration + int GetEffectDuration() const { return m_effectDuration; } + + + // overridden base class methods + // ----------------------------- + + // setting the font of this window sets it for the text control inside it + // (default font is a larger and bold version of the normal one) + virtual bool SetFont(const wxFont& font); + +protected: + // info bar shouldn't have any border by default, the colour difference + // between it and the main window separates it well enough + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + + // update the parent to take our new or changed size into account (notably + // should be called when we're shown or hidden) + void UpdateParent(); + +private: + // common part of all ctors + void Init(); + + // handler for the close button + void OnButton(wxCommandEvent& event); + + // show/hide the bar + void DoShow(); + void DoHide(); + + // determine the placement of the bar from its position in the containing + // sizer + enum BarPlacement + { + BarPlacement_Top, + BarPlacement_Bottom, + BarPlacement_Unknown + }; + + BarPlacement GetBarPlacement() const; + + + // different controls making up the bar + wxStaticBitmap *m_icon; + wxStaticText *m_text; + wxBitmapButton *m_button; + + // the effects to use when showing/hiding and duration for them: by default + // the effect is determined by the info bar automatically depending on its + // position and the default duration is used + wxShowEffect m_showEffect, + m_hideEffect; + int m_effectDuration; + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxInfoBarGeneric); +}; + +#endif // _WX_GENERIC_INFOBAR_H_ + diff --git a/wxmsw/include/wx-3.0/wx/generic/laywin.h b/wxmsw/include/wx-3.0/wx/generic/laywin.h new file mode 100644 index 00000000..a38fd97f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/laywin.h @@ -0,0 +1,227 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/laywin.h +// Purpose: Implements a simple layout algorithm, plus +// wxSashLayoutWindow which is an example of a window with +// layout-awareness (via event handlers). This is suited to +// IDE-style window layout. +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LAYWIN_H_G_ +#define _WX_LAYWIN_H_G_ + +#if wxUSE_SASH + #include "wx/sashwin.h" +#endif // wxUSE_SASH + +#include "wx/event.h" + +class WXDLLIMPEXP_FWD_ADV wxQueryLayoutInfoEvent; +class WXDLLIMPEXP_FWD_ADV wxCalculateLayoutEvent; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_QUERY_LAYOUT_INFO, wxQueryLayoutInfoEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALCULATE_LAYOUT, wxCalculateLayoutEvent ); + +enum wxLayoutOrientation +{ + wxLAYOUT_HORIZONTAL, + wxLAYOUT_VERTICAL +}; + +enum wxLayoutAlignment +{ + wxLAYOUT_NONE, + wxLAYOUT_TOP, + wxLAYOUT_LEFT, + wxLAYOUT_RIGHT, + wxLAYOUT_BOTTOM +}; + +// Not sure this is necessary +// Tell window which dimension we're sizing on +#define wxLAYOUT_LENGTH_Y 0x0008 +#define wxLAYOUT_LENGTH_X 0x0000 + +// Use most recently used length +#define wxLAYOUT_MRU_LENGTH 0x0010 + +// Only a query, so don't actually move it. +#define wxLAYOUT_QUERY 0x0100 + +/* + * This event is used to get information about window alignment, + * orientation and size. + */ + +class WXDLLIMPEXP_ADV wxQueryLayoutInfoEvent: public wxEvent +{ +public: + wxQueryLayoutInfoEvent(wxWindowID id = 0) + { + SetEventType(wxEVT_QUERY_LAYOUT_INFO); + m_requestedLength = 0; + m_flags = 0; + m_id = id; + m_alignment = wxLAYOUT_TOP; + m_orientation = wxLAYOUT_HORIZONTAL; + } + + // Read by the app + void SetRequestedLength(int length) { m_requestedLength = length; } + int GetRequestedLength() const { return m_requestedLength; } + + void SetFlags(int flags) { m_flags = flags; } + int GetFlags() const { return m_flags; } + + // Set by the app + void SetSize(const wxSize& size) { m_size = size; } + wxSize GetSize() const { return m_size; } + + void SetOrientation(wxLayoutOrientation orient) { m_orientation = orient; } + wxLayoutOrientation GetOrientation() const { return m_orientation; } + + void SetAlignment(wxLayoutAlignment align) { m_alignment = align; } + wxLayoutAlignment GetAlignment() const { return m_alignment; } + + virtual wxEvent *Clone() const { return new wxQueryLayoutInfoEvent(*this); } + +protected: + int m_flags; + int m_requestedLength; + wxSize m_size; + wxLayoutOrientation m_orientation; + wxLayoutAlignment m_alignment; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxQueryLayoutInfoEvent) +}; + +typedef void (wxEvtHandler::*wxQueryLayoutInfoEventFunction)(wxQueryLayoutInfoEvent&); + +#define wxQueryLayoutInfoEventHandler( func ) \ + wxEVENT_HANDLER_CAST( wxQueryLayoutInfoEventFunction, func ) + +#define EVT_QUERY_LAYOUT_INFO(func) \ + wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_QUERY_LAYOUT_INFO, wxID_ANY, wxID_ANY, wxQueryLayoutInfoEventHandler( func ), NULL ), + +/* + * This event is used to take a bite out of the available client area. + */ + +class WXDLLIMPEXP_ADV wxCalculateLayoutEvent: public wxEvent +{ +public: + wxCalculateLayoutEvent(wxWindowID id = 0) + { + SetEventType(wxEVT_CALCULATE_LAYOUT); + m_flags = 0; + m_id = id; + } + + // Read by the app + void SetFlags(int flags) { m_flags = flags; } + int GetFlags() const { return m_flags; } + + // Set by the app + void SetRect(const wxRect& rect) { m_rect = rect; } + wxRect GetRect() const { return m_rect; } + + virtual wxEvent *Clone() const { return new wxCalculateLayoutEvent(*this); } + +protected: + int m_flags; + wxRect m_rect; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCalculateLayoutEvent) +}; + +typedef void (wxEvtHandler::*wxCalculateLayoutEventFunction)(wxCalculateLayoutEvent&); + +#define wxCalculateLayoutEventHandler( func ) wxEVENT_HANDLER_CAST(wxCalculateLayoutEventFunction, func) + +#define EVT_CALCULATE_LAYOUT(func) \ + wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_CALCULATE_LAYOUT, wxID_ANY, wxID_ANY, wxCalculateLayoutEventHandler( func ), NULL ), + +#if wxUSE_SASH + +// This is window that can remember alignment/orientation, does its own layout, +// and can provide sashes too. Useful for implementing docked windows with sashes in +// an IDE-style interface. +class WXDLLIMPEXP_ADV wxSashLayoutWindow: public wxSashWindow +{ +public: + wxSashLayoutWindow() + { + Init(); + } + + wxSashLayoutWindow(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxSW_3D|wxCLIP_CHILDREN, const wxString& name = wxT("layoutWindow")) + { + Create(parent, id, pos, size, style, name); + } + + bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxSW_3D|wxCLIP_CHILDREN, const wxString& name = wxT("layoutWindow")); + +// Accessors + inline wxLayoutAlignment GetAlignment() const { return m_alignment; } + inline wxLayoutOrientation GetOrientation() const { return m_orientation; } + + inline void SetAlignment(wxLayoutAlignment align) { m_alignment = align; } + inline void SetOrientation(wxLayoutOrientation orient) { m_orientation = orient; } + + // Give the window default dimensions + inline void SetDefaultSize(const wxSize& size) { m_defaultSize = size; } + +// Event handlers + // Called by layout algorithm to allow window to take a bit out of the + // client rectangle, and size itself if not in wxLAYOUT_QUERY mode. + void OnCalculateLayout(wxCalculateLayoutEvent& event); + + // Called by layout algorithm to retrieve information about the window. + void OnQueryLayoutInfo(wxQueryLayoutInfoEvent& event); + +private: + void Init(); + + wxLayoutAlignment m_alignment; + wxLayoutOrientation m_orientation; + wxSize m_defaultSize; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxSashLayoutWindow) + DECLARE_EVENT_TABLE() +}; + +#endif // wxUSE_SASH + +class WXDLLIMPEXP_FWD_CORE wxMDIParentFrame; +class WXDLLIMPEXP_FWD_CORE wxFrame; + +// This class implements the layout algorithm +class WXDLLIMPEXP_ADV wxLayoutAlgorithm: public wxObject +{ +public: + wxLayoutAlgorithm() {} + +#if wxUSE_MDI_ARCHITECTURE + // The MDI client window is sized to whatever's left over. + bool LayoutMDIFrame(wxMDIParentFrame* frame, wxRect* rect = NULL); +#endif // wxUSE_MDI_ARCHITECTURE + + // mainWindow is sized to whatever's left over. This function for backward + // compatibility; use LayoutWindow. + bool LayoutFrame(wxFrame* frame, wxWindow* mainWindow = NULL); + + // mainWindow is sized to whatever's left over. + bool LayoutWindow(wxWindow* frame, wxWindow* mainWindow = NULL); +}; + +#endif + // _WX_LAYWIN_H_G_ diff --git a/wxmsw/include/wx-3.0/wx/generic/listctrl.h b/wxmsw/include/wx-3.0/wx/generic/listctrl.h new file mode 100644 index 00000000..7e18eecc --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/listctrl.h @@ -0,0 +1,277 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/listctrl.h +// Purpose: Generic list control +// Author: Robert Roebling +// Created: 01/02/97 +// Copyright: (c) 1998 Robert Roebling and Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_LISTCTRL_H_ +#define _WX_GENERIC_LISTCTRL_H_ + +#include "wx/containr.h" +#include "wx/scrolwin.h" +#include "wx/textctrl.h" + +#if wxUSE_DRAG_AND_DROP +class WXDLLIMPEXP_FWD_CORE wxDropTarget; +#endif + +//----------------------------------------------------------------------------- +// internal classes +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxListHeaderWindow; +class WXDLLIMPEXP_FWD_CORE wxListMainWindow; + +//----------------------------------------------------------------------------- +// wxListCtrl +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGenericListCtrl: public wxNavigationEnabled, + public wxScrollHelper +{ +public: + + wxGenericListCtrl() : wxScrollHelper(this) + { + Init(); + } + + wxGenericListCtrl( wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = wxListCtrlNameStr) + : wxScrollHelper(this) + { + Create(parent, winid, pos, size, style, validator, name); + } + + virtual ~wxGenericListCtrl(); + + void Init(); + + bool Create( wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = wxListCtrlNameStr); + + bool GetColumn( int col, wxListItem& item ) const; + bool SetColumn( int col, const wxListItem& item ); + int GetColumnWidth( int col ) const; + bool SetColumnWidth( int col, int width); + int GetCountPerPage() const; // not the same in wxGLC as in Windows, I think + wxRect GetViewRect() const; + + bool GetItem( wxListItem& info ) const; + bool SetItem( wxListItem& info ) ; + long SetItem( long index, int col, const wxString& label, int imageId = -1 ); + int GetItemState( long item, long stateMask ) const; + bool SetItemState( long item, long state, long stateMask); + bool SetItemImage( long item, int image, int selImage = -1 ); + bool SetItemColumnImage( long item, long column, int image ); + wxString GetItemText( long item, int col = 0 ) const; + void SetItemText( long item, const wxString& str ); + wxUIntPtr GetItemData( long item ) const; + bool SetItemPtrData(long item, wxUIntPtr data); + bool SetItemData(long item, long data) { return SetItemPtrData(item, data); } + bool GetItemRect( long item, wxRect& rect, int code = wxLIST_RECT_BOUNDS ) const; + bool GetSubItemRect( long item, long subItem, wxRect& rect, int code = wxLIST_RECT_BOUNDS ) const; + bool GetItemPosition( long item, wxPoint& pos ) const; + bool SetItemPosition( long item, const wxPoint& pos ); // not supported in wxGLC + int GetItemCount() const; + int GetColumnCount() const; + void SetItemSpacing( int spacing, bool isSmall = false ); + wxSize GetItemSpacing() const; + void SetItemTextColour( long item, const wxColour& col); + wxColour GetItemTextColour( long item ) const; + void SetItemBackgroundColour( long item, const wxColour &col); + wxColour GetItemBackgroundColour( long item ) const; + void SetItemFont( long item, const wxFont &f); + wxFont GetItemFont( long item ) const; + int GetSelectedItemCount() const; + wxColour GetTextColour() const; + void SetTextColour(const wxColour& col); + long GetTopItem() const; + + void SetSingleStyle( long style, bool add = true ) ; + void SetWindowStyleFlag( long style ); + void RecreateWindow() {} + long GetNextItem( long item, int geometry = wxLIST_NEXT_ALL, int state = wxLIST_STATE_DONTCARE ) const; + wxImageList *GetImageList( int which ) const; + void SetImageList( wxImageList *imageList, int which ); + void AssignImageList( wxImageList *imageList, int which ); + bool Arrange( int flag = wxLIST_ALIGN_DEFAULT ); // always wxLIST_ALIGN_LEFT in wxGLC + + void ClearAll(); + bool DeleteItem( long item ); + bool DeleteAllItems(); + bool DeleteAllColumns(); + bool DeleteColumn( int col ); + + void SetItemCount(long count); + + wxTextCtrl *EditLabel(long item, + wxClassInfo* textControlClass = wxCLASSINFO(wxTextCtrl)); + wxTextCtrl* GetEditControl() const; + void Edit( long item ) { EditLabel(item); } + + bool EnsureVisible( long item ); + long FindItem( long start, const wxString& str, bool partial = false ); + long FindItem( long start, wxUIntPtr data ); + long FindItem( long start, const wxPoint& pt, int direction ); // not supported in wxGLC + long HitTest( const wxPoint& point, int& flags, long *pSubItem = NULL ) const; + long InsertItem(wxListItem& info); + long InsertItem( long index, const wxString& label ); + long InsertItem( long index, int imageIndex ); + long InsertItem( long index, const wxString& label, int imageIndex ); + bool ScrollList( int dx, int dy ); + bool SortItems( wxListCtrlCompare fn, wxIntPtr data ); + + // do we have a header window? + bool HasHeader() const + { return InReportView() && !HasFlag(wxLC_NO_HEADER); } + + // refresh items selectively (only useful for virtual list controls) + void RefreshItem(long item); + void RefreshItems(long itemFrom, long itemTo); + + virtual void EnableBellOnNoMatch(bool on = true); + +#if WXWIN_COMPATIBILITY_2_6 + // obsolete, don't use + wxDEPRECATED( int GetItemSpacing( bool isSmall ) const ); +#endif // WXWIN_COMPATIBILITY_2_6 + + + // overridden base class virtuals + // ------------------------------ + + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + virtual void Update(); + + + // implementation only from now on + // ------------------------------- + + // generic version extension, don't use in portable code + bool Update( long item ); + + void OnInternalIdle( ); + + // We have to hand down a few functions + virtual void Refresh(bool eraseBackground = true, + const wxRect *rect = NULL); + + virtual bool SetBackgroundColour( const wxColour &colour ); + virtual bool SetForegroundColour( const wxColour &colour ); + virtual wxColour GetBackgroundColour() const; + virtual wxColour GetForegroundColour() const; + virtual bool SetFont( const wxFont &font ); + virtual bool SetCursor( const wxCursor &cursor ); + +#if wxUSE_DRAG_AND_DROP + virtual void SetDropTarget( wxDropTarget *dropTarget ); + virtual wxDropTarget *GetDropTarget() const; +#endif + + virtual bool ShouldInheritColours() const { return false; } + + // implementation + // -------------- + + wxImageList *m_imageListNormal; + wxImageList *m_imageListSmall; + wxImageList *m_imageListState; // what's that ? + bool m_ownsImageListNormal, + m_ownsImageListSmall, + m_ownsImageListState; + wxListHeaderWindow *m_headerWin; + wxListMainWindow *m_mainWin; + +protected: + // Implement base class pure virtual methods. + long DoInsertColumn(long col, const wxListItem& info); + + + virtual bool DoPopupMenu( wxMenu *menu, int x, int y ); + + virtual wxSize DoGetBestClientSize() const; + + // return the text for the given column of the given item + virtual wxString OnGetItemText(long item, long column) const; + + // return the icon for the given item. In report view, OnGetItemImage will + // only be called for the first column. See OnGetItemColumnImage for + // details. + virtual int OnGetItemImage(long item) const; + + // return the icon for the given item and column. + virtual int OnGetItemColumnImage(long item, long column) const; + + // it calls our OnGetXXX() functions + friend class WXDLLIMPEXP_FWD_CORE wxListMainWindow; + + virtual wxBorder GetDefaultBorder() const; + + virtual wxSize GetSizeAvailableForScrollTarget(const wxSize& size); + +private: + void CreateOrDestroyHeaderWindowAsNeeded(); + void OnScroll( wxScrollWinEvent& event ); + void OnSize( wxSizeEvent &event ); + + // we need to return a special WM_GETDLGCODE value to process just the + // arrows but let the other navigation characters through +#if defined(__WXMSW__) && !defined(__WXWINCE__) && !defined(__WXUNIVERSAL__) + virtual WXLRESULT + MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); +#endif // __WXMSW__ + + WX_FORWARD_TO_SCROLL_HELPER() + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGenericListCtrl) +}; + +#if (!defined(__WXMSW__) || defined(__WXUNIVERSAL__)) && (!(defined(__WXMAC__) && wxOSX_USE_CARBON) || defined(__WXUNIVERSAL__ )) +/* + * wxListCtrl has to be a real class or we have problems with + * the run-time information. + */ + +class WXDLLIMPEXP_CORE wxListCtrl: public wxGenericListCtrl +{ + DECLARE_DYNAMIC_CLASS(wxListCtrl) + +public: + wxListCtrl() {} + + wxListCtrl(wxWindow *parent, wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator &validator = wxDefaultValidator, + const wxString &name = wxListCtrlNameStr) + : wxGenericListCtrl(parent, winid, pos, size, style, validator, name) + { + } + +}; +#endif // !__WXMSW__ || __WXUNIVERSAL__ + +#endif // _WX_GENERIC_LISTCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/logg.h b/wxmsw/include/wx-3.0/wx/generic/logg.h new file mode 100644 index 00000000..303b441e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/logg.h @@ -0,0 +1,152 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/logg.h +// Purpose: Assorted wxLogXXX functions, and wxLog (sink for logs) +// Author: Vadim Zeitlin +// Modified by: +// Created: 29/01/98 +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LOGG_H_ +#define _WX_LOGG_H_ + +#if wxUSE_GUI + +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxLogFrame; +class WXDLLIMPEXP_FWD_CORE wxWindow; + +// ---------------------------------------------------------------------------- +// the following log targets are only compiled in if the we're compiling the +// GUI part (andnot just the base one) of the library, they're implemented in +// src/generic/logg.cpp *and not src/common/log.cpp unlike all the rest) +// ---------------------------------------------------------------------------- + +#if wxUSE_TEXTCTRL + +// log everything to a text window (GUI only of course) +class WXDLLIMPEXP_CORE wxLogTextCtrl : public wxLog +{ +public: + wxLogTextCtrl(wxTextCtrl *pTextCtrl); + +protected: + // implement sink function + virtual void DoLogText(const wxString& msg); + +private: + // the control we use + wxTextCtrl *m_pTextCtrl; + + wxDECLARE_NO_COPY_CLASS(wxLogTextCtrl); +}; + +#endif // wxUSE_TEXTCTRL + +// ---------------------------------------------------------------------------- +// GUI log target, the default one for wxWidgets programs +// ---------------------------------------------------------------------------- + +#if wxUSE_LOGGUI + +class WXDLLIMPEXP_CORE wxLogGui : public wxLog +{ +public: + // ctor + wxLogGui(); + + // show all messages that were logged since the last Flush() + virtual void Flush(); + +protected: + virtual void DoLogRecord(wxLogLevel level, + const wxString& msg, + const wxLogRecordInfo& info); + + // return the title to be used for the log dialog, depending on m_bErrors + // and m_bWarnings values + wxString GetTitle() const; + + // return the icon (one of wxICON_XXX constants) to be used for the dialog + // depending on m_bErrors/m_bWarnings + int GetSeverityIcon() const; + + // empty everything + void Clear(); + + + wxArrayString m_aMessages; // the log message texts + wxArrayInt m_aSeverity; // one of wxLOG_XXX values + wxArrayLong m_aTimes; // the time of each message + bool m_bErrors, // do we have any errors? + m_bWarnings, // any warnings? + m_bHasMessages; // any messages at all? + +private: + // this method is called to show a single log message, it uses + // wxMessageBox() by default + virtual void DoShowSingleLogMessage(const wxString& message, + const wxString& title, + int style); + + // this method is called to show multiple log messages, it uses wxLogDialog + virtual void DoShowMultipleLogMessages(const wxArrayString& messages, + const wxArrayInt& severities, + const wxArrayLong& times, + const wxString& title, + int style); +}; + +#endif // wxUSE_LOGGUI + +// ---------------------------------------------------------------------------- +// (background) log window: this class forwards all log messages to the log +// target which was active when it was instantiated, but also collects them +// to the log window. This window has its own menu which allows the user to +// close it, clear the log contents or save it to the file. +// ---------------------------------------------------------------------------- + +#if wxUSE_LOGWINDOW + +class WXDLLIMPEXP_CORE wxLogWindow : public wxLogPassThrough +{ +public: + wxLogWindow(wxWindow *pParent, // the parent frame (can be NULL) + const wxString& szTitle, // the title of the frame + bool bShow = true, // show window immediately? + bool bPassToOld = true); // pass messages to the old target? + + virtual ~wxLogWindow(); + + // window operations + // show/hide the log window + void Show(bool bShow = true); + // retrieve the pointer to the frame + wxFrame *GetFrame() const; + + // overridables + // called if the user closes the window interactively, will not be + // called if it is destroyed for another reason (such as when program + // exits) - return true from here to allow the frame to close, false + // to prevent this from happening + virtual bool OnFrameClose(wxFrame *frame); + // called right before the log frame is going to be deleted: will + // always be called unlike OnFrameClose() + virtual void OnFrameDelete(wxFrame *frame); + +protected: + virtual void DoLogTextAtLevel(wxLogLevel level, const wxString& msg); + +private: + wxLogFrame *m_pLogFrame; // the log frame + + wxDECLARE_NO_COPY_CLASS(wxLogWindow); +}; + +#endif // wxUSE_LOGWINDOW + +#endif // wxUSE_GUI + +#endif // _WX_LOGG_H_ + diff --git a/wxmsw/include/wx-3.0/wx/generic/msgdlgg.h b/wxmsw/include/wx-3.0/wx/generic/msgdlgg.h new file mode 100644 index 00000000..66bd5484 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/msgdlgg.h @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/msgdlgg.h +// Purpose: Generic wxMessageDialog +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_MSGDLGG_H_ +#define _WX_GENERIC_MSGDLGG_H_ + +class WXDLLIMPEXP_FWD_CORE wxSizer; + +class WXDLLIMPEXP_CORE wxGenericMessageDialog : public wxMessageDialogBase +{ +public: + wxGenericMessageDialog(wxWindow *parent, + const wxString& message, + const wxString& caption = wxMessageBoxCaptionStr, + long style = wxOK|wxCENTRE, + const wxPoint& pos = wxDefaultPosition); + + virtual int ShowModal(); + +protected: + // Creates a message dialog taking any options that have been set after + // object creation into account such as custom labels. + void DoCreateMsgdialog(); + + void OnYes(wxCommandEvent& event); + void OnNo(wxCommandEvent& event); + void OnHelp(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event); + + // can be overridden to provide more contents to the dialog + virtual void AddMessageDialogCheckBox(wxSizer *WXUNUSED(sizer)) { } + virtual void AddMessageDialogDetails(wxSizer *WXUNUSED(sizer)) { } + +private: + // Creates and returns a standard button sizer using the style of this + // dialog and the custom labels, if any. + // + // May return NULL on smart phone platforms not using buttons at all. + wxSizer *CreateMsgDlgButtonSizer(); + + wxPoint m_pos; + bool m_created; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGenericMessageDialog) +}; + +#endif // _WX_GENERIC_MSGDLGG_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/notebook.h b/wxmsw/include/wx-3.0/wx/generic/notebook.h new file mode 100644 index 00000000..e328e0bf --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/notebook.h @@ -0,0 +1,155 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/notebook.h +// Purpose: wxNotebook class (a.k.a. property sheet, tabbed dialog) +// Author: Julian Smart +// Modified by: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_NOTEBOOK_H_ +#define _WX_NOTEBOOK_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- +#include "wx/event.h" +#include "wx/control.h" + +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +// fwd declarations +class WXDLLIMPEXP_FWD_CORE wxImageList; +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxTabView; + +// ---------------------------------------------------------------------------- +// wxNotebook +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxNotebook : public wxNotebookBase +{ +public: + // ctors + // ----- + // default for dynamic class + wxNotebook(); + // the same arguments as for wxControl (@@@ any special styles?) + wxNotebook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxNotebookNameStr); + // Create() function + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxNotebookNameStr); + // dtor + virtual ~wxNotebook(); + + // accessors + // --------- + // Find the position of the wxNotebookPage, wxNOT_FOUND if not found. + int FindPagePosition(wxNotebookPage* page) const; + + // set the currently selected page, return the index of the previously + // selected one (or wxNOT_FOUND on error) + // NB: this function will _not_ generate wxEVT_NOTEBOOK_PAGE_xxx events + int SetSelection(size_t nPage); + // cycle thru the tabs + // void AdvanceSelection(bool bForward = true); + + // changes selected page without sending events + int ChangeSelection(size_t nPage); + + // set/get the title of a page + bool SetPageText(size_t nPage, const wxString& strText); + wxString GetPageText(size_t nPage) const; + + // get the number of rows for a control with wxNB_MULTILINE style (not all + // versions support it - they will always return 1 then) + virtual int GetRowCount() const ; + + // sets/returns item's image index in the current image list + int GetPageImage(size_t nPage) const; + bool SetPageImage(size_t nPage, int nImage); + + // control the appearance of the notebook pages + // set the size (the same for all pages) + void SetPageSize(const wxSize& size); + // set the padding between tabs (in pixels) + void SetPadding(const wxSize& padding); + + // Sets the size of the tabs (assumes all tabs are the same size) + void SetTabSize(const wxSize& sz); + + // operations + // ---------- + // remove one page from the notebook, and delete the page. + bool DeletePage(size_t nPage); + bool DeletePage(wxNotebookPage* page); + // remove one page from the notebook, without deleting the page. + bool RemovePage(size_t nPage); + bool RemovePage(wxNotebookPage* page); + virtual wxWindow* DoRemovePage(size_t nPage); + + // remove all pages + bool DeleteAllPages(); + // the same as AddPage(), but adds it at the specified position + bool InsertPage(size_t nPage, + wxNotebookPage *pPage, + const wxString& strText, + bool bSelect = false, + int imageId = NO_IMAGE); + + // callbacks + // --------- + void OnSize(wxSizeEvent& event); + void OnInternalIdle(); + void OnSelChange(wxBookCtrlEvent& event); + void OnSetFocus(wxFocusEvent& event); + void OnNavigationKey(wxNavigationKeyEvent& event); + + // base class virtuals + // ------------------- + virtual void Command(wxCommandEvent& event); + virtual void SetConstraintSizes(bool recurse = true); + virtual bool DoPhase(int nPhase); + + virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const; + + // Implementation + + // wxNotebook on Motif uses a generic wxTabView to implement itself. + wxTabView *GetTabView() const { return m_tabView; } + void SetTabView(wxTabView *v) { m_tabView = v; } + + void OnMouseEvent(wxMouseEvent& event); + void OnPaint(wxPaintEvent& event); + + virtual wxRect GetAvailableClientSize(); + + // Implementation: calculate the layout of the view rect + // and resize the children if required + bool RefreshLayout(bool force = true); + +protected: + // common part of all ctors + void Init(); + + // helper functions + void ChangePage(int nOldSel, int nSel); // change pages + + wxTabView* m_tabView; + + DECLARE_DYNAMIC_CLASS(wxNotebook) + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_NOTEBOOK_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/notifmsg.h b/wxmsw/include/wx-3.0/wx/generic/notifmsg.h new file mode 100644 index 00000000..1cd74ba7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/notifmsg.h @@ -0,0 +1,60 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/notifmsg.h +// Purpose: generic implementation of wxGenericNotificationMessage +// Author: Vadim Zeitlin +// Created: 2007-11-24 +// Copyright: (c) 2007 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_NOTIFMSG_H_ +#define _WX_GENERIC_NOTIFMSG_H_ + +class wxNotificationMessageDialog; + +// ---------------------------------------------------------------------------- +// wxGenericNotificationMessage +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGenericNotificationMessage : public wxNotificationMessageBase +{ +public: + wxGenericNotificationMessage() { Init(); } + wxGenericNotificationMessage(const wxString& title, + const wxString& message = wxString(), + wxWindow *parent = NULL, + int flags = wxICON_INFORMATION) + : wxNotificationMessageBase(title, message, parent, flags) + { + Init(); + } + + virtual ~wxGenericNotificationMessage(); + + + virtual bool Show(int timeout = Timeout_Auto); + virtual bool Close(); + + // generic implementation-specific methods + + // get/set the default timeout (used if Timeout_Auto is specified) + static int GetDefaultTimeout() { return ms_timeout; } + static void SetDefaultTimeout(int timeout); + +private: + void Init(); + + + // default timeout + static int ms_timeout; + + // notification message is represented by a modeless dialog in this + // implementation + wxNotificationMessageDialog *m_dialog; + + + wxDECLARE_NO_COPY_CLASS(wxGenericNotificationMessage); +}; + +#endif // _WX_GENERIC_NOTIFMSG_H_ + diff --git a/wxmsw/include/wx-3.0/wx/generic/numdlgg.h b/wxmsw/include/wx-3.0/wx/generic/numdlgg.h new file mode 100644 index 00000000..ac45ce91 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/numdlgg.h @@ -0,0 +1,78 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/numdlgg.h +// Purpose: wxNumberEntryDialog class +// Author: John Labenski +// Modified by: +// Created: 07.02.04 (extracted from textdlgg.cpp) +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __NUMDLGH_G__ +#define __NUMDLGH_G__ + +#include "wx/defs.h" + +#if wxUSE_NUMBERDLG + +#include "wx/dialog.h" + +#if wxUSE_SPINCTRL + class WXDLLIMPEXP_FWD_CORE wxSpinCtrl; +#else + class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +#endif // wxUSE_SPINCTRL + +// ---------------------------------------------------------------------------- +// wxNumberEntryDialog: a dialog with spin control, [ok] and [cancel] buttons +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxNumberEntryDialog : public wxDialog +{ +public: + wxNumberEntryDialog(wxWindow *parent, + const wxString& message, + const wxString& prompt, + const wxString& caption, + long value, long min, long max, + const wxPoint& pos = wxDefaultPosition); + + long GetValue() const { return m_value; } + + // implementation only + void OnOK(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event); + +protected: + +#if wxUSE_SPINCTRL + wxSpinCtrl *m_spinctrl; +#else + wxTextCtrl *m_spinctrl; +#endif // wxUSE_SPINCTRL + + long m_value, m_min, m_max; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxNumberEntryDialog) + wxDECLARE_NO_COPY_CLASS(wxNumberEntryDialog); +}; + +// ---------------------------------------------------------------------------- +// function to get a number from user +// ---------------------------------------------------------------------------- + +WXDLLIMPEXP_CORE long + wxGetNumberFromUser(const wxString& message, + const wxString& prompt, + const wxString& caption, + long value = 0, + long min = 0, + long max = 100, + wxWindow *parent = NULL, + const wxPoint& pos = wxDefaultPosition); + +#endif // wxUSE_NUMBERDLG + +#endif // __NUMDLGH_G__ diff --git a/wxmsw/include/wx-3.0/wx/generic/paletteg.h b/wxmsw/include/wx-3.0/wx/generic/paletteg.h new file mode 100644 index 00000000..0f6f5a49 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/paletteg.h @@ -0,0 +1,50 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/paletteg.h +// Purpose: +// Author: Robert Roebling +// Created: 01/02/97 +// Copyright: (c) 1998 Robert Roebling and Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +#ifndef __WX_PALETTEG_H__ +#define __WX_PALETTEG_H__ + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/gdiobj.h" +#include "wx/gdicmn.h" + +//----------------------------------------------------------------------------- +// classes +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxPalette; + +//----------------------------------------------------------------------------- +// wxPalette +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPalette: public wxPaletteBase +{ +public: + wxPalette(); + wxPalette( int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue ); + virtual ~wxPalette(); + + bool Create( int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue); + int GetPixel( unsigned char red, unsigned char green, unsigned char blue ) const; + bool GetRGB( int pixel, unsigned char *red, unsigned char *green, unsigned char *blue ) const; + + virtual int GetColoursCount() const; + +protected: + virtual wxGDIRefData *CreateGDIRefData() const; + virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const; + +private: + DECLARE_DYNAMIC_CLASS(wxPalette) +}; + +#endif // __WX_PALETTEG_H__ diff --git a/wxmsw/include/wx-3.0/wx/generic/panelg.h b/wxmsw/include/wx-3.0/wx/generic/panelg.h new file mode 100644 index 00000000..5c02cb35 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/panelg.h @@ -0,0 +1,48 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/panelg.h +// Purpose: wxPanel: a container for child controls +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_PANELG_H_ +#define _WX_GENERIC_PANELG_H_ + +#include "wx/bitmap.h" + +class WXDLLIMPEXP_CORE wxPanel : public wxPanelBase +{ +public: + wxPanel() { } + + // Constructor + wxPanel(wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL | wxNO_BORDER, + const wxString& name = wxPanelNameStr) + { + Create(parent, winid, pos, size, style, name); + } + +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED_CONSTRUCTOR( + wxPanel(wxWindow *parent, + int x, int y, int width, int height, + long style = wxTAB_TRAVERSAL | wxNO_BORDER, + const wxString& name = wxPanelNameStr) + { + Create(parent, wxID_ANY, wxPoint(x, y), wxSize(width, height), style, name); + } + ) +#endif // WXWIN_COMPATIBILITY_2_8 + +private: + wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxPanel); +}; + +#endif // _WX_GENERIC_PANELG_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/printps.h b/wxmsw/include/wx-3.0/wx/generic/printps.h new file mode 100644 index 00000000..38830729 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/printps.h @@ -0,0 +1,67 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/printps.h +// Purpose: wxPostScriptPrinter, wxPostScriptPrintPreview +// wxGenericPageSetupDialog +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __PRINTPSH__ +#define __PRINTPSH__ + +#include "wx/prntbase.h" + +#if wxUSE_PRINTING_ARCHITECTURE && wxUSE_POSTSCRIPT + +// ---------------------------------------------------------------------------- +// Represents the printer: manages printing a wxPrintout object +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPostScriptPrinter : public wxPrinterBase +{ +public: + wxPostScriptPrinter(wxPrintDialogData *data = NULL); + virtual ~wxPostScriptPrinter(); + + virtual bool Print(wxWindow *parent, wxPrintout *printout, bool prompt = true); + virtual wxDC* PrintDialog(wxWindow *parent); + virtual bool Setup(wxWindow *parent); + +private: + DECLARE_DYNAMIC_CLASS(wxPostScriptPrinter) +}; + +// ---------------------------------------------------------------------------- +// wxPrintPreview: programmer creates an object of this class to preview a +// wxPrintout. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPostScriptPrintPreview : public wxPrintPreviewBase +{ +public: + wxPostScriptPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting = NULL, + wxPrintDialogData *data = NULL); + wxPostScriptPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintData *data); + + virtual ~wxPostScriptPrintPreview(); + + virtual bool Print(bool interactive); + virtual void DetermineScaling(); + +private: + void Init(wxPrintout *printout, wxPrintout *printoutForPrinting); + +private: + DECLARE_CLASS(wxPostScriptPrintPreview) +}; + +#endif + +#endif +// __PRINTPSH__ diff --git a/wxmsw/include/wx-3.0/wx/generic/prntdlgg.h b/wxmsw/include/wx-3.0/wx/generic/prntdlgg.h new file mode 100644 index 00000000..6c8f7bd5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/prntdlgg.h @@ -0,0 +1,256 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/prntdlgg.h +// Purpose: wxGenericPrintDialog, wxGenericPrintSetupDialog, +// wxGenericPageSetupDialog +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __PRINTDLGH_G_ +#define __PRINTDLGH_G_ + +#include "wx/defs.h" + +#if wxUSE_PRINTING_ARCHITECTURE + +#include "wx/dialog.h" +#include "wx/cmndata.h" +#include "wx/prntbase.h" +#include "wx/printdlg.h" +#include "wx/listctrl.h" + +#include "wx/dc.h" +#if wxUSE_POSTSCRIPT + #include "wx/dcps.h" +#endif + +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxCheckBox; +class WXDLLIMPEXP_FWD_CORE wxComboBox; +class WXDLLIMPEXP_FWD_CORE wxStaticText; +class WXDLLIMPEXP_FWD_CORE wxRadioBox; +class WXDLLIMPEXP_FWD_CORE wxPageSetupDialogData; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// This is not clear why all these enums start with 10 or 30 but do not change it +// without good reason to avoid some subtle backwards compatibility breakage + +enum +{ + wxPRINTID_STATIC = 10, + wxPRINTID_RANGE, + wxPRINTID_FROM, + wxPRINTID_TO, + wxPRINTID_COPIES, + wxPRINTID_PRINTTOFILE, + wxPRINTID_SETUP +}; + +enum +{ + wxPRINTID_LEFTMARGIN = 30, + wxPRINTID_RIGHTMARGIN, + wxPRINTID_TOPMARGIN, + wxPRINTID_BOTTOMMARGIN +}; + +enum +{ + wxPRINTID_PRINTCOLOUR = 10, + wxPRINTID_ORIENTATION, + wxPRINTID_COMMAND, + wxPRINTID_OPTIONS, + wxPRINTID_PAPERSIZE, + wxPRINTID_PRINTER +}; + +#if wxUSE_POSTSCRIPT + +//---------------------------------------------------------------------------- +// wxPostScriptNativeData +//---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPostScriptPrintNativeData: public wxPrintNativeDataBase +{ +public: + wxPostScriptPrintNativeData(); + virtual ~wxPostScriptPrintNativeData(); + + virtual bool TransferTo( wxPrintData &data ); + virtual bool TransferFrom( const wxPrintData &data ); + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const { return true; } + + const wxString& GetPrinterCommand() const { return m_printerCommand; } + const wxString& GetPrinterOptions() const { return m_printerOptions; } + const wxString& GetPreviewCommand() const { return m_previewCommand; } + const wxString& GetFontMetricPath() const { return m_afmPath; } + double GetPrinterScaleX() const { return m_printerScaleX; } + double GetPrinterScaleY() const { return m_printerScaleY; } + long GetPrinterTranslateX() const { return m_printerTranslateX; } + long GetPrinterTranslateY() const { return m_printerTranslateY; } + + void SetPrinterCommand(const wxString& command) { m_printerCommand = command; } + void SetPrinterOptions(const wxString& options) { m_printerOptions = options; } + void SetPreviewCommand(const wxString& command) { m_previewCommand = command; } + void SetFontMetricPath(const wxString& path) { m_afmPath = path; } + void SetPrinterScaleX(double x) { m_printerScaleX = x; } + void SetPrinterScaleY(double y) { m_printerScaleY = y; } + void SetPrinterScaling(double x, double y) { m_printerScaleX = x; m_printerScaleY = y; } + void SetPrinterTranslateX(long x) { m_printerTranslateX = x; } + void SetPrinterTranslateY(long y) { m_printerTranslateY = y; } + void SetPrinterTranslation(long x, long y) { m_printerTranslateX = x; m_printerTranslateY = y; } + +#if wxUSE_STREAMS + wxOutputStream *GetOutputStream() { return m_outputStream; } + void SetOutputStream( wxOutputStream *output ) { m_outputStream = output; } +#endif + +private: + wxString m_printerCommand; + wxString m_previewCommand; + wxString m_printerOptions; + wxString m_afmPath; + double m_printerScaleX; + double m_printerScaleY; + long m_printerTranslateX; + long m_printerTranslateY; +#if wxUSE_STREAMS + wxOutputStream *m_outputStream; +#endif + +private: + DECLARE_DYNAMIC_CLASS(wxPostScriptPrintNativeData) +}; + +// ---------------------------------------------------------------------------- +// Simulated Print and Print Setup dialogs for non-Windows platforms (and +// Windows using PostScript print/preview) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGenericPrintDialog : public wxPrintDialogBase +{ +public: + wxGenericPrintDialog(wxWindow *parent, + wxPrintDialogData* data = NULL); + wxGenericPrintDialog(wxWindow *parent, wxPrintData* data); + + virtual ~wxGenericPrintDialog(); + + void OnSetup(wxCommandEvent& event); + void OnRange(wxCommandEvent& event); + void OnOK(wxCommandEvent& event); + + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + virtual int ShowModal(); + + wxPrintData& GetPrintData() + { return m_printDialogData.GetPrintData(); } + + wxPrintDialogData& GetPrintDialogData() { return m_printDialogData; } + wxDC *GetPrintDC(); + +public: +// wxStaticText* m_printerMessage; + wxButton* m_setupButton; +// wxButton* m_helpButton; + wxRadioBox* m_rangeRadioBox; + wxTextCtrl* m_fromText; + wxTextCtrl* m_toText; + wxTextCtrl* m_noCopiesText; + wxCheckBox* m_printToFileCheckBox; +// wxCheckBox* m_collateCopiesCheckBox; + + wxPrintDialogData m_printDialogData; + +protected: + void Init(wxWindow *parent); + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGenericPrintDialog) +}; + +class WXDLLIMPEXP_CORE wxGenericPrintSetupDialog : public wxDialog +{ +public: + // There are no configuration options for the dialog, so we + // just pass the wxPrintData object (no wxPrintSetupDialogData class needed) + wxGenericPrintSetupDialog(wxWindow *parent, wxPrintData* data); + virtual ~wxGenericPrintSetupDialog(); + + void Init(wxPrintData* data); + + void OnPrinter(wxListEvent& event); + + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + virtual wxComboBox *CreatePaperTypeChoice(); + +public: + wxListCtrl* m_printerListCtrl; + wxRadioBox* m_orientationRadioBox; + wxTextCtrl* m_printerCommandText; + wxTextCtrl* m_printerOptionsText; + wxCheckBox* m_colourCheckBox; + wxComboBox* m_paperTypeChoice; + + wxPrintData m_printData; + wxPrintData& GetPrintData() { return m_printData; } + + // After pressing OK, write data here. + wxPrintData* m_targetData; + +private: + DECLARE_EVENT_TABLE() + DECLARE_CLASS(wxGenericPrintSetupDialog) +}; +#endif + // wxUSE_POSTSCRIPT + +class WXDLLIMPEXP_CORE wxGenericPageSetupDialog : public wxPageSetupDialogBase +{ +public: + wxGenericPageSetupDialog(wxWindow *parent = NULL, + wxPageSetupDialogData* data = NULL); + virtual ~wxGenericPageSetupDialog(); + + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + virtual wxPageSetupDialogData& GetPageSetupDialogData(); + + void OnPrinter(wxCommandEvent& event); + wxComboBox *CreatePaperTypeChoice(int* x, int* y); + +public: + wxButton* m_printerButton; + wxRadioBox* m_orientationRadioBox; + wxTextCtrl* m_marginLeftText; + wxTextCtrl* m_marginTopText; + wxTextCtrl* m_marginRightText; + wxTextCtrl* m_marginBottomText; + wxComboBox* m_paperTypeChoice; + + wxPageSetupDialogData m_pageData; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxGenericPageSetupDialog) +}; + +#endif + +#endif +// __PRINTDLGH_G_ diff --git a/wxmsw/include/wx-3.0/wx/generic/progdlgg.h b/wxmsw/include/wx-3.0/wx/generic/progdlgg.h new file mode 100644 index 00000000..d29452f1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/progdlgg.h @@ -0,0 +1,229 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/progdlgg.h +// Purpose: wxGenericProgressDialog class +// Author: Karsten Ballueder +// Modified by: Francesco Montorsi +// Created: 09.05.1999 +// Copyright: (c) Karsten Ballueder +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef __PROGDLGH_G__ +#define __PROGDLGH_G__ + +#include "wx/dialog.h" + +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxEventLoop; +class WXDLLIMPEXP_FWD_CORE wxGauge; +class WXDLLIMPEXP_FWD_CORE wxStaticText; +class WXDLLIMPEXP_FWD_CORE wxWindowDisabler; + +/* + Progress dialog which shows a moving progress bar. + Taken from the Mahogany project. +*/ +class WXDLLIMPEXP_CORE wxGenericProgressDialog : public wxDialog +{ +public: + wxGenericProgressDialog(); + wxGenericProgressDialog(const wxString& title, const wxString& message, + int maximum = 100, + wxWindow *parent = NULL, + int style = wxPD_APP_MODAL | wxPD_AUTO_HIDE); + + virtual ~wxGenericProgressDialog(); + + bool Create(const wxString& title, + const wxString& message, + int maximum = 100, + wxWindow *parent = NULL, + int style = wxPD_APP_MODAL | wxPD_AUTO_HIDE); + + virtual bool Update(int value, const wxString& newmsg = wxEmptyString, bool *skip = NULL); + virtual bool Pulse(const wxString& newmsg = wxEmptyString, bool *skip = NULL); + + void Resume(); + + int GetValue() const; + int GetRange() const; + wxString GetMessage() const; + + void SetRange(int maximum); + + // Return whether "Cancel" or "Skip" button was pressed, always return + // false if the corresponding button is not shown. + bool WasCancelled() const; + bool WasSkipped() const; + + // Must provide overload to avoid hiding it (and warnings about it) + virtual void Update() { wxDialog::Update(); } + + virtual bool Show( bool show = true ); + + // This enum is an implementation detail and should not be used + // by user code. + enum State + { + Uncancelable = -1, // dialog can't be canceled + Canceled, // can be cancelled and, in fact, was + Continue, // can be cancelled but wasn't + Finished, // finished, waiting to be removed from screen + Dismissed // was closed by user after finishing + }; + +protected: + // Update just the m_maximum field, this is used by public SetRange() but, + // unlike it, doesn't update the controls state. This makes it useful for + // both this class and its derived classes that don't use m_gauge to + // display progress. + void SetMaximum(int maximum); + + // Return the labels to use for showing the elapsed/estimated/remaining + // times respectively. + static wxString GetElapsedLabel() { return wxGetTranslation("Elapsed time:"); } + static wxString GetEstimatedLabel() { return wxGetTranslation("Estimated time:"); } + static wxString GetRemainingLabel() { return wxGetTranslation("Remaining time:"); } + + + // Similar to wxWindow::HasFlag() but tests for a presence of a wxPD_XXX + // flag in our (separate) flags instead of using m_windowStyle. + bool HasPDFlag(int flag) const { return (m_pdStyle & flag) != 0; } + + // Return the progress dialog style. Prefer to use HasPDFlag() if possible. + int GetPDStyle() const { return m_pdStyle; } + void SetPDStyle(int pdStyle) { m_pdStyle = pdStyle; } + + // Updates estimated times from a given progress bar value and stores the + // results in provided arguments. + void UpdateTimeEstimates(int value, + unsigned long &elapsedTime, + unsigned long &estimatedTime, + unsigned long &remainingTime); + + // Converts seconds to HH:mm:ss format. + static wxString GetFormattedTime(unsigned long timeInSec); + + // callback for optional abort button + void OnCancel(wxCommandEvent&); + + // callback for optional skip button + void OnSkip(wxCommandEvent&); + + // callback to disable "hard" window closing + void OnClose(wxCloseEvent&); + + // called to disable the other windows while this dialog is shown + void DisableOtherWindows(); + + // must be called to reenable the other windows temporarily disabled while + // the dialog was shown + void ReenableOtherWindows(); + + // Set the top level parent we store from the parent window provided when + // creating the dialog. + void SetTopParent(wxWindow* parent); + + // return the top level parent window of this dialog (may be NULL) + wxWindow *GetTopParent() const { return m_parentTop; } + + + // continue processing or not (return value for Update()) + State m_state; + + // the maximum value + int m_maximum; + +#if defined(__WXMSW__ ) || defined(__WXPM__) + // the factor we use to always keep the value in 16 bit range as the native + // control only supports ranges from 0 to 65,535 + size_t m_factor; +#endif // __WXMSW__ + + // time when the dialog was created + unsigned long m_timeStart; + // time when the dialog was closed or cancelled + unsigned long m_timeStop; + // time between the moment the dialog was closed/cancelled and resume + unsigned long m_break; + +private: + // update the label to show the given time (in seconds) + static void SetTimeLabel(unsigned long val, wxStaticText *label); + + // common part of all ctors + void Init(); + + // create the label with given text and another one to show the time nearby + // as the next windows in the sizer, returns the created control + wxStaticText *CreateLabel(const wxString& text, wxSizer *sizer); + + // updates the label message + void UpdateMessage(const wxString &newmsg); + + // common part of Update() and Pulse(), returns true if not cancelled + bool DoBeforeUpdate(bool *skip); + + // common part of Update() and Pulse() + void DoAfterUpdate(); + + // shortcuts for enabling buttons + void EnableClose(); + void EnableSkip(bool enable = true); + void EnableAbort(bool enable = true); + void DisableSkip() { EnableSkip(false); } + void DisableAbort() { EnableAbort(false); } + + // the widget displaying current status (may be NULL) + wxGauge *m_gauge; + // the message displayed + wxStaticText *m_msg; + // displayed elapsed, estimated, remaining time + wxStaticText *m_elapsed, + *m_estimated, + *m_remaining; + + // parent top level window (may be NULL) + wxWindow *m_parentTop; + + // Progress dialog styles: this is not the same as m_windowStyle because + // wxPD_XXX constants clash with the existing TLW styles so to be sure we + // don't have any conflicts we just use a separate variable for storing + // them. + int m_pdStyle; + + // skip some portion + bool m_skip; + +#if !defined(__SMARTPHONE__) + // the abort and skip buttons (or NULL if none) + wxButton *m_btnAbort; + wxButton *m_btnSkip; +#endif + + // saves the time when elapsed time was updated so there is only one + // update per second + unsigned long m_last_timeupdate; + + // tells how often a change of the estimated time has to be confirmed + // before it is actually displayed - this reduces the frequency of updates + // of estimated and remaining time + int m_delay; + + // counts the confirmations + int m_ctdelay; + unsigned long m_display_estimated; + + // for wxPD_APP_MODAL case + wxWindowDisabler *m_winDisabler; + + // Temporary event loop created by the dialog itself if there is no + // currently active loop when it is created. + wxEventLoop *m_tempEventLoop; + + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxGenericProgressDialog); +}; + +#endif // __PROGDLGH_G__ diff --git a/wxmsw/include/wx-3.0/wx/generic/propdlg.h b/wxmsw/include/wx-3.0/wx/generic/propdlg.h new file mode 100644 index 00000000..6cb63efa --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/propdlg.h @@ -0,0 +1,168 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/propdlg.h +// Purpose: wxPropertySheetDialog +// Author: Julian Smart +// Modified by: +// Created: 2005-03-12 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROPDLG_H_ +#define _WX_PROPDLG_H_ + +#include "wx/defs.h" + +#if wxUSE_BOOKCTRL + +#include "wx/dialog.h" + +class WXDLLIMPEXP_FWD_CORE wxBookCtrlBase; + +//----------------------------------------------------------------------------- +// wxPropertySheetDialog +// A platform-independent properties dialog. +// +// * on PocketPC, a flat-look 'property sheet' notebook will be used, with +// no OK/Cancel/Help buttons +// * on other platforms, a normal notebook will be used, with standard buttons +// +// To use this class, call Create from your derived class. +// Then create pages and add to the book control. Finally call CreateButtons and +// LayoutDialog. +// +// For example: +// +// MyPropertySheetDialog::Create(...) +// { +// wxPropertySheetDialog::Create(...); +// +// // Add page +// wxPanel* panel = new wxPanel(GetBookCtrl(), ...); +// GetBookCtrl()->AddPage(panel, wxT("General")); +// +// CreateButtons(); +// LayoutDialog(); +// } +// +// Override CreateBookCtrl and AddBookCtrl to create and add a different +// kind of book control. +//----------------------------------------------------------------------------- + +enum wxPropertySheetDialogFlags +{ + // Use the platform default + wxPROPSHEET_DEFAULT = 0x0001, + + // Use a notebook + wxPROPSHEET_NOTEBOOK = 0x0002, + + // Use a toolbook + wxPROPSHEET_TOOLBOOK = 0x0004, + + // Use a choicebook + wxPROPSHEET_CHOICEBOOK = 0x0008, + + // Use a listbook + wxPROPSHEET_LISTBOOK = 0x0010, + + // Use a wxButtonToolBar toolbook + wxPROPSHEET_BUTTONTOOLBOOK = 0x0020, + + // Use a treebook + wxPROPSHEET_TREEBOOK = 0x0040, + + // Shrink dialog to fit current page + wxPROPSHEET_SHRINKTOFIT = 0x0100 +}; + +class WXDLLIMPEXP_ADV wxPropertySheetDialog : public wxDialog +{ +public: + wxPropertySheetDialog() : wxDialog() { Init(); } + + wxPropertySheetDialog(wxWindow* parent, wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE, + const wxString& name = wxDialogNameStr) + { + Init(); + Create(parent, id, title, pos, sz, style, name); + } + + bool Create(wxWindow* parent, wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE, + const wxString& name = wxDialogNameStr); + +//// Accessors + + // Set and get the notebook + void SetBookCtrl(wxBookCtrlBase* book) { m_bookCtrl = book; } + wxBookCtrlBase* GetBookCtrl() const { return m_bookCtrl; } + + // Override function in base + virtual wxWindow* GetContentWindow() const; + + // Set and get the inner sizer + void SetInnerSize(wxSizer* sizer) { m_innerSizer = sizer; } + wxSizer* GetInnerSizer() const { return m_innerSizer ; } + + // Set and get the book style + void SetSheetStyle(long sheetStyle) { m_sheetStyle = sheetStyle; } + long GetSheetStyle() const { return m_sheetStyle ; } + + // Set and get the border around the whole dialog + void SetSheetOuterBorder(int border) { m_sheetOuterBorder = border; } + int GetSheetOuterBorder() const { return m_sheetOuterBorder ; } + + // Set and get the border around the book control only + void SetSheetInnerBorder(int border) { m_sheetInnerBorder = border; } + int GetSheetInnerBorder() const { return m_sheetInnerBorder ; } + +/// Operations + + // Creates the buttons (none on PocketPC) + virtual void CreateButtons(int flags = wxOK|wxCANCEL); + + // Lay out the dialog, to be called after pages have been created + virtual void LayoutDialog(int centreFlags = wxBOTH); + +/// Implementation + + // Creates the book control. If you want to use a different kind of + // control, override. + virtual wxBookCtrlBase* CreateBookCtrl(); + + // Adds the book control to the inner sizer. + virtual void AddBookCtrl(wxSizer* sizer); + + // Set the focus + void OnActivate(wxActivateEvent& event); + + // Resize dialog if necessary + void OnIdle(wxIdleEvent& event); + +private: + void Init(); + +protected: + wxBookCtrlBase* m_bookCtrl; + wxSizer* m_innerSizer; // sizer for extra space + long m_sheetStyle; + int m_sheetOuterBorder; + int m_sheetInnerBorder; + int m_selectedPage; + + DECLARE_DYNAMIC_CLASS(wxPropertySheetDialog) + DECLARE_EVENT_TABLE() +}; + +#endif // wxUSE_BOOKCTRL + +#endif // _WX_PROPDLG_H_ + diff --git a/wxmsw/include/wx-3.0/wx/generic/richmsgdlgg.h b/wxmsw/include/wx-3.0/wx/generic/richmsgdlgg.h new file mode 100644 index 00000000..5446f87f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/richmsgdlgg.h @@ -0,0 +1,48 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/richmsgdlgg.h +// Purpose: wxGenericRichMessageDialog +// Author: Rickard Westerlund +// Created: 2010-07-04 +// Copyright: (c) 2010 wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_RICHMSGDLGG_H_ +#define _WX_GENERIC_RICHMSGDLGG_H_ + +class WXDLLIMPEXP_FWD_CORE wxCheckBox; +class WXDLLIMPEXP_FWD_CORE wxCollapsiblePane; +class WXDLLIMPEXP_FWD_CORE wxCollapsiblePaneEvent; + +class WXDLLIMPEXP_CORE wxGenericRichMessageDialog + : public wxRichMessageDialogBase +{ +public: + wxGenericRichMessageDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + long style) + : wxRichMessageDialogBase( parent, message, caption, style ), + m_checkBox(NULL), + m_detailsPane(NULL) + { } + + virtual bool IsCheckBoxChecked() const; + +protected: + wxCheckBox *m_checkBox; + wxCollapsiblePane *m_detailsPane; + + // overrides methods in the base class + virtual void AddMessageDialogCheckBox(wxSizer *sizer); + virtual void AddMessageDialogDetails(wxSizer *sizer); + +private: + void OnPaneChanged(wxCollapsiblePaneEvent& event); + + DECLARE_EVENT_TABLE() + + wxDECLARE_NO_COPY_CLASS(wxGenericRichMessageDialog); +}; + +#endif // _WX_GENERIC_RICHMSGDLGG_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/sashwin.h b/wxmsw/include/wx-3.0/wx/generic/sashwin.h new file mode 100644 index 00000000..e4f34d82 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/sashwin.h @@ -0,0 +1,267 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/sashwin.h +// Purpose: wxSashWindow implementation. A sash window has an optional +// sash on each edge, allowing it to be dragged. An event +// is generated when the sash is released. +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SASHWIN_H_G_ +#define _WX_SASHWIN_H_G_ + +#if wxUSE_SASH + +#include "wx/defs.h" +#include "wx/window.h" +#include "wx/string.h" + +#define wxSASH_DRAG_NONE 0 +#define wxSASH_DRAG_DRAGGING 1 +#define wxSASH_DRAG_LEFT_DOWN 2 + +enum wxSashEdgePosition { + wxSASH_TOP = 0, + wxSASH_RIGHT, + wxSASH_BOTTOM, + wxSASH_LEFT, + wxSASH_NONE = 100 +}; + +/* + * wxSashEdge represents one of the four edges of a window. + */ + +class WXDLLIMPEXP_ADV wxSashEdge +{ +public: + wxSashEdge() + { m_show = false; +#if WXWIN_COMPATIBILITY_2_6 + m_border = false; +#endif + m_margin = 0; } + + bool m_show; // Is the sash showing? +#if WXWIN_COMPATIBILITY_2_6 + bool m_border; // Do we draw a border? +#endif + int m_margin; // The margin size +}; + +/* + * wxSashWindow flags + */ + +#define wxSW_NOBORDER 0x0000 +//#define wxSW_3D 0x0010 +#define wxSW_BORDER 0x0020 +#define wxSW_3DSASH 0x0040 +#define wxSW_3DBORDER 0x0080 +#define wxSW_3D (wxSW_3DSASH | wxSW_3DBORDER) + +/* + * wxSashWindow allows any of its edges to have a sash which can be dragged + * to resize the window. The actual content window will be created as a child + * of wxSashWindow. + */ + +class WXDLLIMPEXP_ADV wxSashWindow: public wxWindow +{ +public: + // Default constructor + wxSashWindow() + { + Init(); + } + + // Normal constructor + wxSashWindow(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxSW_3D|wxCLIP_CHILDREN, const wxString& name = wxT("sashWindow")) + { + Init(); + Create(parent, id, pos, size, style, name); + } + + virtual ~wxSashWindow(); + + bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxSW_3D|wxCLIP_CHILDREN, const wxString& name = wxT("sashWindow")); + + // Set whether there's a sash in this position + void SetSashVisible(wxSashEdgePosition edge, bool sash); + + // Get whether there's a sash in this position + bool GetSashVisible(wxSashEdgePosition edge) const { return m_sashes[edge].m_show; } + +#if WXWIN_COMPATIBILITY_2_6 + // Set whether there's a border in this position + // This value is unused in wxSashWindow. + void SetSashBorder(wxSashEdgePosition edge, bool border) { m_sashes[edge].m_border = border; } + + // Get whether there's a border in this position + // This value is unused in wxSashWindow. + bool HasBorder(wxSashEdgePosition edge) const { return m_sashes[edge].m_border; } +#endif + + // Get border size + int GetEdgeMargin(wxSashEdgePosition edge) const { return m_sashes[edge].m_margin; } + + // Sets the default sash border size + void SetDefaultBorderSize(int width) { m_borderSize = width; } + + // Gets the default sash border size + int GetDefaultBorderSize() const { return m_borderSize; } + + // Sets the addition border size between child and sash window + void SetExtraBorderSize(int width) { m_extraBorderSize = width; } + + // Gets the addition border size between child and sash window + int GetExtraBorderSize() const { return m_extraBorderSize; } + + virtual void SetMinimumSizeX(int min) { m_minimumPaneSizeX = min; } + virtual void SetMinimumSizeY(int min) { m_minimumPaneSizeY = min; } + virtual int GetMinimumSizeX() const { return m_minimumPaneSizeX; } + virtual int GetMinimumSizeY() const { return m_minimumPaneSizeY; } + + virtual void SetMaximumSizeX(int max) { m_maximumPaneSizeX = max; } + virtual void SetMaximumSizeY(int max) { m_maximumPaneSizeY = max; } + virtual int GetMaximumSizeX() const { return m_maximumPaneSizeX; } + virtual int GetMaximumSizeY() const { return m_maximumPaneSizeY; } + +//////////////////////////////////////////////////////////////////////////// +// Implementation + + // Paints the border and sash + void OnPaint(wxPaintEvent& event); + + // Handles mouse events + void OnMouseEvent(wxMouseEvent& ev); + + // Adjusts the panes + void OnSize(wxSizeEvent& event); + +#if defined(__WXMSW__) || defined(__WXMAC__) + // Handle cursor correctly + void OnSetCursor(wxSetCursorEvent& event); +#endif // wxMSW + + // Draws borders + void DrawBorders(wxDC& dc); + + // Draws the sashes + void DrawSash(wxSashEdgePosition edge, wxDC& dc); + + // Draws the sashes + void DrawSashes(wxDC& dc); + + // Draws the sash tracker (for whilst moving the sash) + void DrawSashTracker(wxSashEdgePosition edge, int x, int y); + + // Tests for x, y over sash + wxSashEdgePosition SashHitTest(int x, int y, int tolerance = 2); + + // Resizes subwindows + void SizeWindows(); + + // Initialize colours + void InitColours(); + +private: + void Init(); + + wxSashEdge m_sashes[4]; + int m_dragMode; + wxSashEdgePosition m_draggingEdge; + int m_oldX; + int m_oldY; + int m_borderSize; + int m_extraBorderSize; + int m_firstX; + int m_firstY; + int m_minimumPaneSizeX; + int m_minimumPaneSizeY; + int m_maximumPaneSizeX; + int m_maximumPaneSizeY; + wxCursor* m_sashCursorWE; + wxCursor* m_sashCursorNS; + wxColour m_lightShadowColour; + wxColour m_mediumShadowColour; + wxColour m_darkShadowColour; + wxColour m_hilightColour; + wxColour m_faceColour; + bool m_mouseCaptured; + wxCursor* m_currentCursor; + +private: + DECLARE_DYNAMIC_CLASS(wxSashWindow) + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxSashWindow); +}; + +class WXDLLIMPEXP_FWD_ADV wxSashEvent; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_SASH_DRAGGED, wxSashEvent ); + +enum wxSashDragStatus +{ + wxSASH_STATUS_OK, + wxSASH_STATUS_OUT_OF_RANGE +}; + +class WXDLLIMPEXP_ADV wxSashEvent: public wxCommandEvent +{ +public: + wxSashEvent(int id = 0, wxSashEdgePosition edge = wxSASH_NONE) + { + m_eventType = (wxEventType) wxEVT_SASH_DRAGGED; + m_id = id; + m_edge = edge; + } + + wxSashEvent(const wxSashEvent& event) + : wxCommandEvent(event), + m_edge(event.m_edge), + m_dragRect(event.m_dragRect), + m_dragStatus(event.m_dragStatus) { } + + void SetEdge(wxSashEdgePosition edge) { m_edge = edge; } + wxSashEdgePosition GetEdge() const { return m_edge; } + + //// The rectangle formed by the drag operation + void SetDragRect(const wxRect& rect) { m_dragRect = rect; } + wxRect GetDragRect() const { return m_dragRect; } + + //// Whether the drag caused the rectangle to be reversed (e.g. + //// dragging the top below the bottom) + void SetDragStatus(wxSashDragStatus status) { m_dragStatus = status; } + wxSashDragStatus GetDragStatus() const { return m_dragStatus; } + + virtual wxEvent *Clone() const { return new wxSashEvent(*this); } + +private: + wxSashEdgePosition m_edge; + wxRect m_dragRect; + wxSashDragStatus m_dragStatus; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSashEvent) +}; + +typedef void (wxEvtHandler::*wxSashEventFunction)(wxSashEvent&); + +#define wxSashEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxSashEventFunction, func) + +#define EVT_SASH_DRAGGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_SASH_DRAGGED, id, wxSashEventHandler(fn)) +#define EVT_SASH_DRAGGED_RANGE(id1, id2, fn) \ + wx__DECLARE_EVT2(wxEVT_SASH_DRAGGED, id1, id2, wxSashEventHandler(fn)) + +#endif // wxUSE_SASH + +#endif + // _WX_SASHWIN_H_G_ diff --git a/wxmsw/include/wx-3.0/wx/generic/scrolwin.h b/wxmsw/include/wx-3.0/wx/generic/scrolwin.h new file mode 100644 index 00000000..863cdf92 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/scrolwin.h @@ -0,0 +1,53 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/scrolwin.h +// Purpose: generic wxScrollHelper +// Author: Vadim Zeitlin +// Created: 2008-12-24 (replacing old file with the same name) +// Copyright: (c) 2008 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_SCROLLWIN_H_ +#define _WX_GENERIC_SCROLLWIN_H_ + +// ---------------------------------------------------------------------------- +// generic wxScrollHelper implementation +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxScrollHelper : public wxScrollHelperBase +{ +public: + wxScrollHelper(wxWindow *winToScroll); + + // implement base class pure virtuals + virtual void AdjustScrollbars(); + virtual bool IsScrollbarShown(int orient) const; + +protected: + virtual void DoScroll(int x, int y); + virtual void DoShowScrollbars(wxScrollbarVisibility horz, + wxScrollbarVisibility vert); + +private: + // helper of AdjustScrollbars(): does the work for the single scrollbar + // + // notice that the parameters passed by non-const references are modified + // by this function + void DoAdjustScrollbar(int orient, + int clientSize, + int virtSize, + int pixelsPerUnit, + int& scrollUnits, + int& scrollPosition, + int& scrollLinesPerPage, + wxScrollbarVisibility visibility); + + + wxScrollbarVisibility m_xVisibility, + m_yVisibility; + + wxDECLARE_NO_COPY_CLASS(wxScrollHelper); +}; + +#endif // _WX_GENERIC_SCROLLWIN_H_ + diff --git a/wxmsw/include/wx-3.0/wx/generic/spinctlg.h b/wxmsw/include/wx-3.0/wx/generic/spinctlg.h new file mode 100644 index 00000000..a35cc8a4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/spinctlg.h @@ -0,0 +1,432 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/spinctlg.h +// Purpose: generic wxSpinCtrl class +// Author: Vadim Zeitlin +// Modified by: +// Created: 28.10.99 +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_SPINCTRL_H_ +#define _WX_GENERIC_SPINCTRL_H_ + +// ---------------------------------------------------------------------------- +// wxSpinCtrl is a combination of wxSpinButton and wxTextCtrl, so if +// wxSpinButton is available, this is what we do - but if it isn't, we still +// define wxSpinCtrl class which then has the same appearance as wxTextCtrl but +// the different interface. This allows to write programs using wxSpinCtrl +// without tons of #ifdefs. +// ---------------------------------------------------------------------------- + +#if wxUSE_SPINBTN + +#include "wx/compositewin.h" + +class WXDLLIMPEXP_FWD_CORE wxSpinButton; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; + +class wxSpinCtrlTextGeneric; // wxTextCtrl used for the wxSpinCtrlGenericBase + +// The !wxUSE_SPINBTN version's GetValue() function conflicts with the +// wxTextCtrl's GetValue() and so you have to input a dummy int value. +#define wxSPINCTRL_GETVALUE_FIX + +// ---------------------------------------------------------------------------- +// wxSpinCtrlGeneric is a combination of wxTextCtrl and wxSpinButton +// +// This class manages a double valued generic spinctrl through the DoGet/SetXXX +// functions that are made public as Get/SetXXX functions for int or double +// for the wxSpinCtrl and wxSpinCtrlDouble classes respectively to avoid +// function ambiguity. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSpinCtrlGenericBase + : public wxNavigationEnabled > +{ +public: + wxSpinCtrlGenericBase() { Init(); } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT, + double min = 0, double max = 100, double initial = 0, + double inc = 1, + const wxString& name = wxT("wxSpinCtrl")); + + virtual ~wxSpinCtrlGenericBase(); + + // accessors + // T GetValue() const + // T GetMin() const + // T GetMax() const + // T GetIncrement() const + virtual bool GetSnapToTicks() const { return m_snap_to_ticks; } + // unsigned GetDigits() const - wxSpinCtrlDouble only + + // operations + virtual void SetValue(const wxString& text); + // void SetValue(T val) + // void SetRange(T minVal, T maxVal) + // void SetIncrement(T inc) + virtual void SetSnapToTicks(bool snap_to_ticks); + // void SetDigits(unsigned digits) - wxSpinCtrlDouble only + + // Select text in the textctrl + void SetSelection(long from, long to); + + // implementation from now on + + // forward these functions to all subcontrols + virtual bool Enable(bool enable = true); + virtual bool Show(bool show = true); +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip(wxToolTip *tip); +#endif // wxUSE_TOOLTIPS + + virtual bool SetBackgroundColour(const wxColour& colour); + + // get the subcontrols + wxTextCtrl *GetText() const { return m_textCtrl; } + wxSpinButton *GetSpinButton() const { return m_spinButton; } + + // forwarded events from children windows + void OnSpinButton(wxSpinEvent& event); + void OnTextLostFocus(wxFocusEvent& event); + void OnTextChar(wxKeyEvent& event); + + // this window itself is used only as a container for its sub windows so it + // shouldn't accept the focus at all and any attempts to explicitly set + // focus to it should give focus to its text constol part + virtual bool AcceptsFocus() const { return false; } + virtual void SetFocus(); + + friend class wxSpinCtrlTextGeneric; + +protected: + // override the base class virtuals involved into geometry calculations + virtual wxSize DoGetBestSize() const; + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; + virtual void DoMoveWindow(int x, int y, int width, int height); + +#ifdef __WXMSW__ + // and, for MSW, enabling this window itself + virtual void DoEnable(bool enable); +#endif // __WXMSW__ + + enum SendEvent + { + SendEvent_None, + SendEvent_Text + }; + + // generic double valued functions + double DoGetValue() const { return m_value; } + bool DoSetValue(double val, SendEvent sendEvent); + void DoSetRange(double min_val, double max_val); + void DoSetIncrement(double inc); + + // update our value to reflect the text control contents (if it has been + // modified by user, do nothing otherwise) + // + // can also change the text control if its value is invalid + // + // return true if our value has changed + bool SyncSpinToText(SendEvent sendEvent); + + // Send the correct event type + virtual void DoSendEvent() = 0; + + // Convert the text to/from the corresponding value. + virtual bool DoTextToValue(const wxString& text, double *val) = 0; + virtual wxString DoValueToText(double val) = 0; + + // check if the value is in range + bool InRange(double n) const { return (n >= m_min) && (n <= m_max); } + + // ensure that the value is in range wrapping it round if necessary + double AdjustToFitInRange(double value) const; + + + double m_value; + double m_min; + double m_max; + double m_increment; + bool m_snap_to_ticks; + + int m_spin_value; + + // the subcontrols + wxTextCtrl *m_textCtrl; + wxSpinButton *m_spinButton; + +private: + // common part of all ctors + void Init(); + + // Implement pure virtual function inherited from wxCompositeWindow. + virtual wxWindowList GetCompositeWindowParts() const; + + DECLARE_EVENT_TABLE() +}; + +#else // !wxUSE_SPINBTN + +#define wxSPINCTRL_GETVALUE_FIX int = 1 + +// ---------------------------------------------------------------------------- +// wxSpinCtrl is just a text control +// ---------------------------------------------------------------------------- + +#include "wx/textctrl.h" + +class WXDLLIMPEXP_CORE wxSpinCtrlGenericBase : public wxTextCtrl +{ +public: + wxSpinCtrlGenericBase() : m_value(0), m_min(0), m_max(100), + m_increment(1), m_snap_to_ticks(false), + m_format(wxT("%g")) { } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT, + double min = 0, double max = 100, double initial = 0, + double inc = 1, + const wxString& name = wxT("wxSpinCtrl")) + { + m_min = min; + m_max = max; + m_value = initial; + m_increment = inc; + + bool ok = wxTextCtrl::Create(parent, id, value, pos, size, style, + wxDefaultValidator, name); + DoSetValue(initial, SendEvent_None); + + return ok; + } + + // accessors + // T GetValue() const + // T GetMin() const + // T GetMax() const + // T GetIncrement() const + virtual bool GetSnapToTicks() const { return m_snap_to_ticks; } + // unsigned GetDigits() const - wxSpinCtrlDouble only + + // operations + virtual void SetValue(const wxString& text) { wxTextCtrl::SetValue(text); } + // void SetValue(T val) + // void SetRange(T minVal, T maxVal) + // void SetIncrement(T inc) + virtual void SetSnapToTicks(bool snap_to_ticks) + { m_snap_to_ticks = snap_to_ticks; } + // void SetDigits(unsigned digits) - wxSpinCtrlDouble only + + // Select text in the textctrl + //void SetSelection(long from, long to); + +protected: + // generic double valued + double DoGetValue() const + { + double n; + if ( (wxSscanf(wxTextCtrl::GetValue(), wxT("%lf"), &n) != 1) ) + n = INT_MIN; + + return n; + } + + bool DoSetValue(double val, SendEvent sendEvent) + { + wxString str(wxString::Format(m_format, val)); + switch ( sendEvent ) + { + case SendEvent_None: + wxTextCtrl::ChangeValue(str); + break; + + case SendEvent_Text: + wxTextCtrl::SetValue(str); + break; + } + + return true; + } + void DoSetRange(double min_val, double max_val) + { + m_min = min_val; + m_max = max_val; + } + void DoSetIncrement(double inc) { m_increment = inc; } // Note: unused + + double m_value; + double m_min; + double m_max; + double m_increment; + bool m_snap_to_ticks; + wxString m_format; +}; + +#endif // wxUSE_SPINBTN/!wxUSE_SPINBTN + +#if !defined(wxHAS_NATIVE_SPINCTRL) + +//----------------------------------------------------------------------------- +// wxSpinCtrl +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSpinCtrl : public wxSpinCtrlGenericBase +{ +public: + wxSpinCtrl() { Init(); } + wxSpinCtrl(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT, + int min = 0, int max = 100, int initial = 0, + const wxString& name = wxT("wxSpinCtrl")) + { + Init(); + + Create(parent, id, value, pos, size, style, min, max, initial, name); + } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT, + int min = 0, int max = 100, int initial = 0, + const wxString& name = wxT("wxSpinCtrl")) + { + return wxSpinCtrlGenericBase::Create(parent, id, value, pos, size, + style, min, max, initial, 1, name); + } + + // accessors + int GetValue(wxSPINCTRL_GETVALUE_FIX) const { return int(DoGetValue()); } + int GetMin() const { return int(m_min); } + int GetMax() const { return int(m_max); } + int GetIncrement() const { return int(m_increment); } + + // operations + void SetValue(const wxString& value) + { wxSpinCtrlGenericBase::SetValue(value); } + void SetValue( int value ) { DoSetValue(value, SendEvent_None); } + void SetRange( int minVal, int maxVal ) { DoSetRange(minVal, maxVal); } + void SetIncrement(int inc) { DoSetIncrement(inc); } + + virtual int GetBase() const { return m_base; } + virtual bool SetBase(int base); + +protected: + virtual void DoSendEvent(); + + virtual bool DoTextToValue(const wxString& text, double *val); + virtual wxString DoValueToText(double val); + +private: + // Common part of all ctors. + void Init() + { + m_base = 10; + } + + int m_base; + + DECLARE_DYNAMIC_CLASS(wxSpinCtrl) +}; + +#endif // wxHAS_NATIVE_SPINCTRL + +//----------------------------------------------------------------------------- +// wxSpinCtrlDouble +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSpinCtrlDouble : public wxSpinCtrlGenericBase +{ +public: + wxSpinCtrlDouble() { Init(); } + wxSpinCtrlDouble(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT, + double min = 0, double max = 100, double initial = 0, + double inc = 1, + const wxString& name = wxT("wxSpinCtrlDouble")) + { + Init(); + + Create(parent, id, value, pos, size, style, + min, max, initial, inc, name); + } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT, + double min = 0, double max = 100, double initial = 0, + double inc = 1, + const wxString& name = wxT("wxSpinCtrlDouble")) + { + return wxSpinCtrlGenericBase::Create(parent, id, value, pos, size, + style, min, max, initial, + inc, name); + } + + // accessors + double GetValue(wxSPINCTRL_GETVALUE_FIX) const { return DoGetValue(); } + double GetMin() const { return m_min; } + double GetMax() const { return m_max; } + double GetIncrement() const { return m_increment; } + unsigned GetDigits() const { return m_digits; } + + // operations + void SetValue(const wxString& value) + { wxSpinCtrlGenericBase::SetValue(value); } + void SetValue(double value) { DoSetValue(value, SendEvent_None); } + void SetRange(double minVal, double maxVal) { DoSetRange(minVal, maxVal); } + void SetIncrement(double inc) { DoSetIncrement(inc); } + void SetDigits(unsigned digits); + + // We don't implement bases support for floating point numbers, this is not + // very useful in practice. + virtual int GetBase() const { return 10; } + virtual bool SetBase(int WXUNUSED(base)) { return 0; } + +protected: + virtual void DoSendEvent(); + + virtual bool DoTextToValue(const wxString& text, double *val); + virtual wxString DoValueToText(double val); + + unsigned m_digits; + +private: + // Common part of all ctors. + void Init() + { + m_digits = 0; + m_format = wxS("%g"); + } + + wxString m_format; + + DECLARE_DYNAMIC_CLASS(wxSpinCtrlDouble) +}; + +#endif // _WX_GENERIC_SPINCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/splash.h b/wxmsw/include/wx-3.0/wx/generic/splash.h new file mode 100644 index 00000000..24ad733d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/splash.h @@ -0,0 +1,97 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/splash.h +// Purpose: Splash screen class +// Author: Julian Smart +// Modified by: +// Created: 28/6/2000 +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SPLASH_H_ +#define _WX_SPLASH_H_ + +#include "wx/bitmap.h" +#include "wx/eventfilter.h" +#include "wx/frame.h" +#include "wx/timer.h" + + +/* + * A window for displaying a splash screen + */ + +#define wxSPLASH_CENTRE_ON_PARENT 0x01 +#define wxSPLASH_CENTRE_ON_SCREEN 0x02 +#define wxSPLASH_NO_CENTRE 0x00 +#define wxSPLASH_TIMEOUT 0x04 +#define wxSPLASH_NO_TIMEOUT 0x00 + +class WXDLLIMPEXP_FWD_ADV wxSplashScreenWindow; + +/* + * wxSplashScreen + */ + +class WXDLLIMPEXP_ADV wxSplashScreen: public wxFrame, + public wxEventFilter +{ +public: + // for RTTI macros only + wxSplashScreen() { Init(); } + wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int milliseconds, + wxWindow* parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSIMPLE_BORDER|wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP); + virtual ~wxSplashScreen(); + + void OnCloseWindow(wxCloseEvent& event); + void OnNotify(wxTimerEvent& event); + + long GetSplashStyle() const { return m_splashStyle; } + wxSplashScreenWindow* GetSplashWindow() const { return m_window; } + int GetTimeout() const { return m_milliseconds; } + + // Override wxEventFilter method to hide splash screen on any user input. + virtual int FilterEvent(wxEvent& event); + +protected: + // Common part of all ctors. + void Init(); + + wxSplashScreenWindow* m_window; + long m_splashStyle; + int m_milliseconds; + wxTimer m_timer; + + DECLARE_DYNAMIC_CLASS(wxSplashScreen) + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxSplashScreen); +}; + +/* + * wxSplashScreenWindow + */ + +class WXDLLIMPEXP_ADV wxSplashScreenWindow: public wxWindow +{ +public: + wxSplashScreenWindow(const wxBitmap& bitmap, wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxNO_BORDER); + + void OnPaint(wxPaintEvent& event); + void OnEraseBackground(wxEraseEvent& event); + + void SetBitmap(const wxBitmap& bitmap) { m_bitmap = bitmap; } + wxBitmap& GetBitmap() { return m_bitmap; } + +protected: + wxBitmap m_bitmap; + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxSplashScreenWindow); +}; + + +#endif + // _WX_SPLASH_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/splitter.h b/wxmsw/include/wx-3.0/wx/generic/splitter.h new file mode 100644 index 00000000..61128a39 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/splitter.h @@ -0,0 +1,419 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/splitter.h +// Purpose: wxSplitterWindow class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_SPLITTER_H_ +#define _WX_GENERIC_SPLITTER_H_ + +#include "wx/window.h" // base class declaration +#include "wx/containr.h" // wxControlContainer + +class WXDLLIMPEXP_FWD_CORE wxSplitterEvent; + +// --------------------------------------------------------------------------- +// splitter constants +// --------------------------------------------------------------------------- + +enum wxSplitMode +{ + wxSPLIT_HORIZONTAL = 1, + wxSPLIT_VERTICAL +}; + +enum +{ + wxSPLIT_DRAG_NONE, + wxSPLIT_DRAG_DRAGGING, + wxSPLIT_DRAG_LEFT_DOWN +}; + +// --------------------------------------------------------------------------- +// wxSplitterWindow maintains one or two panes, with +// an optional vertical or horizontal split which +// can be used with the mouse or programmatically. +// --------------------------------------------------------------------------- + +// TODO: +// 1) Perhaps make the borders sensitive to dragging in order to create a split. +// The MFC splitter window manages scrollbars as well so is able to +// put sash buttons on the scrollbars, but we probably don't want to go down +// this path. +// 2) for wxWidgets 2.0, we must find a way to set the WS_CLIPCHILDREN style +// to prevent flickering. (WS_CLIPCHILDREN doesn't work in all cases so can't be +// standard). + +class WXDLLIMPEXP_CORE wxSplitterWindow: public wxNavigationEnabled +{ +public: + +//////////////////////////////////////////////////////////////////////////// +// Public API + + // Default constructor + wxSplitterWindow() + { + Init(); + } + + // Normal constructor + wxSplitterWindow(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_3D, + const wxString& name = wxT("splitter")) + { + Init(); + Create(parent, id, pos, size, style, name); + } + + virtual ~wxSplitterWindow(); + + bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_3D, + const wxString& name = wxT("splitter")); + + // Gets the only or left/top pane + wxWindow *GetWindow1() const { return m_windowOne; } + + // Gets the right/bottom pane + wxWindow *GetWindow2() const { return m_windowTwo; } + + // Sets the split mode + void SetSplitMode(int mode) + { + wxASSERT_MSG( mode == wxSPLIT_VERTICAL || mode == wxSPLIT_HORIZONTAL, + wxT("invalid split mode") ); + + m_splitMode = (wxSplitMode)mode; + } + + // Gets the split mode + wxSplitMode GetSplitMode() const { return m_splitMode; } + + // Initialize with one window + void Initialize(wxWindow *window); + + // Associates the given window with window 2, drawing the appropriate sash + // and changing the split mode. + // Does nothing and returns false if the window is already split. + // A sashPosition of 0 means choose a default sash position, + // negative sashPosition specifies the size of right/lower pane as it's + // absolute value rather than the size of left/upper pane. + virtual bool SplitVertically(wxWindow *window1, + wxWindow *window2, + int sashPosition = 0) + { return DoSplit(wxSPLIT_VERTICAL, window1, window2, sashPosition); } + virtual bool SplitHorizontally(wxWindow *window1, + wxWindow *window2, + int sashPosition = 0) + { return DoSplit(wxSPLIT_HORIZONTAL, window1, window2, sashPosition); } + + // Removes the specified (or second) window from the view + // Doesn't actually delete the window. + bool Unsplit(wxWindow *toRemove = NULL); + + // Replaces one of the windows with another one (neither old nor new + // parameter should be NULL) + bool ReplaceWindow(wxWindow *winOld, wxWindow *winNew); + + // Make sure the child window sizes are updated. This is useful + // for reducing flicker by updating the sizes before a + // window is shown, if you know the overall size is correct. + void UpdateSize(); + + // Is the window split? + bool IsSplit() const { return (m_windowTwo != NULL); } + + // Sets the border size + void SetBorderSize(int WXUNUSED(width)) { } + + // Hide or show the sash and test whether it's currently hidden. + void SetSashInvisible(bool invisible = true); + bool IsSashInvisible() const { return HasFlag(wxSP_NOSASH); } + + // Gets the current sash size which may be 0 if it's hidden and the default + // sash size. + int GetSashSize() const; + int GetDefaultSashSize() const; + + // Gets the border size + int GetBorderSize() const; + + // Set the sash position + void SetSashPosition(int position, bool redraw = true); + + // Gets the sash position + int GetSashPosition() const { return m_sashPosition; } + + // Set the sash gravity + void SetSashGravity(double gravity); + + // Gets the sash gravity + double GetSashGravity() const { return m_sashGravity; } + + // If this is zero, we can remove panes by dragging the sash. + void SetMinimumPaneSize(int min); + int GetMinimumPaneSize() const { return m_minimumPaneSize; } + + // NB: the OnXXX() functions below are for backwards compatibility only, + // don't use them in new code but handle the events instead! + + // called when the sash position is about to change, may return a new value + // for the sash or -1 to prevent the change from happening at all + virtual int OnSashPositionChanging(int newSashPosition); + + // Called when the sash position is about to be changed, return + // false from here to prevent the change from taking place. + // Repositions sash to minimum position if pane would be too small. + // newSashPosition here is always positive or zero. + virtual bool OnSashPositionChange(int newSashPosition); + + // If the sash is moved to an extreme position, a subwindow + // is removed from the splitter window, and the app is + // notified. The app should delete or hide the window. + virtual void OnUnsplit(wxWindow *removed); + + // Called when the sash is double-clicked. + // The default behaviour is to remove the sash if the + // minimum pane size is zero. + virtual void OnDoubleClickSash(int x, int y); + +//////////////////////////////////////////////////////////////////////////// +// Implementation + + // Paints the border and sash + void OnPaint(wxPaintEvent& event); + + // Handles mouse events + void OnMouseEvent(wxMouseEvent& ev); + + // Aborts dragging mode + void OnMouseCaptureLost(wxMouseCaptureLostEvent& event); + + // Adjusts the panes + void OnSize(wxSizeEvent& event); + + // In live mode, resize child windows in idle time + void OnInternalIdle(); + + // Draws the sash + virtual void DrawSash(wxDC& dc); + + // Draws the sash tracker (for whilst moving the sash) + virtual void DrawSashTracker(int x, int y); + + // Tests for x, y over sash + virtual bool SashHitTest(int x, int y); + + // Resizes subwindows + virtual void SizeWindows(); + +#ifdef __WXMAC__ + virtual bool MacClipGrandChildren() const { return true ; } +#endif + + // Sets the sash size: this doesn't do anything and shouldn't be used at + // all any more. + wxDEPRECATED_INLINE( void SetSashSize(int WXUNUSED(width)), return; ) + +protected: + // event handlers +#if defined(__WXMSW__) || defined(__WXMAC__) + void OnSetCursor(wxSetCursorEvent& event); +#endif // wxMSW + + // send the given event, return false if the event was processed and vetoed + // by the user code + bool DoSendEvent(wxSplitterEvent& event); + + // common part of all ctors + void Init(); + + // common part of SplitVertically() and SplitHorizontally() + bool DoSplit(wxSplitMode mode, + wxWindow *window1, wxWindow *window2, + int sashPosition); + + // adjusts sash position with respect to min. pane and window sizes + int AdjustSashPosition(int sashPos) const; + + // get either width or height depending on the split mode + int GetWindowSize() const; + + // convert the user specified sash position which may be > 0 (as is), < 0 + // (specifying the size of the right pane) or 0 (use default) to the real + // position to be passed to DoSetSashPosition() + int ConvertSashPosition(int sashPos) const; + + // set the real sash position, sashPos here must be positive + // + // returns true if the sash position has been changed, false otherwise + bool DoSetSashPosition(int sashPos); + + // set the sash position and send an event about it having been changed + void SetSashPositionAndNotify(int sashPos); + + // callbacks executed when we detect that the mouse has entered or left + // the sash + virtual void OnEnterSash(); + virtual void OnLeaveSash(); + + // set the cursor appropriate for the current split mode + void SetResizeCursor(); + + // redraw the splitter if its "hotness" changed if necessary + void RedrawIfHotSensitive(bool isHot); + + // return the best size of the splitter equal to best sizes of its + // subwindows + virtual wxSize DoGetBestSize() const; + + + wxSplitMode m_splitMode; + wxWindow* m_windowOne; + wxWindow* m_windowTwo; + int m_dragMode; + int m_oldX; // current tracker position if not live mode + int m_oldY; // current tracker position if not live mode + int m_sashPosition; // Number of pixels from left or top + double m_sashGravity; + wxSize m_lastSize; + int m_requestedSashPosition; + int m_sashPositionCurrent; // while dragging + wxPoint m_ptStart; // mouse position when dragging started + int m_sashStart; // sash position when dragging started + int m_minimumPaneSize; + wxCursor m_sashCursorWE; + wxCursor m_sashCursorNS; + wxPen *m_sashTrackerPen; + + // when in live mode, set this to true to resize children in idle + bool m_needUpdating:1; + bool m_permitUnsplitAlways:1; + bool m_isHot:1; + +private: + DECLARE_DYNAMIC_CLASS(wxSplitterWindow) + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxSplitterWindow); +}; + +// ---------------------------------------------------------------------------- +// event class and macros +// ---------------------------------------------------------------------------- + +// we reuse the same class for all splitter event types because this is the +// usual wxWin convention, but the three event types have different kind of +// data associated with them, so the accessors can be only used if the real +// event type matches with the one for which the accessors make sense +class WXDLLIMPEXP_CORE wxSplitterEvent : public wxNotifyEvent +{ +public: + wxSplitterEvent(wxEventType type = wxEVT_NULL, + wxSplitterWindow *splitter = NULL) + : wxNotifyEvent(type) + { + SetEventObject(splitter); + if (splitter) m_id = splitter->GetId(); + } + wxSplitterEvent(const wxSplitterEvent& event) + : wxNotifyEvent(event), m_data(event.m_data) { } + + // SASH_POS_CHANGED methods + + // setting the sash position to -1 prevents the change from taking place at + // all + void SetSashPosition(int pos) + { + wxASSERT( GetEventType() == wxEVT_SPLITTER_SASH_POS_CHANGED + || GetEventType() == wxEVT_SPLITTER_SASH_POS_CHANGING); + + m_data.pos = pos; + } + + int GetSashPosition() const + { + wxASSERT( GetEventType() == wxEVT_SPLITTER_SASH_POS_CHANGED + || GetEventType() == wxEVT_SPLITTER_SASH_POS_CHANGING); + + return m_data.pos; + } + + // UNSPLIT event methods + wxWindow *GetWindowBeingRemoved() const + { + wxASSERT( GetEventType() == wxEVT_SPLITTER_UNSPLIT ); + + return m_data.win; + } + + // DCLICK event methods + int GetX() const + { + wxASSERT( GetEventType() == wxEVT_SPLITTER_DOUBLECLICKED ); + + return m_data.pt.x; + } + + int GetY() const + { + wxASSERT( GetEventType() == wxEVT_SPLITTER_DOUBLECLICKED ); + + return m_data.pt.y; + } + + virtual wxEvent *Clone() const { return new wxSplitterEvent(*this); } + +private: + friend class WXDLLIMPEXP_FWD_CORE wxSplitterWindow; + + // data for the different types of event + union + { + int pos; // position for SASH_POS_CHANGED event + wxWindow *win; // window being removed for UNSPLIT event + struct + { + int x, y; + } pt; // position of double click for DCLICK event + } m_data; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSplitterEvent) +}; + +typedef void (wxEvtHandler::*wxSplitterEventFunction)(wxSplitterEvent&); + +#define wxSplitterEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxSplitterEventFunction, func) + +#define wx__DECLARE_SPLITTEREVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_SPLITTER_ ## evt, id, wxSplitterEventHandler(fn)) + +#define EVT_SPLITTER_SASH_POS_CHANGED(id, fn) \ + wx__DECLARE_SPLITTEREVT(SASH_POS_CHANGED, id, fn) + +#define EVT_SPLITTER_SASH_POS_CHANGING(id, fn) \ + wx__DECLARE_SPLITTEREVT(SASH_POS_CHANGING, id, fn) + +#define EVT_SPLITTER_DCLICK(id, fn) \ + wx__DECLARE_SPLITTEREVT(DOUBLECLICKED, id, fn) + +#define EVT_SPLITTER_UNSPLIT(id, fn) \ + wx__DECLARE_SPLITTEREVT(UNSPLIT, id, fn) + + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED wxEVT_SPLITTER_SASH_POS_CHANGED +#define wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING wxEVT_SPLITTER_SASH_POS_CHANGING +#define wxEVT_COMMAND_SPLITTER_DOUBLECLICKED wxEVT_SPLITTER_DOUBLECLICKED +#define wxEVT_COMMAND_SPLITTER_UNSPLIT wxEVT_SPLITTER_UNSPLIT + +#endif // _WX_GENERIC_SPLITTER_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/srchctlg.h b/wxmsw/include/wx-3.0/wx/generic/srchctlg.h new file mode 100644 index 00000000..c61ddee7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/srchctlg.h @@ -0,0 +1,277 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/srchctlg.h +// Purpose: generic wxSearchCtrl class +// Author: Vince Harron +// Created: 2006-02-19 +// Copyright: Vince Harron +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_SEARCHCTRL_H_ +#define _WX_GENERIC_SEARCHCTRL_H_ + +#if wxUSE_SEARCHCTRL + +#include "wx/bitmap.h" + +class WXDLLIMPEXP_FWD_CORE wxSearchButton; +class WXDLLIMPEXP_FWD_CORE wxSearchTextCtrl; + +// ---------------------------------------------------------------------------- +// wxSearchCtrl is a combination of wxTextCtrl and wxSearchButton +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSearchCtrl : public wxSearchCtrlBase +{ +public: + // creation + // -------- + + wxSearchCtrl(); + wxSearchCtrl(wxWindow *parent, wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSearchCtrlNameStr); + + virtual ~wxSearchCtrl(); + + bool Create(wxWindow *parent, wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSearchCtrlNameStr); + +#if wxUSE_MENUS + // get/set search button menu + // -------------------------- + virtual void SetMenu( wxMenu* menu ); + virtual wxMenu* GetMenu(); +#endif // wxUSE_MENUS + + // get/set search options + // ---------------------- + virtual void ShowSearchButton( bool show ); + virtual bool IsSearchButtonVisible() const; + + virtual void ShowCancelButton( bool show ); + virtual bool IsCancelButtonVisible() const; + + // TODO: In 2.9 these should probably be virtual, and declared in the base class... + void SetDescriptiveText(const wxString& text); + wxString GetDescriptiveText() const; + + // accessors + // --------- + + virtual wxString GetRange(long from, long to) const; + + virtual int GetLineLength(long lineNo) const; + virtual wxString GetLineText(long lineNo) const; + virtual int GetNumberOfLines() const; + + virtual bool IsModified() const; + virtual bool IsEditable() const; + + // more readable flag testing methods + virtual bool IsSingleLine() const; + virtual bool IsMultiLine() const; + + // If the return values from and to are the same, there is no selection. + virtual void GetSelection(long* from, long* to) const; + + virtual wxString GetStringSelection() const; + + // operations + // ---------- + + // editing + virtual void Clear(); + virtual void Replace(long from, long to, const wxString& value); + virtual void Remove(long from, long to); + + // load/save the controls contents from/to the file + virtual bool LoadFile(const wxString& file); + virtual bool SaveFile(const wxString& file = wxEmptyString); + + // sets/clears the dirty flag + virtual void MarkDirty(); + virtual void DiscardEdits(); + + // set the max number of characters which may be entered in a single line + // text control + virtual void SetMaxLength(unsigned long WXUNUSED(len)); + + // writing text inserts it at the current position, appending always + // inserts it at the end + virtual void WriteText(const wxString& text); + virtual void AppendText(const wxString& text); + + // insert the character which would have resulted from this key event, + // return true if anything has been inserted + virtual bool EmulateKeyPress(const wxKeyEvent& event); + + // text control under some platforms supports the text styles: these + // methods allow to apply the given text style to the given selection or to + // set/get the style which will be used for all appended text + virtual bool SetStyle(long start, long end, const wxTextAttr& style); + virtual bool GetStyle(long position, wxTextAttr& style); + virtual bool SetDefaultStyle(const wxTextAttr& style); + virtual const wxTextAttr& GetDefaultStyle() const; + + // translate between the position (which is just an index in the text ctrl + // considering all its contents as a single strings) and (x, y) coordinates + // which represent column and line. + virtual long XYToPosition(long x, long y) const; + virtual bool PositionToXY(long pos, long *x, long *y) const; + + virtual void ShowPosition(long pos); + + // find the character at position given in pixels + // + // NB: pt is in device coords (not adjusted for the client area origin nor + // scrolling) + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const; + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, + wxTextCoord *col, + wxTextCoord *row) const; + + // Clipboard operations + virtual void Copy(); + virtual void Cut(); + virtual void Paste(); + + virtual bool CanCopy() const; + virtual bool CanCut() const; + virtual bool CanPaste() const; + + // Undo/redo + virtual void Undo(); + virtual void Redo(); + + virtual bool CanUndo() const; + virtual bool CanRedo() const; + + // Insertion point + virtual void SetInsertionPoint(long pos); + virtual void SetInsertionPointEnd(); + virtual long GetInsertionPoint() const; + virtual wxTextPos GetLastPosition() const; + + virtual void SetSelection(long from, long to); + virtual void SelectAll(); + virtual void SetEditable(bool editable); + +#if 0 + + // override streambuf method +#if wxHAS_TEXT_WINDOW_STREAM + int overflow(int i); +#endif // wxHAS_TEXT_WINDOW_STREAM + + // stream-like insertion operators: these are always available, whether we + // were, or not, compiled with streambuf support + wxTextCtrl& operator<<(const wxString& s); + wxTextCtrl& operator<<(int i); + wxTextCtrl& operator<<(long i); + wxTextCtrl& operator<<(float f); + wxTextCtrl& operator<<(double d); + wxTextCtrl& operator<<(const wxChar c); +#endif + + // do the window-specific processing after processing the update event + virtual void DoUpdateWindowUI(wxUpdateUIEvent& event); + + virtual bool ShouldInheritColours() const; + + // wxWindow overrides + virtual bool SetFont(const wxFont& font); + virtual bool SetBackgroundColour(const wxColour& colour); + + // search control generic only + void SetSearchBitmap( const wxBitmap& bitmap ); + void SetCancelBitmap( const wxBitmap& bitmap ); +#if wxUSE_MENUS + void SetSearchMenuBitmap( const wxBitmap& bitmap ); +#endif // wxUSE_MENUS + +protected: + virtual void DoSetValue(const wxString& value, int flags); + virtual wxString DoGetValue() const; + + virtual bool DoLoadFile(const wxString& file, int fileType); + virtual bool DoSaveFile(const wxString& file, int fileType); + + // override the base class virtuals involved into geometry calculations + virtual wxSize DoGetBestSize() const; + virtual void DoMoveWindow(int x, int y, int width, int height); + virtual void LayoutControls(int x, int y, int width, int height); + + virtual void RecalcBitmaps(); + + void Init(); + + virtual wxBitmap RenderSearchBitmap( int x, int y, bool renderDrop ); + virtual wxBitmap RenderCancelBitmap( int x, int y ); + + void OnCancelButton( wxCommandEvent& event ); + + void OnSetFocus( wxFocusEvent& event ); + void OnSize( wxSizeEvent& event ); + + bool HasMenu() const + { +#if wxUSE_MENUS + return m_menu != NULL; +#else // !wxUSE_MENUS + return false; +#endif // wxUSE_MENUS/!wxUSE_MENUS + } + +private: + friend class wxSearchButton; + + // Implement pure virtual function inherited from wxCompositeWindow. + virtual wxWindowList GetCompositeWindowParts() const; + +#if wxUSE_MENUS + void PopupSearchMenu(); +#endif // wxUSE_MENUS + + // the subcontrols + wxSearchTextCtrl *m_text; + wxSearchButton *m_searchButton; + wxSearchButton *m_cancelButton; +#if wxUSE_MENUS + wxMenu *m_menu; +#endif // wxUSE_MENUS + + bool m_searchButtonVisible; + bool m_cancelButtonVisible; + + bool m_searchBitmapUser; + bool m_cancelBitmapUser; +#if wxUSE_MENUS + bool m_searchMenuBitmapUser; +#endif // wxUSE_MENUS + + wxBitmap m_searchBitmap; + wxBitmap m_cancelBitmap; +#if wxUSE_MENUS + wxBitmap m_searchMenuBitmap; +#endif // wxUSE_MENUS + +private: + DECLARE_DYNAMIC_CLASS(wxSearchCtrl) + + DECLARE_EVENT_TABLE() +}; + +#endif // wxUSE_SEARCHCTRL + +#endif // _WX_GENERIC_SEARCHCTRL_H_ + diff --git a/wxmsw/include/wx-3.0/wx/generic/statbmpg.h b/wxmsw/include/wx-3.0/wx/generic/statbmpg.h new file mode 100644 index 00000000..8a8fa15d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/statbmpg.h @@ -0,0 +1,75 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/statbmpg.h +// Purpose: wxGenericStaticBitmap header +// Author: Marcin Wojdyr, Stefan Csomor +// Created: 2008-06-16 +// Copyright: wxWidgets developers +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_STATBMP_H_ +#define _WX_GENERIC_STATBMP_H_ + +#include "wx/statbmp.h" + +class WXDLLIMPEXP_CORE wxGenericStaticBitmap : public wxStaticBitmapBase +{ +public: + wxGenericStaticBitmap() {} + wxGenericStaticBitmap(wxWindow *parent, + wxWindowID id, + const wxBitmap& bitmap, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticBitmapNameStr) + { + Create(parent, id, bitmap, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxBitmap& bitmap, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticBitmapNameStr); + + virtual void SetBitmap(const wxBitmap& bitmap) + { + m_bitmap = bitmap; + SetInitialSize(GetBitmapSize()); + Refresh(); + } + + virtual wxBitmap GetBitmap() const { return m_bitmap; } + + virtual void SetIcon(const wxIcon& icon) + { + m_bitmap.CopyFromIcon(icon); + SetInitialSize(GetBitmapSize()); + Refresh(); + } + +#if defined(__WXGTK20__) || defined(__WXMAC__) + // icons and bitmaps are really the same thing in wxGTK and wxMac + wxIcon GetIcon() const { return (const wxIcon &)m_bitmap; } +#endif + + +private: + wxSize GetBitmapSize() + { + return m_bitmap.IsOk() ? wxSize(m_bitmap.GetWidth(), m_bitmap.GetHeight()) + : wxSize(16, 16); // this is completely arbitrary + } + + void OnPaint(wxPaintEvent& event); + + wxBitmap m_bitmap; + + DECLARE_DYNAMIC_CLASS(wxGenericStaticBitmap) +}; + + +#endif //_WX_GENERIC_STATBMP_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/stattextg.h b/wxmsw/include/wx-3.0/wx/generic/stattextg.h new file mode 100644 index 00000000..918a4f4e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/stattextg.h @@ -0,0 +1,90 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/stattextg.h +// Purpose: wxGenericStaticText header +// Author: Marcin Wojdyr +// Created: 2008-06-26 +// Copyright: Marcin Wojdyr +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_STATTEXTG_H_ +#define _WX_GENERIC_STATTEXTG_H_ + +// prevent it from including the platform-specific wxStaticText declaration as +// this is not going to compile if it derives from wxGenericStaticText defined +// below (currently this is only the case in wxUniv but it could also happen +// with other ports) +#define wxNO_PORT_STATTEXT_INCLUDE +#include "wx/stattext.h" +#undef wxNO_PORT_STATTEXT_INCLUDE + +class WXDLLIMPEXP_CORE wxGenericStaticText : public wxStaticTextBase +{ +public: + wxGenericStaticText() { Init(); } + + wxGenericStaticText(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticTextNameStr) + { + Init(); + + Create(parent, id, label, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticTextNameStr); + + virtual ~wxGenericStaticText(); + + + // overridden base class virtual methods + virtual void SetLabel(const wxString& label); + virtual bool SetFont(const wxFont &font); + +protected: + virtual wxSize DoGetBestClientSize() const; + + virtual wxString DoGetLabel() const { return m_label; } + virtual void DoSetLabel(const wxString& label); + + void DoSetSize(int x, int y, int width, int height, int sizeFlags); + +#if wxUSE_MARKUP + virtual bool DoSetLabelMarkup(const wxString& markup); +#endif // wxUSE_MARKUP + +private: + void Init() + { +#if wxUSE_MARKUP + m_markupText = NULL; +#endif // wxUSE_MARKUP + } + + void OnPaint(wxPaintEvent& event); + + void DoDrawLabel(wxDC& dc, const wxRect& rect); + + // These fields are only used if m_markupText == NULL. + wxString m_label; + int m_mnemonic; + +#if wxUSE_MARKUP + class wxMarkupText *m_markupText; +#endif // wxUSE_MARKUP + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxGenericStaticText) +}; + +#endif // _WX_GENERIC_STATTEXTG_H_ + diff --git a/wxmsw/include/wx-3.0/wx/generic/statusbr.h b/wxmsw/include/wx-3.0/wx/generic/statusbr.h new file mode 100644 index 00000000..bff20807 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/statusbr.h @@ -0,0 +1,119 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/statusbr.h +// Purpose: wxStatusBarGeneric class +// Author: Julian Smart +// Modified by: VZ at 05.02.00 to derive from wxStatusBarBase +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_STATUSBR_H_ +#define _WX_GENERIC_STATUSBR_H_ + +#include "wx/defs.h" + +#if wxUSE_STATUSBAR + +#include "wx/pen.h" +#include "wx/arrstr.h" + + +// ---------------------------------------------------------------------------- +// wxStatusBarGeneric +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxStatusBarGeneric : public wxStatusBarBase +{ +public: + wxStatusBarGeneric() { Init(); } + wxStatusBarGeneric(wxWindow *parent, + wxWindowID winid = wxID_ANY, + long style = wxSTB_DEFAULT_STYLE, + const wxString& name = wxStatusBarNameStr) + { + Init(); + + Create(parent, winid, style, name); + } + + virtual ~wxStatusBarGeneric(); + + bool Create(wxWindow *parent, wxWindowID winid = wxID_ANY, + long style = wxSTB_DEFAULT_STYLE, + const wxString& name = wxStatusBarNameStr); + + // implement base class methods + virtual void SetStatusWidths(int n, const int widths_field[]); + virtual bool GetFieldRect(int i, wxRect& rect) const; + virtual void SetMinHeight(int height); + + virtual int GetBorderX() const { return m_borderX; } + virtual int GetBorderY() const { return m_borderY; } + + + // implementation only (not part of wxStatusBar public API): + + int GetFieldFromPoint(const wxPoint& point) const; + +protected: + virtual void DoUpdateStatusText(int number); + + // event handlers + void OnPaint(wxPaintEvent& event); + void OnSize(wxSizeEvent& event); + + void OnLeftDown(wxMouseEvent& event); + void OnRightDown(wxMouseEvent& event); + + // Responds to colour changes + void OnSysColourChanged(wxSysColourChangedEvent& event); + +protected: + + virtual void DrawFieldText(wxDC& dc, const wxRect& rc, int i, int textHeight); + virtual void DrawField(wxDC& dc, int i, int textHeight); + + void SetBorderX(int x); + void SetBorderY(int y); + + virtual void InitColours(); + + // true if the status bar shows the size grip: for this it must have + // wxSTB_SIZEGRIP style and the window it is attached to must be resizable + // and not maximized + bool ShowsSizeGrip() const; + + // returns the position and the size of the size grip + wxRect GetSizeGripRect() const; + + // common part of all ctors + void Init(); + + // the last known size, fields widths must be updated whenever it's out of + // date + wxSize m_lastClientSize; + + // the absolute widths of the status bar panes in pixels + wxArrayInt m_widthsAbs; + + int m_borderX; + int m_borderY; + + wxPen m_mediumShadowPen; + wxPen m_hilightPen; + + virtual wxSize DoGetBestSize() const; + +private: + // Update m_lastClientSize and m_widthsAbs from the current size. + void DoUpdateFieldWidths(); + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxStatusBarGeneric) +}; + +#endif // wxUSE_STATUSBAR + +#endif + // _WX_GENERIC_STATUSBR_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/textdlgg.h b/wxmsw/include/wx-3.0/wx/generic/textdlgg.h new file mode 100644 index 00000000..023d497c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/textdlgg.h @@ -0,0 +1,134 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/textdlgg.h +// Purpose: wxTextEntryDialog class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TEXTDLGG_H_ +#define _WX_TEXTDLGG_H_ + +#include "wx/defs.h" + +#if wxUSE_TEXTDLG + +#include "wx/dialog.h" + +#if wxUSE_VALIDATORS +#include "wx/valtext.h" +#include "wx/textctrl.h" +#endif + +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; + +extern WXDLLIMPEXP_DATA_CORE(const char) wxGetTextFromUserPromptStr[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxGetPasswordFromUserPromptStr[]; + +#define wxTextEntryDialogStyle (wxOK | wxCANCEL | wxCENTRE | wxWS_EX_VALIDATE_RECURSIVELY) + +// ---------------------------------------------------------------------------- +// wxTextEntryDialog: a dialog with text control, [ok] and [cancel] buttons +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTextEntryDialog : public wxDialog +{ +public: + wxTextEntryDialog() + { + m_textctrl = NULL; + } + + wxTextEntryDialog(wxWindow *parent, + const wxString& message, + const wxString& caption = wxGetTextFromUserPromptStr, + const wxString& value = wxEmptyString, + long style = wxTextEntryDialogStyle, + const wxPoint& pos = wxDefaultPosition) + { + Create(parent, message, caption, value, style, pos); + } + + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption = wxGetTextFromUserPromptStr, + const wxString& value = wxEmptyString, + long style = wxTextEntryDialogStyle, + const wxPoint& pos = wxDefaultPosition); + + void SetValue(const wxString& val); + wxString GetValue() const { return m_value; } + + void SetMaxLength(unsigned long len); + +#if wxUSE_VALIDATORS + void SetTextValidator( const wxTextValidator& validator ); +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED( void SetTextValidator( long style ) ); +#endif + void SetTextValidator( wxTextValidatorStyle style = wxFILTER_NONE ); + wxTextValidator* GetTextValidator() { return (wxTextValidator*)m_textctrl->GetValidator(); } +#endif // wxUSE_VALIDATORS + + virtual bool TransferDataToWindow(); + virtual bool TransferDataFromWindow(); + + // implementation only + void OnOK(wxCommandEvent& event); + +protected: + wxTextCtrl *m_textctrl; + wxString m_value; + long m_dialogStyle; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxTextEntryDialog) + wxDECLARE_NO_COPY_CLASS(wxTextEntryDialog); +}; + +// ---------------------------------------------------------------------------- +// wxPasswordEntryDialog: dialog with password control, [ok] and [cancel] +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPasswordEntryDialog : public wxTextEntryDialog +{ +public: + wxPasswordEntryDialog(wxWindow *parent, + const wxString& message, + const wxString& caption = wxGetPasswordFromUserPromptStr, + const wxString& value = wxEmptyString, + long style = wxTextEntryDialogStyle, + const wxPoint& pos = wxDefaultPosition); +private: + DECLARE_DYNAMIC_CLASS(wxPasswordEntryDialog) + wxDECLARE_NO_COPY_CLASS(wxPasswordEntryDialog); +}; + +// ---------------------------------------------------------------------------- +// function to get a string from user +// ---------------------------------------------------------------------------- + +WXDLLIMPEXP_CORE wxString + wxGetTextFromUser(const wxString& message, + const wxString& caption = wxGetTextFromUserPromptStr, + const wxString& default_value = wxEmptyString, + wxWindow *parent = NULL, + wxCoord x = wxDefaultCoord, + wxCoord y = wxDefaultCoord, + bool centre = true); + +WXDLLIMPEXP_CORE wxString + wxGetPasswordFromUser(const wxString& message, + const wxString& caption = wxGetPasswordFromUserPromptStr, + const wxString& default_value = wxEmptyString, + wxWindow *parent = NULL, + wxCoord x = wxDefaultCoord, + wxCoord y = wxDefaultCoord, + bool centre = true); + +#endif + // wxUSE_TEXTDLG +#endif // _WX_TEXTDLGG_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/timectrl.h b/wxmsw/include/wx-3.0/wx/generic/timectrl.h new file mode 100644 index 00000000..20b02498 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/timectrl.h @@ -0,0 +1,69 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/timectrl.h +// Purpose: Generic implementation of wxTimePickerCtrl. +// Author: Paul Breen, Vadim Zeitlin +// Created: 2011-09-22 +// Copyright: (c) 2011 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_TIMECTRL_H_ +#define _WX_GENERIC_TIMECTRL_H_ + +#include "wx/containr.h" +#include "wx/compositewin.h" + +class WXDLLIMPEXP_ADV wxTimePickerCtrlGeneric + : public wxCompositeWindow< wxNavigationEnabled > +{ +public: + typedef wxCompositeWindow< wxNavigationEnabled > Base; + + // Creating the control. + wxTimePickerCtrlGeneric() { Init(); } + virtual ~wxTimePickerCtrlGeneric(); + wxTimePickerCtrlGeneric(wxWindow *parent, + wxWindowID id, + const wxDateTime& date = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTP_DEFAULT, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxTimePickerCtrlNameStr) + { + Init(); + + (void)Create(parent, id, date, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxDateTime& date = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTP_DEFAULT, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxTimePickerCtrlNameStr); + + // Implement pure virtual wxTimePickerCtrlBase methods. + virtual void SetValue(const wxDateTime& date); + virtual wxDateTime GetValue() const; + +protected: + virtual wxSize DoGetBestSize() const; + + virtual void DoMoveWindow(int x, int y, int width, int height); + +private: + void Init(); + + // Return the list of the windows composing this one. + virtual wxWindowList GetCompositeWindowParts() const; + + // Implementation data. + class wxTimePickerGenericImpl* m_impl; + + wxDECLARE_NO_COPY_CLASS(wxTimePickerCtrlGeneric); +}; + +#endif // _WX_GENERIC_TIMECTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/treectlg.h b/wxmsw/include/wx-3.0/wx/generic/treectlg.h new file mode 100644 index 00000000..53b39428 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/treectlg.h @@ -0,0 +1,395 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/treectlg.h +// Purpose: wxTreeCtrl class +// Author: Robert Roebling +// Modified by: +// Created: 01/02/97 +// Copyright: (c) 1997,1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _GENERIC_TREECTRL_H_ +#define _GENERIC_TREECTRL_H_ + +#if wxUSE_TREECTRL + +#include "wx/scrolwin.h" +#include "wx/pen.h" + +// ----------------------------------------------------------------------------- +// forward declaration +// ----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxGenericTreeItem; + +class WXDLLIMPEXP_FWD_CORE wxTreeItemData; + +class WXDLLIMPEXP_FWD_CORE wxTreeRenameTimer; +class WXDLLIMPEXP_FWD_CORE wxTreeFindTimer; +class WXDLLIMPEXP_FWD_CORE wxTreeTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; + +// ----------------------------------------------------------------------------- +// wxGenericTreeCtrl - the tree control +// ----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGenericTreeCtrl : public wxTreeCtrlBase, + public wxScrollHelper +{ +public: + // creation + // -------- + + wxGenericTreeCtrl() : wxTreeCtrlBase(), wxScrollHelper(this) { Init(); } + + wxGenericTreeCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTR_DEFAULT_STYLE, + const wxValidator &validator = wxDefaultValidator, + const wxString& name = wxTreeCtrlNameStr) + : wxTreeCtrlBase(), + wxScrollHelper(this) + { + Init(); + Create(parent, id, pos, size, style, validator, name); + } + + virtual ~wxGenericTreeCtrl(); + + bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTR_DEFAULT_STYLE, + const wxValidator &validator = wxDefaultValidator, + const wxString& name = wxTreeCtrlNameStr); + + // implement base class pure virtuals + // ---------------------------------- + + virtual unsigned int GetCount() const; + + virtual unsigned int GetIndent() const { return m_indent; } + virtual void SetIndent(unsigned int indent); + + + virtual void SetImageList(wxImageList *imageList); + virtual void SetStateImageList(wxImageList *imageList); + + virtual wxString GetItemText(const wxTreeItemId& item) const; + virtual int GetItemImage(const wxTreeItemId& item, + wxTreeItemIcon which = wxTreeItemIcon_Normal) const; + virtual wxTreeItemData *GetItemData(const wxTreeItemId& item) const; + virtual wxColour GetItemTextColour(const wxTreeItemId& item) const; + virtual wxColour GetItemBackgroundColour(const wxTreeItemId& item) const; + virtual wxFont GetItemFont(const wxTreeItemId& item) const; + + virtual void SetItemText(const wxTreeItemId& item, const wxString& text); + virtual void SetItemImage(const wxTreeItemId& item, + int image, + wxTreeItemIcon which = wxTreeItemIcon_Normal); + virtual void SetItemData(const wxTreeItemId& item, wxTreeItemData *data); + + virtual void SetItemHasChildren(const wxTreeItemId& item, bool has = true); + virtual void SetItemBold(const wxTreeItemId& item, bool bold = true); + virtual void SetItemDropHighlight(const wxTreeItemId& item, bool highlight = true); + virtual void SetItemTextColour(const wxTreeItemId& item, const wxColour& col); + virtual void SetItemBackgroundColour(const wxTreeItemId& item, const wxColour& col); + virtual void SetItemFont(const wxTreeItemId& item, const wxFont& font); + + virtual bool IsVisible(const wxTreeItemId& item) const; + virtual bool ItemHasChildren(const wxTreeItemId& item) const; + virtual bool IsExpanded(const wxTreeItemId& item) const; + virtual bool IsSelected(const wxTreeItemId& item) const; + virtual bool IsBold(const wxTreeItemId& item) const; + + virtual size_t GetChildrenCount(const wxTreeItemId& item, + bool recursively = true) const; + + // navigation + // ---------- + + virtual wxTreeItemId GetRootItem() const { return m_anchor; } + virtual wxTreeItemId GetSelection() const + { + wxASSERT_MSG( !HasFlag(wxTR_MULTIPLE), + wxT("must use GetSelections() with this control") ); + + return m_current; + } + virtual size_t GetSelections(wxArrayTreeItemIds&) const; + virtual wxTreeItemId GetFocusedItem() const { return m_current; } + + virtual void ClearFocusedItem(); + virtual void SetFocusedItem(const wxTreeItemId& item); + + virtual wxTreeItemId GetItemParent(const wxTreeItemId& item) const; + virtual wxTreeItemId GetFirstChild(const wxTreeItemId& item, + wxTreeItemIdValue& cookie) const; + virtual wxTreeItemId GetNextChild(const wxTreeItemId& item, + wxTreeItemIdValue& cookie) const; + virtual wxTreeItemId GetLastChild(const wxTreeItemId& item) const; + virtual wxTreeItemId GetNextSibling(const wxTreeItemId& item) const; + virtual wxTreeItemId GetPrevSibling(const wxTreeItemId& item) const; + + virtual wxTreeItemId GetFirstVisibleItem() const; + virtual wxTreeItemId GetNextVisible(const wxTreeItemId& item) const; + virtual wxTreeItemId GetPrevVisible(const wxTreeItemId& item) const; + + + // operations + // ---------- + + virtual wxTreeItemId AddRoot(const wxString& text, + int image = -1, int selectedImage = -1, + wxTreeItemData *data = NULL); + + virtual void Delete(const wxTreeItemId& item); + virtual void DeleteChildren(const wxTreeItemId& item); + virtual void DeleteAllItems(); + + virtual void Expand(const wxTreeItemId& item); + virtual void Collapse(const wxTreeItemId& item); + virtual void CollapseAndReset(const wxTreeItemId& item); + virtual void Toggle(const wxTreeItemId& item); + + virtual void Unselect(); + virtual void UnselectAll(); + virtual void SelectItem(const wxTreeItemId& item, bool select = true); + virtual void SelectChildren(const wxTreeItemId& parent); + + virtual void EnsureVisible(const wxTreeItemId& item); + virtual void ScrollTo(const wxTreeItemId& item); + + virtual wxTextCtrl *EditLabel(const wxTreeItemId& item, + wxClassInfo* textCtrlClass = wxCLASSINFO(wxTextCtrl)); + virtual wxTextCtrl *GetEditControl() const; + virtual void EndEditLabel(const wxTreeItemId& item, + bool discardChanges = false); + + virtual void EnableBellOnNoMatch(bool on = true); + + virtual void SortChildren(const wxTreeItemId& item); + + // items geometry + // -------------- + + virtual bool GetBoundingRect(const wxTreeItemId& item, + wxRect& rect, + bool textOnly = false) const; + + + // this version specific methods + // ----------------------------- + + wxImageList *GetButtonsImageList() const { return m_imageListButtons; } + void SetButtonsImageList(wxImageList *imageList); + void AssignButtonsImageList(wxImageList *imageList); + + void SetDropEffectAboveItem( bool above = false ) { m_dropEffectAboveItem = above; } + bool GetDropEffectAboveItem() const { return m_dropEffectAboveItem; } + + wxTreeItemId GetNext(const wxTreeItemId& item) const; + +#if WXWIN_COMPATIBILITY_2_6 + // use EditLabel() instead + void Edit( const wxTreeItemId& item ) { EditLabel(item); } +#endif // WXWIN_COMPATIBILITY_2_6 + + // implementation only from now on + + // overridden base class virtuals + virtual bool SetBackgroundColour(const wxColour& colour); + virtual bool SetForegroundColour(const wxColour& colour); + + virtual void Refresh(bool eraseBackground = true, const wxRect *rect = NULL); + + virtual bool SetFont( const wxFont &font ); + virtual void SetWindowStyle(const long styles); + + // callbacks + void OnPaint( wxPaintEvent &event ); + void OnSetFocus( wxFocusEvent &event ); + void OnKillFocus( wxFocusEvent &event ); + void OnKeyDown( wxKeyEvent &event ); + void OnChar( wxKeyEvent &event ); + void OnMouse( wxMouseEvent &event ); + void OnGetToolTip( wxTreeEvent &event ); + void OnSize( wxSizeEvent &event ); + void OnInternalIdle( ); + + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // implementation helpers + void AdjustMyScrollbars(); + + WX_FORWARD_TO_SCROLL_HELPER() + +protected: + friend class wxGenericTreeItem; + friend class wxTreeRenameTimer; + friend class wxTreeFindTimer; + friend class wxTreeTextCtrl; + + wxFont m_normalFont; + wxFont m_boldFont; + + wxGenericTreeItem *m_anchor; + wxGenericTreeItem *m_current, + *m_key_current, + // A hint to select a parent item after deleting a child + *m_select_me; + unsigned short m_indent; + int m_lineHeight; + wxPen m_dottedPen; + wxBrush *m_hilightBrush, + *m_hilightUnfocusedBrush; + bool m_hasFocus; + bool m_dirty; + bool m_ownsImageListButtons; + bool m_isDragging; // true between BEGIN/END drag events + bool m_lastOnSame; // last click on the same item as prev + wxImageList *m_imageListButtons; + + int m_dragCount; + wxPoint m_dragStart; + wxGenericTreeItem *m_dropTarget; + wxCursor m_oldCursor; // cursor is changed while dragging + wxGenericTreeItem *m_oldSelection; + wxGenericTreeItem *m_underMouse; // for visual effects + + enum { NoEffect, BorderEffect, AboveEffect, BelowEffect } m_dndEffect; + wxGenericTreeItem *m_dndEffectItem; + + wxTreeTextCtrl *m_textCtrl; + + + wxTimer *m_renameTimer; + + // incremental search data + wxString m_findPrefix; + wxTimer *m_findTimer; + // This flag is set to 0 if the bell is disabled, 1 if it is enabled and -1 + // if it is globally enabled but has been temporarily disabled because we + // had already beeped for this particular search. + int m_findBell; + + bool m_dropEffectAboveItem; + + // the common part of all ctors + void Init(); + + // overridden wxWindow methods + virtual void DoThaw(); + + // misc helpers + void SendDeleteEvent(wxGenericTreeItem *itemBeingDeleted); + + void DrawBorder(const wxTreeItemId& item); + void DrawLine(const wxTreeItemId& item, bool below); + void DrawDropEffect(wxGenericTreeItem *item); + + void DoSelectItem(const wxTreeItemId& id, + bool unselect_others = true, + bool extended_select = false); + + virtual int DoGetItemState(const wxTreeItemId& item) const; + virtual void DoSetItemState(const wxTreeItemId& item, int state); + + virtual wxTreeItemId DoInsertItem(const wxTreeItemId& parent, + size_t previous, + const wxString& text, + int image, + int selectedImage, + wxTreeItemData *data); + virtual wxTreeItemId DoInsertAfter(const wxTreeItemId& parent, + const wxTreeItemId& idPrevious, + const wxString& text, + int image = -1, int selImage = -1, + wxTreeItemData *data = NULL); + virtual wxTreeItemId DoTreeHitTest(const wxPoint& point, int& flags) const; + + // called by wxTextTreeCtrl when it marks itself for deletion + void ResetTextControl(); + + // find the first item starting with the given prefix after the given item + wxTreeItemId FindItem(const wxTreeItemId& id, const wxString& prefix) const; + + bool HasButtons() const { return HasFlag(wxTR_HAS_BUTTONS); } + + void CalculateLineHeight(); + int GetLineHeight(wxGenericTreeItem *item) const; + void PaintLevel( wxGenericTreeItem *item, wxDC& dc, int level, int &y ); + void PaintItem( wxGenericTreeItem *item, wxDC& dc); + + void CalculateLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &y ); + void CalculatePositions(); + + void RefreshSubtree( wxGenericTreeItem *item ); + void RefreshLine( wxGenericTreeItem *item ); + + // redraw all selected items + void RefreshSelected(); + + // RefreshSelected() recursive helper + void RefreshSelectedUnder(wxGenericTreeItem *item); + + void OnRenameTimer(); + bool OnRenameAccept(wxGenericTreeItem *item, const wxString& value); + void OnRenameCancelled(wxGenericTreeItem *item); + + void FillArray(wxGenericTreeItem*, wxArrayTreeItemIds&) const; + void SelectItemRange( wxGenericTreeItem *item1, wxGenericTreeItem *item2 ); + bool TagAllChildrenUntilLast(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select); + bool TagNextChildren(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select); + void UnselectAllChildren( wxGenericTreeItem *item ); + void ChildrenClosing(wxGenericTreeItem* item); + + void DoDirtyProcessing(); + + virtual wxSize DoGetBestSize() const; + +private: + // Reset the state of the last find (i.e. keyboard incremental search) + // operation. + void ResetFindState(); + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGenericTreeCtrl) + wxDECLARE_NO_COPY_CLASS(wxGenericTreeCtrl); +}; + +#if !defined(__WXMSW__) || defined(__WXUNIVERSAL__) +/* + * wxTreeCtrl has to be a real class or we have problems with + * the run-time information. + */ + +class WXDLLIMPEXP_CORE wxTreeCtrl: public wxGenericTreeCtrl +{ + DECLARE_DYNAMIC_CLASS(wxTreeCtrl) + +public: + wxTreeCtrl() {} + + wxTreeCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTR_DEFAULT_STYLE, + const wxValidator &validator = wxDefaultValidator, + const wxString& name = wxTreeCtrlNameStr) + : wxGenericTreeCtrl(parent, id, pos, size, style, validator, name) + { + } +}; +#endif // !__WXMSW__ || __WXUNIVERSAL__ + +#endif // wxUSE_TREECTRL + +#endif // _GENERIC_TREECTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/generic/wizard.h b/wxmsw/include/wx-3.0/wx/generic/wizard.h new file mode 100644 index 00000000..21618700 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/generic/wizard.h @@ -0,0 +1,168 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/wizard.h +// Purpose: declaration of generic wxWizard class +// Author: Vadim Zeitlin +// Modified by: Robert Vazan (sizers) +// Created: 28.09.99 +// Copyright: (c) 1999 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_WIZARD_H_ +#define _WX_GENERIC_WIZARD_H_ + +// ---------------------------------------------------------------------------- +// wxWizard +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxStaticBitmap; +class WXDLLIMPEXP_FWD_ADV wxWizardEvent; +class WXDLLIMPEXP_FWD_CORE wxBoxSizer; +class WXDLLIMPEXP_FWD_ADV wxWizardSizer; + +class WXDLLIMPEXP_ADV wxWizard : public wxWizardBase +{ +public: + // ctor + wxWizard() { Init(); } + wxWizard(wxWindow *parent, + int id = wxID_ANY, + const wxString& title = wxEmptyString, + const wxBitmap& bitmap = wxNullBitmap, + const wxPoint& pos = wxDefaultPosition, + long style = wxDEFAULT_DIALOG_STYLE) + { + Init(); + Create(parent, id, title, bitmap, pos, style); + } + bool Create(wxWindow *parent, + int id = wxID_ANY, + const wxString& title = wxEmptyString, + const wxBitmap& bitmap = wxNullBitmap, + const wxPoint& pos = wxDefaultPosition, + long style = wxDEFAULT_DIALOG_STYLE); + void Init(); + virtual ~wxWizard(); + + // implement base class pure virtuals + virtual bool RunWizard(wxWizardPage *firstPage); + virtual wxWizardPage *GetCurrentPage() const; + virtual void SetPageSize(const wxSize& size); + virtual wxSize GetPageSize() const; + virtual void FitToPage(const wxWizardPage *firstPage); + virtual wxSizer *GetPageAreaSizer() const; + virtual void SetBorder(int border); + + /// set/get bitmap + const wxBitmap& GetBitmap() const { return m_bitmap; } + void SetBitmap(const wxBitmap& bitmap); + + // implementation only from now on + // ------------------------------- + + // is the wizard running? + bool IsRunning() const { return m_page != NULL; } + + // show the prev/next page, but call TransferDataFromWindow on the current + // page first and return false without changing the page if + // TransferDataFromWindow() returns false - otherwise, returns true + virtual bool ShowPage(wxWizardPage *page, bool goingForward = true); + + // do fill the dialog with controls + // this is app-overridable to, for example, set help and tooltip text + virtual void DoCreateControls(); + + // Do the adaptation + virtual bool DoLayoutAdaptation(); + + // Set/get bitmap background colour + void SetBitmapBackgroundColour(const wxColour& colour) { m_bitmapBackgroundColour = colour; } + const wxColour& GetBitmapBackgroundColour() const { return m_bitmapBackgroundColour; } + + // Set/get bitmap placement (centred, tiled etc.) + void SetBitmapPlacement(int placement) { m_bitmapPlacement = placement; } + int GetBitmapPlacement() const { return m_bitmapPlacement; } + + // Set/get minimum bitmap width + void SetMinimumBitmapWidth(int w) { m_bitmapMinimumWidth = w; } + int GetMinimumBitmapWidth() const { return m_bitmapMinimumWidth; } + + // Tile bitmap + static bool TileBitmap(const wxRect& rect, wxDC& dc, const wxBitmap& bitmap); + +protected: + // for compatibility only, doesn't do anything any more + void FinishLayout() { } + + // Do fit, and adjust to screen size if necessary + virtual void DoWizardLayout(); + + // Resize bitmap if necessary + virtual bool ResizeBitmap(wxBitmap& bmp); + + // was the dialog really created? + bool WasCreated() const { return m_btnPrev != NULL; } + + // event handlers + void OnCancel(wxCommandEvent& event); + void OnBackOrNext(wxCommandEvent& event); + void OnHelp(wxCommandEvent& event); + + void OnWizEvent(wxWizardEvent& event); + + void AddBitmapRow(wxBoxSizer *mainColumn); + void AddStaticLine(wxBoxSizer *mainColumn); + void AddBackNextPair(wxBoxSizer *buttonRow); + void AddButtonRow(wxBoxSizer *mainColumn); + + // the page size requested by user + wxSize m_sizePage; + + // the dialog position from the ctor + wxPoint m_posWizard; + + // wizard state + wxWizardPage *m_page; // the current page or NULL + wxBitmap m_bitmap; // the default bitmap to show + + // wizard controls + wxButton *m_btnPrev, // the "" or "Finish" button + wxStaticBitmap *m_statbmp; // the control for the bitmap + + // Border around page area sizer requested using SetBorder() + int m_border; + + // Whether RunWizard() was called + bool m_started; + + // Whether was modal (modeless has to be destroyed on finish or cancel) + bool m_wasModal; + + // True if pages are laid out using the sizer + bool m_usingSizer; + + // Page area sizer will be inserted here with padding + wxBoxSizer *m_sizerBmpAndPage; + + // Actual position and size of pages + wxWizardSizer *m_sizerPage; + + // Bitmap background colour if resizing bitmap + wxColour m_bitmapBackgroundColour; + + // Bitmap placement flags + int m_bitmapPlacement; + + // Minimum bitmap width + int m_bitmapMinimumWidth; + + friend class wxWizardSizer; + + DECLARE_DYNAMIC_CLASS(wxWizard) + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxWizard); +}; + +#endif // _WX_GENERIC_WIZARD_H_ diff --git a/wxmsw/include/wx-3.0/wx/geometry.h b/wxmsw/include/wx-3.0/wx/geometry.h new file mode 100644 index 00000000..37d3a745 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/geometry.h @@ -0,0 +1,798 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/geometry.h +// Purpose: Common Geometry Classes +// Author: Stefan Csomor +// Modified by: +// Created: 08/05/99 +// Copyright: (c) 1999 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GEOMETRY_H_ +#define _WX_GEOMETRY_H_ + +#include "wx/defs.h" + +#if wxUSE_GEOMETRY + +#include "wx/utils.h" +#include "wx/gdicmn.h" +#include "wx/math.h" + +class WXDLLIMPEXP_FWD_BASE wxDataInputStream; +class WXDLLIMPEXP_FWD_BASE wxDataOutputStream; + +// clipping from Cohen-Sutherland + +enum wxOutCode +{ + wxInside = 0x00 , + wxOutLeft = 0x01 , + wxOutRight = 0x02 , + wxOutTop = 0x08 , + wxOutBottom = 0x04 +}; + +class WXDLLIMPEXP_CORE wxPoint2DInt +{ +public : + inline wxPoint2DInt(); + inline wxPoint2DInt( wxInt32 x , wxInt32 y ); + inline wxPoint2DInt( const wxPoint2DInt &pt ); + inline wxPoint2DInt( const wxPoint &pt ); + + // noops for this class, just return the coords + inline void GetFloor( wxInt32 *x , wxInt32 *y ) const; + inline void GetRounded( wxInt32 *x , wxInt32 *y ) const; + + inline wxDouble GetVectorLength() const; + wxDouble GetVectorAngle() const; + inline void SetVectorLength( wxDouble length ); + void SetVectorAngle( wxDouble degrees ); + void SetPolarCoordinates( wxInt32 angle , wxInt32 length ); + // set the vector length to 1.0, preserving the angle + inline void Normalize(); + + inline wxDouble GetDistance( const wxPoint2DInt &pt ) const; + inline wxDouble GetDistanceSquare( const wxPoint2DInt &pt ) const; + inline wxInt32 GetDotProduct( const wxPoint2DInt &vec ) const; + inline wxInt32 GetCrossProduct( const wxPoint2DInt &vec ) const; + + // the reflection of this point + inline wxPoint2DInt operator-(); + + inline wxPoint2DInt& operator=(const wxPoint2DInt& pt); + inline wxPoint2DInt& operator+=(const wxPoint2DInt& pt); + inline wxPoint2DInt& operator-=(const wxPoint2DInt& pt); + inline wxPoint2DInt& operator*=(const wxPoint2DInt& pt); + inline wxPoint2DInt& operator*=(wxDouble n); + inline wxPoint2DInt& operator*=(wxInt32 n); + inline wxPoint2DInt& operator/=(const wxPoint2DInt& pt); + inline wxPoint2DInt& operator/=(wxDouble n); + inline wxPoint2DInt& operator/=(wxInt32 n); + inline operator wxPoint() const; + inline bool operator==(const wxPoint2DInt& pt) const; + inline bool operator!=(const wxPoint2DInt& pt) const; + +#if wxUSE_STREAMS + void WriteTo( wxDataOutputStream &stream ) const; + void ReadFrom( wxDataInputStream &stream ); +#endif // wxUSE_STREAMS + + wxInt32 m_x; + wxInt32 m_y; +}; + +inline wxPoint2DInt operator+(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2); +inline wxPoint2DInt operator-(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2); +inline wxPoint2DInt operator*(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2); +inline wxPoint2DInt operator*(wxInt32 n , const wxPoint2DInt& pt); +inline wxPoint2DInt operator*(const wxPoint2DInt& pt , wxInt32 n); +inline wxPoint2DInt operator/(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2); +inline wxPoint2DInt operator/(const wxPoint2DInt& pt , wxInt32 n); + +inline wxPoint2DInt::wxPoint2DInt() +{ + m_x = 0; + m_y = 0; +} + +inline wxPoint2DInt::wxPoint2DInt( wxInt32 x , wxInt32 y ) +{ + m_x = x; + m_y = y; +} + +inline wxPoint2DInt::wxPoint2DInt( const wxPoint2DInt &pt ) +{ + m_x = pt.m_x; + m_y = pt.m_y; +} + +inline wxPoint2DInt::wxPoint2DInt( const wxPoint &pt ) +{ + m_x = pt.x; + m_y = pt.y; +} + +inline void wxPoint2DInt::GetFloor( wxInt32 *x , wxInt32 *y ) const +{ + if ( x ) + *x = m_x; + if ( y ) + *y = m_y; +} + +inline void wxPoint2DInt::GetRounded( wxInt32 *x , wxInt32 *y ) const +{ + GetFloor(x, y); +} + +inline wxDouble wxPoint2DInt::GetVectorLength() const +{ + // cast needed MIPSpro compiler under SGI + return sqrt( (double)(m_x)*(m_x) + (m_y)*(m_y) ); +} + +inline void wxPoint2DInt::SetVectorLength( wxDouble length ) +{ + wxDouble before = GetVectorLength(); + m_x = (wxInt32)(m_x * length / before); + m_y = (wxInt32)(m_y * length / before); +} + +inline void wxPoint2DInt::Normalize() +{ + SetVectorLength( 1 ); +} + +inline wxDouble wxPoint2DInt::GetDistance( const wxPoint2DInt &pt ) const +{ + return sqrt( GetDistanceSquare( pt ) ); +} + +inline wxDouble wxPoint2DInt::GetDistanceSquare( const wxPoint2DInt &pt ) const +{ + return ( (pt.m_x-m_x)*(pt.m_x-m_x) + (pt.m_y-m_y)*(pt.m_y-m_y) ); +} + +inline wxInt32 wxPoint2DInt::GetDotProduct( const wxPoint2DInt &vec ) const +{ + return ( m_x * vec.m_x + m_y * vec.m_y ); +} + +inline wxInt32 wxPoint2DInt::GetCrossProduct( const wxPoint2DInt &vec ) const +{ + return ( m_x * vec.m_y - vec.m_x * m_y ); +} + +inline wxPoint2DInt::operator wxPoint() const +{ + return wxPoint( m_x, m_y); +} + +inline wxPoint2DInt wxPoint2DInt::operator-() +{ + return wxPoint2DInt( -m_x, -m_y); +} + +inline wxPoint2DInt& wxPoint2DInt::operator=(const wxPoint2DInt& pt) +{ + if (this != &pt) + { + m_x = pt.m_x; + m_y = pt.m_y; + } + return *this; +} + +inline wxPoint2DInt& wxPoint2DInt::operator+=(const wxPoint2DInt& pt) +{ + m_x = m_x + pt.m_x; + m_y = m_y + pt.m_y; + return *this; +} + +inline wxPoint2DInt& wxPoint2DInt::operator-=(const wxPoint2DInt& pt) +{ + m_x = m_x - pt.m_x; + m_y = m_y - pt.m_y; + return *this; +} + +inline wxPoint2DInt& wxPoint2DInt::operator*=(const wxPoint2DInt& pt) +{ + m_x = m_x + pt.m_x; + m_y = m_y + pt.m_y; + return *this; +} + +inline wxPoint2DInt& wxPoint2DInt::operator/=(const wxPoint2DInt& pt) +{ + m_x = m_x - pt.m_x; + m_y = m_y - pt.m_y; + return *this; +} + +inline bool wxPoint2DInt::operator==(const wxPoint2DInt& pt) const +{ + return m_x == pt.m_x && m_y == pt.m_y; +} + +inline bool wxPoint2DInt::operator!=(const wxPoint2DInt& pt) const +{ + return m_x != pt.m_x || m_y != pt.m_y; +} + +inline wxPoint2DInt operator+(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2) +{ + return wxPoint2DInt( pt1.m_x + pt2.m_x , pt1.m_y + pt2.m_y ); +} + +inline wxPoint2DInt operator-(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2) +{ + return wxPoint2DInt( pt1.m_x - pt2.m_x , pt1.m_y - pt2.m_y ); +} + + +inline wxPoint2DInt operator*(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2) +{ + return wxPoint2DInt( pt1.m_x * pt2.m_x , pt1.m_y * pt2.m_y ); +} + +inline wxPoint2DInt operator*(wxInt32 n , const wxPoint2DInt& pt) +{ + return wxPoint2DInt( pt.m_x * n , pt.m_y * n ); +} + +inline wxPoint2DInt operator*(wxDouble n , const wxPoint2DInt& pt) +{ + return wxPoint2DInt( (int) (pt.m_x * n) , (int) (pt.m_y * n) ); +} + +inline wxPoint2DInt operator*(const wxPoint2DInt& pt , wxInt32 n) +{ + return wxPoint2DInt( pt.m_x * n , pt.m_y * n ); +} + +inline wxPoint2DInt operator*(const wxPoint2DInt& pt , wxDouble n) +{ + return wxPoint2DInt( (int) (pt.m_x * n) , (int) (pt.m_y * n) ); +} + +inline wxPoint2DInt operator/(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2) +{ + return wxPoint2DInt( pt1.m_x / pt2.m_x , pt1.m_y / pt2.m_y ); +} + +inline wxPoint2DInt operator/(const wxPoint2DInt& pt , wxInt32 n) +{ + return wxPoint2DInt( pt.m_x / n , pt.m_y / n ); +} + +inline wxPoint2DInt operator/(const wxPoint2DInt& pt , wxDouble n) +{ + return wxPoint2DInt( (int) (pt.m_x / n) , (int) (pt.m_y / n) ); +} + +// wxPoint2Ds represent a point or a vector in a 2d coordinate system + +class WXDLLIMPEXP_CORE wxPoint2DDouble +{ +public : + inline wxPoint2DDouble(); + inline wxPoint2DDouble( wxDouble x , wxDouble y ); + inline wxPoint2DDouble( const wxPoint2DDouble &pt ); + wxPoint2DDouble( const wxPoint2DInt &pt ) + { m_x = (wxDouble) pt.m_x ; m_y = (wxDouble) pt.m_y ; } + wxPoint2DDouble( const wxPoint &pt ) + { m_x = (wxDouble) pt.x ; m_y = (wxDouble) pt.y ; } + + // two different conversions to integers, floor and rounding + inline void GetFloor( wxInt32 *x , wxInt32 *y ) const; + inline void GetRounded( wxInt32 *x , wxInt32 *y ) const; + + inline wxDouble GetVectorLength() const; + wxDouble GetVectorAngle() const ; + void SetVectorLength( wxDouble length ); + void SetVectorAngle( wxDouble degrees ); + void SetPolarCoordinates( wxDouble angle , wxDouble length ); + // set the vector length to 1.0, preserving the angle + void Normalize(); + + inline wxDouble GetDistance( const wxPoint2DDouble &pt ) const; + inline wxDouble GetDistanceSquare( const wxPoint2DDouble &pt ) const; + inline wxDouble GetDotProduct( const wxPoint2DDouble &vec ) const; + inline wxDouble GetCrossProduct( const wxPoint2DDouble &vec ) const; + + // the reflection of this point + inline wxPoint2DDouble operator-(); + + inline wxPoint2DDouble& operator=(const wxPoint2DDouble& pt); + inline wxPoint2DDouble& operator+=(const wxPoint2DDouble& pt); + inline wxPoint2DDouble& operator-=(const wxPoint2DDouble& pt); + inline wxPoint2DDouble& operator*=(const wxPoint2DDouble& pt); + inline wxPoint2DDouble& operator*=(wxDouble n); + inline wxPoint2DDouble& operator*=(wxInt32 n); + inline wxPoint2DDouble& operator/=(const wxPoint2DDouble& pt); + inline wxPoint2DDouble& operator/=(wxDouble n); + inline wxPoint2DDouble& operator/=(wxInt32 n); + + inline bool operator==(const wxPoint2DDouble& pt) const; + inline bool operator!=(const wxPoint2DDouble& pt) const; + + wxDouble m_x; + wxDouble m_y; +}; + +inline wxPoint2DDouble operator+(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2); +inline wxPoint2DDouble operator-(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2); +inline wxPoint2DDouble operator*(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2); +inline wxPoint2DDouble operator*(wxDouble n , const wxPoint2DDouble& pt); +inline wxPoint2DDouble operator*(wxInt32 n , const wxPoint2DDouble& pt); +inline wxPoint2DDouble operator*(const wxPoint2DDouble& pt , wxDouble n); +inline wxPoint2DDouble operator*(const wxPoint2DDouble& pt , wxInt32 n); +inline wxPoint2DDouble operator/(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2); +inline wxPoint2DDouble operator/(const wxPoint2DDouble& pt , wxDouble n); +inline wxPoint2DDouble operator/(const wxPoint2DDouble& pt , wxInt32 n); + +inline wxPoint2DDouble::wxPoint2DDouble() +{ + m_x = 0.0; + m_y = 0.0; +} + +inline wxPoint2DDouble::wxPoint2DDouble( wxDouble x , wxDouble y ) +{ + m_x = x; + m_y = y; +} + +inline wxPoint2DDouble::wxPoint2DDouble( const wxPoint2DDouble &pt ) +{ + m_x = pt.m_x; + m_y = pt.m_y; +} + +inline void wxPoint2DDouble::GetFloor( wxInt32 *x , wxInt32 *y ) const +{ + *x = (wxInt32) floor( m_x ); + *y = (wxInt32) floor( m_y ); +} + +inline void wxPoint2DDouble::GetRounded( wxInt32 *x , wxInt32 *y ) const +{ + *x = (wxInt32) floor( m_x + 0.5 ); + *y = (wxInt32) floor( m_y + 0.5); +} + +inline wxDouble wxPoint2DDouble::GetVectorLength() const +{ + return sqrt( (m_x)*(m_x) + (m_y)*(m_y) ) ; +} + +inline void wxPoint2DDouble::SetVectorLength( wxDouble length ) +{ + wxDouble before = GetVectorLength() ; + m_x = (m_x * length / before) ; + m_y = (m_y * length / before) ; +} + +inline void wxPoint2DDouble::Normalize() +{ + SetVectorLength( 1 ); +} + +inline wxDouble wxPoint2DDouble::GetDistance( const wxPoint2DDouble &pt ) const +{ + return sqrt( GetDistanceSquare( pt ) ); +} + +inline wxDouble wxPoint2DDouble::GetDistanceSquare( const wxPoint2DDouble &pt ) const +{ + return ( (pt.m_x-m_x)*(pt.m_x-m_x) + (pt.m_y-m_y)*(pt.m_y-m_y) ); +} + +inline wxDouble wxPoint2DDouble::GetDotProduct( const wxPoint2DDouble &vec ) const +{ + return ( m_x * vec.m_x + m_y * vec.m_y ); +} + +inline wxDouble wxPoint2DDouble::GetCrossProduct( const wxPoint2DDouble &vec ) const +{ + return ( m_x * vec.m_y - vec.m_x * m_y ); +} + +inline wxPoint2DDouble wxPoint2DDouble::operator-() +{ + return wxPoint2DDouble( -m_x, -m_y); +} + +inline wxPoint2DDouble& wxPoint2DDouble::operator=(const wxPoint2DDouble& pt) +{ + if (this != &pt) + { + m_x = pt.m_x; + m_y = pt.m_y; + } + return *this; +} + +inline wxPoint2DDouble& wxPoint2DDouble::operator+=(const wxPoint2DDouble& pt) +{ + m_x = m_x + pt.m_x; + m_y = m_y + pt.m_y; + return *this; +} + +inline wxPoint2DDouble& wxPoint2DDouble::operator-=(const wxPoint2DDouble& pt) +{ + m_x = m_x - pt.m_x; + m_y = m_y - pt.m_y; + return *this; +} + +inline wxPoint2DDouble& wxPoint2DDouble::operator*=(const wxPoint2DDouble& pt) +{ + m_x = m_x * pt.m_x; + m_y = m_y * pt.m_y; + return *this; +} + +inline wxPoint2DDouble& wxPoint2DDouble::operator/=(const wxPoint2DDouble& pt) +{ + m_x = m_x / pt.m_x; + m_y = m_y / pt.m_y; + return *this; +} + +inline bool wxPoint2DDouble::operator==(const wxPoint2DDouble& pt) const +{ + return wxIsSameDouble(m_x, pt.m_x) && wxIsSameDouble(m_y, pt.m_y); +} + +inline bool wxPoint2DDouble::operator!=(const wxPoint2DDouble& pt) const +{ + return !(*this == pt); +} + +inline wxPoint2DDouble operator+(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2) +{ + return wxPoint2DDouble( pt1.m_x + pt2.m_x , pt1.m_y + pt2.m_y ); +} + +inline wxPoint2DDouble operator-(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2) +{ + return wxPoint2DDouble( pt1.m_x - pt2.m_x , pt1.m_y - pt2.m_y ); +} + + +inline wxPoint2DDouble operator*(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2) +{ + return wxPoint2DDouble( pt1.m_x * pt2.m_x , pt1.m_y * pt2.m_y ); +} + +inline wxPoint2DDouble operator*(wxDouble n , const wxPoint2DDouble& pt) +{ + return wxPoint2DDouble( pt.m_x * n , pt.m_y * n ); +} + +inline wxPoint2DDouble operator*(wxInt32 n , const wxPoint2DDouble& pt) +{ + return wxPoint2DDouble( pt.m_x * n , pt.m_y * n ); +} + +inline wxPoint2DDouble operator*(const wxPoint2DDouble& pt , wxDouble n) +{ + return wxPoint2DDouble( pt.m_x * n , pt.m_y * n ); +} + +inline wxPoint2DDouble operator*(const wxPoint2DDouble& pt , wxInt32 n) +{ + return wxPoint2DDouble( pt.m_x * n , pt.m_y * n ); +} + +inline wxPoint2DDouble operator/(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2) +{ + return wxPoint2DDouble( pt1.m_x / pt2.m_x , pt1.m_y / pt2.m_y ); +} + +inline wxPoint2DDouble operator/(const wxPoint2DDouble& pt , wxDouble n) +{ + return wxPoint2DDouble( pt.m_x / n , pt.m_y / n ); +} + +inline wxPoint2DDouble operator/(const wxPoint2DDouble& pt , wxInt32 n) +{ + return wxPoint2DDouble( pt.m_x / n , pt.m_y / n ); +} + +// wxRect2Ds are a axis-aligned rectangles, each side of the rect is parallel to the x- or m_y- axis. The rectangle is either defined by the +// top left and bottom right corner, or by the top left corner and size. A point is contained within the rectangle if +// left <= x < right and top <= m_y < bottom , thus it is a half open interval. + +class WXDLLIMPEXP_CORE wxRect2DDouble +{ +public: + wxRect2DDouble() + { m_x = m_y = m_width = m_height = 0; } + wxRect2DDouble(wxDouble x, wxDouble y, wxDouble w, wxDouble h) + { m_x = x; m_y = y; m_width = w; m_height = h; } +/* + wxRect2DDouble(const wxPoint2DDouble& topLeft, const wxPoint2DDouble& bottomRight); + wxRect2DDouble(const wxPoint2DDouble& pos, const wxSize& size); + wxRect2DDouble(const wxRect2DDouble& rect); +*/ + // single attribute accessors + + wxPoint2DDouble GetPosition() const + { return wxPoint2DDouble(m_x, m_y); } + wxSize GetSize() const + { return wxSize((int) m_width, (int) m_height); } + + // for the edge and corner accessors there are two setters counterparts, the Set.. functions keep the other corners at their + // position whenever sensible, the Move.. functions keep the size of the rect and move the other corners appropriately + + inline wxDouble GetLeft() const { return m_x; } + inline void SetLeft( wxDouble n ) { m_width += m_x - n; m_x = n; } + inline void MoveLeftTo( wxDouble n ) { m_x = n; } + inline wxDouble GetTop() const { return m_y; } + inline void SetTop( wxDouble n ) { m_height += m_y - n; m_y = n; } + inline void MoveTopTo( wxDouble n ) { m_y = n; } + inline wxDouble GetBottom() const { return m_y + m_height; } + inline void SetBottom( wxDouble n ) { m_height += n - (m_y+m_height);} + inline void MoveBottomTo( wxDouble n ) { m_y = n - m_height; } + inline wxDouble GetRight() const { return m_x + m_width; } + inline void SetRight( wxDouble n ) { m_width += n - (m_x+m_width) ; } + inline void MoveRightTo( wxDouble n ) { m_x = n - m_width; } + + inline wxPoint2DDouble GetLeftTop() const + { return wxPoint2DDouble( m_x , m_y ); } + inline void SetLeftTop( const wxPoint2DDouble &pt ) + { m_width += m_x - pt.m_x; m_height += m_y - pt.m_y; m_x = pt.m_x; m_y = pt.m_y; } + inline void MoveLeftTopTo( const wxPoint2DDouble &pt ) + { m_x = pt.m_x; m_y = pt.m_y; } + inline wxPoint2DDouble GetLeftBottom() const + { return wxPoint2DDouble( m_x , m_y + m_height ); } + inline void SetLeftBottom( const wxPoint2DDouble &pt ) + { m_width += m_x - pt.m_x; m_height += pt.m_y - (m_y+m_height) ; m_x = pt.m_x; } + inline void MoveLeftBottomTo( const wxPoint2DDouble &pt ) + { m_x = pt.m_x; m_y = pt.m_y - m_height; } + inline wxPoint2DDouble GetRightTop() const + { return wxPoint2DDouble( m_x+m_width , m_y ); } + inline void SetRightTop( const wxPoint2DDouble &pt ) + { m_width += pt.m_x - ( m_x + m_width ); m_height += m_y - pt.m_y; m_y = pt.m_y; } + inline void MoveRightTopTo( const wxPoint2DDouble &pt ) + { m_x = pt.m_x - m_width; m_y = pt.m_y; } + inline wxPoint2DDouble GetRightBottom() const + { return wxPoint2DDouble( m_x+m_width , m_y + m_height ); } + inline void SetRightBottom( const wxPoint2DDouble &pt ) + { m_width += pt.m_x - ( m_x + m_width ); m_height += pt.m_y - (m_y+m_height);} + inline void MoveRightBottomTo( const wxPoint2DDouble &pt ) + { m_x = pt.m_x - m_width; m_y = pt.m_y - m_height; } + inline wxPoint2DDouble GetCentre() const + { return wxPoint2DDouble( m_x+m_width/2 , m_y+m_height/2 ); } + inline void SetCentre( const wxPoint2DDouble &pt ) + { MoveCentreTo( pt ); } // since this is impossible without moving... + inline void MoveCentreTo( const wxPoint2DDouble &pt ) + { m_x += pt.m_x - (m_x+m_width/2) , m_y += pt.m_y -(m_y+m_height/2); } + inline wxOutCode GetOutCode( const wxPoint2DDouble &pt ) const + { return (wxOutCode) (( ( pt.m_x < m_x ) ? wxOutLeft : 0 ) + + ( ( pt.m_x > m_x + m_width ) ? wxOutRight : 0 ) + + ( ( pt.m_y < m_y ) ? wxOutTop : 0 ) + + ( ( pt.m_y > m_y + m_height ) ? wxOutBottom : 0 )); } + inline wxOutCode GetOutcode(const wxPoint2DDouble &pt) const + { return GetOutCode(pt) ; } + inline bool Contains( const wxPoint2DDouble &pt ) const + { return GetOutCode( pt ) == wxInside; } + inline bool Contains( const wxRect2DDouble &rect ) const + { return ( ( ( m_x <= rect.m_x ) && ( rect.m_x + rect.m_width <= m_x + m_width ) ) && + ( ( m_y <= rect.m_y ) && ( rect.m_y + rect.m_height <= m_y + m_height ) ) ); } + inline bool IsEmpty() const + { return m_width <= 0 || m_height <= 0; } + inline bool HaveEqualSize( const wxRect2DDouble &rect ) const + { return wxIsSameDouble(rect.m_width, m_width) && wxIsSameDouble(rect.m_height, m_height); } + + inline void Inset( wxDouble x , wxDouble y ) + { m_x += x; m_y += y; m_width -= 2 * x; m_height -= 2 * y; } + inline void Inset( wxDouble left , wxDouble top ,wxDouble right , wxDouble bottom ) + { m_x += left; m_y += top; m_width -= left + right; m_height -= top + bottom;} + inline void Offset( const wxPoint2DDouble &pt ) + { m_x += pt.m_x; m_y += pt.m_y; } + + void ConstrainTo( const wxRect2DDouble &rect ); + + inline wxPoint2DDouble Interpolate( wxInt32 widthfactor , wxInt32 heightfactor ) + { return wxPoint2DDouble( m_x + m_width * widthfactor , m_y + m_height * heightfactor ); } + + static void Intersect( const wxRect2DDouble &src1 , const wxRect2DDouble &src2 , wxRect2DDouble *dest ); + inline void Intersect( const wxRect2DDouble &otherRect ) + { Intersect( *this , otherRect , this ); } + inline wxRect2DDouble CreateIntersection( const wxRect2DDouble &otherRect ) const + { wxRect2DDouble result; Intersect( *this , otherRect , &result); return result; } + bool Intersects( const wxRect2DDouble &rect ) const; + + static void Union( const wxRect2DDouble &src1 , const wxRect2DDouble &src2 , wxRect2DDouble *dest ); + void Union( const wxRect2DDouble &otherRect ) + { Union( *this , otherRect , this ); } + void Union( const wxPoint2DDouble &pt ); + inline wxRect2DDouble CreateUnion( const wxRect2DDouble &otherRect ) const + { wxRect2DDouble result; Union( *this , otherRect , &result); return result; } + + inline void Scale( wxDouble f ) + { m_x *= f; m_y *= f; m_width *= f; m_height *= f;} + inline void Scale( wxInt32 num , wxInt32 denum ) + { m_x *= ((wxDouble)num)/((wxDouble)denum); m_y *= ((wxDouble)num)/((wxDouble)denum); + m_width *= ((wxDouble)num)/((wxDouble)denum); m_height *= ((wxDouble)num)/((wxDouble)denum);} + + wxRect2DDouble& operator = (const wxRect2DDouble& rect); + inline bool operator == (const wxRect2DDouble& rect) const + { return wxIsSameDouble(m_x, rect.m_x) && wxIsSameDouble(m_y, rect.m_y) && HaveEqualSize(rect); } + inline bool operator != (const wxRect2DDouble& rect) const + { return !(*this == rect); } + + wxDouble m_x; + wxDouble m_y; + wxDouble m_width; + wxDouble m_height; +}; + + +// wxRect2Ds are a axis-aligned rectangles, each side of the rect is parallel to the x- or m_y- axis. The rectangle is either defined by the +// top left and bottom right corner, or by the top left corner and size. A point is contained within the rectangle if +// left <= x < right and top <= m_y < bottom , thus it is a half open interval. + +class WXDLLIMPEXP_CORE wxRect2DInt +{ +public: + wxRect2DInt() { m_x = m_y = m_width = m_height = 0; } + wxRect2DInt( const wxRect& r ) { m_x = r.x ; m_y = r.y ; m_width = r.width ; m_height = r.height ; } + wxRect2DInt(wxInt32 x, wxInt32 y, wxInt32 w, wxInt32 h) { m_x = x; m_y = y; m_width = w; m_height = h; } + wxRect2DInt(const wxPoint2DInt& topLeft, const wxPoint2DInt& bottomRight); + inline wxRect2DInt(const wxPoint2DInt& pos, const wxSize& size); + inline wxRect2DInt(const wxRect2DInt& rect); + + // single attribute accessors + + wxPoint2DInt GetPosition() const { return wxPoint2DInt(m_x, m_y); } + wxSize GetSize() const { return wxSize(m_width, m_height); } + + // for the edge and corner accessors there are two setters counterparts, the Set.. functions keep the other corners at their + // position whenever sensible, the Move.. functions keep the size of the rect and move the other corners appropriately + + inline wxInt32 GetLeft() const { return m_x; } + inline void SetLeft( wxInt32 n ) { m_width += m_x - n; m_x = n; } + inline void MoveLeftTo( wxInt32 n ) { m_x = n; } + inline wxInt32 GetTop() const { return m_y; } + inline void SetTop( wxInt32 n ) { m_height += m_y - n; m_y = n; } + inline void MoveTopTo( wxInt32 n ) { m_y = n; } + inline wxInt32 GetBottom() const { return m_y + m_height; } + inline void SetBottom( wxInt32 n ) { m_height += n - (m_y+m_height);} + inline void MoveBottomTo( wxInt32 n ) { m_y = n - m_height; } + inline wxInt32 GetRight() const { return m_x + m_width; } + inline void SetRight( wxInt32 n ) { m_width += n - (m_x+m_width) ; } + inline void MoveRightTo( wxInt32 n ) { m_x = n - m_width; } + + inline wxPoint2DInt GetLeftTop() const { return wxPoint2DInt( m_x , m_y ); } + inline void SetLeftTop( const wxPoint2DInt &pt ) { m_width += m_x - pt.m_x; m_height += m_y - pt.m_y; m_x = pt.m_x; m_y = pt.m_y; } + inline void MoveLeftTopTo( const wxPoint2DInt &pt ) { m_x = pt.m_x; m_y = pt.m_y; } + inline wxPoint2DInt GetLeftBottom() const { return wxPoint2DInt( m_x , m_y + m_height ); } + inline void SetLeftBottom( const wxPoint2DInt &pt ) { m_width += m_x - pt.m_x; m_height += pt.m_y - (m_y+m_height) ; m_x = pt.m_x; } + inline void MoveLeftBottomTo( const wxPoint2DInt &pt ) { m_x = pt.m_x; m_y = pt.m_y - m_height; } + inline wxPoint2DInt GetRightTop() const { return wxPoint2DInt( m_x+m_width , m_y ); } + inline void SetRightTop( const wxPoint2DInt &pt ) { m_width += pt.m_x - ( m_x + m_width ); m_height += m_y - pt.m_y; m_y = pt.m_y; } + inline void MoveRightTopTo( const wxPoint2DInt &pt ) { m_x = pt.m_x - m_width; m_y = pt.m_y; } + inline wxPoint2DInt GetRightBottom() const { return wxPoint2DInt( m_x+m_width , m_y + m_height ); } + inline void SetRightBottom( const wxPoint2DInt &pt ) { m_width += pt.m_x - ( m_x + m_width ); m_height += pt.m_y - (m_y+m_height);} + inline void MoveRightBottomTo( const wxPoint2DInt &pt ) { m_x = pt.m_x - m_width; m_y = pt.m_y - m_height; } + inline wxPoint2DInt GetCentre() const { return wxPoint2DInt( m_x+m_width/2 , m_y+m_height/2 ); } + inline void SetCentre( const wxPoint2DInt &pt ) { MoveCentreTo( pt ); } // since this is impossible without moving... + inline void MoveCentreTo( const wxPoint2DInt &pt ) { m_x += pt.m_x - (m_x+m_width/2) , m_y += pt.m_y -(m_y+m_height/2); } + inline wxOutCode GetOutCode( const wxPoint2DInt &pt ) const + { return (wxOutCode) (( ( pt.m_x < m_x ) ? wxOutLeft : 0 ) + + ( ( pt.m_x >= m_x + m_width ) ? wxOutRight : 0 ) + + ( ( pt.m_y < m_y ) ? wxOutTop : 0 ) + + ( ( pt.m_y >= m_y + m_height ) ? wxOutBottom : 0 )); } + inline wxOutCode GetOutcode( const wxPoint2DInt &pt ) const + { return GetOutCode( pt ) ; } + inline bool Contains( const wxPoint2DInt &pt ) const + { return GetOutCode( pt ) == wxInside; } + inline bool Contains( const wxRect2DInt &rect ) const + { return ( ( ( m_x <= rect.m_x ) && ( rect.m_x + rect.m_width <= m_x + m_width ) ) && + ( ( m_y <= rect.m_y ) && ( rect.m_y + rect.m_height <= m_y + m_height ) ) ); } + inline bool IsEmpty() const + { return ( m_width <= 0 || m_height <= 0 ); } + inline bool HaveEqualSize( const wxRect2DInt &rect ) const + { return ( rect.m_width == m_width && rect.m_height == m_height ); } + + inline void Inset( wxInt32 x , wxInt32 y ) { m_x += x; m_y += y; m_width -= 2 * x; m_height -= 2 * y; } + inline void Inset( wxInt32 left , wxInt32 top ,wxInt32 right , wxInt32 bottom ) + { m_x += left; m_y += top; m_width -= left + right; m_height -= top + bottom;} + inline void Offset( const wxPoint2DInt &pt ) { m_x += pt.m_x; m_y += pt.m_y; } + void ConstrainTo( const wxRect2DInt &rect ); + inline wxPoint2DInt Interpolate( wxInt32 widthfactor , wxInt32 heightfactor ) { return wxPoint2DInt( m_x + m_width * widthfactor , m_y + m_height * heightfactor ); } + + static void Intersect( const wxRect2DInt &src1 , const wxRect2DInt &src2 , wxRect2DInt *dest ); + inline void Intersect( const wxRect2DInt &otherRect ) { Intersect( *this , otherRect , this ); } + inline wxRect2DInt CreateIntersection( const wxRect2DInt &otherRect ) const { wxRect2DInt result; Intersect( *this , otherRect , &result); return result; } + bool Intersects( const wxRect2DInt &rect ) const; + + static void Union( const wxRect2DInt &src1 , const wxRect2DInt &src2 , wxRect2DInt *dest ); + void Union( const wxRect2DInt &otherRect ) { Union( *this , otherRect , this ); } + void Union( const wxPoint2DInt &pt ); + inline wxRect2DInt CreateUnion( const wxRect2DInt &otherRect ) const { wxRect2DInt result; Union( *this , otherRect , &result); return result; } + + inline void Scale( wxInt32 f ) { m_x *= f; m_y *= f; m_width *= f; m_height *= f;} + inline void Scale( wxInt32 num , wxInt32 denum ) + { m_x *= ((wxInt32)num)/((wxInt32)denum); m_y *= ((wxInt32)num)/((wxInt32)denum); + m_width *= ((wxInt32)num)/((wxInt32)denum); m_height *= ((wxInt32)num)/((wxInt32)denum);} + + wxRect2DInt& operator = (const wxRect2DInt& rect); + bool operator == (const wxRect2DInt& rect) const; + bool operator != (const wxRect2DInt& rect) const; + +#if wxUSE_STREAMS + void WriteTo( wxDataOutputStream &stream ) const; + void ReadFrom( wxDataInputStream &stream ); +#endif // wxUSE_STREAMS + + wxInt32 m_x; + wxInt32 m_y; + wxInt32 m_width; + wxInt32 m_height; +}; + +inline wxRect2DInt::wxRect2DInt( const wxRect2DInt &r ) +{ + m_x = r.m_x; + m_y = r.m_y; + m_width = r.m_width; + m_height = r.m_height; +} + +inline wxRect2DInt::wxRect2DInt( const wxPoint2DInt &a , const wxPoint2DInt &b) +{ + m_x = wxMin( a.m_x , b.m_x ); + m_y = wxMin( a.m_y , b.m_y ); + m_width = abs( a.m_x - b.m_x ); + m_height = abs( a.m_y - b.m_y ); +} + +inline wxRect2DInt::wxRect2DInt( const wxPoint2DInt& pos, const wxSize& size) +{ + m_x = pos.m_x; + m_y = pos.m_y; + m_width = size.x; + m_height = size.y; +} + +inline bool wxRect2DInt::operator == (const wxRect2DInt& rect) const +{ + return (m_x==rect.m_x && m_y==rect.m_y && + m_width==rect.m_width && m_height==rect.m_height); +} + +inline bool wxRect2DInt::operator != (const wxRect2DInt& rect) const +{ + return !(*this == rect); +} + +class WXDLLIMPEXP_CORE wxTransform2D +{ +public : + virtual ~wxTransform2D() { } + virtual void Transform( wxPoint2DInt* pt )const = 0; + virtual void Transform( wxRect2DInt* r ) const; + virtual wxPoint2DInt Transform( const wxPoint2DInt &pt ) const; + virtual wxRect2DInt Transform( const wxRect2DInt &r ) const ; + + virtual void InverseTransform( wxPoint2DInt* pt ) const = 0; + virtual void InverseTransform( wxRect2DInt* r ) const ; + virtual wxPoint2DInt InverseTransform( const wxPoint2DInt &pt ) const ; + virtual wxRect2DInt InverseTransform( const wxRect2DInt &r ) const ; +}; + + +#endif // wxUSE_GEOMETRY + +#endif // _WX_GEOMETRY_H_ diff --git a/wxmsw/include/wx-3.0/wx/gifdecod.h b/wxmsw/include/wx-3.0/wx/gifdecod.h new file mode 100644 index 00000000..f0b84fc4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gifdecod.h @@ -0,0 +1,113 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gifdecod.h +// Purpose: wxGIFDecoder, GIF reader for wxImage and wxAnimation +// Author: Guillermo Rodriguez Garcia +// Version: 3.02 +// Copyright: (c) 1999 Guillermo Rodriguez Garcia +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GIFDECOD_H_ +#define _WX_GIFDECOD_H_ + +#include "wx/defs.h" + +#if wxUSE_STREAMS && wxUSE_GIF + +#include "wx/stream.h" +#include "wx/image.h" +#include "wx/animdecod.h" +#include "wx/dynarray.h" + +// internal utility used to store a frame in 8bit-per-pixel format +class GIFImage; + + +// -------------------------------------------------------------------------- +// Constants +// -------------------------------------------------------------------------- + +// Error codes: +// Note that the error code wxGIF_TRUNCATED means that the image itself +// is most probably OK, but the decoder didn't reach the end of the data +// stream; this means that if it was not reading directly from file, +// the stream will not be correctly positioned. +// +enum wxGIFErrorCode +{ + wxGIF_OK = 0, // everything was OK + wxGIF_INVFORMAT, // error in GIF header + wxGIF_MEMERR, // error allocating memory + wxGIF_TRUNCATED // file appears to be truncated +}; + +// -------------------------------------------------------------------------- +// wxGIFDecoder class +// -------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGIFDecoder : public wxAnimationDecoder +{ +public: + // constructor, destructor, etc. + wxGIFDecoder(); + ~wxGIFDecoder(); + + // get data of current frame + unsigned char* GetData(unsigned int frame) const; + unsigned char* GetPalette(unsigned int frame) const; + unsigned int GetNcolours(unsigned int frame) const; + int GetTransparentColourIndex(unsigned int frame) const; + wxColour GetTransparentColour(unsigned int frame) const; + + virtual wxSize GetFrameSize(unsigned int frame) const; + virtual wxPoint GetFramePosition(unsigned int frame) const; + virtual wxAnimationDisposal GetDisposalMethod(unsigned int frame) const; + virtual long GetDelay(unsigned int frame) const; + + // GIFs can contain both static images and animations + bool IsAnimation() const + { return m_nFrames > 1; } + + // load function which returns more info than just Load(): + wxGIFErrorCode LoadGIF( wxInputStream& stream ); + + // free all internal frames + void Destroy(); + + // implementation of wxAnimationDecoder's pure virtuals + virtual bool Load( wxInputStream& stream ) + { return LoadGIF(stream) == wxGIF_OK; } + + bool ConvertToImage(unsigned int frame, wxImage *image) const; + + wxAnimationDecoder *Clone() const + { return new wxGIFDecoder; } + wxAnimationType GetType() const + { return wxANIMATION_TYPE_GIF; } + +private: + // wxAnimationDecoder pure virtual + virtual bool DoCanRead( wxInputStream& stream ) const; + // modifies current stream position (see wxAnimationDecoder::CanRead) + + int getcode(wxInputStream& stream, int bits, int abfin); + wxGIFErrorCode dgif(wxInputStream& stream, + GIFImage *img, int interl, int bits); + + + // array of all frames + wxArrayPtrVoid m_frames; + + // decoder state vars + int m_restbits; // remaining valid bits + unsigned int m_restbyte; // remaining bytes in this block + unsigned int m_lastbyte; // last byte read + unsigned char m_buffer[256]; // buffer for reading + unsigned char *m_bufp; // pointer to next byte in buffer + + wxDECLARE_NO_COPY_CLASS(wxGIFDecoder); +}; + +#endif // wxUSE_STREAMS && wxUSE_GIF + +#endif // _WX_GIFDECOD_H_ diff --git a/wxmsw/include/wx-3.0/wx/glcanvas.h b/wxmsw/include/wx-3.0/wx/glcanvas.h new file mode 100644 index 00000000..688d4788 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/glcanvas.h @@ -0,0 +1,248 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/glcanvas.h +// Purpose: wxGLCanvas base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GLCANVAS_H_BASE_ +#define _WX_GLCANVAS_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_GLCANVAS + +#include "wx/app.h" +#include "wx/palette.h" +#include "wx/window.h" + +class WXDLLIMPEXP_FWD_GL wxGLCanvas; +class WXDLLIMPEXP_FWD_GL wxGLContext; + +// ---------------------------------------------------------------------------- +// Constants for attributes list +// ---------------------------------------------------------------------------- + +// Notice that not all implementation support options such as stereo, auxiliary +// buffers, alpha channel, and accumulator buffer, use IsDisplaySupported() to +// check for individual attributes support. +enum +{ + WX_GL_RGBA = 1, // use true color palette (on if no attrs specified) + WX_GL_BUFFER_SIZE, // bits for buffer if not WX_GL_RGBA + WX_GL_LEVEL, // 0 for main buffer, >0 for overlay, <0 for underlay + WX_GL_DOUBLEBUFFER, // use double buffering (on if no attrs specified) + WX_GL_STEREO, // use stereoscopic display + WX_GL_AUX_BUFFERS, // number of auxiliary buffers + WX_GL_MIN_RED, // use red buffer with most bits (> MIN_RED bits) + WX_GL_MIN_GREEN, // use green buffer with most bits (> MIN_GREEN bits) + WX_GL_MIN_BLUE, // use blue buffer with most bits (> MIN_BLUE bits) + WX_GL_MIN_ALPHA, // use alpha buffer with most bits (> MIN_ALPHA bits) + WX_GL_DEPTH_SIZE, // bits for Z-buffer (0,16,32) + WX_GL_STENCIL_SIZE, // bits for stencil buffer + WX_GL_MIN_ACCUM_RED, // use red accum buffer with most bits (> MIN_ACCUM_RED bits) + WX_GL_MIN_ACCUM_GREEN, // use green buffer with most bits (> MIN_ACCUM_GREEN bits) + WX_GL_MIN_ACCUM_BLUE, // use blue buffer with most bits (> MIN_ACCUM_BLUE bits) + WX_GL_MIN_ACCUM_ALPHA, // use alpha buffer with most bits (> MIN_ACCUM_ALPHA bits) + WX_GL_SAMPLE_BUFFERS, // 1 for multisampling support (antialiasing) + WX_GL_SAMPLES // 4 for 2x2 antialiasing supersampling on most graphics cards +}; + +#define wxGLCanvasName wxT("GLCanvas") + +// ---------------------------------------------------------------------------- +// wxGLContextBase: OpenGL rendering context +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_GL wxGLContextBase : public wxObject +{ +public: + /* + The derived class should provide a ctor with this signature: + + wxGLContext(wxGLCanvas *win, const wxGLContext *other = NULL); + */ + + // set this context as the current one + virtual bool SetCurrent(const wxGLCanvas& win) const = 0; +}; + +// ---------------------------------------------------------------------------- +// wxGLCanvasBase: window which can be used for OpenGL rendering +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_GL wxGLCanvasBase : public wxWindow +{ +public: + // default ctor doesn't initialize the window, use Create() later + wxGLCanvasBase(); + + virtual ~wxGLCanvasBase(); + + + /* + The derived class should provide a ctor with this signature: + + wxGLCanvas(wxWindow *parent, + wxWindowID id = wxID_ANY, + int* attribList = 0, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxGLCanvasName, + const wxPalette& palette = wxNullPalette); + */ + + // operations + // ---------- + + // set the given context associated with this window as the current one + bool SetCurrent(const wxGLContext& context) const; + + // flush the back buffer (if we have it) + virtual bool SwapBuffers() = 0; + + + // accessors + // --------- + + // check if the given attributes are supported without creating a canvas + static bool IsDisplaySupported(const int *attribList); + +#if wxUSE_PALETTE + const wxPalette *GetPalette() const { return &m_palette; } +#endif // wxUSE_PALETTE + + // miscellaneous helper functions + // ------------------------------ + + // call glcolor() for the colour with the given name, return false if + // colour not found + bool SetColour(const wxString& colour); + + // return true if the extension with given name is supported + // + // notice that while this function is implemented for all of GLX, WGL and + // AGL the extensions names are usually not the same for different + // platforms and so the code using it still usually uses conditional + // compilation + static bool IsExtensionSupported(const char *extension); + + // deprecated methods using the implicit wxGLContext +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED( wxGLContext* GetContext() const ); + + wxDEPRECATED( void SetCurrent() ); + + wxDEPRECATED( void OnSize(wxSizeEvent& event) ); +#endif // WXWIN_COMPATIBILITY_2_8 + +#ifdef __WXUNIVERSAL__ + // resolve the conflict with wxWindowUniv::SetCurrent() + virtual bool SetCurrent(bool doit) { return wxWindow::SetCurrent(doit); } +#endif + +protected: + // override this to implement SetColour() in GL_INDEX_MODE + // (currently only implemented in wxX11 and wxMotif ports) + virtual int GetColourIndex(const wxColour& WXUNUSED(col)) { return -1; } + + // check if the given extension name is present in the space-separated list + // of extensions supported by the current implementation such as returned + // by glXQueryExtensionsString() or glGetString(GL_EXTENSIONS) + static bool IsExtensionInList(const char *list, const char *extension); + +#if wxUSE_PALETTE + // create default palette if we're not using RGBA mode + // (not supported in most ports) + virtual wxPalette CreateDefaultPalette() { return wxNullPalette; } + + wxPalette m_palette; +#endif // wxUSE_PALETTE + +#if WXWIN_COMPATIBILITY_2_8 + wxGLContext *m_glContext; +#endif // WXWIN_COMPATIBILITY_2_8 +}; + +// ---------------------------------------------------------------------------- +// wxGLApp: a special wxApp subclass for OpenGL applications which must be used +// to select a visual compatible with the given attributes +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_GL wxGLAppBase : public wxApp +{ +public: + wxGLAppBase() : wxApp() { } + + // use this in the constructor of the user-derived wxGLApp class to + // determine if an OpenGL rendering context with these attributes + // is available - returns true if so, false if not. + virtual bool InitGLVisual(const int *attribList) = 0; +}; + +#if defined(__WXMSW__) + #include "wx/msw/glcanvas.h" +#elif defined(__WXMOTIF__) || defined(__WXX11__) + #include "wx/x11/glcanvas.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/glcanvas.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/glcanvas.h" +#elif defined(__WXMAC__) + #include "wx/osx/glcanvas.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/glcanvas.h" +#else + #error "wxGLCanvas not supported in this wxWidgets port" +#endif + +// wxMac and wxMSW don't need anything extra in wxGLAppBase, so declare it here +#ifndef wxGL_APP_DEFINED + +class WXDLLIMPEXP_GL wxGLApp : public wxGLAppBase +{ +public: + wxGLApp() : wxGLAppBase() { } + + virtual bool InitGLVisual(const int *attribList); + +private: + DECLARE_DYNAMIC_CLASS(wxGLApp) +}; + +#endif // !wxGL_APP_DEFINED + +// ---------------------------------------------------------------------------- +// wxGLAPI: an API wrapper that allows the use of 'old' APIs even on OpenGL +// platforms that don't support it natively anymore, if the APIs are available +// it's a mere redirect +// ---------------------------------------------------------------------------- + +#ifndef wxUSE_OPENGL_EMULATION + #define wxUSE_OPENGL_EMULATION 0 +#endif + +class WXDLLIMPEXP_GL wxGLAPI : public wxObject +{ +public: + wxGLAPI(); + ~wxGLAPI(); + + static void glFrustum(GLfloat left, GLfloat right, GLfloat bottom, + GLfloat top, GLfloat zNear, GLfloat zFar); + static void glBegin(GLenum mode); + static void glTexCoord2f(GLfloat s, GLfloat t); + static void glVertex3f(GLfloat x, GLfloat y, GLfloat z); + static void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz); + static void glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a); + static void glColor3f(GLfloat r, GLfloat g, GLfloat b); + static void glEnd(); +}; + +#endif // wxUSE_GLCANVAS + +#endif // _WX_GLCANVAS_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/graphics.h b/wxmsw/include/wx-3.0/wx/graphics.h new file mode 100644 index 00000000..46f60b68 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/graphics.h @@ -0,0 +1,888 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/graphics.h +// Purpose: graphics context header +// Author: Stefan Csomor +// Modified by: +// Created: +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GRAPHICS_H_ +#define _WX_GRAPHICS_H_ + +#include "wx/defs.h" + +#if wxUSE_GRAPHICS_CONTEXT + +#include "wx/geometry.h" +#include "wx/dynarray.h" +#include "wx/dc.h" +#include "wx/image.h" +#include "wx/vector.h" + +enum wxAntialiasMode +{ + wxANTIALIAS_NONE, // should be 0 + wxANTIALIAS_DEFAULT +}; + +enum wxInterpolationQuality +{ + // default interpolation + wxINTERPOLATION_DEFAULT, + // no interpolation + wxINTERPOLATION_NONE, + // fast interpolation, suited for interactivity + wxINTERPOLATION_FAST, + // better quality + wxINTERPOLATION_GOOD, + // best quality, not suited for interactivity + wxINTERPOLATION_BEST +}; + +enum wxCompositionMode +{ + // R = Result, S = Source, D = Destination, premultiplied with alpha + // Ra, Sa, Da their alpha components + + // classic Porter-Duff compositions + // http://keithp.com/~keithp/porterduff/p253-porter.pdf + + wxCOMPOSITION_INVALID = -1, /* indicates invalid/unsupported mode */ + wxCOMPOSITION_CLEAR, /* R = 0 */ + wxCOMPOSITION_SOURCE, /* R = S */ + wxCOMPOSITION_OVER, /* R = S + D*(1 - Sa) */ + wxCOMPOSITION_IN, /* R = S*Da */ + wxCOMPOSITION_OUT, /* R = S*(1 - Da) */ + wxCOMPOSITION_ATOP, /* R = S*Da + D*(1 - Sa) */ + + wxCOMPOSITION_DEST, /* R = D, essentially a noop */ + wxCOMPOSITION_DEST_OVER, /* R = S*(1 - Da) + D */ + wxCOMPOSITION_DEST_IN, /* R = D*Sa */ + wxCOMPOSITION_DEST_OUT, /* R = D*(1 - Sa) */ + wxCOMPOSITION_DEST_ATOP, /* R = S*(1 - Da) + D*Sa */ + wxCOMPOSITION_XOR, /* R = S*(1 - Da) + D*(1 - Sa) */ + + // mathematical compositions + wxCOMPOSITION_ADD /* R = S + D */ +}; + +class WXDLLIMPEXP_FWD_CORE wxWindowDC; +class WXDLLIMPEXP_FWD_CORE wxMemoryDC; +#if wxUSE_PRINTING_ARCHITECTURE +class WXDLLIMPEXP_FWD_CORE wxPrinterDC; +#endif +#ifdef __WXMSW__ +#if wxUSE_ENH_METAFILE +class WXDLLIMPEXP_FWD_CORE wxEnhMetaFileDC; +#endif +#endif +class WXDLLIMPEXP_FWD_CORE wxGraphicsContext; +class WXDLLIMPEXP_FWD_CORE wxGraphicsPath; +class WXDLLIMPEXP_FWD_CORE wxGraphicsMatrix; +class WXDLLIMPEXP_FWD_CORE wxGraphicsFigure; +class WXDLLIMPEXP_FWD_CORE wxGraphicsRenderer; +class WXDLLIMPEXP_FWD_CORE wxGraphicsPen; +class WXDLLIMPEXP_FWD_CORE wxGraphicsBrush; +class WXDLLIMPEXP_FWD_CORE wxGraphicsFont; +class WXDLLIMPEXP_FWD_CORE wxGraphicsBitmap; + +/* + * notes about the graphics context apis + * + * angles : are measured in radians, 0.0 being in direction of positiv x axis, PI/2 being + * in direction of positive y axis. + */ + +// Base class of all objects used for drawing in the new graphics API, the always point back to their +// originating rendering engine, there is no dynamic unloading of a renderer currently allowed, +// these references are not counted + +// +// The data used by objects like graphics pens etc is ref counted, in order to avoid unnecessary expensive +// duplication. Any operation on a shared instance that results in a modified state, uncouples this +// instance from the other instances that were shared - using copy on write semantics +// + +class WXDLLIMPEXP_FWD_CORE wxGraphicsObjectRefData; +class WXDLLIMPEXP_FWD_CORE wxGraphicsBitmapData; +class WXDLLIMPEXP_FWD_CORE wxGraphicsMatrixData; +class WXDLLIMPEXP_FWD_CORE wxGraphicsPathData; + +class WXDLLIMPEXP_CORE wxGraphicsObject : public wxObject +{ +public: + wxGraphicsObject(); + wxGraphicsObject( wxGraphicsRenderer* renderer ); + virtual ~wxGraphicsObject(); + + bool IsNull() const; + + // returns the renderer that was used to create this instance, or NULL if it has not been initialized yet + wxGraphicsRenderer* GetRenderer() const; + wxGraphicsObjectRefData* GetGraphicsData() const; +protected: + virtual wxObjectRefData* CreateRefData() const; + virtual wxObjectRefData* CloneRefData(const wxObjectRefData* data) const; + + DECLARE_DYNAMIC_CLASS(wxGraphicsObject) +}; + +class WXDLLIMPEXP_CORE wxGraphicsPen : public wxGraphicsObject +{ +public: + wxGraphicsPen() {} + virtual ~wxGraphicsPen() {} +private: + DECLARE_DYNAMIC_CLASS(wxGraphicsPen) +}; + +extern WXDLLIMPEXP_DATA_CORE(wxGraphicsPen) wxNullGraphicsPen; + +class WXDLLIMPEXP_CORE wxGraphicsBrush : public wxGraphicsObject +{ +public: + wxGraphicsBrush() {} + virtual ~wxGraphicsBrush() {} +private: + DECLARE_DYNAMIC_CLASS(wxGraphicsBrush) +}; + +extern WXDLLIMPEXP_DATA_CORE(wxGraphicsBrush) wxNullGraphicsBrush; + +class WXDLLIMPEXP_CORE wxGraphicsFont : public wxGraphicsObject +{ +public: + wxGraphicsFont() {} + virtual ~wxGraphicsFont() {} +private: + DECLARE_DYNAMIC_CLASS(wxGraphicsFont) +}; + +extern WXDLLIMPEXP_DATA_CORE(wxGraphicsFont) wxNullGraphicsFont; + +class WXDLLIMPEXP_CORE wxGraphicsBitmap : public wxGraphicsObject +{ +public: + wxGraphicsBitmap() {} + virtual ~wxGraphicsBitmap() {} + + // Convert bitmap to wxImage: this is more efficient than converting to + // wxBitmap first and then to wxImage and also works without X server + // connection under Unix that wxBitmap requires. +#if wxUSE_IMAGE + wxImage ConvertToImage() const; +#endif // wxUSE_IMAGE + + void* GetNativeBitmap() const; + + const wxGraphicsBitmapData* GetBitmapData() const + { return (const wxGraphicsBitmapData*) GetRefData(); } + wxGraphicsBitmapData* GetBitmapData() + { return (wxGraphicsBitmapData*) GetRefData(); } + +private: + DECLARE_DYNAMIC_CLASS(wxGraphicsBitmap) +}; + +extern WXDLLIMPEXP_DATA_CORE(wxGraphicsBitmap) wxNullGraphicsBitmap; + +class WXDLLIMPEXP_CORE wxGraphicsMatrix : public wxGraphicsObject +{ +public: + wxGraphicsMatrix() {} + + virtual ~wxGraphicsMatrix() {} + + // concatenates the matrix + virtual void Concat( const wxGraphicsMatrix *t ); + void Concat( const wxGraphicsMatrix &t ) { Concat( &t ); } + + // sets the matrix to the respective values + virtual void Set(wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0, + wxDouble tx=0.0, wxDouble ty=0.0); + + // gets the component valuess of the matrix + virtual void Get(wxDouble* a=NULL, wxDouble* b=NULL, wxDouble* c=NULL, + wxDouble* d=NULL, wxDouble* tx=NULL, wxDouble* ty=NULL) const; + + // makes this the inverse matrix + virtual void Invert(); + + // returns true if the elements of the transformation matrix are equal ? + virtual bool IsEqual( const wxGraphicsMatrix* t) const; + bool IsEqual( const wxGraphicsMatrix& t) const { return IsEqual( &t ); } + + // return true if this is the identity matrix + virtual bool IsIdentity() const; + + // + // transformation + // + + // add the translation to this matrix + virtual void Translate( wxDouble dx , wxDouble dy ); + + // add the scale to this matrix + virtual void Scale( wxDouble xScale , wxDouble yScale ); + + // add the rotation to this matrix (radians) + virtual void Rotate( wxDouble angle ); + + // + // apply the transforms + // + + // applies that matrix to the point + virtual void TransformPoint( wxDouble *x, wxDouble *y ) const; + + // applies the matrix except for translations + virtual void TransformDistance( wxDouble *dx, wxDouble *dy ) const; + + // returns the native representation + virtual void * GetNativeMatrix() const; + + const wxGraphicsMatrixData* GetMatrixData() const + { return (const wxGraphicsMatrixData*) GetRefData(); } + wxGraphicsMatrixData* GetMatrixData() + { return (wxGraphicsMatrixData*) GetRefData(); } + +private: + DECLARE_DYNAMIC_CLASS(wxGraphicsMatrix) +}; + +extern WXDLLIMPEXP_DATA_CORE(wxGraphicsMatrix) wxNullGraphicsMatrix; + +class WXDLLIMPEXP_CORE wxGraphicsPath : public wxGraphicsObject +{ +public: + wxGraphicsPath() {} + virtual ~wxGraphicsPath() {} + + // + // These are the path primitives from which everything else can be constructed + // + + // begins a new subpath at (x,y) + virtual void MoveToPoint( wxDouble x, wxDouble y ); + void MoveToPoint( const wxPoint2DDouble& p); + + // adds a straight line from the current point to (x,y) + virtual void AddLineToPoint( wxDouble x, wxDouble y ); + void AddLineToPoint( const wxPoint2DDouble& p); + + // adds a cubic Bezier curve from the current point, using two control points and an end point + virtual void AddCurveToPoint( wxDouble cx1, wxDouble cy1, wxDouble cx2, wxDouble cy2, wxDouble x, wxDouble y ); + void AddCurveToPoint( const wxPoint2DDouble& c1, const wxPoint2DDouble& c2, const wxPoint2DDouble& e); + + // adds another path + virtual void AddPath( const wxGraphicsPath& path ); + + // closes the current sub-path + virtual void CloseSubpath(); + + // gets the last point of the current path, (0,0) if not yet set + virtual void GetCurrentPoint( wxDouble* x, wxDouble* y) const; + wxPoint2DDouble GetCurrentPoint() const; + + // adds an arc of a circle centering at (x,y) with radius (r) from startAngle to endAngle + virtual void AddArc( wxDouble x, wxDouble y, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise ); + void AddArc( const wxPoint2DDouble& c, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise); + + // + // These are convenience functions which - if not available natively will be assembled + // using the primitives from above + // + + // adds a quadratic Bezier curve from the current point, using a control point and an end point + virtual void AddQuadCurveToPoint( wxDouble cx, wxDouble cy, wxDouble x, wxDouble y ); + + // appends a rectangle as a new closed subpath + virtual void AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h ); + + // appends an ellipsis as a new closed subpath fitting the passed rectangle + virtual void AddCircle( wxDouble x, wxDouble y, wxDouble r ); + + // appends a an arc to two tangents connecting (current) to (x1,y1) and (x1,y1) to (x2,y2), also a straight line from (current) to (x1,y1) + virtual void AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ); + + // appends an ellipse + virtual void AddEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h); + + // appends a rounded rectangle + virtual void AddRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius); + + // returns the native path + virtual void * GetNativePath() const; + + // give the native path returned by GetNativePath() back (there might be some deallocations necessary) + virtual void UnGetNativePath(void *p)const; + + // transforms each point of this path by the matrix + virtual void Transform( const wxGraphicsMatrix& matrix ); + + // gets the bounding box enclosing all points (possibly including control points) + virtual void GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h)const; + wxRect2DDouble GetBox()const; + + virtual bool Contains( wxDouble x, wxDouble y, wxPolygonFillMode fillStyle = wxODDEVEN_RULE)const; + bool Contains( const wxPoint2DDouble& c, wxPolygonFillMode fillStyle = wxODDEVEN_RULE)const; + + const wxGraphicsPathData* GetPathData() const + { return (const wxGraphicsPathData*) GetRefData(); } + wxGraphicsPathData* GetPathData() + { return (wxGraphicsPathData*) GetRefData(); } + +private: + DECLARE_DYNAMIC_CLASS(wxGraphicsPath) +}; + +extern WXDLLIMPEXP_DATA_CORE(wxGraphicsPath) wxNullGraphicsPath; + + +// Describes a single gradient stop. +class wxGraphicsGradientStop +{ +public: + wxGraphicsGradientStop(wxColour col = wxTransparentColour, + float pos = 0.) + : m_col(col), + m_pos(pos) + { + } + + // default copy ctor, assignment operator and dtor are ok + + const wxColour& GetColour() const { return m_col; } + void SetColour(const wxColour& col) { m_col = col; } + + float GetPosition() const { return m_pos; } + void SetPosition(float pos) + { + wxASSERT_MSG( pos >= 0 && pos <= 1, "invalid gradient stop position" ); + + m_pos = pos; + } + +private: + // The colour of this gradient band. + wxColour m_col; + + // Its starting position: 0 is the beginning and 1 is the end. + float m_pos; +}; + +// A collection of gradient stops ordered by their positions (from lowest to +// highest). The first stop (index 0, position 0.0) is always the starting +// colour and the last one (index GetCount() - 1, position 1.0) is the end +// colour. +class WXDLLIMPEXP_CORE wxGraphicsGradientStops +{ +public: + wxGraphicsGradientStops(wxColour startCol = wxTransparentColour, + wxColour endCol = wxTransparentColour) + { + // we can't use Add() here as it relies on having start/end stops as + // first/last array elements so do it manually + m_stops.push_back(wxGraphicsGradientStop(startCol, 0.f)); + m_stops.push_back(wxGraphicsGradientStop(endCol, 1.f)); + } + + // default copy ctor, assignment operator and dtor are ok for this class + + + // Add a stop in correct order. + void Add(const wxGraphicsGradientStop& stop); + void Add(wxColour col, float pos) { Add(wxGraphicsGradientStop(col, pos)); } + + // Get the number of stops. + size_t GetCount() const { return m_stops.size(); } + + // Return the stop at the given index (which must be valid). + wxGraphicsGradientStop Item(unsigned n) const { return m_stops.at(n); } + + // Get/set start and end colours. + void SetStartColour(wxColour col) + { m_stops[0].SetColour(col); } + wxColour GetStartColour() const + { return m_stops[0].GetColour(); } + void SetEndColour(wxColour col) + { m_stops[m_stops.size() - 1].SetColour(col); } + wxColour GetEndColour() const + { return m_stops[m_stops.size() - 1].GetColour(); } + +private: + // All the stops stored in ascending order of positions. + wxVector m_stops; +}; + +class WXDLLIMPEXP_CORE wxGraphicsContext : public wxGraphicsObject +{ +public: + wxGraphicsContext(wxGraphicsRenderer* renderer); + + virtual ~wxGraphicsContext(); + + static wxGraphicsContext* Create( const wxWindowDC& dc); + static wxGraphicsContext * Create( const wxMemoryDC& dc); +#if wxUSE_PRINTING_ARCHITECTURE + static wxGraphicsContext * Create( const wxPrinterDC& dc); +#endif +#ifdef __WXMSW__ +#if wxUSE_ENH_METAFILE + static wxGraphicsContext * Create( const wxEnhMetaFileDC& dc); +#endif +#endif + + static wxGraphicsContext* CreateFromNative( void * context ); + + static wxGraphicsContext* CreateFromNativeWindow( void * window ); + + static wxGraphicsContext* Create( wxWindow* window ); + +#if wxUSE_IMAGE + // Create a context for drawing onto a wxImage. The image life time must be + // greater than that of the context itself as when the context is destroyed + // it will copy its contents to the specified image. + static wxGraphicsContext* Create(wxImage& image); +#endif // wxUSE_IMAGE + + // create a context that can be used for measuring texts only, no drawing allowed + static wxGraphicsContext * Create(); + + // begin a new document (relevant only for printing / pdf etc) if there is a progress dialog, message will be shown + virtual bool StartDoc( const wxString& message ); + + // done with that document (relevant only for printing / pdf etc) + virtual void EndDoc(); + + // opens a new page (relevant only for printing / pdf etc) with the given size in points + // (if both are null the default page size will be used) + virtual void StartPage( wxDouble width = 0, wxDouble height = 0 ); + + // ends the current page (relevant only for printing / pdf etc) + virtual void EndPage(); + + // make sure that the current content of this context is immediately visible + virtual void Flush(); + + wxGraphicsPath CreatePath() const; + + virtual wxGraphicsPen CreatePen(const wxPen& pen) const; + + virtual wxGraphicsBrush CreateBrush(const wxBrush& brush ) const; + + // sets the brush to a linear gradient, starting at (x1,y1) and ending at + // (x2,y2) with the given boundary colours or the specified stops + wxGraphicsBrush + CreateLinearGradientBrush(wxDouble x1, wxDouble y1, + wxDouble x2, wxDouble y2, + const wxColour& c1, const wxColour& c2) const; + wxGraphicsBrush + CreateLinearGradientBrush(wxDouble x1, wxDouble y1, + wxDouble x2, wxDouble y2, + const wxGraphicsGradientStops& stops) const; + + // sets the brush to a radial gradient originating at (xo,yc) and ending + // on a circle around (xc,yc) with the given radius; the colours may be + // specified by just the two extremes or the full array of gradient stops + wxGraphicsBrush + CreateRadialGradientBrush(wxDouble xo, wxDouble yo, + wxDouble xc, wxDouble yc, wxDouble radius, + const wxColour& oColor, const wxColour& cColor) const; + + wxGraphicsBrush + CreateRadialGradientBrush(wxDouble xo, wxDouble yo, + wxDouble xc, wxDouble yc, wxDouble radius, + const wxGraphicsGradientStops& stops) const; + + // creates a font + virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) const; + virtual wxGraphicsFont CreateFont(double sizeInPixels, + const wxString& facename, + int flags = wxFONTFLAG_DEFAULT, + const wxColour& col = *wxBLACK) const; + + // create a native bitmap representation + virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) const; +#if wxUSE_IMAGE + wxGraphicsBitmap CreateBitmapFromImage(const wxImage& image) const; +#endif // wxUSE_IMAGE + + // create a native bitmap representation + virtual wxGraphicsBitmap CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) const; + + // create a 'native' matrix corresponding to these values + virtual wxGraphicsMatrix CreateMatrix( wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0, + wxDouble tx=0.0, wxDouble ty=0.0) const; + + wxGraphicsMatrix CreateMatrix( const wxAffineMatrix2DBase& mat ) const + { + wxMatrix2D mat2D; + wxPoint2DDouble tr; + mat.Get(&mat2D, &tr); + + return CreateMatrix(mat2D.m_11, mat2D.m_12, mat2D.m_21, mat2D.m_22, + tr.m_x, tr.m_y); + } + + // push the current state of the context, ie the transformation matrix on a stack + virtual void PushState() = 0; + + // pops a stored state from the stack + virtual void PopState() = 0; + + // clips drawings to the region intersected with the current clipping region + virtual void Clip( const wxRegion ®ion ) = 0; + + // clips drawings to the rect intersected with the current clipping region + virtual void Clip( wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0; + + // resets the clipping to original extent + virtual void ResetClip() = 0; + + // returns the native context + virtual void * GetNativeContext() = 0; + + // returns the current shape antialiasing mode + virtual wxAntialiasMode GetAntialiasMode() const { return m_antialias; } + + // sets the antialiasing mode, returns true if it supported + virtual bool SetAntialiasMode(wxAntialiasMode antialias) = 0; + + // returns the current interpolation quality + virtual wxInterpolationQuality GetInterpolationQuality() const { return m_interpolation; } + + // sets the interpolation quality, returns true if it supported + virtual bool SetInterpolationQuality(wxInterpolationQuality interpolation) = 0; + + // returns the current compositing operator + virtual wxCompositionMode GetCompositionMode() const { return m_composition; } + + // sets the compositing operator, returns true if it supported + virtual bool SetCompositionMode(wxCompositionMode op) = 0; + + // returns the size of the graphics context in device coordinates + void GetSize(wxDouble* width, wxDouble* height) const + { + if ( width ) + *width = m_width; + if ( height ) + *height = m_height; + } + + // returns the resolution of the graphics context in device points per inch + virtual void GetDPI( wxDouble* dpiX, wxDouble* dpiY); + +#if 0 + // sets the current alpha on this context + virtual void SetAlpha( wxDouble alpha ); + + // returns the alpha on this context + virtual wxDouble GetAlpha() const; +#endif + + // all rendering is done into a fully transparent temporary context + virtual void BeginLayer(wxDouble opacity) = 0; + + // composites back the drawings into the context with the opacity given at + // the BeginLayer call + virtual void EndLayer() = 0; + + // + // transformation : changes the current transformation matrix CTM of the context + // + + // translate + virtual void Translate( wxDouble dx , wxDouble dy ) = 0; + + // scale + virtual void Scale( wxDouble xScale , wxDouble yScale ) = 0; + + // rotate (radians) + virtual void Rotate( wxDouble angle ) = 0; + + // concatenates this transform with the current transform of this context + virtual void ConcatTransform( const wxGraphicsMatrix& matrix ) = 0; + + // sets the transform of this context + virtual void SetTransform( const wxGraphicsMatrix& matrix ) = 0; + + // gets the matrix of this context + virtual wxGraphicsMatrix GetTransform() const = 0; + // + // setting the paint + // + + // sets the pen + virtual void SetPen( const wxGraphicsPen& pen ); + + void SetPen( const wxPen& pen ); + + // sets the brush for filling + virtual void SetBrush( const wxGraphicsBrush& brush ); + + void SetBrush( const wxBrush& brush ); + + // sets the font + virtual void SetFont( const wxGraphicsFont& font ); + + void SetFont( const wxFont& font, const wxColour& colour ); + + + // strokes along a path with the current pen + virtual void StrokePath( const wxGraphicsPath& path ) = 0; + + // fills a path with the current brush + virtual void FillPath( const wxGraphicsPath& path, wxPolygonFillMode fillStyle = wxODDEVEN_RULE ) = 0; + + // draws a path by first filling and then stroking + virtual void DrawPath( const wxGraphicsPath& path, wxPolygonFillMode fillStyle = wxODDEVEN_RULE ); + + // + // text + // + + void DrawText( const wxString &str, wxDouble x, wxDouble y ) + { DoDrawText(str, x, y); } + + void DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle ) + { DoDrawRotatedText(str, x, y, angle); } + + void DrawText( const wxString &str, wxDouble x, wxDouble y, + const wxGraphicsBrush& backgroundBrush ) + { DoDrawFilledText(str, x, y, backgroundBrush); } + + void DrawText( const wxString &str, wxDouble x, wxDouble y, + wxDouble angle, const wxGraphicsBrush& backgroundBrush ) + { DoDrawRotatedFilledText(str, x, y, angle, backgroundBrush); } + + + virtual void GetTextExtent( const wxString &text, wxDouble *width, wxDouble *height, + wxDouble *descent = NULL, wxDouble *externalLeading = NULL ) const = 0; + + virtual void GetPartialTextExtents(const wxString& text, wxArrayDouble& widths) const = 0; + + // + // image support + // + + virtual void DrawBitmap( const wxGraphicsBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0; + + virtual void DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0; + + virtual void DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0; + + // + // convenience methods + // + + // strokes a single line + virtual void StrokeLine( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2); + + // stroke lines connecting each of the points + virtual void StrokeLines( size_t n, const wxPoint2DDouble *points); + + // stroke disconnected lines from begin to end points + virtual void StrokeLines( size_t n, const wxPoint2DDouble *beginPoints, const wxPoint2DDouble *endPoints); + + // draws a polygon + virtual void DrawLines( size_t n, const wxPoint2DDouble *points, wxPolygonFillMode fillStyle = wxODDEVEN_RULE ); + + // draws a rectangle + virtual void DrawRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h); + + // draws an ellipse + virtual void DrawEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h); + + // draws a rounded rectangle + virtual void DrawRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius); + + // wrappers using wxPoint2DDouble TODO + + // helper to determine if a 0.5 offset should be applied for the drawing operation + virtual bool ShouldOffset() const { return false; } + + // indicates whether the context should try to offset for pixel boundaries, this only makes sense on + // bitmap devices like screen, by default this is turned off + virtual void EnableOffset(bool enable = true); + + void DisableOffset() { EnableOffset(false); } + bool OffsetEnabled() { return m_enableOffset; } + +protected: + // These fields must be initialized in the derived class ctors. + wxDouble m_width, + m_height; + + wxGraphicsPen m_pen; + wxGraphicsBrush m_brush; + wxGraphicsFont m_font; + wxAntialiasMode m_antialias; + wxCompositionMode m_composition; + wxInterpolationQuality m_interpolation; + bool m_enableOffset; + +protected: + // implementations of overloaded public functions: we use different names + // for them to avoid the virtual function hiding problems in the derived + // classes + virtual void DoDrawText(const wxString& str, wxDouble x, wxDouble y) = 0; + virtual void DoDrawRotatedText(const wxString& str, wxDouble x, wxDouble y, + wxDouble angle); + virtual void DoDrawFilledText(const wxString& str, wxDouble x, wxDouble y, + const wxGraphicsBrush& backgroundBrush); + virtual void DoDrawRotatedFilledText(const wxString& str, + wxDouble x, wxDouble y, + wxDouble angle, + const wxGraphicsBrush& backgroundBrush); + + wxDECLARE_NO_COPY_CLASS(wxGraphicsContext); + DECLARE_ABSTRACT_CLASS(wxGraphicsContext) +}; + +#if 0 + +// +// A graphics figure allows to cache path, pen etc creations, also will be a basis for layering/grouping elements +// + +class WXDLLIMPEXP_CORE wxGraphicsFigure : public wxGraphicsObject +{ +public: + wxGraphicsFigure(wxGraphicsRenderer* renderer); + + virtual ~wxGraphicsFigure(); + + void SetPath( wxGraphicsMatrix* matrix ); + + void SetMatrix( wxGraphicsPath* path); + + // draws this object on the context + virtual void Draw( wxGraphicsContext* cg ); + + // returns the path of this object + wxGraphicsPath* GetPath() { return m_path; } + + // returns the transformation matrix of this object, may be null if there is no transformation necessary + wxGraphicsMatrix* GetMatrix() { return m_matrix; } + +private: + wxGraphicsMatrix* m_matrix; + wxGraphicsPath* m_path; + + DECLARE_DYNAMIC_CLASS(wxGraphicsFigure) +}; + +#endif + +// +// The graphics renderer is the instance corresponding to the rendering engine used, eg there is ONE core graphics renderer +// instance on OSX. This instance is pointed back to by all objects created by it. Therefore you can create eg additional +// paths at any point from a given matrix etc. +// + +class WXDLLIMPEXP_CORE wxGraphicsRenderer : public wxObject +{ +public: + wxGraphicsRenderer() {} + + virtual ~wxGraphicsRenderer() {} + + static wxGraphicsRenderer* GetDefaultRenderer(); + + static wxGraphicsRenderer* GetCairoRenderer(); + // Context + + virtual wxGraphicsContext * CreateContext( const wxWindowDC& dc) = 0; + virtual wxGraphicsContext * CreateContext( const wxMemoryDC& dc) = 0; +#if wxUSE_PRINTING_ARCHITECTURE + virtual wxGraphicsContext * CreateContext( const wxPrinterDC& dc) = 0; +#endif +#ifdef __WXMSW__ +#if wxUSE_ENH_METAFILE + virtual wxGraphicsContext * CreateContext( const wxEnhMetaFileDC& dc) = 0; +#endif +#endif + + virtual wxGraphicsContext * CreateContextFromNativeContext( void * context ) = 0; + + virtual wxGraphicsContext * CreateContextFromNativeWindow( void * window ) = 0; + + virtual wxGraphicsContext * CreateContext( wxWindow* window ) = 0; + +#if wxUSE_IMAGE + virtual wxGraphicsContext * CreateContextFromImage(wxImage& image) = 0; +#endif // wxUSE_IMAGE + + // create a context that can be used for measuring texts only, no drawing allowed + virtual wxGraphicsContext * CreateMeasuringContext() = 0; + + // Path + + virtual wxGraphicsPath CreatePath() = 0; + + // Matrix + + virtual wxGraphicsMatrix CreateMatrix( wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0, + wxDouble tx=0.0, wxDouble ty=0.0) = 0; + + // Paints + + virtual wxGraphicsPen CreatePen(const wxPen& pen) = 0; + + virtual wxGraphicsBrush CreateBrush(const wxBrush& brush ) = 0; + + // Gradient brush creation functions may not honour all the stops specified + // stops and use just its boundary colours (this is currently the case + // under OS X) + virtual wxGraphicsBrush + CreateLinearGradientBrush(wxDouble x1, wxDouble y1, + wxDouble x2, wxDouble y2, + const wxGraphicsGradientStops& stops) = 0; + + virtual wxGraphicsBrush + CreateRadialGradientBrush(wxDouble xo, wxDouble yo, + wxDouble xc, wxDouble yc, + wxDouble radius, + const wxGraphicsGradientStops& stops) = 0; + + // sets the font + virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) = 0; + virtual wxGraphicsFont CreateFont(double sizeInPixels, + const wxString& facename, + int flags = wxFONTFLAG_DEFAULT, + const wxColour& col = *wxBLACK) = 0; + + // create a native bitmap representation + virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) = 0; +#if wxUSE_IMAGE + virtual wxGraphicsBitmap CreateBitmapFromImage(const wxImage& image) = 0; + virtual wxImage CreateImageFromBitmap(const wxGraphicsBitmap& bmp) = 0; +#endif // wxUSE_IMAGE + + // create a graphics bitmap from a native bitmap + virtual wxGraphicsBitmap CreateBitmapFromNativeBitmap( void* bitmap ) = 0; + + // create a subimage from a native image representation + virtual wxGraphicsBitmap CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0; + +private: + wxDECLARE_NO_COPY_CLASS(wxGraphicsRenderer); + DECLARE_ABSTRACT_CLASS(wxGraphicsRenderer) +}; + + +#if wxUSE_IMAGE +inline +wxImage wxGraphicsBitmap::ConvertToImage() const +{ + wxGraphicsRenderer* renderer = GetRenderer(); + return renderer ? renderer->CreateImageFromBitmap(*this) : wxNullImage; +} +#endif // wxUSE_IMAGE + +#endif // wxUSE_GRAPHICS_CONTEXT + +#endif // _WX_GRAPHICS_H_ diff --git a/wxmsw/include/wx-3.0/wx/grid.h b/wxmsw/include/wx-3.0/wx/grid.h new file mode 100644 index 00000000..02055658 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/grid.h @@ -0,0 +1,21 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/grid.h +// Purpose: wxGrid base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GRID_H_BASE_ +#define _WX_GRID_H_BASE_ + +#include "wx/generic/grid.h" + +// these headers used to be included from the above header but isn't any more, +// still do it from here for compatibility +#include "wx/generic/grideditors.h" +#include "wx/generic/gridctrl.h" + +#endif // _WX_GRID_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/accel.h b/wxmsw/include/wx-3.0/wx/gtk/accel.h new file mode 100644 index 00000000..09ffb61c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/accel.h @@ -0,0 +1,14 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/accel.h +// Purpose: wxAcceleratorTable redirection file +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// VZ: keeping the old file just in case we're going to have a native GTK+ +// wxAcceleratorTable implementation one day, but for now use the generic +// version +#include "wx/generic/accel.h" diff --git a/wxmsw/include/wx-3.0/wx/gtk/animate.h b/wxmsw/include/wx-3.0/wx/gtk/animate.h new file mode 100644 index 00000000..1cda545a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/animate.h @@ -0,0 +1,153 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/animate.h +// Purpose: Animation classes +// Author: Julian Smart and Guillermo Rodriguez Garcia +// Modified by: Francesco Montorsi +// Created: 13/8/99 +// Copyright: (c) Julian Smart and Guillermo Rodriguez Garcia +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTKANIMATEH__ +#define _WX_GTKANIMATEH__ + +typedef struct _GdkPixbufAnimation GdkPixbufAnimation; +typedef struct _GdkPixbufAnimationIter GdkPixbufAnimationIter; + +// ---------------------------------------------------------------------------- +// wxAnimation +// Unlike the generic wxAnimation object (see generic\animate.cpp), we won't +// use directly wxAnimationHandlers as gdk-pixbuf already provides the +// concept of handler and will automatically use the available handlers. +// Like generic wxAnimation object, this implementation of wxAnimation is +// refcounted so that assignment is very fast +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxAnimation : public wxAnimationBase +{ +public: + wxAnimation(const wxString &name, wxAnimationType type = wxANIMATION_TYPE_ANY) + : m_pixbuf(NULL) { LoadFile(name, type); } + wxAnimation(GdkPixbufAnimation *p = NULL); + wxAnimation(const wxAnimation&); + ~wxAnimation() { UnRef(); } + + wxAnimation& operator= (const wxAnimation&); + + virtual bool IsOk() const + { return m_pixbuf != NULL; } + + + // unfortunately GdkPixbufAnimation does not expose these info: + + virtual unsigned int GetFrameCount() const { return 0; } + virtual wxImage GetFrame(unsigned int frame) const; + + // we can retrieve the delay for a frame only after building + // a GdkPixbufAnimationIter... + virtual int GetDelay(unsigned int WXUNUSED(frame)) const { return 0; } + + virtual wxSize GetSize() const; + + virtual bool LoadFile(const wxString &name, wxAnimationType type = wxANIMATION_TYPE_ANY); + virtual bool Load(wxInputStream &stream, wxAnimationType type = wxANIMATION_TYPE_ANY); + + // Implementation +public: // used by GTK callbacks + + GdkPixbufAnimation *GetPixbuf() const + { return m_pixbuf; } + void SetPixbuf(GdkPixbufAnimation* p); + +protected: + GdkPixbufAnimation *m_pixbuf; + +private: + void UnRef(); + + typedef wxAnimationBase base_type; + DECLARE_DYNAMIC_CLASS(wxAnimation) +}; + + +// ---------------------------------------------------------------------------- +// wxAnimationCtrl +// ---------------------------------------------------------------------------- + +// Resize to animation size if this is set +#define wxAN_FIT_ANIMATION 0x0010 + +class WXDLLIMPEXP_ADV wxAnimationCtrl: public wxAnimationCtrlBase +{ +public: + wxAnimationCtrl() { Init(); } + wxAnimationCtrl(wxWindow *parent, + wxWindowID id, + const wxAnimation& anim = wxNullAnimation, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxAC_DEFAULT_STYLE, + const wxString& name = wxAnimationCtrlNameStr) + { + Init(); + + Create(parent, id, anim, pos, size, style, name); + } + + bool Create(wxWindow *parent, wxWindowID id, + const wxAnimation& anim = wxNullAnimation, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxAC_DEFAULT_STYLE, + const wxString& name = wxAnimationCtrlNameStr); + + ~wxAnimationCtrl(); + +public: // event handler + + void OnTimer(wxTimerEvent &); + +public: // public API + + virtual bool LoadFile(const wxString& filename, wxAnimationType type = wxANIMATION_TYPE_ANY); + virtual bool Load(wxInputStream& stream, wxAnimationType type = wxANIMATION_TYPE_ANY); + + virtual void SetAnimation(const wxAnimation &anim); + virtual wxAnimation GetAnimation() const + { return wxAnimation(m_anim); } + + virtual bool Play(); + virtual void Stop(); + + virtual bool IsPlaying() const; + + bool SetBackgroundColour( const wxColour &colour ); + +protected: + + virtual void DisplayStaticImage(); + virtual wxSize DoGetBestSize() const; + void FitToAnimation(); + void ClearToBackgroundColour(); + + void ResetAnim(); + void ResetIter(); + +protected: // internal vars + + GdkPixbufAnimation *m_anim; + GdkPixbufAnimationIter *m_iter; + + wxTimer m_timer; + bool m_bPlaying; + +private: + typedef wxAnimationCtrlBase base_type; + + void Init(); + + DECLARE_DYNAMIC_CLASS(wxAnimationCtrl) + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_GTKANIMATEH__ diff --git a/wxmsw/include/wx-3.0/wx/gtk/anybutton.h b/wxmsw/include/wx-3.0/wx/gtk/anybutton.h new file mode 100644 index 00000000..604c72c7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/anybutton.h @@ -0,0 +1,80 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/anybutton.h +// Purpose: wxGTK wxAnyButton class declaration +// Author: Robert Roebling +// Created: 1998-05-20 (extracted from button.h) +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_ANYBUTTON_H_ +#define _WX_GTK_ANYBUTTON_H_ + +//----------------------------------------------------------------------------- +// wxAnyButton +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxAnyButton : public wxAnyButtonBase +{ +public: + wxAnyButton() + { + m_isCurrent = + m_isPressed = false; + } + + virtual bool Enable( bool enable = true ); + + // implementation + // -------------- + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // called from GTK callbacks: they update the button state and call + // GTKUpdateBitmap() + void GTKMouseEnters(); + void GTKMouseLeaves(); + void GTKPressed(); + void GTKReleased(); + +protected: + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + + virtual wxBitmap DoGetBitmap(State which) const; + virtual void DoSetBitmap(const wxBitmap& bitmap, State which); + virtual void DoSetBitmapPosition(wxDirection dir); + +private: + typedef wxAnyButtonBase base_type; + + // focus event handler: calls GTKUpdateBitmap() + void GTKOnFocus(wxFocusEvent& event); + + // update the bitmap to correspond to the current button state + void GTKUpdateBitmap(); + + // return the current button state from m_isXXX flags (which means that it + // might not correspond to the real current state as e.g. m_isCurrent will + // never be true if we don't have a valid current bitmap) + State GTKGetCurrentState() const; + + // show the given bitmap (must be valid) + void GTKDoShowBitmap(const wxBitmap& bitmap); + + + // the bitmaps for the different state of the buttons, all of them may be + // invalid and the button only shows a bitmap at all if State_Normal bitmap + // is valid + wxBitmap m_bitmaps[State_Max]; + + // true iff mouse is currently over the button + bool m_isCurrent; + + // true iff the button is in pressed state + bool m_isPressed; + + wxDECLARE_NO_COPY_CLASS(wxAnyButton); +}; + +#endif // _WX_GTK_ANYBUTTON_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/app.h b/wxmsw/include/wx-3.0/wx/gtk/app.h new file mode 100644 index 00000000..6f112a3c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/app.h @@ -0,0 +1,93 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/app.h +// Purpose: wxApp definition for wxGTK +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling, Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_APP_H_ +#define _WX_GTK_APP_H_ + +//----------------------------------------------------------------------------- +// classes +//----------------------------------------------------------------------------- + +#if wxUSE_LIBHILDON || wxUSE_LIBHILDON2 +typedef struct _HildonProgram HildonProgram; +#endif // wxUSE_LIBHILDON || wxUSE_LIBHILDON2 + +//----------------------------------------------------------------------------- +// wxApp +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxApp: public wxAppBase +{ +public: + wxApp(); + virtual ~wxApp(); + + /* override for altering the way wxGTK intializes the GUI + * (palette/visual/colorcube). under wxMSW, OnInitGui() does nothing by + * default. when overriding this method, the code in it is likely to be + * platform dependent, otherwise use OnInit(). */ + virtual bool SetNativeTheme(const wxString& theme); + virtual bool OnInitGui(); + + // override base class (pure) virtuals + virtual void WakeUpIdle(); + + virtual bool Initialize(int& argc, wxChar **argv); + virtual void CleanUp(); + + virtual void OnAssertFailure(const wxChar *file, + int line, + const wxChar *func, + const wxChar *cond, + const wxChar *msg); + + // GTK-specific methods + // ------------------- + + // this can be overridden to return a specific visual to be used for GTK+ + // instead of the default one (it's used by wxGLApp) + // + // must return XVisualInfo pointer (it is not freed by caller) + virtual void *GetXVisualInfo() { return NULL; } + + // Check if we're using a global menu. Currently this is only true when + // running under Ubuntu Unity and global menu is not disabled. + // + // This is mostly used in the implementation in order to work around + // various bugs arising due to this. + static bool GTKIsUsingGlobalMenu(); + +#if wxUSE_LIBHILDON || wxUSE_LIBHILDON2 + // Maemo-specific method: get the main program object + HildonProgram *GetHildonProgram(); +#endif // wxUSE_LIBHILDON || wxUSE_LIBHILDON2 + + // implementation only from now on + // ------------------------------- + + // check for pending events, without interference from our idle source + bool EventsPending(); + bool DoIdle(); + +private: + // true if we're inside an assert modal dialog + bool m_isInAssert; + +#if wxUSE_THREADS + wxMutex m_idleMutex; +#endif + unsigned m_idleSourceId; + +#if wxUSE_LIBHILDON || wxUSE_LIBHILDON2 + HildonProgram *m_hildonProgram; +#endif // wxUSE_LIBHILDON || wxUSE_LIBHILDON2 + + DECLARE_DYNAMIC_CLASS(wxApp) +}; + +#endif // _WX_GTK_APP_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/assertdlg_gtk.h b/wxmsw/include/wx-3.0/wx/gtk/assertdlg_gtk.h new file mode 100644 index 00000000..098e9b11 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/assertdlg_gtk.h @@ -0,0 +1,77 @@ +/* /////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/assertdlg_gtk.h +// Purpose: GtkAssertDialog +// Author: Francesco Montorsi +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////// */ + +#ifndef _WX_GTK_ASSERTDLG_H_ +#define _WX_GTK_ASSERTDLG_H_ + +#define GTK_TYPE_ASSERT_DIALOG (gtk_assert_dialog_get_type ()) +#define GTK_ASSERT_DIALOG(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GTK_TYPE_ASSERT_DIALOG, GtkAssertDialog)) +#define GTK_ASSERT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_ASSERT_DIALOG, GtkAssertDialogClass)) +#define GTK_IS_ASSERT_DIALOG(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GTK_TYPE_ASSERT_DIALOG)) +#define GTK_IS_ASSERT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_ASSERT_DIALOG)) +#define GTK_ASSERT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ASSERT_DIALOG, GtkAssertDialogClass)) + +typedef struct _GtkAssertDialog GtkAssertDialog; +typedef struct _GtkAssertDialogClass GtkAssertDialogClass; +typedef void (*GtkAssertDialogStackFrameCallback)(void *); + +struct _GtkAssertDialog +{ + GtkDialog parent_instance; + + /* GtkAssertDialog widgets */ + GtkWidget *expander; + GtkWidget *message; + GtkWidget *treeview; + + GtkWidget *shownexttime; + + /* callback for processing the stack frame */ + GtkAssertDialogStackFrameCallback callback; + void *userdata; +}; + +struct _GtkAssertDialogClass +{ + GtkDialogClass parent_class; +}; + +typedef enum +{ + GTK_ASSERT_DIALOG_STOP, + GTK_ASSERT_DIALOG_CONTINUE, + GTK_ASSERT_DIALOG_CONTINUE_SUPPRESSING +} GtkAssertDialogResponseID; + + + + +GType gtk_assert_dialog_get_type(void); +GtkWidget *gtk_assert_dialog_new(void); + +/* get the assert message */ +gchar *gtk_assert_dialog_get_message(GtkAssertDialog *assertdlg); + +/* set the assert message */ +void gtk_assert_dialog_set_message(GtkAssertDialog *assertdlg, const gchar *msg); + +/* get a string containing all stack frames appended to the dialog */ +gchar *gtk_assert_dialog_get_backtrace(GtkAssertDialog *assertdlg); + +/* sets the callback to use when the user wants to see the stackframe */ +void gtk_assert_dialog_set_backtrace_callback(GtkAssertDialog *assertdlg, + GtkAssertDialogStackFrameCallback callback, + void *userdata); + +/* appends a stack frame to the dialog */ +void gtk_assert_dialog_append_stack_frame(GtkAssertDialog *dlg, + const gchar *function, + const gchar *sourcefile, + guint line_number); + +#endif /* _WX_GTK_ASSERTDLG_H_ */ diff --git a/wxmsw/include/wx-3.0/wx/gtk/bitmap.h b/wxmsw/include/wx-3.0/wx/gtk/bitmap.h new file mode 100644 index 00000000..d035f2c2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/bitmap.h @@ -0,0 +1,181 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/bitmap.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_BITMAP_H_ +#define _WX_GTK_BITMAP_H_ + +#ifdef __WXGTK3__ +typedef struct _cairo cairo_t; +typedef struct _cairo_surface cairo_surface_t; +#endif +typedef struct _GdkPixbuf GdkPixbuf; +class WXDLLIMPEXP_FWD_CORE wxPixelDataBase; + +//----------------------------------------------------------------------------- +// wxMask +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMask: public wxMaskBase +{ +public: + wxMask(); + wxMask(const wxMask& mask); + wxMask( const wxBitmap& bitmap, const wxColour& colour ); +#if wxUSE_PALETTE + wxMask( const wxBitmap& bitmap, int paletteIndex ); +#endif // wxUSE_PALETTE + wxMask( const wxBitmap& bitmap ); + virtual ~wxMask(); + wxBitmap GetBitmap() const; + + // implementation +#ifdef __WXGTK3__ + wxMask(cairo_surface_t*); + operator cairo_surface_t*() const; +#else + wxMask(GdkPixmap*); + operator GdkPixmap*() const; +#endif + +protected: + virtual void FreeData(); + virtual bool InitFromColour(const wxBitmap& bitmap, const wxColour& colour); + virtual bool InitFromMonoBitmap(const wxBitmap& bitmap); + +private: +#ifdef __WXGTK3__ + cairo_surface_t* m_bitmap; +#else + GdkPixmap* m_bitmap; +#endif + + DECLARE_DYNAMIC_CLASS(wxMask) +}; + +//----------------------------------------------------------------------------- +// wxBitmap +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxBitmap: public wxBitmapBase +{ +public: + wxBitmap() { } + wxBitmap( int width, int height, int depth = wxBITMAP_SCREEN_DEPTH ) + { Create(width, height, depth); } + wxBitmap( const wxSize& sz, int depth = wxBITMAP_SCREEN_DEPTH ) + { Create(sz, depth); } + wxBitmap( const char bits[], int width, int height, int depth = 1 ); + wxBitmap( const char* const* bits ); +#ifdef wxNEEDS_CHARPP + // needed for old GCC + wxBitmap(char** data) + { *this = wxBitmap(const_cast(data)); } +#endif + wxBitmap( const wxString &filename, wxBitmapType type = wxBITMAP_DEFAULT_TYPE ); +#if wxUSE_IMAGE + wxBitmap(const wxImage& image, int depth = wxBITMAP_SCREEN_DEPTH); +#endif // wxUSE_IMAGE + wxBitmap(GdkPixbuf* pixbuf, int depth = 0); + virtual ~wxBitmap(); + + bool Create(int width, int height, int depth = wxBITMAP_SCREEN_DEPTH); + bool Create(const wxSize& sz, int depth = wxBITMAP_SCREEN_DEPTH) + { return Create(sz.GetWidth(), sz.GetHeight(), depth); } + bool Create(int width, int height, const wxDC& WXUNUSED(dc)) + { return Create(width,height); } + + + virtual int GetHeight() const; + virtual int GetWidth() const; + virtual int GetDepth() const; + +#if wxUSE_IMAGE + wxImage ConvertToImage() const; +#endif // wxUSE_IMAGE + + // copies the contents and mask of the given (colour) icon to the bitmap + virtual bool CopyFromIcon(const wxIcon& icon); + + wxMask *GetMask() const; + void SetMask( wxMask *mask ); + + wxBitmap GetSubBitmap( const wxRect& rect ) const; + + bool SaveFile(const wxString &name, wxBitmapType type, + const wxPalette *palette = NULL) const; + bool LoadFile(const wxString &name, wxBitmapType type = wxBITMAP_DEFAULT_TYPE); + +#if wxUSE_PALETTE + wxPalette *GetPalette() const; + void SetPalette(const wxPalette& palette); + wxPalette *GetColourMap() const { return GetPalette(); } +#endif // wxUSE_PALETTE + + static void InitStandardHandlers(); + + // implementation + // -------------- + + void SetHeight( int height ); + void SetWidth( int width ); + void SetDepth( int depth ); + +#ifdef __WXGTK3__ + GdkPixbuf* GetPixbufNoMask() const; + cairo_t* CairoCreate() const; + void Draw(cairo_t* cr, int x, int y, bool useMask = true, const wxColour* fg = NULL, const wxColour* bg = NULL) const; + void SetSourceSurface(cairo_t* cr, int x, int y, const wxColour* fg = NULL, const wxColour* bg = NULL) const; +#else + GdkPixmap *GetPixmap() const; + bool HasPixmap() const; + bool HasPixbuf() const; + wxBitmap(GdkPixmap* pixmap); +#endif + GdkPixbuf *GetPixbuf() const; + + // raw bitmap access support functions + void *GetRawData(wxPixelDataBase& data, int bpp); + void UngetRawData(wxPixelDataBase& data); + + bool HasAlpha() const; + +protected: +#ifndef __WXGTK3__ +#if wxUSE_IMAGE + bool CreateFromImage(const wxImage& image, int depth); +#endif // wxUSE_IMAGE +#endif + + virtual wxGDIRefData* CreateGDIRefData() const; + virtual wxGDIRefData* CloneGDIRefData(const wxGDIRefData* data) const; + +private: +#ifndef __WXGTK3__ + void SetPixmap(GdkPixmap* pixmap); +#if wxUSE_IMAGE + // to be called from CreateFromImage only! + bool CreateFromImageAsPixmap(const wxImage& image, int depth); + bool CreateFromImageAsPixbuf(const wxImage& image); +#endif // wxUSE_IMAGE + +public: + // implementation only + enum Representation + { + Pixmap, + Pixbuf + }; + // removes other representations from memory, keeping only 'keep' + // (wxBitmap may keep same bitmap e.g. as both pixmap and pixbuf): + void PurgeOtherRepresentations(Representation keep); +#endif + + DECLARE_DYNAMIC_CLASS(wxBitmap) +}; + +#endif // _WX_GTK_BITMAP_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/bmpbuttn.h b/wxmsw/include/wx-3.0/wx/gtk/bmpbuttn.h new file mode 100644 index 00000000..f70e28ce --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/bmpbuttn.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/bmpbutton.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_BMPBUTTON_H_ +#define _WX_GTK_BMPBUTTON_H_ + +// ---------------------------------------------------------------------------- +// wxBitmapButton +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxBitmapButton : public wxBitmapButtonBase +{ +public: + wxBitmapButton() { } + + wxBitmapButton(wxWindow *parent, + wxWindowID id, + const wxBitmap& bitmap, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr) + { + Create(parent, id, bitmap, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxBitmap& bitmap, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr); + +private: + DECLARE_DYNAMIC_CLASS(wxBitmapButton) +}; + +#endif // _WX_GTK_BMPBUTTON_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/bmpcbox.h b/wxmsw/include/wx-3.0/wx/gtk/bmpcbox.h new file mode 100644 index 00000000..f5d00a51 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/bmpcbox.h @@ -0,0 +1,146 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/bmpcbox.h +// Purpose: wxBitmapComboBox +// Author: Jaakko Salli +// Created: 2008-05-19 +// Copyright: (c) 2008 Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_BMPCBOX_H_ +#define _WX_GTK_BMPCBOX_H_ + + +#include "wx/combobox.h" + +// ---------------------------------------------------------------------------- +// wxBitmapComboBox: a wxComboBox that allows images to be shown +// in front of string items. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxBitmapComboBox : public wxComboBox, + public wxBitmapComboBoxBase +{ +public: + // ctors and such + wxBitmapComboBox() : wxComboBox(), wxBitmapComboBoxBase() + { + Init(); + } + + wxBitmapComboBox(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, + const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxBitmapComboBoxNameStr) + : wxComboBox(), + wxBitmapComboBoxBase() + { + Init(); + + (void)Create(parent, id, value, pos, size, n, + choices, style, validator, name); + } + + wxBitmapComboBox(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxBitmapComboBoxNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + int n, + const wxString choices[], + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxBitmapComboBoxNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxBitmapComboBoxNameStr); + + virtual ~wxBitmapComboBox(); + + // Sets the image for the given item. + virtual void SetItemBitmap(unsigned int n, const wxBitmap& bitmap); + + // Returns the image of the item with the given index. + virtual wxBitmap GetItemBitmap(unsigned int n) const; + + // Returns size of the image used in list + virtual wxSize GetBitmapSize() const + { + return m_bitmapSize; + } + + // Adds item with image to the end of the combo box. + int Append(const wxString& item, const wxBitmap& bitmap = wxNullBitmap); + int Append(const wxString& item, const wxBitmap& bitmap, void *clientData); + int Append(const wxString& item, const wxBitmap& bitmap, wxClientData *clientData); + + // Inserts item with image into the list before pos. Not valid for wxCB_SORT + // styles, use Append instead. + int Insert(const wxString& item, const wxBitmap& bitmap, unsigned int pos); + int Insert(const wxString& item, const wxBitmap& bitmap, + unsigned int pos, void *clientData); + int Insert(const wxString& item, const wxBitmap& bitmap, + unsigned int pos, wxClientData *clientData); + + // Override some wxTextEntry interface. + virtual void WriteText(const wxString& value); + + virtual wxString GetValue() const; + virtual void Remove(long from, long to); + + virtual void SetInsertionPoint(long pos); + virtual long GetInsertionPoint() const; + virtual long GetLastPosition() const; + + virtual void SetSelection(long from, long to); + virtual void GetSelection(long *from, long *to) const; + + virtual void SetSelection(int n) { wxComboBox::SetSelection(n); } + virtual int GetSelection() const { return wxComboBox::GetSelection(); } + + virtual bool IsEditable() const; + virtual void SetEditable(bool editable); + + virtual GtkWidget* GetConnectWidget(); + +protected: + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + + virtual void GTKCreateComboBoxWidget(); + virtual void GTKInsertComboBoxTextItem( unsigned int n, const wxString& text ); + + virtual wxSize DoGetBestSize() const; + + wxSize m_bitmapSize; + int m_bitmapCellIndex; + +private: + void Init(); + + DECLARE_DYNAMIC_CLASS(wxBitmapComboBox) +}; + +#endif // _WX_GTK_BMPCBOX_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/brush.h b/wxmsw/include/wx-3.0/wx/gtk/brush.h new file mode 100644 index 00000000..37a4845e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/brush.h @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/brush.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_BRUSH_H_ +#define _WX_GTK_BRUSH_H_ + +class WXDLLIMPEXP_FWD_CORE wxBitmap; +class WXDLLIMPEXP_FWD_CORE wxColour; + +//----------------------------------------------------------------------------- +// wxBrush +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxBrush: public wxBrushBase +{ +public: + wxBrush() { } + + wxBrush( const wxColour &colour, wxBrushStyle style = wxBRUSHSTYLE_SOLID ); +#if FUTURE_WXWIN_COMPATIBILITY_3_0 + wxDEPRECATED_FUTURE( wxBrush(const wxColour& col, int style) ); +#endif + wxBrush( const wxBitmap &stippleBitmap ); + virtual ~wxBrush(); + + bool operator==(const wxBrush& brush) const; + bool operator!=(const wxBrush& brush) const { return !(*this == brush); } + + wxBrushStyle GetStyle() const; + wxColour GetColour() const; + wxBitmap *GetStipple() const; + + void SetColour( const wxColour& col ); + void SetColour( unsigned char r, unsigned char g, unsigned char b ); + void SetStyle( wxBrushStyle style ); + void SetStipple( const wxBitmap& stipple ); + +#if FUTURE_WXWIN_COMPATIBILITY_3_0 + wxDEPRECATED_FUTURE( void SetStyle(int style) ) + { SetStyle((wxBrushStyle)style); } +#endif + +protected: + virtual wxGDIRefData *CreateGDIRefData() const; + virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const; + + DECLARE_DYNAMIC_CLASS(wxBrush) +}; + +#endif // _WX_GTK_BRUSH_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/button.h b/wxmsw/include/wx-3.0/wx/gtk/button.h new file mode 100644 index 00000000..9e7a57d8 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/button.h @@ -0,0 +1,73 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/button.h +// Purpose: wxGTK wxButton class declaration +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_BUTTON_H_ +#define _WX_GTK_BUTTON_H_ + +//----------------------------------------------------------------------------- +// wxButton +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxButton : public wxButtonBase +{ +public: + wxButton() {} + wxButton(wxWindow *parent, wxWindowID id, + const wxString& label = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr) + { + Create(parent, id, label, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, wxWindowID id, + const wxString& label = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr); + + virtual wxWindow *SetDefault(); + virtual void SetLabel( const wxString &label ); + + // implementation + // -------------- + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // helper to allow access to protected member from GTK callback + void MoveWindow(int x, int y, int width, int height) { DoMoveWindow(x, y, width, height); } + + // called from GTK callbacks: they update the button state and call + // GTKUpdateBitmap() + void GTKMouseEnters(); + void GTKMouseLeaves(); + void GTKPressed(); + void GTKReleased(); + +protected: + virtual wxSize DoGetBestSize() const; + virtual void DoApplyWidgetStyle(GtkRcStyle *style); + +#if wxUSE_MARKUP + virtual bool DoSetLabelMarkup(const wxString& markup); +#endif // wxUSE_MARKUP + +private: + typedef wxButtonBase base_type; + + // Return the GtkLabel used by this button. + GtkLabel *GTKGetLabel() const; + + DECLARE_DYNAMIC_CLASS(wxButton) +}; + +#endif // _WX_GTK_BUTTON_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/calctrl.h b/wxmsw/include/wx-3.0/wx/gtk/calctrl.h new file mode 100644 index 00000000..3fce698e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/calctrl.h @@ -0,0 +1,69 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/calctrl.h +// Purpose: wxGtkCalendarCtrl control +// Author: Marcin Wojdyr +// Copyright: (C) 2008 Marcin Wojdyr +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef GTK_CALCTRL_H__ +#define GTK_CALCTRL_H__ + +class WXDLLIMPEXP_ADV wxGtkCalendarCtrl : public wxCalendarCtrlBase +{ +public: + wxGtkCalendarCtrl() {} + wxGtkCalendarCtrl(wxWindow *parent, + wxWindowID id, + const wxDateTime& date = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCAL_SHOW_HOLIDAYS, + const wxString& name = wxCalendarNameStr) + { + Create(parent, id, date, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxDateTime& date = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCAL_SHOW_HOLIDAYS, + const wxString& name = wxCalendarNameStr); + + virtual ~wxGtkCalendarCtrl() {} + + virtual bool SetDate(const wxDateTime& date); + virtual wxDateTime GetDate() const; + + virtual bool SetDateRange(const wxDateTime& lowerdate = wxDefaultDateTime, + const wxDateTime& upperdate = wxDefaultDateTime); + virtual bool GetDateRange(wxDateTime *lowerdate, wxDateTime *upperdate) const; + + virtual bool EnableMonthChange(bool enable = true); + + virtual void Mark(size_t day, bool mark); + + // implementation + // -------------- + + void GTKGenerateEvent(wxEventType type); + +private: + bool IsInValidRange(const wxDateTime& dt) const; + + // Range of the dates that can be selected by user, either or both may be + // invalid to indicate that no corresponding restriction is set. + wxDateTime m_validStart, + m_validEnd; + + // Last known selected date, may be different from the real selection in + // the control while a handler for day-selected is running. + wxDateTime m_selectedDate; + + DECLARE_DYNAMIC_CLASS(wxGtkCalendarCtrl) + wxDECLARE_NO_COPY_CLASS(wxGtkCalendarCtrl); +}; + +#endif // GTK_CALCTRL_H__ diff --git a/wxmsw/include/wx-3.0/wx/gtk/checkbox.h b/wxmsw/include/wx-3.0/wx/gtk/checkbox.h new file mode 100644 index 00000000..69985fc4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/checkbox.h @@ -0,0 +1,67 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/checkbox.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTKCHECKBOX_H_ +#define _WX_GTKCHECKBOX_H_ + +// ---------------------------------------------------------------------------- +// wxCheckBox +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxCheckBox : public wxCheckBoxBase +{ +public: + wxCheckBox(); + ~wxCheckBox(); + wxCheckBox( wxWindow *parent, wxWindowID id, const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxCheckBoxNameStr) + { + Create(parent, id, label, pos, size, style, validator, name); + } + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxCheckBoxNameStr ); + + void SetValue( bool state ); + bool GetValue() const; + + virtual void SetLabel( const wxString& label ); + virtual bool Enable( bool enable = true ); + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // implementation + void GTKDisableEvents(); + void GTKEnableEvents(); + +protected: + virtual void DoApplyWidgetStyle(GtkRcStyle *style); + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + + void DoSet3StateValue(wxCheckBoxState state); + wxCheckBoxState DoGet3StateValue() const; + +private: + typedef wxCheckBoxBase base_type; + + GtkWidget *m_widgetCheckbox; + GtkWidget *m_widgetLabel; + + DECLARE_DYNAMIC_CLASS(wxCheckBox) +}; + +#endif // _WX_GTKCHECKBOX_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/checklst.h b/wxmsw/include/wx-3.0/wx/gtk/checklst.h new file mode 100644 index 00000000..3cfbd764 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/checklst.h @@ -0,0 +1,48 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/checklst.h +// Purpose: wxCheckListBox class +// Author: Robert Roebling +// Modified by: +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTKCHECKLIST_H_ +#define _WX_GTKCHECKLIST_H_ + +//----------------------------------------------------------------------------- +// wxCheckListBox +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxCheckListBox : public wxCheckListBoxBase +{ +public: + wxCheckListBox(); + wxCheckListBox(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int nStrings = 0, + const wxString *choices = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + wxCheckListBox(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + + virtual bool IsChecked(unsigned int index) const; + virtual void Check(unsigned int index, bool check = true); + + int GetItemHeight() const; + + void DoCreateCheckList(); + +private: + DECLARE_DYNAMIC_CLASS(wxCheckListBox) +}; + +#endif // _WX_GTKCHECKLIST_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/chkconf.h b/wxmsw/include/wx-3.0/wx/gtk/chkconf.h new file mode 100644 index 00000000..84595b25 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/chkconf.h @@ -0,0 +1,98 @@ +/* + * Name: wx/gtk/chkconf.h + * Purpose: wxGTK-specific settings consistency checks + * Author: Vadim Zeitlin + * Created: 2007-07-19 (extracted from wx/chkconf.h) + * Copyright: (c) 2000-2007 Vadim Zeitlin + * Licence: wxWindows licence + */ + +#ifndef __WXUNIVERSAL__ +# if wxUSE_MDI_ARCHITECTURE && !wxUSE_MENUS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "MDI requires wxUSE_MENUS in wxGTK" +# else +# undef wxUSE_MENUS +# define wxUSE_MENUS 1 +# endif +# endif +#endif /* !__WXUNIVERSAL__ */ + +#if wxUSE_JOYSTICK +# if !wxUSE_THREADS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxJoystick requires threads in wxGTK" +# else +# undef wxUSE_JOYSTICK +# define wxUSE_JOYSTICK 0 +# endif +# endif +#endif /* wxUSE_JOYSTICK */ + +#if wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW && !wxUSE_POSTSCRIPT +# undef wxUSE_POSTSCRIPT +# define wxUSE_POSTSCRIPT 1 +#endif + +#if wxUSE_OWNER_DRAWN +# undef wxUSE_OWNER_DRAWN +# define wxUSE_OWNER_DRAWN 0 +#endif + +#if wxUSE_METAFILE +# undef wxUSE_METAFILE +# define wxUSE_METAFILE 0 +#endif + +#if wxUSE_ENH_METAFILE +# undef wxUSE_ENH_METAFILE +# define wxUSE_ENH_METAFILE 0 +#endif + +#ifndef __UNIX__ + +# undef wxUSE_WEBVIEW +# define wxUSE_WEBVIEW 0 +# undef wxUSE_WEBVIEW_WEBKIT +# define wxUSE_WEBVIEW_WEBKIT 0 + +# undef wxUSE_MEDIACTRL +# define wxUSE_MEDIACTRL 0 + + /* + We could use GDK_WINDOWING_X11 for those but this would require + including gdk/gdk.h and we don't want to do it from here, so assume + we're not using X11 if we're not under Unix. + */ + +# undef wxUSE_UIACTIONSIMULATOR +# define wxUSE_UIACTIONSIMULATOR 0 + +# undef wxUSE_GLCANVAS +# define wxUSE_GLCANVAS 0 + +#endif /* __UNIX__ */ + +/* + We always need Cairo with wxGTK, enable it if necessary (this can only + happen under Windows). + */ +#ifdef __WINDOWS__ + +#if !wxUSE_CAIRO +# undef wxUSE_CAIRO +# define wxUSE_CAIRO 1 +#endif + +#endif /* __WINDOWS__ */ + +#ifdef __WXGTK3__ + #if !wxUSE_GRAPHICS_CONTEXT + #ifdef wxABORT_ON_CONFIG_ERROR + #error "GTK+ 3 support requires wxGraphicsContext" + #else + #undef wxUSE_GRAPHICS_CONTEXT + #define wxUSE_GRAPHICS_CONTEXT 1 + #endif + #endif +#endif diff --git a/wxmsw/include/wx-3.0/wx/gtk/choice.h b/wxmsw/include/wx-3.0/wx/gtk/choice.h new file mode 100644 index 00000000..d952a0fa --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/choice.h @@ -0,0 +1,118 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/choice.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_CHOICE_H_ +#define _WX_GTK_CHOICE_H_ + +class WXDLLIMPEXP_FWD_BASE wxSortedArrayString; +class WXDLLIMPEXP_FWD_BASE wxArrayString; + +//----------------------------------------------------------------------------- +// wxChoice +//----------------------------------------------------------------------------- + +class wxGtkCollatedArrayString; + +class WXDLLIMPEXP_CORE wxChoice : public wxChoiceBase +{ +public: + wxChoice() + { + Init(); + } + wxChoice( wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = (const wxString *) NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr ) + { + Init(); + Create(parent, id, pos, size, n, choices, style, validator, name); + } + wxChoice( wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr ) + { + Init(); + Create(parent, id, pos, size, choices, style, validator, name); + } + virtual ~wxChoice(); + bool Create( wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr ); + bool Create( wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr ); + + int GetSelection() const; + void SetSelection(int n); + + virtual unsigned int GetCount() const; + virtual int FindString(const wxString& s, bool bCase = false) const; + virtual wxString GetString(unsigned int n) const; + virtual void SetString(unsigned int n, const wxString& string); + + virtual void SetColumns(int n=1); + virtual int GetColumns() const; + + virtual void GTKDisableEvents(); + virtual void GTKEnableEvents(); + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + +protected: + // this array is only used for controls with wxCB_SORT style, so only + // allocate it if it's needed (hence using pointer) + wxGtkCollatedArrayString *m_strings; + + // contains the client data for the items + wxArrayPtrVoid m_clientData; + + // index to GtkListStore cell which displays the item text + int m_stringCellIndex; + + virtual wxSize DoGetBestSize() const; + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; + virtual int DoInsertItems(const wxArrayStringsAdapter& items, + unsigned int pos, + void **clientData, wxClientDataType type); + virtual void DoSetItemClientData(unsigned int n, void* clientData); + virtual void* DoGetItemClientData(unsigned int n) const; + virtual void DoClear(); + virtual void DoDeleteOneItem(unsigned int n); + + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + virtual void DoApplyWidgetStyle(GtkRcStyle *style); + + // in derived classes, implement this to insert list store entry + // with all items default except text + virtual void GTKInsertComboBoxTextItem( unsigned int n, const wxString& text ); + +private: + void Init(); + + DECLARE_DYNAMIC_CLASS(wxChoice) +}; + + +#endif // _WX_GTK_CHOICE_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/clipbrd.h b/wxmsw/include/wx-3.0/wx/gtk/clipbrd.h new file mode 100644 index 00000000..28d84df8 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/clipbrd.h @@ -0,0 +1,135 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/clipbrd.h +// Purpose: wxClipboard for wxGTK +// Author: Robert Roebling, Vadim Zeitlin +// Copyright: (c) 1998 Robert Roebling +// (c) 2007 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_CLIPBOARD_H_ +#define _WX_GTK_CLIPBOARD_H_ + +// ---------------------------------------------------------------------------- +// wxClipboard +// ---------------------------------------------------------------------------- + +#include "wx/weakref.h" + +class WXDLLIMPEXP_CORE wxClipboard : public wxClipboardBase +{ +public: + // there are several clipboards in X11 (and in GDK) + enum Kind + { + Primary, + Clipboard + }; + + wxClipboard(); + virtual ~wxClipboard(); + + // open the clipboard before SetData() and GetData() + virtual bool Open(); + + // close the clipboard after SetData() and GetData() + virtual void Close(); + + // query whether the clipboard is opened + virtual bool IsOpened() const; + + // set the clipboard data. all other formats will be deleted. + virtual bool SetData( wxDataObject *data ); + + // add to the clipboard data. + virtual bool AddData( wxDataObject *data ); + + // ask if data in correct format is available + virtual bool IsSupported( const wxDataFormat& format ); + + // ask if data in correct format is available + virtual bool IsSupportedAsync( wxEvtHandler *sink ); + + // fill data with data on the clipboard (if available) + virtual bool GetData( wxDataObject& data ); + + // clears wxTheClipboard and the system's clipboard if possible + virtual void Clear(); + + + + // implementation from now on + // -------------------------- + + // get our clipboard item (depending on m_usePrimary value) + GdkAtom GTKGetClipboardAtom() const; + + // get the data object currently being requested + wxDataObject *GTKGetDataObject( GdkAtom atom ); + + // clear the data for the given clipboard kind + void GTKClearData(Kind kind); + + // called when selection data is received + void GTKOnSelectionReceived(const GtkSelectionData& sel); + + // called when available target information is received + bool GTKOnTargetReceived(const wxDataFormat& format); + +private: + // the data object for the specific selection + wxDataObject *& Data(Kind kind) + { + return kind == Primary ? m_dataPrimary : m_dataClipboard; + } + + // the data object we're currently using + wxDataObject *& Data() + { + return Data(m_usePrimary ? Primary : Clipboard); + } + + + // set or unset selection ownership + bool SetSelectionOwner(bool set = true); + + // add atom to the list of supported targets + void AddSupportedTarget(GdkAtom atom); + + // check if the given format is supported + bool DoIsSupported(const wxDataFormat& format); + + + // both of these pointers can be non-NULL simultaneously but we only use + // one of them at any moment depending on m_usePrimary value, use Data() + // (from inside) or GTKGetDataObject() (from outside) accessors + wxDataObject *m_dataPrimary, + *m_dataClipboard; + + // this is used to temporarily hold the object passed to our GetData() so + // that GTK callbacks could access it + wxDataObject *m_receivedData; + + // used to pass information about the format we need from DoIsSupported() + // to GTKOnTargetReceived() + GdkAtom m_targetRequested; + + GtkWidget *m_clipboardWidget; // for getting and offering data + GtkWidget *m_targetsWidget; // for getting list of supported formats + + // ID of the connection to "selection_get" signal, initially 0. + unsigned long m_idSelectionGetHandler; + + bool m_open; + bool m_formatSupported; + +public: + // async stuff + wxEvtHandlerRef m_sink; +private: + GtkWidget *m_targetsWidgetAsync; // for getting list of supported formats + + DECLARE_DYNAMIC_CLASS(wxClipboard) +}; + +#endif // _WX_GTK_CLIPBOARD_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/clrpicker.h b/wxmsw/include/wx-3.0/wx/gtk/clrpicker.h new file mode 100644 index 00000000..4a375fb8 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/clrpicker.h @@ -0,0 +1,64 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/clrpicker.h +// Purpose: wxColourButton header +// Author: Francesco Montorsi +// Modified by: +// Created: 14/4/2006 +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_CLRPICKER_H_ +#define _WX_GTK_CLRPICKER_H_ + +#include "wx/button.h" + +//----------------------------------------------------------------------------- +// wxColourButton +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxColourButton : public wxButton, + public wxColourPickerWidgetBase +{ +public: + wxColourButton() : m_topParent(NULL) {} + wxColourButton(wxWindow *parent, + wxWindowID id, + const wxColour& initial = *wxBLACK, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCLRBTN_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxColourPickerWidgetNameStr) + : m_topParent(NULL) + { + Create(parent, id, initial, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxColour& initial = *wxBLACK, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCLRBTN_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxColourPickerWidgetNameStr); + + virtual ~wxColourButton(); + +protected: + void UpdateColour(); + +public: // used by the GTK callback only + + void GTKSetColour(const wxColour& colour) + { m_colour = colour; } + + wxWindow *m_topParent; + +private: + DECLARE_DYNAMIC_CLASS(wxColourButton) +}; + +#endif // _WX_GTK_CLRPICKER_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/collpane.h b/wxmsw/include/wx-3.0/wx/gtk/collpane.h new file mode 100644 index 00000000..7503b8e1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/collpane.h @@ -0,0 +1,79 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/collpane.h +// Purpose: wxCollapsiblePane +// Author: Francesco Montorsi +// Modified by: +// Created: 8/10/2006 +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COLLAPSABLE_PANEL_H_GTK_ +#define _WX_COLLAPSABLE_PANEL_H_GTK_ + +// ---------------------------------------------------------------------------- +// wxCollapsiblePane +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxCollapsiblePane : public wxCollapsiblePaneBase +{ +public: + wxCollapsiblePane() { Init(); } + + wxCollapsiblePane(wxWindow *parent, + wxWindowID winid, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCP_DEFAULT_STYLE, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxCollapsiblePaneNameStr) + { + Init(); + + Create(parent, winid, label, pos, size, style, val, name); + } + + bool Create(wxWindow *parent, + wxWindowID winid, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCP_DEFAULT_STYLE, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxCollapsiblePaneNameStr); + + virtual void Collapse(bool collapse = true); + virtual bool IsCollapsed() const; + virtual void SetLabel(const wxString& str); + + virtual wxWindow *GetPane() const { return m_pPane; } + virtual wxString GetLabel() const { return m_strLabel; } + +protected: + virtual wxSize DoGetBestSize() const; + +public: // used by GTK callbacks + bool m_bIgnoreNextChange; + wxSize m_szCollapsed; + + wxWindow *m_pPane; + + // the button label without ">>" or "<<" + wxString m_strLabel; + +private: + void Init() + { + m_bIgnoreNextChange = false; + } + + void OnSize(wxSizeEvent&); + virtual void AddChildGTK(wxWindowGTK* child); + GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + + DECLARE_DYNAMIC_CLASS(wxCollapsiblePane) + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_COLLAPSABLE_PANEL_H_GTK_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/colordlg.h b/wxmsw/include/wx-3.0/wx/gtk/colordlg.h new file mode 100644 index 00000000..a1fdbb75 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/colordlg.h @@ -0,0 +1,48 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/colordlg.h +// Purpose: wxColourDialog +// Author: Vaclav Slavik +// Modified by: +// Created: 2004/06/04 +// Copyright: (c) Vaclav Slavik, 2004 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_COLORDLG_H_ +#define _WX_GTK_COLORDLG_H_ + +#include "wx/dialog.h" + +class WXDLLIMPEXP_CORE wxColourDialog : public wxDialog +{ +public: + wxColourDialog() {} + wxColourDialog(wxWindow *parent, + wxColourData *data = NULL); + virtual ~wxColourDialog() {} + + bool Create(wxWindow *parent, wxColourData *data = NULL); + + wxColourData &GetColourData() { return m_data; } + + virtual int ShowModal(); + +protected: + // implement some base class methods to do nothing to avoid asserts and + // GTK warnings, since this is not a real wxDialog. + virtual void DoSetSize(int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(width), int WXUNUSED(height), + int WXUNUSED(sizeFlags) = wxSIZE_AUTO) {} + virtual void DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(width), int WXUNUSED(height)) {} + + // copy data between the dialog and m_colourData: + void ColourDataToDialog(); + void DialogToColourData(); + + wxColourData m_data; + + DECLARE_DYNAMIC_CLASS(wxColourDialog) +}; + +#endif diff --git a/wxmsw/include/wx-3.0/wx/gtk/colour.h b/wxmsw/include/wx-3.0/wx/gtk/colour.h new file mode 100644 index 00000000..d48d707c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/colour.h @@ -0,0 +1,59 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/colour.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_COLOUR_H_ +#define _WX_GTK_COLOUR_H_ + +#ifdef __WXGTK3__ +typedef struct _GdkRGBA GdkRGBA; +#endif + +//----------------------------------------------------------------------------- +// wxColour +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxColour : public wxColourBase +{ +public: + // constructors + // ------------ + DEFINE_STD_WXCOLOUR_CONSTRUCTORS + wxColour(const GdkColor& gdkColor); +#ifdef __WXGTK3__ + wxColour(const GdkRGBA& gdkRGBA); +#endif + + virtual ~wxColour(); + + bool operator==(const wxColour& col) const; + bool operator!=(const wxColour& col) const { return !(*this == col); } + + unsigned char Red() const; + unsigned char Green() const; + unsigned char Blue() const; + unsigned char Alpha() const; + + // Implementation part +#ifdef __WXGTK3__ + operator const GdkRGBA*() const; +#else + void CalcPixel( GdkColormap *cmap ); + int GetPixel() const; +#endif + const GdkColor *GetColor() const; + +protected: + virtual void + InitRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a); + + virtual bool FromString(const wxString& str); + + DECLARE_DYNAMIC_CLASS(wxColour) +}; + +#endif // _WX_GTK_COLOUR_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/combobox.h b/wxmsw/include/wx-3.0/wx/gtk/combobox.h new file mode 100644 index 00000000..c655991e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/combobox.h @@ -0,0 +1,166 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/combobox.h +// Purpose: +// Author: Robert Roebling +// Created: 01/02/97 +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_COMBOBOX_H_ +#define _WX_GTK_COMBOBOX_H_ + +#include "wx/choice.h" + +typedef struct _GtkEntry GtkEntry; + +//----------------------------------------------------------------------------- +// wxComboBox +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxComboBox : public wxChoice, + public wxTextEntry +{ +public: + wxComboBox() + : wxChoice(), wxTextEntry() + { + Init(); + } + wxComboBox(wxWindow *parent, + wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr) + : wxChoice(), wxTextEntry() + { + Init(); + Create(parent, id, value, pos, size, n, choices, style, validator, name); + } + + wxComboBox(wxWindow *parent, wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr) + : wxChoice(), wxTextEntry() + { + Init(); + Create(parent, id, value, pos, size, choices, style, validator, name); + } + ~wxComboBox(); + + bool Create(wxWindow *parent, wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = (const wxString *) NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + bool Create(wxWindow *parent, wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + // Set/GetSelection() from wxTextEntry and wxChoice + + virtual void SetSelection(int n) { wxChoice::SetSelection(n); } + virtual void SetSelection(long from, long to) + { wxTextEntry::SetSelection(from, to); } + + virtual int GetSelection() const { return wxChoice::GetSelection(); } + virtual void GetSelection(long *from, long *to) const + { return wxTextEntry::GetSelection(from, to); } + + virtual wxString GetStringSelection() const + { + return wxItemContainer::GetStringSelection(); + } + + virtual void SetString(unsigned int n, const wxString& string); + + virtual void Popup(); + virtual void Dismiss(); + + virtual void Clear() + { + wxTextEntry::Clear(); + wxItemContainer::Clear(); + } + + // See wxComboBoxBase discussion of IsEmpty(). + bool IsListEmpty() const { return wxItemContainer::IsEmpty(); } + bool IsTextEmpty() const { return wxTextEntry::IsEmpty(); } + + void OnChar( wxKeyEvent &event ); + + virtual void SetValue(const wxString& value); + + // Standard event handling + void OnCut(wxCommandEvent& event); + void OnCopy(wxCommandEvent& event); + void OnPaste(wxCommandEvent& event); + void OnUndo(wxCommandEvent& event); + void OnRedo(wxCommandEvent& event); + void OnDelete(wxCommandEvent& event); + void OnSelectAll(wxCommandEvent& event); + + void OnUpdateCut(wxUpdateUIEvent& event); + void OnUpdateCopy(wxUpdateUIEvent& event); + void OnUpdatePaste(wxUpdateUIEvent& event); + void OnUpdateUndo(wxUpdateUIEvent& event); + void OnUpdateRedo(wxUpdateUIEvent& event); + void OnUpdateDelete(wxUpdateUIEvent& event); + void OnUpdateSelectAll(wxUpdateUIEvent& event); + + virtual void GTKDisableEvents(); + virtual void GTKEnableEvents(); + GtkWidget* GetConnectWidget(); + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + +protected: + // From wxWindowGTK: + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + + // Widgets that use the style->base colour for the BG colour should + // override this and return true. + virtual bool UseGTKStyleBase() const { return true; } + + // Override in derived classes to create combo box widgets with + // custom list stores. + virtual void GTKCreateComboBoxWidget(); + + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; + + virtual GtkEntry *GetEntry() const + { return m_entry; } + + GtkEntry* m_entry; + +private: + // From wxTextEntry: + virtual wxWindow *GetEditableWindow() { return this; } + virtual GtkEditable *GetEditable() const; + virtual void EnableTextChangedEvents(bool enable); + + void Init(); + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxComboBox) + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_GTK_COMBOBOX_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/control.h b/wxmsw/include/wx-3.0/wx/gtk/control.h new file mode 100644 index 00000000..454d1fc9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/control.h @@ -0,0 +1,93 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/control.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling, Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_CONTROL_H_ +#define _WX_GTK_CONTROL_H_ + +typedef struct _GtkLabel GtkLabel; +typedef struct _GtkFrame GtkFrame; +typedef struct _GtkEntry GtkEntry; + +//----------------------------------------------------------------------------- +// wxControl +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxControl : public wxControlBase +{ + typedef wxControlBase base_type; +public: + wxControl(); + wxControl(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxControlNameStr) + { + Create(parent, id, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxControlNameStr); + + virtual wxVisualAttributes GetDefaultAttributes() const; +#ifdef __WXGTK3__ + virtual bool SetFont(const wxFont& font); +#endif + +protected: + virtual wxSize DoGetBestSize() const; + void PostCreation(const wxSize& size); + + // sets the label to the given string and also sets it for the given widget + void GTKSetLabelForLabel(GtkLabel *w, const wxString& label); +#if wxUSE_MARKUP + void GTKSetLabelWithMarkupForLabel(GtkLabel *w, const wxString& label); +#endif // wxUSE_MARKUP + + // GtkFrame helpers + GtkWidget* GTKCreateFrame(const wxString& label); + void GTKSetLabelForFrame(GtkFrame *w, const wxString& label); + void GTKFrameApplyWidgetStyle(GtkFrame* w, GtkRcStyle* rc); + void GTKFrameSetMnemonicWidget(GtkFrame* w, GtkWidget* widget); + + // remove mnemonics ("&"s) from the label + static wxString GTKRemoveMnemonics(const wxString& label); + + // converts wx label to GTK+ label, i.e. basically replace "&"s with "_"s + static wxString GTKConvertMnemonics(const wxString &label); + + // converts wx label to GTK+ labels preserving Pango markup + static wxString GTKConvertMnemonicsWithMarkup(const wxString& label); + + // These are used by GetDefaultAttributes + static wxVisualAttributes + GetDefaultAttributesFromGTKWidget(GtkWidget* widget, + bool useBase = false, + int state = 0); + + // Widgets that use the style->base colour for the BG colour should + // override this and return true. + virtual bool UseGTKStyleBase() const { return false; } + + // Fix sensitivity due to bug in GTK+ < 2.14 + void GTKFixSensitivity(bool onlyIfUnderMouse = true); + + // Ask GTK+ for preferred size. Use it after setting the font. + wxSize GTKGetPreferredSize(GtkWidget* widget) const; + + // Inner margins in a GtkEntry + wxPoint GTKGetEntryMargins(GtkEntry* entry) const; + +private: + DECLARE_DYNAMIC_CLASS(wxControl) +}; + +#endif // _WX_GTK_CONTROL_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/cursor.h b/wxmsw/include/wx-3.0/wx/gtk/cursor.h new file mode 100644 index 00000000..e1915efc --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/cursor.h @@ -0,0 +1,59 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/cursor.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_CURSOR_H_ +#define _WX_GTK_CURSOR_H_ + +#include "wx/gdiobj.h" +#include "wx/gdicmn.h" + +class WXDLLIMPEXP_FWD_CORE wxColour; +class WXDLLIMPEXP_FWD_CORE wxImage; + +//----------------------------------------------------------------------------- +// wxCursor +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxCursor : public wxGDIObject +{ +public: + wxCursor(); + wxCursor(wxStockCursor id) { InitFromStock(id); } +#if WXWIN_COMPATIBILITY_2_8 + wxCursor(int id) { InitFromStock((wxStockCursor)id); } +#endif +#if wxUSE_IMAGE + wxCursor( const wxImage & image ); + wxCursor(const wxString& name, + wxBitmapType type = wxCURSOR_DEFAULT_TYPE, + int hotSpotX = 0, int hotSpotY = 0); +#endif + wxCursor( const char bits[], int width, int height, + int hotSpotX = -1, int hotSpotY = -1, + const char maskBits[] = NULL, + const wxColour* fg = NULL, const wxColour* bg = NULL); + virtual ~wxCursor(); + + // implementation + + GdkCursor *GetCursor() const; + +protected: + void InitFromStock(wxStockCursor); +#if wxUSE_IMAGE + void InitFromImage(const wxImage& image); +#endif + + virtual wxGDIRefData *CreateGDIRefData() const; + virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const; + +private: + DECLARE_DYNAMIC_CLASS(wxCursor) +}; + +#endif // _WX_GTK_CURSOR_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/dataform.h b/wxmsw/include/wx-3.0/wx/gtk/dataform.h new file mode 100644 index 00000000..b7c3be71 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/dataform.h @@ -0,0 +1,80 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/dataform.h +// Purpose: declaration of the wxDataFormat class +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.10.99 (extracted from gtk/dataobj.h) +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_DATAFORM_H +#define _WX_GTK_DATAFORM_H + +class WXDLLIMPEXP_CORE wxDataFormat +{ +public: + // the clipboard formats under GDK are GdkAtoms + typedef GdkAtom NativeFormat; + + wxDataFormat(); + wxDataFormat( wxDataFormatId type ); + wxDataFormat( NativeFormat format ); + + // we have to provide all the overloads to allow using strings instead of + // data formats (as a lot of existing code does) + wxDataFormat( const wxString& id ) { InitFromString(id); } + wxDataFormat( const char *id ) { InitFromString(id); } + wxDataFormat( const wchar_t *id ) { InitFromString(id); } + wxDataFormat( const wxCStrData& id ) { InitFromString(id); } + + wxDataFormat& operator=(const wxDataFormat& format) + { + if (&format != this) + { + m_type = format.m_type; + m_format = format.m_format; + } + return *this; + } + wxDataFormat& operator=(NativeFormat format) + { SetId(format); return *this; } + + // comparison (must have both versions) + bool operator==(NativeFormat format) const + { return m_format == (NativeFormat)format; } + bool operator!=(NativeFormat format) const + { return m_format != (NativeFormat)format; } + bool operator==(wxDataFormatId format) const + { return m_type == (wxDataFormatId)format; } + bool operator!=(wxDataFormatId format) const + { return m_type != (wxDataFormatId)format; } + + // explicit and implicit conversions to NativeFormat which is one of + // standard data types (implicit conversion is useful for preserving the + // compatibility with old code) + NativeFormat GetFormatId() const { return m_format; } + operator NativeFormat() const { return m_format; } + + void SetId( NativeFormat format ); + + // string ids are used for custom types - this SetId() must be used for + // application-specific formats + wxString GetId() const; + void SetId( const wxString& id ); + + // implementation + wxDataFormatId GetType() const; + void SetType( wxDataFormatId type ); + +private: + // common part of ctors from format name + void InitFromString(const wxString& id); + + wxDataFormatId m_type; + NativeFormat m_format; + + void PrepareFormats(); +}; + +#endif // _WX_GTK_DATAFORM_H diff --git a/wxmsw/include/wx-3.0/wx/gtk/dataobj.h b/wxmsw/include/wx-3.0/wx/gtk/dataobj.h new file mode 100644 index 00000000..859093fc --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/dataobj.h @@ -0,0 +1,26 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/dataobj.h +// Purpose: declaration of the wxDataObject +// Author: Robert Roebling +// Copyright: (c) 1998, 1999 Vadim Zeitlin, Robert Roebling +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_DATAOBJ_H_ +#define _WX_GTK_DATAOBJ_H_ + +// ---------------------------------------------------------------------------- +// wxDataObject is the same as wxDataObjectBase under wxGTK +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDataObject : public wxDataObjectBase +{ +public: + wxDataObject(); + virtual ~wxDataObject(); + + virtual bool IsSupportedFormat( const wxDataFormat& format, Direction dir = Get ) const; +}; + +#endif // _WX_GTK_DATAOBJ_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/dataobj2.h b/wxmsw/include/wx-3.0/wx/gtk/dataobj2.h new file mode 100644 index 00000000..62f380a4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/dataobj2.h @@ -0,0 +1,114 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/dataobj2.h +// Purpose: declaration of standard wxDataObjectSimple-derived classes +// Author: Robert Roebling +// Created: 19.10.99 (extracted from gtk/dataobj.h) +// Copyright: (c) 1998, 1999 Vadim Zeitlin, Robert Roebling +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_DATAOBJ2_H_ +#define _WX_GTK_DATAOBJ2_H_ + +// ---------------------------------------------------------------------------- +// wxBitmapDataObject is a specialization of wxDataObject for bitmaps +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxBitmapDataObject : public wxBitmapDataObjectBase +{ +public: + // ctors + wxBitmapDataObject(); + wxBitmapDataObject(const wxBitmap& bitmap); + + // destr + virtual ~wxBitmapDataObject(); + + // override base class virtual to update PNG data too + virtual void SetBitmap(const wxBitmap& bitmap); + + // implement base class pure virtuals + // ---------------------------------- + + virtual size_t GetDataSize() const { return m_pngSize; } + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t len, const void *buf); + // Must provide overloads to avoid hiding them (and warnings about it) + virtual size_t GetDataSize(const wxDataFormat&) const + { + return GetDataSize(); + } + virtual bool GetDataHere(const wxDataFormat&, void *buf) const + { + return GetDataHere(buf); + } + virtual bool SetData(const wxDataFormat&, size_t len, const void *buf) + { + return SetData(len, buf); + } + +protected: + void Clear() { free(m_pngData); } + void ClearAll() { Clear(); Init(); } + + size_t m_pngSize; + void *m_pngData; + + void DoConvertToPng(); + +private: + void Init() { m_pngData = NULL; m_pngSize = 0; } +}; + +// ---------------------------------------------------------------------------- +// wxFileDataObject is a specialization of wxDataObject for file names +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFileDataObject : public wxFileDataObjectBase +{ +public: + // implement base class pure virtuals + // ---------------------------------- + + void AddFile( const wxString &filename ); + + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t len, const void *buf); + // Must provide overloads to avoid hiding them (and warnings about it) + virtual size_t GetDataSize(const wxDataFormat&) const + { + return GetDataSize(); + } + virtual bool GetDataHere(const wxDataFormat&, void *buf) const + { + return GetDataHere(buf); + } + virtual bool SetData(const wxDataFormat&, size_t len, const void *buf) + { + return SetData(len, buf); + } +}; + +// ---------------------------------------------------------------------------- +// wxURLDataObject is a specialization of wxDataObject for URLs +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxURLDataObject : public wxDataObjectComposite +{ +public: + wxURLDataObject(const wxString& url = wxEmptyString); + + wxString GetURL() const; + void SetURL(const wxString& url); + +private: + class wxTextURIListDataObject* const m_dobjURIList; + wxTextDataObject* const m_dobjText; + + wxDECLARE_NO_COPY_CLASS(wxURLDataObject); +}; + + +#endif // _WX_GTK_DATAOBJ2_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/dataview.h b/wxmsw/include/wx-3.0/wx/gtk/dataview.h new file mode 100644 index 00000000..44d2af93 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/dataview.h @@ -0,0 +1,230 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/dataview.h +// Purpose: wxDataViewCtrl GTK+2 implementation header +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTKDATAVIEWCTRL_H_ +#define _WX_GTKDATAVIEWCTRL_H_ + +#include "wx/list.h" + +class WXDLLIMPEXP_FWD_ADV wxDataViewCtrlInternal; + +struct _GtkTreePath; + +// --------------------------------------------------------- +// wxDataViewColumn +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewColumn: public wxDataViewColumnBase +{ +public: + wxDataViewColumn( const wxString &title, wxDataViewRenderer *renderer, + unsigned int model_column, int width = wxDVC_DEFAULT_WIDTH, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn( const wxBitmap &bitmap, wxDataViewRenderer *renderer, + unsigned int model_column, int width = wxDVC_DEFAULT_WIDTH, + wxAlignment align = wxALIGN_CENTER, + int flags = wxDATAVIEW_COL_RESIZABLE ); + + + // setters: + + virtual void SetTitle( const wxString &title ); + virtual void SetBitmap( const wxBitmap &bitmap ); + + virtual void SetOwner( wxDataViewCtrl *owner ); + + virtual void SetAlignment( wxAlignment align ); + + virtual void SetSortable( bool sortable ); + virtual void SetSortOrder( bool ascending ); + + virtual void SetResizeable( bool resizable ); + virtual void SetHidden( bool hidden ); + + virtual void SetMinWidth( int minWidth ); + virtual void SetWidth( int width ); + + virtual void SetReorderable( bool reorderable ); + + virtual void SetFlags(int flags) { SetIndividualFlags(flags); } + + // getters: + + virtual wxString GetTitle() const; + virtual wxAlignment GetAlignment() const; + + virtual bool IsSortable() const; + virtual bool IsSortOrderAscending() const; + virtual bool IsSortKey() const; + + virtual bool IsResizeable() const; + virtual bool IsHidden() const; + + virtual int GetWidth() const; + virtual int GetMinWidth() const; + + virtual bool IsReorderable() const; + + virtual int GetFlags() const { return GetFromIndividualFlags(); } + + // implementation + GtkWidget* GetGtkHandle() const { return m_column; } + +private: + // holds the GTK handle + GtkWidget *m_column; + + // holds GTK handles for title/bitmap in the header + GtkWidget *m_image; + GtkWidget *m_label; + + // delayed connection to mouse events + friend class wxDataViewCtrl; + void OnInternalIdle(); + bool m_isConnected; + + void Init(wxAlignment align, int flags, int width); +}; + +WX_DECLARE_LIST_WITH_DECL(wxDataViewColumn, wxDataViewColumnList, + class WXDLLIMPEXP_ADV); + +// --------------------------------------------------------- +// wxDataViewCtrl +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewCtrl: public wxDataViewCtrlBase +{ +public: + wxDataViewCtrl() + { + Init(); + } + + wxDataViewCtrl( wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDataViewCtrlNameStr ) + { + Init(); + + Create(parent, id, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDataViewCtrlNameStr); + + virtual ~wxDataViewCtrl(); + + virtual bool AssociateModel( wxDataViewModel *model ); + + virtual bool PrependColumn( wxDataViewColumn *col ); + virtual bool AppendColumn( wxDataViewColumn *col ); + virtual bool InsertColumn( unsigned int pos, wxDataViewColumn *col ); + + virtual unsigned int GetColumnCount() const; + virtual wxDataViewColumn* GetColumn( unsigned int pos ) const; + virtual bool DeleteColumn( wxDataViewColumn *column ); + virtual bool ClearColumns(); + virtual int GetColumnPosition( const wxDataViewColumn *column ) const; + + virtual wxDataViewColumn *GetSortingColumn() const; + + virtual int GetSelectedItemsCount() const; + virtual int GetSelections( wxDataViewItemArray & sel ) const; + virtual void SetSelections( const wxDataViewItemArray & sel ); + virtual void Select( const wxDataViewItem & item ); + virtual void Unselect( const wxDataViewItem & item ); + virtual bool IsSelected( const wxDataViewItem & item ) const; + virtual void SelectAll(); + virtual void UnselectAll(); + + virtual void EnsureVisible( const wxDataViewItem& item, + const wxDataViewColumn *column = NULL ); + virtual void HitTest( const wxPoint &point, + wxDataViewItem &item, + wxDataViewColumn *&column ) const; + virtual wxRect GetItemRect( const wxDataViewItem &item, + const wxDataViewColumn *column = NULL ) const; + + virtual bool SetRowHeight( int rowHeight ); + + virtual void EditItem(const wxDataViewItem& item, const wxDataViewColumn *column); + + virtual void Expand( const wxDataViewItem & item ); + virtual void Collapse( const wxDataViewItem & item ); + virtual bool IsExpanded( const wxDataViewItem & item ) const; + + virtual bool EnableDragSource( const wxDataFormat &format ); + virtual bool EnableDropTarget( const wxDataFormat &format ); + + virtual wxDataViewColumn *GetCurrentColumn() const; + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + wxWindow *GetMainWindow() { return (wxWindow*) this; } + + GtkWidget *GtkGetTreeView() { return m_treeview; } + wxDataViewCtrlInternal* GtkGetInternal() { return m_internal; } + + // Convert GTK path to our item. Returned item may be invalid if get_iter() + // failed. + wxDataViewItem GTKPathToItem(struct _GtkTreePath *path) const; + + virtual void OnInternalIdle(); + + int GTKGetUniformRowHeight() const { return m_uniformRowHeight; } + +protected: + virtual void DoSetExpanderColumn(); + virtual void DoSetIndent(); + + virtual void DoApplyWidgetStyle(GtkRcStyle *style); + +private: + void Init(); + + virtual wxDataViewItem DoGetCurrentItem() const; + virtual void DoSetCurrentItem(const wxDataViewItem& item); + + // Return wxDataViewColumn matching the given GtkTreeViewColumn. + // + // If the input argument is NULL, return NULL too. Otherwise we must find + // the matching column and assert if we didn't. + wxDataViewColumn* FromGTKColumn(GtkTreeViewColumn *gtk_col) const; + + friend class wxDataViewCtrlDCImpl; + friend class wxDataViewColumn; + friend class wxDataViewCtrlInternal; + + GtkWidget *m_treeview; + wxDataViewCtrlInternal *m_internal; + wxDataViewColumnList m_cols; + wxDataViewItem m_ensureVisibleDefered; + + // By default this is set to -1 and the height of the rows is determined by + // GetRect() methods of the renderers but this can be set to a positive + // value to force the height of all rows to the given value. + int m_uniformRowHeight; + + virtual void AddChildGTK(wxWindowGTK* child); + void GtkEnableSelectionEvents(); + void GtkDisableSelectionEvents(); + + DECLARE_DYNAMIC_CLASS(wxDataViewCtrl) + wxDECLARE_NO_COPY_CLASS(wxDataViewCtrl); +}; + + +#endif // _WX_GTKDATAVIEWCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/dialog.h b/wxmsw/include/wx-3.0/wx/gtk/dialog.h new file mode 100644 index 00000000..fcd7cd3d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/dialog.h @@ -0,0 +1,52 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/dialog.h +// Purpose: +// Author: Robert Roebling +// Created: +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTKDIALOG_H_ +#define _WX_GTKDIALOG_H_ + +class WXDLLIMPEXP_FWD_CORE wxGUIEventLoop; + +//----------------------------------------------------------------------------- +// wxDialog +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDialog: public wxDialogBase +{ +public: + wxDialog() { Init(); } + wxDialog( wxWindow *parent, wxWindowID id, + const wxString &title, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE, + const wxString &name = wxDialogNameStr ); + bool Create( wxWindow *parent, wxWindowID id, + const wxString &title, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE, + const wxString &name = wxDialogNameStr ); + virtual ~wxDialog(); + + virtual bool Show( bool show = true ); + virtual int ShowModal(); + virtual void EndModal( int retCode ); + virtual bool IsModal() const; + +private: + // common part of all ctors + void Init(); + + bool m_modalShowing; + wxGUIEventLoop *m_modalLoop; + + DECLARE_DYNAMIC_CLASS(wxDialog) +}; + +#endif // _WX_GTKDIALOG_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/dirdlg.h b/wxmsw/include/wx-3.0/wx/gtk/dirdlg.h new file mode 100644 index 00000000..8a05d557 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/dirdlg.h @@ -0,0 +1,63 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/dirdlg.h +// Purpose: wxDirDialog +// Author: Francesco Montorsi +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __GTKDIRDLGH__ +#define __GTKDIRDLGH__ + +//------------------------------------------------------------------------- +// wxDirDialog +//------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDirDialog : public wxDirDialogBase +{ +public: + wxDirDialog() { } + + wxDirDialog(wxWindow *parent, + const wxString& message = wxDirSelectorPromptStr, + const wxString& defaultPath = wxEmptyString, + long style = wxDD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxString& name = wxDirDialogNameStr); + bool Create(wxWindow *parent, + const wxString& message = wxDirSelectorPromptStr, + const wxString& defaultPath = wxEmptyString, + long style = wxDD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxString& name = wxDirDialogNameStr); + virtual ~wxDirDialog() { } + + +public: // overrides from wxGenericDirDialog + + wxString GetPath() const; + void SetPath(const wxString& path); + + + // Implementation only. + + void GTKOnAccept(); + void GTKOnCancel(); + +protected: + // override this from wxTLW since the native + // form doesn't have any m_wxwindow + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + + +private: + wxString m_selectedDirectory; + + DECLARE_DYNAMIC_CLASS(wxDirDialog) +}; + +#endif // __GTKDIRDLGH__ diff --git a/wxmsw/include/wx-3.0/wx/gtk/dnd.h b/wxmsw/include/wx-3.0/wx/gtk/dnd.h new file mode 100644 index 00000000..0aea7b41 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/dnd.h @@ -0,0 +1,124 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/dnd.h +// Purpose: declaration of the wxDropTarget class +// Author: Robert Roebling +// Copyright: (c) 1998 Vadim Zeitlin, Robert Roebling +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_DND_H_ +#define _WX_GTK_DND_H_ + +#include "wx/icon.h" + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// this macro may be used instead for wxDropSource ctor arguments: it will use +// the icon 'name' from an XPM file under GTK, but will expand to something +// else under MSW. If you don't use it, you will have to use #ifdef in the +// application code. +#define wxDROP_ICON(name) wxICON(name) + +//------------------------------------------------------------------------- +// wxDropTarget +//------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDropTarget: public wxDropTargetBase +{ +public: + wxDropTarget(wxDataObject *dataObject = NULL ); + + virtual wxDragResult OnDragOver(wxCoord x, wxCoord y, wxDragResult def); + virtual bool OnDrop(wxCoord x, wxCoord y); + virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def); + virtual bool GetData(); + + // Can only be called during OnXXX methods. + wxDataFormat GetMatchingPair(); + + // implementation + + GdkAtom GTKGetMatchingPair(bool quiet = false); + wxDragResult GTKFigureOutSuggestedAction(); + + void GtkRegisterWidget( GtkWidget *widget ); + void GtkUnregisterWidget( GtkWidget *widget ); + + GdkDragContext *m_dragContext; + GtkWidget *m_dragWidget; + GtkSelectionData *m_dragData; + unsigned m_dragTime; + bool m_firstMotion; // gdk has no "gdk_drag_enter" event + + void GTKSetDragContext( GdkDragContext *dc ) { m_dragContext = dc; } + void GTKSetDragWidget( GtkWidget *w ) { m_dragWidget = w; } + void GTKSetDragData( GtkSelectionData *sd ) { m_dragData = sd; } + void GTKSetDragTime(unsigned time) { m_dragTime = time; } +}; + +//------------------------------------------------------------------------- +// wxDropSource +//------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDropSource: public wxDropSourceBase +{ +public: + // constructor. set data later with SetData() + wxDropSource( wxWindow *win = NULL, + const wxIcon © = wxNullIcon, + const wxIcon &move = wxNullIcon, + const wxIcon &none = wxNullIcon); + + // constructor for setting one data object + wxDropSource( wxDataObject& data, + wxWindow *win, + const wxIcon © = wxNullIcon, + const wxIcon &move = wxNullIcon, + const wxIcon &none = wxNullIcon); + + virtual ~wxDropSource(); + + // set the icon corresponding to given drag result + void SetIcon(wxDragResult res, const wxIcon& icon) + { + if ( res == wxDragCopy ) + m_iconCopy = icon; + else if ( res == wxDragMove ) + m_iconMove = icon; + else + m_iconNone = icon; + } + + // start drag action + virtual wxDragResult DoDragDrop(int flags = wxDrag_CopyOnly); + + void PrepareIcon( int action, GdkDragContext *context ); + + GtkWidget *m_widget; + GtkWidget *m_iconWindow; + GdkDragContext *m_dragContext; + wxWindow *m_window; + + wxDragResult m_retValue; + wxIcon m_iconCopy, + m_iconMove, + m_iconNone; + + bool m_waiting; + +private: + // common part of both ctors + void SetIcons(const wxIcon& copy, + const wxIcon& move, + const wxIcon& none); + + // GTK implementation + void GTKConnectDragSignals(); + void GTKDisconnectDragSignals(); + +}; + +#endif // _WX_GTK_DND_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/dvrenderer.h b/wxmsw/include/wx-3.0/wx/gtk/dvrenderer.h new file mode 100644 index 00000000..dfaba560 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/dvrenderer.h @@ -0,0 +1,104 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/dvrenderer.h +// Purpose: wxDataViewRenderer for GTK wxDataViewCtrl implementation +// Author: Robert Roebling, Vadim Zeitlin +// Created: 2009-11-07 (extracted from wx/gtk/dataview.h) +// Copyright: (c) 2006 Robert Roebling +// (c) 2009 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_DVRENDERER_H_ +#define _WX_GTK_DVRENDERER_H_ + +typedef struct _GtkCellRendererText GtkCellRendererText; +typedef struct _GtkTreeViewColumn GtkTreeViewColumn; + +// ---------------------------------------------------------------------------- +// wxDataViewRenderer +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewRenderer: public wxDataViewRendererBase +{ +public: + wxDataViewRenderer( const wxString &varianttype, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int align = wxDVR_DEFAULT_ALIGNMENT ); + + virtual void SetMode( wxDataViewCellMode mode ); + virtual wxDataViewCellMode GetMode() const; + + virtual void SetAlignment( int align ); + virtual int GetAlignment() const; + + virtual void EnableEllipsize(wxEllipsizeMode mode = wxELLIPSIZE_MIDDLE); + virtual wxEllipsizeMode GetEllipsizeMode() const; + + // GTK-specific implementation + // --------------------------- + + // pack the GTK cell renderers used by this renderer to the given column + // + // by default only a single m_renderer is used but some renderers use more + // than one GTK cell renderer + virtual void GtkPackIntoColumn(GtkTreeViewColumn *column); + + // called when the cell value was edited by user with the new value + // + // it validates the new value and notifies the model about the change by + // calling GtkOnCellChanged() if it was accepted + virtual void GtkOnTextEdited(const char *itempath, const wxString& value); + + GtkCellRenderer* GetGtkHandle() { return m_renderer; } + void GtkInitHandlers(); + void GtkUpdateAlignment() { GtkApplyAlignment(m_renderer); } + + // should be overridden to return true if the renderer supports properties + // corresponding to wxDataViewItemAttr field, see wxGtkTreeCellDataFunc() + // for details + virtual bool GtkSupportsAttrs() const { return false; } + + // if GtkSupportsAttrs() returns true, this function will be called to + // effectively set the attribute to use for rendering the next item + // + // it should return true if the attribute had any non-default properties + virtual bool GtkSetAttr(const wxDataViewItemAttr& WXUNUSED(attr)) + { return false; } + + + // these functions are only called if GtkSupportsAttrs() returns true and + // are used to remember whether the renderer currently uses the default + // attributes or if we changed (and not reset them) + bool GtkIsUsingDefaultAttrs() const { return m_usingDefaultAttrs; } + void GtkSetUsingDefaultAttrs(bool def) { m_usingDefaultAttrs = def; } + + // return the text renderer used by this renderer for setting text cell + // specific attributes: can return NULL if this renderer doesn't render any + // text + virtual GtkCellRendererText *GtkGetTextRenderer() const { return NULL; } + + wxDataViewCellMode GtkGetMode() { return m_mode; } + +protected: + virtual void GtkOnCellChanged(const wxVariant& value, + const wxDataViewItem& item, + unsigned col); + + // Apply our effective alignment (i.e. m_alignment if specified or the + // associated column alignment by default) to the given renderer. + void GtkApplyAlignment(GtkCellRenderer *renderer); + + GtkCellRenderer *m_renderer; + int m_alignment; + wxDataViewCellMode m_mode; + + // true if we hadn't changed any visual attributes or restored them since + // doing this + bool m_usingDefaultAttrs; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRenderer) +}; + +#endif // _WX_GTK_DVRENDERER_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/dvrenderers.h b/wxmsw/include/wx-3.0/wx/gtk/dvrenderers.h new file mode 100644 index 00000000..385fa73a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/dvrenderers.h @@ -0,0 +1,274 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/dvrenderers.h +// Purpose: All GTK wxDataViewCtrl renderer classes +// Author: Robert Roebling, Vadim Zeitlin +// Created: 2009-11-07 (extracted from wx/gtk/dataview.h) +// Copyright: (c) 2006 Robert Roebling +// (c) 2009 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_DVRENDERERS_H_ +#define _WX_GTK_DVRENDERERS_H_ + +#ifdef __WXGTK3__ + typedef struct _cairo_rectangle_int cairo_rectangle_int_t; + typedef cairo_rectangle_int_t GdkRectangle; +#else + typedef struct _GdkRectangle GdkRectangle; +#endif + +// --------------------------------------------------------- +// wxDataViewTextRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewTextRenderer: public wxDataViewRenderer +{ +public: + wxDataViewTextRenderer( const wxString &varianttype = "string", + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int align = wxDVR_DEFAULT_ALIGNMENT ); + + virtual bool SetValue( const wxVariant &value ) + { + return SetTextValue(value); + } + + virtual bool GetValue( wxVariant &value ) const + { + wxString str; + if ( !GetTextValue(str) ) + return false; + + value = str; + + return true; + } + + virtual void SetAlignment( int align ); + + virtual bool GtkSupportsAttrs() const { return true; } + virtual bool GtkSetAttr(const wxDataViewItemAttr& attr); + + virtual GtkCellRendererText *GtkGetTextRenderer() const; + +protected: + // implementation of Set/GetValue() + bool SetTextValue(const wxString& str); + bool GetTextValue(wxString& str) const; + + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewBitmapRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewBitmapRenderer: public wxDataViewRenderer +{ +public: + wxDataViewBitmapRenderer( const wxString &varianttype = "wxBitmap", + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int align = wxDVR_DEFAULT_ALIGNMENT ); + + bool SetValue( const wxVariant &value ); + bool GetValue( wxVariant &value ) const; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewBitmapRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewToggleRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewToggleRenderer: public wxDataViewRenderer +{ +public: + wxDataViewToggleRenderer( const wxString &varianttype = "bool", + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int align = wxDVR_DEFAULT_ALIGNMENT ); + + bool SetValue( const wxVariant &value ); + bool GetValue( wxVariant &value ) const; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewToggleRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewCustomRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewCustomRenderer: public wxDataViewCustomRendererBase +{ +public: + wxDataViewCustomRenderer( const wxString &varianttype = "string", + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int align = wxDVR_DEFAULT_ALIGNMENT, + bool no_init = false ); + virtual ~wxDataViewCustomRenderer(); + + + // Create DC on request + virtual wxDC *GetDC(); + + // override the base class function to use GTK text cell renderer + virtual void RenderText(const wxString& text, + int xoffset, + wxRect cell, + wxDC *dc, + int state); + + struct GTKRenderParams; + + // store GTK render call parameters for possible later use + void GTKSetRenderParams(GTKRenderParams* renderParams) + { + m_renderParams = renderParams; + } + + // we may or not support attributes, as we don't know it, return true to + // make it possible to use them + virtual bool GtkSupportsAttrs() const { return true; } + + virtual bool GtkSetAttr(const wxDataViewItemAttr& attr) + { + SetAttr(attr); + return !attr.IsDefault(); + } + + virtual GtkCellRendererText *GtkGetTextRenderer() const; + +private: + bool Init(wxDataViewCellMode mode, int align); + + // Called from GtkGetTextRenderer() to really create the renderer if + // necessary. + void GtkInitTextRenderer(); + + wxDC *m_dc; + + GtkCellRendererText *m_text_renderer; + + // parameters of the original render() call stored so that we could pass + // them forward to m_text_renderer if our RenderText() is called + GTKRenderParams* m_renderParams; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCustomRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewProgressRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewProgressRenderer: public wxDataViewCustomRenderer +{ +public: + wxDataViewProgressRenderer( const wxString &label = wxEmptyString, + const wxString &varianttype = "long", + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int align = wxDVR_DEFAULT_ALIGNMENT ); + virtual ~wxDataViewProgressRenderer(); + + bool SetValue( const wxVariant &value ); + bool GetValue( wxVariant &value ) const; + + virtual bool Render( wxRect cell, wxDC *dc, int state ); + virtual wxSize GetSize() const; + +private: + void GTKSetLabel(); + + wxString m_label; + int m_value; + +#if !wxUSE_UNICODE + // Flag used to indicate that we need to set the label because we were + // unable to do it in the ctor (see comments there). + bool m_needsToSetLabel; +#endif // !wxUSE_UNICODE + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewProgressRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewIconTextRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewIconTextRenderer: public wxDataViewTextRenderer +{ +public: + wxDataViewIconTextRenderer( const wxString &varianttype = "wxDataViewIconText", + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, + int align = wxDVR_DEFAULT_ALIGNMENT ); + virtual ~wxDataViewIconTextRenderer(); + + bool SetValue( const wxVariant &value ); + bool GetValue( wxVariant &value ) const; + + virtual void GtkPackIntoColumn(GtkTreeViewColumn *column); + +protected: + virtual void GtkOnCellChanged(const wxVariant& value, + const wxDataViewItem& item, + unsigned col); + +private: + wxDataViewIconText m_value; + + // we use the base class m_renderer for the text and this one for the icon + GtkCellRenderer *m_rendererIcon; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewIconTextRenderer) +}; + +// ------------------------------------- +// wxDataViewChoiceRenderer +// ------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewChoiceRenderer: public wxDataViewCustomRenderer +{ +public: + wxDataViewChoiceRenderer(const wxArrayString &choices, + wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE, + int alignment = wxDVR_DEFAULT_ALIGNMENT ); + virtual bool Render( wxRect rect, wxDC *dc, int state ); + virtual wxSize GetSize() const; + virtual bool SetValue( const wxVariant &value ); + virtual bool GetValue( wxVariant &value ) const; + + void SetAlignment( int align ); + + wxString GetChoice(size_t index) const { return m_choices[index]; } + const wxArrayString& GetChoices() const { return m_choices; } + +private: + wxArrayString m_choices; + wxString m_data; +}; + +// ---------------------------------------------------------------------------- +// wxDataViewChoiceByIndexRenderer +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewChoiceByIndexRenderer: public wxDataViewChoiceRenderer +{ +public: + wxDataViewChoiceByIndexRenderer( const wxArrayString &choices, + wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE, + int alignment = wxDVR_DEFAULT_ALIGNMENT ); + + virtual bool SetValue( const wxVariant &value ); + virtual bool GetValue( wxVariant &value ) const; + +private: + virtual void GtkOnTextEdited(const char *itempath, const wxString& str); +}; + + + +#endif // _WX_GTK_DVRENDERERS_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/evtloop.h b/wxmsw/include/wx-3.0/wx/gtk/evtloop.h new file mode 100644 index 00000000..ba8db406 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/evtloop.h @@ -0,0 +1,47 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/evtloop.h +// Purpose: wxGTK event loop implementation +// Author: Vadim Zeitlin +// Created: 2008-12-27 +// Copyright: (c) 2008 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_EVTLOOP_H_ +#define _WX_GTK_EVTLOOP_H_ + +// ---------------------------------------------------------------------------- +// wxGUIEventLoop for wxGTK +// ---------------------------------------------------------------------------- + +typedef union _GdkEvent GdkEvent; + +class WXDLLIMPEXP_CORE wxGUIEventLoop : public wxEventLoopBase +{ +public: + wxGUIEventLoop(); + + virtual void ScheduleExit(int rc = 0); + virtual bool Pending() const; + virtual bool Dispatch(); + virtual int DispatchTimeout(unsigned long timeout); + virtual void WakeUp(); + virtual bool YieldFor(long eventsToProcess); + + void StoreGdkEventForLaterProcessing(GdkEvent* ev) + { m_arrGdkEvents.Add(ev); } + +protected: + virtual int DoRun(); + +private: + // the exit code of this event loop + int m_exitcode; + + // used to temporarily store events in DoYield() + wxArrayPtrVoid m_arrGdkEvents; + + wxDECLARE_NO_COPY_CLASS(wxGUIEventLoop); +}; + +#endif // _WX_GTK_EVTLOOP_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/evtloopsrc.h b/wxmsw/include/wx-3.0/wx/gtk/evtloopsrc.h new file mode 100644 index 00000000..f8052342 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/evtloopsrc.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/evtloopsrc.h +// Purpose: wxGTKEventLoopSource class +// Author: Vadim Zeitlin +// Created: 2009-10-21 +// Copyright: (c) 2009 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_EVTLOOPSRC_H_ +#define _WX_GTK_EVTLOOPSRC_H_ + +// ---------------------------------------------------------------------------- +// wxGTKEventLoopSource: wxEventLoopSource for GTK port +// ---------------------------------------------------------------------------- + +class wxGTKEventLoopSource : public wxEventLoopSource +{ +public: + // sourceId is the id of the watch in GTK context, not the FD of the file + // this source corresponds to + wxGTKEventLoopSource(unsigned sourceId, + wxEventLoopSourceHandler *handler, + int flags) + : wxEventLoopSource(handler, flags), + m_sourceId(sourceId) + { + } + + virtual ~wxGTKEventLoopSource(); + +private: + const unsigned m_sourceId; + + wxDECLARE_NO_COPY_CLASS(wxGTKEventLoopSource); +}; + +#endif // _WX_GTK_EVTLOOPSRC_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/filectrl.h b/wxmsw/include/wx-3.0/wx/gtk/filectrl.h new file mode 100644 index 00000000..3de17e3a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/filectrl.h @@ -0,0 +1,144 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/filectrl.h +// Purpose: wxGtkFileCtrl Header +// Author: Diaa M. Sami +// Modified by: +// Created: Aug-10-2007 +// Copyright: (c) Diaa M. Sami +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + + +#ifndef _WX_GTK_FILECTRL_H_ +#define _WX_GTK_FILECTRL_H_ + +#include "wx/control.h" +#include "wx/filectrl.h" + +extern WXDLLIMPEXP_DATA_CORE(const char) wxFileSelectorDefaultWildcardStr[]; + +typedef struct _GtkFileChooser GtkFileChooser; + +// [GTK] current problems: +// All methods(e.g. SetFilename(), SetPath(), etc) which change the state of +// the control result in events fired, such events should be suppressed. +// ------ +// Sometimes a selection event(with 0 files) is fired before +// wxEVT_FILECTRL_FOLDERCHANGED, unfortunately this can hardly be detected! + +// A wx wrapper for any Gtk object implementing the interface GtkFileChooser + +class WXDLLIMPEXP_CORE wxGtkFileChooser +{ +public: + wxGtkFileChooser() { m_ignoreNextFilterEvent = false; } + + void SetWidget(GtkFileChooser *w); + + wxString GetPath() const; + void GetPaths( wxArrayString& paths ) const; + wxString GetDirectory() const; + wxString GetFilename() const; + void GetFilenames( wxArrayString& files ) const; + int GetFilterIndex() const; + + bool SetPath( const wxString& path ); + bool SetDirectory( const wxString& dir ); + void SetWildcard( const wxString& wildCard ); + void SetFilterIndex( int filterIndex ); + + bool HasFilterChoice() const; + + bool ShouldIgnoreNextFilterEvent() const { return m_ignoreNextFilterEvent; } + + wxString GetCurrentWildCard() const + { return m_wildcards[GetFilterIndex()]; } + +private: + GtkFileChooser *m_widget; + // First wildcard in filter, to be used when the user + // saves a file without giving an extension. + wxArrayString m_wildcards; + + // If true, ignore the next event because it was generated by us and not + // the user. + bool m_ignoreNextFilterEvent; +}; + +#if wxUSE_FILECTRL + +class WXDLLIMPEXP_CORE wxGtkFileCtrl: public wxControl, + public wxFileCtrlBase +{ +public: + wxGtkFileCtrl () { Init(); } + + wxGtkFileCtrl ( wxWindow *parent, + wxWindowID id, + const wxString& defaultDirectory = wxEmptyString, + const wxString& defaultFilename = wxEmptyString, + const wxString& wildCard = wxFileSelectorDefaultWildcardStr, + long style = wxFC_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxString& name = wxFileCtrlNameStr ) + { + Init(); + Create( parent, id, defaultDirectory, defaultFilename, wildCard, style, pos, size, name ); + } + + virtual ~wxGtkFileCtrl(); + + bool Create( wxWindow *parent, + wxWindowID id, + const wxString& defaultDirectory = wxEmptyString, + const wxString& defaultFileName = wxEmptyString, + const wxString& wildCard = wxFileSelectorDefaultWildcardStr, + long style = wxFC_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxString& name = wxFileCtrlNameStr ); + + virtual void SetWildcard( const wxString& wildCard ); + virtual void SetFilterIndex( int filterIndex ); + virtual bool SetDirectory( const wxString& dir ); + virtual bool SetFilename( const wxString& name ); + virtual bool SetPath( const wxString& path ); + + virtual wxString GetFilename() const; + virtual wxString GetDirectory() const; + virtual wxString GetWildcard() const { return this->m_wildCard; } + virtual wxString GetPath() const; + virtual void GetPaths( wxArrayString& paths ) const; + virtual void GetFilenames( wxArrayString& files ) const; + virtual int GetFilterIndex() const { return m_fc.GetFilterIndex(); } + + virtual bool HasMultipleFileSelection() const { return HasFlag( wxFC_MULTIPLE ); } + virtual void ShowHidden(bool show); + + virtual bool HasFilterChoice() const + { return m_fc.HasFilterChoice(); } + + + // Implementation only from now on. + bool GTKShouldIgnoreNextFilterEvent() const + { return m_fc.ShouldIgnoreNextFilterEvent(); } + + bool m_checkNextSelEvent; + bool m_ignoreNextFolderChangeEvent; + +protected: + GtkFileChooser *m_fcWidget; + wxGtkFileChooser m_fc; + wxString m_wildCard; + +private: + void Init(); + + DECLARE_DYNAMIC_CLASS( wxGtkFileCtrl ) +}; + +#endif // wxUSE_FILECTRL + +#endif // _WX_GTK_FILECTRL_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/filedlg.h b/wxmsw/include/wx-3.0/wx/gtk/filedlg.h new file mode 100644 index 00000000..377734db --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/filedlg.h @@ -0,0 +1,83 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/filedlg.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTKFILEDLG_H_ +#define _WX_GTKFILEDLG_H_ + +#include "wx/gtk/filectrl.h" // for wxGtkFileChooser + +//------------------------------------------------------------------------- +// wxFileDialog +//------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFileDialog: public wxFileDialogBase +{ +public: + wxFileDialog() { } + + wxFileDialog(wxWindow *parent, + const wxString& message = wxFileSelectorPromptStr, + const wxString& defaultDir = wxEmptyString, + const wxString& defaultFile = wxEmptyString, + const wxString& wildCard = wxFileSelectorDefaultWildcardStr, + long style = wxFD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + const wxString& name = wxFileDialogNameStr); + bool Create(wxWindow *parent, + const wxString& message = wxFileSelectorPromptStr, + const wxString& defaultDir = wxEmptyString, + const wxString& defaultFile = wxEmptyString, + const wxString& wildCard = wxFileSelectorDefaultWildcardStr, + long style = wxFD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + const wxString& name = wxFileDialogNameStr); + virtual ~wxFileDialog(); + + virtual wxString GetPath() const; + virtual void GetPaths(wxArrayString& paths) const; + virtual wxString GetFilename() const; + virtual void GetFilenames(wxArrayString& files) const; + virtual int GetFilterIndex() const; + + virtual void SetMessage(const wxString& message); + virtual void SetPath(const wxString& path); + virtual void SetDirectory(const wxString& dir); + virtual void SetFilename(const wxString& name); + virtual void SetWildcard(const wxString& wildCard); + virtual void SetFilterIndex(int filterIndex); + + virtual int ShowModal(); + + virtual bool SupportsExtraControl() const { return true; } + + // Implementation only. + void GTKSelectionChanged(const wxString& filename); + + +protected: + // override this from wxTLW since the native + // form doesn't have any m_wxwindow + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + + +private: + void OnFakeOk( wxCommandEvent &event ); + void OnSize(wxSizeEvent&); + virtual void AddChildGTK(wxWindowGTK* child); + + wxGtkFileChooser m_fc; + + DECLARE_DYNAMIC_CLASS(wxFileDialog) + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_GTKFILEDLG_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/filehistory.h b/wxmsw/include/wx-3.0/wx/gtk/filehistory.h new file mode 100644 index 00000000..70a93d6f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/filehistory.h @@ -0,0 +1,24 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/filehistory.h +// Purpose: GTK+ bits for wxFileHistory +// Author: Vaclav Slavik +// Created: 2010-05-06 +// Copyright: (c) 2010 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_FILEHISTORY_H_ +#define _WX_GTK_FILEHISTORY_H_ + +class WXDLLIMPEXP_CORE wxFileHistory : public wxFileHistoryBase +{ +public: + wxFileHistory(size_t maxFiles = 9, wxWindowID idBase = wxID_FILE1) + : wxFileHistoryBase(maxFiles, idBase) {} + + virtual void AddFileToHistory(const wxString& file); + + DECLARE_DYNAMIC_CLASS(wxFileHistory) +}; + +#endif // _WX_GTK_FILEHISTORY_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/filepicker.h b/wxmsw/include/wx-3.0/wx/gtk/filepicker.h new file mode 100644 index 00000000..27e1fdc7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/filepicker.h @@ -0,0 +1,192 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/filedirpicker.h +// Purpose: wxFileButton, wxDirButton header +// Author: Francesco Montorsi +// Modified by: +// Created: 14/4/2006 +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_FILEPICKER_H_ +#define _WX_GTK_FILEPICKER_H_ + +// since GtkColorButton is available only for GTK+ >= 2.4, +// we need to use generic versions if we detect (at runtime) +// that GTK+ < 2.4 +#include "wx/generic/filepickerg.h" + +//----------------------------------------------------------------------------- +// wxFileButton and wxDirButton shared code +// (cannot be a base class since they need to derive from wxGenericFileButton +// and from wxGenericDirButton classes !) +//----------------------------------------------------------------------------- + +#define FILEDIRBTN_OVERRIDES \ + /* NULL is because of a problem with destruction order which happens */ \ + /* if we pass GetParent(): in fact, this GTK native implementation */ \ + /* needs to create the dialog in ::Create() and not for each user */ \ + /* request in response to the user click as the generic implementation */ \ + /* does. */ \ + virtual wxWindow *GetDialogParent() \ + { \ + return NULL; \ + } \ + \ + /* even if wx derive from wxGenericFileButton, i.e. from wxButton, our */ \ + /* native GTK+ widget does not derive from GtkButton thus *all* uses */ \ + /* GTK_BUTTON(m_widget) macro done by wxButton must be bypassed to */ \ + /* avoid bunch of GTK+ warnings like: */ \ + /* invalid cast from `GtkFileChooserButton' to `GtkButton' */ \ + /* so, override wxButton::GTKGetWindow and return NULL as GTK+ doesn't */ \ + /* give us access to the internal GdkWindow of a GtkFileChooserButton */ \ +protected: \ + virtual GdkWindow * \ + GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const \ + { return NULL; } + + +//----------------------------------------------------------------------------- +// wxFileButton +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFileButton : public wxGenericFileButton +{ +public: + wxFileButton() { Init(); } + wxFileButton(wxWindow *parent, + wxWindowID id, + const wxString& label = wxFilePickerWidgetLabel, + const wxString &path = wxEmptyString, + const wxString &message = wxFileSelectorPromptStr, + const wxString &wildcard = wxFileSelectorDefaultWildcardStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxFILEBTN_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFilePickerWidgetNameStr) + { + Init(); + m_pickerStyle = style; + Create(parent, id, label, path, message, wildcard, + pos, size, style, validator, name); + } + + virtual ~wxFileButton(); + + +public: // overrides + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label = wxFilePickerWidgetLabel, + const wxString &path = wxEmptyString, + const wxString &message = wxFileSelectorPromptStr, + const wxString &wildcard = wxFileSelectorDefaultWildcardStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFilePickerWidgetNameStr); + + // event handler for the click + void OnDialogOK(wxCommandEvent &); + + virtual void SetPath(const wxString &str); + virtual void SetInitialDirectory(const wxString& dir); + + // see macro defined above + FILEDIRBTN_OVERRIDES + +protected: + wxDialog *m_dialog; + +private: + // common part of all ctors + void Init() { m_dialog = NULL; } + + DECLARE_DYNAMIC_CLASS(wxFileButton) +}; + + +//----------------------------------------------------------------------------- +// wxDirButton +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDirButton : public wxGenericDirButton +{ +public: + wxDirButton() { Init(); } + wxDirButton(wxWindow *parent, + wxWindowID id, + const wxString& label = wxFilePickerWidgetLabel, + const wxString &path = wxEmptyString, + const wxString &message = wxFileSelectorPromptStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDIRBTN_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFilePickerWidgetNameStr) + { + Init(); + + m_pickerStyle = style; + + Create(parent, id, label, path, message, wxEmptyString, + pos, size, style, validator, name); + } + + virtual ~wxDirButton(); + + +public: // overrides + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label = wxFilePickerWidgetLabel, + const wxString &path = wxEmptyString, + const wxString &message = wxFileSelectorPromptStr, + const wxString &wildcard = wxFileSelectorDefaultWildcardStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFilePickerWidgetNameStr); + + + // GtkFileChooserButton does not support GTK_FILE_CHOOSER_CREATE_FOLDER + // thus we must ensure that the wxDD_DIR_MUST_EXIST style was given + long GetDialogStyle() const + { + return (wxGenericDirButton::GetDialogStyle() | wxDD_DIR_MUST_EXIST); + } + + virtual void SetPath(const wxString &str); + virtual void SetInitialDirectory(const wxString& dir); + + // see macro defined above + FILEDIRBTN_OVERRIDES + +protected: + wxDialog *m_dialog; + +public: // used by the GTK callback only + + bool m_bIgnoreNextChange; + + void GTKUpdatePath(const char *gtkpath); + +private: + void Init() + { + m_dialog = NULL; + m_bIgnoreNextChange = false; + } + + DECLARE_DYNAMIC_CLASS(wxDirButton) +}; + +#undef FILEDIRBTN_OVERRIDES + +#endif // _WX_GTK_FILEPICKER_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/font.h b/wxmsw/include/wx-3.0/wx/gtk/font.h new file mode 100644 index 00000000..a218a29d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/font.h @@ -0,0 +1,127 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/font.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_FONT_H_ +#define _WX_GTK_FONT_H_ + +// ---------------------------------------------------------------------------- +// wxFont +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFont : public wxFontBase +{ +public: + wxFont() { } + + wxFont(const wxFontInfo& info); + + wxFont(const wxString& nativeFontInfoString) + { + Create(nativeFontInfoString); + } + + wxFont(const wxNativeFontInfo& info); + +#if FUTURE_WXWIN_COMPATIBILITY_3_0 + wxFont(int size, + int family, + int style, + int weight, + bool underlined = false, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT) + { + (void)Create(size, (wxFontFamily)family, (wxFontStyle)style, (wxFontWeight)weight, underlined, face, encoding); + } +#endif + + wxFont(int size, + wxFontFamily family, + wxFontStyle style, + wxFontWeight weight, + bool underlined = false, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT) + { + Create(size, family, style, weight, underlined, face, encoding); + } + + wxFont(const wxSize& pixelSize, + wxFontFamily family, + wxFontStyle style, + wxFontWeight weight, + bool underlined = false, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT) + { + Create(10, family, style, weight, underlined, face, encoding); + SetPixelSize(pixelSize); + } + + bool Create(int size, + wxFontFamily family, + wxFontStyle style, + wxFontWeight weight, + bool underlined = false, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); + + // wxGTK-specific + bool Create(const wxString& fontname); + + virtual ~wxFont(); + + // implement base class pure virtuals + virtual int GetPointSize() const; + virtual wxFontStyle GetStyle() const; + virtual wxFontWeight GetWeight() const; + virtual wxString GetFaceName() const; + virtual bool GetUnderlined() const; + virtual bool GetStrikethrough() const; + virtual wxFontEncoding GetEncoding() const; + virtual const wxNativeFontInfo *GetNativeFontInfo() const; + virtual bool IsFixedWidth() const; + + virtual void SetPointSize( int pointSize ); + virtual void SetFamily(wxFontFamily family); + virtual void SetStyle(wxFontStyle style); + virtual void SetWeight(wxFontWeight weight); + virtual bool SetFaceName( const wxString& faceName ); + virtual void SetUnderlined( bool underlined ); + virtual void SetStrikethrough(bool strikethrough); + virtual void SetEncoding(wxFontEncoding encoding); + + wxDECLARE_COMMON_FONT_METHODS(); + + // Set Pango attributes in the specified layout. Currently only + // underlined and strike-through attributes are handled by this function. + // + // If neither of them is specified, returns false, otherwise sets up the + // attributes and returns true. + bool GTKSetPangoAttrs(PangoLayout* layout) const; + + // implementation from now on + void Unshare(); + + // no data :-) + +protected: + virtual void DoSetNativeFontInfo( const wxNativeFontInfo& info ); + + virtual wxGDIRefData* CreateGDIRefData() const; + virtual wxGDIRefData* CloneGDIRefData(const wxGDIRefData* data) const; + + virtual wxFontFamily DoGetFamily() const; + +private: + void Init(); + + DECLARE_DYNAMIC_CLASS(wxFont) +}; + +#endif // _WX_GTK_FONT_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/fontdlg.h b/wxmsw/include/wx-3.0/wx/gtk/fontdlg.h new file mode 100644 index 00000000..4c5b57a3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/fontdlg.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/fontdlg.h +// Purpose: wxFontDialog +// Author: Robert Roebling +// Created: +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_FONTDLG_H_ +#define _WX_GTK_FONTDLG_H_ + +//----------------------------------------------------------------------------- +// wxFontDialog +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFontDialog : public wxFontDialogBase +{ +public: + wxFontDialog() : wxFontDialogBase() { /* must be Create()d later */ } + wxFontDialog(wxWindow *parent) + : wxFontDialogBase(parent) { Create(parent); } + wxFontDialog(wxWindow *parent, const wxFontData& data) + : wxFontDialogBase(parent, data) { Create(parent, data); } + + virtual ~wxFontDialog(); + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated interface, don't use + wxDEPRECATED( wxFontDialog(wxWindow *parent, const wxFontData *data) ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + // create the GTK dialog + virtual bool DoCreate(wxWindow *parent); + + DECLARE_DYNAMIC_CLASS(wxFontDialog) +}; + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated interface, don't use +inline wxFontDialog::wxFontDialog(wxWindow *parent, const wxFontData *data) + : wxFontDialogBase(parent) { InitFontData(data); Create(parent); } +#endif // WXWIN_COMPATIBILITY_2_6 + +#endif diff --git a/wxmsw/include/wx-3.0/wx/gtk/fontpicker.h b/wxmsw/include/wx-3.0/wx/gtk/fontpicker.h new file mode 100644 index 00000000..65bb5c95 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/fontpicker.h @@ -0,0 +1,62 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/fontpicker.h +// Purpose: wxFontButton header +// Author: Francesco Montorsi +// Modified by: +// Created: 14/4/2006 +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_FONTPICKER_H_ +#define _WX_GTK_FONTPICKER_H_ + +#include "wx/button.h" + +//----------------------------------------------------------------------------- +// wxFontButton +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFontButton : public wxButton, + public wxFontPickerWidgetBase +{ +public: + wxFontButton() {} + wxFontButton(wxWindow *parent, + wxWindowID id, + const wxFont& initial = wxNullFont, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxFONTBTN_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFontPickerWidgetNameStr) + { + Create(parent, id, initial, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxFont& initial = wxNullFont, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxFONTBTN_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFontPickerWidgetNameStr); + + virtual ~wxFontButton(); + +protected: + void UpdateFont(); + + +public: // used by the GTK callback only + + void SetNativeFontInfo(const char *gtkdescription) + { m_selectedFont.SetNativeFontInfo(wxString::FromAscii(gtkdescription)); } + +private: + DECLARE_DYNAMIC_CLASS(wxFontButton) +}; + +#endif // _WX_GTK_FONTPICKER_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/frame.h b/wxmsw/include/wx-3.0/wx/gtk/frame.h new file mode 100644 index 00000000..1f172c43 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/frame.h @@ -0,0 +1,82 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/frame.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling, Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_FRAME_H_ +#define _WX_GTK_FRAME_H_ + +//----------------------------------------------------------------------------- +// wxFrame +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFrame : public wxFrameBase +{ +public: + // construction + wxFrame() { Init(); } + wxFrame(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + { + Init(); + + Create(parent, id, title, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + virtual ~wxFrame(); + +#if wxUSE_STATUSBAR + void SetStatusBar(wxStatusBar *statbar); +#endif // wxUSE_STATUSBAR + +#if wxUSE_TOOLBAR + void SetToolBar(wxToolBar *toolbar); +#endif // wxUSE_TOOLBAR + + virtual bool ShowFullScreen(bool show, long style = wxFULLSCREEN_ALL); + wxPoint GetClientAreaOrigin() const { return wxPoint(0, 0); } + +#if wxUSE_LIBHILDON || wxUSE_LIBHILDON2 + // in Hildon environment all frames are always shown maximized + virtual bool IsMaximized() const { return true; } +#endif // wxUSE_LIBHILDON || wxUSE_LIBHILDON2 + + // implementation from now on + // -------------------------- + + virtual bool SendIdleEvents(wxIdleEvent& event); + +protected: + // override wxWindow methods to take into account tool/menu/statusbars + virtual void DoGetClientSize( int *width, int *height ) const; + +#if wxUSE_MENUS_NATIVE + virtual void DetachMenuBar(); + virtual void AttachMenuBar(wxMenuBar *menubar); +#endif // wxUSE_MENUS_NATIVE + +private: + void Init(); + + long m_fsSaveFlag; + + DECLARE_DYNAMIC_CLASS(wxFrame) +}; + +#endif // _WX_GTK_FRAME_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/gauge.h b/wxmsw/include/wx-3.0/wx/gtk/gauge.h new file mode 100644 index 00000000..8df47461 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/gauge.h @@ -0,0 +1,85 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/gauge.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_GAUGE_H_ +#define _WX_GTK_GAUGE_H_ + +//----------------------------------------------------------------------------- +// wxGauge +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGauge: public wxControl +{ +public: + wxGauge() { Init(); } + + wxGauge( wxWindow *parent, + wxWindowID id, + int range, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxGA_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxGaugeNameStr ) + { + Init(); + + Create(parent, id, range, pos, size, style, validator, name); + } + + bool Create( wxWindow *parent, + wxWindowID id, int range, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxGA_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxGaugeNameStr ); + + void SetShadowWidth( int WXUNUSED(w) ) { } + void SetBezelFace( int WXUNUSED(w) ) { } + int GetShadowWidth() const { return 0; } + int GetBezelFace() const { return 0; } + + // determinate mode API + void SetRange( int r ); + void SetValue( int pos ); + + int GetRange() const; + int GetValue() const; + + // indeterminate mode API + virtual void Pulse(); + + bool IsVertical() const { return HasFlag(wxGA_VERTICAL); } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + virtual wxVisualAttributes GetDefaultAttributes() const; + + // implementation + // ------------- + + // the max and current gauge values + int m_rangeMax, + m_gaugePos; + +protected: + // set the gauge value to the value of m_gaugePos + void DoSetGauge(); + + virtual wxSize DoGetBestSize() const; + +private: + void Init() { m_rangeMax = m_gaugePos = 0; } + + DECLARE_DYNAMIC_CLASS(wxGauge) +}; + +#endif + // _WX_GTK_GAUGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/glcanvas.h b/wxmsw/include/wx-3.0/wx/gtk/glcanvas.h new file mode 100644 index 00000000..01591149 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/glcanvas.h @@ -0,0 +1,111 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/glcanvas.h +// Purpose: wxGLCanvas, for using OpenGL/Mesa with wxWidgets and GTK +// Author: Robert Roebling +// Modified by: +// Created: 17/8/98 +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GLCANVAS_H_ +#define _WX_GLCANVAS_H_ + +#include "wx/unix/glx11.h" + +//--------------------------------------------------------------------------- +// wxGLCanvas +//--------------------------------------------------------------------------- + +class WXDLLIMPEXP_GL wxGLCanvas : public wxGLCanvasX11 +{ +public: + wxGLCanvas(wxWindow *parent, + wxWindowID id = wxID_ANY, + const int *attribList = NULL, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxGLCanvasName, + const wxPalette& palette = wxNullPalette); + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxGLCanvasName, + const int *attribList = NULL, + const wxPalette& palette = wxNullPalette); + + virtual bool SetBackgroundStyle(wxBackgroundStyle style); + + // implement wxGLCanvasX11 methods + // -------------------------------- + + virtual Window GetXWindow() const; + + + // deprecated methods + // ------------------ + +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED( + wxGLCanvas(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxGLCanvasName, + const int *attribList = NULL, + const wxPalette& palette = wxNullPalette) + ); + + wxDEPRECATED( + wxGLCanvas(wxWindow *parent, + const wxGLContext *shared, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxGLCanvasName, + const int *attribList = NULL, + const wxPalette& palette = wxNullPalette) + ); + + wxDEPRECATED( + wxGLCanvas(wxWindow *parent, + const wxGLCanvas *shared, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxGLCanvasName, + const int *attribList = NULL, + const wxPalette& palette = wxNullPalette) + ); + + // called from "realized" callback to create the implicit context if needed + void GTKInitImplicitContext(); +#endif // WXWIN_COMPATIBILITY_2_8 + + // implementation from now on + void OnInternalIdle(); + + bool m_exposed; +#ifdef __WXGTK3__ + cairo_t* m_cairoPaintContext; +#endif + +#if WXWIN_COMPATIBILITY_2_8 + wxGLContext *m_sharedContext; + wxGLCanvas *m_sharedContextOf; + const bool m_createImplicitContext; +#endif // WXWIN_COMPATIBILITY_2_8 + +private: + DECLARE_CLASS(wxGLCanvas) +}; + +#endif // _WX_GLCANVAS_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/gnome/gvfs.h b/wxmsw/include/wx-3.0/wx/gtk/gnome/gvfs.h new file mode 100644 index 00000000..559f14f5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/gnome/gvfs.h @@ -0,0 +1,52 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/gnome/gvfs.h +// Author: Robert Roebling +// Purpose: GNOME VFS support +// Created: 17/03/06 +// Copyright: Robert Roebling +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_GVFS_H_ +#define _WX_GTK_GVFS_H_ + +#include "wx/defs.h" + +#if wxUSE_MIMETYPE && wxUSE_LIBGNOMEVFS + +#include "wx/string.h" +#include "wx/unix/mimetype.h" + +//---------------------------------------------------------------------------- +// wxGnomeVFSMimeTypesManagerImpl +//---------------------------------------------------------------------------- + +class wxGnomeVFSMimeTypesManagerImpl: public wxMimeTypesManagerImpl +{ +public: + wxGnomeVFSMimeTypesManagerImpl() { } + +protected: + virtual bool DoAssociation(const wxString& strType, + const wxString& strIcon, + wxMimeTypeCommands *entry, + const wxArrayString& strExtensions, + const wxString& strDesc); +}; + +//---------------------------------------------------------------------------- +// wxGnomeVFSMimeTypesManagerFactory +//---------------------------------------------------------------------------- + +class wxGnomeVFSMimeTypesManagerFactory: public wxMimeTypesManagerFactory +{ +public: + wxGnomeVFSMimeTypesManagerFactory() {} + + virtual wxMimeTypesManagerImpl *CreateMimeTypesManagerImpl(); +}; + +#endif + // wxUSE_MIMETYPE + +#endif diff --git a/wxmsw/include/wx-3.0/wx/gtk/hildon/notifmsg.h b/wxmsw/include/wx-3.0/wx/gtk/hildon/notifmsg.h new file mode 100644 index 00000000..ade115fe --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/hildon/notifmsg.h @@ -0,0 +1,58 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/hildon/notifmsg.h +// Purpose: Hildon implementation of wxNotificationMessage +// Author: Vadim Zeitlin +// Created: 2007-11-21 +// Copyright: (c) 2007 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_HILDON_NOTIFMSG_H_ +#define _WX_GTK_HILDON_NOTIFMSG_H_ + +typedef struct _HildonBanner HildonBanner; + +// ---------------------------------------------------------------------------- +// wxNotificationMessage +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxNotificationMessage : public wxNotificationMessageBase +{ +public: + wxNotificationMessage() { Init(); } + wxNotificationMessage(const wxString& title, + const wxString& message = wxString(), + wxWindow *parent = NULL) + : wxNotificationMessageBase(title, message, parent) + { + Init(); + } + + virtual ~wxNotificationMessage(); + + + virtual bool Show(int timeout = Timeout_Auto); + virtual bool Close(); + +private: + void Init() { m_banner = NULL; } + + // return the string containing markup for both the title and, if + // specified, the message + wxString HildonGetMarkup() const; + + // returns the widget of the parent GtkWindow to use or NULL + GtkWidget *HildonGetWindow() const; + + + // the banner we're showing, only non-NULL if it's an animation or progress + // banner as the informational dialog times out on its own and we don't + // need to store it (nor do we have any way to get its widget anyhow) + GtkWidget *m_banner; + + + wxDECLARE_NO_COPY_CLASS(wxNotificationMessage); +}; + +#endif // _WX_GTK_HILDON_NOTIFMSG_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/hyperlink.h b/wxmsw/include/wx-3.0/wx/gtk/hyperlink.h new file mode 100644 index 00000000..0b6ce6bf --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/hyperlink.h @@ -0,0 +1,72 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/hyperlink.h +// Purpose: Hyperlink control +// Author: Francesco Montorsi +// Modified by: +// Created: 14/2/2007 +// Copyright: (c) 2007 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTKHYPERLINKCTRL_H_ +#define _WX_GTKHYPERLINKCTRL_H_ + +#include "wx/generic/hyperlink.h" + +// ---------------------------------------------------------------------------- +// wxHyperlinkCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxHyperlinkCtrl : public wxGenericHyperlinkCtrl +{ +public: + // Default constructor (for two-step construction). + wxHyperlinkCtrl() { } + + // Constructor. + wxHyperlinkCtrl(wxWindow *parent, + wxWindowID id, + const wxString& label, const wxString& url, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHL_DEFAULT_STYLE, + const wxString& name = wxHyperlinkCtrlNameStr) + { + (void)Create(parent, id, label, url, pos, size, style, name); + } + + // Creation function (for two-step construction). + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label, const wxString& url, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHL_DEFAULT_STYLE, + const wxString& name = wxHyperlinkCtrlNameStr); + + + // get/set + virtual wxColour GetHoverColour() const; + virtual void SetHoverColour(const wxColour &colour); + + virtual wxColour GetNormalColour() const; + virtual void SetNormalColour(const wxColour &colour); + + virtual wxColour GetVisitedColour() const; + virtual void SetVisitedColour(const wxColour &colour); + + virtual wxString GetURL() const; + virtual void SetURL(const wxString &url); + + virtual void SetLabel(const wxString &label); + +protected: + virtual wxSize DoGetBestSize() const; + virtual wxSize DoGetBestClientSize() const; + + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + + DECLARE_DYNAMIC_CLASS(wxHyperlinkCtrl) +}; + +#endif // _WX_GTKHYPERLINKCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/infobar.h b/wxmsw/include/wx-3.0/wx/gtk/infobar.h new file mode 100644 index 00000000..45563eb2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/infobar.h @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/infobar.h +// Purpose: native implementation of wxInfoBar for GTK+ 2.18 and later +// Author: Vadim Zeitlin +// Created: 2009-09-26 +// Copyright: (c) 2009 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_INFOBAR_H_ +#define _WX_GTK_INFOBAR_H_ + +#include "wx/generic/infobar.h" + +// ---------------------------------------------------------------------------- +// wxInfoBar for GTK+ +// ---------------------------------------------------------------------------- + +// notice that the native GTK+ implementation is only available since +// (relatively recent) 2.18 so we inherit from the generic one to be able to +// fall back to it if GTK+ version is determined to be too old during run-time +class WXDLLIMPEXP_CORE wxInfoBar : public wxInfoBarGeneric +{ +public: + wxInfoBar() { Init(); } + + wxInfoBar(wxWindow *parent, wxWindowID winid = wxID_ANY) + { + Init(); + Create(parent, winid); + } + + bool Create(wxWindow *parent, wxWindowID winid = wxID_ANY); + + virtual ~wxInfoBar(); + + // implement base class methods + // ---------------------------- + + virtual void ShowMessage(const wxString& msg, + int flags = wxICON_INFORMATION); + + virtual void Dismiss(); + + virtual void AddButton(wxWindowID btnid, + const wxString& label = wxString()); + + virtual void RemoveButton(wxWindowID btnid); + + // implementation only + // ------------------- + + void GTKResponse(int btnid); + +protected: + virtual void DoApplyWidgetStyle(GtkRcStyle *style); + +private: + void Init() { m_impl = NULL; } + + // add a button with the given id/label and return its widget + GtkWidget *GTKAddButton(wxWindowID btnid, + const wxString& label = wxString()); + + + // only used when the native implementation is really being used + class wxInfoBarGTKImpl *m_impl; + + wxDECLARE_NO_COPY_CLASS(wxInfoBar); +}; + +#endif // _WX_GTK_INFOBAR_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/listbox.h b/wxmsw/include/wx-3.0/wx/gtk/listbox.h new file mode 100644 index 00000000..c40bda6a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/listbox.h @@ -0,0 +1,135 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/listbox.h +// Purpose: wxListBox class declaration +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_LISTBOX_H_ +#define _WX_GTK_LISTBOX_H_ + +struct _wxTreeEntry; +struct _GtkTreeIter; + +//----------------------------------------------------------------------------- +// wxListBox +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxListBox : public wxListBoxBase +{ +public: + // ctors and such + wxListBox() + { + Init(); + } + wxListBox( wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = (const wxString *) NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr ) + { + Init(); + Create(parent, id, pos, size, n, choices, style, validator, name); + } + wxListBox( wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr ) + { + Init(); + Create(parent, id, pos, size, choices, style, validator, name); + } + virtual ~wxListBox(); + + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = (const wxString *) NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + + virtual unsigned int GetCount() const; + virtual wxString GetString(unsigned int n) const; + virtual void SetString(unsigned int n, const wxString& s); + virtual int FindString(const wxString& s, bool bCase = false) const; + + virtual bool IsSelected(int n) const; + virtual int GetSelection() const; + virtual int GetSelections(wxArrayInt& aSelections) const; + + virtual void EnsureVisible(int n); + + virtual void Update(); + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // implementation from now on + + virtual GtkWidget *GetConnectWidget(); + + struct _GtkTreeView *m_treeview; + struct _GtkListStore *m_liststore; + +#if wxUSE_CHECKLISTBOX + bool m_hasCheckBoxes; +#endif // wxUSE_CHECKLISTBOX + + struct _wxTreeEntry* GTKGetEntry(unsigned pos) const; + + void GTKDisableEvents(); + void GTKEnableEvents(); + + void GTKOnSelectionChanged(); + void GTKOnActivated(int item); + +protected: + virtual void DoClear(); + virtual void DoDeleteOneItem(unsigned int n); + virtual wxSize DoGetBestSize() const; + virtual void DoApplyWidgetStyle(GtkRcStyle *style); + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + + virtual void DoSetSelection(int n, bool select); + + virtual int DoInsertItems(const wxArrayStringsAdapter& items, + unsigned int pos, + void **clientData, wxClientDataType type); + virtual int DoInsertOneItem(const wxString& item, unsigned int pos); + + virtual void DoSetFirstItem(int n); + virtual void DoSetItemClientData(unsigned int n, void* clientData); + virtual void* DoGetItemClientData(unsigned int n) const; + virtual int DoListHitTest(const wxPoint& point) const; + + // get the iterator for the given index, returns false if invalid + bool GTKGetIteratorFor(unsigned pos, _GtkTreeIter *iter) const; + + // get the index for the given iterator, return wxNOT_FOUND on failure + int GTKGetIndexFor(_GtkTreeIter& iter) const; + + // common part of DoSetFirstItem() and EnsureVisible() + void DoScrollToCell(int n, float alignY, float alignX); + +private: + void Init(); //common construction + + DECLARE_DYNAMIC_CLASS(wxListBox) +}; + +#endif // _WX_GTK_LISTBOX_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/mdi.h b/wxmsw/include/wx-3.0/wx/gtk/mdi.h new file mode 100644 index 00000000..02a61eb8 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/mdi.h @@ -0,0 +1,153 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/mdi.h +// Purpose: TDI-based MDI implementation for wxGTK +// Author: Robert Roebling +// Modified by: 2008-10-31 Vadim Zeitlin: derive from the base classes +// Copyright: (c) 1998 Robert Roebling +// (c) 2008 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_MDI_H_ +#define _WX_GTK_MDI_H_ + +#include "wx/frame.h" + +class WXDLLIMPEXP_FWD_CORE wxMDIChildFrame; +class WXDLLIMPEXP_FWD_CORE wxMDIClientWindow; + +typedef struct _GtkNotebook GtkNotebook; + +//----------------------------------------------------------------------------- +// wxMDIParentFrame +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMDIParentFrame : public wxMDIParentFrameBase +{ +public: + wxMDIParentFrame() { Init(); } + wxMDIParentFrame(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL, + const wxString& name = wxFrameNameStr) + { + Init(); + + (void)Create(parent, id, title, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL, + const wxString& name = wxFrameNameStr); + + // we don't store the active child in m_currentChild unlike the base class + // version so override this method to find it dynamically + virtual wxMDIChildFrame *GetActiveChild() const; + + // implement base class pure virtuals + // ---------------------------------- + + virtual void ActivateNext(); + virtual void ActivatePrevious(); + + static bool IsTDI() { return true; } + + // implementation + + bool m_justInserted; + + virtual void OnInternalIdle(); + +protected: + virtual void DoGetClientSize(int* width, int* height) const; + +private: + friend class wxMDIChildFrame; + void Init(); + + DECLARE_DYNAMIC_CLASS(wxMDIParentFrame) +}; + +//----------------------------------------------------------------------------- +// wxMDIChildFrame +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMDIChildFrame : public wxTDIChildFrame +{ +public: + wxMDIChildFrame() { Init(); } + wxMDIChildFrame(wxMDIParentFrame *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + { + Init(); + + Create(parent, id, title, pos, size, style, name); + } + + bool Create(wxMDIParentFrame *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + virtual ~wxMDIChildFrame(); + + virtual void SetMenuBar( wxMenuBar *menu_bar ); + virtual wxMenuBar *GetMenuBar() const; + + virtual void Activate(); + + virtual void SetTitle(const wxString& title); + + // implementation + + void OnActivate( wxActivateEvent& event ); + void OnMenuHighlight( wxMenuEvent& event ); + virtual void GTKHandleRealized(); + + wxMenuBar *m_menuBar; + bool m_justInserted; + +private: + void Init(); + + GtkNotebook *GTKGetNotebook() const; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxMDIChildFrame) +}; + +//----------------------------------------------------------------------------- +// wxMDIClientWindow +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMDIClientWindow : public wxMDIClientWindowBase +{ +public: + wxMDIClientWindow() { } + ~wxMDIClientWindow(); + + virtual bool CreateClient(wxMDIParentFrame *parent, + long style = wxVSCROLL | wxHSCROLL); + +private: + virtual void AddChildGTK(wxWindowGTK* child); + + DECLARE_DYNAMIC_CLASS(wxMDIClientWindow) +}; + +#endif // _WX_GTK_MDI_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/menu.h b/wxmsw/include/wx-3.0/wx/gtk/menu.h new file mode 100644 index 00000000..fec12ba9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/menu.h @@ -0,0 +1,110 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/menu.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling, Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTKMENU_H_ +#define _WX_GTKMENU_H_ + +//----------------------------------------------------------------------------- +// wxMenuBar +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMenuBar : public wxMenuBarBase +{ +public: + // ctors + wxMenuBar(); + wxMenuBar(long style); + wxMenuBar(size_t n, wxMenu *menus[], const wxString titles[], long style = 0); + ~wxMenuBar(); + + // implement base class (pure) virtuals + virtual bool Append( wxMenu *menu, const wxString &title ); + virtual bool Insert(size_t pos, wxMenu *menu, const wxString& title); + virtual wxMenu *Replace(size_t pos, wxMenu *menu, const wxString& title); + virtual wxMenu *Remove(size_t pos); + + virtual int FindMenuItem(const wxString& menuString, + const wxString& itemString) const; + virtual wxMenuItem* FindItem( int id, wxMenu **menu = NULL ) const; + + virtual void EnableTop( size_t pos, bool flag ); + virtual bool IsEnabledTop(size_t pos) const; + virtual void SetMenuLabel( size_t pos, const wxString& label ); + virtual wxString GetMenuLabel( size_t pos ) const; + + void SetLayoutDirection(wxLayoutDirection dir); + wxLayoutDirection GetLayoutDirection() const; + + virtual void Attach(wxFrame *frame); + virtual void Detach(); + +private: + // common part of Append and Insert + void GtkAppend(wxMenu* menu, const wxString& title, int pos = -1); + + void Init(size_t n, wxMenu *menus[], const wxString titles[], long style); + + // wxMenuBar is not a top level window but it still doesn't need a parent + // window + virtual bool GTKNeedsParent() const { return false; } + + GtkWidget* m_menubar; + + DECLARE_DYNAMIC_CLASS(wxMenuBar) +}; + +//----------------------------------------------------------------------------- +// wxMenu +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMenu : public wxMenuBase +{ +public: + // ctors & dtor + wxMenu(const wxString& title, long style = 0) + : wxMenuBase(title, style) { Init(); } + + wxMenu(long style = 0) : wxMenuBase(style) { Init(); } + + virtual ~wxMenu(); + + void Attach(wxMenuBarBase *menubar); + + void SetLayoutDirection(const wxLayoutDirection dir); + wxLayoutDirection GetLayoutDirection() const; + + // Returns the title, with mnemonics translated to wx format + wxString GetTitle() const; + + // Sets the title, with mnemonics translated to gtk format + virtual void SetTitle(const wxString& title); + + // implementation GTK only + GtkWidget *m_menu; // GtkMenu + GtkWidget *m_owner; + GtkAccelGroup *m_accel; + bool m_popupShown; + +protected: + virtual wxMenuItem* DoAppend(wxMenuItem *item); + virtual wxMenuItem* DoInsert(size_t pos, wxMenuItem *item); + virtual wxMenuItem* DoRemove(wxMenuItem *item); + +private: + // common code for all constructors: + void Init(); + + // common part of Append (if pos == -1) and Insert + void GtkAppend(wxMenuItem* item, int pos = -1); + + + DECLARE_DYNAMIC_CLASS(wxMenu) +}; + +#endif + // _WX_GTKMENU_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/menuitem.h b/wxmsw/include/wx-3.0/wx/gtk/menuitem.h new file mode 100644 index 00000000..c17ad03a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/menuitem.h @@ -0,0 +1,61 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/menuitem.h +// Purpose: wxMenuItem class +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTKMENUITEM_H_ +#define _WX_GTKMENUITEM_H_ + +#include "wx/bitmap.h" + +//----------------------------------------------------------------------------- +// wxMenuItem +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMenuItem : public wxMenuItemBase +{ +public: + wxMenuItem(wxMenu *parentMenu = NULL, + int id = wxID_SEPARATOR, + const wxString& text = wxEmptyString, + const wxString& help = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL, + wxMenu *subMenu = NULL); + virtual ~wxMenuItem(); + + // implement base class virtuals + virtual void SetItemLabel( const wxString& str ); + virtual void Enable( bool enable = true ); + virtual void Check( bool check = true ); + virtual bool IsChecked() const; + virtual void SetBitmap(const wxBitmap& bitmap); + virtual const wxBitmap& GetBitmap() const { return m_bitmap; } + + // implementation + void SetMenuItem(GtkWidget *menuItem); + GtkWidget *GetMenuItem() const { return m_menuItem; } + void SetGtkLabel(); + +#if WXWIN_COMPATIBILITY_2_8 + // compatibility only, don't use in new code + wxDEPRECATED_CONSTRUCTOR( + wxMenuItem(wxMenu *parentMenu, + int id, + const wxString& text, + const wxString& help, + bool isCheckable, + wxMenu *subMenu = NULL) + ); +#endif + +private: + wxBitmap m_bitmap; // Bitmap for menuitem, if any + GtkWidget *m_menuItem; // GtkMenuItem + + DECLARE_DYNAMIC_CLASS(wxMenuItem) +}; + +#endif // _WX_GTKMENUITEM_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/minifram.h b/wxmsw/include/wx-3.0/wx/gtk/minifram.h new file mode 100644 index 00000000..748f266a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/minifram.h @@ -0,0 +1,63 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/minifram.h +// Purpose: wxMiniFrame class +// Author: Robert Roebling +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_MINIFRAME_H_ +#define _WX_GTK_MINIFRAME_H_ + +#include "wx/bitmap.h" +#include "wx/frame.h" + +//----------------------------------------------------------------------------- +// wxMiniFrame +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMiniFrame: public wxFrame +{ + DECLARE_DYNAMIC_CLASS(wxMiniFrame) + +public: + wxMiniFrame() {} + wxMiniFrame(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCAPTION | wxRESIZE_BORDER, + const wxString& name = wxFrameNameStr) + { + Create(parent, id, title, pos, size, style, name); + } + ~wxMiniFrame(); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCAPTION | wxRESIZE_BORDER, + const wxString& name = wxFrameNameStr); + + virtual void SetTitle( const wxString &title ); + +protected: + virtual void DoSetSizeHints( int minW, int minH, + int maxW, int maxH, + int incW, int incH ); + virtual void DoGetClientSize(int* width, int* height) const; + + // implementation +public: + bool m_isDragging; + int m_oldX,m_oldY; + int m_diffX,m_diffY; + wxBitmap m_closeButton; + int m_miniEdge; + int m_miniTitle; +}; + +#endif // _WX_GTK_MINIFRAME_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/msgdlg.h b/wxmsw/include/wx-3.0/wx/gtk/msgdlg.h new file mode 100644 index 00000000..670d7f97 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/msgdlg.h @@ -0,0 +1,51 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/msgdlg.h +// Purpose: wxMessageDialog for GTK+2 +// Author: Vaclav Slavik +// Modified by: +// Created: 2003/02/28 +// Copyright: (c) Vaclav Slavik, 2003 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_MSGDLG_H_ +#define _WX_GTK_MSGDLG_H_ + +class WXDLLIMPEXP_CORE wxMessageDialog : public wxMessageDialogBase +{ +public: + wxMessageDialog(wxWindow *parent, const wxString& message, + const wxString& caption = wxMessageBoxCaptionStr, + long style = wxOK|wxCENTRE, + const wxPoint& pos = wxDefaultPosition); + + virtual int ShowModal(); + virtual bool Show(bool WXUNUSED(show) = true) { return false; } + +protected: + // implement some base class methods to do nothing to avoid asserts and + // GTK warnings, since this is not a real wxDialog. + virtual void DoSetSize(int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(width), int WXUNUSED(height), + int WXUNUSED(sizeFlags) = wxSIZE_AUTO) {} + virtual void DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(width), int WXUNUSED(height)) {} + // override to convert wx mnemonics to GTK+ ones and handle stock ids + virtual void DoSetCustomLabel(wxString& var, const ButtonLabel& label); + +private: + // override to use stock GTK+ defaults instead of just string ones + virtual wxString GetDefaultYesLabel() const; + virtual wxString GetDefaultNoLabel() const; + virtual wxString GetDefaultOKLabel() const; + virtual wxString GetDefaultCancelLabel() const; + virtual wxString GetDefaultHelpLabel() const; + + // create the real GTK+ dialog: this is done from ShowModal() to allow + // changing the message between constructing the dialog and showing it + void GTKCreateMsgDialog(); + + DECLARE_DYNAMIC_CLASS(wxMessageDialog) +}; + +#endif // _WX_GTK_MSGDLG_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/nonownedwnd.h b/wxmsw/include/wx-3.0/wx/gtk/nonownedwnd.h new file mode 100644 index 00000000..70e853c1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/nonownedwnd.h @@ -0,0 +1,43 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/nonownedwnd.h +// Purpose: wxGTK-specific wxNonOwnedWindow declaration. +// Author: Vadim Zeitlin +// Created: 2011-10-12 +// Copyright: (c) 2011 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_NONOWNEDWND_H_ +#define _WX_GTK_NONOWNEDWND_H_ + +class wxNonOwnedWindowShapeImpl; + +// ---------------------------------------------------------------------------- +// wxNonOwnedWindow contains code common to wx{Popup,TopLevel}Window in wxGTK. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxNonOwnedWindow : public wxNonOwnedWindowBase +{ +public: + wxNonOwnedWindow() { m_shapeImpl = NULL; } + virtual ~wxNonOwnedWindow(); + + // Overridden to actually set the shape when the window becomes realized. + virtual void GTKHandleRealized(); + +protected: + virtual bool DoClearShape(); + virtual bool DoSetRegionShape(const wxRegion& region); +#if wxUSE_GRAPHICS_CONTEXT + virtual bool DoSetPathShape(const wxGraphicsPath& path); +#endif // wxUSE_GRAPHICS_CONTEXT + + +private: + // If non-NULL, contains information about custom window shape. + wxNonOwnedWindowShapeImpl* m_shapeImpl; + + wxDECLARE_NO_COPY_CLASS(wxNonOwnedWindow); +}; + +#endif // _WX_GTK_NONOWNEDWND_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/notebook.h b/wxmsw/include/wx-3.0/wx/gtk/notebook.h new file mode 100644 index 00000000..6edbb84f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/notebook.h @@ -0,0 +1,144 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/notebook.h +// Purpose: wxNotebook class +// Author: Robert Roebling +// Modified by: +// Copyright: (c) Julian Smart and Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTKNOTEBOOK_H_ +#define _WX_GTKNOTEBOOK_H_ + +//----------------------------------------------------------------------------- +// internal class +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxGtkNotebookPage; + +#include "wx/list.h" +WX_DECLARE_LIST(wxGtkNotebookPage, wxGtkNotebookPagesList); + +//----------------------------------------------------------------------------- +// wxNotebook +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxNotebook : public wxNotebookBase +{ +public: + // default for dynamic class + wxNotebook(); + // the same arguments as for wxControl + wxNotebook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxNotebookNameStr); + // Create() function + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxNotebookNameStr); + // dtor + virtual ~wxNotebook(); + + // accessors + // --------- + + // set the currently selected page, return the index of the previously + // selected one (or wxNOT_FOUND on error) + // NB: this function will _not_ generate wxEVT_NOTEBOOK_PAGE_xxx events + int SetSelection(size_t nPage) { return DoSetSelection(nPage, SetSelection_SendEvent); } + // get the currently selected page + int GetSelection() const; + + // changes selected page without sending events + int ChangeSelection(size_t nPage) { return DoSetSelection(nPage); } + + // set/get the title of a page + bool SetPageText(size_t nPage, const wxString& strText); + wxString GetPageText(size_t nPage) const; + + // sets/returns item's image index in the current image list + int GetPageImage(size_t nPage) const; + bool SetPageImage(size_t nPage, int nImage); + + // control the appearance of the notebook pages + // set the padding between tabs (in pixels) + void SetPadding(const wxSize& padding); + // sets the size of the tabs (assumes all tabs are the same size) + void SetTabSize(const wxSize& sz); + + // geometry + virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const; + virtual int HitTest(const wxPoint& pt, long *flags = NULL) const; + + // operations + // ---------- + // remove all pages + bool DeleteAllPages(); + + // adds a new page to the notebook (it will be deleted by the notebook, + // don't delete it yourself). If bSelect, this page becomes active. + // the same as AddPage(), but adds it at the specified position + bool InsertPage( size_t position, + wxNotebookPage *win, + const wxString& strText, + bool bSelect = false, + int imageId = NO_IMAGE ); + + // handler for tab navigation + // -------------------------- + void OnNavigationKey(wxNavigationKeyEvent& event); + + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // implementation + // -------------- + +#if wxUSE_CONSTRAINTS + void SetConstraintSizes(bool recurse); + bool DoPhase(int phase); +#endif + + // Called by GTK event handler when the current page is definitely changed. + void GTKOnPageChanged(); + + // helper function + wxGtkNotebookPage* GetNotebookPage(int page) const; + + // the additional page data (the pages themselves are in m_pages array) + wxGtkNotebookPagesList m_pagesData; + + // we need to store the old selection since there + // is no other way to know about it at the time + // of the change selection event + int m_oldSelection; + +protected: + // set all page's attributes + virtual void DoApplyWidgetStyle(GtkRcStyle *style); + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + + // remove one page from the notebook but do not destroy it + virtual wxNotebookPage *DoRemovePage(size_t nPage); + + int DoSetSelection(size_t nPage, int flags = 0); + +private: + // the padding set by SetPadding() + int m_padding; + + void Init(); + virtual void AddChildGTK(wxWindowGTK* child); + + DECLARE_DYNAMIC_CLASS(wxNotebook) + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_GTKNOTEBOOK_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/notifmsg.h b/wxmsw/include/wx-3.0/wx/gtk/notifmsg.h new file mode 100644 index 00000000..9135b3ae --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/notifmsg.h @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/notifmsg.h +// Purpose: wxNotificationMessage for wxGTK. +// Author: Vadim Zeitlin +// Created: 2012-07-25 +// Copyright: (c) 2012 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_NOTIFMSG_H_ +#define _WX_GTK_NOTIFMSG_H_ + +typedef struct _NotifyNotification NotifyNotification; + +// ---------------------------------------------------------------------------- +// wxNotificationMessage +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxNotificationMessage : public wxNotificationMessageBase +{ +public: + wxNotificationMessage() { Init(); } + wxNotificationMessage(const wxString& title, + const wxString& message = wxString(), + wxWindow *parent = NULL, + int flags = wxICON_INFORMATION) + : wxNotificationMessageBase(title, message, parent, flags) + { + Init(); + } + + virtual ~wxNotificationMessage(); + + + virtual bool Show(int timeout = Timeout_Auto); + virtual bool Close(); + + // Set the name of the icon to use, overriding the default icon determined + // by the flags. Call with empty string to reset custom icon. + bool GTKSetIconName(const wxString& name); + +private: + void Init() { m_notification = NULL; } + + NotifyNotification* m_notification; + wxString m_iconName; + + wxDECLARE_NO_COPY_CLASS(wxNotificationMessage); +}; + +#endif // _WX_GTK_NOTIFMSG_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/pen.h b/wxmsw/include/wx-3.0/wx/gtk/pen.h new file mode 100644 index 00000000..85aa1027 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/pen.h @@ -0,0 +1,64 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/pen.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_PEN_H_ +#define _WX_GTK_PEN_H_ + +typedef signed char wxGTKDash; + +//----------------------------------------------------------------------------- +// wxPen +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPen: public wxPenBase +{ +public: + wxPen() { } + + wxPen( const wxColour &colour, int width = 1, wxPenStyle style = wxPENSTYLE_SOLID ); +#if FUTURE_WXWIN_COMPATIBILITY_3_0 + wxDEPRECATED_FUTURE( wxPen(const wxColour& col, int width, int style) ); +#endif + + virtual ~wxPen(); + + bool operator==(const wxPen& pen) const; + bool operator!=(const wxPen& pen) const { return !(*this == pen); } + + void SetColour( const wxColour &colour ); + void SetColour( unsigned char red, unsigned char green, unsigned char blue ); + void SetCap( wxPenCap capStyle ); + void SetJoin( wxPenJoin joinStyle ); + void SetStyle( wxPenStyle style ); + void SetWidth( int width ); + void SetDashes( int number_of_dashes, const wxDash *dash ); + void SetStipple(const wxBitmap& stipple); + + wxColour GetColour() const; + wxPenCap GetCap() const; + wxPenJoin GetJoin() const; + wxPenStyle GetStyle() const; + int GetWidth() const; + int GetDashes(wxDash **ptr) const; + int GetDashCount() const; + wxDash* GetDash() const; + wxBitmap *GetStipple() const; + +#if FUTURE_WXWIN_COMPATIBILITY_3_0 + wxDEPRECATED_FUTURE( void SetStyle(int style) ) + { SetStyle((wxPenStyle)style); } +#endif + +protected: + virtual wxGDIRefData *CreateGDIRefData() const; + virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const; + + DECLARE_DYNAMIC_CLASS(wxPen) +}; + +#endif // _WX_GTK_PEN_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/popupwin.h b/wxmsw/include/wx-3.0/wx/gtk/popupwin.h new file mode 100644 index 00000000..1c848795 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/popupwin.h @@ -0,0 +1,50 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/popupwin.h +// Purpose: +// Author: Robert Roebling +// Created: +// Copyright: (c) 2001 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_POPUPWIN_H_ +#define _WX_GTK_POPUPWIN_H_ + +//----------------------------------------------------------------------------- +// wxPopUpWindow +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPopupWindow: public wxPopupWindowBase +{ +public: + wxPopupWindow() { } + virtual ~wxPopupWindow(); + + wxPopupWindow(wxWindow *parent, int flags = wxBORDER_NONE) + { (void)Create(parent, flags); } + bool Create(wxWindow *parent, int flags = wxBORDER_NONE); + + virtual bool Show(bool show = true); + + virtual void SetFocus(); + + // implementation + // -------------- + + // GTK time when connecting to button_press signal + wxUint32 m_time; + +protected: + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + + virtual void DoMoveWindow(int x, int y, int width, int height); + +#ifdef __WXUNIVERSAL__ + DECLARE_EVENT_TABLE() +#endif + DECLARE_DYNAMIC_CLASS(wxPopupWindow) +}; + +#endif // _WX_GTK_POPUPWIN_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/print.h b/wxmsw/include/wx-3.0/wx/gtk/print.h new file mode 100644 index 00000000..e4eae1ce --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/print.h @@ -0,0 +1,354 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/print.h +// Author: Anthony Bretaudeau +// Purpose: GTK printing support +// Created: 2007-08-25 +// Copyright: (c) Anthony Bretaudeau +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_PRINT_H_ +#define _WX_GTK_PRINT_H_ + +#include "wx/defs.h" + +#if wxUSE_GTKPRINT + +#include "wx/print.h" +#include "wx/printdlg.h" +#include "wx/prntbase.h" +#include "wx/dc.h" + +typedef struct _GtkPrintOperation GtkPrintOperation; +typedef struct _GtkPrintContext GtkPrintContext; +typedef struct _GtkPrintSettings GtkPrintSettings; +typedef struct _GtkPageSetup GtkPageSetup; + +typedef struct _cairo cairo_t; + +//---------------------------------------------------------------------------- +// wxGtkPrintFactory +//---------------------------------------------------------------------------- + +class wxGtkPrintFactory: public wxPrintFactory +{ +public: + virtual wxPrinterBase *CreatePrinter( wxPrintDialogData *data ); + + virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview, + wxPrintout *printout = NULL, + wxPrintDialogData *data = NULL ); + virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview, + wxPrintout *printout, + wxPrintData *data ); + + virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent, + wxPrintDialogData *data = NULL ); + virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent, + wxPrintData *data ); + + virtual wxPageSetupDialogBase *CreatePageSetupDialog( wxWindow *parent, + wxPageSetupDialogData * data = NULL ); + + virtual wxDCImpl* CreatePrinterDCImpl( wxPrinterDC *owner, const wxPrintData& data ); + + virtual bool HasPrintSetupDialog(); + virtual wxDialog *CreatePrintSetupDialog( wxWindow *parent, wxPrintData *data ); + virtual bool HasOwnPrintToFile(); + virtual bool HasPrinterLine(); + virtual wxString CreatePrinterLine(); + virtual bool HasStatusLine(); + virtual wxString CreateStatusLine(); + + virtual wxPrintNativeDataBase *CreatePrintNativeData(); +}; + +//---------------------------------------------------------------------------- +// wxGtkPrintDialog +//---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGtkPrintDialog: public wxPrintDialogBase +{ +public: + wxGtkPrintDialog( wxWindow *parent, + wxPrintDialogData* data = NULL ); + wxGtkPrintDialog( wxWindow *parent, wxPrintData* data); + virtual ~wxGtkPrintDialog(); + + wxPrintData& GetPrintData() + { return m_printDialogData.GetPrintData(); } + wxPrintDialogData& GetPrintDialogData() + { return m_printDialogData; } + + wxDC *GetPrintDC() { return m_dc; } + void SetPrintDC(wxDC * printDC) { m_dc = printDC; } + + virtual int ShowModal(); + + virtual bool Validate() { return true; } + virtual bool TransferDataToWindow() { return true; } + virtual bool TransferDataFromWindow() { return true; } + + void SetShowDialog(bool show) { m_showDialog = show; } + bool GetShowDialog() { return m_showDialog; } + +protected: + // Implement some base class methods to do nothing to avoid asserts and + // GTK warnings, since this is not a real wxDialog. + virtual void DoSetSize(int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(width), int WXUNUSED(height), + int WXUNUSED(sizeFlags) = wxSIZE_AUTO) {} + virtual void DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(width), int WXUNUSED(height)) {} + +private: + wxPrintDialogData m_printDialogData; + wxWindow *m_parent; + bool m_showDialog; + wxDC *m_dc; + + DECLARE_DYNAMIC_CLASS(wxGtkPrintDialog) +}; + +//---------------------------------------------------------------------------- +// wxGtkPageSetupDialog +//---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGtkPageSetupDialog: public wxPageSetupDialogBase +{ +public: + wxGtkPageSetupDialog( wxWindow *parent, + wxPageSetupDialogData* data = NULL ); + virtual ~wxGtkPageSetupDialog(); + + virtual wxPageSetupDialogData& GetPageSetupDialogData() { return m_pageDialogData; } + + virtual int ShowModal(); + + virtual bool Validate() { return true; } + virtual bool TransferDataToWindow() { return true; } + virtual bool TransferDataFromWindow() { return true; } + +protected: + // Implement some base class methods to do nothing to avoid asserts and + // GTK warnings, since this is not a real wxDialog. + virtual void DoSetSize(int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(width), int WXUNUSED(height), + int WXUNUSED(sizeFlags) = wxSIZE_AUTO) {} + virtual void DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(width), int WXUNUSED(height)) {} + +private: + wxPageSetupDialogData m_pageDialogData; + wxWindow *m_parent; + + DECLARE_DYNAMIC_CLASS(wxGtkPageSetupDialog) +}; + +//---------------------------------------------------------------------------- +// wxGtkPrinter +//---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGtkPrinter : public wxPrinterBase +{ +public: + wxGtkPrinter(wxPrintDialogData *data = NULL); + virtual ~wxGtkPrinter(); + + virtual bool Print(wxWindow *parent, + wxPrintout *printout, + bool prompt = true); + virtual wxDC* PrintDialog(wxWindow *parent); + virtual bool Setup(wxWindow *parent); + + GtkPrintContext *GetPrintContext() { return m_gpc; } + void SetPrintContext(GtkPrintContext *context) {m_gpc = context;} + void BeginPrint(wxPrintout *printout, GtkPrintOperation *operation, GtkPrintContext *context); + void DrawPage(wxPrintout *printout, GtkPrintOperation *operation, GtkPrintContext *context, int page_nr); + +private: + GtkPrintContext *m_gpc; + wxDC *m_dc; + + DECLARE_DYNAMIC_CLASS(wxGtkPrinter) + wxDECLARE_NO_COPY_CLASS(wxGtkPrinter); +}; + +//---------------------------------------------------------------------------- +// wxGtkPrintNativeData +//---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGtkPrintNativeData : public wxPrintNativeDataBase +{ +public: + wxGtkPrintNativeData(); + virtual ~wxGtkPrintNativeData(); + + virtual bool TransferTo( wxPrintData &data ); + virtual bool TransferFrom( const wxPrintData &data ); + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const { return true; } + + GtkPrintSettings* GetPrintConfig() { return m_config; } + void SetPrintConfig( GtkPrintSettings * config ); + + GtkPrintOperation* GetPrintJob() { return m_job; } + void SetPrintJob(GtkPrintOperation *job) { m_job = job; } + + GtkPrintContext *GetPrintContext() { return m_context; } + void SetPrintContext(GtkPrintContext *context) {m_context = context; } + + + GtkPageSetup* GetPageSetupFromSettings(GtkPrintSettings* settings); + void SetPageSetupToSettings(GtkPrintSettings* settings, GtkPageSetup* page_setup); + +private: + // NB: m_config is created and owned by us, but the other objects are not + // and their accessors don't change their ref count. + GtkPrintSettings *m_config; + GtkPrintOperation *m_job; + GtkPrintContext *m_context; + + DECLARE_DYNAMIC_CLASS(wxGtkPrintNativeData) +}; + +//----------------------------------------------------------------------------- +// wxGtkPrinterDC +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGtkPrinterDCImpl : public wxDCImpl +{ +public: + wxGtkPrinterDCImpl( wxPrinterDC *owner, const wxPrintData& data ); + virtual ~wxGtkPrinterDCImpl(); + + bool Ok() const { return IsOk(); } + bool IsOk() const; + + virtual void* GetCairoContext() const; + virtual void* GetHandle() const; + + bool CanDrawBitmap() const { return true; } + void Clear(); + void SetFont( const wxFont& font ); + void SetPen( const wxPen& pen ); + void SetBrush( const wxBrush& brush ); + void SetLogicalFunction( wxRasterOperationMode function ); + void SetBackground( const wxBrush& brush ); + void DestroyClippingRegion(); + bool StartDoc(const wxString& message); + void EndDoc(); + void StartPage(); + void EndPage(); + wxCoord GetCharHeight() const; + wxCoord GetCharWidth() const; + bool CanGetTextExtent() const { return true; } + wxSize GetPPI() const; + virtual int GetDepth() const { return 24; } + void SetBackgroundMode(int mode); + void SetPalette(const wxPalette& WXUNUSED(palette)) { } + void SetResolution(int ppi); + + // overridden for wxPrinterDC Impl + virtual int GetResolution() const; + virtual wxRect GetPaperRect() const; + +protected: + bool DoFloodFill(wxCoord x1, wxCoord y1, const wxColour &col, + wxFloodFillStyle style=wxFLOOD_SURFACE ); + void DoGradientFillConcentric(const wxRect& rect, const wxColour& initialColour, const wxColour& destColour, const wxPoint& circleCenter); + void DoGradientFillLinear(const wxRect& rect, const wxColour& initialColour, const wxColour& destColour, wxDirection nDirection = wxEAST); + bool DoGetPixel(wxCoord x1, wxCoord y1, wxColour *col) const; + void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2); + void DoCrossHair(wxCoord x, wxCoord y); + void DoDrawArc(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2,wxCoord xc,wxCoord yc); + void DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea); + void DoDrawPoint(wxCoord x, wxCoord y); + void DoDrawLines(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0); + void DoDrawPolygon(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle=wxODDEVEN_RULE); + void DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle=wxODDEVEN_RULE); + void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height); + void DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius = 20.0); + void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height); +#if wxUSE_SPLINES + void DoDrawSpline(const wxPointList *points); +#endif + bool DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, + wxDC *source, wxCoord xsrc, wxCoord ysrc, + wxRasterOperationMode rop = wxCOPY, bool useMask = false, + wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord); + void DoDrawIcon( const wxIcon& icon, wxCoord x, wxCoord y ); + void DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y, bool useMask = false ); + void DoDrawText(const wxString& text, wxCoord x, wxCoord y ); + void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle); + void DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height); + void DoSetDeviceClippingRegion( const wxRegion &WXUNUSED(clip) ) + { + wxFAIL_MSG( "not implemented" ); + } + void DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + const wxFont *theFont = NULL ) const; + void DoGetSize(int* width, int* height) const; + void DoGetSizeMM(int *width, int *height) const; + + wxPrintData& GetPrintData() { return m_printData; } + void SetPrintData(const wxPrintData& data); + +private: + wxPrintData m_printData; + PangoContext *m_context; + PangoLayout *m_layout; + PangoFontDescription *m_fontdesc; + cairo_t *m_cairo; + + unsigned char m_currentRed; + unsigned char m_currentGreen; + unsigned char m_currentBlue; + unsigned char m_currentAlpha; + + GtkPrintContext *m_gpc; + int m_resolution; + double m_PS2DEV; + double m_DEV2PS; + + DECLARE_DYNAMIC_CLASS(wxGtkPrinterDCImpl) + wxDECLARE_NO_COPY_CLASS(wxGtkPrinterDCImpl); +}; + +// ---------------------------------------------------------------------------- +// wxGtkPrintPreview: programmer creates an object of this class to preview a +// wxPrintout. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGtkPrintPreview : public wxPrintPreviewBase +{ +public: + wxGtkPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting = NULL, + wxPrintDialogData *data = NULL); + wxGtkPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintData *data); + + virtual ~wxGtkPrintPreview(); + + virtual bool Print(bool interactive); + virtual void DetermineScaling(); + +private: + void Init(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintData *data); + + // resolution to use in DPI + int m_resolution; + + DECLARE_CLASS(wxGtkPrintPreview) +}; + +#endif // wxUSE_GTKPRINT + +#endif // _WX_GTK_PRINT_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/radiobox.h b/wxmsw/include/wx-3.0/wx/gtk/radiobox.h new file mode 100644 index 00000000..a7f6bd91 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/radiobox.h @@ -0,0 +1,153 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/radiobox.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_RADIOBOX_H_ +#define _WX_GTK_RADIOBOX_H_ + +#include "wx/bitmap.h" + +class WXDLLIMPEXP_FWD_CORE wxGTKRadioButtonInfo; + +#include "wx/list.h" + +WX_DECLARE_EXPORTED_LIST(wxGTKRadioButtonInfo, wxRadioBoxButtonsInfoList); + + +//----------------------------------------------------------------------------- +// wxRadioBox +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxRadioBox : public wxControl, + public wxRadioBoxBase +{ +public: + // ctors and dtor + wxRadioBox() { } + wxRadioBox(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, + const wxString choices[] = (const wxString *) NULL, + int majorDim = 0, + long style = wxRA_SPECIFY_COLS, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxRadioBoxNameStr) + { + Create( parent, id, title, pos, size, n, choices, majorDim, style, val, name ); + } + + wxRadioBox(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + int majorDim = 0, + long style = wxRA_SPECIFY_COLS, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxRadioBoxNameStr) + { + Create( parent, id, title, pos, size, choices, majorDim, style, val, name ); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, + const wxString choices[] = (const wxString *) NULL, + int majorDim = 0, + long style = wxRA_SPECIFY_COLS, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxRadioBoxNameStr); + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + int majorDim = 0, + long style = wxRA_SPECIFY_COLS, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxRadioBoxNameStr); + + virtual ~wxRadioBox(); + + + // implement wxItemContainerImmutable methods + virtual unsigned int GetCount() const; + + virtual wxString GetString(unsigned int n) const; + virtual void SetString(unsigned int n, const wxString& s); + + virtual void SetSelection(int n); + virtual int GetSelection() const; + + + // implement wxRadioBoxBase methods + virtual bool Show(unsigned int n, bool show = true); + virtual bool Enable(unsigned int n, bool enable = true); + + virtual bool IsItemEnabled(unsigned int n) const; + virtual bool IsItemShown(unsigned int n) const; + + + // override some base class methods to operate on radiobox itself too + virtual bool Show( bool show = true ); + virtual bool Enable( bool enable = true ); + + virtual void SetLabel( const wxString& label ); + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + virtual int GetItemFromPoint( const wxPoint& pt ) const; +#if wxUSE_HELP + // override virtual wxWindow::GetHelpTextAtPoint to use common platform independent + // wxRadioBoxBase::DoGetHelpTextAtPoint from the platform independent + // base class-interface wxRadioBoxBase. + virtual wxString GetHelpTextAtPoint(const wxPoint & pt, wxHelpEvent::Origin origin) const + { + return wxRadioBoxBase::DoGetHelpTextAtPoint( this, pt, origin ); + } +#endif // wxUSE_HELP + + // implementation + // -------------- + + void GtkDisableEvents(); + void GtkEnableEvents(); +#if wxUSE_TOOLTIPS + virtual void GTKApplyToolTip(const char* tip); +#endif // wxUSE_TOOLTIPS + + wxRadioBoxButtonsInfoList m_buttonsInfo; + +protected: + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + +#if wxUSE_TOOLTIPS + virtual void DoSetItemToolTip(unsigned int n, wxToolTip *tooltip); +#endif + + virtual void DoApplyWidgetStyle(GtkRcStyle *style); + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + + virtual bool GTKNeedsToFilterSameWindowFocus() const { return true; } + + virtual bool GTKWidgetNeedsMnemonic() const; + virtual void GTKWidgetDoSetMnemonic(GtkWidget* w); + +private: + DECLARE_DYNAMIC_CLASS(wxRadioBox) +}; + +#endif // _WX_GTK_RADIOBOX_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/radiobut.h b/wxmsw/include/wx-3.0/wx/gtk/radiobut.h new file mode 100644 index 00000000..165370aa --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/radiobut.h @@ -0,0 +1,61 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/radiobut.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_RADIOBUT_H_ +#define _WX_GTK_RADIOBUT_H_ + +//----------------------------------------------------------------------------- +// wxRadioButton +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxRadioButton: public wxControl +{ +public: + wxRadioButton() { } + wxRadioButton( wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRadioButtonNameStr ) + { + Create( parent, id, label, pos, size, style, validator, name ); + } + + bool Create( wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRadioButtonNameStr ); + + virtual void SetLabel(const wxString& label); + virtual void SetValue(bool val); + virtual bool GetValue() const; + virtual bool Enable( bool enable = true ); + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + +protected: + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + virtual void DoApplyWidgetStyle(GtkRcStyle *style); + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + +private: + typedef wxControl base_type; + + DECLARE_DYNAMIC_CLASS(wxRadioButton) +}; + +#endif // _WX_GTK_RADIOBUT_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/region.h b/wxmsw/include/wx-3.0/wx/gtk/region.h new file mode 100644 index 00000000..a2231a19 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/region.h @@ -0,0 +1,138 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/region.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_REGION_H_ +#define _WX_GTK_REGION_H_ + +#ifdef __WXGTK3__ +typedef struct _cairo_region cairo_region_t; +#endif + +// ---------------------------------------------------------------------------- +// wxRegion +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxRegion : public wxRegionBase +{ +public: + wxRegion() { } + + wxRegion( wxCoord x, wxCoord y, wxCoord w, wxCoord h ) + { + InitRect(x, y, w, h); + } + + wxRegion( const wxPoint& topLeft, const wxPoint& bottomRight ) + { + InitRect(topLeft.x, topLeft.y, + bottomRight.x - topLeft.x, bottomRight.y - topLeft.y); + } + + wxRegion( const wxRect& rect ) + { + InitRect(rect.x, rect.y, rect.width, rect.height); + } + + wxRegion( size_t n, const wxPoint *points, + wxPolygonFillMode fillStyle = wxODDEVEN_RULE ); + +#if wxUSE_IMAGE + wxRegion( const wxBitmap& bmp) + { + Union(bmp); + } + wxRegion( const wxBitmap& bmp, + const wxColour& transColour, int tolerance = 0) + { + Union(bmp, transColour, tolerance); + } +#endif // wxUSE_IMAGE + + virtual ~wxRegion(); + + // wxRegionBase methods + virtual void Clear(); + virtual bool IsEmpty() const; + +#ifdef __WXGTK3__ + cairo_region_t* GetRegion() const; +#else + wxRegion(const GdkRegion* region); + GdkRegion *GetRegion() const; +#endif + +protected: + virtual wxGDIRefData *CreateGDIRefData() const; + virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const; + + // wxRegionBase pure virtuals + virtual bool DoIsEqual(const wxRegion& region) const; + virtual bool DoGetBox(wxCoord& x, wxCoord& y, wxCoord& w, wxCoord& h) const; + virtual wxRegionContain DoContainsPoint(wxCoord x, wxCoord y) const; + virtual wxRegionContain DoContainsRect(const wxRect& rect) const; + + virtual bool DoOffset(wxCoord x, wxCoord y); + virtual bool DoUnionWithRect(const wxRect& rect); + virtual bool DoUnionWithRegion(const wxRegion& region); + virtual bool DoIntersect(const wxRegion& region); + virtual bool DoSubtract(const wxRegion& region); + virtual bool DoXor(const wxRegion& region); + + // common part of ctors for a rectangle region + void InitRect(wxCoord x, wxCoord y, wxCoord w, wxCoord h); + +private: + DECLARE_DYNAMIC_CLASS(wxRegion) +}; + +// ---------------------------------------------------------------------------- +// wxRegionIterator: decomposes a region into rectangles +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxRegionIterator: public wxObject +{ +public: + wxRegionIterator(); + wxRegionIterator(const wxRegion& region); + wxRegionIterator(const wxRegionIterator& ri) : wxObject(ri) { Init(); *this = ri; } + ~wxRegionIterator(); + + wxRegionIterator& operator=(const wxRegionIterator& ri); + + void Reset() { m_current = 0u; } + void Reset(const wxRegion& region); + + bool HaveRects() const; + operator bool () const { return HaveRects(); } + + wxRegionIterator& operator ++ (); + wxRegionIterator operator ++ (int); + + wxCoord GetX() const; + wxCoord GetY() const; + wxCoord GetW() const; + wxCoord GetWidth() const { return GetW(); } + wxCoord GetH() const; + wxCoord GetHeight() const { return GetH(); } + wxRect GetRect() const; + +private: + void Init(); + void CreateRects( const wxRegion& r ); + + wxRegion m_region; + wxRect *m_rects; + int m_numRects; + int m_current; + + DECLARE_DYNAMIC_CLASS(wxRegionIterator) +}; + + +#endif + // _WX_GTK_REGION_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/scrolbar.h b/wxmsw/include/wx-3.0/wx/gtk/scrolbar.h new file mode 100644 index 00000000..e49bb7a2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/scrolbar.h @@ -0,0 +1,54 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/scrolbar.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_SCROLLBAR_H_ +#define _WX_GTK_SCROLLBAR_H_ + +//----------------------------------------------------------------------------- +// wxScrollBar +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxScrollBar: public wxScrollBarBase +{ +public: + wxScrollBar(); + inline wxScrollBar( wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSB_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxScrollBarNameStr ) + { + Create( parent, id, pos, size, style, validator, name ); + } + bool Create( wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSB_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxScrollBarNameStr ); + virtual ~wxScrollBar(); + int GetThumbPosition() const; + int GetThumbSize() const; + int GetPageSize() const; + int GetRange() const; + virtual void SetThumbPosition( int viewStart ); + virtual void SetScrollbar( int position, int thumbSize, int range, int pageSize, + bool refresh = true ); + + void SetThumbSize(int thumbSize); + void SetPageSize( int pageLength ); + void SetRange(int range); + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + DECLARE_DYNAMIC_CLASS(wxScrollBar) +}; + +#endif // _WX_GTK_SCROLLBAR_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/scrolwin.h b/wxmsw/include/wx-3.0/wx/gtk/scrolwin.h new file mode 100644 index 00000000..c36040ce --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/scrolwin.h @@ -0,0 +1,79 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/scrolwin.h +// Purpose: wxScrolledWindow class +// Author: Robert Roebling +// Modified by: Vadim Zeitlin (2005-10-10): wxScrolledWindow is now common +// Created: 01/02/97 +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_SCROLLWIN_H_ +#define _WX_GTK_SCROLLWIN_H_ + +// ---------------------------------------------------------------------------- +// wxScrolledWindow +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxScrollHelper : public wxScrollHelperBase +{ + typedef wxScrollHelperBase base_type; +public: + // default ctor doesn't do anything + wxScrollHelper(wxWindow *win) : wxScrollHelperBase(win) { } + + // implement the base class methods + virtual void SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY, + int noUnitsX, int noUnitsY, + int xPos = 0, int yPos = 0, + bool noRefresh = false); + virtual void AdjustScrollbars(); + + virtual bool IsScrollbarShown(int orient) const; + +protected: + virtual void DoScroll(int x, int y); + virtual void DoShowScrollbars(wxScrollbarVisibility horz, + wxScrollbarVisibility vert); + +private: + // this does (each) half of AdjustScrollbars() work + void DoAdjustScrollbar(GtkRange* range, + int pixelsPerLine, + int winSize, + int virtSize, + int *pos, + int *lines, + int *linesPerPage); + + void DoAdjustHScrollbar(int winSize, int virtSize) + { + DoAdjustScrollbar + ( + m_win->m_scrollBar[wxWindow::ScrollDir_Horz], + m_xScrollPixelsPerLine, winSize, virtSize, + &m_xScrollPosition, &m_xScrollLines, &m_xScrollLinesPerPage + ); + } + + void DoAdjustVScrollbar(int winSize, int virtSize) + { + DoAdjustScrollbar + ( + m_win->m_scrollBar[wxWindow::ScrollDir_Vert], + m_yScrollPixelsPerLine, winSize, virtSize, + &m_yScrollPosition, &m_yScrollLines, &m_yScrollLinesPerPage + ); + } + + // and this does the same for Scroll() + void DoScrollOneDir(int orient, + int pos, + int pixelsPerLine, + int *posOld); + + wxDECLARE_NO_COPY_CLASS(wxScrollHelper); +}; + +#endif // _WX_GTK_SCROLLWIN_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/slider.h b/wxmsw/include/wx-3.0/wx/gtk/slider.h new file mode 100644 index 00000000..f8833c46 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/slider.h @@ -0,0 +1,84 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/slider.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_SLIDER_H_ +#define _WX_GTK_SLIDER_H_ + +// ---------------------------------------------------------------------------- +// wxSlider +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSlider : public wxSliderBase +{ +public: + wxSlider(); + wxSlider(wxWindow *parent, + wxWindowID id, + int value, int minValue, int maxValue, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSL_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSliderNameStr) + { + Create( parent, id, value, minValue, maxValue, + pos, size, style, validator, name ); + } + ~wxSlider(); + + bool Create(wxWindow *parent, + wxWindowID id, + int value, int minValue, int maxValue, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSL_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSliderNameStr); + + // implement the base class pure virtuals + virtual int GetValue() const; + virtual void SetValue(int value); + + virtual void SetRange(int minValue, int maxValue); + virtual int GetMin() const; + virtual int GetMax() const; + + virtual void SetLineSize(int lineSize); + virtual void SetPageSize(int pageSize); + virtual int GetLineSize() const; + virtual int GetPageSize() const; + + virtual void SetThumbLength(int lenPixels); + virtual int GetThumbLength() const; + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // implementation + void GTKDisableEvents(); + void GTKEnableEvents(); + bool GTKEventsDisabled() const; + + double m_pos; + int m_scrollEventType; + bool m_needThumbRelease; + GtkWidget *m_scale; + +protected: + GtkWidget *m_minLabel,*m_maxLabel; + bool m_blockScrollEvent; + + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + + // set the slider value unconditionally + void GTKSetValue(int value); + + DECLARE_DYNAMIC_CLASS(wxSlider) +}; + +#endif // _WX_GTK_SLIDER_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/spinbutt.h b/wxmsw/include/wx-3.0/wx/gtk/spinbutt.h new file mode 100644 index 00000000..4bd71f47 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/spinbutt.h @@ -0,0 +1,65 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/spinbutt.h +// Purpose: wxSpinButton class +// Author: Robert Roebling +// Modified by: +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_SPINBUTT_H_ +#define _WX_GTK_SPINBUTT_H_ + +//----------------------------------------------------------------------------- +// wxSpinButton +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSpinButton : public wxSpinButtonBase +{ +public: + wxSpinButton(); + wxSpinButton(wxWindow *parent, + wxWindowID id = -1, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_VERTICAL, + const wxString& name = wxSPIN_BUTTON_NAME) + { + Create(parent, id, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id = -1, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_VERTICAL, + const wxString& name = wxSPIN_BUTTON_NAME); + + virtual int GetValue() const; + virtual void SetValue( int value ); + virtual void SetRange( int minVal, int maxVal ); + virtual int GetMin() const; + virtual int GetMax() const; + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + virtual bool Enable( bool enable = true ); + + // implementation + int m_pos; + +protected: + void GtkDisableEvents() const; + void GtkEnableEvents() const; + + virtual wxSize DoGetBestSize() const; + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + +private: + typedef wxSpinButtonBase base_type; + + DECLARE_DYNAMIC_CLASS(wxSpinButton) +}; + +#endif // _WX_GTK_SPINBUTT_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/spinctrl.h b/wxmsw/include/wx-3.0/wx/gtk/spinctrl.h new file mode 100644 index 00000000..ef7b6edb --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/spinctrl.h @@ -0,0 +1,205 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/spinctrl.h +// Purpose: wxSpinCtrl class +// Author: Robert Roebling +// Modified by: +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_SPINCTRL_H_ +#define _WX_GTK_SPINCTRL_H_ + +//----------------------------------------------------------------------------- +// wxSpinCtrlGTKBase - Base class for GTK versions of the wxSpinCtrl[Double] +// +// This class manages a double valued GTK spinctrl through the DoGet/SetXXX +// functions that are made public as Get/SetXXX functions for int or double +// for the wxSpinCtrl and wxSpinCtrlDouble classes respectively to avoid +// function ambiguity. +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSpinCtrlGTKBase : public wxSpinCtrlBase +{ +public: + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + long style, + double min, double max, double initial, + double inc, + const wxString& name); + + // wxSpinCtrl(Double) methods call DoXXX functions of the same name + + // accessors + // T GetValue() const + // T GetMin() const + // T GetMax() const + // T GetIncrement() const + virtual bool GetSnapToTicks() const; + + // operations + virtual void SetValue(const wxString& value); + // void SetValue(T val) + // void SetRange(T minVal, T maxVal) + // void SetIncrement(T inc) + void SetSnapToTicks( bool snap_to_ticks ); + + // Select text in the textctrl + void SetSelection(long from, long to); + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // implementation + void OnChar( wxKeyEvent &event ); + +protected: + double DoGetValue() const; + double DoGetMin() const; + double DoGetMax() const; + double DoGetIncrement() const; + + void DoSetValue(double val); + void DoSetValue(const wxString& strValue); + void DoSetRange(double min_val, double max_val); + void DoSetIncrement(double inc); + + void GtkDisableEvents() const; + void GtkEnableEvents() const; + + virtual wxSize DoGetBestSize() const; + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + + // Widgets that use the style->base colour for the BG colour should + // override this and return true. + virtual bool UseGTKStyleBase() const { return true; } + + friend class wxSpinCtrlEventDisabler; + + DECLARE_EVENT_TABLE() +}; + +//----------------------------------------------------------------------------- +// wxSpinCtrl - An integer valued spin control +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSpinCtrl : public wxSpinCtrlGTKBase +{ +public: + wxSpinCtrl() { Init(); } + wxSpinCtrl(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT, + int min = 0, int max = 100, int initial = 0, + const wxString& name = wxS("wxSpinCtrl")) + { + Init(); + + Create(parent, id, value, pos, size, style, min, max, initial, name); + } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT, + int min = 0, int max = 100, int initial = 0, + const wxString& name = wxS("wxSpinCtrl")) + { + return wxSpinCtrlGTKBase::Create(parent, id, value, pos, size, + style, min, max, initial, 1, name); + } + + // accessors + int GetValue() const { return int(DoGetValue()); } + int GetMin() const { return int(DoGetMin()); } + int GetMax() const { return int(DoGetMax()); } + int GetIncrement() const { return int(DoGetIncrement()); } + + // operations + void SetValue(const wxString& value) { wxSpinCtrlGTKBase::SetValue(value); } // visibility problem w/ gcc + void SetValue( int value ) { DoSetValue(value); } + void SetRange( int minVal, int maxVal ) { DoSetRange(minVal, maxVal); } + void SetIncrement(int inc) { DoSetIncrement(inc); } + + virtual int GetBase() const { return m_base; } + virtual bool SetBase(int base); + +private: + // Common part of all ctors. + void Init() + { + m_base = 10; + } + + int m_base; + + DECLARE_DYNAMIC_CLASS(wxSpinCtrl) +}; + +//----------------------------------------------------------------------------- +// wxSpinCtrlDouble - a double valued spin control +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSpinCtrlDouble : public wxSpinCtrlGTKBase +{ +public: + wxSpinCtrlDouble() {} + wxSpinCtrlDouble(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT, + double min = 0, double max = 100, double initial = 0, + double inc = 1, + const wxString& name = wxS("wxSpinCtrlDouble")) + { + Create(parent, id, value, pos, size, style, + min, max, initial, inc, name); + } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT, + double min = 0, double max = 100, double initial = 0, + double inc = 1, + const wxString& name = wxS("wxSpinCtrlDouble")) + { + return wxSpinCtrlGTKBase::Create(parent, id, value, pos, size, + style, min, max, initial, inc, name); + } + + // accessors + double GetValue() const { return DoGetValue(); } + double GetMin() const { return DoGetMin(); } + double GetMax() const { return DoGetMax(); } + double GetIncrement() const { return DoGetIncrement(); } + unsigned GetDigits() const; + + // operations + void SetValue(const wxString& value) { wxSpinCtrlGTKBase::SetValue(value); } // visibility problem w/ gcc + void SetValue(double value) { DoSetValue(value); } + void SetRange(double minVal, double maxVal) { DoSetRange(minVal, maxVal); } + void SetIncrement(double inc) { DoSetIncrement(inc); } + void SetDigits(unsigned digits); + + virtual int GetBase() const { return 10; } + virtual bool SetBase(int WXUNUSED(base)) { return false; } + + DECLARE_DYNAMIC_CLASS(wxSpinCtrlDouble) +}; + +#endif // _WX_GTK_SPINCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/statbmp.h b/wxmsw/include/wx-3.0/wx/gtk/statbmp.h new file mode 100644 index 00000000..b7bba950 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/statbmp.h @@ -0,0 +1,58 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/statbmp.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __GTKSTATICBITMAPH__ +#define __GTKSTATICBITMAPH__ + +#include "wx/icon.h" + +//----------------------------------------------------------------------------- +// wxStaticBitmap +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxStaticBitmap : public wxStaticBitmapBase +{ +public: + wxStaticBitmap(); + wxStaticBitmap( wxWindow *parent, + wxWindowID id, + const wxBitmap& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticBitmapNameStr ); + bool Create( wxWindow *parent, + wxWindowID id, + const wxBitmap& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticBitmapNameStr); + + virtual void SetIcon(const wxIcon& icon) { SetBitmap( icon ); } + virtual void SetBitmap( const wxBitmap& bitmap ); + virtual wxBitmap GetBitmap() const { return m_bitmap; } + + // for compatibility with wxMSW + wxIcon GetIcon() const + { + // don't use wxDynamicCast, icons and bitmaps are really the same thing + // in wxGTK + return (const wxIcon &)m_bitmap; + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + +private: + wxBitmap m_bitmap; + + DECLARE_DYNAMIC_CLASS(wxStaticBitmap) +}; + +#endif // __GTKSTATICBITMAPH__ diff --git a/wxmsw/include/wx-3.0/wx/gtk/statbox.h b/wxmsw/include/wx-3.0/wx/gtk/statbox.h new file mode 100644 index 00000000..80dbb7f5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/statbox.h @@ -0,0 +1,57 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/statbox.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTKSTATICBOX_H_ +#define _WX_GTKSTATICBOX_H_ + +//----------------------------------------------------------------------------- +// wxStaticBox +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxStaticBox : public wxStaticBoxBase +{ +public: + wxStaticBox(); + wxStaticBox( wxWindow *parent, + wxWindowID id, + const wxString &label, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = 0, + const wxString &name = wxStaticBoxNameStr ); + bool Create( wxWindow *parent, + wxWindowID id, + const wxString &label, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = 0, + const wxString &name = wxStaticBoxNameStr ); + + virtual void SetLabel( const wxString &label ); + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // implementation + + virtual bool GTKIsTransparentForMouse() const { return true; } + + virtual void GetBordersForSizer(int *borderTop, int *borderOther) const; + + virtual void AddChild( wxWindowBase *child ); + +protected: + virtual bool GTKWidgetNeedsMnemonic() const; + virtual void GTKWidgetDoSetMnemonic(GtkWidget* w); + + void DoApplyWidgetStyle(GtkRcStyle *style); + + DECLARE_DYNAMIC_CLASS(wxStaticBox) +}; + +#endif // _WX_GTKSTATICBOX_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/statline.h b/wxmsw/include/wx-3.0/wx/gtk/statline.h new file mode 100644 index 00000000..aa407767 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/statline.h @@ -0,0 +1,48 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/statline.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __GTKSTATICLINEH__ +#define __GTKSTATICLINEH__ + +#include "wx/defs.h" + +#if wxUSE_STATLINE + +// ---------------------------------------------------------------------------- +// wxStaticLine +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxStaticLine : public wxStaticLineBase +{ +public: + wxStaticLine(); + wxStaticLine(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint &pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxLI_HORIZONTAL, + const wxString &name = wxStaticLineNameStr); + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxLI_HORIZONTAL, + const wxString &name = wxStaticLineNameStr); + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + +private: + DECLARE_DYNAMIC_CLASS(wxStaticLine) +}; + +#endif // wxUSE_STATLINE + +#endif // __GTKSTATICLINEH__ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/stattext.h b/wxmsw/include/wx-3.0/wx/gtk/stattext.h new file mode 100644 index 00000000..f6d88cb8 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/stattext.h @@ -0,0 +1,69 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/stattext.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_STATTEXT_H_ +#define _WX_GTK_STATTEXT_H_ + +//----------------------------------------------------------------------------- +// wxStaticText +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxStaticText : public wxStaticTextBase +{ +public: + wxStaticText(); + wxStaticText(wxWindow *parent, + wxWindowID id, + const wxString &label, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = 0, + const wxString &name = wxStaticTextNameStr ); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString &label, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = 0, + const wxString &name = wxStaticTextNameStr ); + + void SetLabel( const wxString &label ); + + bool SetFont( const wxFont &font ); + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // implementation + // -------------- + +protected: + virtual bool GTKWidgetNeedsMnemonic() const; + virtual void GTKWidgetDoSetMnemonic(GtkWidget* w); + + virtual wxSize DoGetBestSize() const; + + virtual wxString DoGetLabel() const; + virtual void DoSetLabel(const wxString& str); +#if wxUSE_MARKUP + virtual bool DoSetLabelMarkup(const wxString& markup); +#endif // wxUSE_MARKUP + +private: + // Common part of SetLabel() and DoSetLabelMarkup(). + typedef void (wxStaticText::*GTKLabelSetter)(GtkLabel *, const wxString&); + + void GTKDoSetLabel(GTKLabelSetter setter, const wxString& label); + + + DECLARE_DYNAMIC_CLASS(wxStaticText) +}; + +#endif + // _WX_GTK_STATTEXT_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/taskbar.h b/wxmsw/include/wx-3.0/wx/gtk/taskbar.h new file mode 100644 index 00000000..03bd8daf --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/taskbar.h @@ -0,0 +1,33 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/taskbar.h +// Purpose: wxTaskBarIcon class for GTK2 +// Author: Paul Cornett +// Created: 2009-02-08 +// Copyright: (c) 2009 Paul Cornett +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_TASKBARICON_H_ +#define _WX_GTK_TASKBARICON_H_ + +class WXDLLIMPEXP_ADV wxTaskBarIcon: public wxTaskBarIconBase +{ +public: + wxTaskBarIcon(wxTaskBarIconType iconType = wxTBI_DEFAULT_TYPE); + ~wxTaskBarIcon(); + virtual bool SetIcon(const wxIcon& icon, const wxString& tooltip = wxString()); + virtual bool RemoveIcon(); + virtual bool PopupMenu(wxMenu* menu); + bool IsOk() const { return true; } + bool IsIconInstalled() const; + + class Private; + +private: + Private* m_priv; + + DECLARE_DYNAMIC_CLASS(wxTaskBarIcon) + DECLARE_NO_COPY_CLASS(wxTaskBarIcon) +}; + +#endif // _WX_GTK_TASKBARICON_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/textctrl.h b/wxmsw/include/wx-3.0/wx/gtk/textctrl.h new file mode 100644 index 00000000..9fefd919 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/textctrl.h @@ -0,0 +1,227 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/textctrl.h +// Purpose: +// Author: Robert Roebling +// Created: 01/02/97 +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_TEXTCTRL_H_ +#define _WX_GTK_TEXTCTRL_H_ + +typedef struct _GtkTextMark GtkTextMark; + +//----------------------------------------------------------------------------- +// wxTextCtrl +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTextCtrl: public wxTextCtrlBase +{ +public: + wxTextCtrl() { Init(); } + wxTextCtrl(wxWindow *parent, + wxWindowID id, + const wxString &value = wxEmptyString, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = wxTextCtrlNameStr); + + virtual ~wxTextCtrl(); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString &value = wxEmptyString, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = wxTextCtrlNameStr); + + // implement base class pure virtuals + // ---------------------------------- + + virtual void WriteText(const wxString& text); + virtual wxString GetValue() const; + virtual bool IsEmpty() const; + + virtual int GetLineLength(long lineNo) const; + virtual wxString GetLineText(long lineNo) const; + virtual int GetNumberOfLines() const; + + virtual bool IsModified() const; + virtual bool IsEditable() const; + + virtual void GetSelection(long* from, long* to) const; + + virtual void Remove(long from, long to); + + virtual void MarkDirty(); + virtual void DiscardEdits(); + + virtual bool SetStyle(long start, long end, const wxTextAttr& style); + virtual bool GetStyle(long position, wxTextAttr& style); + + // translate between the position (which is just an index in the text ctrl + // considering all its contents as a single strings) and (x, y) coordinates + // which represent column and line. + virtual long XYToPosition(long x, long y) const; + virtual bool PositionToXY(long pos, long *x, long *y) const; + + virtual void ShowPosition(long pos); + + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const; + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, + wxTextCoord *col, + wxTextCoord *row) const + { + return wxTextCtrlBase::HitTest(pt, col, row); + } + + // Clipboard operations + virtual void Copy(); + virtual void Cut(); + virtual void Paste(); + + // Insertion point + virtual void SetInsertionPoint(long pos); + virtual long GetInsertionPoint() const; + virtual wxTextPos GetLastPosition() const; + + virtual void SetSelection(long from, long to); + virtual void SetEditable(bool editable); + + // Overridden wxWindow methods + virtual void SetWindowStyleFlag( long style ); + virtual bool Enable( bool enable = true ); + + // Implementation from now on + void OnDropFiles( wxDropFilesEvent &event ); + void OnChar( wxKeyEvent &event ); + + void OnCut(wxCommandEvent& event); + void OnCopy(wxCommandEvent& event); + void OnPaste(wxCommandEvent& event); + void OnUndo(wxCommandEvent& event); + void OnRedo(wxCommandEvent& event); + + void OnUpdateCut(wxUpdateUIEvent& event); + void OnUpdateCopy(wxUpdateUIEvent& event); + void OnUpdatePaste(wxUpdateUIEvent& event); + void OnUpdateUndo(wxUpdateUIEvent& event); + void OnUpdateRedo(wxUpdateUIEvent& event); + + bool SetFont(const wxFont& font); + bool SetForegroundColour(const wxColour& colour); + bool SetBackgroundColour(const wxColour& colour); + + GtkWidget* GetConnectWidget(); + + void SetUpdateFont(bool WXUNUSED(update)) { } + + // implementation only from now on + + // tell the control to ignore next text changed signal + void IgnoreNextTextUpdate(int n = 1) { m_countUpdatesToIgnore = n; } + + // should we ignore the changed signal? always resets the flag + bool IgnoreTextUpdate(); + + // call this to indicate that the control is about to be changed + // programmatically and so m_modified flag shouldn't be set + void DontMarkDirtyOnNextChange() { m_dontMarkDirty = true; } + + // should we mark the control as dirty? always resets the flag + bool MarkDirtyOnChange(); + + // always let GTK have mouse release events for multiline controls + virtual bool GTKProcessEvent(wxEvent& event) const; + + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + +protected: + // overridden wxWindow virtual methods + virtual wxSize DoGetBestSize() const; + virtual void DoApplyWidgetStyle(GtkRcStyle *style); + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; + + virtual void DoFreeze(); + virtual void DoThaw(); + + // Widgets that use the style->base colour for the BG colour should + // override this and return true. + virtual bool UseGTKStyleBase() const { return true; } + + virtual void DoSetValue(const wxString &value, int flags = 0); + + // Override this to use either GtkEntry or GtkTextView IME depending on the + // kind of control we are. + virtual int GTKIMFilterKeypress(GdkEventKey* event) const; + + virtual wxPoint DoPositionToCoords(long pos) const; + + // wrappers hiding the differences between functions doing the same thing + // for GtkTextView and GtkEntry (all of them use current window style to + // set the given characteristic) + void GTKSetEditable(); + void GTKSetVisibility(); + void GTKSetActivatesDefault(); + void GTKSetWrapMode(); + void GTKSetJustification(); + +private: + void Init(); + + // overridden wxTextEntry virtual methods + virtual GtkEditable *GetEditable() const; + virtual GtkEntry *GetEntry() const; + virtual void EnableTextChangedEvents(bool enable); + + // change the font for everything in this control + void ChangeFontGlobally(); + + // get the encoding which is used in this control: this looks at our font + // and default style but not the current style (i.e. the style for the + // current position); returns wxFONTENCODING_SYSTEM if we have no specific + // encoding + wxFontEncoding GetTextEncoding() const; + + // returns either m_text or m_buffer depending on whether the control is + // single- or multi-line; convenient for the GTK+ functions which work with + // both + void *GetTextObject() const + { + return IsMultiLine() ? static_cast(m_buffer) + : static_cast(m_text); + } + + + // the widget used for single line controls + GtkWidget *m_text; + + bool m_modified:1; + bool m_dontMarkDirty:1; + + int m_countUpdatesToIgnore; + + // Our text buffer. Convenient, and holds the buffer while using + // a dummy one when frozen + GtkTextBuffer *m_buffer; + + GtkTextMark* m_showPositionOnThaw; + GSList* m_anonymousMarkList; + + // For wxTE_AUTO_URL + void OnUrlMouseEvent(wxMouseEvent&); + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxTextCtrl) +}; + +#endif // _WX_GTK_TEXTCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/textentry.h b/wxmsw/include/wx-3.0/wx/gtk/textentry.h new file mode 100644 index 00000000..5df686cf --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/textentry.h @@ -0,0 +1,86 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/textentry.h +// Purpose: wxGTK-specific wxTextEntry implementation +// Author: Vadim Zeitlin +// Created: 2007-09-24 +// Copyright: (c) 2007 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_TEXTENTRY_H_ +#define _WX_GTK_TEXTENTRY_H_ + +typedef struct _GdkEventKey GdkEventKey; +typedef struct _GtkEditable GtkEditable; +typedef struct _GtkEntry GtkEntry; + +// ---------------------------------------------------------------------------- +// wxTextEntry: roughly corresponds to GtkEditable +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTextEntry : public wxTextEntryBase +{ +public: + wxTextEntry() { } + + // implement wxTextEntryBase pure virtual methods + virtual void WriteText(const wxString& text); + virtual void Remove(long from, long to); + + virtual void Copy(); + virtual void Cut(); + virtual void Paste(); + + virtual void Undo(); + virtual void Redo(); + virtual bool CanUndo() const; + virtual bool CanRedo() const; + + virtual void SetInsertionPoint(long pos); + virtual long GetInsertionPoint() const; + virtual long GetLastPosition() const; + + virtual void SetSelection(long from, long to); + virtual void GetSelection(long *from, long *to) const; + + virtual bool IsEditable() const; + virtual void SetEditable(bool editable); + + virtual void SetMaxLength(unsigned long len); + + // implementation only from now on + void SendMaxLenEvent(); + bool GTKEntryOnInsertText(const char* text); + +protected: + // This method must be called from the derived class Create() to connect + // the handlers for the clipboard (cut/copy/paste) events. + void GTKConnectClipboardSignals(GtkWidget* entry); + + // And this one to connect "insert-text" signal. + void GTKConnectInsertTextSignal(GtkEntry* entry); + + + virtual void DoSetValue(const wxString& value, int flags); + virtual wxString DoGetValue() const; + + // margins functions + virtual bool DoSetMargins(const wxPoint& pt); + virtual wxPoint DoGetMargins() const; + + virtual bool DoAutoCompleteStrings(const wxArrayString& choices); + + // Override the base class method to use GtkEntry IM context. + virtual int GTKIMFilterKeypress(GdkEventKey* event) const; + +private: + // implement this to return the associated GtkEntry or another widget + // implementing GtkEditable + virtual GtkEditable *GetEditable() const = 0; + + // implement this to return the associated GtkEntry + virtual GtkEntry *GetEntry() const = 0; +}; + +#endif // _WX_GTK_TEXTENTRY_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/tglbtn.h b/wxmsw/include/wx-3.0/wx/gtk/tglbtn.h new file mode 100644 index 00000000..d6975311 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/tglbtn.h @@ -0,0 +1,120 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/tglbtn.h +// Purpose: Declaration of the wxToggleButton class, which implements a +// toggle button under wxGTK. +// Author: John Norris, minor changes by Axel Schlueter +// Modified by: +// Created: 08.02.01 +// Copyright: (c) 2000 Johnny C. Norris II +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_TOGGLEBUTTON_H_ +#define _WX_GTK_TOGGLEBUTTON_H_ + +#include "wx/bitmap.h" + +//----------------------------------------------------------------------------- +// wxToggleButton +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxToggleButton: public wxToggleButtonBase +{ +public: + // construction/destruction + wxToggleButton() {} + wxToggleButton(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxCheckBoxNameStr) + { + Create(parent, id, label, pos, size, style, validator, name); + } + + // Create the control + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxCheckBoxNameStr); + + // Get/set the value + void SetValue(bool state); + bool GetValue() const; + + // Set the label + void SetLabel(const wxString& label); + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + +protected: + void GTKDisableEvents(); + void GTKEnableEvents(); + + virtual wxSize DoGetBestSize() const; + virtual void DoApplyWidgetStyle(GtkRcStyle *style); + +#if wxUSE_MARKUP + virtual bool DoSetLabelMarkup(const wxString& markup); +#endif // wxUSE_MARKUP + +private: + typedef wxToggleButtonBase base_type; + + // Return the GtkLabel used by this toggle button. + GtkLabel *GTKGetLabel() const; + + DECLARE_DYNAMIC_CLASS(wxToggleButton) +}; + +//----------------------------------------------------------------------------- +// wxBitmapToggleButton +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxBitmapToggleButton: public wxToggleButton +{ +public: + // construction/destruction + wxBitmapToggleButton() {} + wxBitmapToggleButton(wxWindow *parent, + wxWindowID id, + const wxBitmap& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxCheckBoxNameStr) + { + Create(parent, id, label, pos, size, style, validator, name); + } + + // Create the control + bool Create(wxWindow *parent, + wxWindowID id, + const wxBitmap& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxCheckBoxNameStr); + + // deprecated synonym for SetBitmapLabel() + wxDEPRECATED_INLINE( void SetLabel(const wxBitmap& bitmap), + SetBitmapLabel(bitmap); ) + // prevent virtual function hiding + virtual void SetLabel(const wxString& label) { wxToggleButton::SetLabel(label); } + +private: + typedef wxToggleButtonBase base_type; + + DECLARE_DYNAMIC_CLASS(wxBitmapToggleButton) +}; + +#endif // _WX_GTK_TOGGLEBUTTON_H_ + diff --git a/wxmsw/include/wx-3.0/wx/gtk/toolbar.h b/wxmsw/include/wx-3.0/wx/gtk/toolbar.h new file mode 100644 index 00000000..d504b6c2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/toolbar.h @@ -0,0 +1,104 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/toolbar.h +// Purpose: GTK toolbar +// Author: Robert Roebling +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_TOOLBAR_H_ +#define _WX_GTK_TOOLBAR_H_ + +#if wxUSE_TOOLBAR + +typedef struct _GtkTooltips GtkTooltips; + +// ---------------------------------------------------------------------------- +// wxToolBar +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxToolBar : public wxToolBarBase +{ +public: + // construction/destruction + wxToolBar() { Init(); } + wxToolBar( wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTB_HORIZONTAL, + const wxString& name = wxToolBarNameStr ) + { + Init(); + + Create(parent, id, pos, size, style, name); + } + + bool Create( wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTB_HORIZONTAL, + const wxString& name = wxToolBarNameStr ); + + virtual ~wxToolBar(); + + virtual wxToolBarToolBase *FindToolForPosition(wxCoord x, wxCoord y) const; + + virtual void SetToolShortHelp(int id, const wxString& helpString); + + virtual void SetWindowStyleFlag( long style ); + + virtual void SetToolNormalBitmap(int id, const wxBitmap& bitmap); + virtual void SetToolDisabledBitmap(int id, const wxBitmap& bitmap); + + virtual bool Realize(); + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + virtual wxToolBarToolBase *CreateTool(int id, + const wxString& label, + const wxBitmap& bitmap1, + const wxBitmap& bitmap2 = wxNullBitmap, + wxItemKind kind = wxITEM_NORMAL, + wxObject *clientData = NULL, + const wxString& shortHelpString = wxEmptyString, + const wxString& longHelpString = wxEmptyString); + virtual wxToolBarToolBase *CreateTool(wxControl *control, + const wxString& label); + + // implementation from now on + // -------------------------- + +protected: + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const { return wxBORDER_DEFAULT; } + + virtual wxSize DoGetBestSize() const; + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + + // implement base class pure virtuals + virtual bool DoInsertTool(size_t pos, wxToolBarToolBase *tool); + virtual bool DoDeleteTool(size_t pos, wxToolBarToolBase *tool); + + virtual void DoEnableTool(wxToolBarToolBase *tool, bool enable); + virtual void DoToggleTool(wxToolBarToolBase *tool, bool toggle); + virtual void DoSetToggle(wxToolBarToolBase *tool, bool toggle); + +private: + void Init(); + void GtkSetStyle(); + GSList* GetRadioGroup(size_t pos); + virtual void AddChildGTK(wxWindowGTK* child); + + GtkToolbar* m_toolbar; + GtkTooltips* m_tooltips; + + DECLARE_DYNAMIC_CLASS(wxToolBar) +}; + +#endif // wxUSE_TOOLBAR + +#endif + // _WX_GTK_TOOLBAR_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/tooltip.h b/wxmsw/include/wx-3.0/wx/gtk/tooltip.h new file mode 100644 index 00000000..25c682b4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/tooltip.h @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/tooltip.h +// Purpose: wxToolTip class +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTKTOOLTIP_H_ +#define _WX_GTKTOOLTIP_H_ + +#include "wx/string.h" +#include "wx/object.h" + +//----------------------------------------------------------------------------- +// forward declarations +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxWindow; + +//----------------------------------------------------------------------------- +// wxToolTip +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxToolTip : public wxObject +{ +public: + wxToolTip( const wxString &tip ); + + // globally change the tooltip parameters + static void Enable( bool flag ); + static void SetDelay( long msecs ); + // set the delay after which the tooltip disappears or how long the tooltip remains visible + static void SetAutoPop(long msecs); + // set the delay between subsequent tooltips to appear + static void SetReshow(long msecs); + + // get/set the tooltip text + void SetTip( const wxString &tip ); + wxString GetTip() const { return m_text; } + + wxWindow *GetWindow() const { return m_window; } + + // Implementation + void GTKSetWindow(wxWindow* win); + static void GTKApply(GtkWidget* widget, const char* tip); + +private: + wxString m_text; + wxWindow *m_window; + + DECLARE_ABSTRACT_CLASS(wxToolTip) +}; + +#endif // _WX_GTKTOOLTIP_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/toplevel.h b/wxmsw/include/wx-3.0/wx/gtk/toplevel.h new file mode 100644 index 00000000..9f9374b0 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/toplevel.h @@ -0,0 +1,169 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/toplevel.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling, Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_TOPLEVEL_H_ +#define _WX_GTK_TOPLEVEL_H_ + +//----------------------------------------------------------------------------- +// wxTopLevelWindowGTK +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTopLevelWindowGTK : public wxTopLevelWindowBase +{ + typedef wxTopLevelWindowBase base_type; +public: + // construction + wxTopLevelWindowGTK() { Init(); } + wxTopLevelWindowGTK(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + { + Init(); + + Create(parent, id, title, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + virtual ~wxTopLevelWindowGTK(); + + // implement base class pure virtuals + virtual void Maximize(bool maximize = true); + virtual bool IsMaximized() const; + virtual void Iconize(bool iconize = true); + virtual bool IsIconized() const; + virtual void SetIcons(const wxIconBundle& icons); + virtual void Restore(); + + virtual bool EnableCloseButton(bool enable = true); + + virtual void ShowWithoutActivating(); + virtual bool ShowFullScreen(bool show, long style = wxFULLSCREEN_ALL); + virtual bool IsFullScreen() const { return m_fsIsShowing; } + + virtual void RequestUserAttention(int flags = wxUSER_ATTENTION_INFO); + + virtual void SetWindowStyleFlag( long style ); + + virtual bool Show(bool show = true); + + virtual void Raise(); + + virtual bool IsActive(); + + virtual void SetTitle( const wxString &title ); + virtual wxString GetTitle() const { return m_title; } + + virtual void SetLabel(const wxString& label) { SetTitle( label ); } + virtual wxString GetLabel() const { return GetTitle(); } + + + virtual bool SetTransparent(wxByte alpha); + virtual bool CanSetTransparent(); + + // Experimental, to allow help windows to be + // viewable from within modal dialogs + virtual void AddGrab(); + virtual void RemoveGrab(); + virtual bool IsGrabbed() const { return m_grabbed; } + + + virtual void Refresh( bool eraseBackground = true, + const wxRect *rect = (const wxRect *) NULL ); + + // implementation from now on + // -------------------------- + + // GTK callbacks + virtual void OnInternalIdle(); + + virtual void GTKHandleRealized(); + + void GTKConfigureEvent(int x, int y); + + // do *not* call this to iconize the frame, this is a private function! + void SetIconizeState(bool iconic); + + GtkWidget *m_mainWidget; + + bool m_fsIsShowing; /* full screen */ + int m_fsSaveGdkFunc, m_fsSaveGdkDecor; + wxRect m_fsSaveFrame; + + // m_windowStyle translated to GDK's terms + int m_gdkFunc, + m_gdkDecor; + + // size of WM decorations + struct DecorSize + { + int left, right, top, bottom; + }; + DecorSize m_decorSize; + + // private gtk_timeout_add result for mimicing wxUSER_ATTENTION_INFO and + // wxUSER_ATTENTION_ERROR difference, -2 for no hint, -1 for ERROR hint, rest for GtkTimeout handle. + int m_urgency_hint; + // timer for detecting WM with broken _NET_REQUEST_FRAME_EXTENTS handling + unsigned m_netFrameExtentsTimerId; + + // return the size of the window without WM decorations + void GTKDoGetSize(int *width, int *height) const; + + void GTKUpdateDecorSize(const DecorSize& decorSize); + +protected: + // give hints to the Window Manager for how the size + // of the TLW can be changed by dragging + virtual void DoSetSizeHints( int minW, int minH, + int maxW, int maxH, + int incW, int incH); + // move the window to the specified location and resize it + virtual void DoMoveWindow(int x, int y, int width, int height); + + // take into account WM decorations here + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + + virtual void DoSetClientSize(int width, int height); + virtual void DoGetClientSize(int *width, int *height) const; + + // string shown in the title bar + wxString m_title; + + bool m_deferShow; + +private: + void Init(); + DecorSize& GetCachedDecorSize(); + + // size hint increments + int m_incWidth, m_incHeight; + + // is the frame currently iconized? + bool m_isIconized; + + // is the frame currently grabbed explicitly by the application? + bool m_grabbed; + + bool m_updateDecorSize; + bool m_deferShowAllowed; +}; + +#endif // _WX_GTK_TOPLEVEL_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/webview_webkit.h b/wxmsw/include/wx-3.0/wx/gtk/webview_webkit.h new file mode 100644 index 00000000..e1a01bf8 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/webview_webkit.h @@ -0,0 +1,186 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: include/gtk/wx/webview.h +// Purpose: GTK webkit backend for web view component +// Author: Robert Roebling, Marianne Gagnon +// Copyright: (c) 2010 Marianne Gagnon, 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_WEBKITCTRL_H_ +#define _WX_GTK_WEBKITCTRL_H_ + +#include "wx/defs.h" + +#if wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT && defined(__WXGTK__) + +#include "wx/sharedptr.h" +#include "wx/webview.h" + +typedef struct _WebKitWebView WebKitWebView; + +//----------------------------------------------------------------------------- +// wxWebViewWebKit +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_WEBVIEW wxWebViewWebKit : public wxWebView +{ +public: + wxWebViewWebKit(); + + wxWebViewWebKit(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxString& name = wxWebViewNameStr) + { + Create(parent, id, url, pos, size, style, name); + } + + virtual bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxString& name = wxWebViewNameStr); + + virtual ~wxWebViewWebKit(); + + virtual bool Enable( bool enable = true ); + + // implementation + // -------------- + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + virtual void Stop(); + virtual void LoadURL(const wxString& url); + virtual void GoBack(); + virtual void GoForward(); + virtual void Reload(wxWebViewReloadFlags flags = wxWEBVIEW_RELOAD_DEFAULT); + virtual bool CanGoBack() const; + virtual bool CanGoForward() const; + virtual void ClearHistory(); + virtual void EnableContextMenu(bool enable = true); + virtual void EnableHistory(bool enable = true); + virtual wxVector > GetBackwardHistory(); + virtual wxVector > GetForwardHistory(); + virtual void LoadHistoryItem(wxSharedPtr item); + virtual wxString GetCurrentURL() const; + virtual wxString GetCurrentTitle() const; + virtual wxString GetPageSource() const; + virtual wxString GetPageText() const; + virtual void Print(); + virtual bool IsBusy() const; + + void SetZoomType(wxWebViewZoomType); + wxWebViewZoomType GetZoomType() const; + bool CanSetZoomType(wxWebViewZoomType) const; + virtual wxWebViewZoom GetZoom() const; + virtual void SetZoom(wxWebViewZoom); + + //Clipboard functions + virtual bool CanCut() const; + virtual bool CanCopy() const; + virtual bool CanPaste() const; + virtual void Cut(); + virtual void Copy(); + virtual void Paste(); + + //Undo / redo functionality + virtual bool CanUndo() const; + virtual bool CanRedo() const; + virtual void Undo(); + virtual void Redo(); + + //Find function + virtual long Find(const wxString& text, int flags = wxWEBVIEW_FIND_DEFAULT); + + //Editing functions + virtual void SetEditable(bool enable = true); + virtual bool IsEditable() const; + + //Selection + virtual void DeleteSelection(); + virtual bool HasSelection() const; + virtual void SelectAll(); + virtual wxString GetSelectedText() const; + virtual wxString GetSelectedSource() const; + virtual void ClearSelection(); + + virtual void RunScript(const wxString& javascript); + + //Virtual Filesystem Support + virtual void RegisterHandler(wxSharedPtr handler); + virtual wxVector > GetHandlers() { return m_handlerList; } + + virtual void* GetNativeBackend() const { return m_web_view; } + + /** TODO: check if this can be made private + * The native control has a getter to check for busy state, but except in + * very recent versions of webkit this getter doesn't say everything we need + * (namely it seems to stay indefinitely busy when loading is cancelled by + * user) + */ + bool m_busy; + + wxString m_vfsurl; + + //We use this flag to stop recursion when we load a page from the navigation + //callback, mainly when loading a VFS page + bool m_guard; + //This flag is use to indicate when a navigation event is the result of a + //create-web-view signal and so we need to send a new window event + bool m_creating; + +protected: + virtual void DoSetPage(const wxString& html, const wxString& baseUrl); + + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + +private: + + void ZoomIn(); + void ZoomOut(); + void SetWebkitZoom(float level); + float GetWebkitZoom() const; + + //Find helper function + void FindClear(); + + // focus event handler: calls GTKUpdateBitmap() + void GTKOnFocus(wxFocusEvent& event); + + WebKitWebView *m_web_view; + int m_historyLimit; + + wxVector > m_handlerList; + + //variables used for Find() + int m_findFlags; + wxString m_findText; + int m_findPosition; + int m_findCount; + + wxDECLARE_DYNAMIC_CLASS(wxWebViewWebKit); +}; + +class WXDLLIMPEXP_WEBVIEW wxWebViewFactoryWebKit : public wxWebViewFactory +{ +public: + virtual wxWebView* Create() { return new wxWebViewWebKit; } + virtual wxWebView* Create(wxWindow* parent, + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxWebViewNameStr) + { return new wxWebViewWebKit(parent, id, url, pos, size, style, name); } +}; + + +#endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT && defined(__WXGTK__) + +#endif diff --git a/wxmsw/include/wx-3.0/wx/gtk/webviewhistoryitem_webkit.h b/wxmsw/include/wx-3.0/wx/gtk/webviewhistoryitem_webkit.h new file mode 100644 index 00000000..a798efdd --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/webviewhistoryitem_webkit.h @@ -0,0 +1,33 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: include/wx/gtk/webviewhistoryitem.h +// Purpose: wxWebViewHistoryItem header for GTK +// Author: Steven Lamerton +// Copyright: (c) 2011 Steven Lamerton +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_WEBVIEWHISTORYITEM_H_ +#define _WX_GTK_WEBVIEWHISTORYITEM_H_ + +#include "wx/setup.h" + +#if wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT && defined(__WXGTK__) + +class WXDLLIMPEXP_WEBVIEW wxWebViewHistoryItem +{ +public: + wxWebViewHistoryItem(const wxString& url, const wxString& title) : + m_url(url), m_title(title) {} + wxString GetUrl() { return m_url; } + wxString GetTitle() { return m_title; } + + friend class wxWebViewWebKit; + +private: + wxString m_url, m_title; + void* m_histItem; +}; + +#endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT && defined(__WXGTK__) + +#endif // _WX_GTK_WEBVIEWHISTORYITEM_H_ diff --git a/wxmsw/include/wx-3.0/wx/gtk/window.h b/wxmsw/include/wx-3.0/wx/gtk/window.h new file mode 100644 index 00000000..6c36ce99 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/gtk/window.h @@ -0,0 +1,463 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/window.h +// Purpose: +// Author: Robert Roebling +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_WINDOW_H_ +#define _WX_GTK_WINDOW_H_ + +#include "wx/dynarray.h" + +#ifdef __WXGTK3__ + typedef struct _cairo cairo_t; + typedef struct _GtkStyleProvider GtkStyleProvider; + #define WXUNUSED_IN_GTK3(x) +#else + #define WXUNUSED_IN_GTK3(x) x +#endif + +typedef struct _GdkEventKey GdkEventKey; +typedef struct _GtkIMContext GtkIMContext; + +WX_DEFINE_EXPORTED_ARRAY_PTR(GdkWindow *, wxArrayGdkWindows); + +extern "C" +{ + +typedef void (*wxGTKCallback)(); + +} + +//----------------------------------------------------------------------------- +// wxWindowGTK +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxWindowGTK : public wxWindowBase +{ +public: + // creating the window + // ------------------- + wxWindowGTK(); + wxWindowGTK(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr); + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr); + virtual ~wxWindowGTK(); + + // implement base class (pure) virtual methods + // ------------------------------------------- + + virtual void Raise(); + virtual void Lower(); + + virtual bool Show( bool show = true ); + + virtual bool IsRetained() const; + + virtual void SetFocus(); + + // hint from wx to native GTK+ tab traversal code + virtual void SetCanFocus(bool canFocus); + + virtual bool Reparent( wxWindowBase *newParent ); + + virtual void WarpPointer(int x, int y); + + virtual void Refresh( bool eraseBackground = true, + const wxRect *rect = (const wxRect *) NULL ); + virtual void Update(); + virtual void ClearBackground(); + + virtual bool SetBackgroundColour( const wxColour &colour ); + virtual bool SetForegroundColour( const wxColour &colour ); + virtual bool SetCursor( const wxCursor &cursor ); + virtual bool SetFont( const wxFont &font ); + + virtual bool SetBackgroundStyle(wxBackgroundStyle style) ; + virtual bool IsTransparentBackgroundSupported(wxString* reason = NULL) const; + + virtual int GetCharHeight() const; + virtual int GetCharWidth() const; + + virtual void SetScrollbar( int orient, int pos, int thumbVisible, + int range, bool refresh = true ); + virtual void SetScrollPos( int orient, int pos, bool refresh = true ); + virtual int GetScrollPos( int orient ) const; + virtual int GetScrollThumb( int orient ) const; + virtual int GetScrollRange( int orient ) const; + virtual void ScrollWindow( int dx, int dy, + const wxRect* rect = NULL ); + virtual bool ScrollLines(int lines); + virtual bool ScrollPages(int pages); + +#if wxUSE_DRAG_AND_DROP + virtual void SetDropTarget( wxDropTarget *dropTarget ); +#endif // wxUSE_DRAG_AND_DROP + + virtual void AddChild( wxWindowBase *child ); + virtual void RemoveChild( wxWindowBase *child ); + + virtual void SetLayoutDirection(wxLayoutDirection dir); + virtual wxLayoutDirection GetLayoutDirection() const; + virtual wxCoord AdjustForLayoutDirection(wxCoord x, + wxCoord width, + wxCoord widthTotal) const; + + virtual bool DoIsExposed( int x, int y ) const; + virtual bool DoIsExposed( int x, int y, int w, int h ) const; + + // currently wxGTK2-only + void SetDoubleBuffered(bool on); + virtual bool IsDoubleBuffered() const; + + // SetLabel(), which does nothing in wxWindow + virtual void SetLabel(const wxString& label) { m_gtkLabel = label; } + virtual wxString GetLabel() const { return m_gtkLabel; } + + // implementation + // -------------- + + virtual WXWidget GetHandle() const { return m_widget; } + + // many important things are done here, this function must be called + // regularly + virtual void OnInternalIdle(); + + // For compatibility across platforms (not in event table) + void OnIdle(wxIdleEvent& WXUNUSED(event)) {} + + // Used by all window classes in the widget creation process. + bool PreCreation( wxWindowGTK *parent, const wxPoint &pos, const wxSize &size ); + void PostCreation(); + + // Internal addition of child windows + void DoAddChild(wxWindowGTK *child); + + // This method sends wxPaintEvents to the window. + // It is also responsible for background erase events. +#ifdef __WXGTK3__ + void GTKSendPaintEvents(cairo_t* cr); +#else + void GTKSendPaintEvents(const GdkRegion* region); +#endif + + // The methods below are required because many native widgets + // are composed of several subwidgets and setting a style for + // the widget means setting it for all subwidgets as well. + // also, it is not clear which native widget is the top + // widget where (most of) the input goes. even tooltips have + // to be applied to all subwidgets. + virtual GtkWidget* GetConnectWidget(); + void ConnectWidget( GtkWidget *widget ); + + // Called from several event handlers, if it returns true or false, the + // same value should be immediately returned by the handler without doing + // anything else. If it returns -1, the handler should continue as usual + int GTKCallbackCommonPrologue(struct _GdkEventAny *event) const; + + // Simplified form of GTKCallbackCommonPrologue() which can be used from + // GTK callbacks without return value to check if the event should be + // ignored: if this returns true, the event shouldn't be handled + bool GTKShouldIgnoreEvent() const; + + + // override this if some events should never be consumed by wxWidgets but + // but have to be left for the native control + // + // base version just calls HandleWindowEvent() + virtual bool GTKProcessEvent(wxEvent& event) const; + + // Map GTK widget direction of the given widget to/from wxLayoutDirection + static wxLayoutDirection GTKGetLayout(GtkWidget *widget); + static void GTKSetLayout(GtkWidget *widget, wxLayoutDirection dir); + + // This is called when capture is taken from the window. It will + // fire off capture lost events. + void GTKReleaseMouseAndNotify(); + + GdkWindow* GTKGetDrawingWindow() const; + + bool GTKHandleFocusIn(); + bool GTKHandleFocusOut(); + void GTKHandleFocusOutNoDeferring(); + static void GTKHandleDeferredFocusOut(); + + // Called when m_widget becomes realized. Derived classes must call the + // base class method if they override it. + virtual void GTKHandleRealized(); + void GTKHandleUnrealize(); + +protected: + // for controls composed of multiple GTK widgets, return true to eliminate + // spurious focus events if the focus changes between GTK+ children within + // the same wxWindow + virtual bool GTKNeedsToFilterSameWindowFocus() const { return false; } + + // Override GTKWidgetNeedsMnemonic and return true if your + // needs to set its mnemonic widget, such as for a + // GtkLabel for wxStaticText, then do the actual + // setting of the widget inside GTKWidgetDoSetMnemonic + virtual bool GTKWidgetNeedsMnemonic() const; + virtual void GTKWidgetDoSetMnemonic(GtkWidget* w); + + // Get the GdkWindows making part of this window: usually there will be + // only one of them in which case it should be returned directly by this + // function. If there is more than one GdkWindow (can be the case for + // composite widgets), return NULL and fill in the provided array + // + // This is not pure virtual for backwards compatibility but almost + // certainly must be overridden in any wxControl-derived class! + virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + + // Check if the given window makes part of this widget + bool GTKIsOwnWindow(GdkWindow *window) const; + +public: + // Returns the default context which usually is anti-aliased + PangoContext *GTKGetPangoDefaultContext(); + +#if wxUSE_TOOLTIPS + // applies tooltip to the widget (tip must be UTF-8 encoded) + virtual void GTKApplyToolTip(const char* tip); +#endif // wxUSE_TOOLTIPS + + // Called when a window should delay showing itself + // until idle time used in Reparent(). + void GTKShowOnIdle() { m_showOnIdle = true; } + + // This is called from the various OnInternalIdle methods + bool GTKShowFromOnIdle(); + + // is this window transparent for the mouse events (as wxStaticBox is)? + virtual bool GTKIsTransparentForMouse() const { return false; } + + // Common scroll event handling code for wxWindow and wxScrollBar + wxEventType GTKGetScrollEventType(GtkRange* range); + + // position and size of the window + int m_x, m_y; + int m_width, m_height; + int m_clientWidth, m_clientHeight; + // Whether the client size variables above are known to be correct + // (because they have been validated by a size-allocate) and should + // be used to report client size + bool m_useCachedClientSize; + + // see the docs in src/gtk/window.cpp + GtkWidget *m_widget; // mostly the widget seen by the rest of GTK + GtkWidget *m_wxwindow; // mostly the client area as per wxWidgets + + // label for use with GetLabelSetLabel + wxString m_gtkLabel; + + // return true if the window is of a standard (i.e. not wxWidgets') class + bool IsOfStandardClass() const { return m_wxwindow == NULL; } + + // this widget will be queried for GTK's focus events + GtkWidget *m_focusWidget; + + void GTKDisableFocusOutEvent(); + void GTKEnableFocusOutEvent(); + + + // Input method support + + // The IM context used for generic, i.e. non-native, windows. + // + // It might be a good idea to avoid allocating it unless key events from + // this window are really needed but currently we do it unconditionally. + // + // For native widgets (i.e. those for which IsOfStandardClass() returns + // true) it is NULL. + GtkIMContext* m_imContext; + + // Pointer to the event being currently processed by the IME or NULL if not + // inside key handling. + GdkEventKey* m_imKeyEvent; + + // This method generalizes gtk_im_context_filter_keypress(): for the + // generic windows it does just that but it's overridden by the classes + // wrapping native widgets that use IM themselves and so provide specific + // methods for accessing it such gtk_entry_im_context_filter_keypress(). + virtual int GTKIMFilterKeypress(GdkEventKey* event) const; + + // This method must be called from the derived classes "insert-text" signal + // handlers to check if the text is not being inserted by the IM and, if + // this is the case, generate appropriate wxEVT_CHAR events for it. + // + // Returns true if we did generate and process events corresponding to this + // text or false if we didn't handle it. + bool GTKOnInsertText(const char* text); + + // This is just a helper of GTKOnInsertText() which is also used by GTK+ + // "commit" signal handler. + bool GTKDoInsertTextFromIM(const char* text); + + + // indices for the arrays below + enum ScrollDir { ScrollDir_Horz, ScrollDir_Vert, ScrollDir_Max }; + + // horizontal/vertical scroll bar + GtkRange* m_scrollBar[ScrollDir_Max]; + + // horizontal/vertical scroll position + double m_scrollPos[ScrollDir_Max]; + + // return the scroll direction index corresponding to the given orientation + // (which is wxVERTICAL or wxHORIZONTAL) + static ScrollDir ScrollDirFromOrient(int orient) + { + return orient == wxVERTICAL ? ScrollDir_Vert : ScrollDir_Horz; + } + + // return the orientation for the given scrolling direction + static int OrientFromScrollDir(ScrollDir dir) + { + return dir == ScrollDir_Horz ? wxHORIZONTAL : wxVERTICAL; + } + + // find the direction of the given scrollbar (must be one of ours) + ScrollDir ScrollDirFromRange(GtkRange *range) const; + + // set the current cursor for all GdkWindows making part of this widget + // (see GTKGetWindow) + void GTKUpdateCursor(bool update_self = true, bool recurse = true); + + // extra (wxGTK-specific) flags + bool m_noExpose:1; // wxGLCanvas has its own redrawing + bool m_nativeSizeEvent:1; // wxGLCanvas sends wxSizeEvent upon "alloc_size" + bool m_isScrolling:1; // dragging scrollbar thumb? + bool m_clipPaintRegion:1; // true after ScrollWindow() + wxRegion m_nativeUpdateRegion; // not transformed for RTL + bool m_dirtyTabOrder:1; // tab order changed, GTK focus + // chain needs update + bool m_mouseButtonDown:1; + + bool m_showOnIdle:1; // postpone showing the window until idle + +protected: + // implement the base class pure virtuals + virtual void DoGetTextExtent(const wxString& string, + int *x, int *y, + int *descent = NULL, + int *externalLeading = NULL, + const wxFont *font = NULL) const; + virtual void DoClientToScreen( int *x, int *y ) const; + virtual void DoScreenToClient( int *x, int *y ) const; + virtual void DoGetPosition( int *x, int *y ) const; + virtual void DoGetSize( int *width, int *height ) const; + virtual void DoGetClientSize( int *width, int *height ) const; + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + virtual void DoSetClientSize(int width, int height); + virtual wxSize DoGetBorderSize() const; + virtual void DoMoveWindow(int x, int y, int width, int height); + virtual void DoEnable(bool enable); + +#if wxUSE_MENUS_NATIVE + virtual bool DoPopupMenu( wxMenu *menu, int x, int y ); +#endif // wxUSE_MENUS_NATIVE + + virtual void DoCaptureMouse(); + virtual void DoReleaseMouse(); + + virtual void DoFreeze(); + virtual void DoThaw(); + + void GTKFreezeWidget(GtkWidget *w); + void GTKThawWidget(GtkWidget *w); + void GTKDisconnect(void* instance); + +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip( wxToolTip *tip ); +#endif // wxUSE_TOOLTIPS + + // Create a GtkScrolledWindow containing the given widget (usually + // m_wxwindow but not necessarily) and assigns it to m_widget. Also shows + // the widget passed to it. + // + // Can be only called if we have either wxHSCROLL or wxVSCROLL in our + // style. + void GTKCreateScrolledWindowWith(GtkWidget* view); + + virtual void DoMoveInTabOrder(wxWindow *win, WindowOrder move); + virtual bool DoNavigateIn(int flags); + + + // Copies m_children tab order to GTK focus chain: + void RealizeTabOrder(); + +#ifndef __WXGTK3__ + // Called by ApplyWidgetStyle (which is called by SetFont() and + // SetXXXColour etc to apply style changed to native widgets) to create + // modified GTK style with non-standard attributes. + GtkRcStyle* GTKCreateWidgetStyle(); +#endif + + void GTKApplyWidgetStyle(bool forceStyle = false); + + // helper function to ease native widgets wrapping, called by + // ApplyWidgetStyle -- override this, not ApplyWidgetStyle + virtual void DoApplyWidgetStyle(GtkRcStyle *style); + + void GTKApplyStyle(GtkWidget* widget, GtkRcStyle* style); + + // sets the border of a given GtkScrolledWindow from a wx style + static void GTKScrolledWindowSetBorder(GtkWidget* w, int style); + + // Connect the given function to the specified signal on m_widget. + // + // This is just a wrapper for g_signal_connect() and returns the handler id + // just as it does. + unsigned long GTKConnectWidget(const char *signal, wxGTKCallback callback); + + void ConstrainSize(); + +private: + void Init(); + + // return true if this window must have a non-NULL parent, false if it can + // be created without parent (normally only top level windows but in wxGTK + // there is also the exception of wxMenuBar) + virtual bool GTKNeedsParent() const { return !IsTopLevel(); } + + enum ScrollUnit { ScrollUnit_Line, ScrollUnit_Page, ScrollUnit_Max }; + + // common part of ScrollLines() and ScrollPages() and could be used, in the + // future, for horizontal scrolling as well + // + // return true if we scrolled, false otherwise (on error or simply if we + // are already at the end) + bool DoScrollByUnits(ScrollDir dir, ScrollUnit unit, int units); + virtual void AddChildGTK(wxWindowGTK* child); + +#ifdef __WXGTK3__ + // paint context is stashed here so wxPaintDC can use it + cairo_t* m_paintContext; + // style provider for "background-image" + GtkStyleProvider* m_styleProvider; + +public: + cairo_t* GTKPaintContext() const + { + return m_paintContext; + } +#endif + + DECLARE_DYNAMIC_CLASS(wxWindowGTK) + wxDECLARE_NO_COPY_CLASS(wxWindowGTK); +}; + +#endif // _WX_GTK_WINDOW_H_ diff --git a/wxmsw/include/wx-3.0/wx/hash.h b/wxmsw/include/wx-3.0/wx/hash.h new file mode 100644 index 00000000..452040ba --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/hash.h @@ -0,0 +1,312 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/hash.h +// Purpose: wxHashTable class +// Author: Julian Smart +// Modified by: VZ at 25.02.00: type safe hashes with WX_DECLARE_HASH() +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HASH_H__ +#define _WX_HASH_H__ + +#include "wx/defs.h" +#include "wx/string.h" + +#if !wxUSE_STD_CONTAINERS + #include "wx/object.h" +#else + class WXDLLIMPEXP_FWD_BASE wxObject; +#endif + +// the default size of the hash +#define wxHASH_SIZE_DEFAULT (1000) + +/* + * A hash table is an array of user-definable size with lists + * of data items hanging off the array positions. Usually there'll + * be a hit, so no search is required; otherwise we'll have to run down + * the list to find the desired item. +*/ + +union wxHashKeyValue +{ + long integer; + wxString *string; +}; + +// for some compilers (AIX xlC), defining it as friend inside the class is not +// enough, so provide a real forward declaration +class WXDLLIMPEXP_FWD_BASE wxHashTableBase; + +class WXDLLIMPEXP_BASE wxHashTableBase_Node +{ + friend class WXDLLIMPEXP_FWD_BASE wxHashTableBase; + typedef class WXDLLIMPEXP_FWD_BASE wxHashTableBase_Node _Node; +public: + wxHashTableBase_Node( long key, void* value, + wxHashTableBase* table ); + wxHashTableBase_Node( const wxString& key, void* value, + wxHashTableBase* table ); + ~wxHashTableBase_Node(); + + long GetKeyInteger() const { return m_key.integer; } + const wxString& GetKeyString() const { return *m_key.string; } + + void* GetData() const { return m_value; } + void SetData( void* data ) { m_value = data; } + +protected: + _Node* GetNext() const { return m_next; } + +protected: + // next node in the chain + wxHashTableBase_Node* m_next; + + // key + wxHashKeyValue m_key; + + // value + void* m_value; + + // pointer to the hash containing the node, used to remove the + // node from the hash when the user deletes the node iterating + // through it + // TODO: move it to wxHashTable_Node (only wxHashTable supports + // iteration) + wxHashTableBase* m_hashPtr; +}; + +class WXDLLIMPEXP_BASE wxHashTableBase +#if !wxUSE_STD_CONTAINERS + : public wxObject +#endif +{ + friend class WXDLLIMPEXP_FWD_BASE wxHashTableBase_Node; +public: + typedef wxHashTableBase_Node Node; + + wxHashTableBase(); + virtual ~wxHashTableBase() { } + + void Create( wxKeyType keyType = wxKEY_INTEGER, + size_t size = wxHASH_SIZE_DEFAULT ); + void Clear(); + void Destroy(); + + size_t GetSize() const { return m_size; } + size_t GetCount() const { return m_count; } + + void DeleteContents( bool flag ) { m_deleteContents = flag; } + + static long MakeKey(const wxString& string); + +protected: + void DoPut( long key, long hash, void* data ); + void DoPut( const wxString& key, long hash, void* data ); + void* DoGet( long key, long hash ) const; + void* DoGet( const wxString& key, long hash ) const; + void* DoDelete( long key, long hash ); + void* DoDelete( const wxString& key, long hash ); + +private: + // Remove the node from the hash, *only called from + // ~wxHashTable*_Node destructor + void DoRemoveNode( wxHashTableBase_Node* node ); + + // destroys data contained in the node if appropriate: + // deletes the key if it is a string and destrys + // the value if m_deleteContents is true + void DoDestroyNode( wxHashTableBase_Node* node ); + + // inserts a node in the table (at the end of the chain) + void DoInsertNode( size_t bucket, wxHashTableBase_Node* node ); + + // removes a node from the table (fiven a pointer to the previous + // but does not delete it (only deletes its contents) + void DoUnlinkNode( size_t bucket, wxHashTableBase_Node* node, + wxHashTableBase_Node* prev ); + + // unconditionally deletes node value (invoking the + // correct destructor) + virtual void DoDeleteContents( wxHashTableBase_Node* node ) = 0; + +protected: + // number of buckets + size_t m_size; + + // number of nodes (key/value pairs) + size_t m_count; + + // table + Node** m_table; + + // key typ (INTEGER/STRING) + wxKeyType m_keyType; + + // delete contents when hash is cleared + bool m_deleteContents; + +private: + wxDECLARE_NO_COPY_CLASS(wxHashTableBase); +}; + +// ---------------------------------------------------------------------------- +// for compatibility only +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxHashTable_Node : public wxHashTableBase_Node +{ + friend class WXDLLIMPEXP_FWD_BASE wxHashTable; +public: + wxHashTable_Node( long key, void* value, + wxHashTableBase* table ) + : wxHashTableBase_Node( key, value, table ) { } + wxHashTable_Node( const wxString& key, void* value, + wxHashTableBase* table ) + : wxHashTableBase_Node( key, value, table ) { } + + wxObject* GetData() const + { return (wxObject*)wxHashTableBase_Node::GetData(); } + void SetData( wxObject* data ) + { wxHashTableBase_Node::SetData( data ); } + + wxHashTable_Node* GetNext() const + { return (wxHashTable_Node*)wxHashTableBase_Node::GetNext(); } +}; + +// should inherit protectedly, but it is public for compatibility in +// order to publicly inherit from wxObject +class WXDLLIMPEXP_BASE wxHashTable : public wxHashTableBase +{ + typedef wxHashTableBase hash; +public: + typedef wxHashTable_Node Node; + typedef wxHashTable_Node* compatibility_iterator; +public: + wxHashTable( wxKeyType keyType = wxKEY_INTEGER, + size_t size = wxHASH_SIZE_DEFAULT ) + : wxHashTableBase() { Create( keyType, size ); BeginFind(); } + wxHashTable( const wxHashTable& table ); + + virtual ~wxHashTable() { Destroy(); } + + const wxHashTable& operator=( const wxHashTable& ); + + // key and value are the same + void Put(long value, wxObject *object) + { DoPut( value, value, object ); } + void Put(long lhash, long value, wxObject *object) + { DoPut( value, lhash, object ); } + void Put(const wxString& value, wxObject *object) + { DoPut( value, MakeKey( value ), object ); } + void Put(long lhash, const wxString& value, wxObject *object) + { DoPut( value, lhash, object ); } + + // key and value are the same + wxObject *Get(long value) const + { return (wxObject*)DoGet( value, value ); } + wxObject *Get(long lhash, long value) const + { return (wxObject*)DoGet( value, lhash ); } + wxObject *Get(const wxString& value) const + { return (wxObject*)DoGet( value, MakeKey( value ) ); } + wxObject *Get(long lhash, const wxString& value) const + { return (wxObject*)DoGet( value, lhash ); } + + // Deletes entry and returns data if found + wxObject *Delete(long key) + { return (wxObject*)DoDelete( key, key ); } + wxObject *Delete(long lhash, long key) + { return (wxObject*)DoDelete( key, lhash ); } + wxObject *Delete(const wxString& key) + { return (wxObject*)DoDelete( key, MakeKey( key ) ); } + wxObject *Delete(long lhash, const wxString& key) + { return (wxObject*)DoDelete( key, lhash ); } + + // Way of iterating through whole hash table (e.g. to delete everything) + // Not necessary, of course, if you're only storing pointers to + // objects maintained separately + void BeginFind() { m_curr = NULL; m_currBucket = 0; } + Node* Next(); + + void Clear() { wxHashTableBase::Clear(); } + + size_t GetCount() const { return wxHashTableBase::GetCount(); } +protected: + // copy helper + void DoCopy( const wxHashTable& copy ); + + // searches the next node starting from bucket bucketStart and sets + // m_curr to it and m_currBucket to its bucket + void GetNextNode( size_t bucketStart ); +private: + virtual void DoDeleteContents( wxHashTableBase_Node* node ); + + // current node + Node* m_curr; + + // bucket the current node belongs to + size_t m_currBucket; +}; + +// defines a new type safe hash table which stores the elements of type eltype +// in lists of class listclass +#define _WX_DECLARE_HASH(eltype, dummy, hashclass, classexp) \ + classexp hashclass : public wxHashTableBase \ + { \ + public: \ + hashclass(wxKeyType keyType = wxKEY_INTEGER, \ + size_t size = wxHASH_SIZE_DEFAULT) \ + : wxHashTableBase() { Create(keyType, size); } \ + \ + virtual ~hashclass() { Destroy(); } \ + \ + void Put(long key, eltype *data) { DoPut(key, key, (void*)data); } \ + void Put(long lhash, long key, eltype *data) \ + { DoPut(key, lhash, (void*)data); } \ + eltype *Get(long key) const { return (eltype*)DoGet(key, key); } \ + eltype *Get(long lhash, long key) const \ + { return (eltype*)DoGet(key, lhash); } \ + eltype *Delete(long key) { return (eltype*)DoDelete(key, key); } \ + eltype *Delete(long lhash, long key) \ + { return (eltype*)DoDelete(key, lhash); } \ + private: \ + virtual void DoDeleteContents( wxHashTableBase_Node* node ) \ + { delete (eltype*)node->GetData(); } \ + \ + DECLARE_NO_COPY_CLASS(hashclass) \ + } + + +// this macro is to be used in the user code +#define WX_DECLARE_HASH(el, list, hash) \ + _WX_DECLARE_HASH(el, list, hash, class) + +// and this one does exactly the same thing but should be used inside the +// library +#define WX_DECLARE_EXPORTED_HASH(el, list, hash) \ + _WX_DECLARE_HASH(el, list, hash, class WXDLLIMPEXP_CORE) + +#define WX_DECLARE_USER_EXPORTED_HASH(el, list, hash, usergoo) \ + _WX_DECLARE_HASH(el, list, hash, class usergoo) + +// delete all hash elements +// +// NB: the class declaration of the hash elements must be visible from the +// place where you use this macro, otherwise the proper destructor may not +// be called (a decent compiler should give a warning about it, but don't +// count on it)! +#define WX_CLEAR_HASH_TABLE(hash) \ + { \ + (hash).BeginFind(); \ + wxHashTable::compatibility_iterator it = (hash).Next(); \ + while( it ) \ + { \ + delete it->GetData(); \ + it = (hash).Next(); \ + } \ + (hash).Clear(); \ + } + +#endif // _WX_HASH_H__ diff --git a/wxmsw/include/wx-3.0/wx/hashmap.h b/wxmsw/include/wx-3.0/wx/hashmap.h new file mode 100644 index 00000000..ed26c354 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/hashmap.h @@ -0,0 +1,756 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/hashmap.h +// Purpose: wxHashMap class +// Author: Mattia Barbon +// Modified by: +// Created: 29/01/2002 +// Copyright: (c) Mattia Barbon +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HASHMAP_H_ +#define _WX_HASHMAP_H_ + +#include "wx/string.h" +#include "wx/wxcrt.h" + +// In wxUSE_STD_CONTAINERS build we prefer to use the standard hash map class +// but it can be either in non-standard hash_map header (old g++ and some other +// STL implementations) or in C++0x standard unordered_map which can in turn be +// available either in std::tr1 or std namespace itself +// +// To summarize: if std::unordered_map is available use it, otherwise use tr1 +// and finally fall back to non-standard hash_map + +#if (defined(HAVE_EXT_HASH_MAP) || defined(HAVE_HASH_MAP)) \ + && (defined(HAVE_GNU_CXX_HASH_MAP) || defined(HAVE_STD_HASH_MAP)) + #define HAVE_STL_HASH_MAP +#endif + +#if wxUSE_STD_CONTAINERS && \ + (defined(HAVE_STD_UNORDERED_MAP) || defined(HAVE_TR1_UNORDERED_MAP)) + +#if defined(HAVE_STD_UNORDERED_MAP) + #include + #define WX_HASH_MAP_NAMESPACE std +#elif defined(HAVE_TR1_UNORDERED_MAP) + #include + #define WX_HASH_MAP_NAMESPACE std::tr1 +#endif + +#define _WX_DECLARE_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME, CLASSEXP ) \ + typedef WX_HASH_MAP_NAMESPACE::unordered_map< KEY_T, VALUE_T, HASH_T, KEY_EQ_T > CLASSNAME + +#elif wxUSE_STD_CONTAINERS && defined(HAVE_STL_HASH_MAP) + +#if defined(HAVE_EXT_HASH_MAP) + #include +#elif defined(HAVE_HASH_MAP) + #include +#endif + +#if defined(HAVE_GNU_CXX_HASH_MAP) + #define WX_HASH_MAP_NAMESPACE __gnu_cxx +#elif defined(HAVE_STD_HASH_MAP) + #define WX_HASH_MAP_NAMESPACE std +#endif + +#define _WX_DECLARE_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME, CLASSEXP ) \ + typedef WX_HASH_MAP_NAMESPACE::hash_map< KEY_T, VALUE_T, HASH_T, KEY_EQ_T > CLASSNAME + +#else // !wxUSE_STD_CONTAINERS || no std::{hash,unordered}_map class available + +#define wxNEEDS_WX_HASH_MAP + +#ifdef __WXWINCE__ +typedef int ptrdiff_t; +#else +#include // for ptrdiff_t +#endif + +// private +struct WXDLLIMPEXP_BASE _wxHashTable_NodeBase +{ + _wxHashTable_NodeBase() : m_next(NULL) {} + + _wxHashTable_NodeBase* m_next; + +// Cannot do this: +// wxDECLARE_NO_COPY_CLASS(_wxHashTable_NodeBase); +// without rewriting the macros, which require a public copy constructor. +}; + +// private +class WXDLLIMPEXP_BASE _wxHashTableBase2 +{ +public: + typedef void (*NodeDtor)(_wxHashTable_NodeBase*); + typedef unsigned long (*BucketFromNode)(_wxHashTableBase2*,_wxHashTable_NodeBase*); + typedef _wxHashTable_NodeBase* (*ProcessNode)(_wxHashTable_NodeBase*); +protected: + static _wxHashTable_NodeBase* DummyProcessNode(_wxHashTable_NodeBase* node); + static void DeleteNodes( size_t buckets, _wxHashTable_NodeBase** table, + NodeDtor dtor ); + static _wxHashTable_NodeBase* GetFirstNode( size_t buckets, + _wxHashTable_NodeBase** table ) + { + for( size_t i = 0; i < buckets; ++i ) + if( table[i] ) + return table[i]; + return NULL; + } + + // as static const unsigned prime_count = 31 but works with all compilers + enum { prime_count = 31 }; + static const unsigned long ms_primes[prime_count]; + + // returns the first prime in ms_primes greater than n + static unsigned long GetNextPrime( unsigned long n ); + + // returns the first prime in ms_primes smaller than n + // ( or ms_primes[0] if n is very small ) + static unsigned long GetPreviousPrime( unsigned long n ); + + static void CopyHashTable( _wxHashTable_NodeBase** srcTable, + size_t srcBuckets, _wxHashTableBase2* dst, + _wxHashTable_NodeBase** dstTable, + BucketFromNode func, ProcessNode proc ); + + static void** AllocTable( size_t sz ) + { + return (void **)calloc(sz, sizeof(void*)); + } + static void FreeTable(void *table) + { + free(table); + } +}; + +#define _WX_DECLARE_HASHTABLE( VALUE_T, KEY_T, HASH_T, KEY_EX_T, KEY_EQ_T,\ + PTROPERATOR, CLASSNAME, CLASSEXP, \ + SHOULD_GROW, SHOULD_SHRINK ) \ +CLASSEXP CLASSNAME : protected _wxHashTableBase2 \ +{ \ +public: \ + typedef KEY_T key_type; \ + typedef VALUE_T value_type; \ + typedef HASH_T hasher; \ + typedef KEY_EQ_T key_equal; \ + \ + typedef size_t size_type; \ + typedef ptrdiff_t difference_type; \ + typedef value_type* pointer; \ + typedef const value_type* const_pointer; \ + typedef value_type& reference; \ + typedef const value_type& const_reference; \ + /* should these be protected? */ \ + typedef const KEY_T const_key_type; \ + typedef const VALUE_T const_mapped_type; \ +public: \ + typedef KEY_EX_T key_extractor; \ + typedef CLASSNAME Self; \ +protected: \ + _wxHashTable_NodeBase** m_table; \ + size_t m_tableBuckets; \ + size_t m_items; \ + hasher m_hasher; \ + key_equal m_equals; \ + key_extractor m_getKey; \ +public: \ + struct Node:public _wxHashTable_NodeBase \ + { \ + public: \ + Node( const value_type& value ) \ + : m_value( value ) {} \ + Node* next() { return static_cast(m_next); } \ + \ + value_type m_value; \ + }; \ + \ +protected: \ + static void DeleteNode( _wxHashTable_NodeBase* node ) \ + { \ + delete static_cast(node); \ + } \ +public: \ + /* */ \ + /* forward iterator */ \ + /* */ \ + CLASSEXP Iterator \ + { \ + public: \ + Node* m_node; \ + Self* m_ht; \ + \ + Iterator() : m_node(NULL), m_ht(NULL) {} \ + Iterator( Node* node, const Self* ht ) \ + : m_node(node), m_ht(const_cast(ht)) {} \ + bool operator ==( const Iterator& it ) const \ + { return m_node == it.m_node; } \ + bool operator !=( const Iterator& it ) const \ + { return m_node != it.m_node; } \ + protected: \ + Node* GetNextNode() \ + { \ + size_type bucket = GetBucketForNode(m_ht,m_node); \ + for( size_type i = bucket + 1; i < m_ht->m_tableBuckets; ++i ) \ + { \ + if( m_ht->m_table[i] ) \ + return static_cast(m_ht->m_table[i]); \ + } \ + return NULL; \ + } \ + \ + void PlusPlus() \ + { \ + Node* next = m_node->next(); \ + m_node = next ? next : GetNextNode(); \ + } \ + }; \ + friend class Iterator; \ + \ +public: \ + CLASSEXP iterator : public Iterator \ + { \ + public: \ + iterator() : Iterator() {} \ + iterator( Node* node, Self* ht ) : Iterator( node, ht ) {} \ + iterator& operator++() { PlusPlus(); return *this; } \ + iterator operator++(int) { iterator it=*this;PlusPlus();return it; } \ + reference operator *() const { return m_node->m_value; } \ + PTROPERATOR(pointer) \ + }; \ + \ + CLASSEXP const_iterator : public Iterator \ + { \ + public: \ + const_iterator() : Iterator() {} \ + const_iterator(iterator i) : Iterator(i) {} \ + const_iterator( Node* node, const Self* ht ) \ + : Iterator(node, const_cast(ht)) {} \ + const_iterator& operator++() { PlusPlus();return *this; } \ + const_iterator operator++(int) { const_iterator it=*this;PlusPlus();return it; } \ + const_reference operator *() const { return m_node->m_value; } \ + PTROPERATOR(const_pointer) \ + }; \ + \ + CLASSNAME( size_type sz = 10, const hasher& hfun = hasher(), \ + const key_equal& k_eq = key_equal(), \ + const key_extractor& k_ex = key_extractor() ) \ + : m_tableBuckets( GetNextPrime( (unsigned long) sz ) ), \ + m_items( 0 ), \ + m_hasher( hfun ), \ + m_equals( k_eq ), \ + m_getKey( k_ex ) \ + { \ + m_table = (_wxHashTable_NodeBase**)AllocTable(m_tableBuckets); \ + } \ + \ + CLASSNAME( const Self& ht ) \ + : m_table(NULL), \ + m_tableBuckets( 0 ), \ + m_items( ht.m_items ), \ + m_hasher( ht.m_hasher ), \ + m_equals( ht.m_equals ), \ + m_getKey( ht.m_getKey ) \ + { \ + HashCopy( ht ); \ + } \ + \ + const Self& operator=( const Self& ht ) \ + { \ + if (&ht != this) \ + { \ + clear(); \ + m_hasher = ht.m_hasher; \ + m_equals = ht.m_equals; \ + m_getKey = ht.m_getKey; \ + m_items = ht.m_items; \ + HashCopy( ht ); \ + } \ + return *this; \ + } \ + \ + ~CLASSNAME() \ + { \ + clear(); \ + \ + FreeTable(m_table); \ + } \ + \ + hasher hash_funct() { return m_hasher; } \ + key_equal key_eq() { return m_equals; } \ + \ + /* removes all elements from the hash table, but does not */ \ + /* shrink it ( perhaps it should ) */ \ + void clear() \ + { \ + DeleteNodes(m_tableBuckets, m_table, DeleteNode); \ + m_items = 0; \ + } \ + \ + size_type size() const { return m_items; } \ + size_type max_size() const { return size_type(-1); } \ + bool empty() const { return size() == 0; } \ + \ + const_iterator end() const { return const_iterator(NULL, this); } \ + iterator end() { return iterator(NULL, this); } \ + const_iterator begin() const \ + { return const_iterator(static_cast(GetFirstNode(m_tableBuckets, m_table)), this); } \ + iterator begin() \ + { return iterator(static_cast(GetFirstNode(m_tableBuckets, m_table)), this); } \ + \ + size_type erase( const const_key_type& key ) \ + { \ + _wxHashTable_NodeBase** node = GetNodePtr(key); \ + \ + if( !node ) \ + return 0; \ + \ + --m_items; \ + _wxHashTable_NodeBase* temp = (*node)->m_next; \ + delete static_cast(*node); \ + (*node) = temp; \ + if( SHOULD_SHRINK( m_tableBuckets, m_items ) ) \ + ResizeTable( GetPreviousPrime( (unsigned long) m_tableBuckets ) - 1 ); \ + return 1; \ + } \ + \ +protected: \ + static size_type GetBucketForNode( Self* ht, Node* node ) \ + { \ + return ht->m_hasher( ht->m_getKey( node->m_value ) ) \ + % ht->m_tableBuckets; \ + } \ + static Node* CopyNode( Node* node ) { return new Node( *node ); } \ + \ + Node* GetOrCreateNode( const value_type& value, bool& created ) \ + { \ + const const_key_type& key = m_getKey( value ); \ + size_t bucket = m_hasher( key ) % m_tableBuckets; \ + Node* node = static_cast(m_table[bucket]); \ + \ + while( node ) \ + { \ + if( m_equals( m_getKey( node->m_value ), key ) ) \ + { \ + created = false; \ + return node; \ + } \ + node = node->next(); \ + } \ + created = true; \ + return CreateNode( value, bucket); \ + }\ + Node * CreateNode( const value_type& value, size_t bucket ) \ + {\ + Node* node = new Node( value ); \ + node->m_next = m_table[bucket]; \ + m_table[bucket] = node; \ + \ + /* must be after the node is inserted */ \ + ++m_items; \ + if( SHOULD_GROW( m_tableBuckets, m_items ) ) \ + ResizeTable( m_tableBuckets ); \ + \ + return node; \ + } \ + void CreateNode( const value_type& value ) \ + {\ + CreateNode(value, m_hasher( m_getKey(value) ) % m_tableBuckets ); \ + }\ + \ + /* returns NULL if not found */ \ + _wxHashTable_NodeBase** GetNodePtr(const const_key_type& key) const \ + { \ + size_t bucket = m_hasher( key ) % m_tableBuckets; \ + _wxHashTable_NodeBase** node = &m_table[bucket]; \ + \ + while( *node ) \ + { \ + if (m_equals(m_getKey(static_cast(*node)->m_value), key)) \ + return node; \ + node = &(*node)->m_next; \ + } \ + \ + return NULL; \ + } \ + \ + /* returns NULL if not found */ \ + /* expressing it in terms of GetNodePtr is 5-8% slower :-( */ \ + Node* GetNode( const const_key_type& key ) const \ + { \ + size_t bucket = m_hasher( key ) % m_tableBuckets; \ + Node* node = static_cast(m_table[bucket]); \ + \ + while( node ) \ + { \ + if( m_equals( m_getKey( node->m_value ), key ) ) \ + return node; \ + node = node->next(); \ + } \ + \ + return NULL; \ + } \ + \ + void ResizeTable( size_t newSize ) \ + { \ + newSize = GetNextPrime( (unsigned long)newSize ); \ + _wxHashTable_NodeBase** srcTable = m_table; \ + size_t srcBuckets = m_tableBuckets; \ + m_table = (_wxHashTable_NodeBase**)AllocTable( newSize ); \ + m_tableBuckets = newSize; \ + \ + CopyHashTable( srcTable, srcBuckets, \ + this, m_table, \ + (BucketFromNode)GetBucketForNode,\ + (ProcessNode)&DummyProcessNode ); \ + FreeTable(srcTable); \ + } \ + \ + /* this must be called _after_ m_table has been cleaned */ \ + void HashCopy( const Self& ht ) \ + { \ + ResizeTable( ht.size() ); \ + CopyHashTable( ht.m_table, ht.m_tableBuckets, \ + (_wxHashTableBase2*)this, \ + m_table, \ + (BucketFromNode)GetBucketForNode, \ + (ProcessNode)CopyNode ); \ + } \ +}; + +// defines an STL-like pair class CLASSNAME storing two fields: first of type +// KEY_T and second of type VALUE_T +#define _WX_DECLARE_PAIR( KEY_T, VALUE_T, CLASSNAME, CLASSEXP ) \ +CLASSEXP CLASSNAME \ +{ \ +public: \ + typedef KEY_T first_type; \ + typedef VALUE_T second_type; \ + typedef KEY_T t1; \ + typedef VALUE_T t2; \ + typedef const KEY_T const_t1; \ + typedef const VALUE_T const_t2; \ + \ + CLASSNAME(const const_t1& f, const const_t2& s) \ + : first(const_cast(f)), second(const_cast(s)) {} \ + \ + t1 first; \ + t2 second; \ +}; + +// defines the class CLASSNAME returning the key part (of type KEY_T) from a +// pair of type PAIR_T +#define _WX_DECLARE_HASH_MAP_KEY_EX( KEY_T, PAIR_T, CLASSNAME, CLASSEXP ) \ +CLASSEXP CLASSNAME \ +{ \ + typedef KEY_T key_type; \ + typedef PAIR_T pair_type; \ + typedef const key_type const_key_type; \ + typedef const pair_type const_pair_type; \ + typedef const_key_type& const_key_reference; \ + typedef const_pair_type& const_pair_reference; \ +public: \ + CLASSNAME() { } \ + const_key_reference operator()( const_pair_reference pair ) const { return pair.first; }\ + \ + /* the dummy assignment operator is needed to suppress compiler */ \ + /* warnings from hash table class' operator=(): gcc complains about */ \ + /* "statement with no effect" without it */ \ + CLASSNAME& operator=(const CLASSNAME&) { return *this; } \ +}; + +// grow/shrink predicates +inline bool never_grow( size_t, size_t ) { return false; } +inline bool never_shrink( size_t, size_t ) { return false; } +inline bool grow_lf70( size_t buckets, size_t items ) +{ + return float(items)/float(buckets) >= 0.85f; +} + +#endif // various hash map implementations + +// ---------------------------------------------------------------------------- +// hashing and comparison functors +// ---------------------------------------------------------------------------- + +// NB: implementation detail: all of these classes must have dummy assignment +// operators to suppress warnings about "statement with no effect" from gcc +// in the hash table class assignment operator (where they're assigned) + +#ifndef wxNEEDS_WX_HASH_MAP + +// integer types +struct WXDLLIMPEXP_BASE wxIntegerHash +{ +private: + WX_HASH_MAP_NAMESPACE::hash longHash; + WX_HASH_MAP_NAMESPACE::hash ulongHash; + WX_HASH_MAP_NAMESPACE::hash intHash; + WX_HASH_MAP_NAMESPACE::hash uintHash; + WX_HASH_MAP_NAMESPACE::hash shortHash; + WX_HASH_MAP_NAMESPACE::hash ushortHash; + +#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + // hash ought to work but doesn't on some compilers + #if (!defined SIZEOF_LONG_LONG && SIZEOF_LONG == 4) \ + || (defined SIZEOF_LONG_LONG && SIZEOF_LONG_LONG == SIZEOF_LONG * 2) + size_t longlongHash( wxLongLong_t x ) const + { + return longHash( wx_truncate_cast(long, x) ) ^ + longHash( wx_truncate_cast(long, x >> (sizeof(long) * 8)) ); + } + #elif defined SIZEOF_LONG_LONG && SIZEOF_LONG_LONG == SIZEOF_LONG + WX_HASH_MAP_NAMESPACE::hash longlongHash; + #else + WX_HASH_MAP_NAMESPACE::hash longlongHash; + #endif +#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + +public: + wxIntegerHash() { } + size_t operator()( long x ) const { return longHash( x ); } + size_t operator()( unsigned long x ) const { return ulongHash( x ); } + size_t operator()( int x ) const { return intHash( x ); } + size_t operator()( unsigned int x ) const { return uintHash( x ); } + size_t operator()( short x ) const { return shortHash( x ); } + size_t operator()( unsigned short x ) const { return ushortHash( x ); } +#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + size_t operator()( wxLongLong_t x ) const { return longlongHash(x); } + size_t operator()( wxULongLong_t x ) const { return longlongHash(x); } +#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + + wxIntegerHash& operator=(const wxIntegerHash&) { return *this; } +}; + +#else // wxNEEDS_WX_HASH_MAP + +// integer types +struct WXDLLIMPEXP_BASE wxIntegerHash +{ + wxIntegerHash() { } + unsigned long operator()( long x ) const { return (unsigned long)x; } + unsigned long operator()( unsigned long x ) const { return x; } + unsigned long operator()( int x ) const { return (unsigned long)x; } + unsigned long operator()( unsigned int x ) const { return x; } + unsigned long operator()( short x ) const { return (unsigned long)x; } + unsigned long operator()( unsigned short x ) const { return x; } +#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + wxULongLong_t operator()( wxLongLong_t x ) const { return static_cast(x); } + wxULongLong_t operator()( wxULongLong_t x ) const { return x; } +#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + + wxIntegerHash& operator=(const wxIntegerHash&) { return *this; } +}; + +#endif // !wxNEEDS_WX_HASH_MAP/wxNEEDS_WX_HASH_MAP + +struct WXDLLIMPEXP_BASE wxIntegerEqual +{ + wxIntegerEqual() { } + bool operator()( long a, long b ) const { return a == b; } + bool operator()( unsigned long a, unsigned long b ) const { return a == b; } + bool operator()( int a, int b ) const { return a == b; } + bool operator()( unsigned int a, unsigned int b ) const { return a == b; } + bool operator()( short a, short b ) const { return a == b; } + bool operator()( unsigned short a, unsigned short b ) const { return a == b; } +#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + bool operator()( wxLongLong_t a, wxLongLong_t b ) const { return a == b; } + bool operator()( wxULongLong_t a, wxULongLong_t b ) const { return a == b; } +#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + + wxIntegerEqual& operator=(const wxIntegerEqual&) { return *this; } +}; + +// pointers +struct WXDLLIMPEXP_BASE wxPointerHash +{ + wxPointerHash() { } + +#ifdef wxNEEDS_WX_HASH_MAP + wxUIntPtr operator()( const void* k ) const { return wxPtrToUInt(k); } +#else + size_t operator()( const void* k ) const { return (size_t)k; } +#endif + + wxPointerHash& operator=(const wxPointerHash&) { return *this; } +}; + +struct WXDLLIMPEXP_BASE wxPointerEqual +{ + wxPointerEqual() { } + bool operator()( const void* a, const void* b ) const { return a == b; } + + wxPointerEqual& operator=(const wxPointerEqual&) { return *this; } +}; + +// wxString, char*, wchar_t* +struct WXDLLIMPEXP_BASE wxStringHash +{ + wxStringHash() {} + unsigned long operator()( const wxString& x ) const + { return stringHash( x.wx_str() ); } + unsigned long operator()( const wchar_t* x ) const + { return stringHash( x ); } + unsigned long operator()( const char* x ) const + { return stringHash( x ); } + +#if WXWIN_COMPATIBILITY_2_8 + static unsigned long wxCharStringHash( const wxChar* x ) + { return stringHash(x); } + #if wxUSE_UNICODE + static unsigned long charStringHash( const char* x ) + { return stringHash(x); } + #endif +#endif // WXWIN_COMPATIBILITY_2_8 + + static unsigned long stringHash( const wchar_t* ); + static unsigned long stringHash( const char* ); + + wxStringHash& operator=(const wxStringHash&) { return *this; } +}; + +struct WXDLLIMPEXP_BASE wxStringEqual +{ + wxStringEqual() {} + bool operator()( const wxString& a, const wxString& b ) const + { return a == b; } + bool operator()( const wxChar* a, const wxChar* b ) const + { return wxStrcmp( a, b ) == 0; } +#if wxUSE_UNICODE + bool operator()( const char* a, const char* b ) const + { return strcmp( a, b ) == 0; } +#endif // wxUSE_UNICODE + + wxStringEqual& operator=(const wxStringEqual&) { return *this; } +}; + +#ifdef wxNEEDS_WX_HASH_MAP + +#define wxPTROP_NORMAL(pointer) \ + pointer operator ->() const { return &(m_node->m_value); } +#define wxPTROP_NOP(pointer) + +#define _WX_DECLARE_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME, CLASSEXP ) \ +_WX_DECLARE_PAIR( KEY_T, VALUE_T, CLASSNAME##_wxImplementation_Pair, CLASSEXP ) \ +_WX_DECLARE_HASH_MAP_KEY_EX( KEY_T, CLASSNAME##_wxImplementation_Pair, CLASSNAME##_wxImplementation_KeyEx, CLASSEXP ) \ +_WX_DECLARE_HASHTABLE( CLASSNAME##_wxImplementation_Pair, KEY_T, HASH_T, \ + CLASSNAME##_wxImplementation_KeyEx, KEY_EQ_T, wxPTROP_NORMAL, \ + CLASSNAME##_wxImplementation_HashTable, CLASSEXP, grow_lf70, never_shrink ) \ +CLASSEXP CLASSNAME:public CLASSNAME##_wxImplementation_HashTable \ +{ \ +public: \ + typedef VALUE_T mapped_type; \ + _WX_DECLARE_PAIR( iterator, bool, Insert_Result, CLASSEXP ) \ + \ + wxEXPLICIT CLASSNAME( size_type hint = 100, hasher hf = hasher(), \ + key_equal eq = key_equal() ) \ + : CLASSNAME##_wxImplementation_HashTable( hint, hf, eq, \ + CLASSNAME##_wxImplementation_KeyEx() ) {} \ + \ + mapped_type& operator[]( const const_key_type& key ) \ + { \ + bool created; \ + return GetOrCreateNode( \ + CLASSNAME##_wxImplementation_Pair( key, mapped_type() ), \ + created)->m_value.second; \ + } \ + \ + const_iterator find( const const_key_type& key ) const \ + { \ + return const_iterator( GetNode( key ), this ); \ + } \ + \ + iterator find( const const_key_type& key ) \ + { \ + return iterator( GetNode( key ), this ); \ + } \ + \ + Insert_Result insert( const value_type& v ) \ + { \ + bool created; \ + Node *node = GetOrCreateNode( \ + CLASSNAME##_wxImplementation_Pair( v.first, v.second ), \ + created); \ + return Insert_Result(iterator(node, this), created); \ + } \ + \ + size_type erase( const key_type& k ) \ + { return CLASSNAME##_wxImplementation_HashTable::erase( k ); } \ + void erase( const iterator& it ) { erase( (*it).first ); } \ + \ + /* count() == 0 | 1 */ \ + size_type count( const const_key_type& key ) \ + { \ + return GetNode( key ) ? 1u : 0u; \ + } \ +} + +#endif // wxNEEDS_WX_HASH_MAP + +// these macros are to be used in the user code +#define WX_DECLARE_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME) \ + _WX_DECLARE_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME, class ) + +#define WX_DECLARE_STRING_HASH_MAP( VALUE_T, CLASSNAME ) \ + _WX_DECLARE_HASH_MAP( wxString, VALUE_T, wxStringHash, wxStringEqual, \ + CLASSNAME, class ) + +#define WX_DECLARE_VOIDPTR_HASH_MAP( VALUE_T, CLASSNAME ) \ + _WX_DECLARE_HASH_MAP( void*, VALUE_T, wxPointerHash, wxPointerEqual, \ + CLASSNAME, class ) + +// and these do exactly the same thing but should be used inside the +// library +#define WX_DECLARE_HASH_MAP_WITH_DECL( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME, DECL) \ + _WX_DECLARE_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME, DECL ) + +#define WX_DECLARE_EXPORTED_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME) \ + WX_DECLARE_HASH_MAP_WITH_DECL( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, \ + CLASSNAME, class WXDLLIMPEXP_CORE ) + +#define WX_DECLARE_STRING_HASH_MAP_WITH_DECL( VALUE_T, CLASSNAME, DECL ) \ + _WX_DECLARE_HASH_MAP( wxString, VALUE_T, wxStringHash, wxStringEqual, \ + CLASSNAME, DECL ) + +#define WX_DECLARE_EXPORTED_STRING_HASH_MAP( VALUE_T, CLASSNAME ) \ + WX_DECLARE_STRING_HASH_MAP_WITH_DECL( VALUE_T, CLASSNAME, \ + class WXDLLIMPEXP_CORE ) + +#define WX_DECLARE_VOIDPTR_HASH_MAP_WITH_DECL( VALUE_T, CLASSNAME, DECL ) \ + _WX_DECLARE_HASH_MAP( void*, VALUE_T, wxPointerHash, wxPointerEqual, \ + CLASSNAME, DECL ) + +#define WX_DECLARE_EXPORTED_VOIDPTR_HASH_MAP( VALUE_T, CLASSNAME ) \ + WX_DECLARE_VOIDPTR_HASH_MAP_WITH_DECL( VALUE_T, CLASSNAME, \ + class WXDLLIMPEXP_CORE ) + +// delete all hash elements +// +// NB: the class declaration of the hash elements must be visible from the +// place where you use this macro, otherwise the proper destructor may not +// be called (a decent compiler should give a warning about it, but don't +// count on it)! +#define WX_CLEAR_HASH_MAP(type, hashmap) \ + { \ + type::iterator it, en; \ + for( it = (hashmap).begin(), en = (hashmap).end(); it != en; ++it ) \ + delete it->second; \ + (hashmap).clear(); \ + } + +//--------------------------------------------------------------------------- +// Declarations of common hashmap classes + +WX_DECLARE_HASH_MAP_WITH_DECL( long, long, wxIntegerHash, wxIntegerEqual, + wxLongToLongHashMap, class WXDLLIMPEXP_BASE ); + +WX_DECLARE_STRING_HASH_MAP_WITH_DECL( wxString, wxStringToStringHashMap, + class WXDLLIMPEXP_BASE ); + +WX_DECLARE_STRING_HASH_MAP_WITH_DECL( wxUIntPtr, wxStringToNumHashMap, + class WXDLLIMPEXP_BASE ); + + +#endif // _WX_HASHMAP_H_ diff --git a/wxmsw/include/wx-3.0/wx/hashset.h b/wxmsw/include/wx-3.0/wx/hashset.h new file mode 100644 index 00000000..8cd1becf --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/hashset.h @@ -0,0 +1,198 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/hashset.h +// Purpose: wxHashSet class +// Author: Mattia Barbon +// Modified by: +// Created: 11/08/2003 +// Copyright: (c) Mattia Barbon +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HASHSET_H_ +#define _WX_HASHSET_H_ + +#include "wx/hashmap.h" + +// see comment in wx/hashmap.h which also applies to different standard hash +// set classes + +#if wxUSE_STD_CONTAINERS && \ + (defined(HAVE_STD_UNORDERED_SET) || defined(HAVE_TR1_UNORDERED_SET)) + +#if defined(HAVE_STD_UNORDERED_SET) + #include + #define WX_HASH_SET_BASE_TEMPLATE std::unordered_set +#elif defined(HAVE_TR1_UNORDERED_SET) + #include + #define WX_HASH_SET_BASE_TEMPLATE std::tr1::unordered_set +#else + #error Update this code: unordered_set is available, but I do not know where. +#endif + +#elif wxUSE_STD_CONTAINERS && defined(HAVE_STL_HASH_MAP) + +#if defined(HAVE_EXT_HASH_MAP) + #include +#elif defined(HAVE_HASH_MAP) + #include +#endif + +#define WX_HASH_SET_BASE_TEMPLATE WX_HASH_MAP_NAMESPACE::hash_set + +#endif // different hash_set/unordered_set possibilities + +#ifdef WX_HASH_SET_BASE_TEMPLATE + +// we need to define the class declared by _WX_DECLARE_HASH_SET as a class and +// not a typedef to allow forward declaring it +#define _WX_DECLARE_HASH_SET_IMPL( KEY_T, HASH_T, KEY_EQ_T, PTROP, CLASSNAME, CLASSEXP ) \ +CLASSEXP CLASSNAME \ + : public WX_HASH_SET_BASE_TEMPLATE< KEY_T, HASH_T, KEY_EQ_T > \ +{ \ +public: \ + explicit CLASSNAME(size_type n = 3, \ + const hasher& h = hasher(), \ + const key_equal& ke = key_equal(), \ + const allocator_type& a = allocator_type()) \ + : WX_HASH_SET_BASE_TEMPLATE< KEY_T, HASH_T, KEY_EQ_T >(n, h, ke, a) \ + {} \ + template \ + CLASSNAME(InputIterator f, InputIterator l, \ + const hasher& h = hasher(), \ + const key_equal& ke = key_equal(), \ + const allocator_type& a = allocator_type()) \ + : WX_HASH_SET_BASE_TEMPLATE< KEY_T, HASH_T, KEY_EQ_T >(f, l, h, ke, a)\ + {} \ + CLASSNAME(const WX_HASH_SET_BASE_TEMPLATE< KEY_T, HASH_T, KEY_EQ_T >& s) \ + : WX_HASH_SET_BASE_TEMPLATE< KEY_T, HASH_T, KEY_EQ_T >(s) \ + {} \ +} + +// In some standard library implementations (in particular, the libstdc++ that +// ships with g++ 4.7), std::unordered_set inherits privately from its hasher +// and comparator template arguments for purposes of empty base optimization. +// As a result, in the declaration of a class deriving from std::unordered_set +// the names of the hasher and comparator classes are interpreted as naming +// the base class which is inaccessible. +// The workaround is to prefix the class names with 'struct'; however, don't +// do this on MSVC because it causes a warning there if the class was +// declared as a 'class' rather than a 'struct' (and MSVC's std::unordered_set +// implementation does not suffer from the access problem). +#ifdef _MSC_VER +#define WX_MAYBE_PREFIX_WITH_STRUCT(STRUCTNAME) STRUCTNAME +#else +#define WX_MAYBE_PREFIX_WITH_STRUCT(STRUCTNAME) struct STRUCTNAME +#endif + +#define _WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, PTROP, CLASSNAME, CLASSEXP ) \ + _WX_DECLARE_HASH_SET_IMPL( \ + KEY_T, \ + WX_MAYBE_PREFIX_WITH_STRUCT(HASH_T), \ + WX_MAYBE_PREFIX_WITH_STRUCT(KEY_EQ_T), \ + PTROP, \ + CLASSNAME, \ + CLASSEXP) + +#else // no appropriate STL class, use our own implementation + +// this is a complex way of defining an easily inlineable identity function... +#define _WX_DECLARE_HASH_SET_KEY_EX( KEY_T, CLASSNAME, CLASSEXP ) \ +CLASSEXP CLASSNAME \ +{ \ + typedef KEY_T key_type; \ + typedef const key_type const_key_type; \ + typedef const_key_type& const_key_reference; \ +public: \ + CLASSNAME() { } \ + const_key_reference operator()( const_key_reference key ) const \ + { return key; } \ + \ + /* the dummy assignment operator is needed to suppress compiler */ \ + /* warnings from hash table class' operator=(): gcc complains about */ \ + /* "statement with no effect" without it */ \ + CLASSNAME& operator=(const CLASSNAME&) { return *this; } \ +}; + +#define _WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, PTROP, CLASSNAME, CLASSEXP )\ +_WX_DECLARE_HASH_SET_KEY_EX( KEY_T, CLASSNAME##_wxImplementation_KeyEx, CLASSEXP ) \ +_WX_DECLARE_HASHTABLE( KEY_T, KEY_T, HASH_T, \ + CLASSNAME##_wxImplementation_KeyEx, KEY_EQ_T, PTROP, \ + CLASSNAME##_wxImplementation_HashTable, CLASSEXP, grow_lf70, never_shrink ) \ +CLASSEXP CLASSNAME:public CLASSNAME##_wxImplementation_HashTable \ +{ \ +public: \ + _WX_DECLARE_PAIR( iterator, bool, Insert_Result, CLASSEXP ) \ + \ + wxEXPLICIT CLASSNAME( size_type hint = 100, hasher hf = hasher(), \ + key_equal eq = key_equal() ) \ + : CLASSNAME##_wxImplementation_HashTable( hint, hf, eq, \ + CLASSNAME##_wxImplementation_KeyEx() ) {} \ + \ + Insert_Result insert( const key_type& key ) \ + { \ + bool created; \ + Node *node = GetOrCreateNode( key, created ); \ + return Insert_Result( iterator( node, this ), created ); \ + } \ + \ + const_iterator find( const const_key_type& key ) const \ + { \ + return const_iterator( GetNode( key ), this ); \ + } \ + \ + iterator find( const const_key_type& key ) \ + { \ + return iterator( GetNode( key ), this ); \ + } \ + \ + size_type erase( const key_type& k ) \ + { return CLASSNAME##_wxImplementation_HashTable::erase( k ); } \ + void erase( const iterator& it ) { erase( *it ); } \ + void erase( const const_iterator& it ) { erase( *it ); } \ + \ + /* count() == 0 | 1 */ \ + size_type count( const const_key_type& key ) const \ + { return GetNode( key ) ? 1 : 0; } \ +} + +#endif // STL/wx implementations + + +// these macros are to be used in the user code +#define WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, CLASSNAME) \ + _WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, wxPTROP_NORMAL, CLASSNAME, class ) + +// and these do exactly the same thing but should be used inside the +// library +#define WX_DECLARE_HASH_SET_WITH_DECL( KEY_T, HASH_T, KEY_EQ_T, CLASSNAME, DECL) \ + _WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, wxPTROP_NORMAL, CLASSNAME, DECL ) + +#define WX_DECLARE_EXPORTED_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, CLASSNAME) \ + WX_DECLARE_HASH_SET_WITH_DECL( KEY_T, HASH_T, KEY_EQ_T, \ + CLASSNAME, class WXDLLIMPEXP_CORE ) + +// Finally these versions allow to define hash sets of non-objects (including +// pointers, hence the confusing but wxArray-compatible name) without +// operator->() which can't be used for them. This is mostly used inside the +// library itself to avoid warnings when using such hash sets with some less +// common compilers (notably Sun CC). +#define WX_DECLARE_HASH_SET_PTR( KEY_T, HASH_T, KEY_EQ_T, CLASSNAME) \ + _WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, wxPTROP_NOP, CLASSNAME, class ) +#define WX_DECLARE_HASH_SET_WITH_DECL_PTR( KEY_T, HASH_T, KEY_EQ_T, CLASSNAME, DECL) \ + _WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, wxPTROP_NOP, CLASSNAME, DECL ) + +// delete all hash elements +// +// NB: the class declaration of the hash elements must be visible from the +// place where you use this macro, otherwise the proper destructor may not +// be called (a decent compiler should give a warning about it, but don't +// count on it)! +#define WX_CLEAR_HASH_SET(type, hashset) \ + { \ + type::iterator it, en; \ + for( it = (hashset).begin(), en = (hashset).end(); it != en; ++it ) \ + delete *it; \ + (hashset).clear(); \ + } + +#endif // _WX_HASHSET_H_ diff --git a/wxmsw/include/wx-3.0/wx/headercol.h b/wxmsw/include/wx-3.0/wx/headercol.h new file mode 100644 index 00000000..1002c0f5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/headercol.h @@ -0,0 +1,288 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/headercol.h +// Purpose: declaration of wxHeaderColumn class +// Author: Vadim Zeitlin +// Created: 2008-12-02 +// Copyright: (c) 2008 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HEADERCOL_H_ +#define _WX_HEADERCOL_H_ + +#include "wx/bitmap.h" + +#if wxUSE_HEADERCTRL + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +enum +{ + // special value for column width meaning unspecified/default + wxCOL_WIDTH_DEFAULT = -1, + + // size the column automatically to fit all values + wxCOL_WIDTH_AUTOSIZE = -2 +}; + +// bit masks for the various column attributes +enum +{ + // column can be resized (included in default flags) + wxCOL_RESIZABLE = 1, + + // column can be clicked to toggle the sort order by its contents + wxCOL_SORTABLE = 2, + + // column can be dragged to change its order (included in default) + wxCOL_REORDERABLE = 4, + + // column is not shown at all + wxCOL_HIDDEN = 8, + + // default flags for wxHeaderColumn ctor + wxCOL_DEFAULT_FLAGS = wxCOL_RESIZABLE | wxCOL_REORDERABLE +}; + +// ---------------------------------------------------------------------------- +// wxHeaderColumn: interface for a column in a header of controls such as +// wxListCtrl, wxDataViewCtrl or wxGrid +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxHeaderColumn +{ +public: + // ctors and dtor + // -------------- + + /* + Derived classes must provide ctors with the following signatures + (notice that they shouldn't be explicit to allow passing strings/bitmaps + directly to methods such wxHeaderCtrl::AppendColumn()): + wxHeaderColumn(const wxString& title, + int width = wxCOL_WIDTH_DEFAULT, + wxAlignment align = wxALIGN_NOT, + int flags = wxCOL_DEFAULT_FLAGS); + wxHeaderColumn(const wxBitmap &bitmap, + int width = wxDVC_DEFAULT_WIDTH, + wxAlignment align = wxALIGN_CENTER, + int flags = wxCOL_DEFAULT_FLAGS); + */ + + // virtual dtor for the base class to avoid gcc warnings even though we + // don't normally delete the objects of this class via a pointer to + // wxHeaderColumn so it's not necessary, strictly speaking + virtual ~wxHeaderColumn() { } + + // getters for various attributes + // ------------------------------ + + // notice that wxHeaderColumn only provides getters as this is all the + // wxHeaderCtrl needs, various derived class must also provide some way to + // change these attributes but this can be done either at the column level + // (in which case they should inherit from wxSettableHeaderColumn) or via + // the methods of the main control in which case you don't need setters in + // the column class at all + + // title is the string shown for this column + virtual wxString GetTitle() const = 0; + + // bitmap shown (instead of text) in the column header + virtual wxBitmap GetBitmap() const = 0; \ + + // width of the column in pixels, can be set to wxCOL_WIDTH_DEFAULT meaning + // unspecified/default + virtual int GetWidth() const = 0; + + // minimal width can be set for resizable columns to forbid resizing them + // below the specified size (set to 0 to remove) + virtual int GetMinWidth() const = 0; + + // alignment of the text: wxALIGN_CENTRE, wxALIGN_LEFT or wxALIGN_RIGHT + virtual wxAlignment GetAlignment() const = 0; + + + // flags manipulations: + // -------------------- + + // notice that while we make GetFlags() pure virtual here and implement the + // individual flags access in terms of it, for some derived classes it is + // more natural to implement access to each flag individually, in which + // case they can use our GetFromIndividualFlags() helper below to implement + // GetFlags() + + // retrieve all column flags at once: combination of wxCOL_XXX values above + virtual int GetFlags() const = 0; + + bool HasFlag(int flag) const { return (GetFlags() & flag) != 0; } + + + // wxCOL_RESIZABLE + virtual bool IsResizeable() const + { return HasFlag(wxCOL_RESIZABLE); } + + // wxCOL_SORTABLE + virtual bool IsSortable() const + { return HasFlag(wxCOL_SORTABLE); } + + // wxCOL_REORDERABLE + virtual bool IsReorderable() const + { return HasFlag(wxCOL_REORDERABLE); } + + // wxCOL_HIDDEN + virtual bool IsHidden() const + { return HasFlag(wxCOL_HIDDEN); } + bool IsShown() const + { return !IsHidden(); } + + + // sorting + // ------- + + // return true if the column is the one currently used for sorting + virtual bool IsSortKey() const = 0; + + // for sortable columns indicate whether we should sort in ascending or + // descending order (this should only be taken into account if IsSortKey()) + virtual bool IsSortOrderAscending() const = 0; + +protected: + // helper for the class overriding IsXXX() + int GetFromIndividualFlags() const; +}; + +// ---------------------------------------------------------------------------- +// wxSettableHeaderColumn: column which allows to change its fields too +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSettableHeaderColumn : public wxHeaderColumn +{ +public: + virtual void SetTitle(const wxString& title) = 0; + virtual void SetBitmap(const wxBitmap& bitmap) = 0; + virtual void SetWidth(int width) = 0; + virtual void SetMinWidth(int minWidth) = 0; + virtual void SetAlignment(wxAlignment align) = 0; + + // see comment for wxHeaderColumn::GetFlags() about the relationship + // between SetFlags() and Set{Sortable,Reorderable,...} + + // change, set, clear, toggle or test for any individual flag + virtual void SetFlags(int flags) = 0; + void ChangeFlag(int flag, bool set); + void SetFlag(int flag); + void ClearFlag(int flag); + void ToggleFlag(int flag); + + virtual void SetResizeable(bool resizable) + { ChangeFlag(wxCOL_RESIZABLE, resizable); } + virtual void SetSortable(bool sortable) + { ChangeFlag(wxCOL_SORTABLE, sortable); } + virtual void SetReorderable(bool reorderable) + { ChangeFlag(wxCOL_REORDERABLE, reorderable); } + virtual void SetHidden(bool hidden) + { ChangeFlag(wxCOL_HIDDEN, hidden); } + + // This function can be called to indicate that this column is not used for + // sorting any more. Under some platforms it's not necessary to do anything + // in this case as just setting another column as a sort key takes care of + // everything but under MSW we currently need to call this explicitly to + // reset the sort indicator displayed on the column. + virtual void UnsetAsSortKey() { } + + virtual void SetSortOrder(bool ascending) = 0; + void ToggleSortOrder() { SetSortOrder(!IsSortOrderAscending()); } + +protected: + // helper for the class overriding individual SetXXX() methods instead of + // overriding SetFlags() + void SetIndividualFlags(int flags); +}; + +// ---------------------------------------------------------------------------- +// wxHeaderColumnSimple: trivial generic implementation of wxHeaderColumn +// ---------------------------------------------------------------------------- + +class wxHeaderColumnSimple : public wxSettableHeaderColumn +{ +public: + // ctors and dtor + wxHeaderColumnSimple(const wxString& title, + int width = wxCOL_WIDTH_DEFAULT, + wxAlignment align = wxALIGN_NOT, + int flags = wxCOL_DEFAULT_FLAGS) + : m_title(title), + m_width(width), + m_align(align), + m_flags(flags) + { + Init(); + } + + wxHeaderColumnSimple(const wxBitmap& bitmap, + int width = wxCOL_WIDTH_DEFAULT, + wxAlignment align = wxALIGN_CENTER, + int flags = wxCOL_DEFAULT_FLAGS) + : m_bitmap(bitmap), + m_width(width), + m_align(align), + m_flags(flags) + { + Init(); + } + + // implement base class pure virtuals + virtual void SetTitle(const wxString& title) { m_title = title; } + virtual wxString GetTitle() const { return m_title; } + + virtual void SetBitmap(const wxBitmap& bitmap) { m_bitmap = bitmap; } + wxBitmap GetBitmap() const { return m_bitmap; } + + virtual void SetWidth(int width) { m_width = width; } + virtual int GetWidth() const { return m_width; } + + virtual void SetMinWidth(int minWidth) { m_minWidth = minWidth; } + virtual int GetMinWidth() const { return m_minWidth; } + + virtual void SetAlignment(wxAlignment align) { m_align = align; } + virtual wxAlignment GetAlignment() const { return m_align; } + + virtual void SetFlags(int flags) { m_flags = flags; } + virtual int GetFlags() const { return m_flags; } + + virtual bool IsSortKey() const { return m_sort; } + virtual void UnsetAsSortKey() { m_sort = false; } + + virtual void SetSortOrder(bool ascending) + { + m_sort = true; + m_sortAscending = ascending; + } + + virtual bool IsSortOrderAscending() const { return m_sortAscending; } + +private: + // common part of all ctors + void Init() + { + m_minWidth = 0; + m_sort = false; + m_sortAscending = true; + } + + wxString m_title; + wxBitmap m_bitmap; + int m_width, + m_minWidth; + wxAlignment m_align; + int m_flags; + bool m_sort, + m_sortAscending; +}; + +#endif // wxUSE_HEADERCTRL + +#endif // _WX_HEADERCOL_H_ + diff --git a/wxmsw/include/wx-3.0/wx/headerctrl.h b/wxmsw/include/wx-3.0/wx/headerctrl.h new file mode 100644 index 00000000..78d7117b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/headerctrl.h @@ -0,0 +1,488 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/headerctrl.h +// Purpose: wxHeaderCtrlBase class: interface of wxHeaderCtrl +// Author: Vadim Zeitlin +// Created: 2008-12-01 +// Copyright: (c) 2008 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HEADERCTRL_H_ +#define _WX_HEADERCTRL_H_ + +#include "wx/control.h" + +#if wxUSE_HEADERCTRL + +#include "wx/dynarray.h" +#include "wx/vector.h" + +#include "wx/headercol.h" + +// notice that the classes in this header are defined in the core library even +// although currently they're only used by wxGrid which is in wxAdv because we +// plan to use it in wxListCtrl which is in core too in the future +class WXDLLIMPEXP_FWD_CORE wxHeaderCtrlEvent; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +enum +{ + // allow column drag and drop + wxHD_ALLOW_REORDER = 0x0001, + + // allow hiding (and showing back) the columns using the menu shown by + // right clicking the header + wxHD_ALLOW_HIDE = 0x0002, + + // style used by default when creating the control + wxHD_DEFAULT_STYLE = wxHD_ALLOW_REORDER +}; + +extern WXDLLIMPEXP_DATA_CORE(const char) wxHeaderCtrlNameStr[]; + +// ---------------------------------------------------------------------------- +// wxHeaderCtrlBase defines the interface of a header control +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxHeaderCtrlBase : public wxControl +{ +public: + /* + Derived classes must provide default ctor as well as a ctor and + Create() function with the following signatures: + + wxHeaderCtrl(wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHD_DEFAULT_STYLE, + const wxString& name = wxHeaderCtrlNameStr); + + bool Create(wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHD_DEFAULT_STYLE, + const wxString& name = wxHeaderCtrlNameStr); + */ + + // column-related methods + // ---------------------- + + // set the number of columns in the control + // + // this also calls UpdateColumn() for all columns + void SetColumnCount(unsigned int count); + + // return the number of columns in the control as set by SetColumnCount() + unsigned int GetColumnCount() const { return DoGetCount(); } + + // return whether the control has any columns + bool IsEmpty() const { return DoGetCount() == 0; } + + // update the column with the given index + void UpdateColumn(unsigned int idx) + { + wxCHECK_RET( idx < GetColumnCount(), "invalid column index" ); + + DoUpdate(idx); + } + + + // columns order + // ------------- + + // set the columns order: the array defines the column index which appears + // the given position, it must have GetColumnCount() elements and contain + // all indices exactly once + void SetColumnsOrder(const wxArrayInt& order); + wxArrayInt GetColumnsOrder() const; + + // get the index of the column at the given display position + unsigned int GetColumnAt(unsigned int pos) const; + + // get the position at which this column is currently displayed + unsigned int GetColumnPos(unsigned int idx) const; + + // reset the columns order to the natural one + void ResetColumnsOrder(); + + // helper function used by the generic version of this control and also + // wxGrid: reshuffles the array of column indices indexed by positions + // (i.e. using the same convention as for SetColumnsOrder()) so that the + // column with the given index is found at the specified position + static void MoveColumnInOrderArray(wxArrayInt& order, + unsigned int idx, + unsigned int pos); + + + // UI helpers + // ---------- + +#if wxUSE_MENUS + // show the popup menu containing all columns with check marks for the ones + // which are currently shown and return true if something was done using it + // (in this case UpdateColumnVisibility() will have been called) or false + // if the menu was cancelled + // + // this is called from the default right click handler for the controls + // with wxHD_ALLOW_HIDE style + bool ShowColumnsMenu(const wxPoint& pt, const wxString& title = wxString()); + + // append the entries for all our columns to the given menu, with the + // currently visible columns being checked + // + // this is used by ShowColumnsMenu() but can also be used if you use your + // own custom columns menu but nevertheless want to show all the columns in + // it + // + // the ids of the items corresponding to the columns are consecutive and + // start from idColumnsBase + void AddColumnsItems(wxMenu& menu, int idColumnsBase = 0); +#endif // wxUSE_MENUS + + // show the columns customization dialog and return true if something was + // changed using it (in which case UpdateColumnVisibility() and/or + // UpdateColumnsOrder() will have been called) + // + // this is called by the control itself from ShowColumnsMenu() (which in + // turn is only called by the control if wxHD_ALLOW_HIDE style was + // specified) and if the control has wxHD_ALLOW_REORDER style as well + bool ShowCustomizeDialog(); + + // compute column title width + int GetColumnTitleWidth(const wxHeaderColumn& col); + + // implementation only from now on + // ------------------------------- + + // the user doesn't need to TAB to this control + virtual bool AcceptsFocusFromKeyboard() const { return false; } + + // this method is only overridden in order to synchronize the control with + // the main window when it is scrolled, the derived class must implement + // DoScrollHorz() + virtual void ScrollWindow(int dx, int dy, const wxRect *rect = NULL); + +protected: + // this method must be implemented by the derived classes to return the + // information for the given column + virtual const wxHeaderColumn& GetColumn(unsigned int idx) const = 0; + + // this method is called from the default EVT_HEADER_SEPARATOR_DCLICK + // handler to update the fitting column width of the given column, it + // should return true if the width was really updated + virtual bool UpdateColumnWidthToFit(unsigned int WXUNUSED(idx), + int WXUNUSED(widthTitle)) + { + return false; + } + + // this method is called from ShowColumnsMenu() and must be overridden to + // update the internal column visibility (there is no need to call + // UpdateColumn() from here, this will be done internally) + virtual void UpdateColumnVisibility(unsigned int WXUNUSED(idx), + bool WXUNUSED(show)) + { + wxFAIL_MSG( "must be overridden if called" ); + } + + // this method is called from ShowCustomizeDialog() to reorder all columns + // at once and should be implemented for controls using wxHD_ALLOW_REORDER + // style (there is no need to call SetColumnsOrder() from here, this is + // done by the control itself) + virtual void UpdateColumnsOrder(const wxArrayInt& WXUNUSED(order)) + { + wxFAIL_MSG( "must be overridden if called" ); + } + + // this method can be overridden in the derived classes to do something + // (e.g. update/resize some internal data structures) before the number of + // columns in the control changes + virtual void OnColumnCountChanging(unsigned int WXUNUSED(count)) { } + + + // helper function for the derived classes: update the array of column + // indices after the number of columns changed + void DoResizeColumnIndices(wxArrayInt& colIndices, unsigned int count); + +protected: + // this window doesn't look nice with the border so don't use it by default + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + +private: + // methods implementing our public API and defined in platform-specific + // implementations + virtual void DoSetCount(unsigned int count) = 0; + virtual unsigned int DoGetCount() const = 0; + virtual void DoUpdate(unsigned int idx) = 0; + + virtual void DoScrollHorz(int dx) = 0; + + virtual void DoSetColumnsOrder(const wxArrayInt& order) = 0; + virtual wxArrayInt DoGetColumnsOrder() const = 0; + + + // event handlers + void OnSeparatorDClick(wxHeaderCtrlEvent& event); +#if wxUSE_MENUS + void OnRClick(wxHeaderCtrlEvent& event); +#endif // wxUSE_MENUS + + DECLARE_EVENT_TABLE() +}; + +// ---------------------------------------------------------------------------- +// wxHeaderCtrl: port-specific header control implementation, notice that this +// is still an ABC which is meant to be used as part of another +// control, see wxHeaderCtrlSimple for a standalone version +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + #include "wx/msw/headerctrl.h" +#else + #define wxHAS_GENERIC_HEADERCTRL + #include "wx/generic/headerctrlg.h" +#endif // platform + +// ---------------------------------------------------------------------------- +// wxHeaderCtrlSimple: concrete header control which can be used standalone +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxHeaderCtrlSimple : public wxHeaderCtrl +{ +public: + // control creation + // ---------------- + + wxHeaderCtrlSimple() { Init(); } + wxHeaderCtrlSimple(wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHD_DEFAULT_STYLE, + const wxString& name = wxHeaderCtrlNameStr) + { + Init(); + + Create(parent, winid, pos, size, style, name); + } + + // managing the columns + // -------------------- + + // insert the column at the given position, using GetColumnCount() as + // position appends it at the end + void InsertColumn(const wxHeaderColumnSimple& col, unsigned int idx) + { + wxCHECK_RET( idx <= GetColumnCount(), "invalid column index" ); + + DoInsert(col, idx); + } + + // append the column to the end of the control + void AppendColumn(const wxHeaderColumnSimple& col) + { + DoInsert(col, GetColumnCount()); + } + + // delete the column at the given index + void DeleteColumn(unsigned int idx) + { + wxCHECK_RET( idx < GetColumnCount(), "invalid column index" ); + + DoDelete(idx); + } + + // delete all the existing columns + void DeleteAllColumns(); + + + // modifying columns + // ----------------- + + // show or hide the column, notice that even when a column is hidden we + // still account for it when using indices + void ShowColumn(unsigned int idx, bool show = true) + { + wxCHECK_RET( idx < GetColumnCount(), "invalid column index" ); + + DoShowColumn(idx, show); + } + + void HideColumn(unsigned int idx) + { + ShowColumn(idx, false); + } + + // indicate that the column is used for sorting + void ShowSortIndicator(unsigned int idx, bool ascending = true) + { + wxCHECK_RET( idx < GetColumnCount(), "invalid column index" ); + + DoShowSortIndicator(idx, ascending); + } + + // remove the sort indicator completely + void RemoveSortIndicator(); + +protected: + // implement/override base class methods + virtual const wxHeaderColumn& GetColumn(unsigned int idx) const; + virtual bool UpdateColumnWidthToFit(unsigned int idx, int widthTitle); + + // and define another one to be overridden in the derived classes: it + // should return the best width for the given column contents or -1 if not + // implemented, we use it to implement UpdateColumnWidthToFit() + virtual int GetBestFittingWidth(unsigned int WXUNUSED(idx)) const + { + return -1; + } + +private: + // functions implementing our public API + void DoInsert(const wxHeaderColumnSimple& col, unsigned int idx); + void DoDelete(unsigned int idx); + void DoShowColumn(unsigned int idx, bool show); + void DoShowSortIndicator(unsigned int idx, bool ascending); + + // common part of all ctors + void Init(); + + // bring the column count in sync with the number of columns we store + void UpdateColumnCount() + { + SetColumnCount(static_cast(m_cols.size())); + } + + + // all our current columns + typedef wxVector Columns; + Columns m_cols; + + // the column currently used for sorting or -1 if none + unsigned int m_sortKey; + + + wxDECLARE_NO_COPY_CLASS(wxHeaderCtrlSimple); +}; + +// ---------------------------------------------------------------------------- +// wxHeaderCtrl events +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxHeaderCtrlEvent : public wxNotifyEvent +{ +public: + wxHeaderCtrlEvent(wxEventType commandType = wxEVT_NULL, int winid = 0) + : wxNotifyEvent(commandType, winid), + m_col(-1), + m_width(0), + m_order(static_cast(-1)) + { + } + + wxHeaderCtrlEvent(const wxHeaderCtrlEvent& event) + : wxNotifyEvent(event), + m_col(event.m_col), + m_width(event.m_width), + m_order(event.m_order) + { + } + + // the column which this event pertains to: valid for all header events + int GetColumn() const { return m_col; } + void SetColumn(int col) { m_col = col; } + + // the width of the column: valid for column resizing/dragging events only + int GetWidth() const { return m_width; } + void SetWidth(int width) { m_width = width; } + + // the new position of the column: for end reorder events only + unsigned int GetNewOrder() const { return m_order; } + void SetNewOrder(unsigned int order) { m_order = order; } + + virtual wxEvent *Clone() const { return new wxHeaderCtrlEvent(*this); } + +protected: + // the column affected by the event + int m_col; + + // the current width for the dragging events + int m_width; + + // the new column position for end reorder event + unsigned int m_order; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxHeaderCtrlEvent) +}; + + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_CLICK, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_RIGHT_CLICK, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_MIDDLE_CLICK, wxHeaderCtrlEvent ); + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_DCLICK, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_RIGHT_DCLICK, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_MIDDLE_DCLICK, wxHeaderCtrlEvent ); + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_SEPARATOR_DCLICK, wxHeaderCtrlEvent ); + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_BEGIN_RESIZE, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_RESIZING, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_END_RESIZE, wxHeaderCtrlEvent ); + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_BEGIN_REORDER, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_END_REORDER, wxHeaderCtrlEvent ); + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_DRAGGING_CANCELLED, wxHeaderCtrlEvent ); + +typedef void (wxEvtHandler::*wxHeaderCtrlEventFunction)(wxHeaderCtrlEvent&); + +#define wxHeaderCtrlEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxHeaderCtrlEventFunction, func) + +#define wx__DECLARE_HEADER_EVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_HEADER_ ## evt, id, wxHeaderCtrlEventHandler(fn)) + +#define EVT_HEADER_CLICK(id, fn) wx__DECLARE_HEADER_EVT(CLICK, id, fn) +#define EVT_HEADER_RIGHT_CLICK(id, fn) wx__DECLARE_HEADER_EVT(RIGHT_CLICK, id, fn) +#define EVT_HEADER_MIDDLE_CLICK(id, fn) wx__DECLARE_HEADER_EVT(MIDDLE_CLICK, id, fn) + +#define EVT_HEADER_DCLICK(id, fn) wx__DECLARE_HEADER_EVT(DCLICK, id, fn) +#define EVT_HEADER_RIGHT_DCLICK(id, fn) wx__DECLARE_HEADER_EVT(RIGHT_DCLICK, id, fn) +#define EVT_HEADER_MIDDLE_DCLICK(id, fn) wx__DECLARE_HEADER_EVT(MIDDLE_DCLICK, id, fn) + +#define EVT_HEADER_SEPARATOR_DCLICK(id, fn) wx__DECLARE_HEADER_EVT(SEPARATOR_DCLICK, id, fn) + +#define EVT_HEADER_BEGIN_RESIZE(id, fn) wx__DECLARE_HEADER_EVT(BEGIN_RESIZE, id, fn) +#define EVT_HEADER_RESIZING(id, fn) wx__DECLARE_HEADER_EVT(RESIZING, id, fn) +#define EVT_HEADER_END_RESIZE(id, fn) wx__DECLARE_HEADER_EVT(END_RESIZE, id, fn) + +#define EVT_HEADER_BEGIN_REORDER(id, fn) wx__DECLARE_HEADER_EVT(BEGIN_REORDER, id, fn) +#define EVT_HEADER_END_REORDER(id, fn) wx__DECLARE_HEADER_EVT(END_REORDER, id, fn) + +#define EVT_HEADER_DRAGGING_CANCELLED(id, fn) wx__DECLARE_HEADER_EVT(DRAGGING_CANCELLED, id, fn) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_HEADER_CLICK wxEVT_HEADER_CLICK +#define wxEVT_COMMAND_HEADER_RIGHT_CLICK wxEVT_HEADER_RIGHT_CLICK +#define wxEVT_COMMAND_HEADER_MIDDLE_CLICK wxEVT_HEADER_MIDDLE_CLICK +#define wxEVT_COMMAND_HEADER_DCLICK wxEVT_HEADER_DCLICK +#define wxEVT_COMMAND_HEADER_RIGHT_DCLICK wxEVT_HEADER_RIGHT_DCLICK +#define wxEVT_COMMAND_HEADER_MIDDLE_DCLICK wxEVT_HEADER_MIDDLE_DCLICK +#define wxEVT_COMMAND_HEADER_SEPARATOR_DCLICK wxEVT_HEADER_SEPARATOR_DCLICK +#define wxEVT_COMMAND_HEADER_BEGIN_RESIZE wxEVT_HEADER_BEGIN_RESIZE +#define wxEVT_COMMAND_HEADER_RESIZING wxEVT_HEADER_RESIZING +#define wxEVT_COMMAND_HEADER_END_RESIZE wxEVT_HEADER_END_RESIZE +#define wxEVT_COMMAND_HEADER_BEGIN_REORDER wxEVT_HEADER_BEGIN_REORDER +#define wxEVT_COMMAND_HEADER_END_REORDER wxEVT_HEADER_END_REORDER +#define wxEVT_COMMAND_HEADER_DRAGGING_CANCELLED wxEVT_HEADER_DRAGGING_CANCELLED + +#endif // wxUSE_HEADERCTRL + +#endif // _WX_HEADERCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/help.h b/wxmsw/include/wx-3.0/wx/help.h new file mode 100644 index 00000000..17539c1b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/help.h @@ -0,0 +1,43 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/help.h +// Purpose: wxHelpController base header +// Author: wxWidgets Team +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELP_H_BASE_ +#define _WX_HELP_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_HELP + +#include "wx/helpbase.h" + +#ifdef __WXWINCE__ + #include "wx/msw/wince/helpwce.h" + + #define wxHelpController wxWinceHelpController +#elif defined(__WXMSW__) + #include "wx/msw/helpchm.h" + + #define wxHelpController wxCHMHelpController +#else // !MSW + +#if wxUSE_WXHTML_HELP + #include "wx/html/helpctrl.h" + #define wxHelpController wxHtmlHelpController +#else + #include "wx/generic/helpext.h" + #define wxHelpController wxExtHelpController +#endif + +#endif // MSW/!MSW + +#endif // wxUSE_HELP + +#endif + // _WX_HELP_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/helpbase.h b/wxmsw/include/wx-3.0/wx/helpbase.h new file mode 100644 index 00000000..9a924fd3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/helpbase.h @@ -0,0 +1,105 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/helpbase.h +// Purpose: Help system base classes +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPBASEH__ +#define _WX_HELPBASEH__ + +#include "wx/defs.h" + +#if wxUSE_HELP + +#include "wx/object.h" +#include "wx/string.h" +#include "wx/gdicmn.h" +#include "wx/frame.h" + +// Flags for SetViewer +#define wxHELP_NETSCAPE 1 + +// Search modes: +enum wxHelpSearchMode +{ + wxHELP_SEARCH_INDEX, + wxHELP_SEARCH_ALL +}; + +// Defines the API for help controllers +class WXDLLIMPEXP_CORE wxHelpControllerBase: public wxObject +{ +public: + inline wxHelpControllerBase(wxWindow* parentWindow = NULL) { m_parentWindow = parentWindow; } + inline ~wxHelpControllerBase() {} + + // Must call this to set the filename and server name. + // server is only required when implementing TCP/IP-based + // help controllers. + virtual bool Initialize(const wxString& WXUNUSED(file), int WXUNUSED(server) ) { return false; } + virtual bool Initialize(const wxString& WXUNUSED(file)) { return false; } + + // Set viewer: only relevant to some kinds of controller + virtual void SetViewer(const wxString& WXUNUSED(viewer), long WXUNUSED(flags) = 0) {} + + // If file is "", reloads file given in Initialize + virtual bool LoadFile(const wxString& file = wxEmptyString) = 0; + + // Displays the contents + virtual bool DisplayContents(void) = 0; + + // Display the given section + virtual bool DisplaySection(int sectionNo) = 0; + + // Display the section using a context id + virtual bool DisplayContextPopup(int WXUNUSED(contextId)) { return false; } + + // Display the text in a popup, if possible + virtual bool DisplayTextPopup(const wxString& WXUNUSED(text), const wxPoint& WXUNUSED(pos)) { return false; } + + // By default, uses KeywordSection to display a topic. Implementations + // may override this for more specific behaviour. + virtual bool DisplaySection(const wxString& section) { return KeywordSearch(section); } + virtual bool DisplayBlock(long blockNo) = 0; + virtual bool KeywordSearch(const wxString& k, + wxHelpSearchMode mode = wxHELP_SEARCH_ALL) = 0; + /// Allows one to override the default settings for the help frame. + virtual void SetFrameParameters(const wxString& WXUNUSED(title), + const wxSize& WXUNUSED(size), + const wxPoint& WXUNUSED(pos) = wxDefaultPosition, + bool WXUNUSED(newFrameEachTime) = false) + { + // does nothing by default + } + /// Obtains the latest settings used by the help frame and the help + /// frame. + virtual wxFrame *GetFrameParameters(wxSize *WXUNUSED(size) = NULL, + wxPoint *WXUNUSED(pos) = NULL, + bool *WXUNUSED(newFrameEachTime) = NULL) + { + return NULL; // does nothing by default + } + + virtual bool Quit() = 0; + virtual void OnQuit() {} + + /// Set the window that can optionally be used for the help window's parent. + virtual void SetParentWindow(wxWindow* win) { m_parentWindow = win; } + + /// Get the window that can optionally be used for the help window's parent. + virtual wxWindow* GetParentWindow() const { return m_parentWindow; } + +protected: + wxWindow* m_parentWindow; +private: + DECLARE_CLASS(wxHelpControllerBase) +}; + +#endif // wxUSE_HELP + +#endif +// _WX_HELPBASEH__ diff --git a/wxmsw/include/wx-3.0/wx/helphtml.h b/wxmsw/include/wx-3.0/wx/helphtml.h new file mode 100644 index 00000000..87bc81df --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/helphtml.h @@ -0,0 +1,19 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/helphtml.h +// Purpose: Includes wx/html/helpctrl.h, for wxHtmlHelpController. +// Author: Julian Smart +// Modified by: +// Created: 2003-05-24 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __WX_HELPHTML_H_ +#define __WX_HELPHTML_H_ + +#if wxUSE_WXHTML_HELP +#include "wx/html/helpctrl.h" +#endif + +#endif // __WX_HELPHTML_H_ + diff --git a/wxmsw/include/wx-3.0/wx/helpwin.h b/wxmsw/include/wx-3.0/wx/helpwin.h new file mode 100644 index 00000000..b73a62eb --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/helpwin.h @@ -0,0 +1,21 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/helpwin.h +// Purpose: Includes Windows or OS/2 help +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPWIN_H_BASE_ +#define _WX_HELPWIN_H_BASE_ + +#if defined(__WXMSW__) +#include "wx/msw/helpwin.h" +#elif defined(__WXPM__) +#include "wx/os2/helpwin.h" +#endif + +#endif + // _WX_HELPWIN_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/html/forcelnk.h b/wxmsw/include/wx-3.0/wx/html/forcelnk.h new file mode 100644 index 00000000..8d3631c9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/forcelnk.h @@ -0,0 +1,62 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/forcelnk.h +// Purpose: macros which force the linker to link apparently unused code +// Author: Vaclav Slavik +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +/* + +DESCRPITON: + +mod_*.cpp files contain handlers for tags. These files are modules - they contain +one wxTagModule class and it's OnInit() method is called from wxApp's init method. +The module is called even if you only link it into the executable, so everything +seems wonderful. + +The problem is that we have these modules in LIBRARY and mod_*.cpp files contain +no method nor class which is known out of the module. So the linker won't +link these .o/.obj files into executable because it detected that it is not used +by the program. + +To workaround this I introduced set of macros FORCE_LINK_ME and FORCE_LINK. These +macros are generic and are not limited to mod_*.cpp files. You may find them quite +useful somewhere else... + +How to use them: +let's suppose you want to always link file foo.cpp and that you have module +always.cpp that is certainly always linked (e.g. the one with main() function +or htmlwin.cpp in wxHtml library). + +Place FORCE_LINK_ME(foo) somewhere in foo.cpp and FORCE_LINK(foo) somewhere +in always.cpp +See mod_*.cpp and htmlwin.cpp for example :-) + +*/ + + +#ifndef _WX_FORCELNK_H_ +#define _WX_FORCELNK_H_ + +#include "wx/link.h" + +// compatibility defines +#define FORCE_LINK wxFORCE_LINK_MODULE +#define FORCE_LINK_ME wxFORCE_LINK_THIS_MODULE + +#define FORCE_WXHTML_MODULES() \ + FORCE_LINK(m_layout) \ + FORCE_LINK(m_fonts) \ + FORCE_LINK(m_image) \ + FORCE_LINK(m_list) \ + FORCE_LINK(m_dflist) \ + FORCE_LINK(m_pre) \ + FORCE_LINK(m_hline) \ + FORCE_LINK(m_links) \ + FORCE_LINK(m_tables) \ + FORCE_LINK(m_span) \ + FORCE_LINK(m_style) + + +#endif // _WX_FORCELNK_H_ diff --git a/wxmsw/include/wx-3.0/wx/html/helpctrl.h b/wxmsw/include/wx-3.0/wx/html/helpctrl.h new file mode 100644 index 00000000..0053823a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/helpctrl.h @@ -0,0 +1,164 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/helpctrl.h +// Purpose: wxHtmlHelpController +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden and Vaclav Slavik +// Copyright: (c) Harm van der Heijden and Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPCTRL_H_ +#define _WX_HELPCTRL_H_ + +#include "wx/defs.h" + +#if wxUSE_WXHTML_HELP + +#include "wx/helpbase.h" +#include "wx/html/helpfrm.h" + +#define wxID_HTML_HELPFRAME (wxID_HIGHEST + 1) + +// This style indicates that the window is +// embedded in the application and must not be +// destroyed by the help controller. +#define wxHF_EMBEDDED 0x00008000 + +// Create a dialog for the help window. +#define wxHF_DIALOG 0x00010000 + +// Create a frame for the help window. +#define wxHF_FRAME 0x00020000 + +// Make the dialog modal when displaying help. +#define wxHF_MODAL 0x00040000 + +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpDialog; +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpWindow; +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpFrame; +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpDialog; + +class WXDLLIMPEXP_HTML wxHtmlHelpController : public wxHelpControllerBase // wxEvtHandler +{ + DECLARE_DYNAMIC_CLASS(wxHtmlHelpController) + +public: + wxHtmlHelpController(int style = wxHF_DEFAULT_STYLE, wxWindow* parentWindow = NULL); + wxHtmlHelpController(wxWindow* parentWindow, int style = wxHF_DEFAULT_STYLE); + + virtual ~wxHtmlHelpController(); + + void SetShouldPreventAppExit(bool enable); + + void SetTitleFormat(const wxString& format); + void SetTempDir(const wxString& path) { m_helpData.SetTempDir(path); } + bool AddBook(const wxString& book_url, bool show_wait_msg = false); + bool AddBook(const wxFileName& book_file, bool show_wait_msg = false); + + bool Display(const wxString& x); + bool Display(int id); + bool DisplayContents(); + bool DisplayIndex(); + bool KeywordSearch(const wxString& keyword, + wxHelpSearchMode mode = wxHELP_SEARCH_ALL); + + wxHtmlHelpWindow* GetHelpWindow() { return m_helpWindow; } + void SetHelpWindow(wxHtmlHelpWindow* helpWindow); + + wxHtmlHelpFrame* GetFrame() { return m_helpFrame; } + wxHtmlHelpDialog* GetDialog() { return m_helpDialog; } + +#if wxUSE_CONFIG + void UseConfig(wxConfigBase *config, const wxString& rootpath = wxEmptyString); + + // Assigns config object to the Ctrl. This config is then + // used in subsequent calls to Read/WriteCustomization of both help + // Ctrl and it's wxHtmlWindow + virtual void ReadCustomization(wxConfigBase *cfg, const wxString& path = wxEmptyString); + virtual void WriteCustomization(wxConfigBase *cfg, const wxString& path = wxEmptyString); +#endif // wxUSE_CONFIG + + //// Backward compatibility with wxHelpController API + + virtual bool Initialize(const wxString& file, int WXUNUSED(server) ) { return Initialize(file); } + virtual bool Initialize(const wxString& file); + virtual void SetViewer(const wxString& WXUNUSED(viewer), long WXUNUSED(flags) = 0) {} + virtual bool LoadFile(const wxString& file = wxT("")); + virtual bool DisplaySection(int sectionNo); + virtual bool DisplaySection(const wxString& section) { return Display(section); } + virtual bool DisplayBlock(long blockNo) { return DisplaySection(blockNo); } + virtual bool DisplayTextPopup(const wxString& text, const wxPoint& pos); + + virtual void SetFrameParameters(const wxString& titleFormat, + const wxSize& size, + const wxPoint& pos = wxDefaultPosition, + bool newFrameEachTime = false); + /// Obtains the latest settings used by the help frame and the help + /// frame. + virtual wxFrame *GetFrameParameters(wxSize *size = NULL, + wxPoint *pos = NULL, + bool *newFrameEachTime = NULL); + + // Get direct access to help data: + wxHtmlHelpData *GetHelpData() { return &m_helpData; } + + virtual bool Quit() ; + virtual void OnQuit() {} + + void OnCloseFrame(wxCloseEvent& evt); + + // Make the help controller's frame 'modal' if + // needed + void MakeModalIfNeeded(); + + // Find the top-most parent window + wxWindow* FindTopLevelWindow(); + +protected: + void Init(int style); + + virtual wxWindow* CreateHelpWindow(); + virtual wxHtmlHelpFrame* CreateHelpFrame(wxHtmlHelpData *data); + virtual wxHtmlHelpDialog* CreateHelpDialog(wxHtmlHelpData *data); + virtual void DestroyHelpWindow(); + + wxHtmlHelpData m_helpData; + wxHtmlHelpWindow* m_helpWindow; +#if wxUSE_CONFIG + wxConfigBase * m_Config; + wxString m_ConfigRoot; +#endif // wxUSE_CONFIG + wxString m_titleFormat; + int m_FrameStyle; + wxHtmlHelpFrame* m_helpFrame; + wxHtmlHelpDialog* m_helpDialog; + + bool m_shouldPreventAppExit; + + wxDECLARE_NO_COPY_CLASS(wxHtmlHelpController); +}; + +/* + * wxHtmlModalHelp + * A convenience class particularly for use on wxMac, + * where you can only show modal dialogs from a modal + * dialog. + * + * Use like this: + * + * wxHtmlModalHelp help(parent, filename, topic); + * + * If topic is empty, the help contents is displayed. + */ + +class WXDLLIMPEXP_HTML wxHtmlModalHelp +{ +public: + wxHtmlModalHelp(wxWindow* parent, const wxString& helpFile, const wxString& topic = wxEmptyString, + int style = wxHF_DEFAULT_STYLE | wxHF_DIALOG | wxHF_MODAL); +}; + +#endif // wxUSE_WXHTML_HELP + +#endif // _WX_HELPCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/html/helpdata.h b/wxmsw/include/wx-3.0/wx/html/helpdata.h new file mode 100644 index 00000000..5b448037 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/helpdata.h @@ -0,0 +1,222 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/helpdata.h +// Purpose: wxHtmlHelpData +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden and Vaclav Slavik +// Copyright: (c) Harm van der Heijden and Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPDATA_H_ +#define _WX_HELPDATA_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/object.h" +#include "wx/string.h" +#include "wx/filesys.h" +#include "wx/dynarray.h" +#include "wx/font.h" + +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpData; + +//-------------------------------------------------------------------------------- +// helper classes & structs +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlBookRecord +{ +public: + wxHtmlBookRecord(const wxString& bookfile, const wxString& basepath, + const wxString& title, const wxString& start) + { + m_BookFile = bookfile; + m_BasePath = basepath; + m_Title = title; + m_Start = start; + // for debugging, give the contents index obvious default values + m_ContentsStart = m_ContentsEnd = -1; + } + wxString GetBookFile() const { return m_BookFile; } + wxString GetTitle() const { return m_Title; } + wxString GetStart() const { return m_Start; } + wxString GetBasePath() const { return m_BasePath; } + /* SetContentsRange: store in the bookrecord where in the index/contents lists the + * book's records are stored. This to facilitate searching in a specific book. + * This code will have to be revised when loading/removing books becomes dynamic. + * (as opposed to appending only) + * Note that storing index range is pointless, because the index is alphab. sorted. */ + void SetContentsRange(int start, int end) { m_ContentsStart = start; m_ContentsEnd = end; } + int GetContentsStart() const { return m_ContentsStart; } + int GetContentsEnd() const { return m_ContentsEnd; } + + void SetTitle(const wxString& title) { m_Title = title; } + void SetBasePath(const wxString& path) { m_BasePath = path; } + void SetStart(const wxString& start) { m_Start = start; } + + // returns full filename of page (which is part of the book), + // i.e. with book's basePath prepended. If page is already absolute + // path, basePath is _not_ prepended. + wxString GetFullPath(const wxString &page) const; + +protected: + wxString m_BookFile; + wxString m_BasePath; + wxString m_Title; + wxString m_Start; + int m_ContentsStart; + int m_ContentsEnd; +}; + + +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxHtmlBookRecord, wxHtmlBookRecArray, + WXDLLIMPEXP_HTML); + +struct WXDLLIMPEXP_HTML wxHtmlHelpDataItem +{ + wxHtmlHelpDataItem() : level(0), parent(NULL), id(wxID_ANY), book(NULL) {} + + int level; + wxHtmlHelpDataItem *parent; + int id; + wxString name; + wxString page; + wxHtmlBookRecord *book; + + // returns full filename of m_Page, i.e. with book's basePath prepended + wxString GetFullPath() const { return book->GetFullPath(page); } + + // returns item indented with spaces if it has level>1: + wxString GetIndentedName() const; +}; + +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxHtmlHelpDataItem, wxHtmlHelpDataItems, + WXDLLIMPEXP_HTML); + + +//------------------------------------------------------------------------------ +// wxHtmlSearchEngine +// This class takes input streams and scans them for occurrence +// of keyword(s) +//------------------------------------------------------------------------------ + +class WXDLLIMPEXP_HTML wxHtmlSearchEngine : public wxObject +{ +public: + wxHtmlSearchEngine() : wxObject() {} + virtual ~wxHtmlSearchEngine() {} + + // Sets the keyword we will be searching for + virtual void LookFor(const wxString& keyword, bool case_sensitive, bool whole_words_only); + + // Scans the stream for the keyword. + // Returns true if the stream contains keyword, fALSE otherwise + virtual bool Scan(const wxFSFile& file); + +private: + wxString m_Keyword; + bool m_CaseSensitive; + bool m_WholeWords; + + wxDECLARE_NO_COPY_CLASS(wxHtmlSearchEngine); +}; + + +// State information of a search action. I'd have preferred to make this a +// nested class inside wxHtmlHelpData, but that's against coding standards :-( +// Never construct this class yourself, obtain a copy from +// wxHtmlHelpData::PrepareKeywordSearch(const wxString& key) +class WXDLLIMPEXP_HTML wxHtmlSearchStatus +{ +public: + // constructor; supply wxHtmlHelpData ptr, the keyword and (optionally) the + // title of the book to search. By default, all books are searched. + wxHtmlSearchStatus(wxHtmlHelpData* base, const wxString& keyword, + bool case_sensitive, bool whole_words_only, + const wxString& book = wxEmptyString); + bool Search(); // do the next iteration + bool IsActive() { return m_Active; } + int GetCurIndex() { return m_CurIndex; } + int GetMaxIndex() { return m_MaxIndex; } + const wxString& GetName() { return m_Name; } + + const wxHtmlHelpDataItem *GetCurItem() const { return m_CurItem; } + +private: + wxHtmlHelpData* m_Data; + wxHtmlSearchEngine m_Engine; + wxString m_Keyword, m_Name; + wxString m_LastPage; + wxHtmlHelpDataItem* m_CurItem; + bool m_Active; // search is not finished + int m_CurIndex; // where we are now + int m_MaxIndex; // number of files we search + // For progress bar: 100*curindex/maxindex = % complete + + wxDECLARE_NO_COPY_CLASS(wxHtmlSearchStatus); +}; + +class WXDLLIMPEXP_HTML wxHtmlHelpData : public wxObject +{ + DECLARE_DYNAMIC_CLASS(wxHtmlHelpData) + friend class wxHtmlSearchStatus; + +public: + wxHtmlHelpData(); + virtual ~wxHtmlHelpData(); + + // Sets directory where temporary files are stored. + // These temp files are index & contents file in binary (much faster to read) + // form. These files are NOT deleted on program's exit. + void SetTempDir(const wxString& path); + + // Adds new book. 'book' is location of .htb file (stands for "html book"). + // See documentation for details on its format. + // Returns success. + bool AddBook(const wxString& book); + bool AddBookParam(const wxFSFile& bookfile, + wxFontEncoding encoding, + const wxString& title, const wxString& contfile, + const wxString& indexfile = wxEmptyString, + const wxString& deftopic = wxEmptyString, + const wxString& path = wxEmptyString); + + // Some accessing stuff: + + // returns URL of page on basis of (file)name + wxString FindPageByName(const wxString& page); + // returns URL of page on basis of MS id + wxString FindPageById(int id); + + const wxHtmlBookRecArray& GetBookRecArray() const { return m_bookRecords; } + + const wxHtmlHelpDataItems& GetContentsArray() const { return m_contents; } + const wxHtmlHelpDataItems& GetIndexArray() const { return m_index; } + +protected: + wxString m_tempPath; + + // each book has one record in this array: + wxHtmlBookRecArray m_bookRecords; + + wxHtmlHelpDataItems m_contents; // list of all available books and pages + wxHtmlHelpDataItems m_index; // list of index itesm + +protected: + // Imports .hhp files (MS HTML Help Workshop) + bool LoadMSProject(wxHtmlBookRecord *book, wxFileSystem& fsys, + const wxString& indexfile, const wxString& contentsfile); + // Reads binary book + bool LoadCachedBook(wxHtmlBookRecord *book, wxInputStream *f); + // Writes binary book + bool SaveCachedBook(wxHtmlBookRecord *book, wxOutputStream *f); + + wxDECLARE_NO_COPY_CLASS(wxHtmlHelpData); +}; + +#endif + +#endif diff --git a/wxmsw/include/wx-3.0/wx/html/helpdlg.h b/wxmsw/include/wx-3.0/wx/html/helpdlg.h new file mode 100644 index 00000000..fd86b2e3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/helpdlg.h @@ -0,0 +1,89 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/helpdlg.h +// Purpose: wxHtmlHelpDialog +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden, Vaclav Slavik, Julian Smart +// Copyright: (c) Harm van der Heijden, Vaclav Slavik, Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPDLG_H_ +#define _WX_HELPDLG_H_ + +#include "wx/defs.h" + +#if wxUSE_WXHTML_HELP + +#include "wx/html/helpdata.h" +#include "wx/window.h" +#include "wx/dialog.h" +#include "wx/frame.h" +#include "wx/config.h" +#include "wx/splitter.h" +#include "wx/notebook.h" +#include "wx/listbox.h" +#include "wx/choice.h" +#include "wx/combobox.h" +#include "wx/checkbox.h" +#include "wx/stattext.h" +#include "wx/html/htmlwin.h" +#include "wx/html/helpwnd.h" +#include "wx/html/htmprint.h" + +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpController; +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpWindow; + +class WXDLLIMPEXP_HTML wxHtmlHelpDialog : public wxDialog +{ + DECLARE_DYNAMIC_CLASS(wxHtmlHelpDialog) + +public: + wxHtmlHelpDialog(wxHtmlHelpData* data = NULL) { Init(data); } + wxHtmlHelpDialog(wxWindow* parent, wxWindowID wxWindowID, + const wxString& title = wxEmptyString, + int style = wxHF_DEFAULT_STYLE, wxHtmlHelpData* data = NULL); + virtual ~wxHtmlHelpDialog(); + + bool Create(wxWindow* parent, wxWindowID id, const wxString& title = wxEmptyString, + int style = wxHF_DEFAULT_STYLE); + + /// Returns the data associated with this dialog. + wxHtmlHelpData* GetData() { return m_Data; } + + /// Returns the controller that created this dialog. + wxHtmlHelpController* GetController() const { return m_helpController; } + + /// Sets the controller associated with this dialog. + void SetController(wxHtmlHelpController* controller) { m_helpController = controller; } + + /// Returns the help window. + wxHtmlHelpWindow* GetHelpWindow() const { return m_HtmlHelpWin; } + + // Sets format of title of the frame. Must contain exactly one "%s" + // (for title of displayed HTML page) + void SetTitleFormat(const wxString& format); + + // Override to add custom buttons to the toolbar + virtual void AddToolbarButtons(wxToolBar* WXUNUSED(toolBar), int WXUNUSED(style)) {} + +protected: + void Init(wxHtmlHelpData* data = NULL); + + void OnCloseWindow(wxCloseEvent& event); + +protected: + // Temporary pointer to pass to window + wxHtmlHelpData* m_Data; + wxString m_TitleFormat; // title of the help frame + wxHtmlHelpWindow *m_HtmlHelpWin; + wxHtmlHelpController* m_helpController; + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxHtmlHelpDialog); +}; + +#endif + // wxUSE_WXHTML_HELP + +#endif diff --git a/wxmsw/include/wx-3.0/wx/html/helpfrm.h b/wxmsw/include/wx-3.0/wx/html/helpfrm.h new file mode 100644 index 00000000..89225eb2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/helpfrm.h @@ -0,0 +1,157 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/helpfrm.h +// Purpose: wxHtmlHelpFrame +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden and Vaclav Slavik +// Copyright: (c) Harm van der Heijden and Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPFRM_H_ +#define _WX_HELPFRM_H_ + +#include "wx/defs.h" + +#if wxUSE_WXHTML_HELP + +#include "wx/helpbase.h" +#include "wx/html/helpdata.h" +#include "wx/window.h" +#include "wx/frame.h" +#include "wx/config.h" +#include "wx/splitter.h" +#include "wx/notebook.h" +#include "wx/listbox.h" +#include "wx/choice.h" +#include "wx/combobox.h" +#include "wx/checkbox.h" +#include "wx/stattext.h" +#include "wx/html/htmlwin.h" +#include "wx/html/helpwnd.h" +#include "wx/html/htmprint.h" + +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxTreeEvent; +class WXDLLIMPEXP_FWD_CORE wxTreeCtrl; + + +// style flags for the Help Frame +#define wxHF_TOOLBAR 0x0001 +#define wxHF_CONTENTS 0x0002 +#define wxHF_INDEX 0x0004 +#define wxHF_SEARCH 0x0008 +#define wxHF_BOOKMARKS 0x0010 +#define wxHF_OPEN_FILES 0x0020 +#define wxHF_PRINT 0x0040 +#define wxHF_FLAT_TOOLBAR 0x0080 +#define wxHF_MERGE_BOOKS 0x0100 +#define wxHF_ICONS_BOOK 0x0200 +#define wxHF_ICONS_BOOK_CHAPTER 0x0400 +#define wxHF_ICONS_FOLDER 0x0000 // this is 0 since it is default +#define wxHF_DEFAULT_STYLE (wxHF_TOOLBAR | wxHF_CONTENTS | \ + wxHF_INDEX | wxHF_SEARCH | \ + wxHF_BOOKMARKS | wxHF_PRINT) +//compatibility: +#define wxHF_OPENFILES wxHF_OPEN_FILES +#define wxHF_FLATTOOLBAR wxHF_FLAT_TOOLBAR +#define wxHF_DEFAULTSTYLE wxHF_DEFAULT_STYLE + +struct wxHtmlHelpMergedIndexItem; +class wxHtmlHelpMergedIndex; + +class WXDLLIMPEXP_FWD_CORE wxHelpControllerBase; +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpController; +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpWindow; + +class WXDLLIMPEXP_HTML wxHtmlHelpFrame : public wxFrame +{ + DECLARE_DYNAMIC_CLASS(wxHtmlHelpFrame) + +public: + wxHtmlHelpFrame(wxHtmlHelpData* data = NULL) { Init(data); } + wxHtmlHelpFrame(wxWindow* parent, wxWindowID wxWindowID, + const wxString& title = wxEmptyString, + int style = wxHF_DEFAULT_STYLE, wxHtmlHelpData* data = NULL +#if wxUSE_CONFIG + , wxConfigBase *config=NULL, const wxString& rootpath = wxEmptyString +#endif // wxUSE_CONFIG + ); + bool Create(wxWindow* parent, wxWindowID id, const wxString& title = wxEmptyString, + int style = wxHF_DEFAULT_STYLE +#if wxUSE_CONFIG + , wxConfigBase *config=NULL, const wxString& rootpath = wxEmptyString +#endif // wxUSE_CONFIG + ); + virtual ~wxHtmlHelpFrame(); + + /// Returns the data associated with the window. + wxHtmlHelpData* GetData() { return m_Data; } + + /// Returns the help controller associated with the window. + wxHtmlHelpController* GetController() const { return m_helpController; } + + /// Sets the help controller associated with the window. + void SetController(wxHtmlHelpController* controller); + + /// Returns the help window. + wxHtmlHelpWindow* GetHelpWindow() const { return m_HtmlHelpWin; } + + // Sets format of title of the frame. Must contain exactly one "%s" + // (for title of displayed HTML page) + void SetTitleFormat(const wxString& format); + +#if wxUSE_CONFIG + // For compatibility + void UseConfig(wxConfigBase *config, const wxString& rootpath = wxEmptyString); +#endif // wxUSE_CONFIG + + // Make the help controller's frame 'modal' if + // needed + void AddGrabIfNeeded(); + + // Override to add custom buttons to the toolbar + virtual void AddToolbarButtons(wxToolBar* WXUNUSED(toolBar), int WXUNUSED(style)) {} + + void SetShouldPreventAppExit(bool enable); + + // we don't want to prevent the app from closing just because a help window + // remains opened + virtual bool ShouldPreventAppExit() const { return m_shouldPreventAppExit; } + +protected: + void Init(wxHtmlHelpData* data = NULL); + + void OnCloseWindow(wxCloseEvent& event); + void OnActivate(wxActivateEvent& event); + +#ifdef __WXMAC__ + void OnClose(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); +#endif + + // Images: + enum { + IMG_Book = 0, + IMG_Folder, + IMG_Page + }; + +protected: + wxHtmlHelpData* m_Data; + bool m_DataCreated; // m_Data created by frame, or supplied? + wxString m_TitleFormat; // title of the help frame + wxHtmlHelpWindow *m_HtmlHelpWin; + wxHtmlHelpController* m_helpController; + bool m_shouldPreventAppExit; + +private: + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxHtmlHelpFrame); +}; + +#endif // wxUSE_WXHTML_HELP + +#endif diff --git a/wxmsw/include/wx-3.0/wx/html/helpwnd.h b/wxmsw/include/wx-3.0/wx/html/helpwnd.h new file mode 100644 index 00000000..803c0da1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/helpwnd.h @@ -0,0 +1,304 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/helpwnd.h +// Purpose: wxHtmlHelpWindow +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden and Vaclav Slavik +// Copyright: (c) Harm van der Heijden and Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPWND_H_ +#define _WX_HELPWND_H_ + +#include "wx/defs.h" + +#if wxUSE_WXHTML_HELP + +#include "wx/helpbase.h" +#include "wx/html/helpdata.h" +#include "wx/window.h" +#include "wx/frame.h" +#include "wx/config.h" +#include "wx/splitter.h" +#include "wx/notebook.h" +#include "wx/listbox.h" +#include "wx/choice.h" +#include "wx/combobox.h" +#include "wx/checkbox.h" +#include "wx/stattext.h" +#include "wx/hash.h" +#include "wx/html/htmlwin.h" +#include "wx/html/htmprint.h" + +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxTreeEvent; +class WXDLLIMPEXP_FWD_CORE wxTreeCtrl; + +// style flags for the Help Frame +#define wxHF_TOOLBAR 0x0001 +#define wxHF_CONTENTS 0x0002 +#define wxHF_INDEX 0x0004 +#define wxHF_SEARCH 0x0008 +#define wxHF_BOOKMARKS 0x0010 +#define wxHF_OPEN_FILES 0x0020 +#define wxHF_PRINT 0x0040 +#define wxHF_FLAT_TOOLBAR 0x0080 +#define wxHF_MERGE_BOOKS 0x0100 +#define wxHF_ICONS_BOOK 0x0200 +#define wxHF_ICONS_BOOK_CHAPTER 0x0400 +#define wxHF_ICONS_FOLDER 0x0000 // this is 0 since it is default +#define wxHF_DEFAULT_STYLE (wxHF_TOOLBAR | wxHF_CONTENTS | \ + wxHF_INDEX | wxHF_SEARCH | \ + wxHF_BOOKMARKS | wxHF_PRINT) +//compatibility: +#define wxHF_OPENFILES wxHF_OPEN_FILES +#define wxHF_FLATTOOLBAR wxHF_FLAT_TOOLBAR +#define wxHF_DEFAULTSTYLE wxHF_DEFAULT_STYLE + +struct wxHtmlHelpFrameCfg +{ + int x, y, w, h; + long sashpos; + bool navig_on; +}; + +struct wxHtmlHelpMergedIndexItem; +class wxHtmlHelpMergedIndex; + +class WXDLLIMPEXP_FWD_CORE wxHelpControllerBase; +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpController; + +/*! + * Help window + */ + +class WXDLLIMPEXP_HTML wxHtmlHelpWindow : public wxWindow +{ + DECLARE_DYNAMIC_CLASS(wxHtmlHelpWindow) + +public: + wxHtmlHelpWindow(wxHtmlHelpData* data = NULL) { Init(data); } + wxHtmlHelpWindow(wxWindow* parent, wxWindowID wxWindowID, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int style = wxTAB_TRAVERSAL|wxNO_BORDER, + int helpStyle = wxHF_DEFAULT_STYLE, + wxHtmlHelpData* data = NULL); + bool Create(wxWindow* parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int style = wxTAB_TRAVERSAL|wxNO_BORDER, + int helpStyle = wxHF_DEFAULT_STYLE); + virtual ~wxHtmlHelpWindow(); + + wxHtmlHelpData* GetData() { return m_Data; } + wxHtmlHelpController* GetController() const { return m_helpController; } + void SetController(wxHtmlHelpController* controller); + + // Displays page x. If not found it will offect the user a choice of + // searching books. + // Looking for the page runs in these steps: + // 1. try to locate file named x (if x is for example "doc/howto.htm") + // 2. try to open starting page of book x + // 3. try to find x in contents (if x is for example "How To ...") + // 4. try to find x in index (if x is for example "How To ...") + bool Display(const wxString& x); + + // Alternative version that works with numeric ID. + // (uses extension to MS format, , see docs) + bool Display(const int id); + + // Displays help window and focuses contents. + bool DisplayContents(); + + // Displays help window and focuses index. + bool DisplayIndex(); + + // Searches for keyword. Returns true and display page if found, return + // false otherwise + // Syntax of keyword is Altavista-like: + // * words are separated by spaces + // (but "\"hello world\"" is only one world "hello world") + // * word may be pretended by + or - + // (+ : page must contain the word ; - : page can't contain the word) + // * if there is no + or - before the word, + is default + bool KeywordSearch(const wxString& keyword, + wxHelpSearchMode mode = wxHELP_SEARCH_ALL); + +#if wxUSE_CONFIG + void UseConfig(wxConfigBase *config, const wxString& rootpath = wxEmptyString) + { + m_Config = config; + m_ConfigRoot = rootpath; + ReadCustomization(config, rootpath); + } + + // Saves custom settings into cfg config. it will use the path 'path' + // if given, otherwise it will save info into currently selected path. + // saved values : things set by SetFonts, SetBorders. + void ReadCustomization(wxConfigBase *cfg, const wxString& path = wxEmptyString); + void WriteCustomization(wxConfigBase *cfg, const wxString& path = wxEmptyString); +#endif // wxUSE_CONFIG + + // call this to let wxHtmlHelpWindow know page changed + void NotifyPageChanged(); + + // Refreshes Contents and Index tabs + void RefreshLists(); + + // Gets the HTML window + wxHtmlWindow* GetHtmlWindow() const { return m_HtmlWin; } + + // Gets the splitter window + wxSplitterWindow* GetSplitterWindow() const { return m_Splitter; } + + // Gets the toolbar + wxToolBar* GetToolBar() const { return m_toolBar; } + + // Gets the configuration data + wxHtmlHelpFrameCfg& GetCfgData() { return m_Cfg; } + + // Gets the tree control + wxTreeCtrl *GetTreeCtrl() const { return m_ContentsBox; } + +protected: + void Init(wxHtmlHelpData* data = NULL); + + // Adds items to m_Contents tree control + void CreateContents(); + + // Adds items to m_IndexList + void CreateIndex(); + + // Add books to search choice panel + void CreateSearch(); + + // Updates "merged index" structure that combines indexes of all books + // into better searchable structure + void UpdateMergedIndex(); + + // Add custom buttons to toolbar + virtual void AddToolbarButtons(wxToolBar *toolBar, int style); + + // Displays options dialog (fonts etc.) + virtual void OptionsDialog(); + + void OnToolbar(wxCommandEvent& event); + void OnContentsSel(wxTreeEvent& event); + void OnIndexSel(wxCommandEvent& event); + void OnIndexFind(wxCommandEvent& event); + void OnIndexAll(wxCommandEvent& event); + void OnSearchSel(wxCommandEvent& event); + void OnSearch(wxCommandEvent& event); + void OnBookmarksSel(wxCommandEvent& event); + void OnSize(wxSizeEvent& event); + + // Images: + enum { + IMG_Book = 0, + IMG_Folder, + IMG_Page + }; + +protected: + wxHtmlHelpData* m_Data; + bool m_DataCreated; // m_Data created by frame, or supplied? + wxString m_TitleFormat; // title of the help frame + // below are various pointers to GUI components + wxHtmlWindow *m_HtmlWin; + wxSplitterWindow *m_Splitter; + wxPanel *m_NavigPan; + wxNotebook *m_NavigNotebook; + wxTreeCtrl *m_ContentsBox; + wxTextCtrl *m_IndexText; + wxButton *m_IndexButton; + wxButton *m_IndexButtonAll; + wxListBox *m_IndexList; + wxTextCtrl *m_SearchText; + wxButton *m_SearchButton; + wxListBox *m_SearchList; + wxChoice *m_SearchChoice; + wxStaticText *m_IndexCountInfo; + wxCheckBox *m_SearchCaseSensitive; + wxCheckBox *m_SearchWholeWords; + wxToolBar* m_toolBar; + + wxComboBox *m_Bookmarks; + wxArrayString m_BookmarksNames, m_BookmarksPages; + + wxHtmlHelpFrameCfg m_Cfg; + +#if wxUSE_CONFIG + wxConfigBase *m_Config; + wxString m_ConfigRoot; +#endif // wxUSE_CONFIG + + // pagenumbers of controls in notebook (usually 0,1,2) + int m_ContentsPage; + int m_IndexPage; + int m_SearchPage; + + // lists of available fonts (used in options dialog) + wxArrayString *m_NormalFonts, *m_FixedFonts; + int m_FontSize; // 0,1,2 = small,medium,big + wxString m_NormalFace, m_FixedFace; + + bool m_UpdateContents; + +#if wxUSE_PRINTING_ARCHITECTURE + wxHtmlEasyPrinting *m_Printer; +#endif + wxHashTable *m_PagesHash; + wxHtmlHelpController* m_helpController; + + int m_hfStyle; + +private: + void DoIndexFind(); + void DoIndexAll(); + void DisplayIndexItem(const wxHtmlHelpMergedIndexItem *it); + wxHtmlHelpMergedIndex *m_mergedIndex; + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxHtmlHelpWindow); +}; + +/*! + * Command IDs + */ + +enum +{ + //wxID_HTML_HELPFRAME = wxID_HIGHEST + 1, + wxID_HTML_PANEL = wxID_HIGHEST + 10, + wxID_HTML_BACK, + wxID_HTML_FORWARD, + wxID_HTML_UPNODE, + wxID_HTML_UP, + wxID_HTML_DOWN, + wxID_HTML_PRINT, + wxID_HTML_OPENFILE, + wxID_HTML_OPTIONS, + wxID_HTML_BOOKMARKSLIST, + wxID_HTML_BOOKMARKSADD, + wxID_HTML_BOOKMARKSREMOVE, + wxID_HTML_TREECTRL, + wxID_HTML_INDEXPAGE, + wxID_HTML_INDEXLIST, + wxID_HTML_INDEXTEXT, + wxID_HTML_INDEXBUTTON, + wxID_HTML_INDEXBUTTONALL, + wxID_HTML_NOTEBOOK, + wxID_HTML_SEARCHPAGE, + wxID_HTML_SEARCHTEXT, + wxID_HTML_SEARCHLIST, + wxID_HTML_SEARCHBUTTON, + wxID_HTML_SEARCHCHOICE, + wxID_HTML_COUNTINFO +}; + +#endif // wxUSE_WXHTML_HELP + +#endif diff --git a/wxmsw/include/wx-3.0/wx/html/htmlcell.h b/wxmsw/include/wx-3.0/wx/html/htmlcell.h new file mode 100644 index 00000000..7f40f94e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/htmlcell.h @@ -0,0 +1,709 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/htmlcell.h +// Purpose: wxHtmlCell class is used by wxHtmlWindow/wxHtmlWinParser +// as a basic visual element of HTML page +// Author: Vaclav Slavik +// Copyright: (c) 1999-2003 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMLCELL_H_ +#define _WX_HTMLCELL_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/html/htmltag.h" +#include "wx/html/htmldefs.h" +#include "wx/window.h" + + +class WXDLLIMPEXP_FWD_HTML wxHtmlWindowInterface; +class WXDLLIMPEXP_FWD_HTML wxHtmlLinkInfo; +class WXDLLIMPEXP_FWD_HTML wxHtmlCell; +class WXDLLIMPEXP_FWD_HTML wxHtmlContainerCell; + + +// wxHtmlSelection is data holder with information about text selection. +// Selection is defined by two positions (beginning and end of the selection) +// and two leaf(!) cells at these positions. +class WXDLLIMPEXP_HTML wxHtmlSelection +{ +public: + wxHtmlSelection() + : m_fromPos(wxDefaultPosition), m_toPos(wxDefaultPosition), + m_fromCharacterPos(-1), m_toCharacterPos(-1), + m_fromCell(NULL), m_toCell(NULL) {} + + // this version is used for the user selection defined with the mouse + void Set(const wxPoint& fromPos, const wxHtmlCell *fromCell, + const wxPoint& toPos, const wxHtmlCell *toCell); + void Set(const wxHtmlCell *fromCell, const wxHtmlCell *toCell); + + const wxHtmlCell *GetFromCell() const { return m_fromCell; } + const wxHtmlCell *GetToCell() const { return m_toCell; } + + // these values are in absolute coordinates: + const wxPoint& GetFromPos() const { return m_fromPos; } + const wxPoint& GetToPos() const { return m_toPos; } + + // these are From/ToCell's private data + void ClearFromToCharacterPos() { m_toCharacterPos = m_fromCharacterPos = -1; } + bool AreFromToCharacterPosSet() const { return m_toCharacterPos != -1 && m_fromCharacterPos != -1; } + + void SetFromCharacterPos (wxCoord pos) { m_fromCharacterPos = pos; } + void SetToCharacterPos (wxCoord pos) { m_toCharacterPos = pos; } + wxCoord GetFromCharacterPos () const { return m_fromCharacterPos; } + wxCoord GetToCharacterPos () const { return m_toCharacterPos; } + + bool IsEmpty() const + { return m_fromPos == wxDefaultPosition && + m_toPos == wxDefaultPosition; } + +private: + wxPoint m_fromPos, m_toPos; + wxCoord m_fromCharacterPos, m_toCharacterPos; + const wxHtmlCell *m_fromCell, *m_toCell; +}; + + + +enum wxHtmlSelectionState +{ + wxHTML_SEL_OUT, // currently rendered cell is outside the selection + wxHTML_SEL_IN, // ... is inside selection + wxHTML_SEL_CHANGING // ... is the cell on which selection state changes +}; + +// Selection state is passed to wxHtmlCell::Draw so that it can render itself +// differently e.g. when inside text selection or outside it. +class WXDLLIMPEXP_HTML wxHtmlRenderingState +{ +public: + wxHtmlRenderingState() : m_selState(wxHTML_SEL_OUT) {} + + void SetSelectionState(wxHtmlSelectionState s) { m_selState = s; } + wxHtmlSelectionState GetSelectionState() const { return m_selState; } + + void SetFgColour(const wxColour& c) { m_fgColour = c; } + const wxColour& GetFgColour() const { return m_fgColour; } + void SetBgColour(const wxColour& c) { m_bgColour = c; } + const wxColour& GetBgColour() const { return m_bgColour; } + void SetBgMode(int m) { m_bgMode = m; } + int GetBgMode() const { return m_bgMode; } + +private: + wxHtmlSelectionState m_selState; + wxColour m_fgColour, m_bgColour; + int m_bgMode; +}; + + +// HTML rendering customization. This class is used when rendering wxHtmlCells +// as a callback: +class WXDLLIMPEXP_HTML wxHtmlRenderingStyle +{ +public: + virtual ~wxHtmlRenderingStyle() {} + virtual wxColour GetSelectedTextColour(const wxColour& clr) = 0; + virtual wxColour GetSelectedTextBgColour(const wxColour& clr) = 0; +}; + +// Standard style: +class WXDLLIMPEXP_HTML wxDefaultHtmlRenderingStyle : public wxHtmlRenderingStyle +{ +public: + virtual wxColour GetSelectedTextColour(const wxColour& clr); + virtual wxColour GetSelectedTextBgColour(const wxColour& clr); +}; + + +// Information given to cells when drawing them. Contains rendering state, +// selection information and rendering style object that can be used to +// customize the output. +class WXDLLIMPEXP_HTML wxHtmlRenderingInfo +{ +public: + wxHtmlRenderingInfo() : m_selection(NULL), m_style(NULL) {} + + void SetSelection(wxHtmlSelection *s) { m_selection = s; } + wxHtmlSelection *GetSelection() const { return m_selection; } + + void SetStyle(wxHtmlRenderingStyle *style) { m_style = style; } + wxHtmlRenderingStyle& GetStyle() { return *m_style; } + + wxHtmlRenderingState& GetState() { return m_state; } + +protected: + wxHtmlSelection *m_selection; + wxHtmlRenderingStyle *m_style; + wxHtmlRenderingState m_state; +}; + + +// Flags for wxHtmlCell::FindCellByPos +enum +{ + wxHTML_FIND_EXACT = 1, + wxHTML_FIND_NEAREST_BEFORE = 2, + wxHTML_FIND_NEAREST_AFTER = 4 +}; + + +// Superscript/subscript/normal script mode of a cell +enum wxHtmlScriptMode +{ + wxHTML_SCRIPT_NORMAL, + wxHTML_SCRIPT_SUB, + wxHTML_SCRIPT_SUP +}; + + +// --------------------------------------------------------------------------- +// wxHtmlCell +// Internal data structure. It represents fragments of parsed +// HTML page - a word, picture, table, horizontal line and so +// on. It is used by wxHtmlWindow to represent HTML page in +// memory. +// --------------------------------------------------------------------------- + + +class WXDLLIMPEXP_HTML wxHtmlCell : public wxObject +{ +public: + wxHtmlCell(); + virtual ~wxHtmlCell(); + + void SetParent(wxHtmlContainerCell *p) {m_Parent = p;} + wxHtmlContainerCell *GetParent() const {return m_Parent;} + + int GetPosX() const {return m_PosX;} + int GetPosY() const {return m_PosY;} + int GetWidth() const {return m_Width;} + + // Returns the maximum possible length of the cell. + // Call Layout at least once before using GetMaxTotalWidth() + virtual int GetMaxTotalWidth() const { return m_Width; } + + int GetHeight() const {return m_Height;} + int GetDescent() const {return m_Descent;} + + void SetScriptMode(wxHtmlScriptMode mode, long previousBase); + wxHtmlScriptMode GetScriptMode() const { return m_ScriptMode; } + long GetScriptBaseline() { return m_ScriptBaseline; } + + // Formatting cells are not visible on the screen, they only alter + // renderer's state. + bool IsFormattingCell() const { return m_Width == 0 && m_Height == 0; } + + const wxString& GetId() const { return m_id; } + void SetId(const wxString& id) { m_id = id; } + + // returns the link associated with this cell. The position is position + // within the cell so it varies from 0 to m_Width, from 0 to m_Height + virtual wxHtmlLinkInfo* GetLink(int WXUNUSED(x) = 0, + int WXUNUSED(y) = 0) const + { return m_Link; } + + // Returns cursor to be used when mouse is over the cell, can be + // overridden by the derived classes to use a different cursor whenever the + // mouse is over this cell. + virtual wxCursor GetMouseCursor(wxHtmlWindowInterface *window) const; + + // Returns cursor to be used when mouse is over the given point, can be + // overridden if the cursor should change depending on where exactly inside + // the cell the mouse is. + virtual wxCursor GetMouseCursorAt(wxHtmlWindowInterface *window, + const wxPoint& relPos) const; + +#if WXWIN_COMPATIBILITY_2_6 + // this was replaced by GetMouseCursor, don't use in new code! + virtual wxCursor GetCursor() const; +#endif + + // return next cell among parent's cells + wxHtmlCell *GetNext() const {return m_Next;} + // returns first child cell (if there are any, i.e. if this is container): + virtual wxHtmlCell* GetFirstChild() const { return NULL; } + + // members writing methods + virtual void SetPos(int x, int y) {m_PosX = x, m_PosY = y;} + void SetLink(const wxHtmlLinkInfo& link); + void SetNext(wxHtmlCell *cell) {m_Next = cell;} + + // 1. adjust cell's width according to the fact that maximal possible width + // is w. (this has sense when working with horizontal lines, tables + // etc.) + // 2. prepare layout (=fill-in m_PosX, m_PosY (and sometime m_Height) + // members) = place items to fit window, according to the width w + virtual void Layout(int w); + + // renders the cell + virtual void Draw(wxDC& WXUNUSED(dc), + int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(view_y1), int WXUNUSED(view_y2), + wxHtmlRenderingInfo& WXUNUSED(info)) {} + + // proceed drawing actions in case the cell is not visible (scrolled out of + // screen). This is needed to change fonts, colors and so on. + virtual void DrawInvisible(wxDC& WXUNUSED(dc), + int WXUNUSED(x), int WXUNUSED(y), + wxHtmlRenderingInfo& WXUNUSED(info)) {} + + // This method returns pointer to the FIRST cell for that + // the condition + // is true. It first checks if the condition is true for this + // cell and then calls m_Next->Find(). (Note: it checks + // all subcells if the cell is container) + // Condition is unique condition identifier (see htmldefs.h) + // (user-defined condition IDs should start from 10000) + // and param is optional parameter + // Example : m_Cell->Find(wxHTML_COND_ISANCHOR, "news"); + // returns pointer to anchor news + virtual const wxHtmlCell* Find(int condition, const void* param) const; + + + // This function is called when mouse button is clicked over the cell. + // Returns true if a link is clicked, false otherwise. + // + // 'window' is pointer to wxHtmlWindowInterface of the window which + // generated the event. + // HINT: if this handling is not enough for you you should use + // wxHtmlWidgetCell + virtual bool ProcessMouseClick(wxHtmlWindowInterface *window, + const wxPoint& pos, + const wxMouseEvent& event); + +#if WXWIN_COMPATIBILITY_2_6 + // this was replaced by ProcessMouseClick, don't use in new code! + virtual void OnMouseClick(wxWindow *window, + int x, int y, const wxMouseEvent& event); +#endif + + // This method used to adjust pagebreak position. The parameter is variable + // that contains y-coordinate of page break (= horizontal line that should + // not be crossed by words, images etc.). If this cell cannot be divided + // into two pieces (each one on another page) then it moves the pagebreak + // few pixels up. + // + // Returned value : true if pagebreak was modified, false otherwise + // Usage : while (container->AdjustPagebreak(&p)) {} + virtual bool AdjustPagebreak(int *pagebreak, + const wxArrayInt& known_pagebreaks, + int pageHeight) const; + + // Sets cell's behaviour on pagebreaks (see AdjustPagebreak). Default + // is true - the cell can be split on two pages + // If there is no way to fit a cell in the current page size, the cell + // is always split, ignoring this setting. + void SetCanLiveOnPagebreak(bool can) { m_CanLiveOnPagebreak = can; } + + // Can the line be broken before this cell? + virtual bool IsLinebreakAllowed() const + { return !IsFormattingCell(); } + + // Returns true for simple == terminal cells, i.e. not composite ones. + // This if for internal usage only and may disappear in future versions! + virtual bool IsTerminalCell() const { return true; } + + // Find a cell inside this cell positioned at the given coordinates + // (relative to this's positions). Returns NULL if no such cell exists. + // The flag can be used to specify whether to look for terminal or + // nonterminal cells or both. In either case, returned cell is deepest + // cell in cells tree that contains [x,y]. + virtual wxHtmlCell *FindCellByPos(wxCoord x, wxCoord y, + unsigned flags = wxHTML_FIND_EXACT) const; + + // Returns absolute position of the cell on HTML canvas. + // If rootCell is provided, then it's considered to be the root of the + // hierarchy and the returned value is relative to it. + wxPoint GetAbsPos(wxHtmlCell *rootCell = NULL) const; + + // Returns root cell of the hierarchy (i.e. grand-grand-...-parent that + // doesn't have a parent itself) + wxHtmlCell *GetRootCell() const; + + // Returns first (last) terminal cell inside this cell. It may return NULL, + // but it is rare -- only if there are no terminals in the tree. + virtual wxHtmlCell *GetFirstTerminal() const + { return wxConstCast(this, wxHtmlCell); } + virtual wxHtmlCell *GetLastTerminal() const + { return wxConstCast(this, wxHtmlCell); } + + // Returns cell's depth, i.e. how far under the root cell it is + // (if it is the root, depth is 0) + unsigned GetDepth() const; + + // Returns true if the cell appears before 'cell' in natural order of + // cells (= as they are read). If cell A is (grand)parent of cell B, + // then both A.IsBefore(B) and B.IsBefore(A) always return true. + bool IsBefore(wxHtmlCell *cell) const; + + // Converts the cell into text representation. If sel != NULL then + // only part of the cell inside the selection is converted. + virtual wxString ConvertToText(wxHtmlSelection *WXUNUSED(sel)) const + { return wxEmptyString; } + +protected: + // pointer to the next cell + wxHtmlCell *m_Next; + // pointer to parent cell + wxHtmlContainerCell *m_Parent; + + // dimensions of fragment (m_Descent is used to position text & images) + int m_Width, m_Height, m_Descent; + // position where the fragment is drawn: + int m_PosX, m_PosY; + + // superscript/subscript/normal: + wxHtmlScriptMode m_ScriptMode; + long m_ScriptBaseline; + + // destination address if this fragment is hypertext link, NULL otherwise + wxHtmlLinkInfo *m_Link; + // true if this cell can be placed on pagebreak, false otherwise + bool m_CanLiveOnPagebreak; + // unique identifier of the cell, generated from "id" property of tags + wxString m_id; + + DECLARE_ABSTRACT_CLASS(wxHtmlCell) + wxDECLARE_NO_COPY_CLASS(wxHtmlCell); +}; + + + + +// ---------------------------------------------------------------------------- +// Inherited cells: +// ---------------------------------------------------------------------------- + + +// ---------------------------------------------------------------------------- +// wxHtmlWordCell +// Single word in input stream. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlWordCell : public wxHtmlCell +{ +public: + wxHtmlWordCell(const wxString& word, const wxDC& dc); + void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2, + wxHtmlRenderingInfo& info); + virtual wxCursor GetMouseCursor(wxHtmlWindowInterface *window) const; + virtual wxString ConvertToText(wxHtmlSelection *sel) const; + bool IsLinebreakAllowed() const { return m_allowLinebreak; } + + void SetPreviousWord(wxHtmlWordCell *cell); + +protected: + virtual wxString GetAllAsText() const + { return m_Word; } + virtual wxString GetPartAsText(int begin, int end) const + { return m_Word.Mid(begin, end - begin); } + + void SetSelectionPrivPos(const wxDC& dc, wxHtmlSelection *s) const; + void Split(const wxDC& dc, + const wxPoint& selFrom, const wxPoint& selTo, + unsigned& pos1, unsigned& pos2) const; + + wxString m_Word; + bool m_allowLinebreak; + + DECLARE_ABSTRACT_CLASS(wxHtmlWordCell) + wxDECLARE_NO_COPY_CLASS(wxHtmlWordCell); +}; + + +// wxHtmlWordCell specialization for storing text fragments with embedded +// '\t's; these differ from normal words in that the displayed text is +// different from the text copied to clipboard +class WXDLLIMPEXP_HTML wxHtmlWordWithTabsCell : public wxHtmlWordCell +{ +public: + wxHtmlWordWithTabsCell(const wxString& word, + const wxString& wordOrig, + size_t linepos, + const wxDC& dc) + : wxHtmlWordCell(word, dc), + m_wordOrig(wordOrig), + m_linepos(linepos) + {} + +protected: + virtual wxString GetAllAsText() const; + virtual wxString GetPartAsText(int begin, int end) const; + + wxString m_wordOrig; + size_t m_linepos; +}; + + +// Container contains other cells, thus forming tree structure of rendering +// elements. Basic code of layout algorithm is contained in this class. +class WXDLLIMPEXP_HTML wxHtmlContainerCell : public wxHtmlCell +{ +public: + wxHtmlContainerCell(wxHtmlContainerCell *parent); + virtual ~wxHtmlContainerCell(); + + virtual void Layout(int w); + virtual void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2, + wxHtmlRenderingInfo& info); + virtual void DrawInvisible(wxDC& dc, int x, int y, + wxHtmlRenderingInfo& info); + + virtual bool AdjustPagebreak(int *pagebreak, + const wxArrayInt& known_pagebreaks, + int pageHeight) const; + + // insert cell at the end of m_Cells list + void InsertCell(wxHtmlCell *cell); + + // sets horizontal/vertical alignment + void SetAlignHor(int al) {m_AlignHor = al; m_LastLayout = -1;} + int GetAlignHor() const {return m_AlignHor;} + void SetAlignVer(int al) {m_AlignVer = al; m_LastLayout = -1;} + int GetAlignVer() const {return m_AlignVer;} + + // sets left-border indentation. units is one of wxHTML_UNITS_* constants + // what is combination of wxHTML_INDENT_* + void SetIndent(int i, int what, int units = wxHTML_UNITS_PIXELS); + // returns the indentation. ind is one of wxHTML_INDENT_* constants + int GetIndent(int ind) const; + // returns type of value returned by GetIndent(ind) + int GetIndentUnits(int ind) const; + + // sets alignment info based on given tag's params + void SetAlign(const wxHtmlTag& tag); + // sets floating width adjustment + // (examples : 32 percent of parent container, + // -15 pixels percent (this means 100 % - 15 pixels) + void SetWidthFloat(int w, int units) {m_WidthFloat = w; m_WidthFloatUnits = units; m_LastLayout = -1;} + void SetWidthFloat(const wxHtmlTag& tag, double pixel_scale = 1.0); + // sets minimal height of this container. + void SetMinHeight(int h, int align = wxHTML_ALIGN_TOP) {m_MinHeight = h; m_MinHeightAlign = align; m_LastLayout = -1;} + + void SetBackgroundColour(const wxColour& clr) {m_BkColour = clr;} + // returns background colour (of wxNullColour if none set), so that widgets can + // adapt to it: + wxColour GetBackgroundColour(); + void SetBorder(const wxColour& clr1, const wxColour& clr2, int border = 1) {m_Border = border; m_BorderColour1 = clr1, m_BorderColour2 = clr2;} + virtual wxHtmlLinkInfo* GetLink(int x = 0, int y = 0) const; + virtual const wxHtmlCell* Find(int condition, const void* param) const; + +#if WXWIN_COMPATIBILITY_2_6 + // this was replaced by ProcessMouseClick, don't use in new code! + virtual void OnMouseClick(wxWindow *window, + int x, int y, const wxMouseEvent& event); +#endif + virtual bool ProcessMouseClick(wxHtmlWindowInterface *window, + const wxPoint& pos, + const wxMouseEvent& event); + + virtual wxHtmlCell* GetFirstChild() const { return m_Cells; } + + // returns last child cell: + wxHtmlCell* GetLastChild() const { return m_LastCell; } + + // see comment in wxHtmlCell about this method + virtual bool IsTerminalCell() const { return false; } + + virtual wxHtmlCell *FindCellByPos(wxCoord x, wxCoord y, + unsigned flags = wxHTML_FIND_EXACT) const; + + virtual wxHtmlCell *GetFirstTerminal() const; + virtual wxHtmlCell *GetLastTerminal() const; + + + // Removes indentation on top or bottom of the container (i.e. above or + // below first/last terminal cell). For internal use only. + virtual void RemoveExtraSpacing(bool top, bool bottom); + + // Returns the maximum possible length of the container. + // Call Layout at least once before using GetMaxTotalWidth() + virtual int GetMaxTotalWidth() const { return m_MaxTotalWidth; } + +protected: + void UpdateRenderingStatePre(wxHtmlRenderingInfo& info, + wxHtmlCell *cell) const; + void UpdateRenderingStatePost(wxHtmlRenderingInfo& info, + wxHtmlCell *cell) const; + +protected: + int m_IndentLeft, m_IndentRight, m_IndentTop, m_IndentBottom; + // indentation of subcells. There is always m_Indent pixels + // big space between given border of the container and the subcells + // it m_Indent < 0 it is in PERCENTS, otherwise it is in pixels + int m_MinHeight, m_MinHeightAlign; + // minimal height. + wxHtmlCell *m_Cells, *m_LastCell; + // internal cells, m_Cells points to the first of them, m_LastCell to the last one. + // (LastCell is needed only to speed-up InsertCell) + int m_AlignHor, m_AlignVer; + // alignment horizontal and vertical (left, center, right) + int m_WidthFloat, m_WidthFloatUnits; + // width float is used in adjustWidth + wxColour m_BkColour; + // background color of this container + int m_Border; + // border size. Draw only if m_Border > 0 + wxColour m_BorderColour1, m_BorderColour2; + // borders color of this container + int m_LastLayout; + // if != -1 then call to Layout may be no-op + // if previous call to Layout has same argument + int m_MaxTotalWidth; + // Maximum possible length if ignoring line wrap + + + DECLARE_ABSTRACT_CLASS(wxHtmlContainerCell) + wxDECLARE_NO_COPY_CLASS(wxHtmlContainerCell); +}; + + + +// --------------------------------------------------------------------------- +// wxHtmlColourCell +// Color changer. +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlColourCell : public wxHtmlCell +{ +public: + wxHtmlColourCell(const wxColour& clr, int flags = wxHTML_CLR_FOREGROUND) : wxHtmlCell() {m_Colour = clr; m_Flags = flags;} + virtual void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2, + wxHtmlRenderingInfo& info); + virtual void DrawInvisible(wxDC& dc, int x, int y, + wxHtmlRenderingInfo& info); + +protected: + wxColour m_Colour; + unsigned m_Flags; + + DECLARE_ABSTRACT_CLASS(wxHtmlColourCell) + wxDECLARE_NO_COPY_CLASS(wxHtmlColourCell); +}; + + + + +//-------------------------------------------------------------------------------- +// wxHtmlFontCell +// Sets actual font used for text rendering +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlFontCell : public wxHtmlCell +{ +public: + wxHtmlFontCell(wxFont *font) : wxHtmlCell() { m_Font = (*font); } + virtual void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2, + wxHtmlRenderingInfo& info); + virtual void DrawInvisible(wxDC& dc, int x, int y, + wxHtmlRenderingInfo& info); + +protected: + wxFont m_Font; + + DECLARE_ABSTRACT_CLASS(wxHtmlFontCell) + wxDECLARE_NO_COPY_CLASS(wxHtmlFontCell); +}; + + + + + + +//-------------------------------------------------------------------------------- +// wxHtmlwidgetCell +// This cell is connected with wxWindow object +// You can use it to insert windows into HTML page +// (buttons, input boxes etc.) +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlWidgetCell : public wxHtmlCell +{ +public: + // !!! wnd must have correct parent! + // if w != 0 then the m_Wnd has 'floating' width - it adjust + // it's width according to parent container's width + // (w is percent of parent's width) + wxHtmlWidgetCell(wxWindow *wnd, int w = 0); + virtual ~wxHtmlWidgetCell() { m_Wnd->Destroy(); } + virtual void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2, + wxHtmlRenderingInfo& info); + virtual void DrawInvisible(wxDC& dc, int x, int y, + wxHtmlRenderingInfo& info); + virtual void Layout(int w); + +protected: + wxWindow* m_Wnd; + int m_WidthFloat; + // width float is used in adjustWidth (it is in percents) + + DECLARE_ABSTRACT_CLASS(wxHtmlWidgetCell) + wxDECLARE_NO_COPY_CLASS(wxHtmlWidgetCell); +}; + + + +//-------------------------------------------------------------------------------- +// wxHtmlLinkInfo +// Internal data structure. It represents hypertext link +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlLinkInfo : public wxObject +{ +public: + wxHtmlLinkInfo() : wxObject() + { m_Href = m_Target = wxEmptyString; m_Event = NULL, m_Cell = NULL; } + wxHtmlLinkInfo(const wxString& href, const wxString& target = wxEmptyString) : wxObject() + { m_Href = href; m_Target = target; m_Event = NULL, m_Cell = NULL; } + wxHtmlLinkInfo(const wxHtmlLinkInfo& l) : wxObject() + { m_Href = l.m_Href, m_Target = l.m_Target, m_Event = l.m_Event; + m_Cell = l.m_Cell; } + wxHtmlLinkInfo& operator=(const wxHtmlLinkInfo& l) + { m_Href = l.m_Href, m_Target = l.m_Target, m_Event = l.m_Event; + m_Cell = l.m_Cell; return *this; } + + void SetEvent(const wxMouseEvent *e) { m_Event = e; } + void SetHtmlCell(const wxHtmlCell *e) { m_Cell = e; } + + wxString GetHref() const { return m_Href; } + wxString GetTarget() const { return m_Target; } + const wxMouseEvent* GetEvent() const { return m_Event; } + const wxHtmlCell* GetHtmlCell() const { return m_Cell; } + +private: + wxString m_Href, m_Target; + const wxMouseEvent *m_Event; + const wxHtmlCell *m_Cell; +}; + + + +// ---------------------------------------------------------------------------- +// wxHtmlTerminalCellsInterator +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlTerminalCellsInterator +{ +public: + wxHtmlTerminalCellsInterator(const wxHtmlCell *from, const wxHtmlCell *to) + : m_to(to), m_pos(from) {} + + operator bool() const { return m_pos != NULL; } + const wxHtmlCell* operator++(); + const wxHtmlCell* operator->() const { return m_pos; } + const wxHtmlCell* operator*() const { return m_pos; } + +private: + const wxHtmlCell *m_to, *m_pos; +}; + + + +#endif // wxUSE_HTML + +#endif // _WX_HTMLCELL_H_ + diff --git a/wxmsw/include/wx-3.0/wx/html/htmldefs.h b/wxmsw/include/wx-3.0/wx/html/htmldefs.h new file mode 100644 index 00000000..9de190ca --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/htmldefs.h @@ -0,0 +1,101 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/htmldefs.h +// Purpose: constants for wxhtml library +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +#ifndef _WX_HTMLDEFS_H_ +#define _WX_HTMLDEFS_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML + +//-------------------------------------------------------------------------------- +// ALIGNMENTS +// Describes alignment of text etc. in containers +//-------------------------------------------------------------------------------- + +#define wxHTML_ALIGN_LEFT 0x0000 +#define wxHTML_ALIGN_RIGHT 0x0002 +#define wxHTML_ALIGN_JUSTIFY 0x0010 + +#define wxHTML_ALIGN_TOP 0x0004 +#define wxHTML_ALIGN_BOTTOM 0x0008 + +#define wxHTML_ALIGN_CENTER 0x0001 + + + +//-------------------------------------------------------------------------------- +// COLOR MODES +// Used by wxHtmlColourCell to determine clr of what is changing +//-------------------------------------------------------------------------------- + +#define wxHTML_CLR_FOREGROUND 0x0001 +#define wxHTML_CLR_BACKGROUND 0x0002 +#define wxHTML_CLR_TRANSPARENT_BACKGROUND 0x0004 + + + +//-------------------------------------------------------------------------------- +// UNITS +// Used to specify units +//-------------------------------------------------------------------------------- + +#define wxHTML_UNITS_PIXELS 0x0001 +#define wxHTML_UNITS_PERCENT 0x0002 + + + +//-------------------------------------------------------------------------------- +// INDENTS +// Used to specify indetation relatives +//-------------------------------------------------------------------------------- + +#define wxHTML_INDENT_LEFT 0x0010 +#define wxHTML_INDENT_RIGHT 0x0020 +#define wxHTML_INDENT_TOP 0x0040 +#define wxHTML_INDENT_BOTTOM 0x0080 + +#define wxHTML_INDENT_HORIZONTAL (wxHTML_INDENT_LEFT | wxHTML_INDENT_RIGHT) +#define wxHTML_INDENT_VERTICAL (wxHTML_INDENT_TOP | wxHTML_INDENT_BOTTOM) +#define wxHTML_INDENT_ALL (wxHTML_INDENT_VERTICAL | wxHTML_INDENT_HORIZONTAL) + + + + +//-------------------------------------------------------------------------------- +// FIND CONDITIONS +// Identifiers of wxHtmlCell's Find() conditions +//-------------------------------------------------------------------------------- + +#define wxHTML_COND_ISANCHOR 1 + // Finds the anchor of 'param' name (pointer to wxString). + +#define wxHTML_COND_ISIMAGEMAP 2 + // Finds imagemap of 'param' name (pointer to wxString). + // (used exclusively by m_image.cpp) + +#define wxHTML_COND_USER 10000 + // User-defined conditions should start from this number + + +//-------------------------------------------------------------------------------- +// INTERNALS +// wxHTML internal constants +//-------------------------------------------------------------------------------- + + /* size of one scroll step of wxHtmlWindow in pixels */ +#define wxHTML_SCROLL_STEP 16 + + /* size of temporary buffer used during parsing */ +#define wxHTML_BUFLEN 1024 + +#endif // wxUSE_HTML + +#endif // _WX_HTMLDEFS_H_ + diff --git a/wxmsw/include/wx-3.0/wx/html/htmlfilt.h b/wxmsw/include/wx-3.0/wx/html/htmlfilt.h new file mode 100644 index 00000000..fe25d4ff --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/htmlfilt.h @@ -0,0 +1,81 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/htmlfilt.h +// Purpose: filters +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMLFILT_H_ +#define _WX_HTMLFILT_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/filesys.h" + + +//-------------------------------------------------------------------------------- +// wxHtmlFilter +// This class is input filter. It can "translate" files +// in non-HTML format to HTML format +// interface to access certain +// kinds of files (HTPP, FTP, local, tar.gz etc..) +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlFilter : public wxObject +{ + DECLARE_ABSTRACT_CLASS(wxHtmlFilter) + +public: + wxHtmlFilter() : wxObject() {} + virtual ~wxHtmlFilter() {} + + // returns true if this filter is able to open&read given file + virtual bool CanRead(const wxFSFile& file) const = 0; + + // Reads given file and returns HTML document. + // Returns empty string if opening failed + virtual wxString ReadFile(const wxFSFile& file) const = 0; +}; + + + +//-------------------------------------------------------------------------------- +// wxHtmlFilterPlainText +// This filter is used as default filter if no other can +// be used (= uknown type of file). It is used by +// wxHtmlWindow itself. +//-------------------------------------------------------------------------------- + + +class WXDLLIMPEXP_HTML wxHtmlFilterPlainText : public wxHtmlFilter +{ + DECLARE_DYNAMIC_CLASS(wxHtmlFilterPlainText) + +public: + virtual bool CanRead(const wxFSFile& file) const; + virtual wxString ReadFile(const wxFSFile& file) const; +}; + +//-------------------------------------------------------------------------------- +// wxHtmlFilterHTML +// filter for text/html +//-------------------------------------------------------------------------------- + +class wxHtmlFilterHTML : public wxHtmlFilter +{ + DECLARE_DYNAMIC_CLASS(wxHtmlFilterHTML) + + public: + virtual bool CanRead(const wxFSFile& file) const; + virtual wxString ReadFile(const wxFSFile& file) const; +}; + + + +#endif // wxUSE_HTML + +#endif // _WX_HTMLFILT_H_ + diff --git a/wxmsw/include/wx-3.0/wx/html/htmlpars.h b/wxmsw/include/wx-3.0/wx/html/htmlpars.h new file mode 100644 index 00000000..86612f16 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/htmlpars.h @@ -0,0 +1,307 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/htmlpars.h +// Purpose: wxHtmlParser class (generic parser) +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMLPARS_H_ +#define _WX_HTMLPARS_H_ + +#include "wx/defs.h" +#if wxUSE_HTML + +#include "wx/html/htmltag.h" +#include "wx/filesys.h" +#include "wx/hashmap.h" +#include "wx/hashset.h" +#include "wx/vector.h" +#include "wx/fontenc.h" + +class WXDLLIMPEXP_FWD_BASE wxMBConv; +class WXDLLIMPEXP_FWD_HTML wxHtmlParser; +class WXDLLIMPEXP_FWD_HTML wxHtmlTagHandler; +class WXDLLIMPEXP_FWD_HTML wxHtmlEntitiesParser; + +class wxHtmlTextPieces; +class wxHtmlParserState; + +WX_DECLARE_HASH_SET_WITH_DECL_PTR(wxHtmlTagHandler*, + wxPointerHash, wxPointerEqual, + wxHtmlTagHandlersSet, + class WXDLLIMPEXP_HTML); +WX_DECLARE_STRING_HASH_MAP_WITH_DECL(wxHtmlTagHandler*, + wxHtmlTagHandlersHash, + class WXDLLIMPEXP_HTML); + + +enum wxHtmlURLType +{ + wxHTML_URL_PAGE, + wxHTML_URL_IMAGE, + wxHTML_URL_OTHER +}; + +// This class handles generic parsing of HTML document : it scans +// the document and divides it into blocks of tags (where one block +// consists of starting and ending tag and of text between these +// 2 tags. +class WXDLLIMPEXP_HTML wxHtmlParser : public wxObject +{ + DECLARE_ABSTRACT_CLASS(wxHtmlParser) + +public: + wxHtmlParser(); + virtual ~wxHtmlParser(); + + // Sets the class which will be used for opening files + void SetFS(wxFileSystem *fs) { m_FS = fs; } + + wxFileSystem* GetFS() const { return m_FS; } + + // Opens file if the parser is allowed to open given URL (may be forbidden + // for security reasons) + virtual wxFSFile *OpenURL(wxHtmlURLType type, const wxString& url) const; + + // You can simply call this method when you need parsed output. + // This method does these things: + // 1. call InitParser(source); + // 2. call DoParsing(); + // 3. call GetProduct(); (its return value is then returned) + // 4. call DoneParser(); + wxObject* Parse(const wxString& source); + + // Sets the source. This must be called before running Parse() method. + virtual void InitParser(const wxString& source); + // This must be called after Parse(). + virtual void DoneParser(); + + // May be called during parsing to immediately return from Parse(). + virtual void StopParsing() { m_stopParsing = true; } + + // Parses the m_Source from begin_pos to end_pos-1. + // (in noparams version it parses whole m_Source) + void DoParsing(const wxString::const_iterator& begin_pos, + const wxString::const_iterator& end_pos); + void DoParsing(); + + // Returns pointer to the tag at parser's current position + wxHtmlTag *GetCurrentTag() const { return m_CurTag; } + + // Returns product of parsing + // Returned value is result of parsing of the part. The type of this result + // depends on internal representation in derived parser + // (see wxHtmlWinParser for details). + virtual wxObject* GetProduct() = 0; + + // adds handler to the list & hash table of handlers. + virtual void AddTagHandler(wxHtmlTagHandler *handler); + + // Forces the handler to handle additional tags (not returned by GetSupportedTags). + // The handler should already be in use by this parser. + // Example: you want to parse following pseudo-html structure: + // + // + // + // + // This last it has different meaning, we don't want it to be parsed by myitems handler! + // handler can handle only 'myitems' (e.g. its GetSupportedTags returns "MYITEMS") + // you can call PushTagHandler(handler, "IT") when you find + // and call PopTagHandler() when you find + void PushTagHandler(wxHtmlTagHandler *handler, const wxString& tags); + + // Restores state before last call to PushTagHandler + void PopTagHandler(); + + const wxString* GetSource() {return m_Source;} + void SetSource(const wxString& src); + + // Sets HTML source and remembers current parser's state so that it can + // later be restored. This is useful for on-line modifications of + // HTML source (for example,
 handler replaces spaces with  
+    // and newlines with 
) + virtual void SetSourceAndSaveState(const wxString& src); + // Restores parser's state from stack or returns false if the stack is + // empty + virtual bool RestoreState(); + + // Returns HTML source inside the element (i.e. between the starting + // and ending tag) + wxString GetInnerSource(const wxHtmlTag& tag); + + // Parses HTML string 'markup' and extracts charset info from tag + // if present. Returns empty string if the tag is missing. + // For wxHTML's internal use. + static wxString ExtractCharsetInformation(const wxString& markup); + + // Returns entity parser object, used to substitute HTML &entities; + wxHtmlEntitiesParser *GetEntitiesParser() const { return m_entitiesParser; } + + // Returns true if the tag starting at the given position is a comment tag + // + // p should point to '<' character and is modified to point to the closing + // '>' of the end comment tag if this is indeed a comment + static bool + SkipCommentTag(wxString::const_iterator& p, wxString::const_iterator end); + +protected: + // DOM structure + void CreateDOMTree(); + void DestroyDOMTree(); + void CreateDOMSubTree(wxHtmlTag *cur, + const wxString::const_iterator& begin_pos, + const wxString::const_iterator& end_pos, + wxHtmlTagsCache *cache); + + // Adds text to the output. + // This is called from Parse() and must be overridden in derived classes. + // txt is not guaranteed to be only one word. It is largest continuous part + // of text (= not broken by tags) + virtual void AddText(const wxString& txt) = 0; + + // Adds tag and proceeds it. Parse() may (and usually is) called from this method. + // This is called from Parse() and may be overridden. + // Default behaviour is that it looks for proper handler in m_Handlers. The tag is + // ignored if no hander is found. + // Derived class is *responsible* for filling in m_Handlers table. + virtual void AddTag(const wxHtmlTag& tag); + +protected: + // DOM tree: + wxHtmlTag *m_CurTag; + wxHtmlTag *m_Tags; + wxHtmlTextPieces *m_TextPieces; + size_t m_CurTextPiece; + + const wxString *m_Source; + + wxHtmlParserState *m_SavedStates; + + // handlers that handle particular tags. The table is accessed by + // key = tag's name. + // This attribute MUST be filled by derived class otherwise it would + // be empty and no tags would be recognized + // (see wxHtmlWinParser for details about filling it) + // m_HandlersHash is for random access based on knowledge of tag name (BR, P, etc.) + // it may (and often does) contain more references to one object + // m_HandlersList is list of all handlers and it is guaranteed to contain + // only one reference to each handler instance. + wxHtmlTagHandlersSet m_HandlersSet; + wxHtmlTagHandlersHash m_HandlersHash; + + wxDECLARE_NO_COPY_CLASS(wxHtmlParser); + + // class for opening files (file system) + wxFileSystem *m_FS; + // handlers stack used by PushTagHandler and PopTagHandler + wxVector m_HandlersStack; + + // entity parse + wxHtmlEntitiesParser *m_entitiesParser; + + // flag indicating that the parser should stop + bool m_stopParsing; +}; + + + +// This class (and derived classes) cooperates with wxHtmlParser. +// Each recognized tag is passed to handler which is capable +// of handling it. Each tag is handled in 3 steps: +// 1. Handler will modifies state of parser +// (using its public methods) +// 2. Parser parses source between starting and ending tag +// 3. Handler restores original state of the parser +class WXDLLIMPEXP_HTML wxHtmlTagHandler : public wxObject +{ + DECLARE_ABSTRACT_CLASS(wxHtmlTagHandler) + +public: + wxHtmlTagHandler() : wxObject () { m_Parser = NULL; } + + // Sets the parser. + // NOTE : each _instance_ of handler is guaranteed to be called + // only by one parser. This means you don't have to care about + // reentrancy. + virtual void SetParser(wxHtmlParser *parser) + { m_Parser = parser; } + + // Get the parser associated with this tag handler. + wxHtmlParser* GetParser() const { return m_Parser; } + + // Returns list of supported tags. The list is in uppercase and + // tags are delimited by ','. + // Example : "I,B,FONT,P" + // is capable of handling italic, bold, font and paragraph tags + virtual wxString GetSupportedTags() = 0; + + // This is hadling core method. It does all the Steps 1-3. + // To process step 2, you can call ParseInner() + // returned value : true if it called ParseInner(), + // false etherwise + virtual bool HandleTag(const wxHtmlTag& tag) = 0; + +protected: + // parses input between beginning and ending tag. + // m_Parser must be set. + void ParseInner(const wxHtmlTag& tag) + { m_Parser->DoParsing(tag.GetBeginIter(), tag.GetEndIter1()); } + + // Parses given source as if it was tag's inner code (see + // wxHtmlParser::GetInnerSource). Unlike ParseInner(), this method lets + // you specify the source code to parse. This is useful when you need to + // modify the inner text before parsing. + void ParseInnerSource(const wxString& source); + + wxHtmlParser *m_Parser; + + wxDECLARE_NO_COPY_CLASS(wxHtmlTagHandler); +}; + + +// This class is used to parse HTML entities in strings. It can handle +// both named entities and &#xxxx entries where xxxx is Unicode code. +class WXDLLIMPEXP_HTML wxHtmlEntitiesParser : public wxObject +{ + DECLARE_DYNAMIC_CLASS(wxHtmlEntitiesParser) + +public: + wxHtmlEntitiesParser(); + virtual ~wxHtmlEntitiesParser(); + + // Sets encoding of output string. + // Has no effect if wxUSE_UNICODE==1 +#if wxUSE_UNICODE + void SetEncoding(wxFontEncoding WXUNUSED(encoding)) {} +#else + void SetEncoding(wxFontEncoding encoding); +#endif + + // Parses entities in input and replaces them with respective characters + // (with respect to output encoding) + wxString Parse(const wxString& input) const; + + // Returns character for given entity or 0 if the enity is unknown + wxChar GetEntityChar(const wxString& entity) const; + + // Returns character that represents given Unicode code +#if wxUSE_UNICODE + wxChar GetCharForCode(unsigned code) const { return (wxChar)code; } +#else + wxChar GetCharForCode(unsigned code) const; +#endif + +protected: +#if !wxUSE_UNICODE + wxMBConv *m_conv; + wxFontEncoding m_encoding; +#endif + + wxDECLARE_NO_COPY_CLASS(wxHtmlEntitiesParser); +}; + + +#endif + +#endif // _WX_HTMLPARS_H_ diff --git a/wxmsw/include/wx-3.0/wx/html/htmlproc.h b/wxmsw/include/wx-3.0/wx/html/htmlproc.h new file mode 100644 index 00000000..d608b58f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/htmlproc.h @@ -0,0 +1,57 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/htmlprep.h +// Purpose: HTML processor +// Author: Vaclav Slavik +// Copyright: (c) 2001 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMLPREP_H_ +#define _WX_HTMLPREP_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/string.h" + +// Priority of preprocessor in the chain. The higher, the earlier it is used +enum +{ + wxHTML_PRIORITY_DONTCARE = 128, // if the order doesn't matter, use this + // priority + wxHTML_PRIORITY_SYSTEM = 256 // >=256 is only for wxHTML's internals +}; + +// Classes derived from this class serve as simple text processors for +// wxHtmlWindow. wxHtmlWindow runs HTML markup through all registered +// processors before displaying it, thus allowing for on-the-fly +// modifications of the markup. + +class WXDLLIMPEXP_HTML wxHtmlProcessor : public wxObject +{ + DECLARE_ABSTRACT_CLASS(wxHtmlProcessor) + +public: + wxHtmlProcessor() : wxObject(), m_enabled(true) {} + virtual ~wxHtmlProcessor() {} + + // Process input text and return processed result + virtual wxString Process(const wxString& text) const = 0; + + // Return priority value of this processor. The higher, the sooner + // is the processor applied to the text. + virtual int GetPriority() const { return wxHTML_PRIORITY_DONTCARE; } + + // Enable/disable the processor. wxHtmlWindow won't use a disabled + // processor even if it is in its processors queue. + virtual void Enable(bool enable = true) { m_enabled = enable; } + bool IsEnabled() const { return m_enabled; } + +protected: + bool m_enabled; +}; + +#endif // wxUSE_HTML + +#endif // _WX_HTMLPROC_H_ diff --git a/wxmsw/include/wx-3.0/wx/html/htmltag.h b/wxmsw/include/wx-3.0/wx/html/htmltag.h new file mode 100644 index 00000000..f7b4f9b5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/htmltag.h @@ -0,0 +1,179 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/htmltag.h +// Purpose: wxHtmlTag class (represents single tag) +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMLTAG_H_ +#define _WX_HTMLTAG_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/object.h" +#include "wx/arrstr.h" + +class WXDLLIMPEXP_FWD_CORE wxColour; +class WXDLLIMPEXP_FWD_HTML wxHtmlEntitiesParser; + +//----------------------------------------------------------------------------- +// wxHtmlTagsCache +// - internal wxHTML class, do not use! +//----------------------------------------------------------------------------- + +class wxHtmlTagsCacheData; + +class WXDLLIMPEXP_HTML wxHtmlTagsCache +{ +private: + wxHtmlTagsCacheData *m_Cache; + int m_CachePos; + + wxHtmlTagsCacheData& Cache() { return *m_Cache; } + +public: + wxHtmlTagsCache() {m_Cache = NULL;} + wxHtmlTagsCache(const wxString& source); + virtual ~wxHtmlTagsCache(); + + // Finds parameters for tag starting at at and fills the variables + void QueryTag(const wxString::const_iterator& at, + const wxString::const_iterator& inputEnd, + wxString::const_iterator *end1, + wxString::const_iterator *end2, + bool *hasEnding); + + wxDECLARE_NO_COPY_CLASS(wxHtmlTagsCache); +}; + + +//-------------------------------------------------------------------------------- +// wxHtmlTag +// This represents single tag. It is used as internal structure +// by wxHtmlParser. +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlTag +{ +protected: + // constructs wxHtmlTag object based on HTML tag. + // The tag begins (with '<' character) at position pos in source + // end_pos is position where parsing ends (usually end of document) + wxHtmlTag(wxHtmlTag *parent, + const wxString *source, + const wxString::const_iterator& pos, + const wxString::const_iterator& end_pos, + wxHtmlTagsCache *cache, + wxHtmlEntitiesParser *entParser); + friend class wxHtmlParser; +public: + ~wxHtmlTag(); + + wxHtmlTag *GetParent() const {return m_Parent;} + wxHtmlTag *GetFirstSibling() const; + wxHtmlTag *GetLastSibling() const; + wxHtmlTag *GetChildren() const { return m_FirstChild; } + wxHtmlTag *GetPreviousSibling() const { return m_Prev; } + wxHtmlTag *GetNextSibling() const {return m_Next; } + // Return next tag, as if tree had been flattened + wxHtmlTag *GetNextTag() const; + + // Returns tag's name in uppercase. + inline wxString GetName() const {return m_Name;} + + // Returns true if the tag has given parameter. Parameter + // should always be in uppercase. + // Example : HasParam("SRC") returns true + bool HasParam(const wxString& par) const; + + // Returns value of the param. Value is in uppercase unless it is + // enclosed with " + // Example :

GetParam("ALIGN") returns (RIGHT) + //

GetParam("SRC") returns (WhaT.jpg) + // (or ("WhaT.jpg") if with_quotes == true) + wxString GetParam(const wxString& par, bool with_quotes = false) const; + + // Return true if the string could be parsed as an HTML colour and false + // otherwise. + static bool ParseAsColour(const wxString& str, wxColour *clr); + + // Convenience functions: + bool GetParamAsString(const wxString& par, wxString *str) const; + bool GetParamAsColour(const wxString& par, wxColour *clr) const; + bool GetParamAsInt(const wxString& par, int *clr) const; + bool GetParamAsIntOrPercent(const wxString& param, + int* value, bool& isPercent) const; + + // Scans param like scanf() functions family does. + // Example : ScanParam("COLOR", "\"#%X\"", &clr); + // This is always with with_quotes=false + // Returns number of scanned values + // (like sscanf() does) + // NOTE: unlike scanf family, this function only accepts + // *one* parameter ! + int ScanParam(const wxString& par, const char *format, void *param) const; + int ScanParam(const wxString& par, const wchar_t *format, void *param) const; + + // Returns string containing all params. + wxString GetAllParams() const; + + // return true if there is matching ending tag + inline bool HasEnding() const {return m_hasEnding;} + + // returns beginning position of _internal_ block of text as iterator + // into parser's source string (see wxHtmlParser::GetSource()) + // See explanation (returned value is marked with *): + // bla bla bla * bla bla intenal text bla bla + wxString::const_iterator GetBeginIter() const + { return m_Begin; } + // returns ending position of _internal_ block of text as iterator + // into parser's source string (see wxHtmlParser::GetSource()): + // bla bla bla bla bla intenal text* bla bla + wxString::const_iterator GetEndIter1() const { return m_End1; } + // returns end position 2 as iterator + // into parser's source string (see wxHtmlParser::GetSource()): + // bla bla bla bla bla internal text* bla bla + wxString::const_iterator GetEndIter2() const { return m_End2; } + +#if WXWIN_COMPATIBILITY_2_8 + // use GetBeginIter(), GetEndIter1() and GetEndIter2() instead + wxDEPRECATED( inline int GetBeginPos() const ); + wxDEPRECATED( inline int GetEndPos1() const ); + wxDEPRECATED( inline int GetEndPos2() const ); +#endif // WXWIN_COMPATIBILITY_2_8 + +private: + wxString m_Name; + bool m_hasEnding; + wxString::const_iterator m_Begin, m_End1, m_End2; + wxArrayString m_ParamNames, m_ParamValues; +#if WXWIN_COMPATIBILITY_2_8 + wxString::const_iterator m_sourceStart; +#endif + + // DOM tree relations: + wxHtmlTag *m_Next; + wxHtmlTag *m_Prev; + wxHtmlTag *m_FirstChild, *m_LastChild; + wxHtmlTag *m_Parent; + + wxDECLARE_NO_COPY_CLASS(wxHtmlTag); +}; + + +#if WXWIN_COMPATIBILITY_2_8 +inline int wxHtmlTag::GetBeginPos() const { return int(m_Begin - m_sourceStart); } +inline int wxHtmlTag::GetEndPos1() const { return int(m_End1 - m_sourceStart); } +inline int wxHtmlTag::GetEndPos2() const { return int(m_End2 - m_sourceStart); } +#endif // WXWIN_COMPATIBILITY_2_8 + + + + +#endif // wxUSE_HTML + +#endif // _WX_HTMLTAG_H_ + diff --git a/wxmsw/include/wx-3.0/wx/html/htmlwin.h b/wxmsw/include/wx-3.0/wx/html/htmlwin.h new file mode 100644 index 00000000..7c716df1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/htmlwin.h @@ -0,0 +1,658 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/htmlwin.h +// Purpose: wxHtmlWindow class for parsing & displaying HTML +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMLWIN_H_ +#define _WX_HTMLWIN_H_ + +#include "wx/defs.h" +#if wxUSE_HTML + +#include "wx/window.h" +#include "wx/scrolwin.h" +#include "wx/config.h" +#include "wx/stopwatch.h" +#include "wx/html/winpars.h" +#include "wx/html/htmlcell.h" +#include "wx/filesys.h" +#include "wx/html/htmlfilt.h" +#include "wx/filename.h" +#include "wx/bitmap.h" + +class wxHtmlProcessor; +class wxHtmlWinModule; +class wxHtmlHistoryArray; +class wxHtmlProcessorList; +class WXDLLIMPEXP_FWD_HTML wxHtmlWinAutoScrollTimer; +class WXDLLIMPEXP_FWD_HTML wxHtmlCellEvent; +class WXDLLIMPEXP_FWD_HTML wxHtmlLinkEvent; +class WXDLLIMPEXP_FWD_CORE wxStatusBar; + +// wxHtmlWindow flags: +#define wxHW_SCROLLBAR_NEVER 0x0002 +#define wxHW_SCROLLBAR_AUTO 0x0004 +#define wxHW_NO_SELECTION 0x0008 + +#define wxHW_DEFAULT_STYLE wxHW_SCROLLBAR_AUTO + +/// Enum for wxHtmlWindow::OnOpeningURL and wxHtmlWindowInterface::OnOpeningURL +enum wxHtmlOpeningStatus +{ + /// Open the requested URL + wxHTML_OPEN, + /// Do not open the URL + wxHTML_BLOCK, + /// Redirect to another URL (returned from OnOpeningURL) + wxHTML_REDIRECT +}; + +/** + Abstract interface to a HTML rendering window (such as wxHtmlWindow or + wxHtmlListBox) that is passed to wxHtmlWinParser. It encapsulates all + communication from the parser to the window. + */ +class WXDLLIMPEXP_HTML wxHtmlWindowInterface +{ +public: + /// Ctor + wxHtmlWindowInterface() {} + virtual ~wxHtmlWindowInterface() {} + + /** + Called by the parser to set window's title to given text. + */ + virtual void SetHTMLWindowTitle(const wxString& title) = 0; + + /** + Called when a link is clicked. + + @param link information about the clicked link + */ + virtual void OnHTMLLinkClicked(const wxHtmlLinkInfo& link) = 0; + + /** + Called when the parser needs to open another URL (e.g. an image). + + @param type Type of the URL request (e.g. image) + @param url URL the parser wants to open + @param redirect If the return value is wxHTML_REDIRECT, then the + URL to redirect to will be stored in this variable + (the pointer must never be NULL) + + @return indicator of how to treat the request + */ + virtual wxHtmlOpeningStatus OnHTMLOpeningURL(wxHtmlURLType type, + const wxString& url, + wxString *redirect) const = 0; + + /** + Converts coordinates @a pos relative to given @a cell to + physical coordinates in the window. + */ + virtual wxPoint HTMLCoordsToWindow(wxHtmlCell *cell, + const wxPoint& pos) const = 0; + + /// Returns the window used for rendering (may be NULL). + virtual wxWindow* GetHTMLWindow() = 0; + + /// Returns background colour to use by default. + virtual wxColour GetHTMLBackgroundColour() const = 0; + + /// Sets window's background to colour @a clr. + virtual void SetHTMLBackgroundColour(const wxColour& clr) = 0; + + /// Sets window's background to given bitmap. + virtual void SetHTMLBackgroundImage(const wxBitmap& bmpBg) = 0; + + /// Sets status bar text. + virtual void SetHTMLStatusText(const wxString& text) = 0; + + /// Type of mouse cursor + enum HTMLCursor + { + /// Standard mouse cursor (typically an arrow) + HTMLCursor_Default, + /// Cursor shown over links + HTMLCursor_Link, + /// Cursor shown over selectable text + HTMLCursor_Text + }; + + /** + Returns mouse cursor of given @a type. + */ + virtual wxCursor GetHTMLCursor(HTMLCursor type) const = 0; +}; + +/** + Helper class that implements part of mouse handling for wxHtmlWindow and + wxHtmlListBox. Cursor changes and clicking on links are handled, text + selection is not. + */ +class WXDLLIMPEXP_HTML wxHtmlWindowMouseHelper +{ +protected: + /** + Ctor. + + @param iface Interface to the owner window. + */ + wxHtmlWindowMouseHelper(wxHtmlWindowInterface *iface); + + /** + Virtual dtor. + + It is not really needed in this case but at leats it prevents gcc from + complaining about its absence. + */ + virtual ~wxHtmlWindowMouseHelper() { } + + /// Returns true if the mouse moved since the last call to HandleIdle + bool DidMouseMove() const { return m_tmpMouseMoved; } + + /// Call this from EVT_MOTION event handler + void HandleMouseMoved(); + + /** + Call this from EVT_LEFT_UP handler (or, alternatively, EVT_LEFT_DOWN). + + @param rootCell HTML cell inside which the click occured. This doesn't + have to be the leaf cell, it can be e.g. toplevel + container, but the mouse must be inside the container's + area, otherwise the event would be ignored. + @param pos Mouse position in coordinates relative to @a cell + @param event The event that triggered the call + */ + bool HandleMouseClick(wxHtmlCell *rootCell, + const wxPoint& pos, const wxMouseEvent& event); + + /** + Call this from OnInternalIdle of the HTML displaying window. Handles + mouse movements and must be used together with HandleMouseMoved. + + @param rootCell HTML cell inside which the click occured. This doesn't + have to be the leaf cell, it can be e.g. toplevel + container, but the mouse must be inside the container's + area, otherwise the event would be ignored. + @param pos Current mouse position in coordinates relative to + @a cell + */ + void HandleIdle(wxHtmlCell *rootCell, const wxPoint& pos); + + /** + Called by HandleIdle when the mouse hovers over a cell. Default + behaviour is to do nothing. + + @param cell the cell the mouse is over + @param x, y coordinates of mouse relative to the cell + */ + virtual void OnCellMouseHover(wxHtmlCell *cell, wxCoord x, wxCoord y); + + /** + Called by HandleMouseClick when the user clicks on a cell. + Default behaviour is to call wxHtmlWindowInterface::OnLinkClicked() + if this cell corresponds to a hypertext link. + + @param cell the cell the mouse is over + @param x, y coordinates of mouse relative to the cell + @param event The event that triggered the call + + + @return true if a link was clicked, false otherwise. + */ + virtual bool OnCellClicked(wxHtmlCell *cell, + wxCoord x, wxCoord y, + const wxMouseEvent& event); + +protected: + // this flag indicates if the mouse moved (used by HandleIdle) + bool m_tmpMouseMoved; + // contains last link name + wxHtmlLinkInfo *m_tmpLastLink; + // contains the last (terminal) cell which contained the mouse + wxHtmlCell *m_tmpLastCell; + +private: + wxHtmlWindowInterface *m_interface; +}; + +// ---------------------------------------------------------------------------- +// wxHtmlWindow +// (This is probably the only class you will directly use.) +// Purpose of this class is to display HTML page (either local +// file or downloaded via HTTP protocol) in a window. Width of +// window is constant - given in constructor - virtual height +// is changed dynamically depending on page size. Once the +// window is created you can set its content by calling +// SetPage(text) or LoadPage(filename). +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlWindow : public wxScrolledWindow, + public wxHtmlWindowInterface, + public wxHtmlWindowMouseHelper +{ + DECLARE_DYNAMIC_CLASS(wxHtmlWindow) + friend class wxHtmlWinModule; + +public: + wxHtmlWindow() : wxHtmlWindowMouseHelper(this) { Init(); } + wxHtmlWindow(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHW_DEFAULT_STYLE, + const wxString& name = wxT("htmlWindow")) + : wxHtmlWindowMouseHelper(this) + { + Init(); + Create(parent, id, pos, size, style, name); + } + virtual ~wxHtmlWindow(); + + bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHW_SCROLLBAR_AUTO, + const wxString& name = wxT("htmlWindow")); + + // Set HTML page and display it. !! source is HTML document itself, + // it is NOT address/filename of HTML document. If you want to + // specify document location, use LoadPage() istead + // Return value : false if an error occurred, true otherwise + virtual bool SetPage(const wxString& source); + + // Append to current page + bool AppendToPage(const wxString& source); + + // Load HTML page from given location. Location can be either + // a) /usr/wxGTK2/docs/html/wx.htm + // b) http://www.somewhere.uk/document.htm + // c) ftp://ftp.somesite.cz/pub/something.htm + // In case there is no prefix (http:,ftp:), the method + // will try to find it itself (1. local file, then http or ftp) + // After the page is loaded, the method calls SetPage() to display it. + // Note : you can also use path relative to previously loaded page + // Return value : same as SetPage + virtual bool LoadPage(const wxString& location); + + // Loads HTML page from file + bool LoadFile(const wxFileName& filename); + + // Returns full location of opened page + wxString GetOpenedPage() const {return m_OpenedPage;} + // Returns anchor within opened page + wxString GetOpenedAnchor() const {return m_OpenedAnchor;} + // Returns of opened page or empty string otherwise + wxString GetOpenedPageTitle() const {return m_OpenedPageTitle;} + + // Sets frame in which page title will be displayed. Format is format of + // frame title, e.g. "HtmlHelp : %s". It must contain exactly one %s + void SetRelatedFrame(wxFrame* frame, const wxString& format); + wxFrame* GetRelatedFrame() const {return m_RelatedFrame;} + +#if wxUSE_STATUSBAR + // After(!) calling SetRelatedFrame, this sets statusbar slot where messages + // will be displayed. Default is -1 = no messages. + void SetRelatedStatusBar(int index); + void SetRelatedStatusBar(wxStatusBar*, int index = 0); +#endif // wxUSE_STATUSBAR + + // Sets fonts to be used when displaying HTML page. + void SetFonts(const wxString& normal_face, const wxString& fixed_face, + const int *sizes = NULL); + + // Sets font sizes to be relative to the given size or the system + // default size; use either specified or default font + void SetStandardFonts(int size = -1, + const wxString& normal_face = wxEmptyString, + const wxString& fixed_face = wxEmptyString); + + // Sets space between text and window borders. + void SetBorders(int b) {m_Borders = b;} + + // Sets the bitmap to use for background (currnetly it will be tiled, + // when/if we have CSS support we could add other possibilities...) + void SetBackgroundImage(const wxBitmap& bmpBg) { m_bmpBg = bmpBg; } + +#if wxUSE_CONFIG + // Saves custom settings into cfg config. it will use the path 'path' + // if given, otherwise it will save info into currently selected path. + // saved values : things set by SetFonts, SetBorders. + virtual void ReadCustomization(wxConfigBase *cfg, wxString path = wxEmptyString); + // ... + virtual void WriteCustomization(wxConfigBase *cfg, wxString path = wxEmptyString); +#endif // wxUSE_CONFIG + + // Goes to previous/next page (in browsing history) + // Returns true if successful, false otherwise + bool HistoryBack(); + bool HistoryForward(); + bool HistoryCanBack(); + bool HistoryCanForward(); + // Resets history + void HistoryClear(); + + // Returns pointer to conteiners/cells structure. + // It should be used ONLY when printing + wxHtmlContainerCell* GetInternalRepresentation() const {return m_Cell;} + + // Adds input filter + static void AddFilter(wxHtmlFilter *filter); + + // Returns a pointer to the parser. + wxHtmlWinParser *GetParser() const { return m_Parser; } + + // Adds HTML processor to this instance of wxHtmlWindow: + void AddProcessor(wxHtmlProcessor *processor); + // Adds HTML processor to wxHtmlWindow class as whole: + static void AddGlobalProcessor(wxHtmlProcessor *processor); + + + // -- Callbacks -- + + // Sets the title of the window + // (depending on the information passed to SetRelatedFrame() method) + virtual void OnSetTitle(const wxString& title); + + // Called when user clicked on hypertext link. Default behaviour is to + // call LoadPage(loc) + virtual void OnLinkClicked(const wxHtmlLinkInfo& link); + + // Called when wxHtmlWindow wants to fetch data from an URL (e.g. when + // loading a page or loading an image). The data are downloaded if and only if + // OnOpeningURL returns true. If OnOpeningURL returns wxHTML_REDIRECT, + // it must set *redirect to the new URL + virtual wxHtmlOpeningStatus OnOpeningURL(wxHtmlURLType WXUNUSED(type), + const wxString& WXUNUSED(url), + wxString *WXUNUSED(redirect)) const + { return wxHTML_OPEN; } + +#if wxUSE_CLIPBOARD + // Helper functions to select parts of page: + void SelectWord(const wxPoint& pos); + void SelectLine(const wxPoint& pos); + void SelectAll(); + + // Convert selection to text: + wxString SelectionToText() { return DoSelectionToText(m_selection); } + + // Converts current page to text: + wxString ToText(); +#endif // wxUSE_CLIPBOARD + + virtual void OnInternalIdle(); + + /// Returns standard HTML cursor as used by wxHtmlWindow + static wxCursor GetDefaultHTMLCursor(HTMLCursor type); + +protected: + void Init(); + + // Scrolls to anchor of this name. (Anchor is #news + // or #features etc. it is part of address sometimes: + // http://www.ms.mff.cuni.cz/~vsla8348/wxhtml/index.html#news) + // Return value : true if anchor exists, false otherwise + bool ScrollToAnchor(const wxString& anchor); + + // Prepares layout (= fill m_PosX, m_PosY for fragments) based on + // actual size of window. This method also setup scrollbars + void CreateLayout(); + + void OnPaint(wxPaintEvent& event); + void OnEraseBackground(wxEraseEvent& event); + void OnSize(wxSizeEvent& event); + void OnMouseMove(wxMouseEvent& event); + void OnMouseDown(wxMouseEvent& event); + void OnMouseUp(wxMouseEvent& event); +#if wxUSE_CLIPBOARD + void OnKeyUp(wxKeyEvent& event); + void OnDoubleClick(wxMouseEvent& event); + void OnCopy(wxCommandEvent& event); + void OnClipboardEvent(wxClipboardTextEvent& event); + void OnMouseEnter(wxMouseEvent& event); + void OnMouseLeave(wxMouseEvent& event); + void OnMouseCaptureLost(wxMouseCaptureLostEvent& event); +#endif // wxUSE_CLIPBOARD + + // Returns new filter (will be stored into m_DefaultFilter variable) + virtual wxHtmlFilter *GetDefaultFilter() {return new wxHtmlFilterPlainText;} + + // cleans static variables + static void CleanUpStatics(); + + // Returns true if text selection is enabled (wxClipboard must be available + // and wxHW_NO_SELECTION not used) + bool IsSelectionEnabled() const; + + enum ClipboardType + { + Primary, + Secondary + }; + + // Copies selection to clipboard if the clipboard support is available + // + // returns true if anything was copied to clipboard, false otherwise + bool CopySelection(ClipboardType t = Secondary); + +#if wxUSE_CLIPBOARD + // Automatic scrolling during selection: + void StopAutoScrolling(); +#endif // wxUSE_CLIPBOARD + + wxString DoSelectionToText(wxHtmlSelection *sel); + +public: + // wxHtmlWindowInterface methods: + virtual void SetHTMLWindowTitle(const wxString& title); + virtual void OnHTMLLinkClicked(const wxHtmlLinkInfo& link); + virtual wxHtmlOpeningStatus OnHTMLOpeningURL(wxHtmlURLType type, + const wxString& url, + wxString *redirect) const; + virtual wxPoint HTMLCoordsToWindow(wxHtmlCell *cell, + const wxPoint& pos) const; + virtual wxWindow* GetHTMLWindow(); + virtual wxColour GetHTMLBackgroundColour() const; + virtual void SetHTMLBackgroundColour(const wxColour& clr); + virtual void SetHTMLBackgroundImage(const wxBitmap& bmpBg); + virtual void SetHTMLStatusText(const wxString& text); + virtual wxCursor GetHTMLCursor(HTMLCursor type) const; + + // implementation of SetPage() + bool DoSetPage(const wxString& source); + +protected: + // This is pointer to the first cell in parsed data. (Note: the first cell + // is usually top one = all other cells are sub-cells of this one) + wxHtmlContainerCell *m_Cell; + // parser which is used to parse HTML input. + // Each wxHtmlWindow has its own parser because sharing one global + // parser would be problematic (because of reentrancy) + wxHtmlWinParser *m_Parser; + // contains name of actually opened page or empty string if no page opened + wxString m_OpenedPage; + // contains name of current anchor within m_OpenedPage + wxString m_OpenedAnchor; + // contains title of actually opened page or empty string if no <TITLE> tag + wxString m_OpenedPageTitle; + // class for opening files (file system) + wxFileSystem* m_FS; + + // frame in which page title should be displayed & number of its statusbar + // reserved for usage with this html window + wxFrame *m_RelatedFrame; +#if wxUSE_STATUSBAR + int m_RelatedStatusBarIndex; + wxStatusBar* m_RelatedStatusBar; +#endif // wxUSE_STATUSBAR + wxString m_TitleFormat; + + // borders (free space between text and window borders) + // defaults to 10 pixels. + int m_Borders; + + // current text selection or NULL + wxHtmlSelection *m_selection; + + // true if the user is dragging mouse to select text + bool m_makingSelection; + +#if wxUSE_CLIPBOARD + // time of the last doubleclick event, used to detect tripleclicks + // (tripleclicks are used to select whole line): + wxMilliClock_t m_lastDoubleClick; + + // helper class to automatically scroll the window if the user is selecting + // text and the mouse leaves wxHtmlWindow: + wxHtmlWinAutoScrollTimer *m_timerAutoScroll; +#endif // wxUSE_CLIPBOARD + +private: + // erase the window background using m_bmpBg or just solid colour if we + // don't have any background image + void DoEraseBackground(wxDC& dc); + + // window content for double buffered rendering, may be invalid until it is + // really initialized in OnPaint() + wxBitmap m_backBuffer; + + // background image, may be invalid + wxBitmap m_bmpBg; + + // variables used when user is selecting text + wxPoint m_tmpSelFromPos; + wxHtmlCell *m_tmpSelFromCell; + + // if >0 contents of the window is not redrawn + // (in order to avoid ugly blinking) + int m_tmpCanDrawLocks; + + // list of HTML filters + static wxList m_Filters; + // this filter is used when no filter is able to read some file + static wxHtmlFilter *m_DefaultFilter; + + // html processors array: + wxHtmlProcessorList *m_Processors; + static wxHtmlProcessorList *m_GlobalProcessors; + + // browser history + wxHtmlHistoryArray *m_History; + int m_HistoryPos; + // if this FLAG is false, items are not added to history + bool m_HistoryOn; + + // Flag used to communicate between OnPaint() and OnEraseBackground(), see + // the comments near its use. + bool m_isBgReallyErased; + + // standard mouse cursors + static wxCursor *ms_cursorLink; + static wxCursor *ms_cursorText; + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxHtmlWindow); +}; + +class WXDLLIMPEXP_FWD_HTML wxHtmlCellEvent; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_HTML, wxEVT_HTML_CELL_CLICKED, wxHtmlCellEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_HTML, wxEVT_HTML_CELL_HOVER, wxHtmlCellEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_HTML, wxEVT_HTML_LINK_CLICKED, wxHtmlLinkEvent ); + + +/*! + * Html cell window event + */ + +class WXDLLIMPEXP_HTML wxHtmlCellEvent : public wxCommandEvent +{ +public: + wxHtmlCellEvent() {} + wxHtmlCellEvent(wxEventType commandType, int id, + wxHtmlCell *cell, const wxPoint &pt, + const wxMouseEvent &ev) + : wxCommandEvent(commandType, id) + { + m_cell = cell; + m_pt = pt; + m_mouseEvent = ev; + m_bLinkWasClicked = false; + } + + wxHtmlCell* GetCell() const { return m_cell; } + wxPoint GetPoint() const { return m_pt; } + wxMouseEvent GetMouseEvent() const { return m_mouseEvent; } + + void SetLinkClicked(bool linkclicked) { m_bLinkWasClicked=linkclicked; } + bool GetLinkClicked() const { return m_bLinkWasClicked; } + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxHtmlCellEvent(*this); } + +private: + wxHtmlCell *m_cell; + wxMouseEvent m_mouseEvent; + wxPoint m_pt; + + bool m_bLinkWasClicked; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxHtmlCellEvent) +}; + + + +/*! + * Html link event + */ + +class WXDLLIMPEXP_HTML wxHtmlLinkEvent : public wxCommandEvent +{ +public: + wxHtmlLinkEvent() {} + wxHtmlLinkEvent(int id, const wxHtmlLinkInfo &linkinfo) + : wxCommandEvent(wxEVT_HTML_LINK_CLICKED, id) + { + m_linkInfo = linkinfo; + } + + const wxHtmlLinkInfo &GetLinkInfo() const { return m_linkInfo; } + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxHtmlLinkEvent(*this); } + +private: + wxHtmlLinkInfo m_linkInfo; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxHtmlLinkEvent) +}; + + +typedef void (wxEvtHandler::*wxHtmlCellEventFunction)(wxHtmlCellEvent&); +typedef void (wxEvtHandler::*wxHtmlLinkEventFunction)(wxHtmlLinkEvent&); + +#define wxHtmlCellEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxHtmlCellEventFunction, func) +#define wxHtmlLinkEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxHtmlLinkEventFunction, func) + +#define EVT_HTML_CELL_CLICKED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_HTML_CELL_CLICKED, id, wxHtmlCellEventHandler(fn)) +#define EVT_HTML_CELL_HOVER(id, fn) \ + wx__DECLARE_EVT1(wxEVT_HTML_CELL_HOVER, id, wxHtmlCellEventHandler(fn)) +#define EVT_HTML_LINK_CLICKED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_HTML_LINK_CLICKED, id, wxHtmlLinkEventHandler(fn)) + + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_HTML_CELL_CLICKED wxEVT_HTML_CELL_CLICKED +#define wxEVT_COMMAND_HTML_CELL_HOVER wxEVT_HTML_CELL_HOVER +#define wxEVT_COMMAND_HTML_LINK_CLICKED wxEVT_HTML_LINK_CLICKED + +#endif // wxUSE_HTML + +#endif // _WX_HTMLWIN_H_ + diff --git a/wxmsw/include/wx-3.0/wx/html/htmprint.h b/wxmsw/include/wx-3.0/wx/html/htmprint.h new file mode 100644 index 00000000..3699adae --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/htmprint.h @@ -0,0 +1,318 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/htmprint.h +// Purpose: html printing classes +// Author: Vaclav Slavik +// Created: 25/09/99 +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMPRINT_H_ +#define _WX_HTMPRINT_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML & wxUSE_PRINTING_ARCHITECTURE + +#include "wx/html/htmlcell.h" +#include "wx/html/winpars.h" +#include "wx/html/htmlfilt.h" + +#include "wx/print.h" +#include "wx/printdlg.h" + +#include <limits.h> // INT_MAX + +//-------------------------------------------------------------------------------- +// wxHtmlDCRenderer +// This class is capable of rendering HTML into specified +// portion of DC +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlDCRenderer : public wxObject +{ +public: + wxHtmlDCRenderer(); + virtual ~wxHtmlDCRenderer(); + + // Following 3 methods *must* be called before any call to Render: + + // Assign DC to this render + void SetDC(wxDC *dc, double pixel_scale = 1.0) + { SetDC(dc, pixel_scale, pixel_scale); } + void SetDC(wxDC *dc, double pixel_scale, double font_scale); + + // Sets size of output rectangle, in pixels. Note that you *can't* change + // width of the rectangle between calls to Render! (You can freely change height.) + void SetSize(int width, int height); + + // Sets the text to be displayed. + // Basepath is base directory (html string would be stored there if it was in + // file). It is used to determine path for loading images, for example. + // isdir is false if basepath is filename, true if it is directory name + // (see wxFileSystem for detailed explanation) + void SetHtmlText(const wxString& html, const wxString& basepath = wxEmptyString, bool isdir = true); + + // Sets fonts to be used when displaying HTML page. (if size null then default sizes used). + void SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes = NULL); + + // Sets font sizes to be relative to the given size or the system + // default size; use either specified or default font + void SetStandardFonts(int size = -1, + const wxString& normal_face = wxEmptyString, + const wxString& fixed_face = wxEmptyString); + + // [x,y] is position of upper-left corner of printing rectangle (see SetSize) + // from is y-coordinate of the very first visible cell + // to is y-coordinate of the next following page break, if any + // Returned value is y coordinate of first cell than didn't fit onto page. + // Use this value as 'from' in next call to Render in order to print multiple pages + // document + // If dont_render is TRUE then nothing is rendered into DC and it only counts + // pixels and return y coord of the next page + // + // known_pagebreaks and number_of_pages are used only when counting pages; + // otherwise, their default values should be used. Their purpose is to + // support pagebreaks using a subset of CSS2's <DIV>. The <DIV> handler + // needs to know what pagebreaks have already been set so that it doesn't + // set the same pagebreak twice. + // + // CAUTION! Render() changes DC's user scale and does NOT restore it! + int Render(int x, int y, wxArrayInt& known_pagebreaks, int from = 0, + int dont_render = false, int to = INT_MAX); + + // returns total width of the html document + int GetTotalWidth() const; + + // returns total height of the html document + // (compare Render's return value with this) + int GetTotalHeight() const; + +private: + wxDC *m_DC; + wxHtmlWinParser *m_Parser; + wxFileSystem *m_FS; + wxHtmlContainerCell *m_Cells; + int m_MaxWidth, m_Width, m_Height; + + wxDECLARE_NO_COPY_CLASS(wxHtmlDCRenderer); +}; + + + + + +enum { + wxPAGE_ODD, + wxPAGE_EVEN, + wxPAGE_ALL +}; + + + +//-------------------------------------------------------------------------------- +// wxHtmlPrintout +// This class is derived from standard wxWidgets printout class +// and is used to print HTML documents. +//-------------------------------------------------------------------------------- + + +class WXDLLIMPEXP_HTML wxHtmlPrintout : public wxPrintout +{ +public: + wxHtmlPrintout(const wxString& title = wxT("Printout")); + virtual ~wxHtmlPrintout(); + + void SetHtmlText(const wxString& html, const wxString &basepath = wxEmptyString, bool isdir = true); + // prepares the class for printing this html document. + // Must be called before using the class, in fact just after constructor + // + // basepath is base directory (html string would be stored there if it was in + // file). It is used to determine path for loading images, for example. + // isdir is false if basepath is filename, true if it is directory name + // (see wxFileSystem for detailed explanation) + + void SetHtmlFile(const wxString &htmlfile); + // same as SetHtmlText except that it takes regular file as the parameter + + void SetHeader(const wxString& header, int pg = wxPAGE_ALL); + void SetFooter(const wxString& footer, int pg = wxPAGE_ALL); + // sets header/footer for the document. The argument is interpreted as HTML document. + // You can use macros in it: + // @PAGENUM@ is replaced by page number + // @PAGESCNT@ is replaced by total number of pages + // + // pg is one of wxPAGE_ODD, wxPAGE_EVEN and wx_PAGE_ALL constants. + // You can set different header/footer for odd and even pages + + // Sets fonts to be used when displaying HTML page. (if size null then default sizes used). + void SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes = NULL); + + // Sets font sizes to be relative to the given size or the system + // default size; use either specified or default font + void SetStandardFonts(int size = -1, + const wxString& normal_face = wxEmptyString, + const wxString& fixed_face = wxEmptyString); + + void SetMargins(float top = 25.2, float bottom = 25.2, float left = 25.2, float right = 25.2, + float spaces = 5); + // sets margins in milimeters. Defaults to 1 inch for margins and 0.5cm for space + // between text and header and/or footer + + // wxPrintout stuff: + bool OnPrintPage(int page); + bool HasPage(int page); + void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo); + bool OnBeginDocument(int startPage, int endPage); + void OnPreparePrinting(); + + // Adds input filter + static void AddFilter(wxHtmlFilter *filter); + + // Cleanup + static void CleanUpStatics(); + +private: + // this function is called by the base class OnPreparePrinting() + // implementation and by default checks whether the document fits into + // pageArea horizontally and warns the user if it does not and, if we're + // going to print and not just to preview the document, giving him the + // possibility to cancel printing + // + // you may override it to either suppress this check if truncation of the + // HTML being printed is acceptable or, on the contrary, add more checks to + // it, e.g. for the fit in the vertical direction if the document should + // always appear on a single page + // + // return true if printing should go ahead or false to cancel it (the + // return value is ignored when previewing) + virtual bool CheckFit(const wxSize& pageArea, const wxSize& docArea) const; + + void RenderPage(wxDC *dc, int page); + // renders one page into dc + wxString TranslateHeader(const wxString& instr, int page); + // substitute @PAGENUM@ and @PAGESCNT@ by real values + void CountPages(); + // counts pages and fills m_NumPages and m_PageBreaks + + +private: + int m_NumPages; + wxArrayInt m_PageBreaks; + + wxString m_Document, m_BasePath; + bool m_BasePathIsDir; + wxString m_Headers[2], m_Footers[2]; + + int m_HeaderHeight, m_FooterHeight; + wxHtmlDCRenderer *m_Renderer, *m_RendererHdr; + float m_MarginTop, m_MarginBottom, m_MarginLeft, m_MarginRight, m_MarginSpace; + + // list of HTML filters + static wxList m_Filters; + + wxDECLARE_NO_COPY_CLASS(wxHtmlPrintout); +}; + + + + + +//-------------------------------------------------------------------------------- +// wxHtmlEasyPrinting +// This class provides very simple interface to printing +// architecture. It allows you to print HTML documents only +// with very few commands. +// +// Note : do not create this class on stack only. +// You should create an instance on app startup and +// use this instance for all printing. Why? The class +// stores page&printer settings in it. +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlEasyPrinting : public wxObject +{ +public: + wxHtmlEasyPrinting(const wxString& name = wxT("Printing"), wxWindow *parentWindow = NULL); + virtual ~wxHtmlEasyPrinting(); + + bool PreviewFile(const wxString &htmlfile); + bool PreviewText(const wxString &htmltext, const wxString& basepath = wxEmptyString); + // Preview file / html-text for printing + // (and offers printing) + // basepath is base directory for opening subsequent files (e.g. from <img> tag) + + bool PrintFile(const wxString &htmlfile); + bool PrintText(const wxString &htmltext, const wxString& basepath = wxEmptyString); + // Print file / html-text w/o preview + + void PageSetup(); + // pop up printer or page setup dialog + + void SetHeader(const wxString& header, int pg = wxPAGE_ALL); + void SetFooter(const wxString& footer, int pg = wxPAGE_ALL); + // sets header/footer for the document. The argument is interpreted as HTML document. + // You can use macros in it: + // @PAGENUM@ is replaced by page number + // @PAGESCNT@ is replaced by total number of pages + // + // pg is one of wxPAGE_ODD, wxPAGE_EVEN and wx_PAGE_ALL constants. + // You can set different header/footer for odd and even pages + + void SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes = 0); + // Sets fonts to be used when displaying HTML page. (if size null then default sizes used) + + // Sets font sizes to be relative to the given size or the system + // default size; use either specified or default font + void SetStandardFonts(int size = -1, + const wxString& normal_face = wxEmptyString, + const wxString& fixed_face = wxEmptyString); + + wxPrintData *GetPrintData(); + wxPageSetupDialogData *GetPageSetupData() {return m_PageSetupData;} + // return page setting data objects. + // (You can set their parameters.) + + wxWindow* GetParentWindow() const { return m_ParentWindow; } + // get the parent window + void SetParentWindow(wxWindow* window) { m_ParentWindow = window; } + // set the parent window + + const wxString& GetName() const { return m_Name; } + // get the printout name + void SetName(const wxString& name) { m_Name = name; } + // set the printout name + +protected: + virtual wxHtmlPrintout *CreatePrintout(); + virtual bool DoPreview(wxHtmlPrintout *printout1, wxHtmlPrintout *printout2); + virtual bool DoPrint(wxHtmlPrintout *printout); + +private: + wxPrintData *m_PrintData; + wxPageSetupDialogData *m_PageSetupData; + wxString m_Name; + int m_FontsSizesArr[7]; + int *m_FontsSizes; + wxString m_FontFaceFixed, m_FontFaceNormal; + + enum FontMode + { + FontMode_Explicit, + FontMode_Standard + }; + FontMode m_fontMode; + + wxString m_Headers[2], m_Footers[2]; + wxWindow *m_ParentWindow; + + wxDECLARE_NO_COPY_CLASS(wxHtmlEasyPrinting); +}; + + + + +#endif // wxUSE_HTML & wxUSE_PRINTING_ARCHITECTURE + +#endif // _WX_HTMPRINT_H_ + diff --git a/wxmsw/include/wx-3.0/wx/html/m_templ.h b/wxmsw/include/wx-3.0/wx/html/m_templ.h new file mode 100644 index 00000000..58603ac0 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/m_templ.h @@ -0,0 +1,83 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/m_templ.h +// Purpose: Modules template file +// Author: Vaclav Slavik +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +/* + +DESCRIPTION: +This is set of macros for easier writing of tag handlers. How to use it? +See mod_fonts.cpp for example... + +Attention! This is quite strange C++ bastard. Before using it, +I STRONGLY recommend reading and understanding these macros!! + +*/ + + +#ifndef _WX_M_TEMPL_H_ +#define _WX_M_TEMPL_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/html/winpars.h" + +#define TAG_HANDLER_BEGIN(name,tags) \ + class wxHTML_Handler_##name : public wxHtmlWinTagHandler \ + { \ + public: \ + wxString GetSupportedTags() {return wxT(tags);} + + + +#define TAG_HANDLER_VARS \ + private: + +#define TAG_HANDLER_CONSTR(name) \ + public: \ + wxHTML_Handler_##name () : wxHtmlWinTagHandler() + + +#define TAG_HANDLER_PROC(varib) \ + public: \ + bool HandleTag(const wxHtmlTag& varib) + + + +#define TAG_HANDLER_END(name) \ + }; + + + + +#define TAGS_MODULE_BEGIN(name) \ + class wxHTML_Module##name : public wxHtmlTagsModule \ + { \ + DECLARE_DYNAMIC_CLASS(wxHTML_Module##name ) \ + public: \ + void FillHandlersTable(wxHtmlWinParser *parser) \ + { + + + + +#define TAGS_MODULE_ADD(handler) \ + parser->AddTagHandler(new wxHTML_Handler_##handler); + + + + +#define TAGS_MODULE_END(name) \ + } \ + }; \ + IMPLEMENT_DYNAMIC_CLASS(wxHTML_Module##name , wxHtmlTagsModule) + + + +#endif +#endif diff --git a/wxmsw/include/wx-3.0/wx/html/styleparams.h b/wxmsw/include/wx-3.0/wx/html/styleparams.h new file mode 100644 index 00000000..8269c124 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/styleparams.h @@ -0,0 +1,52 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/styleparams.h +// Purpose: wxHtml helper code for extracting style parameters +// Author: Nigel Paton +// Copyright: wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTML_STYLEPARAMS_H_ +#define _WX_HTML_STYLEPARAMS_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/arrstr.h" + +class WXDLLIMPEXP_FWD_HTML wxHtmlTag; + +// This is a private class used by wxHTML to parse "style" attributes of HTML +// elements. Currently both parsing and support for the parsed values is pretty +// trivial. +class WXDLLIMPEXP_HTML wxHtmlStyleParams +{ +public: + // Construct a style parameters object corresponding to the style attribute + // of the given HTML tag. + wxHtmlStyleParams(const wxHtmlTag& tag); + + // Check whether the named parameter is present or not. + bool HasParam(const wxString& par) const + { + return m_names.Index(par, false /* ignore case */) != wxNOT_FOUND; + } + + // Get the value of the named parameter, return empty string if none. + wxString GetParam(const wxString& par) const + { + int index = m_names.Index(par, false); + return index == wxNOT_FOUND ? wxString() : m_values[index]; + } + +private: + // Arrays if names and values of the parameters + wxArrayString + m_names, + m_values; +}; + +#endif // wxUSE_HTML + +#endif // _WX_HTML_STYLEPARAMS_H_ diff --git a/wxmsw/include/wx-3.0/wx/html/winpars.h b/wxmsw/include/wx-3.0/wx/html/winpars.h new file mode 100644 index 00000000..a778dfa8 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/html/winpars.h @@ -0,0 +1,312 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/winpars.h +// Purpose: wxHtmlWinParser class (parser to be used with wxHtmlWindow) +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WINPARS_H_ +#define _WX_WINPARS_H_ + +#include "wx/defs.h" +#if wxUSE_HTML + +#include "wx/module.h" +#include "wx/font.h" +#include "wx/html/htmlpars.h" +#include "wx/html/htmlcell.h" +#include "wx/encconv.h" + +class WXDLLIMPEXP_FWD_HTML wxHtmlWindow; +class WXDLLIMPEXP_FWD_HTML wxHtmlWindowInterface; +class WXDLLIMPEXP_FWD_HTML wxHtmlWinParser; +class WXDLLIMPEXP_FWD_HTML wxHtmlWinTagHandler; +class WXDLLIMPEXP_FWD_HTML wxHtmlTagsModule; + + +//-------------------------------------------------------------------------------- +// wxHtmlWinParser +// This class is derived from wxHtmlParser and its mail goal +// is to parse HTML input so that it can be displayed in +// wxHtmlWindow. It uses special wxHtmlWinTagHandler. +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlWinParser : public wxHtmlParser +{ + DECLARE_ABSTRACT_CLASS(wxHtmlWinParser) + friend class wxHtmlWindow; + +public: + wxHtmlWinParser(wxHtmlWindowInterface *wndIface = NULL); + + virtual ~wxHtmlWinParser(); + + virtual void InitParser(const wxString& source); + virtual void DoneParser(); + virtual wxObject* GetProduct(); + + virtual wxFSFile *OpenURL(wxHtmlURLType type, const wxString& url) const; + + // Set's the DC used for parsing. If SetDC() is not called, + // parsing won't proceed + virtual void SetDC(wxDC *dc, double pixel_scale = 1.0) + { SetDC(dc, pixel_scale, pixel_scale); } + void SetDC(wxDC *dc, double pixel_scale, double font_scale); + + wxDC *GetDC() {return m_DC;} + double GetPixelScale() {return m_PixelScale;} + int GetCharHeight() const {return m_CharHeight;} + int GetCharWidth() const {return m_CharWidth;} + + // NOTE : these functions do _not_ return _actual_ + // height/width. They return h/w of default font + // for this DC. If you want actual values, call + // GetDC()->GetChar...() + + // returns interface to the rendering window + wxHtmlWindowInterface *GetWindowInterface() {return m_windowInterface;} +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, use GetWindowInterface()->GetHTMLWindow() instead + wxDEPRECATED( wxHtmlWindow *GetWindow() ); +#endif + + // Sets fonts to be used when displaying HTML page. (if size null then default sizes used). + void SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes = NULL); + + // Sets font sizes to be relative to the given size or the system + // default size; use either specified or default font + void SetStandardFonts(int size = -1, + const wxString& normal_face = wxEmptyString, + const wxString& fixed_face = wxEmptyString); + + // Adds tags module. see wxHtmlTagsModule for details. + static void AddModule(wxHtmlTagsModule *module); + + static void RemoveModule(wxHtmlTagsModule *module); + + // parsing-related methods. These methods are called by tag handlers: + + // Returns pointer to actual container. Common use in tag handler is : + // m_WParser->GetContainer()->InsertCell(new ...); + wxHtmlContainerCell *GetContainer() const {return m_Container;} + + // opens new container. This container is sub-container of opened + // container. Sets GetContainer to newly created container + // and returns it. + wxHtmlContainerCell *OpenContainer(); + + // works like OpenContainer except that new container is not created + // but c is used. You can use this to directly set actual container + wxHtmlContainerCell *SetContainer(wxHtmlContainerCell *c); + + // closes the container and sets actual Container to upper-level + // container + wxHtmlContainerCell *CloseContainer(); + + int GetFontSize() const {return m_FontSize;} + void SetFontSize(int s); + // Try to map a font size in points to the HTML 1-7 font size range. + void SetFontPointSize(int pt); + int GetFontBold() const {return m_FontBold;} + void SetFontBold(int x) {m_FontBold = x;} + int GetFontItalic() const {return m_FontItalic;} + void SetFontItalic(int x) {m_FontItalic = x;} + int GetFontUnderlined() const {return m_FontUnderlined;} + void SetFontUnderlined(int x) {m_FontUnderlined = x;} + int GetFontFixed() const {return m_FontFixed;} + void SetFontFixed(int x) {m_FontFixed = x;} + wxString GetFontFace() const {return GetFontFixed() ? m_FontFaceFixed : m_FontFaceNormal;} + void SetFontFace(const wxString& face); + + int GetAlign() const {return m_Align;} + void SetAlign(int a) {m_Align = a;} + + wxHtmlScriptMode GetScriptMode() const { return m_ScriptMode; } + void SetScriptMode(wxHtmlScriptMode mode) { m_ScriptMode = mode; } + long GetScriptBaseline() const { return m_ScriptBaseline; } + void SetScriptBaseline(long base) { m_ScriptBaseline = base; } + + const wxColour& GetLinkColor() const { return m_LinkColor; } + void SetLinkColor(const wxColour& clr) { m_LinkColor = clr; } + const wxColour& GetActualColor() const { return m_ActualColor; } + void SetActualColor(const wxColour& clr) { m_ActualColor = clr ;} + const wxColour& GetActualBackgroundColor() const { return m_ActualBackgroundColor; } + void SetActualBackgroundColor(const wxColour& clr) { m_ActualBackgroundColor = clr;} + int GetActualBackgroundMode() const { return m_ActualBackgroundMode; } + void SetActualBackgroundMode(int mode) { m_ActualBackgroundMode = mode;} + const wxHtmlLinkInfo& GetLink() const { return m_Link; } + void SetLink(const wxHtmlLinkInfo& link); + + // applies current parser state (link, sub/supscript, ...) to given cell + void ApplyStateToCell(wxHtmlCell *cell); + + // Needs to be called after inserting a cell that interrupts the flow of + // the text like e.g. <img> and tells us to not consider any of the + // following space as being part of the same space run as before. + void StopCollapsingSpaces() { m_tmpLastWasSpace = false; } + +#if !wxUSE_UNICODE + void SetInputEncoding(wxFontEncoding enc); + wxFontEncoding GetInputEncoding() const { return m_InputEnc; } + wxFontEncoding GetOutputEncoding() const { return m_OutputEnc; } + wxEncodingConverter *GetEncodingConverter() const { return m_EncConv; } +#endif + + // creates font depending on m_Font* members. + virtual wxFont* CreateCurrentFont(); + + enum WhitespaceMode + { + Whitespace_Normal, // normal mode, collapse whitespace + Whitespace_Pre // inside <pre>, keep whitespace as-is + }; + + // change the current whitespace handling mode + void SetWhitespaceMode(WhitespaceMode mode) { m_whitespaceMode = mode; } + WhitespaceMode GetWhitespaceMode() const { return m_whitespaceMode; } + +protected: + virtual void AddText(const wxString& txt); + +private: + void FlushWordBuf(wxChar *temp, int& len); + void AddWord(wxHtmlWordCell *word); + void AddWord(const wxString& word) + { AddWord(new wxHtmlWordCell(word, *(GetDC()))); } + void AddPreBlock(const wxString& text); + + bool m_tmpLastWasSpace; + wxChar *m_tmpStrBuf; + size_t m_tmpStrBufSize; + // temporary variables used by AddText + wxHtmlWindowInterface *m_windowInterface; + // window we're parsing for + double m_PixelScale, m_FontScale; + wxDC *m_DC; + // Device Context we're parsing for + static wxList m_Modules; + // list of tags modules (see wxHtmlTagsModule for details) + // This list is used to initialize m_Handlers member. + + wxHtmlContainerCell *m_Container; + // current container. See Open/CloseContainer for details. + + int m_FontBold, m_FontItalic, m_FontUnderlined, m_FontFixed; // this is not true,false but 1,0, we need it for indexing + int m_FontSize; // From 1 (smallest) to 7, default is 3. + wxColour m_LinkColor; + wxColour m_ActualColor; + wxColour m_ActualBackgroundColor; + int m_ActualBackgroundMode; + // basic font parameters. + wxHtmlLinkInfo m_Link; + // actual hypertext link or empty string + bool m_UseLink; + // true if m_Link is not empty + int m_CharHeight, m_CharWidth; + // average height of normal-sized text + int m_Align; + // actual alignment + wxHtmlScriptMode m_ScriptMode; + // current script mode (sub/sup/normal) + long m_ScriptBaseline; + // current sub/supscript base + + wxFont* m_FontsTable[2][2][2][2][7]; + wxString m_FontsFacesTable[2][2][2][2][7]; +#if !wxUSE_UNICODE + wxFontEncoding m_FontsEncTable[2][2][2][2][7]; +#endif + // table of loaded fonts. 1st four indexes are 0 or 1, depending on on/off + // state of these flags (from left to right): + // [bold][italic][underlined][fixed_size] + // last index is font size : from 0 to 6 (remapped from html sizes 1 to 7) + // Note : this table covers all possible combinations of fonts, but not + // all of them are used, so many items in table are usually NULL. + int m_FontsSizes[7]; + wxString m_FontFaceFixed, m_FontFaceNormal; + // html font sizes and faces of fixed and proportional fonts + +#if !wxUSE_UNICODE + wxChar m_nbsp; + wxFontEncoding m_InputEnc, m_OutputEnc; + // I/O font encodings + wxEncodingConverter *m_EncConv; +#endif + + // current whitespace handling mode + WhitespaceMode m_whitespaceMode; + + wxHtmlWordCell *m_lastWordCell; + + // current position on line, in num. of characters; used to properly + // expand TABs; only updated while inside <pre> + int m_posColumn; + + wxDECLARE_NO_COPY_CLASS(wxHtmlWinParser); +}; + + + + + + +//----------------------------------------------------------------------------- +// wxHtmlWinTagHandler +// This is basicly wxHtmlTagHandler except +// it is extended with protected member m_Parser pointing to +// the wxHtmlWinParser object +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_HTML wxHtmlStyleParams; + +class WXDLLIMPEXP_HTML wxHtmlWinTagHandler : public wxHtmlTagHandler +{ + DECLARE_ABSTRACT_CLASS(wxHtmlWinTagHandler) + +public: + wxHtmlWinTagHandler() : wxHtmlTagHandler() {} + + virtual void SetParser(wxHtmlParser *parser) {wxHtmlTagHandler::SetParser(parser); m_WParser = (wxHtmlWinParser*) parser;} + +protected: + wxHtmlWinParser *m_WParser; // same as m_Parser, but overcasted + + void ApplyStyle(const wxHtmlStyleParams &styleParams); + + wxDECLARE_NO_COPY_CLASS(wxHtmlWinTagHandler); +}; + + + + + + +//---------------------------------------------------------------------------- +// wxHtmlTagsModule +// This is basic of dynamic tag handlers binding. +// The class provides methods for filling parser's handlers +// hash table. +// (See documentation for details) +//---------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlTagsModule : public wxModule +{ + DECLARE_DYNAMIC_CLASS(wxHtmlTagsModule) + +public: + wxHtmlTagsModule() : wxModule() {} + + virtual bool OnInit(); + virtual void OnExit(); + + // This is called by wxHtmlWinParser. + // The method must simply call parser->AddTagHandler(new + // <handler_class_name>); for each handler + virtual void FillHandlersTable(wxHtmlWinParser * WXUNUSED(parser)) { } +}; + + +#endif + +#endif // _WX_WINPARS_H_ diff --git a/wxmsw/include/wx-3.0/wx/htmllbox.h b/wxmsw/include/wx-3.0/wx/htmllbox.h new file mode 100644 index 00000000..27c3a36c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/htmllbox.h @@ -0,0 +1,321 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/htmllbox.h +// Purpose: wxHtmlListBox is a listbox whose items are wxHtmlCells +// Author: Vadim Zeitlin +// Modified by: +// Created: 31.05.03 +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMLLBOX_H_ +#define _WX_HTMLLBOX_H_ + +#include "wx/vlbox.h" // base class +#include "wx/html/htmlwin.h" +#include "wx/ctrlsub.h" + +#if wxUSE_FILESYSTEM + #include "wx/filesys.h" +#endif // wxUSE_FILESYSTEM + +class WXDLLIMPEXP_FWD_HTML wxHtmlCell; +class WXDLLIMPEXP_FWD_HTML wxHtmlWinParser; +class WXDLLIMPEXP_FWD_HTML wxHtmlListBoxCache; +class WXDLLIMPEXP_FWD_HTML wxHtmlListBoxStyle; + +extern WXDLLIMPEXP_DATA_HTML(const char) wxHtmlListBoxNameStr[]; +extern WXDLLIMPEXP_DATA_HTML(const char) wxSimpleHtmlListBoxNameStr[]; + +// ---------------------------------------------------------------------------- +// wxHtmlListBox +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlListBox : public wxVListBox, + public wxHtmlWindowInterface, + public wxHtmlWindowMouseHelper +{ + DECLARE_ABSTRACT_CLASS(wxHtmlListBox) +public: + // constructors and such + // --------------------- + + // default constructor, you must call Create() later + wxHtmlListBox(); + + // normal constructor which calls Create() internally + wxHtmlListBox(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxHtmlListBoxNameStr); + + // really creates the control and sets the initial number of items in it + // (which may be changed later with SetItemCount()) + // + // the only special style which may be specified here is wxLB_MULTIPLE + // + // returns true on success or false if the control couldn't be created + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxHtmlListBoxNameStr); + + // destructor cleans up whatever resources we use + virtual ~wxHtmlListBox(); + + // override some base class virtuals + virtual void RefreshRow(size_t line); + virtual void RefreshRows(size_t from, size_t to); + virtual void RefreshAll(); + virtual void SetItemCount(size_t count); + +#if wxUSE_FILESYSTEM + // retrieve the file system used by the wxHtmlWinParser: if you use + // relative paths in your HTML, you should use its ChangePathTo() method + wxFileSystem& GetFileSystem() { return m_filesystem; } + const wxFileSystem& GetFileSystem() const { return m_filesystem; } +#endif // wxUSE_FILESYSTEM + + virtual void OnInternalIdle(); + +protected: + // this method must be implemented in the derived class and should return + // the body (i.e. without <html>) of the HTML for the given item + virtual wxString OnGetItem(size_t n) const = 0; + + // this function may be overridden to decorate HTML returned by OnGetItem() + virtual wxString OnGetItemMarkup(size_t n) const; + + + // this method allows to customize the selection appearance: it may be used + // to specify the colour of the text which normally has the given colour + // colFg when it is inside the selection + // + // by default, the original colour is not used at all and all text has the + // same (default for this system) colour inside selection + virtual wxColour GetSelectedTextColour(const wxColour& colFg) const; + + // this is the same as GetSelectedTextColour() but allows to customize the + // background colour -- this is even more rarely used as you can change it + // globally using SetSelectionBackground() + virtual wxColour GetSelectedTextBgColour(const wxColour& colBg) const; + + + // we implement both of these functions in terms of OnGetItem(), they are + // not supposed to be overridden by our descendants + virtual void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const; + virtual wxCoord OnMeasureItem(size_t n) const; + + // override this one to draw custom background for selected items correctly + virtual void OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const; + + // this method may be overridden to handle clicking on a link in the + // listbox (by default, clicks on links are simply ignored) + virtual void OnLinkClicked(size_t n, const wxHtmlLinkInfo& link); + + // event handlers + void OnSize(wxSizeEvent& event); + void OnMouseMove(wxMouseEvent& event); + void OnLeftDown(wxMouseEvent& event); + + + // common part of all ctors + void Init(); + + // ensure that the given item is cached + void CacheItem(size_t n) const; + +private: + // wxHtmlWindowInterface methods: + virtual void SetHTMLWindowTitle(const wxString& title); + virtual void OnHTMLLinkClicked(const wxHtmlLinkInfo& link); + virtual wxHtmlOpeningStatus OnHTMLOpeningURL(wxHtmlURLType type, + const wxString& url, + wxString *redirect) const; + virtual wxPoint HTMLCoordsToWindow(wxHtmlCell *cell, + const wxPoint& pos) const; + virtual wxWindow* GetHTMLWindow(); + virtual wxColour GetHTMLBackgroundColour() const; + virtual void SetHTMLBackgroundColour(const wxColour& clr); + virtual void SetHTMLBackgroundImage(const wxBitmap& bmpBg); + virtual void SetHTMLStatusText(const wxString& text); + virtual wxCursor GetHTMLCursor(HTMLCursor type) const; + + // returns index of item that contains given HTML cell + size_t GetItemForCell(const wxHtmlCell *cell) const; + + // return physical coordinates of root wxHtmlCell of n-th item + wxPoint GetRootCellCoords(size_t n) const; + + // Converts physical coordinates stored in @a pos into coordinates + // relative to the root cell of the item under mouse cursor, if any. If no + // cell is found under the cursor, returns false. Otherwise stores the new + // coordinates back into @a pos and pointer to the cell under cursor into + // @a cell and returns true. + bool PhysicalCoordsToCell(wxPoint& pos, wxHtmlCell*& cell) const; + + // The opposite of PhysicalCoordsToCell: converts coordinates relative to + // given cell to physical coordinates in the window + wxPoint CellCoordsToPhysical(const wxPoint& pos, wxHtmlCell *cell) const; + +private: + // this class caches the pre-parsed HTML to speed up display + wxHtmlListBoxCache *m_cache; + + // HTML parser we use + wxHtmlWinParser *m_htmlParser; + +#if wxUSE_FILESYSTEM + // file system used by m_htmlParser + wxFileSystem m_filesystem; +#endif // wxUSE_FILESYSTEM + + // rendering style for the parser which allows us to customize our colours + wxHtmlListBoxStyle *m_htmlRendStyle; + + + // it calls our GetSelectedTextColour() and GetSelectedTextBgColour() + friend class wxHtmlListBoxStyle; + friend class wxHtmlListBoxWinInterface; + + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxHtmlListBox); +}; + + +// ---------------------------------------------------------------------------- +// wxSimpleHtmlListBox +// ---------------------------------------------------------------------------- + +#define wxHLB_DEFAULT_STYLE wxBORDER_SUNKEN +#define wxHLB_MULTIPLE wxLB_MULTIPLE + +class WXDLLIMPEXP_HTML wxSimpleHtmlListBox : + public wxWindowWithItems<wxHtmlListBox, wxItemContainer> +{ + DECLARE_ABSTRACT_CLASS(wxSimpleHtmlListBox) +public: + // wxListbox-compatible constructors + // --------------------------------- + + wxSimpleHtmlListBox() { } + + wxSimpleHtmlListBox(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = wxHLB_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSimpleHtmlListBoxNameStr) + { + Create(parent, id, pos, size, n, choices, style, validator, name); + } + + wxSimpleHtmlListBox(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = wxHLB_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSimpleHtmlListBoxNameStr) + { + Create(parent, id, pos, size, choices, style, validator, name); + } + + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = wxHLB_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSimpleHtmlListBoxNameStr); + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = wxHLB_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSimpleHtmlListBoxNameStr); + + virtual ~wxSimpleHtmlListBox(); + + // these must be overloaded otherwise the compiler will complain + // about wxItemContainerImmutable::[G|S]etSelection being pure virtuals... + void SetSelection(int n) + { wxVListBox::SetSelection(n); } + int GetSelection() const + { return wxVListBox::GetSelection(); } + + + // accessing strings + // ----------------- + + virtual unsigned int GetCount() const + { return m_items.GetCount(); } + + virtual wxString GetString(unsigned int n) const; + + // override default unoptimized wxItemContainer::GetStrings() function + wxArrayString GetStrings() const + { return m_items; } + + virtual void SetString(unsigned int n, const wxString& s); + + // resolve ambiguity between wxItemContainer and wxVListBox versions + void Clear(); + +protected: + virtual int DoInsertItems(const wxArrayStringsAdapter & items, + unsigned int pos, + void **clientData, wxClientDataType type); + + virtual void DoSetItemClientData(unsigned int n, void *clientData) + { m_HTMLclientData[n] = clientData; } + + virtual void *DoGetItemClientData(unsigned int n) const + { return m_HTMLclientData[n]; } + + // wxItemContainer methods + virtual void DoClear(); + virtual void DoDeleteOneItem(unsigned int n); + + // calls wxHtmlListBox::SetItemCount() and RefreshAll() + void UpdateCount(); + + // override these functions just to change their visibility: users of + // wxSimpleHtmlListBox shouldn't be allowed to call them directly! + virtual void SetItemCount(size_t count) + { wxHtmlListBox::SetItemCount(count); } + virtual void SetRowCount(size_t count) + { wxHtmlListBox::SetRowCount(count); } + + virtual wxString OnGetItem(size_t n) const + { return m_items[n]; } + + virtual void InitEvent(wxCommandEvent& event, int n) + { + // we're not a virtual control and we can include the string + // of the item which was clicked: + event.SetString(m_items[n]); + wxVListBox::InitEvent(event, n); + } + + wxArrayString m_items; + wxArrayPtrVoid m_HTMLclientData; + + // Note: For the benefit of old compilers (like gcc-2.8) this should + // not be named m_clientdata as that clashes with the name of an + // anonymous struct member in wxEvtHandler, which we derive from. + + wxDECLARE_NO_COPY_CLASS(wxSimpleHtmlListBox); +}; + +#endif // _WX_HTMLLBOX_H_ + diff --git a/wxmsw/include/wx-3.0/wx/hyperlink.h b/wxmsw/include/wx-3.0/wx/hyperlink.h new file mode 100644 index 00000000..db183d5a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/hyperlink.h @@ -0,0 +1,173 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/hyperlink.h +// Purpose: Hyperlink control +// Author: David Norris <danorris@gmail.com>, Otto Wyss +// Modified by: Ryan Norton, Francesco Montorsi +// Created: 04/02/2005 +// Copyright: (c) 2005 David Norris +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HYPERLINK_H_ +#define _WX_HYPERLINK_H_ + +#include "wx/defs.h" + +#if wxUSE_HYPERLINKCTRL + +#include "wx/control.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#define wxHL_CONTEXTMENU 0x0001 +#define wxHL_ALIGN_LEFT 0x0002 +#define wxHL_ALIGN_RIGHT 0x0004 +#define wxHL_ALIGN_CENTRE 0x0008 +#define wxHL_DEFAULT_STYLE (wxHL_CONTEXTMENU|wxNO_BORDER|wxHL_ALIGN_CENTRE) + +extern WXDLLIMPEXP_DATA_ADV(const char) wxHyperlinkCtrlNameStr[]; + + +// ---------------------------------------------------------------------------- +// wxHyperlinkCtrl +// ---------------------------------------------------------------------------- + +// A static text control that emulates a hyperlink. The link is displayed +// in an appropriate text style, derived from the control's normal font. +// When the mouse rolls over the link, the cursor changes to a hand and the +// link's color changes to the active color. +// +// Clicking on the link does not launch a web browser; instead, a +// HyperlinkEvent is fired. The event propagates upward until it is caught, +// just like a wxCommandEvent. +// +// Use the EVT_HYPERLINK() to catch link events. +class WXDLLIMPEXP_ADV wxHyperlinkCtrlBase : public wxControl +{ +public: + + // get/set + virtual wxColour GetHoverColour() const = 0; + virtual void SetHoverColour(const wxColour &colour) = 0; + + virtual wxColour GetNormalColour() const = 0; + virtual void SetNormalColour(const wxColour &colour) = 0; + + virtual wxColour GetVisitedColour() const = 0; + virtual void SetVisitedColour(const wxColour &colour) = 0; + + virtual wxString GetURL() const = 0; + virtual void SetURL (const wxString &url) = 0; + + virtual void SetVisited(bool visited = true) = 0; + virtual bool GetVisited() const = 0; + + // NOTE: also wxWindow::Set/GetLabel, wxWindow::Set/GetBackgroundColour, + // wxWindow::Get/SetFont, wxWindow::Get/SetCursor are important ! + + virtual bool HasTransparentBackground() { return true; } + +protected: + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + // checks for validity some of the ctor/Create() function parameters + void CheckParams(const wxString& label, const wxString& url, long style); + +public: + // not part of the public API but needs to be public as used by + // GTK+ callbacks: + void SendEvent(); +}; + +// ---------------------------------------------------------------------------- +// wxHyperlinkEvent +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_ADV wxHyperlinkEvent; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_HYPERLINK, wxHyperlinkEvent ); + +// +// An event fired when the user clicks on the label in a hyperlink control. +// See HyperlinkControl for details. +// +class WXDLLIMPEXP_ADV wxHyperlinkEvent : public wxCommandEvent +{ +public: + wxHyperlinkEvent() {} + wxHyperlinkEvent(wxObject *generator, wxWindowID id, const wxString& url) + : wxCommandEvent(wxEVT_HYPERLINK, id), + m_url(url) + { + SetEventObject(generator); + } + + // Returns the URL associated with the hyperlink control + // that the user clicked on. + wxString GetURL() const { return m_url; } + void SetURL(const wxString &url) { m_url=url; } + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxHyperlinkEvent(*this); } + +private: + + // URL associated with the hyperlink control that the used clicked on. + wxString m_url; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxHyperlinkEvent) +}; + + +// ---------------------------------------------------------------------------- +// event types and macros +// ---------------------------------------------------------------------------- + +typedef void (wxEvtHandler::*wxHyperlinkEventFunction)(wxHyperlinkEvent&); + +#define wxHyperlinkEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxHyperlinkEventFunction, func) + +#define EVT_HYPERLINK(id, fn) \ + wx__DECLARE_EVT1(wxEVT_HYPERLINK, id, wxHyperlinkEventHandler(fn)) + + +#if defined(__WXGTK210__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/hyperlink.h" +// Note that the native control is only available in Unicode version under MSW. +#elif defined(__WXMSW__) && wxUSE_UNICODE && !defined(__WXUNIVERSAL__) + #include "wx/msw/hyperlink.h" +#else + #include "wx/generic/hyperlink.h" + + class WXDLLIMPEXP_ADV wxHyperlinkCtrl : public wxGenericHyperlinkCtrl + { + public: + wxHyperlinkCtrl() { } + + wxHyperlinkCtrl(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxString& url, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHL_DEFAULT_STYLE, + const wxString& name = wxHyperlinkCtrlNameStr) + : wxGenericHyperlinkCtrl(parent, id, label, url, pos, size, + style, name) + { + } + + private: + wxDECLARE_DYNAMIC_CLASS_NO_COPY( wxHyperlinkCtrl ); + }; +#endif + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_HYPERLINK wxEVT_HYPERLINK + +#endif // wxUSE_HYPERLINKCTRL + +#endif // _WX_HYPERLINK_H_ diff --git a/wxmsw/include/wx-3.0/wx/icon.h b/wxmsw/include/wx-3.0/wx/icon.h new file mode 100644 index 00000000..27bb3e69 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/icon.h @@ -0,0 +1,74 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/icon.h +// Purpose: wxIcon base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ICON_H_BASE_ +#define _WX_ICON_H_BASE_ + +#include "wx/iconloc.h" + + +// a more readable way to tell +#define wxICON_SCREEN_DEPTH (-1) + + +// the wxICON_DEFAULT_TYPE (the wxIcon equivalent of wxBITMAP_DEFAULT_TYPE) +// constant defines the default argument value for wxIcon ctor and wxIcon::LoadFile() +// functions. + +#if defined(__WXMSW__) + #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_ICO_RESOURCE + #include "wx/msw/icon.h" +#elif defined(__WXMOTIF__) + #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #include "wx/motif/icon.h" +#elif defined(__WXGTK20__) + #ifdef __WINDOWS__ + #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_ICO_RESOURCE + #else + #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #endif + #include "wx/generic/icon.h" +#elif defined(__WXGTK__) + #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #include "wx/generic/icon.h" +#elif defined(__WXX11__) + #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #include "wx/generic/icon.h" +#elif defined(__WXDFB__) + #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #include "wx/generic/icon.h" +#elif defined(__WXMAC__) +#if wxOSX_USE_COCOA_OR_CARBON + #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_ICON_RESOURCE + #include "wx/osx/icon.h" +#else + #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_PNG_RESOURCE + #include "wx/generic/icon.h" +#endif +#elif defined(__WXCOCOA__) + #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_ICON_RESOURCE + #include "wx/cocoa/icon.h" +#elif defined(__WXPM__) + #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_ICO_RESOURCE + #include "wx/os2/icon.h" +#endif + +//----------------------------------------------------------------------------- +// wxVariant support +//----------------------------------------------------------------------------- + +#if wxUSE_VARIANT +#include "wx/variant.h" +DECLARE_VARIANT_OBJECT_EXPORTED(wxIcon,WXDLLIMPEXP_CORE) +#endif + + +#endif + // _WX_ICON_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/iconbndl.h b/wxmsw/include/wx-3.0/wx/iconbndl.h new file mode 100644 index 00000000..50ad6426 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/iconbndl.h @@ -0,0 +1,132 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/iconbndl.h +// Purpose: wxIconBundle +// Author: Mattia barbon +// Modified by: +// Created: 23.03.02 +// Copyright: (c) Mattia Barbon +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ICONBNDL_H_ +#define _WX_ICONBNDL_H_ + +#include "wx/gdiobj.h" +#include "wx/gdicmn.h" // for wxSize +#include "wx/icon.h" + +#include "wx/dynarray.h" + +class WXDLLIMPEXP_FWD_BASE wxInputStream; + +WX_DECLARE_EXPORTED_OBJARRAY(wxIcon, wxIconArray); + +// this class can't load bitmaps of type wxBITMAP_TYPE_ICO_RESOURCE, +// if you need them, you have to load them manually and call +// wxIconCollection::AddIcon +class WXDLLIMPEXP_CORE wxIconBundle : public wxGDIObject +{ +public: + // Flags that determine what happens if GetIcon() doesn't find the icon of + // exactly the requested size. + enum + { + // Return invalid icon if exact size is not found. + FALLBACK_NONE = 0, + + // Return the icon of the system icon size if exact size is not found. + // May be combined with other non-NONE enum elements to determine what + // happens if the system icon size is not found neither. + FALLBACK_SYSTEM = 1, + + // Return the icon of closest larger size or, if there is no icon of + // larger size in the bundle, the closest icon of smaller size. + FALLBACK_NEAREST_LARGER = 2 + }; + + // default constructor + wxIconBundle(); + + // initializes the bundle with the icon(s) found in the file +#if wxUSE_STREAMS && wxUSE_IMAGE +#if wxUSE_FFILE || wxUSE_FILE + wxIconBundle(const wxString& file, wxBitmapType type = wxBITMAP_TYPE_ANY); +#endif // wxUSE_FFILE || wxUSE_FILE + wxIconBundle(wxInputStream& stream, wxBitmapType type = wxBITMAP_TYPE_ANY); +#endif // wxUSE_STREAMS && wxUSE_IMAGE + + // initializes the bundle with a single icon + wxIconBundle(const wxIcon& icon); + + // default copy ctor and assignment operator are OK + + // adds all the icons contained in the file to the collection, + // if the collection already contains icons with the same + // width and height, they are replaced +#if wxUSE_STREAMS && wxUSE_IMAGE +#if wxUSE_FFILE || wxUSE_FILE + void AddIcon(const wxString& file, wxBitmapType type = wxBITMAP_TYPE_ANY); +#endif // wxUSE_FFILE || wxUSE_FILE + void AddIcon(wxInputStream& stream, wxBitmapType type = wxBITMAP_TYPE_ANY); +#endif // wxUSE_STREAMS && wxUSE_IMAGE + + // adds the icon to the collection, if the collection already + // contains an icon with the same width and height, it is + // replaced + void AddIcon(const wxIcon& icon); + + // returns the icon with the given size; if no such icon exists, + // behavior is specified by the flags. + wxIcon GetIcon(const wxSize& size, int flags = FALLBACK_SYSTEM) const; + + // equivalent to GetIcon(wxSize(size, size)) + wxIcon GetIcon(wxCoord size = wxDefaultCoord, + int flags = FALLBACK_SYSTEM) const + { return GetIcon(wxSize(size, size), flags); } + + // returns the icon exactly of the specified size or wxNullIcon if no icon + // of exactly given size are available + wxIcon GetIconOfExactSize(const wxSize& size) const; + wxIcon GetIconOfExactSize(wxCoord size) const + { return GetIconOfExactSize(wxSize(size, size)); } + + // enumerate all icons in the bundle: don't use these functions if ti can + // be avoided, using GetIcon() directly is better + + // return the number of available icons + size_t GetIconCount() const; + + // return the icon at index (must be < GetIconCount()) + wxIcon GetIconByIndex(size_t n) const; + + // check if we have any icons at all + bool IsEmpty() const { return GetIconCount() == 0; } + +#if WXWIN_COMPATIBILITY_2_8 +#if wxUSE_STREAMS && wxUSE_IMAGE && (wxUSE_FFILE || wxUSE_FILE) + wxDEPRECATED( void AddIcon(const wxString& file, long type) + { + AddIcon(file, (wxBitmapType)type); + } + ) + + wxDEPRECATED_CONSTRUCTOR( wxIconBundle (const wxString& file, long type) + { + AddIcon(file, (wxBitmapType)type); + } + ) +#endif // wxUSE_STREAMS && wxUSE_IMAGE && (wxUSE_FFILE || wxUSE_FILE) +#endif // WXWIN_COMPATIBILITY_2_8 + +protected: + virtual wxGDIRefData *CreateGDIRefData() const; + virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const; + +private: + // delete all icons + void DeleteIcons(); + + DECLARE_DYNAMIC_CLASS(wxIconBundle) +}; + +#endif // _WX_ICONBNDL_H_ diff --git a/wxmsw/include/wx-3.0/wx/iconloc.h b/wxmsw/include/wx-3.0/wx/iconloc.h new file mode 100644 index 00000000..9baaaa52 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/iconloc.h @@ -0,0 +1,80 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/iconloc.h +// Purpose: declaration of wxIconLocation class +// Author: Vadim Zeitlin +// Modified by: +// Created: 21.06.2003 +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ICONLOC_H_ +#define _WX_ICONLOC_H_ + +#include "wx/string.h" + +// ---------------------------------------------------------------------------- +// wxIconLocation: describes the location of an icon +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxIconLocationBase +{ +public: + // ctor takes the name of the file where the icon is + wxEXPLICIT wxIconLocationBase(const wxString& filename = wxEmptyString) + : m_filename(filename) { } + + // default copy ctor, assignment operator and dtor are ok + + + // returns true if this object is valid/initialized + bool IsOk() const { return !m_filename.empty(); } + + // set/get the icon file name + void SetFileName(const wxString& filename) { m_filename = filename; } + const wxString& GetFileName() const { return m_filename; } + +private: + wxString m_filename; +}; + +// under Windows the same file may contain several icons so we also store the +// index of the icon +#if defined(__WINDOWS__) + +class WXDLLIMPEXP_BASE wxIconLocation : public wxIconLocationBase +{ +public: + // ctor takes the name of the file where the icon is and the icons index in + // the file + wxEXPLICIT wxIconLocation(const wxString& file = wxEmptyString, int num = 0); + + // set/get the icon index + void SetIndex(int num) { m_index = num; } + int GetIndex() const { return m_index; } + +private: + int m_index; +}; + +inline +wxIconLocation::wxIconLocation(const wxString& file, int num) + : wxIconLocationBase(file) +{ + SetIndex(num); +} + +#else // !__WINDOWS__ + +// must be a class because we forward declare it as class +class WXDLLIMPEXP_BASE wxIconLocation : public wxIconLocationBase +{ +public: + wxEXPLICIT wxIconLocation(const wxString& filename = wxEmptyString) + : wxIconLocationBase(filename) { } +}; + +#endif // platform + +#endif // _WX_ICONLOC_H_ + diff --git a/wxmsw/include/wx-3.0/wx/imagbmp.h b/wxmsw/include/wx-3.0/wx/imagbmp.h new file mode 100644 index 00000000..262373a7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/imagbmp.h @@ -0,0 +1,159 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/imagbmp.h +// Purpose: wxImage BMP, ICO, CUR and ANI handlers +// Author: Robert Roebling, Chris Elliott +// Copyright: (c) Robert Roebling, Chris Elliott +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGBMP_H_ +#define _WX_IMAGBMP_H_ + +#include "wx/image.h" + +// defines for saving the BMP file in different formats, Bits Per Pixel +// USE: wximage.SetOption( wxIMAGE_OPTION_BMP_FORMAT, wxBMP_xBPP ); +#define wxIMAGE_OPTION_BMP_FORMAT wxString(wxT("wxBMP_FORMAT")) + +// These two options are filled in upon reading CUR file and can (should) be +// specified when saving a CUR file - they define the hotspot of the cursor: +#define wxIMAGE_OPTION_CUR_HOTSPOT_X wxT("HotSpotX") +#define wxIMAGE_OPTION_CUR_HOTSPOT_Y wxT("HotSpotY") + + +enum +{ + wxBMP_24BPP = 24, // default, do not need to set + //wxBMP_16BPP = 16, // wxQuantize can only do 236 colors? + wxBMP_8BPP = 8, // 8bpp, quantized colors + wxBMP_8BPP_GREY = 9, // 8bpp, rgb averaged to greys + wxBMP_8BPP_GRAY = wxBMP_8BPP_GREY, + wxBMP_8BPP_RED = 10, // 8bpp, red used as greyscale + wxBMP_8BPP_PALETTE = 11, // 8bpp, use the wxImage's palette + wxBMP_4BPP = 4, // 4bpp, quantized colors + wxBMP_1BPP = 1, // 1bpp, quantized "colors" + wxBMP_1BPP_BW = 2 // 1bpp, black & white from red +}; + +// ---------------------------------------------------------------------------- +// wxBMPHandler +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxBMPHandler : public wxImageHandler +{ +public: + wxBMPHandler() + { + m_name = wxT("Windows bitmap file"); + m_extension = wxT("bmp"); + m_type = wxBITMAP_TYPE_BMP; + m_mime = wxT("image/x-bmp"); + } + +#if wxUSE_STREAMS + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + +protected: + virtual bool DoCanRead( wxInputStream& stream ); + bool SaveDib(wxImage *image, wxOutputStream& stream, bool verbose, + bool IsBmp, bool IsMask); + bool DoLoadDib(wxImage *image, int width, int height, int bpp, int ncolors, + int comp, wxFileOffset bmpOffset, wxInputStream& stream, + bool verbose, bool IsBmp, bool hasPalette); + bool LoadDib(wxImage *image, wxInputStream& stream, bool verbose, bool IsBmp); +#endif // wxUSE_STREAMS + +private: + DECLARE_DYNAMIC_CLASS(wxBMPHandler) +}; + +#if wxUSE_ICO_CUR +// ---------------------------------------------------------------------------- +// wxICOHandler +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxICOHandler : public wxBMPHandler +{ +public: + wxICOHandler() + { + m_name = wxT("Windows icon file"); + m_extension = wxT("ico"); + m_type = wxBITMAP_TYPE_ICO; + m_mime = wxT("image/x-ico"); + } + +#if wxUSE_STREAMS + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool DoLoadFile( wxImage *image, wxInputStream& stream, bool verbose, int index ); + +protected: + virtual int DoGetImageCount( wxInputStream& stream ); + virtual bool DoCanRead( wxInputStream& stream ); +#endif // wxUSE_STREAMS + +private: + DECLARE_DYNAMIC_CLASS(wxICOHandler) +}; + + +// ---------------------------------------------------------------------------- +// wxCURHandler +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxCURHandler : public wxICOHandler +{ +public: + wxCURHandler() + { + m_name = wxT("Windows cursor file"); + m_extension = wxT("cur"); + m_type = wxBITMAP_TYPE_CUR; + m_mime = wxT("image/x-cur"); + } + + // VS: This handler's meat is implemented inside wxICOHandler (the two + // formats are almost identical), but we hide this fact at + // the API level, since it is a mere implementation detail. + +protected: +#if wxUSE_STREAMS + virtual bool DoCanRead( wxInputStream& stream ); +#endif // wxUSE_STREAMS + +private: + DECLARE_DYNAMIC_CLASS(wxCURHandler) +}; +// ---------------------------------------------------------------------------- +// wxANIHandler +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxANIHandler : public wxCURHandler +{ +public: + wxANIHandler() + { + m_name = wxT("Windows animated cursor file"); + m_extension = wxT("ani"); + m_type = wxBITMAP_TYPE_ANI; + m_mime = wxT("image/x-ani"); + } + + +#if wxUSE_STREAMS + virtual bool SaveFile( wxImage *WXUNUSED(image), wxOutputStream& WXUNUSED(stream), bool WXUNUSED(verbose=true) ){return false ;} + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + +protected: + virtual int DoGetImageCount( wxInputStream& stream ); + virtual bool DoCanRead( wxInputStream& stream ); +#endif // wxUSE_STREAMS + +private: + DECLARE_DYNAMIC_CLASS(wxANIHandler) +}; + +#endif // wxUSE_ICO_CUR +#endif // _WX_IMAGBMP_H_ diff --git a/wxmsw/include/wx-3.0/wx/image.h b/wxmsw/include/wx-3.0/wx/image.h new file mode 100644 index 00000000..3e7f39eb --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/image.h @@ -0,0 +1,651 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/image.h +// Purpose: wxImage class +// Author: Robert Roebling +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGE_H_ +#define _WX_IMAGE_H_ + +#include "wx/defs.h" + +#if wxUSE_IMAGE + +#include "wx/object.h" +#include "wx/string.h" +#include "wx/gdicmn.h" +#include "wx/hashmap.h" +#include "wx/arrstr.h" + +#if wxUSE_STREAMS +# include "wx/stream.h" +#endif + +// on some systems (Unixware 7.x) index is defined as a macro in the headers +// which breaks the compilation below +#undef index + +#define wxIMAGE_OPTION_QUALITY wxString(wxS("quality")) +#define wxIMAGE_OPTION_FILENAME wxString(wxS("FileName")) + +#define wxIMAGE_OPTION_RESOLUTION wxString(wxS("Resolution")) +#define wxIMAGE_OPTION_RESOLUTIONX wxString(wxS("ResolutionX")) +#define wxIMAGE_OPTION_RESOLUTIONY wxString(wxS("ResolutionY")) + +#define wxIMAGE_OPTION_RESOLUTIONUNIT wxString(wxS("ResolutionUnit")) + +#define wxIMAGE_OPTION_MAX_WIDTH wxString(wxS("MaxWidth")) +#define wxIMAGE_OPTION_MAX_HEIGHT wxString(wxS("MaxHeight")) + +#define wxIMAGE_OPTION_ORIGINAL_WIDTH wxString(wxS("OriginalWidth")) +#define wxIMAGE_OPTION_ORIGINAL_HEIGHT wxString(wxS("OriginalHeight")) + +// constants used with wxIMAGE_OPTION_RESOLUTIONUNIT +// +// NB: don't change these values, they correspond to libjpeg constants +enum wxImageResolution +{ + // Resolution not specified + wxIMAGE_RESOLUTION_NONE = 0, + + // Resolution specified in inches + wxIMAGE_RESOLUTION_INCHES = 1, + + // Resolution specified in centimeters + wxIMAGE_RESOLUTION_CM = 2 +}; + +// Constants for wxImage::Scale() for determining the level of quality +enum wxImageResizeQuality +{ + // different image resizing algorithms used by Scale() and Rescale() + wxIMAGE_QUALITY_NEAREST = 0, + wxIMAGE_QUALITY_BILINEAR = 1, + wxIMAGE_QUALITY_BICUBIC = 2, + wxIMAGE_QUALITY_BOX_AVERAGE = 3, + + // default quality is low (but fast) + wxIMAGE_QUALITY_NORMAL = wxIMAGE_QUALITY_NEAREST, + + // highest (but best) quality + wxIMAGE_QUALITY_HIGH = 4 +}; + +// alpha channel values: fully transparent, default threshold separating +// transparent pixels from opaque for a few functions dealing with alpha and +// fully opaque +const unsigned char wxIMAGE_ALPHA_TRANSPARENT = 0; +const unsigned char wxIMAGE_ALPHA_THRESHOLD = 0x80; +const unsigned char wxIMAGE_ALPHA_OPAQUE = 0xff; + +//----------------------------------------------------------------------------- +// classes +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxImageHandler; +class WXDLLIMPEXP_FWD_CORE wxImage; +class WXDLLIMPEXP_FWD_CORE wxPalette; + +//----------------------------------------------------------------------------- +// wxVariant support +//----------------------------------------------------------------------------- + +#if wxUSE_VARIANT +#include "wx/variant.h" +DECLARE_VARIANT_OBJECT_EXPORTED(wxImage,WXDLLIMPEXP_CORE) +#endif + +//----------------------------------------------------------------------------- +// wxImageHandler +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxImageHandler: public wxObject +{ +public: + wxImageHandler() + : m_name(wxEmptyString), m_extension(wxEmptyString), m_mime(), m_type(wxBITMAP_TYPE_INVALID) + { } + +#if wxUSE_STREAMS + // NOTE: LoadFile and SaveFile are not pure virtuals to allow derived classes + // to implement only one of the two + virtual bool LoadFile( wxImage *WXUNUSED(image), wxInputStream& WXUNUSED(stream), + bool WXUNUSED(verbose)=true, int WXUNUSED(index)=-1 ) + { return false; } + virtual bool SaveFile( wxImage *WXUNUSED(image), wxOutputStream& WXUNUSED(stream), + bool WXUNUSED(verbose)=true ) + { return false; } + + int GetImageCount( wxInputStream& stream ); + // save the stream position, call DoGetImageCount() and restore the position + + bool CanRead( wxInputStream& stream ) { return CallDoCanRead(stream); } + bool CanRead( const wxString& name ); +#endif // wxUSE_STREAMS + + void SetName(const wxString& name) { m_name = name; } + void SetExtension(const wxString& ext) { m_extension = ext; } + void SetAltExtensions(const wxArrayString& exts) { m_altExtensions = exts; } + void SetType(wxBitmapType type) { m_type = type; } + void SetMimeType(const wxString& type) { m_mime = type; } + const wxString& GetName() const { return m_name; } + const wxString& GetExtension() const { return m_extension; } + const wxArrayString& GetAltExtensions() const { return m_altExtensions; } + wxBitmapType GetType() const { return m_type; } + const wxString& GetMimeType() const { return m_mime; } + +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED( + void SetType(long type) { SetType((wxBitmapType)type); } + ) +#endif // WXWIN_COMPATIBILITY_2_8 + +protected: +#if wxUSE_STREAMS + // NOTE: this function is allowed to change the current stream position + // since GetImageCount() will take care of restoring it later + virtual int DoGetImageCount( wxInputStream& WXUNUSED(stream) ) + { return 1; } // default return value is 1 image + + // NOTE: this function is allowed to change the current stream position + // since CallDoCanRead() will take care of restoring it later + virtual bool DoCanRead( wxInputStream& stream ) = 0; + + // save the stream position, call DoCanRead() and restore the position + bool CallDoCanRead(wxInputStream& stream); +#endif // wxUSE_STREAMS + + // helper for the derived classes SaveFile() implementations: returns the + // values of x- and y-resolution options specified as the image options if + // any + static wxImageResolution + GetResolutionFromOptions(const wxImage& image, int *x, int *y); + + + wxString m_name; + wxString m_extension; + wxArrayString m_altExtensions; + wxString m_mime; + wxBitmapType m_type; + +private: + DECLARE_CLASS(wxImageHandler) +}; + +//----------------------------------------------------------------------------- +// wxImageHistogram +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxImageHistogramEntry +{ +public: + wxImageHistogramEntry() { index = value = 0; } + unsigned long index; + unsigned long value; +}; + +WX_DECLARE_EXPORTED_HASH_MAP(unsigned long, wxImageHistogramEntry, + wxIntegerHash, wxIntegerEqual, + wxImageHistogramBase); + +class WXDLLIMPEXP_CORE wxImageHistogram : public wxImageHistogramBase +{ +public: + wxImageHistogram() : wxImageHistogramBase(256) { } + + // get the key in the histogram for the given RGB values + static unsigned long MakeKey(unsigned char r, + unsigned char g, + unsigned char b) + { + return (r << 16) | (g << 8) | b; + } + + // find first colour that is not used in the image and has higher + // RGB values than RGB(startR, startG, startB) + // + // returns true and puts this colour in r, g, b (each of which may be NULL) + // on success or returns false if there are no more free colours + bool FindFirstUnusedColour(unsigned char *r, + unsigned char *g, + unsigned char *b, + unsigned char startR = 1, + unsigned char startG = 0, + unsigned char startB = 0 ) const; +}; + +//----------------------------------------------------------------------------- +// wxImage +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxImage: public wxObject +{ +public: + // red, green and blue are 8 bit unsigned integers in the range of 0..255 + // We use the identifier RGBValue instead of RGB, since RGB is #defined + class RGBValue + { + public: + RGBValue(unsigned char r=0, unsigned char g=0, unsigned char b=0) + : red(r), green(g), blue(b) {} + unsigned char red; + unsigned char green; + unsigned char blue; + }; + + // hue, saturation and value are doubles in the range 0.0..1.0 + class HSVValue + { + public: + HSVValue(double h=0.0, double s=0.0, double v=0.0) + : hue(h), saturation(s), value(v) {} + double hue; + double saturation; + double value; + }; + + wxImage() {} + wxImage( int width, int height, bool clear = true ) + { Create( width, height, clear ); } + wxImage( int width, int height, unsigned char* data, bool static_data = false ) + { Create( width, height, data, static_data ); } + wxImage( int width, int height, unsigned char* data, unsigned char* alpha, bool static_data = false ) + { Create( width, height, data, alpha, static_data ); } + + // ctor variants using wxSize: + wxImage( const wxSize& sz, bool clear = true ) + { Create( sz, clear ); } + wxImage( const wxSize& sz, unsigned char* data, bool static_data = false ) + { Create( sz, data, static_data ); } + wxImage( const wxSize& sz, unsigned char* data, unsigned char* alpha, bool static_data = false ) + { Create( sz, data, alpha, static_data ); } + + wxImage( const wxString& name, wxBitmapType type = wxBITMAP_TYPE_ANY, int index = -1 ) + { LoadFile( name, type, index ); } + wxImage( const wxString& name, const wxString& mimetype, int index = -1 ) + { LoadFile( name, mimetype, index ); } + wxImage( const char* const* xpmData ) + { Create(xpmData); } + +#if wxUSE_STREAMS + wxImage( wxInputStream& stream, wxBitmapType type = wxBITMAP_TYPE_ANY, int index = -1 ) + { LoadFile( stream, type, index ); } + wxImage( wxInputStream& stream, const wxString& mimetype, int index = -1 ) + { LoadFile( stream, mimetype, index ); } +#endif // wxUSE_STREAMS + + bool Create( const char* const* xpmData ); +#ifdef __BORLANDC__ + // needed for Borland 5.5 + wxImage( char** xpmData ) { Create(const_cast<const char* const*>(xpmData)); } + bool Create( char** xpmData ) { return Create(const_cast<const char* const*>(xpmData)); } +#endif + + bool Create( int width, int height, bool clear = true ); + bool Create( int width, int height, unsigned char* data, bool static_data = false ); + bool Create( int width, int height, unsigned char* data, unsigned char* alpha, bool static_data = false ); + + // Create() variants using wxSize: + bool Create( const wxSize& sz, bool clear = true ) + { return Create(sz.GetWidth(), sz.GetHeight(), clear); } + bool Create( const wxSize& sz, unsigned char* data, bool static_data = false ) + { return Create(sz.GetWidth(), sz.GetHeight(), data, static_data); } + bool Create( const wxSize& sz, unsigned char* data, unsigned char* alpha, bool static_data = false ) + { return Create(sz.GetWidth(), sz.GetHeight(), data, alpha, static_data); } + + void Destroy(); + + // initialize the image data with zeroes + void Clear(unsigned char value = 0); + + // creates an identical copy of the image (the = operator + // just raises the ref count) + wxImage Copy() const; + + // return the new image with size width*height + wxImage GetSubImage( const wxRect& rect) const; + + // Paste the image or part of this image into an image of the given size at the pos + // any newly exposed areas will be filled with the rgb colour + // by default if r = g = b = -1 then fill with this image's mask colour or find and + // set a suitable mask colour + wxImage Size( const wxSize& size, const wxPoint& pos, + int r = -1, int g = -1, int b = -1 ) const; + + // pastes image into this instance and takes care of + // the mask colour and out of bounds problems + void Paste( const wxImage &image, int x, int y ); + + // return the new image with size width*height + wxImage Scale( int width, int height, + wxImageResizeQuality quality = wxIMAGE_QUALITY_NORMAL ) const; + + // box averager and bicubic filters for up/down sampling + wxImage ResampleNearest(int width, int height) const; + wxImage ResampleBox(int width, int height) const; + wxImage ResampleBilinear(int width, int height) const; + wxImage ResampleBicubic(int width, int height) const; + + // blur the image according to the specified pixel radius + wxImage Blur(int radius) const; + wxImage BlurHorizontal(int radius) const; + wxImage BlurVertical(int radius) const; + + wxImage ShrinkBy( int xFactor , int yFactor ) const ; + + // rescales the image in place + wxImage& Rescale( int width, int height, + wxImageResizeQuality quality = wxIMAGE_QUALITY_NORMAL ) + { return *this = Scale(width, height, quality); } + + // resizes the image in place + wxImage& Resize( const wxSize& size, const wxPoint& pos, + int r = -1, int g = -1, int b = -1 ) { return *this = Size(size, pos, r, g, b); } + + // Rotates the image about the given point, 'angle' radians. + // Returns the rotated image, leaving this image intact. + wxImage Rotate(double angle, const wxPoint & centre_of_rotation, + bool interpolating = true, wxPoint * offset_after_rotation = NULL) const; + + wxImage Rotate90( bool clockwise = true ) const; + wxImage Rotate180() const; + wxImage Mirror( bool horizontally = true ) const; + + // replace one colour with another + void Replace( unsigned char r1, unsigned char g1, unsigned char b1, + unsigned char r2, unsigned char g2, unsigned char b2 ); + + // Convert to greyscale image. Uses the luminance component (Y) of the image. + // The luma value (YUV) is calculated using (R * weight_r) + (G * weight_g) + (B * weight_b), defaults to ITU-T BT.601 + wxImage ConvertToGreyscale(double weight_r, double weight_g, double weight_b) const; + wxImage ConvertToGreyscale(void) const; + + // convert to monochrome image (<r,g,b> will be replaced by white, + // everything else by black) + wxImage ConvertToMono( unsigned char r, unsigned char g, unsigned char b ) const; + + // Convert to disabled (dimmed) image. + wxImage ConvertToDisabled(unsigned char brightness = 255) const; + + // these routines are slow but safe + void SetRGB( int x, int y, unsigned char r, unsigned char g, unsigned char b ); + void SetRGB( const wxRect& rect, unsigned char r, unsigned char g, unsigned char b ); + unsigned char GetRed( int x, int y ) const; + unsigned char GetGreen( int x, int y ) const; + unsigned char GetBlue( int x, int y ) const; + + void SetAlpha(int x, int y, unsigned char alpha); + unsigned char GetAlpha(int x, int y) const; + + // find first colour that is not used in the image and has higher + // RGB values than <startR,startG,startB> + bool FindFirstUnusedColour( unsigned char *r, unsigned char *g, unsigned char *b, + unsigned char startR = 1, unsigned char startG = 0, + unsigned char startB = 0 ) const; + // Set image's mask to the area of 'mask' that has <r,g,b> colour + bool SetMaskFromImage(const wxImage & mask, + unsigned char mr, unsigned char mg, unsigned char mb); + + // converts image's alpha channel to mask (choosing mask colour + // automatically or using the specified colour for the mask), if it has + // any, does nothing otherwise: + bool ConvertAlphaToMask(unsigned char threshold = wxIMAGE_ALPHA_THRESHOLD); + bool ConvertAlphaToMask(unsigned char mr, unsigned char mg, unsigned char mb, + unsigned char threshold = wxIMAGE_ALPHA_THRESHOLD); + + + // This method converts an image where the original alpha + // information is only available as a shades of a colour + // (actually shades of grey) typically when you draw anti- + // aliased text into a bitmap. The DC drawinf routines + // draw grey values on the black background although they + // actually mean to draw white with differnt alpha values. + // This method reverses it, assuming a black (!) background + // and white text (actually only the red channel is read). + // The method will then fill up the whole image with the + // colour given. + bool ConvertColourToAlpha( unsigned char r, unsigned char g, unsigned char b ); + + static bool CanRead( const wxString& name ); + static int GetImageCount( const wxString& name, wxBitmapType type = wxBITMAP_TYPE_ANY ); + virtual bool LoadFile( const wxString& name, wxBitmapType type = wxBITMAP_TYPE_ANY, int index = -1 ); + virtual bool LoadFile( const wxString& name, const wxString& mimetype, int index = -1 ); + +#if wxUSE_STREAMS + static bool CanRead( wxInputStream& stream ); + static int GetImageCount( wxInputStream& stream, wxBitmapType type = wxBITMAP_TYPE_ANY ); + virtual bool LoadFile( wxInputStream& stream, wxBitmapType type = wxBITMAP_TYPE_ANY, int index = -1 ); + virtual bool LoadFile( wxInputStream& stream, const wxString& mimetype, int index = -1 ); +#endif + + virtual bool SaveFile( const wxString& name ) const; + virtual bool SaveFile( const wxString& name, wxBitmapType type ) const; + virtual bool SaveFile( const wxString& name, const wxString& mimetype ) const; + +#if wxUSE_STREAMS + virtual bool SaveFile( wxOutputStream& stream, wxBitmapType type ) const; + virtual bool SaveFile( wxOutputStream& stream, const wxString& mimetype ) const; +#endif + + bool Ok() const { return IsOk(); } + bool IsOk() const; + int GetWidth() const; + int GetHeight() const; + + wxSize GetSize() const + { return wxSize(GetWidth(), GetHeight()); } + + // Gets the type of image found by LoadFile or specified with SaveFile + wxBitmapType GetType() const; + + // Set the image type, this is normally only called if the image is being + // created from data in the given format but not using LoadFile() (e.g. + // wxGIFDecoder uses this) + void SetType(wxBitmapType type); + + // these functions provide fastest access to wxImage data but should be + // used carefully as no checks are done + unsigned char *GetData() const; + void SetData( unsigned char *data, bool static_data=false ); + void SetData( unsigned char *data, int new_width, int new_height, bool static_data=false ); + + unsigned char *GetAlpha() const; // may return NULL! + bool HasAlpha() const { return GetAlpha() != NULL; } + void SetAlpha(unsigned char *alpha = NULL, bool static_data=false); + void InitAlpha(); + void ClearAlpha(); + + // return true if this pixel is masked or has alpha less than specified + // threshold + bool IsTransparent(int x, int y, + unsigned char threshold = wxIMAGE_ALPHA_THRESHOLD) const; + + // Mask functions + void SetMaskColour( unsigned char r, unsigned char g, unsigned char b ); + // Get the current mask colour or find a suitable colour + // returns true if using current mask colour + bool GetOrFindMaskColour( unsigned char *r, unsigned char *g, unsigned char *b ) const; + unsigned char GetMaskRed() const; + unsigned char GetMaskGreen() const; + unsigned char GetMaskBlue() const; + void SetMask( bool mask = true ); + bool HasMask() const; + +#if wxUSE_PALETTE + // Palette functions + bool HasPalette() const; + const wxPalette& GetPalette() const; + void SetPalette(const wxPalette& palette); +#endif // wxUSE_PALETTE + + // Option functions (arbitrary name/value mapping) + void SetOption(const wxString& name, const wxString& value); + void SetOption(const wxString& name, int value); + wxString GetOption(const wxString& name) const; + int GetOptionInt(const wxString& name) const; + bool HasOption(const wxString& name) const; + + unsigned long CountColours( unsigned long stopafter = (unsigned long) -1 ) const; + + // Computes the histogram of the image and fills a hash table, indexed + // with integer keys built as 0xRRGGBB, containing wxImageHistogramEntry + // objects. Each of them contains an 'index' (useful to build a palette + // with the image colours) and a 'value', which is the number of pixels + // in the image with that colour. + // Returned value: # of entries in the histogram + unsigned long ComputeHistogram( wxImageHistogram &h ) const; + + // Rotates the hue of each pixel of the image. angle is a double in the range + // -1.0..1.0 where -1.0 is -360 degrees and 1.0 is 360 degrees + void RotateHue(double angle); + + static wxList& GetHandlers() { return sm_handlers; } + static void AddHandler( wxImageHandler *handler ); + static void InsertHandler( wxImageHandler *handler ); + static bool RemoveHandler( const wxString& name ); + static wxImageHandler *FindHandler( const wxString& name ); + static wxImageHandler *FindHandler( const wxString& extension, wxBitmapType imageType ); + static wxImageHandler *FindHandler( wxBitmapType imageType ); + + static wxImageHandler *FindHandlerMime( const wxString& mimetype ); + + static wxString GetImageExtWildcard(); + + static void CleanUpHandlers(); + static void InitStandardHandlers(); + + static HSVValue RGBtoHSV(const RGBValue& rgb); + static RGBValue HSVtoRGB(const HSVValue& hsv); + +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED_CONSTRUCTOR( + wxImage(const wxString& name, long type, int index = -1) + { + LoadFile(name, (wxBitmapType)type, index); + } + ) + +#if wxUSE_STREAMS + wxDEPRECATED_CONSTRUCTOR( + wxImage(wxInputStream& stream, long type, int index = -1) + { + LoadFile(stream, (wxBitmapType)type, index); + } + ) + + wxDEPRECATED( + bool LoadFile(wxInputStream& stream, long type, int index = -1) + { + return LoadFile(stream, (wxBitmapType)type, index); + } + ) + + wxDEPRECATED( + bool SaveFile(wxOutputStream& stream, long type) const + { + return SaveFile(stream, (wxBitmapType)type); + } + ) +#endif // wxUSE_STREAMS + + wxDEPRECATED( + bool LoadFile(const wxString& name, long type, int index = -1) + { + return LoadFile(name, (wxBitmapType)type, index); + } + ) + + wxDEPRECATED( + bool SaveFile(const wxString& name, long type) const + { + return SaveFile(name, (wxBitmapType)type); + } + ) + + static wxDEPRECATED( + wxImageHandler *FindHandler(const wxString& ext, long type) + { + return FindHandler(ext, (wxBitmapType)type); + } + ) + + static wxDEPRECATED( + wxImageHandler *FindHandler(long imageType) + { + return FindHandler((wxBitmapType)imageType); + } + ) +#endif // WXWIN_COMPATIBILITY_2_8 + +protected: + static wxList sm_handlers; + + // return the index of the point with the given coordinates or -1 if the + // image is invalid of the coordinates are out of range + // + // note that index must be multiplied by 3 when using it with RGB array + long XYToIndex(int x, int y) const; + + virtual wxObjectRefData* CreateRefData() const; + virtual wxObjectRefData* CloneRefData(const wxObjectRefData* data) const; + +private: + friend class WXDLLIMPEXP_FWD_CORE wxImageHandler; + + // Possible values for MakeEmptyClone() flags. + enum + { + // Create an image with the same orientation as this one. This is the + // default and only exists for symmetry with SwapOrientation. + Clone_SameOrientation = 0, + + // Create an image with the same height as this image width and the + // same width as this image height. + Clone_SwapOrientation = 1 + }; + + // Returns a new blank image with the same dimensions (or with width and + // height swapped if Clone_SwapOrientation flag is given), alpha, and mask + // as this image itself. This is used by several functions creating + // modified versions of this image. + wxImage MakeEmptyClone(int flags = Clone_SameOrientation) const; + +#if wxUSE_STREAMS + // read the image from the specified stream updating image type if + // successful + bool DoLoad(wxImageHandler& handler, wxInputStream& stream, int index); + + // write the image to the specified stream and also update the image type + // if successful + bool DoSave(wxImageHandler& handler, wxOutputStream& stream) const; +#endif // wxUSE_STREAMS + + DECLARE_DYNAMIC_CLASS(wxImage) +}; + + +extern void WXDLLIMPEXP_CORE wxInitAllImageHandlers(); + +extern WXDLLIMPEXP_DATA_CORE(wxImage) wxNullImage; + +//----------------------------------------------------------------------------- +// wxImage handlers +//----------------------------------------------------------------------------- + +#include "wx/imagbmp.h" +#include "wx/imagpng.h" +#include "wx/imaggif.h" +#include "wx/imagpcx.h" +#include "wx/imagjpeg.h" +#include "wx/imagtga.h" +#include "wx/imagtiff.h" +#include "wx/imagpnm.h" +#include "wx/imagxpm.h" +#include "wx/imagiff.h" + +#endif // wxUSE_IMAGE + +#endif + // _WX_IMAGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/imaggif.h b/wxmsw/include/wx-3.0/wx/imaggif.h new file mode 100644 index 00000000..1d76a632 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/imaggif.h @@ -0,0 +1,93 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/imaggif.h +// Purpose: wxImage GIF handler +// Author: Vaclav Slavik, Guillermo Rodriguez Garcia, Gershon Elber, Troels K +// Copyright: (c) 1999-2011 Vaclav Slavik, Guillermo Rodriguez Garcia, Gershon Elber, Troels K +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGGIF_H_ +#define _WX_IMAGGIF_H_ + +#include "wx/image.h" + + +//----------------------------------------------------------------------------- +// wxGIFHandler +//----------------------------------------------------------------------------- + +#if wxUSE_GIF + +#define wxIMAGE_OPTION_GIF_COMMENT wxT("GifComment") + +struct wxRGB; +struct GifHashTableType; +class WXDLLIMPEXP_FWD_CORE wxImageArray; // anidecod.h + +class WXDLLIMPEXP_CORE wxGIFHandler : public wxImageHandler +{ +public: + inline wxGIFHandler() + { + m_name = wxT("GIF file"); + m_extension = wxT("gif"); + m_type = wxBITMAP_TYPE_GIF; + m_mime = wxT("image/gif"); + m_hashTable = NULL; + } + +#if wxUSE_STREAMS + virtual bool LoadFile(wxImage *image, wxInputStream& stream, + bool verbose = true, int index = -1); + virtual bool SaveFile(wxImage *image, wxOutputStream& stream, + bool verbose=true); + + // Save animated gif + bool SaveAnimation(const wxImageArray& images, wxOutputStream *stream, + bool verbose = true, int delayMilliSecs = 1000); + +protected: + virtual int DoGetImageCount(wxInputStream& stream); + virtual bool DoCanRead(wxInputStream& stream); + + bool DoSaveFile(const wxImage&, wxOutputStream *, bool verbose, + bool first, int delayMilliSecs, bool loop, + const wxRGB *pal, int palCount, + int mask_index); +#endif // wxUSE_STREAMS +protected: + + // Declarations for saving + + unsigned long m_crntShiftDWord; /* For bytes decomposition into codes. */ + int m_pixelCount; + struct GifHashTableType *m_hashTable; + wxInt16 + m_EOFCode, /* The EOF LZ code. */ + m_clearCode, /* The CLEAR LZ code. */ + m_runningCode, /* The next code algorithm can generate. */ + m_runningBits, /* The number of bits required to represent RunningCode. */ + m_maxCode1, /* 1 bigger than max. possible code, in RunningBits bits. */ + m_crntCode, /* Current algorithm code. */ + m_crntShiftState; /* Number of bits in CrntShiftDWord. */ + wxUint8 m_LZBuf[256]; /* Compressed input is buffered here. */ + + bool InitHashTable(); + void ClearHashTable(); + void InsertHashTable(unsigned long key, int code); + int ExistsHashTable(unsigned long key); + +#if wxUSE_STREAMS + bool CompressOutput(wxOutputStream *, int code); + bool SetupCompress(wxOutputStream *, int bpp); + bool CompressLine(wxOutputStream *, const wxUint8 *line, int lineLen); +#endif + +private: + DECLARE_DYNAMIC_CLASS(wxGIFHandler) +}; + +#endif // wxUSE_GIF + +#endif // _WX_IMAGGIF_H_ + diff --git a/wxmsw/include/wx-3.0/wx/imagiff.h b/wxmsw/include/wx-3.0/wx/imagiff.h new file mode 100644 index 00000000..f7307ba5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/imagiff.h @@ -0,0 +1,43 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/imagiff.h +// Purpose: wxImage handler for Amiga IFF images +// Author: Steffen Gutmann +// Copyright: (c) Steffen Gutmann, 2002 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGE_IFF_H_ +#define _WX_IMAGE_IFF_H_ + +#include "wx/image.h" + +//----------------------------------------------------------------------------- +// wxIFFHandler +//----------------------------------------------------------------------------- + +#if wxUSE_IMAGE && wxUSE_IFF + +class WXDLLIMPEXP_CORE wxIFFHandler : public wxImageHandler +{ +public: + wxIFFHandler() + { + m_name = wxT("IFF file"); + m_extension = wxT("iff"); + m_type = wxBITMAP_TYPE_IFF; + m_mime = wxT("image/x-iff"); + } + +#if wxUSE_STREAMS + virtual bool LoadFile(wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1); + virtual bool SaveFile(wxImage *image, wxOutputStream& stream, bool verbose=true); +protected: + virtual bool DoCanRead(wxInputStream& stream); +#endif + + DECLARE_DYNAMIC_CLASS(wxIFFHandler) +}; + +#endif // wxUSE_IMAGE && wxUSE_IFF + +#endif // _WX_IMAGE_IFF_H_ diff --git a/wxmsw/include/wx-3.0/wx/imagjpeg.h b/wxmsw/include/wx-3.0/wx/imagjpeg.h new file mode 100644 index 00000000..53f6e061 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/imagjpeg.h @@ -0,0 +1,52 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/imagjpeg.h +// Purpose: wxImage JPEG handler +// Author: Vaclav Slavik +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGJPEG_H_ +#define _WX_IMAGJPEG_H_ + +#include "wx/defs.h" + +//----------------------------------------------------------------------------- +// wxJPEGHandler +//----------------------------------------------------------------------------- + +#if wxUSE_LIBJPEG + +#include "wx/image.h" +#include "wx/versioninfo.h" + +class WXDLLIMPEXP_CORE wxJPEGHandler: public wxImageHandler +{ +public: + inline wxJPEGHandler() + { + m_name = wxT("JPEG file"); + m_extension = wxT("jpg"); + m_altExtensions.Add(wxT("jpeg")); + m_altExtensions.Add(wxT("jpe")); + m_type = wxBITMAP_TYPE_JPEG; + m_mime = wxT("image/jpeg"); + } + + static wxVersionInfo GetLibraryVersionInfo(); + +#if wxUSE_STREAMS + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); +protected: + virtual bool DoCanRead( wxInputStream& stream ); +#endif + +private: + DECLARE_DYNAMIC_CLASS(wxJPEGHandler) +}; + +#endif // wxUSE_LIBJPEG + +#endif // _WX_IMAGJPEG_H_ + diff --git a/wxmsw/include/wx-3.0/wx/imaglist.h b/wxmsw/include/wx-3.0/wx/imaglist.h new file mode 100644 index 00000000..72255ac7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/imaglist.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/imaglist.h +// Purpose: wxImageList base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGLIST_H_BASE_ +#define _WX_IMAGLIST_H_BASE_ + +#include "wx/defs.h" + +/* + * wxImageList is used for wxListCtrl, wxTreeCtrl. These controls refer to + * images for their items by an index into an image list. + * A wxImageList is capable of creating images with optional masks from + * a variety of sources - a single bitmap plus a colour to indicate the mask, + * two bitmaps, or an icon. + * + * Image lists can also create and draw images used for drag and drop functionality. + * This is not yet implemented in wxImageList. We need to discuss a generic API + * for doing drag and drop and see whether it ties in with the Win95 view of it. + * See below for candidate functions and an explanation of how they might be + * used. + */ + +// Flag values for Set/GetImageList +enum +{ + wxIMAGE_LIST_NORMAL, // Normal icons + wxIMAGE_LIST_SMALL, // Small icons + wxIMAGE_LIST_STATE // State icons: unimplemented (see WIN32 documentation) +}; + +// Flags for Draw +#define wxIMAGELIST_DRAW_NORMAL 0x0001 +#define wxIMAGELIST_DRAW_TRANSPARENT 0x0002 +#define wxIMAGELIST_DRAW_SELECTED 0x0004 +#define wxIMAGELIST_DRAW_FOCUSED 0x0008 + +#if defined(__WXMSW__) || defined(__WXMAC__) + #define wxHAS_NATIVE_IMAGELIST +#endif + +#if !defined(wxHAS_NATIVE_IMAGELIST) + #include "wx/generic/imaglist.h" +#elif defined(__WXMSW__) + #include "wx/msw/imaglist.h" +#elif defined(__WXMAC__) + #include "wx/osx/imaglist.h" +#endif + +#endif // _WX_IMAGLIST_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/imagpcx.h b/wxmsw/include/wx-3.0/wx/imagpcx.h new file mode 100644 index 00000000..cc9d54fa --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/imagpcx.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/imagpcx.h +// Purpose: wxImage PCX handler +// Author: Guillermo Rodriguez Garcia <guille@iies.es> +// Copyright: (c) 1999 Guillermo Rodriguez Garcia +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGPCX_H_ +#define _WX_IMAGPCX_H_ + +#include "wx/image.h" + + +//----------------------------------------------------------------------------- +// wxPCXHandler +//----------------------------------------------------------------------------- + +#if wxUSE_PCX +class WXDLLIMPEXP_CORE wxPCXHandler : public wxImageHandler +{ +public: + inline wxPCXHandler() + { + m_name = wxT("PCX file"); + m_extension = wxT("pcx"); + m_type = wxBITMAP_TYPE_PCX; + m_mime = wxT("image/pcx"); + } + +#if wxUSE_STREAMS + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); +protected: + virtual bool DoCanRead( wxInputStream& stream ); +#endif // wxUSE_STREAMS + +private: + DECLARE_DYNAMIC_CLASS(wxPCXHandler) +}; +#endif // wxUSE_PCX + + +#endif + // _WX_IMAGPCX_H_ + diff --git a/wxmsw/include/wx-3.0/wx/imagpng.h b/wxmsw/include/wx-3.0/wx/imagpng.h new file mode 100644 index 00000000..55adcd5f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/imagpng.h @@ -0,0 +1,68 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/imagpng.h +// Purpose: wxImage PNG handler +// Author: Robert Roebling +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGPNG_H_ +#define _WX_IMAGPNG_H_ + +#include "wx/defs.h" + +//----------------------------------------------------------------------------- +// wxPNGHandler +//----------------------------------------------------------------------------- + +#if wxUSE_LIBPNG + +#include "wx/image.h" +#include "wx/versioninfo.h" + +#define wxIMAGE_OPTION_PNG_FORMAT wxT("PngFormat") +#define wxIMAGE_OPTION_PNG_BITDEPTH wxT("PngBitDepth") +#define wxIMAGE_OPTION_PNG_FILTER wxT("PngF") +#define wxIMAGE_OPTION_PNG_COMPRESSION_LEVEL wxT("PngZL") +#define wxIMAGE_OPTION_PNG_COMPRESSION_MEM_LEVEL wxT("PngZM") +#define wxIMAGE_OPTION_PNG_COMPRESSION_STRATEGY wxT("PngZS") +#define wxIMAGE_OPTION_PNG_COMPRESSION_BUFFER_SIZE wxT("PngZB") + +enum +{ + wxPNG_TYPE_COLOUR = 0, + wxPNG_TYPE_GREY = 2, + wxPNG_TYPE_GREY_RED = 3, + wxPNG_TYPE_PALETTE = 4 +}; + +class WXDLLIMPEXP_CORE wxPNGHandler: public wxImageHandler +{ +public: + inline wxPNGHandler() + { + m_name = wxT("PNG file"); + m_extension = wxT("png"); + m_type = wxBITMAP_TYPE_PNG; + m_mime = wxT("image/png"); + } + + static wxVersionInfo GetLibraryVersionInfo(); + +#if wxUSE_STREAMS + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); +protected: + virtual bool DoCanRead( wxInputStream& stream ); +#endif + +private: + DECLARE_DYNAMIC_CLASS(wxPNGHandler) +}; + +#endif + // wxUSE_LIBPNG + +#endif + // _WX_IMAGPNG_H_ + diff --git a/wxmsw/include/wx-3.0/wx/imagpnm.h b/wxmsw/include/wx-3.0/wx/imagpnm.h new file mode 100644 index 00000000..aab7c76f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/imagpnm.h @@ -0,0 +1,48 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/imagpnm.h +// Purpose: wxImage PNM handler +// Author: Sylvain Bougnoux +// Copyright: (c) Sylvain Bougnoux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGPNM_H_ +#define _WX_IMAGPNM_H_ + +#include "wx/image.h" + +//----------------------------------------------------------------------------- +// wxPNMHandler +//----------------------------------------------------------------------------- + +#if wxUSE_PNM +class WXDLLIMPEXP_CORE wxPNMHandler : public wxImageHandler +{ +public: + inline wxPNMHandler() + { + m_name = wxT("PNM file"); + m_extension = wxT("pnm"); + m_altExtensions.Add(wxT("ppm")); + m_altExtensions.Add(wxT("pgm")); + m_altExtensions.Add(wxT("pbm")); + m_type = wxBITMAP_TYPE_PNM; + m_mime = wxT("image/pnm"); + } + +#if wxUSE_STREAMS + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); +protected: + virtual bool DoCanRead( wxInputStream& stream ); +#endif + +private: + DECLARE_DYNAMIC_CLASS(wxPNMHandler) +}; +#endif + + +#endif + // _WX_IMAGPNM_H_ + diff --git a/wxmsw/include/wx-3.0/wx/imagtga.h b/wxmsw/include/wx-3.0/wx/imagtga.h new file mode 100644 index 00000000..d1108378 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/imagtga.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/imagtga.h +// Purpose: wxImage TGA handler +// Author: Seth Jackson +// Copyright: (c) 2005 Seth Jackson +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGTGA_H_ +#define _WX_IMAGTGA_H_ + +#include "wx/image.h" + +//----------------------------------------------------------------------------- +// wxTGAHandler +//----------------------------------------------------------------------------- + +#if wxUSE_TGA + +class WXDLLIMPEXP_CORE wxTGAHandler : public wxImageHandler +{ +public: + wxTGAHandler() + { + m_name = wxT("TGA file"); + m_extension = wxT("tga"); + m_altExtensions.Add(wxT("tpic")); + m_type = wxBITMAP_TYPE_TGA; + m_mime = wxT("image/tga"); + } + +#if wxUSE_STREAMS + virtual bool LoadFile(wxImage* image, wxInputStream& stream, + bool verbose = true, int index = -1); + virtual bool SaveFile(wxImage* image, wxOutputStream& stream, + bool verbose = true); +protected: + virtual bool DoCanRead(wxInputStream& stream); +#endif // wxUSE_STREAMS + + DECLARE_DYNAMIC_CLASS(wxTGAHandler) +}; + +#endif // wxUSE_TGA + +#endif // _WX_IMAGTGA_H_ diff --git a/wxmsw/include/wx-3.0/wx/imagtiff.h b/wxmsw/include/wx-3.0/wx/imagtiff.h new file mode 100644 index 00000000..9182e671 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/imagtiff.h @@ -0,0 +1,59 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/imagtiff.h +// Purpose: wxImage TIFF handler +// Author: Robert Roebling +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGTIFF_H_ +#define _WX_IMAGTIFF_H_ + +#include "wx/defs.h" + +//----------------------------------------------------------------------------- +// wxTIFFHandler +//----------------------------------------------------------------------------- + +#if wxUSE_LIBTIFF + +#include "wx/image.h" +#include "wx/versioninfo.h" + +// defines for wxImage::SetOption +#define wxIMAGE_OPTION_TIFF_BITSPERSAMPLE wxString(wxT("BitsPerSample")) +#define wxIMAGE_OPTION_TIFF_SAMPLESPERPIXEL wxString(wxT("SamplesPerPixel")) +#define wxIMAGE_OPTION_TIFF_COMPRESSION wxString(wxT("Compression")) +#define wxIMAGE_OPTION_TIFF_PHOTOMETRIC wxString(wxT("Photometric")) +#define wxIMAGE_OPTION_TIFF_IMAGEDESCRIPTOR wxString(wxT("ImageDescriptor")) + +// for backwards compatibility +#define wxIMAGE_OPTION_BITSPERSAMPLE wxIMAGE_OPTION_TIFF_BITSPERSAMPLE +#define wxIMAGE_OPTION_SAMPLESPERPIXEL wxIMAGE_OPTION_TIFF_SAMPLESPERPIXEL +#define wxIMAGE_OPTION_COMPRESSION wxIMAGE_OPTION_TIFF_COMPRESSION +#define wxIMAGE_OPTION_IMAGEDESCRIPTOR wxIMAGE_OPTION_TIFF_IMAGEDESCRIPTOR + +class WXDLLIMPEXP_CORE wxTIFFHandler: public wxImageHandler +{ +public: + wxTIFFHandler(); + + static wxVersionInfo GetLibraryVersionInfo(); + +#if wxUSE_STREAMS + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); + +protected: + virtual int DoGetImageCount( wxInputStream& stream ); + virtual bool DoCanRead( wxInputStream& stream ); +#endif + +private: + DECLARE_DYNAMIC_CLASS(wxTIFFHandler) +}; + +#endif // wxUSE_LIBTIFF + +#endif // _WX_IMAGTIFF_H_ + diff --git a/wxmsw/include/wx-3.0/wx/imagxpm.h b/wxmsw/include/wx-3.0/wx/imagxpm.h new file mode 100644 index 00000000..16477b2d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/imagxpm.h @@ -0,0 +1,44 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/imagxpm.h +// Purpose: wxImage XPM handler +// Author: Vaclav Slavik +// Copyright: (c) 2001 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGXPM_H_ +#define _WX_IMAGXPM_H_ + +#include "wx/image.h" + +#if wxUSE_XPM + +//----------------------------------------------------------------------------- +// wxXPMHandler +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxXPMHandler : public wxImageHandler +{ +public: + inline wxXPMHandler() + { + m_name = wxT("XPM file"); + m_extension = wxT("xpm"); + m_type = wxBITMAP_TYPE_XPM; + m_mime = wxT("image/xpm"); + } + +#if wxUSE_STREAMS + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); +protected: + virtual bool DoCanRead( wxInputStream& stream ); +#endif + +private: + DECLARE_DYNAMIC_CLASS(wxXPMHandler) +}; + +#endif // wxUSE_XPM + +#endif // _WX_IMAGXPM_H_ diff --git a/wxmsw/include/wx-3.0/wx/infobar.h b/wxmsw/include/wx-3.0/wx/infobar.h new file mode 100644 index 00000000..be390a85 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/infobar.h @@ -0,0 +1,67 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/infobar.h +// Purpose: declaration of wxInfoBarBase defining common API of wxInfoBar +// Author: Vadim Zeitlin +// Created: 2009-07-28 +// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_INFOBAR_H_ +#define _WX_INFOBAR_H_ + +#include "wx/defs.h" + +#if wxUSE_INFOBAR + +#include "wx/control.h" + +// ---------------------------------------------------------------------------- +// wxInfoBar shows non-critical but important information to the user +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxInfoBarBase : public wxControl +{ +public: + // real ctors are provided by the derived classes, just notice that unlike + // most of the other windows, info bar is created hidden and must be + // explicitly shown when it is needed (this is done because it is supposed + // to be shown only intermittently and hiding it after creating it from the + // user code would result in flicker) + wxInfoBarBase() { } + + + // show the info bar with the given message and optionally an icon + virtual void ShowMessage(const wxString& msg, + int flags = wxICON_INFORMATION) = 0; + + // hide the info bar + virtual void Dismiss() = 0; + + // add an extra button to the bar, near the message (replacing the default + // close button which is only shown if no extra buttons are used) + virtual void AddButton(wxWindowID btnid, + const wxString& label = wxString()) = 0; + + // remove a button previously added by AddButton() + virtual void RemoveButton(wxWindowID btnid) = 0; + +private: + wxDECLARE_NO_COPY_CLASS(wxInfoBarBase); +}; + +// currently only GTK+ has a native implementation +#if defined(__WXGTK218__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/infobar.h" + #define wxHAS_NATIVE_INFOBAR +#endif // wxGTK2 + +// if the generic version is the only one we have, use it +#ifndef wxHAS_NATIVE_INFOBAR + #include "wx/generic/infobar.h" + #define wxInfoBar wxInfoBarGeneric +#endif + +#endif // wxUSE_INFOBAR + +#endif // _WX_INFOBAR_H_ diff --git a/wxmsw/include/wx-3.0/wx/init.h b/wxmsw/include/wx-3.0/wx/init.h new file mode 100644 index 00000000..6ce8e828 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/init.h @@ -0,0 +1,116 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/init.h +// Purpose: wxWidgets initialization and finalization functions +// Author: Vadim Zeitlin +// Modified by: +// Created: 29.06.2003 +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_INIT_H_ +#define _WX_INIT_H_ + +#include "wx/defs.h" +#include "wx/chartype.h" + +// ---------------------------------------------------------------------------- +// wxEntry helper functions which allow to have more fine grained control +// ---------------------------------------------------------------------------- + +// do common initialization, return true if ok (in this case wxEntryCleanup +// must be called later), otherwise the program can't use wxWidgets at all +// +// this function also creates wxTheApp as a side effect, if IMPLEMENT_APP +// hadn't been used a dummy default application object is created +// +// note that the parameters may be modified, this is why we pass them by +// reference! +extern bool WXDLLIMPEXP_BASE wxEntryStart(int& argc, wxChar **argv); + +// free the resources allocated by the library in wxEntryStart() and shut it +// down (wxEntryStart() may be called again afterwards if necessary) +extern void WXDLLIMPEXP_BASE wxEntryCleanup(); + + +// ---------------------------------------------------------------------------- +// wxEntry: this function initializes the library, runs the main event loop +// and cleans it up +// ---------------------------------------------------------------------------- + +// note that other, platform-specific, overloads of wxEntry may exist as well +// but this one always exists under all platforms +// +// returns the program exit code +extern int WXDLLIMPEXP_BASE wxEntry(int& argc, wxChar **argv); + +// we overload wxEntry[Start]() to take "char **" pointers too +#if wxUSE_UNICODE + +extern bool WXDLLIMPEXP_BASE wxEntryStart(int& argc, char **argv); +extern int WXDLLIMPEXP_BASE wxEntry(int& argc, char **argv); + +#endif// wxUSE_UNICODE + +// Under Windows we define additional wxEntry() overloads with signature +// compatible with WinMain() and not the traditional main(). +#if wxUSE_GUI && defined(__WINDOWS__) + #include "wx/msw/init.h" +#endif + +// ---------------------------------------------------------------------------- +// Using the library without (explicit) application object: you may avoid using +// wxDECLARE_APP and wxIMPLEMENT_APP macros and call the functions below instead at +// the program startup and termination +// ---------------------------------------------------------------------------- + +// initialize the library (may be called as many times as needed, but each +// call to wxInitialize() must be matched by wxUninitialize()) +extern bool WXDLLIMPEXP_BASE wxInitialize(); +extern bool WXDLLIMPEXP_BASE wxInitialize(int argc, wxChar **argv); +#if wxUSE_UNICODE +extern bool WXDLLIMPEXP_BASE wxInitialize(int argc, char **argv); +#endif + +// clean up -- the library can't be used any more after the last call to +// wxUninitialize() +extern void WXDLLIMPEXP_BASE wxUninitialize(); + +// create an object of this class on stack to initialize/cleanup the library +// automatically +class WXDLLIMPEXP_BASE wxInitializer +{ +public: + // initialize the library + wxInitializer() + { + m_ok = wxInitialize(); + } + + wxInitializer(int argc, wxChar **argv) + { + m_ok = wxInitialize(argc, argv); + } + +#if wxUSE_UNICODE + wxInitializer(int argc, char **argv) + { + m_ok = wxInitialize(argc, argv); + } +#endif // wxUSE_UNICODE + + // has the initialization been successful? (explicit test) + bool IsOk() const { return m_ok; } + + // has the initialization been successful? (implicit test) + operator bool() const { return m_ok; } + + // dtor only does clean up if we initialized the library properly + ~wxInitializer() { if ( m_ok ) wxUninitialize(); } + +private: + bool m_ok; +}; + +#endif // _WX_INIT_H_ + diff --git a/wxmsw/include/wx-3.0/wx/intl.h b/wxmsw/include/wx-3.0/wx/intl.h new file mode 100644 index 00000000..fea4d2d6 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/intl.h @@ -0,0 +1,360 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/intl.h +// Purpose: Internationalization and localisation for wxWidgets +// Author: Vadim Zeitlin +// Modified by: Michael N. Filippov <michael@idisys.iae.nsk.su> +// (2003/09/30 - plural forms support) +// Created: 29/01/98 +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_INTL_H_ +#define _WX_INTL_H_ + +#include "wx/defs.h" +#include "wx/string.h" +#include "wx/translation.h" + +// Make wxLayoutDirection enum available without need for wxUSE_INTL so wxWindow, wxApp +// and other classes are not distrubed by wxUSE_INTL + +enum wxLayoutDirection +{ + wxLayout_Default, + wxLayout_LeftToRight, + wxLayout_RightToLeft +}; + +#if wxUSE_INTL + +#include "wx/fontenc.h" +#include "wx/language.h" + +// ============================================================================ +// global decls +// ============================================================================ + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// ---------------------------------------------------------------------------- +// forward decls +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxLocale; +class WXDLLIMPEXP_FWD_BASE wxLanguageInfoArray; + +// ============================================================================ +// locale support +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxLanguageInfo: encapsulates wxLanguage to OS native lang.desc. +// translation information +// ---------------------------------------------------------------------------- + +struct WXDLLIMPEXP_BASE wxLanguageInfo +{ + int Language; // wxLanguage id + wxString CanonicalName; // Canonical name, e.g. fr_FR +#ifdef __WINDOWS__ + wxUint32 WinLang, // Win32 language identifiers + WinSublang; +#endif // __WINDOWS__ + wxString Description; // human-readable name of the language + wxLayoutDirection LayoutDirection; + +#ifdef __WINDOWS__ + // return the LCID corresponding to this language + wxUint32 GetLCID() const; +#endif // __WINDOWS__ + + // return the locale name corresponding to this language usable with + // setlocale() on the current system + wxString GetLocaleName() const; +}; + +// for Unix systems GetLocaleName() is trivial so implement it inline here, for +// MSW it's implemented in intl.cpp +#ifndef __WINDOWS__ +inline wxString wxLanguageInfo::GetLocaleName() const { return CanonicalName; } +#endif // !__WINDOWS__ + + +// ---------------------------------------------------------------------------- +// wxLocaleCategory: the category of locale settings +// ---------------------------------------------------------------------------- + +enum wxLocaleCategory +{ + // (any) numbers + wxLOCALE_CAT_NUMBER, + + // date/time + wxLOCALE_CAT_DATE, + + // monetary value + wxLOCALE_CAT_MONEY, + + // default category for wxLocaleInfo values which only apply to a single + // category (e.g. wxLOCALE_SHORT_DATE_FMT) + wxLOCALE_CAT_DEFAULT, + + wxLOCALE_CAT_MAX +}; + +// ---------------------------------------------------------------------------- +// wxLocaleInfo: the items understood by wxLocale::GetInfo() +// ---------------------------------------------------------------------------- + +enum wxLocaleInfo +{ + // the thousands separator (for wxLOCALE_CAT_NUMBER or MONEY) + wxLOCALE_THOUSANDS_SEP, + + // the character used as decimal point (for wxLOCALE_CAT_NUMBER or MONEY) + wxLOCALE_DECIMAL_POINT, + + // the stftime()-formats used for short/long date and time representations + // (under some platforms short and long date formats are the same) + // + // NB: these elements should appear in this order, code in GetInfo() relies + // on it + wxLOCALE_SHORT_DATE_FMT, + wxLOCALE_LONG_DATE_FMT, + wxLOCALE_DATE_TIME_FMT, + wxLOCALE_TIME_FMT + +}; + +// ---------------------------------------------------------------------------- +// wxLocale: encapsulates all language dependent settings, including current +// message catalogs, date, time and currency formats (TODO) &c +// ---------------------------------------------------------------------------- + +enum wxLocaleInitFlags +{ + wxLOCALE_DONT_LOAD_DEFAULT = 0x0000, // don't load wxwin.mo + wxLOCALE_LOAD_DEFAULT = 0x0001 // load wxwin.mo? +#if WXWIN_COMPATIBILITY_2_8 + ,wxLOCALE_CONV_ENCODING = 0x0002 // no longer used, simply remove + // it from the existing code +#endif +}; + +class WXDLLIMPEXP_BASE wxLocale +{ +public: + // ctor & dtor + // ----------- + + // call Init() if you use this ctor + wxLocale() { DoCommonInit(); } + + // the ctor has a side effect of changing current locale + wxLocale(const wxString& name, // name (for messages) + const wxString& shortName = wxEmptyString, // dir prefix (for msg files) + const wxString& locale = wxEmptyString, // locale (for setlocale) + bool bLoadDefault = true // preload wxstd.mo? +#if WXWIN_COMPATIBILITY_2_8 + ,bool bConvertEncoding = true // convert Win<->Unix if necessary? +#endif + ) + { + DoCommonInit(); + +#if WXWIN_COMPATIBILITY_2_8 + Init(name, shortName, locale, bLoadDefault, bConvertEncoding); +#else + Init(name, shortName, locale, bLoadDefault); +#endif + } + + wxLocale(int language, // wxLanguage id or custom language + int flags = wxLOCALE_LOAD_DEFAULT) + { + DoCommonInit(); + + Init(language, flags); + } + + // the same as a function (returns true on success) + bool Init(const wxString& name, + const wxString& shortName = wxEmptyString, + const wxString& locale = wxEmptyString, + bool bLoadDefault = true +#if WXWIN_COMPATIBILITY_2_8 + ,bool bConvertEncoding = true +#endif + ); + + // same as second ctor (returns true on success) + bool Init(int language = wxLANGUAGE_DEFAULT, + int flags = wxLOCALE_LOAD_DEFAULT); + + // restores old locale + virtual ~wxLocale(); + + // Try to get user's (or OS's) preferred language setting. + // Return wxLANGUAGE_UNKNOWN if language-guessing algorithm failed + static int GetSystemLanguage(); + + // get the encoding used by default for text on this system, returns + // wxFONTENCODING_SYSTEM if it couldn't be determined + static wxFontEncoding GetSystemEncoding(); + + // get the string describing the system encoding, return empty string if + // couldn't be determined + static wxString GetSystemEncodingName(); + + // get the values of the given locale-dependent datum: the current locale + // is used, the US default value is returned if everything else fails + static wxString GetInfo(wxLocaleInfo index, + wxLocaleCategory cat = wxLOCALE_CAT_DEFAULT); + + // return true if the locale was set successfully + bool IsOk() const { return m_pszOldLocale != NULL; } + + // returns locale name + const wxString& GetLocale() const { return m_strLocale; } + + // return current locale wxLanguage value + int GetLanguage() const { return m_language; } + + // return locale name to be passed to setlocale() + wxString GetSysName() const; + + // return 'canonical' name, i.e. in the form of xx[_YY], where xx is + // language code according to ISO 639 and YY is country name + // as specified by ISO 3166. + wxString GetCanonicalName() const { return m_strShort; } + + // add a prefix to the catalog lookup path: the message catalog files will be + // looked up under prefix/<lang>/LC_MESSAGES, prefix/LC_MESSAGES and prefix + // (in this order). + // + // This only applies to subsequent invocations of AddCatalog()! + static void AddCatalogLookupPathPrefix(const wxString& prefix) + { wxFileTranslationsLoader::AddCatalogLookupPathPrefix(prefix); } + + // add a catalog: it's searched for in standard places (current directory + // first, system one after), but the you may prepend additional directories to + // the search path with AddCatalogLookupPathPrefix(). + // + // The loaded catalog will be used for message lookup by GetString(). + // + // Returns 'true' if it was successfully loaded + bool AddCatalog(const wxString& domain); + bool AddCatalog(const wxString& domain, wxLanguage msgIdLanguage); + bool AddCatalog(const wxString& domain, + wxLanguage msgIdLanguage, const wxString& msgIdCharset); + + // check if the given locale is provided by OS and C run time + static bool IsAvailable(int lang); + + // check if the given catalog is loaded + bool IsLoaded(const wxString& domain) const; + + // Retrieve the language info struct for the given language + // + // Returns NULL if no info found, pointer must *not* be deleted by caller + static const wxLanguageInfo *GetLanguageInfo(int lang); + + // Returns language name in English or empty string if the language + // is not in database + static wxString GetLanguageName(int lang); + + // Returns ISO code ("canonical name") of language or empty string if the + // language is not in database + static wxString GetLanguageCanonicalName(int lang); + + // Find the language for the given locale string which may be either a + // canonical ISO 2 letter language code ("xx"), a language code followed by + // the country code ("xx_XX") or a Windows full language name ("Xxxxx...") + // + // Returns NULL if no info found, pointer must *not* be deleted by caller + static const wxLanguageInfo *FindLanguageInfo(const wxString& locale); + + // Add custom language to the list of known languages. + // Notes: 1) wxLanguageInfo contains platform-specific data + // 2) must be called before Init to have effect + static void AddLanguage(const wxLanguageInfo& info); + + // retrieve the translation for a string in all loaded domains unless + // the szDomain parameter is specified (and then only this domain is + // searched) + // n - additional parameter for PluralFormsParser + // + // return original string if translation is not available + // (in this case an error message is generated the first time + // a string is not found; use wxLogNull to suppress it) + // + // domains are searched in the last to first order, i.e. catalogs + // added later override those added before. + const wxString& GetString(const wxString& origString, + const wxString& domain = wxEmptyString) const + { + return wxGetTranslation(origString, domain); + } + // plural form version of the same: + const wxString& GetString(const wxString& origString, + const wxString& origString2, + unsigned n, + const wxString& domain = wxEmptyString) const + { + return wxGetTranslation(origString, origString2, n, domain); + } + + // Returns the current short name for the locale + const wxString& GetName() const { return m_strShort; } + + // return the contents of .po file header + wxString GetHeaderValue(const wxString& header, + const wxString& domain = wxEmptyString) const; + + // These two methods are for internal use only. First one creates + // ms_languagesDB if it doesn't already exist, second one destroys + // it. + static void CreateLanguagesDB(); + static void DestroyLanguagesDB(); + +private: + bool DoInit(const wxString& name, + const wxString& shortName, + const wxString& locale); + + // copy default table of languages from global static array to + // m_langugagesInfo, called by InitLanguagesDB + static void InitLanguagesDB(); + + // initialize the member fields to default values + void DoCommonInit(); + + wxString m_strLocale, // this locale name + m_strShort; // short name for the locale + int m_language; // this locale wxLanguage value + + const char *m_pszOldLocale; // previous locale from setlocale() + wxLocale *m_pOldLocale; // previous wxLocale + + bool m_initialized; + + wxTranslations m_translations; + + static wxLanguageInfoArray *ms_languagesDB; + + wxDECLARE_NO_COPY_CLASS(wxLocale); +}; + +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +// get the current locale object (note that it may be NULL!) +extern WXDLLIMPEXP_BASE wxLocale* wxGetLocale(); + +#endif // wxUSE_INTL + +#endif // _WX_INTL_H_ diff --git a/wxmsw/include/wx-3.0/wx/iosfwrap.h b/wxmsw/include/wx-3.0/wx/iosfwrap.h new file mode 100644 index 00000000..13fb1f7f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/iosfwrap.h @@ -0,0 +1,25 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/iosfwrap.h +// Purpose: includes the correct stream-related forward declarations +// Author: Jan van Dijk <jan@etpmod.phys.tue.nl> +// Modified by: +// Created: 18.12.2002 +// Copyright: wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#if wxUSE_STD_IOSTREAM + +#if wxUSE_IOSTREAMH + // There is no pre-ANSI iosfwd header so we include the full declarations. +# include <iostream.h> +#else +# include <iosfwd> +#endif + +#ifdef __WINDOWS__ +# include "wx/msw/winundef.h" +#endif + +#endif // wxUSE_STD_IOSTREAM + diff --git a/wxmsw/include/wx-3.0/wx/ioswrap.h b/wxmsw/include/wx-3.0/wx/ioswrap.h new file mode 100644 index 00000000..5805588e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ioswrap.h @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ioswrap.h +// Purpose: includes the correct iostream headers for current compiler +// Author: Vadim Zeitlin +// Modified by: +// Created: 03.02.99 +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#if wxUSE_STD_IOSTREAM + +#include "wx/beforestd.h" + +#if wxUSE_IOSTREAMH +# include <iostream.h> +#else +# include <iostream> +#endif + +#include "wx/afterstd.h" + +#ifdef __WINDOWS__ +# include "wx/msw/winundef.h" +#endif + +#endif + // wxUSE_STD_IOSTREAM + diff --git a/wxmsw/include/wx-3.0/wx/ipc.h b/wxmsw/include/wx-3.0/wx/ipc.h new file mode 100644 index 00000000..36542e5f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ipc.h @@ -0,0 +1,44 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ipc.h +// Purpose: wrapper around different wxIPC classes implementations +// Author: Vadim Zeitlin +// Modified by: +// Created: 15.04.02 +// Copyright: (c) 2002 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IPC_H_ +#define _WX_IPC_H_ + +// Set wxUSE_DDE_FOR_IPC to 1 to use DDE for IPC under Windows. If it is set to +// 0, or if the platform is not Windows, use TCP/IP for IPC implementation + +#if !defined(wxUSE_DDE_FOR_IPC) + #ifdef __WINDOWS__ + #define wxUSE_DDE_FOR_IPC 1 + #else + #define wxUSE_DDE_FOR_IPC 0 + #endif +#endif // !defined(wxUSE_DDE_FOR_IPC) + +#if !defined(__WINDOWS__) + #undef wxUSE_DDE_FOR_IPC + #define wxUSE_DDE_FOR_IPC 0 +#endif + +#if wxUSE_DDE_FOR_IPC + #define wxConnection wxDDEConnection + #define wxServer wxDDEServer + #define wxClient wxDDEClient + + #include "wx/dde.h" +#else // !wxUSE_DDE_FOR_IPC + #define wxConnection wxTCPConnection + #define wxServer wxTCPServer + #define wxClient wxTCPClient + + #include "wx/sckipc.h" +#endif // wxUSE_DDE_FOR_IPC/!wxUSE_DDE_FOR_IPC + +#endif // _WX_IPC_H_ diff --git a/wxmsw/include/wx-3.0/wx/ipcbase.h b/wxmsw/include/wx-3.0/wx/ipcbase.h new file mode 100644 index 00000000..4d69958e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ipcbase.h @@ -0,0 +1,263 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/ipcbase.h +// Purpose: Base classes for IPC +// Author: Julian Smart +// Modified by: +// Created: 4/1/98 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IPCBASEH__ +#define _WX_IPCBASEH__ + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/string.h" + +enum wxIPCFormat +{ + wxIPC_INVALID = 0, + wxIPC_TEXT = 1, /* CF_TEXT */ + wxIPC_BITMAP = 2, /* CF_BITMAP */ + wxIPC_METAFILE = 3, /* CF_METAFILEPICT */ + wxIPC_SYLK = 4, + wxIPC_DIF = 5, + wxIPC_TIFF = 6, + wxIPC_OEMTEXT = 7, /* CF_OEMTEXT */ + wxIPC_DIB = 8, /* CF_DIB */ + wxIPC_PALETTE = 9, + wxIPC_PENDATA = 10, + wxIPC_RIFF = 11, + wxIPC_WAVE = 12, + wxIPC_UTF16TEXT = 13, /* CF_UNICODE */ + wxIPC_ENHMETAFILE = 14, + wxIPC_FILENAME = 15, /* CF_HDROP */ + wxIPC_LOCALE = 16, + wxIPC_UTF8TEXT = 17, + wxIPC_UTF32TEXT = 18, +#if SIZEOF_WCHAR_T == 2 + wxIPC_UNICODETEXT = wxIPC_UTF16TEXT, +#elif SIZEOF_WCHAR_T == 4 + wxIPC_UNICODETEXT = wxIPC_UTF32TEXT, +#else +# error "Unknown wchar_t size" +#endif + wxIPC_PRIVATE = 20 +}; + +class WXDLLIMPEXP_FWD_BASE wxServerBase; +class WXDLLIMPEXP_FWD_BASE wxClientBase; + +class WXDLLIMPEXP_BASE wxConnectionBase: public wxObject +{ +public: + wxConnectionBase(void *buffer, size_t size); // use external buffer + wxConnectionBase(); // use internal, adaptive buffer + wxConnectionBase(const wxConnectionBase& copy); + virtual ~wxConnectionBase(); + + void SetConnected( bool c ) { m_connected = c; } + bool GetConnected() { return m_connected; } + + // Calls that CLIENT can make + bool Execute(const void *data, size_t size, wxIPCFormat fmt = wxIPC_PRIVATE) + { return DoExecute(data, size, fmt); } + bool Execute(const char *s, size_t size = wxNO_LEN) + { return DoExecute(s, size == wxNO_LEN ? strlen(s) + 1 + : size, wxIPC_TEXT); } + bool Execute(const wchar_t *ws, size_t size = wxNO_LEN) + { return DoExecute(ws, size == wxNO_LEN ? (wcslen(ws) + 1)*sizeof(wchar_t) + : size, wxIPC_UNICODETEXT); } + bool Execute(const wxString& s) + { + const wxScopedCharBuffer buf = s.utf8_str(); + return DoExecute(buf, strlen(buf) + 1, wxIPC_UTF8TEXT); + } + bool Execute(const wxCStrData& cs) + { return Execute(cs.AsString()); } + + virtual const void *Request(const wxString& item, + size_t *size = NULL, + wxIPCFormat format = wxIPC_TEXT) = 0; + + bool Poke(const wxString& item, const void *data, size_t size, + wxIPCFormat fmt = wxIPC_PRIVATE) + { return DoPoke(item, data, size, fmt); } + bool Poke(const wxString& item, const char *s, size_t size = wxNO_LEN) + { return DoPoke(item, s, size == wxNO_LEN ? strlen(s) + 1 + : size, wxIPC_TEXT); } + bool Poke(const wxString& item, const wchar_t *ws, size_t size = wxNO_LEN) + { return DoPoke(item, ws, + size == wxNO_LEN ? (wcslen(ws) + 1)*sizeof(wchar_t) + : size, wxIPC_UNICODETEXT); } + bool Poke(const wxString& item, const wxString s) + { + const wxScopedCharBuffer buf = s.utf8_str(); + return DoPoke(item, buf, strlen(buf) + 1, wxIPC_UTF8TEXT); + } + bool Poke(const wxString& item, const wxCStrData& cs) + { return Poke(item, cs.AsString()); } + + virtual bool StartAdvise(const wxString& item) = 0; + virtual bool StopAdvise(const wxString& item) = 0; + + // Calls that SERVER can make + bool Advise(const wxString& item, const void *data, size_t size, + wxIPCFormat fmt = wxIPC_PRIVATE) + { return DoAdvise(item, data, size, fmt); } + bool Advise(const wxString& item, const char *s, size_t size = wxNO_LEN) + { return DoAdvise(item, s, size == wxNO_LEN ? strlen(s) + 1 + : size, wxIPC_TEXT); } + bool Advise(const wxString& item, const wchar_t *ws, size_t size = wxNO_LEN) + { return DoAdvise(item, ws, + size == wxNO_LEN ? (wcslen(ws) + 1)*sizeof(wchar_t) + : size, wxIPC_UNICODETEXT); } + bool Advise(const wxString& item, const wxString s) + { + const wxScopedCharBuffer buf = s.utf8_str(); + return DoAdvise(item, buf, strlen(buf) + 1, wxIPC_UTF8TEXT); + } + bool Advise(const wxString& item, const wxCStrData& cs) + { return Advise(item, cs.AsString()); } + + // Calls that both can make + virtual bool Disconnect() = 0; + + + // Callbacks to SERVER - override at will + virtual bool OnExec(const wxString& WXUNUSED(topic), + const wxString& WXUNUSED(data)) + { + wxFAIL_MSG( "This method shouldn't be called, if it is, it probably " + "means that you didn't update your old code overriding " + "OnExecute() to use the new parameter types (\"const void *\" " + "instead of \"wxChar *\" and \"size_t\" instead of \"int\"), " + "you must do it or your code wouldn't be executed at all!" ); + return false; + } + + // deprecated function kept for backwards compatibility: usually you will + // want to override OnExec() above instead which receives its data in a more + // convenient format + virtual bool OnExecute(const wxString& topic, + const void *data, + size_t size, + wxIPCFormat format) + { return OnExec(topic, GetTextFromData(data, size, format)); } + + virtual const void *OnRequest(const wxString& WXUNUSED(topic), + const wxString& WXUNUSED(item), + size_t *size, + wxIPCFormat WXUNUSED(format)) + { *size = 0; return NULL; } + + virtual bool OnPoke(const wxString& WXUNUSED(topic), + const wxString& WXUNUSED(item), + const void *WXUNUSED(data), + size_t WXUNUSED(size), + wxIPCFormat WXUNUSED(format)) + { return false; } + + virtual bool OnStartAdvise(const wxString& WXUNUSED(topic), + const wxString& WXUNUSED(item)) + { return false; } + + virtual bool OnStopAdvise(const wxString& WXUNUSED(topic), + const wxString& WXUNUSED(item)) + { return false; } + + // Callbacks to CLIENT - override at will + virtual bool OnAdvise(const wxString& WXUNUSED(topic), + const wxString& WXUNUSED(item), + const void *WXUNUSED(data), + size_t WXUNUSED(size), + wxIPCFormat WXUNUSED(format)) + { return false; } + + // Callbacks to BOTH + virtual bool OnDisconnect() { delete this; return true; } + + + // return true if this is one of the formats used for textual data + // transmission + static bool IsTextFormat(wxIPCFormat format) + { + return format == wxIPC_TEXT || + format == wxIPC_UTF8TEXT || + format == wxIPC_UTF16TEXT || + format == wxIPC_UTF32TEXT; + } + + // converts from the data and format into a wxString automatically + // + // this function accepts data in all of wxIPC_TEXT, wxIPC_UNICODETEXT, and + // wxIPC_UTF8TEXT formats but asserts if the format is anything else (i.e. + // such that IsTextFormat(format) doesn't return true) + // + // notice that the size parameter here contains the total size of the data, + // including the terminating '\0' or L'\0' + static + wxString GetTextFromData(const void *data, size_t size, wxIPCFormat format); + + + // return a buffer at least this size, reallocating buffer if needed + // returns NULL if using an inadequate user buffer which can't be resized + void *GetBufferAtLeast(size_t bytes); + +protected: + virtual bool DoExecute(const void *data, size_t size, wxIPCFormat format) = 0; + virtual bool DoPoke(const wxString& item, const void *data, size_t size, + wxIPCFormat format) = 0; + virtual bool DoAdvise(const wxString& item, const void *data, size_t size, + wxIPCFormat format) = 0; + + +private: + char *m_buffer; + size_t m_buffersize; + bool m_deletebufferwhendone; + +protected: + bool m_connected; + + wxDECLARE_NO_ASSIGN_CLASS(wxConnectionBase); + DECLARE_CLASS(wxConnectionBase) +}; + + +class WXDLLIMPEXP_BASE wxServerBase : public wxObject +{ +public: + wxServerBase() { } + virtual ~wxServerBase() { } + + // Returns false on error (e.g. port number is already in use) + virtual bool Create(const wxString& serverName) = 0; + + // Callbacks to SERVER - override at will + virtual wxConnectionBase *OnAcceptConnection(const wxString& topic) = 0; + + DECLARE_CLASS(wxServerBase) +}; + +class WXDLLIMPEXP_BASE wxClientBase : public wxObject +{ +public: + wxClientBase() { } + virtual ~wxClientBase() { } + + virtual bool ValidHost(const wxString& host) = 0; + + // Call this to make a connection. Returns NULL if cannot. + virtual wxConnectionBase *MakeConnection(const wxString& host, + const wxString& server, + const wxString& topic) = 0; + + // Callbacks to CLIENT - override at will + virtual wxConnectionBase *OnMakeConnection() = 0; + + DECLARE_CLASS(wxClientBase) +}; + +#endif // _WX_IPCBASEH__ diff --git a/wxmsw/include/wx-3.0/wx/itemid.h b/wxmsw/include/wx-3.0/wx/itemid.h new file mode 100644 index 00000000..99897e9c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/itemid.h @@ -0,0 +1,61 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/itemid.h +// Purpose: wxItemId class declaration. +// Author: Vadim Zeitlin +// Created: 2011-08-17 +// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ITEMID_H_ +#define _WX_ITEMID_H_ + +// ---------------------------------------------------------------------------- +// wxItemId: an opaque item identifier used with wx{Tree,TreeList,DataView}Ctrl. +// ---------------------------------------------------------------------------- + +// The template argument T is typically a pointer to some opaque type. While +// wxTreeItemId and wxDataViewItem use a pointer to void, this is dangerous and +// not recommended for the new item id classes. +template <typename T> +class wxItemId +{ +public: + typedef T Type; + + // This ctor is implicit which is fine for non-void* types, but if you use + // this class with void* you're strongly advised to make the derived class + // ctor explicit as implicitly converting from any pointer is simply too + // dangerous. + wxItemId(Type item = NULL) : m_pItem(item) { } + + // Default copy ctor, assignment operator and dtor are ok. + + bool IsOk() const { return m_pItem != NULL; } + Type GetID() const { return m_pItem; } + operator const Type() const { return m_pItem; } + + // This is used for implementation purposes only. + Type operator->() const { return m_pItem; } + + void Unset() { m_pItem = NULL; } + + // This field is public *only* for compatibility with the old wxTreeItemId + // implementation and must not be used in any new code. +//private: + Type m_pItem; +}; + +template <typename T> +bool operator==(const wxItemId<T>& left, const wxItemId<T>& right) +{ + return left.GetID() == right.GetID(); +} + +template <typename T> +bool operator!=(const wxItemId<T>& left, const wxItemId<T>& right) +{ + return !(left == right); +} + +#endif // _WX_ITEMID_H_ diff --git a/wxmsw/include/wx-3.0/wx/joystick.h b/wxmsw/include/wx-3.0/wx/joystick.h new file mode 100644 index 00000000..733ad7de --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/joystick.h @@ -0,0 +1,37 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/joystick.h +// Purpose: wxJoystick base header +// Author: wxWidgets Team +// Modified by: +// Created: +// Copyright: (c) wxWidgets Team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_JOYSTICK_H_BASE_ +#define _WX_JOYSTICK_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_JOYSTICK + +#if defined(__WINDOWS__) +#include "wx/msw/joystick.h" +#elif defined(__WXMOTIF__) +#include "wx/unix/joystick.h" +#elif defined(__WXGTK__) +#include "wx/unix/joystick.h" +#elif defined(__WXX11__) +#include "wx/unix/joystick.h" +#elif defined(__DARWIN__) +#include "wx/osx/core/joystick.h" +#elif defined(__WXMAC__) +#include "wx/osx/joystick.h" +#elif defined(__WXPM__) +#include "wx/os2/joystick.h" +#endif + +#endif // wxUSE_JOYSTICK + +#endif + // _WX_JOYSTICK_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/kbdstate.h b/wxmsw/include/wx-3.0/wx/kbdstate.h new file mode 100644 index 00000000..ab0df32d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/kbdstate.h @@ -0,0 +1,121 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/kbdstate.h +// Purpose: Declaration of wxKeyboardState class +// Author: Vadim Zeitlin +// Created: 2008-09-19 +// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_KBDSTATE_H_ +#define _WX_KBDSTATE_H_ + +#include "wx/defs.h" + +// ---------------------------------------------------------------------------- +// wxKeyboardState stores the state of the keyboard modifier keys +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxKeyboardState +{ +public: + wxKeyboardState(bool controlDown = false, + bool shiftDown = false, + bool altDown = false, + bool metaDown = false) + : m_controlDown(controlDown), + m_shiftDown(shiftDown), + m_altDown(altDown), + m_metaDown(metaDown) +#ifdef __WXOSX__ + ,m_rawControlDown(false) +#endif + { + } + + // default copy ctor, assignment operator and dtor are ok + + + // accessors for the various modifier keys + // --------------------------------------- + + // should be used check if the key event has exactly the given modifiers: + // "GetModifiers() = wxMOD_CONTROL" is easier to write than "ControlDown() + // && !MetaDown() && !AltDown() && !ShiftDown()" + int GetModifiers() const + { + return (m_controlDown ? wxMOD_CONTROL : 0) | + (m_shiftDown ? wxMOD_SHIFT : 0) | + (m_metaDown ? wxMOD_META : 0) | +#ifdef __WXOSX__ + (m_rawControlDown ? wxMOD_RAW_CONTROL : 0) | +#endif + (m_altDown ? wxMOD_ALT : 0); + } + + // returns true if any modifiers at all are pressed + bool HasAnyModifiers() const { return GetModifiers() != wxMOD_NONE; } + + // returns true if any modifiers changing the usual key interpretation are + // pressed, notably excluding Shift + bool HasModifiers() const + { + return ControlDown() || RawControlDown() || AltDown(); + } + + // accessors for individual modifier keys + bool ControlDown() const { return m_controlDown; } + bool RawControlDown() const + { +#ifdef __WXOSX__ + return m_rawControlDown; +#else + return m_controlDown; +#endif + } + bool ShiftDown() const { return m_shiftDown; } + bool MetaDown() const { return m_metaDown; } + bool AltDown() const { return m_altDown; } + + // "Cmd" is a pseudo key which is Control for PC and Unix platforms but + // Apple ("Command") key under Macs: it makes often sense to use it instead + // of, say, ControlDown() because Cmd key is used for the same thing under + // Mac as Ctrl elsewhere (but Ctrl still exists, just not used for this + // purpose under Mac) + bool CmdDown() const + { + return ControlDown(); + } + + // these functions are mostly used by wxWidgets itself + // --------------------------------------------------- + + void SetControlDown(bool down) { m_controlDown = down; } + void SetRawControlDown(bool down) + { +#ifdef __WXOSX__ + m_rawControlDown = down; +#else + m_controlDown = down; +#endif + } + void SetShiftDown(bool down) { m_shiftDown = down; } + void SetAltDown(bool down) { m_altDown = down; } + void SetMetaDown(bool down) { m_metaDown = down; } + + + // for backwards compatibility with the existing code accessing these + // members of wxKeyEvent directly, these variables are public, however you + // should not use them in any new code, please use the accessors instead +public: + bool m_controlDown : 1; + bool m_shiftDown : 1; + bool m_altDown : 1; + bool m_metaDown : 1; +#ifdef __WXOSX__ + bool m_rawControlDown : 1; +#endif +}; + +#endif // _WX_KBDSTATE_H_ + diff --git a/wxmsw/include/wx-3.0/wx/language.h b/wxmsw/include/wx-3.0/wx/language.h new file mode 100644 index 00000000..2d196b66 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/language.h @@ -0,0 +1,281 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/language.h +// Purpose: wxLanguage enum +// Author: Vadim Zeitlin +// Created: 2010-04-23 +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// WARNING: Parts of this file are generated. See misc/languages/README for +// details. + +#ifndef _WX_LANGUAGE_H_ +#define _WX_LANGUAGE_H_ + +#include "wx/defs.h" + +#if wxUSE_INTL + +// ---------------------------------------------------------------------------- +// wxLanguage: defines all supported languages +// ---------------------------------------------------------------------------- + +// --- --- --- generated code begins here --- --- --- + +/** + The languages supported by wxLocale. + + This enum is generated by misc/languages/genlang.py + When making changes, please put them into misc/languages/langtabl.txt +*/ +enum wxLanguage +{ + /// User's default/preffered language as got from OS. + wxLANGUAGE_DEFAULT, + + /// Unknown language, returned if wxLocale::GetSystemLanguage fails. + wxLANGUAGE_UNKNOWN, + + wxLANGUAGE_ABKHAZIAN, + wxLANGUAGE_AFAR, + wxLANGUAGE_AFRIKAANS, + wxLANGUAGE_ALBANIAN, + wxLANGUAGE_AMHARIC, + wxLANGUAGE_ARABIC, + wxLANGUAGE_ARABIC_ALGERIA, + wxLANGUAGE_ARABIC_BAHRAIN, + wxLANGUAGE_ARABIC_EGYPT, + wxLANGUAGE_ARABIC_IRAQ, + wxLANGUAGE_ARABIC_JORDAN, + wxLANGUAGE_ARABIC_KUWAIT, + wxLANGUAGE_ARABIC_LEBANON, + wxLANGUAGE_ARABIC_LIBYA, + wxLANGUAGE_ARABIC_MOROCCO, + wxLANGUAGE_ARABIC_OMAN, + wxLANGUAGE_ARABIC_QATAR, + wxLANGUAGE_ARABIC_SAUDI_ARABIA, + wxLANGUAGE_ARABIC_SUDAN, + wxLANGUAGE_ARABIC_SYRIA, + wxLANGUAGE_ARABIC_TUNISIA, + wxLANGUAGE_ARABIC_UAE, + wxLANGUAGE_ARABIC_YEMEN, + wxLANGUAGE_ARMENIAN, + wxLANGUAGE_ASSAMESE, + wxLANGUAGE_ASTURIAN, + wxLANGUAGE_AYMARA, + wxLANGUAGE_AZERI, + wxLANGUAGE_AZERI_CYRILLIC, + wxLANGUAGE_AZERI_LATIN, + wxLANGUAGE_BASHKIR, + wxLANGUAGE_BASQUE, + wxLANGUAGE_BELARUSIAN, + wxLANGUAGE_BENGALI, + wxLANGUAGE_BHUTANI, + wxLANGUAGE_BIHARI, + wxLANGUAGE_BISLAMA, + wxLANGUAGE_BOSNIAN, + wxLANGUAGE_BRETON, + wxLANGUAGE_BULGARIAN, + wxLANGUAGE_BURMESE, + wxLANGUAGE_CAMBODIAN, + wxLANGUAGE_CATALAN, + wxLANGUAGE_CHINESE, + wxLANGUAGE_CHINESE_SIMPLIFIED, + wxLANGUAGE_CHINESE_TRADITIONAL, + wxLANGUAGE_CHINESE_HONGKONG, + wxLANGUAGE_CHINESE_MACAU, + wxLANGUAGE_CHINESE_SINGAPORE, + wxLANGUAGE_CHINESE_TAIWAN, + wxLANGUAGE_CORSICAN, + wxLANGUAGE_CROATIAN, + wxLANGUAGE_CZECH, + wxLANGUAGE_DANISH, + wxLANGUAGE_DUTCH, + wxLANGUAGE_DUTCH_BELGIAN, + wxLANGUAGE_ENGLISH, + wxLANGUAGE_ENGLISH_UK, + wxLANGUAGE_ENGLISH_US, + wxLANGUAGE_ENGLISH_AUSTRALIA, + wxLANGUAGE_ENGLISH_BELIZE, + wxLANGUAGE_ENGLISH_BOTSWANA, + wxLANGUAGE_ENGLISH_CANADA, + wxLANGUAGE_ENGLISH_CARIBBEAN, + wxLANGUAGE_ENGLISH_DENMARK, + wxLANGUAGE_ENGLISH_EIRE, + wxLANGUAGE_ENGLISH_JAMAICA, + wxLANGUAGE_ENGLISH_NEW_ZEALAND, + wxLANGUAGE_ENGLISH_PHILIPPINES, + wxLANGUAGE_ENGLISH_SOUTH_AFRICA, + wxLANGUAGE_ENGLISH_TRINIDAD, + wxLANGUAGE_ENGLISH_ZIMBABWE, + wxLANGUAGE_ESPERANTO, + wxLANGUAGE_ESTONIAN, + wxLANGUAGE_FAEROESE, + wxLANGUAGE_FARSI, + wxLANGUAGE_FIJI, + wxLANGUAGE_FINNISH, + wxLANGUAGE_FRENCH, + wxLANGUAGE_FRENCH_BELGIAN, + wxLANGUAGE_FRENCH_CANADIAN, + wxLANGUAGE_FRENCH_LUXEMBOURG, + wxLANGUAGE_FRENCH_MONACO, + wxLANGUAGE_FRENCH_SWISS, + wxLANGUAGE_FRISIAN, + wxLANGUAGE_GALICIAN, + wxLANGUAGE_GEORGIAN, + wxLANGUAGE_GERMAN, + wxLANGUAGE_GERMAN_AUSTRIAN, + wxLANGUAGE_GERMAN_BELGIUM, + wxLANGUAGE_GERMAN_LIECHTENSTEIN, + wxLANGUAGE_GERMAN_LUXEMBOURG, + wxLANGUAGE_GERMAN_SWISS, + wxLANGUAGE_GREEK, + wxLANGUAGE_GREENLANDIC, + wxLANGUAGE_GUARANI, + wxLANGUAGE_GUJARATI, + wxLANGUAGE_HAUSA, + wxLANGUAGE_HEBREW, + wxLANGUAGE_HINDI, + wxLANGUAGE_HUNGARIAN, + wxLANGUAGE_ICELANDIC, + wxLANGUAGE_INDONESIAN, + wxLANGUAGE_INTERLINGUA, + wxLANGUAGE_INTERLINGUE, + wxLANGUAGE_INUKTITUT, + wxLANGUAGE_INUPIAK, + wxLANGUAGE_IRISH, + wxLANGUAGE_ITALIAN, + wxLANGUAGE_ITALIAN_SWISS, + wxLANGUAGE_JAPANESE, + wxLANGUAGE_JAVANESE, + wxLANGUAGE_KANNADA, + wxLANGUAGE_KASHMIRI, + wxLANGUAGE_KASHMIRI_INDIA, + wxLANGUAGE_KAZAKH, + wxLANGUAGE_KERNEWEK, + wxLANGUAGE_KINYARWANDA, + wxLANGUAGE_KIRGHIZ, + wxLANGUAGE_KIRUNDI, + wxLANGUAGE_KONKANI, + wxLANGUAGE_KOREAN, + wxLANGUAGE_KURDISH, + wxLANGUAGE_LAOTHIAN, + wxLANGUAGE_LATIN, + wxLANGUAGE_LATVIAN, + wxLANGUAGE_LINGALA, + wxLANGUAGE_LITHUANIAN, + wxLANGUAGE_MACEDONIAN, + wxLANGUAGE_MALAGASY, + wxLANGUAGE_MALAY, + wxLANGUAGE_MALAYALAM, + wxLANGUAGE_MALAY_BRUNEI_DARUSSALAM, + wxLANGUAGE_MALAY_MALAYSIA, + wxLANGUAGE_MALTESE, + wxLANGUAGE_MANIPURI, + wxLANGUAGE_MAORI, + wxLANGUAGE_MARATHI, + wxLANGUAGE_MOLDAVIAN, + wxLANGUAGE_MONGOLIAN, + wxLANGUAGE_NAURU, + wxLANGUAGE_NEPALI, + wxLANGUAGE_NEPALI_INDIA, + wxLANGUAGE_NORWEGIAN_BOKMAL, + wxLANGUAGE_NORWEGIAN_NYNORSK, + wxLANGUAGE_OCCITAN, + wxLANGUAGE_ORIYA, + wxLANGUAGE_OROMO, + wxLANGUAGE_PASHTO, + wxLANGUAGE_POLISH, + wxLANGUAGE_PORTUGUESE, + wxLANGUAGE_PORTUGUESE_BRAZILIAN, + wxLANGUAGE_PUNJABI, + wxLANGUAGE_QUECHUA, + wxLANGUAGE_RHAETO_ROMANCE, + wxLANGUAGE_ROMANIAN, + wxLANGUAGE_RUSSIAN, + wxLANGUAGE_RUSSIAN_UKRAINE, + wxLANGUAGE_SAMI, + wxLANGUAGE_SAMOAN, + wxLANGUAGE_SANGHO, + wxLANGUAGE_SANSKRIT, + wxLANGUAGE_SCOTS_GAELIC, + wxLANGUAGE_SERBIAN, + wxLANGUAGE_SERBIAN_CYRILLIC, + wxLANGUAGE_SERBIAN_LATIN, + wxLANGUAGE_SERBO_CROATIAN, + wxLANGUAGE_SESOTHO, + wxLANGUAGE_SETSWANA, + wxLANGUAGE_SHONA, + wxLANGUAGE_SINDHI, + wxLANGUAGE_SINHALESE, + wxLANGUAGE_SISWATI, + wxLANGUAGE_SLOVAK, + wxLANGUAGE_SLOVENIAN, + wxLANGUAGE_SOMALI, + wxLANGUAGE_SPANISH, + wxLANGUAGE_SPANISH_ARGENTINA, + wxLANGUAGE_SPANISH_BOLIVIA, + wxLANGUAGE_SPANISH_CHILE, + wxLANGUAGE_SPANISH_COLOMBIA, + wxLANGUAGE_SPANISH_COSTA_RICA, + wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC, + wxLANGUAGE_SPANISH_ECUADOR, + wxLANGUAGE_SPANISH_EL_SALVADOR, + wxLANGUAGE_SPANISH_GUATEMALA, + wxLANGUAGE_SPANISH_HONDURAS, + wxLANGUAGE_SPANISH_MEXICAN, + wxLANGUAGE_SPANISH_MODERN, + wxLANGUAGE_SPANISH_NICARAGUA, + wxLANGUAGE_SPANISH_PANAMA, + wxLANGUAGE_SPANISH_PARAGUAY, + wxLANGUAGE_SPANISH_PERU, + wxLANGUAGE_SPANISH_PUERTO_RICO, + wxLANGUAGE_SPANISH_URUGUAY, + wxLANGUAGE_SPANISH_US, + wxLANGUAGE_SPANISH_VENEZUELA, + wxLANGUAGE_SUNDANESE, + wxLANGUAGE_SWAHILI, + wxLANGUAGE_SWEDISH, + wxLANGUAGE_SWEDISH_FINLAND, + wxLANGUAGE_TAGALOG, + wxLANGUAGE_TAJIK, + wxLANGUAGE_TAMIL, + wxLANGUAGE_TATAR, + wxLANGUAGE_TELUGU, + wxLANGUAGE_THAI, + wxLANGUAGE_TIBETAN, + wxLANGUAGE_TIGRINYA, + wxLANGUAGE_TONGA, + wxLANGUAGE_TSONGA, + wxLANGUAGE_TURKISH, + wxLANGUAGE_TURKMEN, + wxLANGUAGE_TWI, + wxLANGUAGE_UIGHUR, + wxLANGUAGE_UKRAINIAN, + wxLANGUAGE_URDU, + wxLANGUAGE_URDU_INDIA, + wxLANGUAGE_URDU_PAKISTAN, + wxLANGUAGE_UZBEK, + wxLANGUAGE_UZBEK_CYRILLIC, + wxLANGUAGE_UZBEK_LATIN, + wxLANGUAGE_VALENCIAN, + wxLANGUAGE_VIETNAMESE, + wxLANGUAGE_VOLAPUK, + wxLANGUAGE_WELSH, + wxLANGUAGE_WOLOF, + wxLANGUAGE_XHOSA, + wxLANGUAGE_YIDDISH, + wxLANGUAGE_YORUBA, + wxLANGUAGE_ZHUANG, + wxLANGUAGE_ZULU, + + /// For custom, user-defined languages. + wxLANGUAGE_USER_DEFINED +}; + +// --- --- --- generated code ends here --- --- --- + +#endif // wxUSE_INTL + +#endif // _WX_LANGUAGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/layout.h b/wxmsw/include/wx-3.0/wx/layout.h new file mode 100644 index 00000000..30d46c24 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/layout.h @@ -0,0 +1,190 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/layout.h +// Purpose: OBSOLETE layout constraint classes, use sizers instead +// Author: Julian Smart +// Modified by: +// Created: 29/01/98 +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LAYOUT_H_ +#define _WX_LAYOUT_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/object.h" + +// X stupidly defines these in X.h +#ifdef Above + #undef Above +#endif +#ifdef Below + #undef Below +#endif + +#if wxUSE_CONSTRAINTS + +// ---------------------------------------------------------------------------- +// forward declrations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxWindowBase; +class WXDLLIMPEXP_FWD_CORE wxLayoutConstraints; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#define wxLAYOUT_DEFAULT_MARGIN 0 + +enum wxEdge +{ + wxLeft, wxTop, wxRight, wxBottom, wxWidth, wxHeight, + wxCentre, wxCenter = wxCentre, wxCentreX, wxCentreY +}; + +enum wxRelationship +{ + wxUnconstrained = 0, + wxAsIs, + wxPercentOf, + wxAbove, + wxBelow, + wxLeftOf, + wxRightOf, + wxSameAs, + wxAbsolute +}; + +// ---------------------------------------------------------------------------- +// wxIndividualLayoutConstraint: a constraint on window position +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxIndividualLayoutConstraint : public wxObject +{ +public: + wxIndividualLayoutConstraint(); + + // note that default copy ctor and assignment operators are ok + + virtual ~wxIndividualLayoutConstraint(){} + + void Set(wxRelationship rel, wxWindowBase *otherW, wxEdge otherE, int val = 0, int marg = wxLAYOUT_DEFAULT_MARGIN); + + // + // Sibling relationships + // + void LeftOf(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); + void RightOf(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); + void Above(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); + void Below(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); + + // + // 'Same edge' alignment + // + void SameAs(wxWindowBase *otherW, wxEdge edge, int marg = wxLAYOUT_DEFAULT_MARGIN); + + // The edge is a percentage of the other window's edge + void PercentOf(wxWindowBase *otherW, wxEdge wh, int per); + + // + // Edge has absolute value + // + void Absolute(int val); + + // + // Dimension is unconstrained + // + void Unconstrained() { relationship = wxUnconstrained; } + + // + // Dimension is 'as is' (use current size settings) + // + void AsIs() { relationship = wxAsIs; } + + // + // Accessors + // + wxWindowBase *GetOtherWindow() { return otherWin; } + wxEdge GetMyEdge() const { return myEdge; } + void SetEdge(wxEdge which) { myEdge = which; } + void SetValue(int v) { value = v; } + int GetMargin() { return margin; } + void SetMargin(int m) { margin = m; } + int GetValue() const { return value; } + int GetPercent() const { return percent; } + int GetOtherEdge() const { return otherEdge; } + bool GetDone() const { return done; } + void SetDone(bool d) { done = d; } + wxRelationship GetRelationship() { return relationship; } + void SetRelationship(wxRelationship r) { relationship = r; } + + // Reset constraint if it mentions otherWin + bool ResetIfWin(wxWindowBase *otherW); + + // Try to satisfy constraint + bool SatisfyConstraint(wxLayoutConstraints *constraints, wxWindowBase *win); + + // Get the value of this edge or dimension, or if this + // is not determinable, -1. + int GetEdge(wxEdge which, wxWindowBase *thisWin, wxWindowBase *other) const; + +protected: + // To be allowed to modify the internal variables + friend class wxIndividualLayoutConstraint_Serialize; + + // 'This' window is the parent or sibling of otherWin + wxWindowBase *otherWin; + + wxEdge myEdge; + wxRelationship relationship; + int margin; + int value; + int percent; + wxEdge otherEdge; + bool done; + + DECLARE_DYNAMIC_CLASS(wxIndividualLayoutConstraint) +}; + +// ---------------------------------------------------------------------------- +// wxLayoutConstraints: the complete set of constraints for a window +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxLayoutConstraints : public wxObject +{ +public: + // Edge constraints + wxIndividualLayoutConstraint left; + wxIndividualLayoutConstraint top; + wxIndividualLayoutConstraint right; + wxIndividualLayoutConstraint bottom; + // Size constraints + wxIndividualLayoutConstraint width; + wxIndividualLayoutConstraint height; + // Centre constraints + wxIndividualLayoutConstraint centreX; + wxIndividualLayoutConstraint centreY; + + wxLayoutConstraints(); + + // note that default copy ctor and assignment operators are ok + + virtual ~wxLayoutConstraints(){} + + bool SatisfyConstraints(wxWindowBase *win, int *noChanges); + bool AreSatisfied() const + { + return left.GetDone() && top.GetDone() && + width.GetDone() && height.GetDone(); + } + + DECLARE_DYNAMIC_CLASS(wxLayoutConstraints) +}; + +#endif // wxUSE_CONSTRAINTS + +#endif // _WX_LAYOUT_H_ diff --git a/wxmsw/include/wx-3.0/wx/laywin.h b/wxmsw/include/wx-3.0/wx/laywin.h new file mode 100644 index 00000000..e3f6b6ee --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/laywin.h @@ -0,0 +1,17 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/laywin.h +// Purpose: wxSashLayoutWindow base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LAYWIN_H_BASE_ +#define _WX_LAYWIN_H_BASE_ + +#include "wx/generic/laywin.h" + +#endif + // _WX_LAYWIN_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/link.h b/wxmsw/include/wx-3.0/wx/link.h new file mode 100644 index 00000000..c422fc17 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/link.h @@ -0,0 +1,31 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/link.h +// Purpose: macros to force linking modules which might otherwise be +// discarded by the linker +// Author: Vaclav Slavik +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LINK_H_ +#define _WX_LINK_H_ + +// This must be part of the module you want to force: +#define wxFORCE_LINK_THIS_MODULE(module_name) \ + extern void _wx_link_dummy_func_##module_name (); \ + void _wx_link_dummy_func_##module_name () { } + + +// And this must be somewhere where it certainly will be linked: +#define wxFORCE_LINK_MODULE(module_name) \ + extern void _wx_link_dummy_func_##module_name (); \ + static struct wxForceLink##module_name \ + { \ + wxForceLink##module_name() \ + { \ + _wx_link_dummy_func_##module_name (); \ + } \ + } _wx_link_dummy_var_##module_name; + + +#endif // _WX_LINK_H_ diff --git a/wxmsw/include/wx-3.0/wx/list.h b/wxmsw/include/wx-3.0/wx/list.h new file mode 100644 index 00000000..160b3b8b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/list.h @@ -0,0 +1,1341 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/list.h +// Purpose: wxList, wxStringList classes +// Author: Julian Smart +// Modified by: VZ at 16/11/98: WX_DECLARE_LIST() and typesafe lists added +// Created: 29/01/98 +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +/* + All this is quite ugly but serves two purposes: + 1. Be almost 100% compatible with old, untyped, wxList class + 2. Ensure compile-time type checking for the linked lists + + The idea is to have one base class (wxListBase) working with "void *" data, + but to hide these untyped functions - i.e. make them protected, so they + can only be used from derived classes which have inline member functions + working with right types. This achieves the 2nd goal. As for the first one, + we provide a special derivation of wxListBase called wxList which looks just + like the old class. +*/ + +#ifndef _WX_LIST_H_ +#define _WX_LIST_H_ + +// ----------------------------------------------------------------------------- +// headers +// ----------------------------------------------------------------------------- + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/string.h" +#include "wx/vector.h" + +#if wxUSE_STD_CONTAINERS + #include "wx/beforestd.h" + #include <algorithm> + #include <iterator> + #include <list> + #include "wx/afterstd.h" +#endif + +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxObjectListNode; +typedef wxObjectListNode wxNode; + +#if wxUSE_STD_CONTAINERS + +#define wxLIST_COMPATIBILITY + +#define WX_DECLARE_LIST_3(elT, dummy1, liT, dummy2, decl) \ + WX_DECLARE_LIST_WITH_DECL(elT, liT, decl) +#define WX_DECLARE_LIST_PTR_3(elT, dummy1, liT, dummy2, decl) \ + WX_DECLARE_LIST_3(elT, dummy1, liT, dummy2, decl) + +#define WX_DECLARE_LIST_2(elT, liT, dummy, decl) \ + WX_DECLARE_LIST_WITH_DECL(elT, liT, decl) +#define WX_DECLARE_LIST_PTR_2(elT, liT, dummy, decl) \ + WX_DECLARE_LIST_2(elT, liT, dummy, decl) \ + +#define WX_DECLARE_LIST_WITH_DECL(elT, liT, decl) \ + WX_DECLARE_LIST_XO(elT*, liT, decl) + +#if !defined(__VISUALC__) || __VISUALC__ >= 1300 // == !VC6 + +template<class T> +class wxList_SortFunction +{ +public: + wxList_SortFunction(wxSortCompareFunction f) : m_f(f) { } + bool operator()(const T& i1, const T& i2) + { return m_f((T*)&i1, (T*)&i2) < 0; } +private: + wxSortCompareFunction m_f; +}; + +#define WX_LIST_SORTFUNCTION( elT, f ) wxList_SortFunction<elT>(f) +#define WX_LIST_VC6_WORKAROUND(elT, liT, decl) + +#else // if defined( __VISUALC__ ) && __VISUALC__ < 1300 // == VC6 + +#define WX_LIST_SORTFUNCTION( elT, f ) std::greater<elT>( f ) +#define WX_LIST_VC6_WORKAROUND(elT, liT, decl) \ + decl liT; \ + \ + /* Workaround for broken VC6 STL incorrectly requires a std::greater<> */ \ + /* to be passed into std::list::sort() */ \ + template <> \ + struct std::greater<elT> \ + { \ + private: \ + wxSortCompareFunction m_CompFunc; \ + public: \ + greater( wxSortCompareFunction compfunc = NULL ) \ + : m_CompFunc( compfunc ) {} \ + bool operator()(const elT X, const elT Y) const \ + { \ + return m_CompFunc ? \ + ( m_CompFunc( wxListCastElementToVoidPtr(X), \ + wxListCastElementToVoidPtr(Y) ) < 0 ) : \ + ( X > Y ); \ + } \ + }; + +// helper for std::greater<elT> above: +template<typename T> +inline const void *wxListCastElementToVoidPtr(const T* ptr) { return ptr; } +inline const void *wxListCastElementToVoidPtr(const wxString& str) + { return (const char*)str; } + +#endif // VC6/!VC6 + +/* + Note 1: the outer helper class _WX_LIST_HELPER_##liT below is a workaround + for mingw 3.2.3 compiler bug that prevents a static function of liT class + from being exported into dll. A minimal code snippet reproducing the bug: + + struct WXDLLIMPEXP_CORE Foo + { + static void Bar(); + struct SomeInnerClass + { + friend class Foo; // comment this out to make it link + }; + ~Foo() + { + Bar(); + } + }; + + The program does not link under mingw_gcc 3.2.3 producing undefined + reference to Foo::Bar() function + + + Note 2: the EmptyList is needed to allow having a NULL pointer-like + invalid iterator. We used to use just an uninitialized iterator object + instead but this fails with some debug/checked versions of STL, notably the + glibc version activated with _GLIBCXX_DEBUG, so we need to have a separate + invalid iterator. + */ + +// the real wxList-class declaration +#define WX_DECLARE_LIST_XO(elT, liT, decl) \ + decl _WX_LIST_HELPER_##liT \ + { \ + typedef elT _WX_LIST_ITEM_TYPE_##liT; \ + typedef std::list<elT> BaseListType; \ + public: \ + static BaseListType EmptyList; \ + static void DeleteFunction( _WX_LIST_ITEM_TYPE_##liT X ); \ + }; \ + \ + WX_LIST_VC6_WORKAROUND(elT, liT, decl) \ + class liT : public std::list<elT> \ + { \ + private: \ + typedef std::list<elT> BaseListType; \ + \ + bool m_destroy; \ + \ + public: \ + class compatibility_iterator \ + { \ + private: \ + /* Workaround for broken VC6 nested class name resolution */ \ + typedef std::list<elT>::iterator iterator; \ + friend class liT; \ + \ + iterator m_iter; \ + liT * m_list; \ + \ + public: \ + compatibility_iterator() \ + : m_iter(_WX_LIST_HELPER_##liT::EmptyList.end()), m_list( NULL ) {} \ + compatibility_iterator( liT* li, iterator i ) \ + : m_iter( i ), m_list( li ) {} \ + compatibility_iterator( const liT* li, iterator i ) \ + : m_iter( i ), m_list( const_cast< liT* >( li ) ) {} \ + \ + compatibility_iterator* operator->() { return this; } \ + const compatibility_iterator* operator->() const { return this; } \ + \ + bool operator==(const compatibility_iterator& i) const \ + { \ + wxASSERT_MSG( m_list && i.m_list, \ + wxT("comparing invalid iterators is illegal") ); \ + return (m_list == i.m_list) && (m_iter == i.m_iter); \ + } \ + bool operator!=(const compatibility_iterator& i) const \ + { return !( operator==( i ) ); } \ + operator bool() const \ + { return m_list ? m_iter != m_list->end() : false; } \ + bool operator !() const \ + { return !( operator bool() ); } \ + \ + elT GetData() const \ + { return *m_iter; } \ + void SetData( elT e ) \ + { *m_iter = e; } \ + \ + compatibility_iterator GetNext() const \ + { \ + iterator i = m_iter; \ + return compatibility_iterator( m_list, ++i ); \ + } \ + compatibility_iterator GetPrevious() const \ + { \ + if ( m_iter == m_list->begin() ) \ + return compatibility_iterator(); \ + \ + iterator i = m_iter; \ + return compatibility_iterator( m_list, --i ); \ + } \ + int IndexOf() const \ + { \ + return *this ? (int)std::distance( m_list->begin(), m_iter ) \ + : wxNOT_FOUND; \ + } \ + }; \ + public: \ + liT() : m_destroy( false ) {} \ + \ + compatibility_iterator Find( const elT e ) const \ + { \ + liT* _this = const_cast< liT* >( this ); \ + return compatibility_iterator( _this, \ + std::find( _this->begin(), _this->end(), e ) ); \ + } \ + \ + bool IsEmpty() const \ + { return empty(); } \ + size_t GetCount() const \ + { return size(); } \ + int Number() const \ + { return static_cast< int >( GetCount() ); } \ + \ + compatibility_iterator Item( size_t idx ) const \ + { \ + iterator i = const_cast< liT* >(this)->begin(); \ + std::advance( i, idx ); \ + return compatibility_iterator( this, i ); \ + } \ + elT operator[](size_t idx) const \ + { \ + return Item(idx).GetData(); \ + } \ + \ + compatibility_iterator GetFirst() const \ + { \ + return compatibility_iterator( this, \ + const_cast< liT* >(this)->begin() ); \ + } \ + compatibility_iterator GetLast() const \ + { \ + iterator i = const_cast< liT* >(this)->end(); \ + return compatibility_iterator( this, !empty() ? --i : i ); \ + } \ + bool Member( elT e ) const \ + { return Find( e ); } \ + compatibility_iterator Nth( int n ) const \ + { return Item( n ); } \ + int IndexOf( elT e ) const \ + { return Find( e ).IndexOf(); } \ + \ + compatibility_iterator Append( elT e ) \ + { \ + push_back( e ); \ + return GetLast(); \ + } \ + compatibility_iterator Insert( elT e ) \ + { \ + push_front( e ); \ + return compatibility_iterator( this, begin() ); \ + } \ + compatibility_iterator Insert(const compatibility_iterator & i, elT e)\ + { \ + return compatibility_iterator( this, insert( i.m_iter, e ) ); \ + } \ + compatibility_iterator Insert( size_t idx, elT e ) \ + { \ + return compatibility_iterator( this, \ + insert( Item( idx ).m_iter, e ) ); \ + } \ + \ + void DeleteContents( bool destroy ) \ + { m_destroy = destroy; } \ + bool GetDeleteContents() const \ + { return m_destroy; } \ + void Erase( const compatibility_iterator& i ) \ + { \ + if ( m_destroy ) \ + _WX_LIST_HELPER_##liT::DeleteFunction( i->GetData() ); \ + erase( i.m_iter ); \ + } \ + bool DeleteNode( const compatibility_iterator& i ) \ + { \ + if( i ) \ + { \ + Erase( i ); \ + return true; \ + } \ + return false; \ + } \ + bool DeleteObject( elT e ) \ + { \ + return DeleteNode( Find( e ) ); \ + } \ + void Clear() \ + { \ + if ( m_destroy ) \ + std::for_each( begin(), end(), \ + _WX_LIST_HELPER_##liT::DeleteFunction ); \ + clear(); \ + } \ + /* Workaround for broken VC6 std::list::sort() see above */ \ + void Sort( wxSortCompareFunction compfunc ) \ + { sort( WX_LIST_SORTFUNCTION( elT, compfunc ) ); } \ + ~liT() { Clear(); } \ + \ + /* It needs access to our EmptyList */ \ + friend class compatibility_iterator; \ + } + +#define WX_DECLARE_LIST(elementtype, listname) \ + WX_DECLARE_LIST_WITH_DECL(elementtype, listname, class) +#define WX_DECLARE_LIST_PTR(elementtype, listname) \ + WX_DECLARE_LIST(elementtype, listname) + +#define WX_DECLARE_EXPORTED_LIST(elementtype, listname) \ + WX_DECLARE_LIST_WITH_DECL(elementtype, listname, class WXDLLIMPEXP_CORE) +#define WX_DECLARE_EXPORTED_LIST_PTR(elementtype, listname) \ + WX_DECLARE_EXPORTED_LIST(elementtype, listname) + +#define WX_DECLARE_USER_EXPORTED_LIST(elementtype, listname, usergoo) \ + WX_DECLARE_LIST_WITH_DECL(elementtype, listname, class usergoo) +#define WX_DECLARE_USER_EXPORTED_LIST_PTR(elementtype, listname, usergoo) \ + WX_DECLARE_USER_EXPORTED_LIST(elementtype, listname, usergoo) + +// this macro must be inserted in your program after +// #include "wx/listimpl.cpp" +#define WX_DEFINE_LIST(name) "don't forget to include listimpl.cpp!" + +#define WX_DEFINE_EXPORTED_LIST(name) WX_DEFINE_LIST(name) +#define WX_DEFINE_USER_EXPORTED_LIST(name) WX_DEFINE_LIST(name) + +#else // if !wxUSE_STD_CONTAINERS + + +// undef it to get rid of old, deprecated functions +#define wxLIST_COMPATIBILITY + +// ----------------------------------------------------------------------------- +// key stuff: a list may be optionally keyed on integer or string key +// ----------------------------------------------------------------------------- + +union wxListKeyValue +{ + long integer; + wxString *string; +}; + +// a struct which may contain both types of keys +// +// implementation note: on one hand, this class allows to have only one function +// for any keyed operation instead of 2 almost equivalent. OTOH, it's needed to +// resolve ambiguity which we would otherwise have with wxStringList::Find() and +// wxList::Find(const char *). +class WXDLLIMPEXP_BASE wxListKey +{ +public: + // implicit ctors + wxListKey() : m_keyType(wxKEY_NONE) + { } + wxListKey(long i) : m_keyType(wxKEY_INTEGER) + { m_key.integer = i; } + wxListKey(const wxString& s) : m_keyType(wxKEY_STRING) + { m_key.string = new wxString(s); } + wxListKey(const char *s) : m_keyType(wxKEY_STRING) + { m_key.string = new wxString(s); } + wxListKey(const wchar_t *s) : m_keyType(wxKEY_STRING) + { m_key.string = new wxString(s); } + + // accessors + wxKeyType GetKeyType() const { return m_keyType; } + const wxString GetString() const + { wxASSERT( m_keyType == wxKEY_STRING ); return *m_key.string; } + long GetNumber() const + { wxASSERT( m_keyType == wxKEY_INTEGER ); return m_key.integer; } + + // comparison + // Note: implementation moved to list.cpp to prevent BC++ inline + // expansion warning. + bool operator==(wxListKeyValue value) const ; + + // dtor + ~wxListKey() + { + if ( m_keyType == wxKEY_STRING ) + delete m_key.string; + } + +private: + wxKeyType m_keyType; + wxListKeyValue m_key; +}; + +// ----------------------------------------------------------------------------- +// wxNodeBase class is a (base for) node in a double linked list +// ----------------------------------------------------------------------------- + +extern WXDLLIMPEXP_DATA_BASE(wxListKey) wxDefaultListKey; + +class WXDLLIMPEXP_FWD_BASE wxListBase; + +class WXDLLIMPEXP_BASE wxNodeBase +{ +friend class wxListBase; +public: + // ctor + wxNodeBase(wxListBase *list = NULL, + wxNodeBase *previous = NULL, + wxNodeBase *next = NULL, + void *data = NULL, + const wxListKey& key = wxDefaultListKey); + + virtual ~wxNodeBase(); + + // FIXME no check is done that the list is really keyed on strings + wxString GetKeyString() const { return *m_key.string; } + long GetKeyInteger() const { return m_key.integer; } + + // Necessary for some existing code + void SetKeyString(const wxString& s) { m_key.string = new wxString(s); } + void SetKeyInteger(long i) { m_key.integer = i; } + +#ifdef wxLIST_COMPATIBILITY + // compatibility methods, use Get* instead. + wxDEPRECATED( wxNode *Next() const ); + wxDEPRECATED( wxNode *Previous() const ); + wxDEPRECATED( wxObject *Data() const ); +#endif // wxLIST_COMPATIBILITY + +protected: + // all these are going to be "overloaded" in the derived classes + wxNodeBase *GetNext() const { return m_next; } + wxNodeBase *GetPrevious() const { return m_previous; } + + void *GetData() const { return m_data; } + void SetData(void *data) { m_data = data; } + + // get 0-based index of this node within the list or wxNOT_FOUND + int IndexOf() const; + + virtual void DeleteData() { } +public: + // for wxList::iterator + void** GetDataPtr() const { return &(const_cast<wxNodeBase*>(this)->m_data); } +private: + // optional key stuff + wxListKeyValue m_key; + + void *m_data; // user data + wxNodeBase *m_next, // next and previous nodes in the list + *m_previous; + + wxListBase *m_list; // list we belong to + + wxDECLARE_NO_COPY_CLASS(wxNodeBase); +}; + +// ----------------------------------------------------------------------------- +// a double-linked list class +// ----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxList; + +class WXDLLIMPEXP_BASE wxListBase +{ +friend class wxNodeBase; // should be able to call DetachNode() +friend class wxHashTableBase; // should be able to call untyped Find() + +public: + // default ctor & dtor + wxListBase(wxKeyType keyType = wxKEY_NONE) + { Init(keyType); } + virtual ~wxListBase(); + + // accessors + // count of items in the list + size_t GetCount() const { return m_count; } + + // return true if this list is empty + bool IsEmpty() const { return m_count == 0; } + + // operations + + // delete all nodes + void Clear(); + + // instruct it to destroy user data when deleting nodes + void DeleteContents(bool destroy) { m_destroy = destroy; } + + // query if to delete + bool GetDeleteContents() const + { return m_destroy; } + + // get the keytype + wxKeyType GetKeyType() const + { return m_keyType; } + + // set the keytype (required by the serial code) + void SetKeyType(wxKeyType keyType) + { wxASSERT( m_count==0 ); m_keyType = keyType; } + +#ifdef wxLIST_COMPATIBILITY + // compatibility methods from old wxList + wxDEPRECATED( int Number() const ); // use GetCount instead. + wxDEPRECATED( wxNode *First() const ); // use GetFirst + wxDEPRECATED( wxNode *Last() const ); // use GetLast + wxDEPRECATED( wxNode *Nth(size_t n) const ); // use Item + + // kludge for typesafe list migration in core classes. + wxDEPRECATED( operator wxList&() const ); +#endif // wxLIST_COMPATIBILITY + +protected: + + // all methods here are "overloaded" in derived classes to provide compile + // time type checking + + // create a node for the list of this type + virtual wxNodeBase *CreateNode(wxNodeBase *prev, wxNodeBase *next, + void *data, + const wxListKey& key = wxDefaultListKey) = 0; + + + // ctors + // from an array + wxListBase(size_t count, void *elements[]); + // from a sequence of objects + wxListBase(void *object, ... /* terminate with NULL */); + +protected: + void Assign(const wxListBase& list) + { Clear(); DoCopy(list); } + + // get list head/tail + wxNodeBase *GetFirst() const { return m_nodeFirst; } + wxNodeBase *GetLast() const { return m_nodeLast; } + + // by (0-based) index + wxNodeBase *Item(size_t index) const; + + // get the list item's data + void *operator[](size_t n) const + { + wxNodeBase *node = Item(n); + + return node ? node->GetData() : NULL; + } + + // operations + // append to end of list + wxNodeBase *Prepend(void *object) + { return (wxNodeBase *)wxListBase::Insert(object); } + // append to beginning of list + wxNodeBase *Append(void *object); + // insert a new item at the beginning of the list + wxNodeBase *Insert(void *object) + { return Insert(static_cast<wxNodeBase *>(NULL), object); } + // insert a new item at the given position + wxNodeBase *Insert(size_t pos, void *object) + { return pos == GetCount() ? Append(object) + : Insert(Item(pos), object); } + // insert before given node or at front of list if prev == NULL + wxNodeBase *Insert(wxNodeBase *prev, void *object); + + // keyed append + wxNodeBase *Append(long key, void *object); + wxNodeBase *Append(const wxString& key, void *object); + + // removes node from the list but doesn't delete it (returns pointer + // to the node or NULL if it wasn't found in the list) + wxNodeBase *DetachNode(wxNodeBase *node); + // delete element from list, returns false if node not found + bool DeleteNode(wxNodeBase *node); + // finds object pointer and deletes node (and object if DeleteContents + // is on), returns false if object not found + bool DeleteObject(void *object); + + // search (all return NULL if item not found) + // by data + wxNodeBase *Find(const void *object) const; + + // by key + wxNodeBase *Find(const wxListKey& key) const; + + // get 0-based index of object or wxNOT_FOUND + int IndexOf( void *object ) const; + + // this function allows the sorting of arbitrary lists by giving + // a function to compare two list elements. The list is sorted in place. + void Sort(const wxSortCompareFunction compfunc); + + // functions for iterating over the list + void *FirstThat(wxListIterateFunction func); + void ForEach(wxListIterateFunction func); + void *LastThat(wxListIterateFunction func); + + // for STL interface, "last" points to one after the last node + // of the controlled sequence (NULL for the end of the list) + void Reverse(); + void DeleteNodes(wxNodeBase* first, wxNodeBase* last); +private: + + // common part of all ctors + void Init(wxKeyType keyType = wxKEY_NONE); + + // helpers + // common part of copy ctor and assignment operator + void DoCopy(const wxListBase& list); + // common part of all Append()s + wxNodeBase *AppendCommon(wxNodeBase *node); + // free node's data and node itself + void DoDeleteNode(wxNodeBase *node); + + size_t m_count; // number of elements in the list + bool m_destroy; // destroy user data when deleting list items? + wxNodeBase *m_nodeFirst, // pointers to the head and tail of the list + *m_nodeLast; + + wxKeyType m_keyType; // type of our keys (may be wxKEY_NONE) +}; + +// ----------------------------------------------------------------------------- +// macros for definition of "template" list type +// ----------------------------------------------------------------------------- + +// and now some heavy magic... + +// declare a list type named 'name' and containing elements of type 'T *' +// (as a by product of macro expansion you also get wx##name##Node +// wxNode-derived type) +// +// implementation details: +// 1. We define _WX_LIST_ITEM_TYPE_##name typedef to save in it the item type +// for the list of given type - this allows us to pass only the list name +// to WX_DEFINE_LIST() even if it needs both the name and the type +// +// 2. We redefine all non-type-safe wxList functions with type-safe versions +// which don't take any space (everything is inline), but bring compile +// time error checking. +// +// 3. The macro which is usually used (WX_DECLARE_LIST) is defined in terms of +// a more generic WX_DECLARE_LIST_2 macro which, in turn, uses the most +// generic WX_DECLARE_LIST_3 one. The last macro adds a sometimes +// interesting capability to store polymorphic objects in the list and is +// particularly useful with, for example, "wxWindow *" list where the +// wxWindowBase pointers are put into the list, but wxWindow pointers are +// retrieved from it. +// +// 4. final hack is that WX_DECLARE_LIST_3 is defined in terms of +// WX_DECLARE_LIST_4 to allow defining classes without operator->() as +// it results in compiler warnings when this operator doesn't make sense +// (i.e. stored elements are not pointers) + +// common part of WX_DECLARE_LIST_3 and WX_DECLARE_LIST_PTR_3 +#define WX_DECLARE_LIST_4(T, Tbase, name, nodetype, classexp, ptrop) \ + typedef int (*wxSortFuncFor_##name)(const T **, const T **); \ + \ + classexp nodetype : public wxNodeBase \ + { \ + public: \ + nodetype(wxListBase *list = NULL, \ + nodetype *previous = NULL, \ + nodetype *next = NULL, \ + T *data = NULL, \ + const wxListKey& key = wxDefaultListKey) \ + : wxNodeBase(list, previous, next, data, key) { } \ + \ + nodetype *GetNext() const \ + { return (nodetype *)wxNodeBase::GetNext(); } \ + nodetype *GetPrevious() const \ + { return (nodetype *)wxNodeBase::GetPrevious(); } \ + \ + T *GetData() const \ + { return (T *)wxNodeBase::GetData(); } \ + void SetData(T *data) \ + { wxNodeBase::SetData(data); } \ + \ + protected: \ + virtual void DeleteData(); \ + \ + DECLARE_NO_COPY_CLASS(nodetype) \ + }; \ + \ + classexp name : public wxListBase \ + { \ + public: \ + typedef nodetype Node; \ + classexp compatibility_iterator \ + { \ + public: \ + compatibility_iterator(Node *ptr = NULL) : m_ptr(ptr) { } \ + \ + Node *operator->() const { return m_ptr; } \ + operator Node *() const { return m_ptr; } \ + \ + private: \ + Node *m_ptr; \ + }; \ + \ + name(wxKeyType keyType = wxKEY_NONE) : wxListBase(keyType) \ + { } \ + name(const name& list) : wxListBase(list.GetKeyType()) \ + { Assign(list); } \ + name(size_t count, T *elements[]) \ + : wxListBase(count, (void **)elements) { } \ + \ + name& operator=(const name& list) \ + { if (&list != this) Assign(list); return *this; } \ + \ + nodetype *GetFirst() const \ + { return (nodetype *)wxListBase::GetFirst(); } \ + nodetype *GetLast() const \ + { return (nodetype *)wxListBase::GetLast(); } \ + \ + nodetype *Item(size_t index) const \ + { return (nodetype *)wxListBase::Item(index); } \ + \ + T *operator[](size_t index) const \ + { \ + nodetype *node = Item(index); \ + return node ? (T*)(node->GetData()) : NULL; \ + } \ + \ + nodetype *Append(Tbase *object) \ + { return (nodetype *)wxListBase::Append(object); } \ + nodetype *Insert(Tbase *object) \ + { return (nodetype *)Insert(static_cast<nodetype *>(NULL), \ + object); } \ + nodetype *Insert(size_t pos, Tbase *object) \ + { return (nodetype *)wxListBase::Insert(pos, object); } \ + nodetype *Insert(nodetype *prev, Tbase *object) \ + { return (nodetype *)wxListBase::Insert(prev, object); } \ + \ + nodetype *Append(long key, void *object) \ + { return (nodetype *)wxListBase::Append(key, object); } \ + nodetype *Append(const wxChar *key, void *object) \ + { return (nodetype *)wxListBase::Append(key, object); } \ + \ + nodetype *DetachNode(nodetype *node) \ + { return (nodetype *)wxListBase::DetachNode(node); } \ + bool DeleteNode(nodetype *node) \ + { return wxListBase::DeleteNode(node); } \ + bool DeleteObject(Tbase *object) \ + { return wxListBase::DeleteObject(object); } \ + void Erase(nodetype *it) \ + { DeleteNode(it); } \ + \ + nodetype *Find(const Tbase *object) const \ + { return (nodetype *)wxListBase::Find(object); } \ + \ + virtual nodetype *Find(const wxListKey& key) const \ + { return (nodetype *)wxListBase::Find(key); } \ + \ + bool Member(const Tbase *object) const \ + { return Find(object) != NULL; } \ + \ + int IndexOf(Tbase *object) const \ + { return wxListBase::IndexOf(object); } \ + \ + void Sort(wxSortCompareFunction func) \ + { wxListBase::Sort(func); } \ + void Sort(wxSortFuncFor_##name func) \ + { Sort((wxSortCompareFunction)func); } \ + \ + protected: \ + virtual wxNodeBase *CreateNode(wxNodeBase *prev, wxNodeBase *next, \ + void *data, \ + const wxListKey& key = wxDefaultListKey) \ + { \ + return new nodetype(this, \ + (nodetype *)prev, (nodetype *)next, \ + (T *)data, key); \ + } \ + /* STL interface */ \ + public: \ + typedef size_t size_type; \ + typedef int difference_type; \ + typedef T* value_type; \ + typedef Tbase* base_value_type; \ + typedef value_type& reference; \ + typedef const value_type& const_reference; \ + typedef base_value_type& base_reference; \ + typedef const base_value_type& const_base_reference; \ + \ + classexp iterator \ + { \ + typedef name list; \ + public: \ + typedef nodetype Node; \ + typedef iterator itor; \ + typedef T* value_type; \ + typedef value_type* ptr_type; \ + typedef value_type& reference; \ + \ + Node* m_node; \ + Node* m_init; \ + public: \ + typedef reference reference_type; \ + typedef ptr_type pointer_type; \ + \ + iterator(Node* node, Node* init) : m_node(node), m_init(init) {}\ + iterator() : m_node(NULL), m_init(NULL) { } \ + reference_type operator*() const \ + { return *(pointer_type)m_node->GetDataPtr(); } \ + ptrop \ + itor& operator++() \ + { \ + wxASSERT_MSG( m_node, wxT("uninitialized iterator") ); \ + m_node = m_node->GetNext(); \ + return *this; \ + } \ + const itor operator++(int) \ + { \ + itor tmp = *this; \ + wxASSERT_MSG( m_node, wxT("uninitialized iterator") ); \ + m_node = m_node->GetNext(); \ + return tmp; \ + } \ + itor& operator--() \ + { \ + m_node = m_node ? m_node->GetPrevious() : m_init; \ + return *this; \ + } \ + const itor operator--(int) \ + { \ + itor tmp = *this; \ + m_node = m_node ? m_node->GetPrevious() : m_init; \ + return tmp; \ + } \ + bool operator!=(const itor& it) const \ + { return it.m_node != m_node; } \ + bool operator==(const itor& it) const \ + { return it.m_node == m_node; } \ + }; \ + classexp const_iterator \ + { \ + typedef name list; \ + public: \ + typedef nodetype Node; \ + typedef T* value_type; \ + typedef const value_type& const_reference; \ + typedef const_iterator itor; \ + typedef value_type* ptr_type; \ + \ + Node* m_node; \ + Node* m_init; \ + public: \ + typedef const_reference reference_type; \ + typedef const ptr_type pointer_type; \ + \ + const_iterator(Node* node, Node* init) \ + : m_node(node), m_init(init) { } \ + const_iterator() : m_node(NULL), m_init(NULL) { } \ + const_iterator(const iterator& it) \ + : m_node(it.m_node), m_init(it.m_init) { } \ + reference_type operator*() const \ + { return *(pointer_type)m_node->GetDataPtr(); } \ + ptrop \ + itor& operator++() \ + { \ + wxASSERT_MSG( m_node, wxT("uninitialized iterator") ); \ + m_node = m_node->GetNext(); \ + return *this; \ + } \ + const itor operator++(int) \ + { \ + itor tmp = *this; \ + wxASSERT_MSG( m_node, wxT("uninitialized iterator") ); \ + m_node = m_node->GetNext(); \ + return tmp; \ + } \ + itor& operator--() \ + { \ + m_node = m_node ? m_node->GetPrevious() : m_init; \ + return *this; \ + } \ + const itor operator--(int) \ + { \ + itor tmp = *this; \ + m_node = m_node ? m_node->GetPrevious() : m_init; \ + return tmp; \ + } \ + bool operator!=(const itor& it) const \ + { return it.m_node != m_node; } \ + bool operator==(const itor& it) const \ + { return it.m_node == m_node; } \ + }; \ + classexp reverse_iterator \ + { \ + typedef name list; \ + public: \ + typedef nodetype Node; \ + typedef T* value_type; \ + typedef reverse_iterator itor; \ + typedef value_type* ptr_type; \ + typedef value_type& reference; \ + \ + Node* m_node; \ + Node* m_init; \ + public: \ + typedef reference reference_type; \ + typedef ptr_type pointer_type; \ + \ + reverse_iterator(Node* node, Node* init) \ + : m_node(node), m_init(init) { } \ + reverse_iterator() : m_node(NULL), m_init(NULL) { } \ + reference_type operator*() const \ + { return *(pointer_type)m_node->GetDataPtr(); } \ + ptrop \ + itor& operator++() \ + { m_node = m_node->GetPrevious(); return *this; } \ + const itor operator++(int) \ + { itor tmp = *this; m_node = m_node->GetPrevious(); return tmp; }\ + itor& operator--() \ + { m_node = m_node ? m_node->GetNext() : m_init; return *this; } \ + const itor operator--(int) \ + { \ + itor tmp = *this; \ + m_node = m_node ? m_node->GetNext() : m_init; \ + return tmp; \ + } \ + bool operator!=(const itor& it) const \ + { return it.m_node != m_node; } \ + bool operator==(const itor& it) const \ + { return it.m_node == m_node; } \ + }; \ + classexp const_reverse_iterator \ + { \ + typedef name list; \ + public: \ + typedef nodetype Node; \ + typedef T* value_type; \ + typedef const_reverse_iterator itor; \ + typedef value_type* ptr_type; \ + typedef const value_type& const_reference; \ + \ + Node* m_node; \ + Node* m_init; \ + public: \ + typedef const_reference reference_type; \ + typedef const ptr_type pointer_type; \ + \ + const_reverse_iterator(Node* node, Node* init) \ + : m_node(node), m_init(init) { } \ + const_reverse_iterator() : m_node(NULL), m_init(NULL) { } \ + const_reverse_iterator(const reverse_iterator& it) \ + : m_node(it.m_node), m_init(it.m_init) { } \ + reference_type operator*() const \ + { return *(pointer_type)m_node->GetDataPtr(); } \ + ptrop \ + itor& operator++() \ + { m_node = m_node->GetPrevious(); return *this; } \ + const itor operator++(int) \ + { itor tmp = *this; m_node = m_node->GetPrevious(); return tmp; }\ + itor& operator--() \ + { m_node = m_node ? m_node->GetNext() : m_init; return *this;}\ + const itor operator--(int) \ + { \ + itor tmp = *this; \ + m_node = m_node ? m_node->GetNext() : m_init; \ + return tmp; \ + } \ + bool operator!=(const itor& it) const \ + { return it.m_node != m_node; } \ + bool operator==(const itor& it) const \ + { return it.m_node == m_node; } \ + }; \ + \ + wxEXPLICIT name(size_type n, const_reference v = value_type()) \ + { assign(n, v); } \ + name(const const_iterator& first, const const_iterator& last) \ + { assign(first, last); } \ + iterator begin() { return iterator(GetFirst(), GetLast()); } \ + const_iterator begin() const \ + { return const_iterator(GetFirst(), GetLast()); } \ + iterator end() { return iterator(NULL, GetLast()); } \ + const_iterator end() const { return const_iterator(NULL, GetLast()); }\ + reverse_iterator rbegin() \ + { return reverse_iterator(GetLast(), GetFirst()); } \ + const_reverse_iterator rbegin() const \ + { return const_reverse_iterator(GetLast(), GetFirst()); } \ + reverse_iterator rend() { return reverse_iterator(NULL, GetFirst()); }\ + const_reverse_iterator rend() const \ + { return const_reverse_iterator(NULL, GetFirst()); } \ + void resize(size_type n, value_type v = value_type()) \ + { \ + while (n < size()) \ + pop_back(); \ + while (n > size()) \ + push_back(v); \ + } \ + size_type size() const { return GetCount(); } \ + size_type max_size() const { return INT_MAX; } \ + bool empty() const { return IsEmpty(); } \ + reference front() { return *begin(); } \ + const_reference front() const { return *begin(); } \ + reference back() { iterator tmp = end(); return *--tmp; } \ + const_reference back() const { const_iterator tmp = end(); return *--tmp; }\ + void push_front(const_reference v = value_type()) \ + { Insert(GetFirst(), (const_base_reference)v); } \ + void pop_front() { DeleteNode(GetFirst()); } \ + void push_back(const_reference v = value_type()) \ + { Append((const_base_reference)v); } \ + void pop_back() { DeleteNode(GetLast()); } \ + void assign(const_iterator first, const const_iterator& last) \ + { \ + clear(); \ + for(; first != last; ++first) \ + Append((const_base_reference)*first); \ + } \ + void assign(size_type n, const_reference v = value_type()) \ + { \ + clear(); \ + for(size_type i = 0; i < n; ++i) \ + Append((const_base_reference)v); \ + } \ + iterator insert(const iterator& it, const_reference v) \ + { \ + if ( it == end() ) \ + { \ + Append((const_base_reference)v); \ + /* \ + note that this is the new end(), the old one was \ + invalidated by the Append() call, and this is why we \ + can't use the same code as in the normal case below \ + */ \ + iterator itins(end()); \ + return --itins; \ + } \ + else \ + { \ + Insert(it.m_node, (const_base_reference)v); \ + iterator itins(it); \ + return --itins; \ + } \ + } \ + void insert(const iterator& it, size_type n, const_reference v) \ + { \ + for(size_type i = 0; i < n; ++i) \ + insert(it, v); \ + } \ + void insert(const iterator& it, \ + const_iterator first, const const_iterator& last) \ + { \ + for(; first != last; ++first) \ + insert(it, *first); \ + } \ + iterator erase(const iterator& it) \ + { \ + iterator next = iterator(it.m_node->GetNext(), GetLast()); \ + DeleteNode(it.m_node); return next; \ + } \ + iterator erase(const iterator& first, const iterator& last) \ + { \ + iterator next = last; \ + if ( next != end() ) \ + ++next; \ + DeleteNodes(first.m_node, last.m_node); \ + return next; \ + } \ + void clear() { Clear(); } \ + void splice(const iterator& it, name& l, const iterator& first, const iterator& last)\ + { insert(it, first, last); l.erase(first, last); } \ + void splice(const iterator& it, name& l) \ + { splice(it, l, l.begin(), l.end() ); } \ + void splice(const iterator& it, name& l, const iterator& first) \ + { \ + if ( it != first ) \ + { \ + insert(it, *first); \ + l.erase(first); \ + } \ + } \ + void remove(const_reference v) \ + { DeleteObject((const_base_reference)v); } \ + void reverse() \ + { Reverse(); } \ + /* void swap(name& l) \ + { \ + { size_t t = m_count; m_count = l.m_count; l.m_count = t; } \ + { bool t = m_destroy; m_destroy = l.m_destroy; l.m_destroy = t; }\ + { wxNodeBase* t = m_nodeFirst; m_nodeFirst = l.m_nodeFirst; l.m_nodeFirst = t; }\ + { wxNodeBase* t = m_nodeLast; m_nodeLast = l.m_nodeLast; l.m_nodeLast = t; }\ + { wxKeyType t = m_keyType; m_keyType = l.m_keyType; l.m_keyType = t; }\ + } */ \ + } + +#define WX_LIST_PTROP \ + pointer_type operator->() const \ + { return (pointer_type)m_node->GetDataPtr(); } +#define WX_LIST_PTROP_NONE + +#define WX_DECLARE_LIST_3(T, Tbase, name, nodetype, classexp) \ + WX_DECLARE_LIST_4(T, Tbase, name, nodetype, classexp, WX_LIST_PTROP_NONE) +#define WX_DECLARE_LIST_PTR_3(T, Tbase, name, nodetype, classexp) \ + WX_DECLARE_LIST_4(T, Tbase, name, nodetype, classexp, WX_LIST_PTROP) + +#define WX_DECLARE_LIST_2(elementtype, listname, nodename, classexp) \ + WX_DECLARE_LIST_3(elementtype, elementtype, listname, nodename, classexp) +#define WX_DECLARE_LIST_PTR_2(elementtype, listname, nodename, classexp) \ + WX_DECLARE_LIST_PTR_3(elementtype, elementtype, listname, nodename, classexp) + +#define WX_DECLARE_LIST(elementtype, listname) \ + typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ + WX_DECLARE_LIST_2(elementtype, listname, wx##listname##Node, class) +#define WX_DECLARE_LIST_PTR(elementtype, listname) \ + typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ + WX_DECLARE_LIST_PTR_2(elementtype, listname, wx##listname##Node, class) + +#define WX_DECLARE_LIST_WITH_DECL(elementtype, listname, decl) \ + typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ + WX_DECLARE_LIST_2(elementtype, listname, wx##listname##Node, decl) + +#define WX_DECLARE_EXPORTED_LIST(elementtype, listname) \ + WX_DECLARE_LIST_WITH_DECL(elementtype, listname, class WXDLLIMPEXP_CORE) + +#define WX_DECLARE_EXPORTED_LIST_PTR(elementtype, listname) \ + typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ + WX_DECLARE_LIST_PTR_2(elementtype, listname, wx##listname##Node, class WXDLLIMPEXP_CORE) + +#define WX_DECLARE_USER_EXPORTED_LIST(elementtype, listname, usergoo) \ + typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ + WX_DECLARE_LIST_2(elementtype, listname, wx##listname##Node, class usergoo) +#define WX_DECLARE_USER_EXPORTED_LIST_PTR(elementtype, listname, usergoo) \ + typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ + WX_DECLARE_LIST_PTR_2(elementtype, listname, wx##listname##Node, class usergoo) + +// this macro must be inserted in your program after +// #include "wx/listimpl.cpp" +#define WX_DEFINE_LIST(name) "don't forget to include listimpl.cpp!" + +#define WX_DEFINE_EXPORTED_LIST(name) WX_DEFINE_LIST(name) +#define WX_DEFINE_USER_EXPORTED_LIST(name) WX_DEFINE_LIST(name) + +#endif // !wxUSE_STD_CONTAINERS + +// ============================================================================ +// now we can define classes 100% compatible with the old ones +// ============================================================================ + +// ---------------------------------------------------------------------------- +// commonly used list classes +// ---------------------------------------------------------------------------- + +#if defined(wxLIST_COMPATIBILITY) + +// inline compatibility functions + +#if !wxUSE_STD_CONTAINERS + +// ---------------------------------------------------------------------------- +// wxNodeBase deprecated methods +// ---------------------------------------------------------------------------- + +inline wxNode *wxNodeBase::Next() const { return (wxNode *)GetNext(); } +inline wxNode *wxNodeBase::Previous() const { return (wxNode *)GetPrevious(); } +inline wxObject *wxNodeBase::Data() const { return (wxObject *)GetData(); } + +// ---------------------------------------------------------------------------- +// wxListBase deprecated methods +// ---------------------------------------------------------------------------- + +inline int wxListBase::Number() const { return (int)GetCount(); } +inline wxNode *wxListBase::First() const { return (wxNode *)GetFirst(); } +inline wxNode *wxListBase::Last() const { return (wxNode *)GetLast(); } +inline wxNode *wxListBase::Nth(size_t n) const { return (wxNode *)Item(n); } +inline wxListBase::operator wxList&() const { return *(wxList*)this; } + +#endif + +// define this to make a lot of noise about use of the old wxList classes. +//#define wxWARN_COMPAT_LIST_USE + +// ---------------------------------------------------------------------------- +// wxList compatibility class: in fact, it's a list of wxObjects +// ---------------------------------------------------------------------------- + +WX_DECLARE_LIST_2(wxObject, wxObjectList, wxObjectListNode, + class WXDLLIMPEXP_BASE); + +class WXDLLIMPEXP_BASE wxList : public wxObjectList +{ +public: +#if defined(wxWARN_COMPAT_LIST_USE) && !wxUSE_STD_CONTAINERS + wxList() { } + wxDEPRECATED( wxList(int key_type) ); +#elif !wxUSE_STD_CONTAINERS + wxList(int key_type = wxKEY_NONE); +#endif + + // this destructor is required for Darwin + ~wxList() { } + +#if !wxUSE_STD_CONTAINERS + wxList& operator=(const wxList& list) + { if (&list != this) Assign(list); return *this; } + + // compatibility methods + void Sort(wxSortCompareFunction compfunc) { wxListBase::Sort(compfunc); } +#endif // !wxUSE_STD_CONTAINERS + +#ifndef __VISUALC6__ + template<typename T> + wxVector<T> AsVector() const + { + wxVector<T> vector(size()); + size_t i = 0; + + for ( const_iterator it = begin(); it != end(); ++it ) + { + vector[i++] = static_cast<T>(*it); + } + + return vector; + } +#endif // !__VISUALC6__ + +}; + +#if !wxUSE_STD_CONTAINERS + +// ----------------------------------------------------------------------------- +// wxStringList class for compatibility with the old code +// ----------------------------------------------------------------------------- +WX_DECLARE_LIST_2(wxChar, wxStringListBase, wxStringListNode, class WXDLLIMPEXP_BASE); + +class WXDLLIMPEXP_BASE wxStringList : public wxStringListBase +{ +public: + // ctors and such + // default +#ifdef wxWARN_COMPAT_LIST_USE + wxStringList(); + wxDEPRECATED( wxStringList(const wxChar *first ...) ); // FIXME-UTF8 +#else + wxStringList(); + wxStringList(const wxChar *first ...); // FIXME-UTF8 +#endif + + // copying the string list: the strings are copied, too (extremely + // inefficient!) + wxStringList(const wxStringList& other) : wxStringListBase() { DeleteContents(true); DoCopy(other); } + wxStringList& operator=(const wxStringList& other) + { + if (&other != this) + { + Clear(); + DoCopy(other); + } + return *this; + } + + // operations + // makes a copy of the string + wxNode *Add(const wxChar *s); + + // Append to beginning of list + wxNode *Prepend(const wxChar *s); + + bool Delete(const wxChar *s); + + wxChar **ListToArray(bool new_copies = false) const; + bool Member(const wxChar *s) const; + + // alphabetic sort + void Sort(); + +private: + void DoCopy(const wxStringList&); // common part of copy ctor and operator= +}; + +#else // if wxUSE_STD_CONTAINERS + +WX_DECLARE_LIST_XO(wxString, wxStringListBase, class WXDLLIMPEXP_BASE); + +class WXDLLIMPEXP_BASE wxStringList : public wxStringListBase +{ +public: + compatibility_iterator Append(wxChar* s) + { wxString tmp = s; delete[] s; return wxStringListBase::Append(tmp); } + compatibility_iterator Insert(wxChar* s) + { wxString tmp = s; delete[] s; return wxStringListBase::Insert(tmp); } + compatibility_iterator Insert(size_t pos, wxChar* s) + { + wxString tmp = s; + delete[] s; + return wxStringListBase::Insert(pos, tmp); + } + compatibility_iterator Add(const wxChar* s) + { push_back(s); return GetLast(); } + compatibility_iterator Prepend(const wxChar* s) + { push_front(s); return GetFirst(); } +}; + +#endif // wxUSE_STD_CONTAINERS + +#endif // wxLIST_COMPATIBILITY + +// delete all list elements +// +// NB: the class declaration of the list elements must be visible from the +// place where you use this macro, otherwise the proper destructor may not +// be called (a decent compiler should give a warning about it, but don't +// count on it)! +#define WX_CLEAR_LIST(type, list) \ + { \ + type::iterator it, en; \ + for( it = (list).begin(), en = (list).end(); it != en; ++it ) \ + delete *it; \ + (list).clear(); \ + } + +// append all element of one list to another one +#define WX_APPEND_LIST(list, other) \ + { \ + wxList::compatibility_iterator node = other->GetFirst(); \ + while ( node ) \ + { \ + (list)->push_back(node->GetData()); \ + node = node->GetNext(); \ + } \ + } + +#endif // _WX_LISTH__ diff --git a/wxmsw/include/wx-3.0/wx/listbase.h b/wxmsw/include/wx-3.0/wx/listbase.h new file mode 100644 index 00000000..5e6fb7ca --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/listbase.h @@ -0,0 +1,625 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/listbase.h +// Purpose: wxListCtrl class +// Author: Vadim Zeitlin +// Modified by: +// Created: 04.12.99 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LISTBASE_H_BASE_ +#define _WX_LISTBASE_H_BASE_ + +#include "wx/colour.h" +#include "wx/font.h" +#include "wx/gdicmn.h" +#include "wx/event.h" +#include "wx/control.h" + +class WXDLLIMPEXP_FWD_CORE wxImageList; + +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +// type of compare function for wxListCtrl sort operation +typedef +int (wxCALLBACK *wxListCtrlCompare)(wxIntPtr item1, wxIntPtr item2, wxIntPtr sortData); + +// ---------------------------------------------------------------------------- +// wxListCtrl constants +// ---------------------------------------------------------------------------- + +// style flags +#define wxLC_VRULES 0x0001 +#define wxLC_HRULES 0x0002 + +#define wxLC_ICON 0x0004 +#define wxLC_SMALL_ICON 0x0008 +#define wxLC_LIST 0x0010 +#define wxLC_REPORT 0x0020 + +#define wxLC_ALIGN_TOP 0x0040 +#define wxLC_ALIGN_LEFT 0x0080 +#define wxLC_AUTOARRANGE 0x0100 +#define wxLC_VIRTUAL 0x0200 +#define wxLC_EDIT_LABELS 0x0400 +#define wxLC_NO_HEADER 0x0800 +#define wxLC_NO_SORT_HEADER 0x1000 +#define wxLC_SINGLE_SEL 0x2000 +#define wxLC_SORT_ASCENDING 0x4000 +#define wxLC_SORT_DESCENDING 0x8000 + +#define wxLC_MASK_TYPE (wxLC_ICON | wxLC_SMALL_ICON | wxLC_LIST | wxLC_REPORT) +#define wxLC_MASK_ALIGN (wxLC_ALIGN_TOP | wxLC_ALIGN_LEFT) +#define wxLC_MASK_SORT (wxLC_SORT_ASCENDING | wxLC_SORT_DESCENDING) + +// for compatibility only +#define wxLC_USER_TEXT wxLC_VIRTUAL + +// Omitted because +// (a) too much detail +// (b) not enough style flags +// (c) not implemented anyhow in the generic version +// +// #define wxLC_NO_SCROLL +// #define wxLC_NO_LABEL_WRAP +// #define wxLC_OWNERDRAW_FIXED +// #define wxLC_SHOW_SEL_ALWAYS + +// Mask flags to tell app/GUI what fields of wxListItem are valid +#define wxLIST_MASK_STATE 0x0001 +#define wxLIST_MASK_TEXT 0x0002 +#define wxLIST_MASK_IMAGE 0x0004 +#define wxLIST_MASK_DATA 0x0008 +#define wxLIST_SET_ITEM 0x0010 +#define wxLIST_MASK_WIDTH 0x0020 +#define wxLIST_MASK_FORMAT 0x0040 + +// State flags for indicating the state of an item +#define wxLIST_STATE_DONTCARE 0x0000 +#define wxLIST_STATE_DROPHILITED 0x0001 // MSW only +#define wxLIST_STATE_FOCUSED 0x0002 +#define wxLIST_STATE_SELECTED 0x0004 +#define wxLIST_STATE_CUT 0x0008 // MSW only +#define wxLIST_STATE_DISABLED 0x0010 // OS2 only +#define wxLIST_STATE_FILTERED 0x0020 // OS2 only +#define wxLIST_STATE_INUSE 0x0040 // OS2 only +#define wxLIST_STATE_PICKED 0x0080 // OS2 only +#define wxLIST_STATE_SOURCE 0x0100 // OS2 only + +// Hit test flags, used in HitTest +#define wxLIST_HITTEST_ABOVE 0x0001 // Above the client area. +#define wxLIST_HITTEST_BELOW 0x0002 // Below the client area. +#define wxLIST_HITTEST_NOWHERE 0x0004 // In the client area but below the last item. +#define wxLIST_HITTEST_ONITEMICON 0x0020 // On the bitmap associated with an item. +#define wxLIST_HITTEST_ONITEMLABEL 0x0080 // On the label (string) associated with an item. +#define wxLIST_HITTEST_ONITEMRIGHT 0x0100 // In the area to the right of an item. +#define wxLIST_HITTEST_ONITEMSTATEICON 0x0200 // On the state icon for a tree view item that is in a user-defined state. +#define wxLIST_HITTEST_TOLEFT 0x0400 // To the left of the client area. +#define wxLIST_HITTEST_TORIGHT 0x0800 // To the right of the client area. + +#define wxLIST_HITTEST_ONITEM (wxLIST_HITTEST_ONITEMICON | wxLIST_HITTEST_ONITEMLABEL | wxLIST_HITTEST_ONITEMSTATEICON) + +// GetSubItemRect constants +#define wxLIST_GETSUBITEMRECT_WHOLEITEM -1l + +// Flags for GetNextItem (MSW only except wxLIST_NEXT_ALL) +enum +{ + wxLIST_NEXT_ABOVE, // Searches for an item above the specified item + wxLIST_NEXT_ALL, // Searches for subsequent item by index + wxLIST_NEXT_BELOW, // Searches for an item below the specified item + wxLIST_NEXT_LEFT, // Searches for an item to the left of the specified item + wxLIST_NEXT_RIGHT // Searches for an item to the right of the specified item +}; + +// Alignment flags for Arrange (MSW only except wxLIST_ALIGN_LEFT) +enum +{ + wxLIST_ALIGN_DEFAULT, + wxLIST_ALIGN_LEFT, + wxLIST_ALIGN_TOP, + wxLIST_ALIGN_SNAP_TO_GRID +}; + +// Column format (MSW only except wxLIST_FORMAT_LEFT) +enum wxListColumnFormat +{ + wxLIST_FORMAT_LEFT, + wxLIST_FORMAT_RIGHT, + wxLIST_FORMAT_CENTRE, + wxLIST_FORMAT_CENTER = wxLIST_FORMAT_CENTRE +}; + +// Autosize values for SetColumnWidth +enum +{ + wxLIST_AUTOSIZE = -1, + wxLIST_AUTOSIZE_USEHEADER = -2 // partly supported by generic version +}; + +// Flag values for GetItemRect +enum +{ + wxLIST_RECT_BOUNDS, + wxLIST_RECT_ICON, + wxLIST_RECT_LABEL +}; + +// Flag values for FindItem (MSW only) +enum +{ + wxLIST_FIND_UP, + wxLIST_FIND_DOWN, + wxLIST_FIND_LEFT, + wxLIST_FIND_RIGHT +}; + +// ---------------------------------------------------------------------------- +// wxListItemAttr: a structure containing the visual attributes of an item +// ---------------------------------------------------------------------------- + +// TODO: this should be renamed to wxItemAttr or something general like this +// and used as base class for wxTextAttr which duplicates this class +// entirely currently +class WXDLLIMPEXP_CORE wxListItemAttr +{ +public: + // ctors + wxListItemAttr() { } + wxListItemAttr(const wxColour& colText, + const wxColour& colBack, + const wxFont& font) + : m_colText(colText), m_colBack(colBack), m_font(font) + { + } + + // default copy ctor, assignment operator and dtor are ok + + + // setters + void SetTextColour(const wxColour& colText) { m_colText = colText; } + void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; } + void SetFont(const wxFont& font) { m_font = font; } + + // accessors + bool HasTextColour() const { return m_colText.IsOk(); } + bool HasBackgroundColour() const { return m_colBack.IsOk(); } + bool HasFont() const { return m_font.IsOk(); } + + const wxColour& GetTextColour() const { return m_colText; } + const wxColour& GetBackgroundColour() const { return m_colBack; } + const wxFont& GetFont() const { return m_font; } + + + // this is almost like assignment operator except it doesn't overwrite the + // fields unset in the source attribute + void AssignFrom(const wxListItemAttr& source) + { + if ( source.HasTextColour() ) + SetTextColour(source.GetTextColour()); + if ( source.HasBackgroundColour() ) + SetBackgroundColour(source.GetBackgroundColour()); + if ( source.HasFont() ) + SetFont(source.GetFont()); + } + +private: + wxColour m_colText, + m_colBack; + wxFont m_font; +}; + +// ---------------------------------------------------------------------------- +// wxListItem: the item or column info, used to exchange data with wxListCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxListItem : public wxObject +{ +public: + wxListItem() { Init(); m_attr = NULL; } + wxListItem(const wxListItem& item) + : wxObject(), + m_mask(item.m_mask), + m_itemId(item.m_itemId), + m_col(item.m_col), + m_state(item.m_state), + m_stateMask(item.m_stateMask), + m_text(item.m_text), + m_image(item.m_image), + m_data(item.m_data), + m_format(item.m_format), + m_width(item.m_width), + m_attr(NULL) + { + // copy list item attributes + if ( item.HasAttributes() ) + m_attr = new wxListItemAttr(*item.GetAttributes()); + } + + wxListItem& operator=(const wxListItem& item) + { + if ( &item != this ) + { + m_mask = item.m_mask; + m_itemId = item.m_itemId; + m_col = item.m_col; + m_state = item.m_state; + m_stateMask = item.m_stateMask; + m_text = item.m_text; + m_image = item.m_image; + m_data = item.m_data; + m_format = item.m_format; + m_width = item.m_width; + m_attr = item.m_attr ? new wxListItemAttr(*item.m_attr) : NULL; + } + + return *this; + } + + virtual ~wxListItem() { delete m_attr; } + + // resetting + void Clear() { Init(); m_text.clear(); ClearAttributes(); } + void ClearAttributes() { if ( m_attr ) { delete m_attr; m_attr = NULL; } } + + // setters + void SetMask(long mask) + { m_mask = mask; } + void SetId(long id) + { m_itemId = id; } + void SetColumn(int col) + { m_col = col; } + void SetState(long state) + { m_mask |= wxLIST_MASK_STATE; m_state = state; m_stateMask |= state; } + void SetStateMask(long stateMask) + { m_stateMask = stateMask; } + void SetText(const wxString& text) + { m_mask |= wxLIST_MASK_TEXT; m_text = text; } + void SetImage(int image) + { m_mask |= wxLIST_MASK_IMAGE; m_image = image; } + void SetData(long data) + { m_mask |= wxLIST_MASK_DATA; m_data = data; } + void SetData(void *data) + { m_mask |= wxLIST_MASK_DATA; m_data = wxPtrToUInt(data); } + + void SetWidth(int width) + { m_mask |= wxLIST_MASK_WIDTH; m_width = width; } + void SetAlign(wxListColumnFormat align) + { m_mask |= wxLIST_MASK_FORMAT; m_format = align; } + + void SetTextColour(const wxColour& colText) + { Attributes().SetTextColour(colText); } + void SetBackgroundColour(const wxColour& colBack) + { Attributes().SetBackgroundColour(colBack); } + void SetFont(const wxFont& font) + { Attributes().SetFont(font); } + + // accessors + long GetMask() const { return m_mask; } + long GetId() const { return m_itemId; } + int GetColumn() const { return m_col; } + long GetState() const { return m_state & m_stateMask; } + const wxString& GetText() const { return m_text; } + int GetImage() const { return m_image; } + wxUIntPtr GetData() const { return m_data; } + + int GetWidth() const { return m_width; } + wxListColumnFormat GetAlign() const { return (wxListColumnFormat)m_format; } + + wxListItemAttr *GetAttributes() const { return m_attr; } + bool HasAttributes() const { return m_attr != NULL; } + + wxColour GetTextColour() const + { return HasAttributes() ? m_attr->GetTextColour() : wxNullColour; } + wxColour GetBackgroundColour() const + { return HasAttributes() ? m_attr->GetBackgroundColour() + : wxNullColour; } + wxFont GetFont() const + { return HasAttributes() ? m_attr->GetFont() : wxNullFont; } + + // this conversion is necessary to make old code using GetItem() to + // compile + operator long() const { return m_itemId; } + + // these members are public for compatibility + + long m_mask; // Indicates what fields are valid + long m_itemId; // The zero-based item position + int m_col; // Zero-based column, if in report mode + long m_state; // The state of the item + long m_stateMask;// Which flags of m_state are valid (uses same flags) + wxString m_text; // The label/header text + int m_image; // The zero-based index into an image list + wxUIntPtr m_data; // App-defined data + + // For columns only + int m_format; // left, right, centre + int m_width; // width of column + +#ifdef __WXPM__ + int m_miniImage; // handle to the mini image for OS/2 +#endif + +protected: + // creates m_attr if we don't have it yet + wxListItemAttr& Attributes() + { + if ( !m_attr ) + m_attr = new wxListItemAttr; + + return *m_attr; + } + + void Init() + { + m_mask = 0; + m_itemId = -1; + m_col = 0; + m_state = 0; + m_stateMask = 0; + m_image = -1; + m_data = 0; + + m_format = wxLIST_FORMAT_CENTRE; + m_width = 0; + } + + wxListItemAttr *m_attr; // optional pointer to the items style + +private: + DECLARE_DYNAMIC_CLASS(wxListItem) +}; + +// ---------------------------------------------------------------------------- +// wxListCtrlBase: the base class for the main control itself. +// ---------------------------------------------------------------------------- + +// Unlike other base classes, this class doesn't currently define the API of +// the real control class but is just used for implementation convenience. We +// should define the public class functions as pure virtual here in the future +// however. +class WXDLLIMPEXP_CORE wxListCtrlBase : public wxControl +{ +public: + wxListCtrlBase() { } + + // Image list methods. + // ------------------- + + // Associate the given (possibly NULL to indicate that no images will be + // used) image list with the control. The ownership of the image list + // passes to the control, i.e. it will be deleted when the control itself + // is destroyed. + // + // The value of "which" must be one of wxIMAGE_LIST_{NORMAL,SMALL,STATE}. + virtual void AssignImageList(wxImageList* imageList, int which) = 0; + + // Same as AssignImageList() but the control does not delete the image list + // so it can be shared among several controls. + virtual void SetImageList(wxImageList* imageList, int which) = 0; + + // Return the currently used image list, may be NULL. + virtual wxImageList* GetImageList(int which) const = 0; + + + // Column-related methods. + // ----------------------- + + // All these methods can only be used in report view mode. + + // Appends a new column. + // + // Returns the index of the newly inserted column or -1 on error. + long AppendColumn(const wxString& heading, + wxListColumnFormat format = wxLIST_FORMAT_LEFT, + int width = -1); + + // Add a new column to the control at the position "col". + // + // Returns the index of the newly inserted column or -1 on error. + long InsertColumn(long col, const wxListItem& info); + long InsertColumn(long col, + const wxString& heading, + int format = wxLIST_FORMAT_LEFT, + int width = wxLIST_AUTOSIZE); + + // Delete the given or all columns. + virtual bool DeleteColumn(int col) = 0; + virtual bool DeleteAllColumns() = 0; + + // Return the current number of columns. + virtual int GetColumnCount() const = 0; + + // Get or update information about the given column. Set item mask to + // indicate the fields to retrieve or change. + // + // Returns false on error, e.g. if the column index is invalid. + virtual bool GetColumn(int col, wxListItem& item) const = 0; + virtual bool SetColumn(int col, const wxListItem& item) = 0; + + // Convenient wrappers for the above methods which get or update just the + // column width. + virtual int GetColumnWidth(int col) const = 0; + virtual bool SetColumnWidth(int col, int width) = 0; + + // return the attribute for the item (may return NULL if none) + virtual wxListItemAttr *OnGetItemAttr(long item) const; + + // Other miscellaneous accessors. + // ------------------------------ + + // Convenient functions for testing the list control mode: + bool InReportView() const { return HasFlag(wxLC_REPORT); } + bool IsVirtual() const { return HasFlag(wxLC_VIRTUAL); } + + // Enable or disable beep when incremental match doesn't find any item. + // Only implemented in the generic version currently. + virtual void EnableBellOnNoMatch(bool WXUNUSED(on) = true) { } + + void EnableAlternateRowColours(bool enable = true); + void SetAlternateRowColour(const wxColour& colour); + +protected: + // Real implementations methods to which our public forwards. + virtual long DoInsertColumn(long col, const wxListItem& info) = 0; + + // Overridden methods of the base class. + virtual wxSize DoGetBestClientSize() const; + +private: + // user defined color to draw row lines, may be invalid + wxListItemAttr m_alternateRowColour; +}; + +// ---------------------------------------------------------------------------- +// wxListEvent - the event class for the wxListCtrl notifications +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxListEvent : public wxNotifyEvent +{ +public: + wxListEvent(wxEventType commandType = wxEVT_NULL, int winid = 0) + : wxNotifyEvent(commandType, winid) + , m_code(-1) + , m_oldItemIndex(-1) + , m_itemIndex(-1) + , m_col(-1) + , m_pointDrag() + , m_item() + , m_editCancelled(false) + { } + + wxListEvent(const wxListEvent& event) + : wxNotifyEvent(event) + , m_code(event.m_code) + , m_oldItemIndex(event.m_oldItemIndex) + , m_itemIndex(event.m_itemIndex) + , m_col(event.m_col) + , m_pointDrag(event.m_pointDrag) + , m_item(event.m_item) + , m_editCancelled(event.m_editCancelled) + { } + + int GetKeyCode() const { return m_code; } + long GetIndex() const { return m_itemIndex; } + int GetColumn() const { return m_col; } + wxPoint GetPoint() const { return m_pointDrag; } + const wxString& GetLabel() const { return m_item.m_text; } + const wxString& GetText() const { return m_item.m_text; } + int GetImage() const { return m_item.m_image; } + wxUIntPtr GetData() const { return m_item.m_data; } + long GetMask() const { return m_item.m_mask; } + const wxListItem& GetItem() const { return m_item; } + + // for wxEVT_LIST_CACHE_HINT only + long GetCacheFrom() const { return m_oldItemIndex; } + long GetCacheTo() const { return m_itemIndex; } + + // was label editing canceled? (for wxEVT_LIST_END_LABEL_EDIT only) + bool IsEditCancelled() const { return m_editCancelled; } + void SetEditCanceled(bool editCancelled) { m_editCancelled = editCancelled; } + + virtual wxEvent *Clone() const { return new wxListEvent(*this); } + +//protected: -- not for backwards compatibility + int m_code; + long m_oldItemIndex; // only for wxEVT_LIST_CACHE_HINT + long m_itemIndex; + int m_col; + wxPoint m_pointDrag; + + wxListItem m_item; + +protected: + bool m_editCancelled; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxListEvent) +}; + +// ---------------------------------------------------------------------------- +// wxListCtrl event macros +// ---------------------------------------------------------------------------- + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_BEGIN_DRAG, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_BEGIN_RDRAG, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_BEGIN_LABEL_EDIT, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_END_LABEL_EDIT, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_DELETE_ITEM, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_DELETE_ALL_ITEMS, wxListEvent ); + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_ITEM_SELECTED, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_ITEM_DESELECTED, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_KEY_DOWN, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_INSERT_ITEM, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_COL_CLICK, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_ITEM_RIGHT_CLICK, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_ITEM_MIDDLE_CLICK, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_ITEM_ACTIVATED, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_CACHE_HINT, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_COL_RIGHT_CLICK, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_COL_BEGIN_DRAG, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_COL_DRAGGING, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_COL_END_DRAG, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_ITEM_FOCUSED, wxListEvent ); + +typedef void (wxEvtHandler::*wxListEventFunction)(wxListEvent&); + +#define wxListEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxListEventFunction, func) + +#define wx__DECLARE_LISTEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_LIST_ ## evt, id, wxListEventHandler(fn)) + +#define EVT_LIST_BEGIN_DRAG(id, fn) wx__DECLARE_LISTEVT(BEGIN_DRAG, id, fn) +#define EVT_LIST_BEGIN_RDRAG(id, fn) wx__DECLARE_LISTEVT(BEGIN_RDRAG, id, fn) +#define EVT_LIST_BEGIN_LABEL_EDIT(id, fn) wx__DECLARE_LISTEVT(BEGIN_LABEL_EDIT, id, fn) +#define EVT_LIST_END_LABEL_EDIT(id, fn) wx__DECLARE_LISTEVT(END_LABEL_EDIT, id, fn) +#define EVT_LIST_DELETE_ITEM(id, fn) wx__DECLARE_LISTEVT(DELETE_ITEM, id, fn) +#define EVT_LIST_DELETE_ALL_ITEMS(id, fn) wx__DECLARE_LISTEVT(DELETE_ALL_ITEMS, id, fn) +#define EVT_LIST_KEY_DOWN(id, fn) wx__DECLARE_LISTEVT(KEY_DOWN, id, fn) +#define EVT_LIST_INSERT_ITEM(id, fn) wx__DECLARE_LISTEVT(INSERT_ITEM, id, fn) + +#define EVT_LIST_COL_CLICK(id, fn) wx__DECLARE_LISTEVT(COL_CLICK, id, fn) +#define EVT_LIST_COL_RIGHT_CLICK(id, fn) wx__DECLARE_LISTEVT(COL_RIGHT_CLICK, id, fn) +#define EVT_LIST_COL_BEGIN_DRAG(id, fn) wx__DECLARE_LISTEVT(COL_BEGIN_DRAG, id, fn) +#define EVT_LIST_COL_DRAGGING(id, fn) wx__DECLARE_LISTEVT(COL_DRAGGING, id, fn) +#define EVT_LIST_COL_END_DRAG(id, fn) wx__DECLARE_LISTEVT(COL_END_DRAG, id, fn) + +#define EVT_LIST_ITEM_SELECTED(id, fn) wx__DECLARE_LISTEVT(ITEM_SELECTED, id, fn) +#define EVT_LIST_ITEM_DESELECTED(id, fn) wx__DECLARE_LISTEVT(ITEM_DESELECTED, id, fn) +#define EVT_LIST_ITEM_RIGHT_CLICK(id, fn) wx__DECLARE_LISTEVT(ITEM_RIGHT_CLICK, id, fn) +#define EVT_LIST_ITEM_MIDDLE_CLICK(id, fn) wx__DECLARE_LISTEVT(ITEM_MIDDLE_CLICK, id, fn) +#define EVT_LIST_ITEM_ACTIVATED(id, fn) wx__DECLARE_LISTEVT(ITEM_ACTIVATED, id, fn) +#define EVT_LIST_ITEM_FOCUSED(id, fn) wx__DECLARE_LISTEVT(ITEM_FOCUSED, id, fn) + +#define EVT_LIST_CACHE_HINT(id, fn) wx__DECLARE_LISTEVT(CACHE_HINT, id, fn) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_LIST_BEGIN_DRAG wxEVT_LIST_BEGIN_DRAG +#define wxEVT_COMMAND_LIST_BEGIN_RDRAG wxEVT_LIST_BEGIN_RDRAG +#define wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT wxEVT_LIST_BEGIN_LABEL_EDIT +#define wxEVT_COMMAND_LIST_END_LABEL_EDIT wxEVT_LIST_END_LABEL_EDIT +#define wxEVT_COMMAND_LIST_DELETE_ITEM wxEVT_LIST_DELETE_ITEM +#define wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS wxEVT_LIST_DELETE_ALL_ITEMS +#define wxEVT_COMMAND_LIST_ITEM_SELECTED wxEVT_LIST_ITEM_SELECTED +#define wxEVT_COMMAND_LIST_ITEM_DESELECTED wxEVT_LIST_ITEM_DESELECTED +#define wxEVT_COMMAND_LIST_KEY_DOWN wxEVT_LIST_KEY_DOWN +#define wxEVT_COMMAND_LIST_INSERT_ITEM wxEVT_LIST_INSERT_ITEM +#define wxEVT_COMMAND_LIST_COL_CLICK wxEVT_LIST_COL_CLICK +#define wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK wxEVT_LIST_ITEM_RIGHT_CLICK +#define wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK wxEVT_LIST_ITEM_MIDDLE_CLICK +#define wxEVT_COMMAND_LIST_ITEM_ACTIVATED wxEVT_LIST_ITEM_ACTIVATED +#define wxEVT_COMMAND_LIST_CACHE_HINT wxEVT_LIST_CACHE_HINT +#define wxEVT_COMMAND_LIST_COL_RIGHT_CLICK wxEVT_LIST_COL_RIGHT_CLICK +#define wxEVT_COMMAND_LIST_COL_BEGIN_DRAG wxEVT_LIST_COL_BEGIN_DRAG +#define wxEVT_COMMAND_LIST_COL_DRAGGING wxEVT_LIST_COL_DRAGGING +#define wxEVT_COMMAND_LIST_COL_END_DRAG wxEVT_LIST_COL_END_DRAG +#define wxEVT_COMMAND_LIST_ITEM_FOCUSED wxEVT_LIST_ITEM_FOCUSED + + +#endif + // _WX_LISTCTRL_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/listbook.h b/wxmsw/include/wx-3.0/wx/listbook.h new file mode 100644 index 00000000..1c7cdbd9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/listbook.h @@ -0,0 +1,129 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/listbook.h +// Purpose: wxListbook: wxListCtrl and wxNotebook combination +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.08.03 +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LISTBOOK_H_ +#define _WX_LISTBOOK_H_ + +#include "wx/defs.h" + +#if wxUSE_LISTBOOK + +#include "wx/bookctrl.h" +#include "wx/containr.h" + +class WXDLLIMPEXP_FWD_CORE wxListView; +class WXDLLIMPEXP_FWD_CORE wxListEvent; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LISTBOOK_PAGE_CHANGED, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LISTBOOK_PAGE_CHANGING, wxBookCtrlEvent ); + +// wxListbook flags +#define wxLB_DEFAULT wxBK_DEFAULT +#define wxLB_TOP wxBK_TOP +#define wxLB_BOTTOM wxBK_BOTTOM +#define wxLB_LEFT wxBK_LEFT +#define wxLB_RIGHT wxBK_RIGHT +#define wxLB_ALIGN_MASK wxBK_ALIGN_MASK + +// ---------------------------------------------------------------------------- +// wxListbook +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxListbook : public wxNavigationEnabled<wxBookCtrlBase> +{ +public: + wxListbook() { } + + wxListbook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString) + { + (void)Create(parent, id, pos, size, style, name); + } + + // quasi ctor + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString); + + + // overridden base class methods + virtual bool SetPageText(size_t n, const wxString& strText); + virtual wxString GetPageText(size_t n) const; + virtual int GetPageImage(size_t n) const; + virtual bool SetPageImage(size_t n, int imageId); + virtual bool InsertPage(size_t n, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = NO_IMAGE); + virtual int SetSelection(size_t n) { return DoSetSelection(n, SetSelection_SendEvent); } + virtual int ChangeSelection(size_t n) { return DoSetSelection(n); } + virtual int HitTest(const wxPoint& pt, long *flags = NULL) const; + virtual void SetImageList(wxImageList *imageList); + + virtual bool DeleteAllPages(); + + wxListView* GetListView() const { return (wxListView*)m_bookctrl; } + +protected: + virtual wxWindow *DoRemovePage(size_t page); + + void UpdateSelectedPage(size_t newsel); + + wxBookCtrlEvent* CreatePageChangingEvent() const; + void MakeChangedEvent(wxBookCtrlEvent &event); + + // Get the correct wxListCtrl flags to use depending on our own flags. + long GetListCtrlFlags() const; + + // event handlers + void OnListSelected(wxListEvent& event); + void OnSize(wxSizeEvent& event); + +private: + // this should be called when we need to be relaid out + void UpdateSize(); + + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxListbook) +}; + +// ---------------------------------------------------------------------------- +// listbook event class and related stuff +// ---------------------------------------------------------------------------- + +// wxListbookEvent is obsolete and defined for compatibility only (notice that +// we use #define and not typedef to also keep compatibility with the existing +// code which forward declares it) +#define wxListbookEvent wxBookCtrlEvent +typedef wxBookCtrlEventFunction wxListbookEventFunction; +#define wxListbookEventHandler(func) wxBookCtrlEventHandler(func) + +#define EVT_LISTBOOK_PAGE_CHANGED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_LISTBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) + +#define EVT_LISTBOOK_PAGE_CHANGING(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_LISTBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED wxEVT_LISTBOOK_PAGE_CHANGED +#define wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING wxEVT_LISTBOOK_PAGE_CHANGING + +#endif // wxUSE_LISTBOOK + +#endif // _WX_LISTBOOK_H_ diff --git a/wxmsw/include/wx-3.0/wx/listbox.h b/wxmsw/include/wx-3.0/wx/listbox.h new file mode 100644 index 00000000..afb02200 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/listbox.h @@ -0,0 +1,165 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/listbox.h +// Purpose: wxListBox class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.10.99 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LISTBOX_H_BASE_ +#define _WX_LISTBOX_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_LISTBOX + +#include "wx/ctrlsub.h" // base class + +// forward declarations are enough here +class WXDLLIMPEXP_FWD_BASE wxArrayInt; +class WXDLLIMPEXP_FWD_BASE wxArrayString; + +// ---------------------------------------------------------------------------- +// global data +// ---------------------------------------------------------------------------- + +extern WXDLLIMPEXP_DATA_CORE(const char) wxListBoxNameStr[]; + +// ---------------------------------------------------------------------------- +// wxListBox interface is defined by the class wxListBoxBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxListBoxBase : public wxControlWithItems +{ +public: + wxListBoxBase() { } + virtual ~wxListBoxBase(); + + void InsertItems(unsigned int nItems, const wxString *items, unsigned int pos) + { Insert(nItems, items, pos); } + void InsertItems(const wxArrayString& items, unsigned int pos) + { Insert(items, pos); } + + // multiple selection logic + virtual bool IsSelected(int n) const = 0; + virtual void SetSelection(int n); + void SetSelection(int n, bool select) { DoSetSelection(n, select); } + void Deselect(int n) { DoSetSelection(n, false); } + void DeselectAll(int itemToLeaveSelected = -1); + + virtual bool SetStringSelection(const wxString& s, bool select); + virtual bool SetStringSelection(const wxString& s) + { + return SetStringSelection(s, true); + } + + // works for single as well as multiple selection listboxes (unlike + // GetSelection which only works for listboxes with single selection) + virtual int GetSelections(wxArrayInt& aSelections) const = 0; + + // set the specified item at the first visible item or scroll to max + // range. + void SetFirstItem(int n) { DoSetFirstItem(n); } + void SetFirstItem(const wxString& s); + + // ensures that the given item is visible scrolling the listbox if + // necessary + virtual void EnsureVisible(int n); + + // a combination of Append() and EnsureVisible(): appends the item to the + // listbox and ensures that it is visible i.e. not scrolled out of view + void AppendAndEnsureVisible(const wxString& s); + + // return true if the listbox allows multiple selection + bool HasMultipleSelection() const + { + return (m_windowStyle & wxLB_MULTIPLE) || + (m_windowStyle & wxLB_EXTENDED); + } + + // override wxItemContainer::IsSorted + virtual bool IsSorted() const { return HasFlag( wxLB_SORT ); } + + // emulate selecting or deselecting the item event.GetInt() (depending on + // event.GetExtraLong()) + void Command(wxCommandEvent& event); + + // return the index of the item at this position or wxNOT_FOUND + int HitTest(const wxPoint& point) const { return DoListHitTest(point); } + int HitTest(int x, int y) const { return DoListHitTest(wxPoint(x, y)); } + + +protected: + virtual void DoSetFirstItem(int n) = 0; + + virtual void DoSetSelection(int n, bool select) = 0; + + // there is already wxWindow::DoHitTest() so call this one differently + virtual int DoListHitTest(const wxPoint& WXUNUSED(point)) const + { return wxNOT_FOUND; } + + // Helper for the code generating events in single selection mode: updates + // m_oldSelections and return true if the selection really changed. + // Otherwise just returns false. + bool DoChangeSingleSelection(int item); + + // Helper for generating events in multiple and extended mode: compare the + // current selections with the previously recorded ones (in + // m_oldSelections) and send the appropriate event if they differ, + // otherwise just return false. + bool CalcAndSendEvent(); + + // Send a listbox (de)selection or double click event. + // + // Returns true if the event was processed. + bool SendEvent(wxEventType evtType, int item, bool selected); + + // Array storing the indices of all selected items that we already notified + // the user code about for multi selection list boxes. + // + // For single selection list boxes, we reuse this array to store the single + // currently selected item, this is used by DoChangeSingleSelection(). + // + // TODO-OPT: wxSelectionStore would be more efficient for big list boxes. + wxArrayInt m_oldSelections; + + // Update m_oldSelections with currently selected items (does nothing in + // single selection mode on platforms other than MSW). + void UpdateOldSelections(); + +private: + wxDECLARE_NO_COPY_CLASS(wxListBoxBase); +}; + +// ---------------------------------------------------------------------------- +// include the platform-specific class declaration +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/listbox.h" +#elif defined(__WXMSW__) + #include "wx/msw/listbox.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/listbox.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/listbox.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/listbox.h" +#elif defined(__WXMAC__) + #include "wx/osx/listbox.h" +#elif defined(__WXPM__) + #include "wx/os2/listbox.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/listbox.h" +#endif + +#endif // wxUSE_LISTBOX + +#endif + // _WX_LISTBOX_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/listctrl.h b/wxmsw/include/wx-3.0/wx/listctrl.h new file mode 100644 index 00000000..51aca4a1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/listctrl.h @@ -0,0 +1,109 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/listctrl.h +// Purpose: wxListCtrl class +// Author: Vadim Zeitlin +// Modified by: +// Created: 04.12.99 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LISTCTRL_H_BASE_ +#define _WX_LISTCTRL_H_BASE_ + +#include "wx/defs.h" // headers should include this before first wxUSE_XXX check + +#if wxUSE_LISTCTRL + +#include "wx/listbase.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +extern WXDLLIMPEXP_DATA_CORE(const char) wxListCtrlNameStr[]; + +// ---------------------------------------------------------------------------- +// include the wxListCtrl class declaration +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + #include "wx/msw/listctrl.h" +#elif defined(__WXMAC__) && !defined(__WXUNIVERSAL__) && wxOSX_USE_CARBON + #include "wx/osx/listctrl.h" +#else + #include "wx/generic/listctrl.h" +#endif + +// ---------------------------------------------------------------------------- +// wxListView: a class which provides a better API for list control +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxListView : public wxListCtrl +{ +public: + wxListView() { } + wxListView( wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxLC_REPORT, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = wxListCtrlNameStr) + { + Create(parent, winid, pos, size, style, validator, name); + } + + // focus/selection stuff + // --------------------- + + // [de]select an item + void Select(long n, bool on = true) + { + SetItemState(n, on ? wxLIST_STATE_SELECTED : 0, wxLIST_STATE_SELECTED); + } + + // focus and show the given item + void Focus(long index) + { + SetItemState(index, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED); + EnsureVisible(index); + } + + // get the currently focused item or -1 if none + long GetFocusedItem() const + { + return GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED); + } + + // get first and subsequent selected items, return -1 when no more + long GetNextSelected(long item) const + { return GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); } + long GetFirstSelected() const + { return GetNextSelected(-1); } + + // return true if the item is selected + bool IsSelected(long index) const + { return GetItemState(index, wxLIST_STATE_SELECTED) != 0; } + + // columns + // ------- + + void SetColumnImage(int col, int image) + { + wxListItem item; + item.SetMask(wxLIST_MASK_IMAGE); + item.SetImage(image); + SetColumn(col, item); + } + + void ClearColumnImage(int col) { SetColumnImage(col, -1); } + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxListView) +}; + +#endif // wxUSE_LISTCTRL + +#endif + // _WX_LISTCTRL_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/listimpl.cpp b/wxmsw/include/wx-3.0/wx/listimpl.cpp new file mode 100644 index 00000000..f3a4a1bd --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/listimpl.cpp @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/listimpl.cpp +// Purpose: second-part of macro based implementation of template lists +// Author: Vadim Zeitlin +// Modified by: +// Created: 16/11/98 +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#if wxUSE_STD_CONTAINERS + +#undef WX_DEFINE_LIST +#define WX_DEFINE_LIST(name) \ + void _WX_LIST_HELPER_##name::DeleteFunction( _WX_LIST_ITEM_TYPE_##name X )\ + { \ + delete X; \ + } \ + _WX_LIST_HELPER_##name::BaseListType _WX_LIST_HELPER_##name::EmptyList; + +#else // !wxUSE_STD_CONTAINERS + #undef WX_DEFINE_LIST_2 + #define WX_DEFINE_LIST_2(T, name) \ + void wx##name##Node::DeleteData() \ + { \ + delete (T *)GetData(); \ + } + + // redefine the macro so that now it will generate the class implementation + // old value would provoke a compile-time error if this file is not included + #undef WX_DEFINE_LIST + #define WX_DEFINE_LIST(name) WX_DEFINE_LIST_2(_WX_LIST_ITEM_TYPE_##name, name) + +#endif // wxUSE_STD_CONTAINERS/!wxUSE_STD_CONTAINERS + diff --git a/wxmsw/include/wx-3.0/wx/log.h b/wxmsw/include/wx-3.0/wx/log.h new file mode 100644 index 00000000..be0a245a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/log.h @@ -0,0 +1,1647 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/log.h +// Purpose: Assorted wxLogXXX functions, and wxLog (sink for logs) +// Author: Vadim Zeitlin +// Modified by: +// Created: 29/01/98 +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LOG_H_ +#define _WX_LOG_H_ + +#include "wx/defs.h" +#include "wx/cpp.h" + +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +// NB: this is needed even if wxUSE_LOG == 0 +typedef unsigned long wxLogLevel; + +// the trace masks have been superseded by symbolic trace constants, they're +// for compatibility only and will be removed soon - do NOT use them +#if WXWIN_COMPATIBILITY_2_8 + #define wxTraceMemAlloc 0x0001 // trace memory allocation (new/delete) + #define wxTraceMessages 0x0002 // trace window messages/X callbacks + #define wxTraceResAlloc 0x0004 // trace GDI resource allocation + #define wxTraceRefCount 0x0008 // trace various ref counting operations + + #ifdef __WINDOWS__ + #define wxTraceOleCalls 0x0100 // OLE interface calls + #endif + + typedef unsigned long wxTraceMask; +#endif // WXWIN_COMPATIBILITY_2_8 + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/string.h" +#include "wx/strvararg.h" + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxObject; + +#if wxUSE_GUI + class WXDLLIMPEXP_FWD_CORE wxFrame; +#endif // wxUSE_GUI + +#if wxUSE_LOG + +#include "wx/arrstr.h" + +#ifndef __WXWINCE__ + #include <time.h> // for time_t +#endif + +#include "wx/dynarray.h" +#include "wx/hashmap.h" + +#if wxUSE_THREADS + #include "wx/thread.h" +#endif // wxUSE_THREADS + +// wxUSE_LOG_DEBUG enables the debug log messages +#ifndef wxUSE_LOG_DEBUG + #if wxDEBUG_LEVEL + #define wxUSE_LOG_DEBUG 1 + #else // !wxDEBUG_LEVEL + #define wxUSE_LOG_DEBUG 0 + #endif +#endif + +// wxUSE_LOG_TRACE enables the trace messages, they are disabled by default +#ifndef wxUSE_LOG_TRACE + #if wxDEBUG_LEVEL + #define wxUSE_LOG_TRACE 1 + #else // !wxDEBUG_LEVEL + #define wxUSE_LOG_TRACE 0 + #endif +#endif // wxUSE_LOG_TRACE + +// wxLOG_COMPONENT identifies the component which generated the log record and +// can be #define'd to a user-defined value when compiling the user code to use +// component-based filtering (see wxLog::SetComponentLevel()) +#ifndef wxLOG_COMPONENT + // this is a variable and not a macro in order to allow the user code to + // just #define wxLOG_COMPONENT without #undef'ining it first + extern WXDLLIMPEXP_DATA_BASE(const char *) wxLOG_COMPONENT; + + #ifdef WXBUILDING + #define wxLOG_COMPONENT "wx" + #endif +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// different standard log levels (you may also define your own) +enum wxLogLevelValues +{ + wxLOG_FatalError, // program can't continue, abort immediately + wxLOG_Error, // a serious error, user must be informed about it + wxLOG_Warning, // user is normally informed about it but may be ignored + wxLOG_Message, // normal message (i.e. normal output of a non GUI app) + wxLOG_Status, // informational: might go to the status line of GUI app + wxLOG_Info, // informational message (a.k.a. 'Verbose') + wxLOG_Debug, // never shown to the user, disabled in release mode + wxLOG_Trace, // trace messages are also only enabled in debug mode + wxLOG_Progress, // used for progress indicator (not yet) + wxLOG_User = 100, // user defined levels start here + wxLOG_Max = 10000 +}; + +// symbolic trace masks - wxLogTrace("foo", "some trace message...") will be +// discarded unless the string "foo" has been added to the list of allowed +// ones with AddTraceMask() + +#define wxTRACE_MemAlloc wxT("memalloc") // trace memory allocation (new/delete) +#define wxTRACE_Messages wxT("messages") // trace window messages/X callbacks +#define wxTRACE_ResAlloc wxT("resalloc") // trace GDI resource allocation +#define wxTRACE_RefCount wxT("refcount") // trace various ref counting operations + +#ifdef __WINDOWS__ + #define wxTRACE_OleCalls wxT("ole") // OLE interface calls +#endif + +#include "wx/iosfwrap.h" + +// ---------------------------------------------------------------------------- +// information about a log record, i.e. unit of log output +// ---------------------------------------------------------------------------- + +class wxLogRecordInfo +{ +public: + // default ctor creates an uninitialized object + wxLogRecordInfo() + { + memset(this, 0, sizeof(*this)); + } + + // normal ctor, used by wxLogger specifies the location of the log + // statement; its time stamp and thread id are set up here + wxLogRecordInfo(const char *filename_, + int line_, + const char *func_, + const char *component_) + { + filename = filename_; + func = func_; + line = line_; + component = component_; + + timestamp = time(NULL); + +#if wxUSE_THREADS + threadId = wxThread::GetCurrentId(); +#endif // wxUSE_THREADS + + m_data = NULL; + } + + // we need to define copy ctor and assignment operator because of m_data + wxLogRecordInfo(const wxLogRecordInfo& other) + { + Copy(other); + } + + wxLogRecordInfo& operator=(const wxLogRecordInfo& other) + { + if ( &other != this ) + { + delete m_data; + Copy(other); + } + + return *this; + } + + // dtor is non-virtual, this class is not meant to be derived from + ~wxLogRecordInfo() + { + delete m_data; + } + + + // the file name and line number of the file where the log record was + // generated, if available or NULL and 0 otherwise + const char *filename; + int line; + + // the name of the function where the log record was generated (may be NULL + // if the compiler doesn't support __FUNCTION__) + const char *func; + + // the name of the component which generated this message, may be NULL if + // not set (i.e. wxLOG_COMPONENT not defined) + const char *component; + + // time of record generation + time_t timestamp; + +#if wxUSE_THREADS + // id of the thread which logged this record + wxThreadIdType threadId; +#endif // wxUSE_THREADS + + + // store an arbitrary value in this record context + // + // wxWidgets always uses keys starting with "wx.", e.g. "wx.sys_error" + void StoreValue(const wxString& key, wxUIntPtr val) + { + if ( !m_data ) + m_data = new ExtraData; + + m_data->numValues[key] = val; + } + + void StoreValue(const wxString& key, const wxString& val) + { + if ( !m_data ) + m_data = new ExtraData; + + m_data->strValues[key] = val; + } + + + // these functions retrieve the value of either numeric or string key, + // return false if not found + bool GetNumValue(const wxString& key, wxUIntPtr *val) const + { + if ( !m_data ) + return false; + + wxStringToNumHashMap::const_iterator it = m_data->numValues.find(key); + if ( it == m_data->numValues.end() ) + return false; + + *val = it->second; + + return true; + } + + bool GetStrValue(const wxString& key, wxString *val) const + { + if ( !m_data ) + return false; + + wxStringToStringHashMap::const_iterator it = m_data->strValues.find(key); + if ( it == m_data->strValues.end() ) + return false; + + *val = it->second; + + return true; + } + +private: + void Copy(const wxLogRecordInfo& other) + { + memcpy(this, &other, sizeof(*this)); + if ( other.m_data ) + m_data = new ExtraData(*other.m_data); + } + + // extra data associated with the log record: this is completely optional + // and can be used to pass information from the log function to the log + // sink (e.g. wxLogSysError() uses this to pass the error code) + struct ExtraData + { + wxStringToNumHashMap numValues; + wxStringToStringHashMap strValues; + }; + + // NULL if not used + ExtraData *m_data; +}; + +#define wxLOG_KEY_TRACE_MASK "wx.trace_mask" + +// ---------------------------------------------------------------------------- +// log record: a unit of log output +// ---------------------------------------------------------------------------- + +struct wxLogRecord +{ + wxLogRecord(wxLogLevel level_, + const wxString& msg_, + const wxLogRecordInfo& info_) + : level(level_), + msg(msg_), + info(info_) + { + } + + wxLogLevel level; + wxString msg; + wxLogRecordInfo info; +}; + +// ---------------------------------------------------------------------------- +// Derive from this class to customize format of log messages. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxLogFormatter +{ +public: + // Default constructor. + wxLogFormatter() { } + + // Trivial but virtual destructor for the base class. + virtual ~wxLogFormatter() { } + + + // Override this method to implement custom formatting of the given log + // record. The default implementation simply prepends a level-dependent + // prefix to the message and optionally adds a time stamp. + virtual wxString Format(wxLogLevel level, + const wxString& msg, + const wxLogRecordInfo& info) const; + +protected: + // Override this method to change just the time stamp formatting. It is + // called by default Format() implementation. + virtual wxString FormatTime(time_t t) const; +}; + + +// ---------------------------------------------------------------------------- +// derive from this class to redirect (or suppress, or ...) log messages +// normally, only a single instance of this class exists but it's not enforced +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxLog +{ +public: + // ctor + wxLog() : m_formatter(new wxLogFormatter) { } + + // make dtor virtual for all derived classes + virtual ~wxLog(); + + + // log messages selection + // ---------------------- + + // these functions allow to completely disable all log messages or disable + // log messages at level less important than specified for the current + // thread + + // is logging enabled at all now? + static bool IsEnabled() + { +#if wxUSE_THREADS + if ( !wxThread::IsMain() ) + return IsThreadLoggingEnabled(); +#endif // wxUSE_THREADS + + return ms_doLog; + } + + // change the flag state, return the previous one + static bool EnableLogging(bool enable = true) + { +#if wxUSE_THREADS + if ( !wxThread::IsMain() ) + return EnableThreadLogging(enable); +#endif // wxUSE_THREADS + + bool doLogOld = ms_doLog; + ms_doLog = enable; + return doLogOld; + } + + // return the current global log level + static wxLogLevel GetLogLevel() { return ms_logLevel; } + + // set global log level: messages with level > logLevel will not be logged + static void SetLogLevel(wxLogLevel logLevel) { ms_logLevel = logLevel; } + + // set the log level for the given component + static void SetComponentLevel(const wxString& component, wxLogLevel level); + + // return the effective log level for this component, falling back to + // parent component and to the default global log level if necessary + // + // NB: component argument is passed by value and not const reference in an + // attempt to encourage compiler to avoid an extra copy: as we modify + // the component internally, we'd create one anyhow and like this it + // can be avoided if the string is a temporary anyhow + static wxLogLevel GetComponentLevel(wxString component); + + + // is logging of messages from this component enabled at this level? + // + // usually always called with wxLOG_COMPONENT as second argument + static bool IsLevelEnabled(wxLogLevel level, wxString component) + { + return IsEnabled() && level <= GetComponentLevel(component); + } + + + // enable/disable messages at wxLOG_Verbose level (only relevant if the + // current log level is greater or equal to it) + // + // notice that verbose mode can be activated by the standard command-line + // '--verbose' option + static void SetVerbose(bool bVerbose = true) { ms_bVerbose = bVerbose; } + + // check if verbose messages are enabled + static bool GetVerbose() { return ms_bVerbose; } + + + // message buffering + // ----------------- + + // flush shows all messages if they're not logged immediately (FILE + // and iostream logs don't need it, but wxLogGui does to avoid showing + // 17 modal dialogs one after another) + virtual void Flush(); + + // flush the active target if any and also output any pending messages from + // background threads + static void FlushActive(); + + // only one sink is active at each moment get current log target, will call + // wxAppTraits::CreateLogTarget() to create one if none exists + static wxLog *GetActiveTarget(); + + // change log target, logger may be NULL + static wxLog *SetActiveTarget(wxLog *logger); + +#if wxUSE_THREADS + // change log target for the current thread only, shouldn't be called from + // the main thread as it doesn't use thread-specific log target + static wxLog *SetThreadActiveTarget(wxLog *logger); +#endif // wxUSE_THREADS + + // suspend the message flushing of the main target until the next call + // to Resume() - this is mainly for internal use (to prevent wxYield() + // from flashing the messages) + static void Suspend() { ms_suspendCount++; } + + // must be called for each Suspend()! + static void Resume() { ms_suspendCount--; } + + // should GetActiveTarget() try to create a new log object if the + // current is NULL? + static void DontCreateOnDemand(); + + // Make GetActiveTarget() create a new log object again. + static void DoCreateOnDemand(); + + // log the count of repeating messages instead of logging the messages + // multiple times + static void SetRepetitionCounting(bool bRepetCounting = true) + { ms_bRepetCounting = bRepetCounting; } + + // gets duplicate counting status + static bool GetRepetitionCounting() { return ms_bRepetCounting; } + + // add string trace mask + static void AddTraceMask(const wxString& str); + + // add string trace mask + static void RemoveTraceMask(const wxString& str); + + // remove all string trace masks + static void ClearTraceMasks(); + + // get string trace masks: note that this is MT-unsafe if other threads can + // call AddTraceMask() concurrently + static const wxArrayString& GetTraceMasks(); + + // is this trace mask in the list? + static bool IsAllowedTraceMask(const wxString& mask); + + + // log formatting + // ----------------- + + // Change wxLogFormatter object used by wxLog to format the log messages. + // + // wxLog takes ownership of the pointer passed in but the caller is + // responsible for deleting the returned pointer. + wxLogFormatter* SetFormatter(wxLogFormatter* formatter); + + + // All the time stamp related functions below only work when the default + // wxLogFormatter is being used. Defining a custom formatter overrides them + // as it could use its own time stamp format or format messages without + // using time stamp at all. + + + // sets the time stamp string format: this is used as strftime() format + // string for the log targets which add time stamps to the messages; set + // it to empty string to disable time stamping completely. + static void SetTimestamp(const wxString& ts) { ms_timestamp = ts; } + + // disable time stamping of log messages + static void DisableTimestamp() { SetTimestamp(wxEmptyString); } + + + // get the current timestamp format string (maybe empty) + static const wxString& GetTimestamp() { return ms_timestamp; } + + + + // helpers: all functions in this section are mostly for internal use only, + // don't call them from your code even if they are not formally deprecated + + // put the time stamp into the string if ms_timestamp is not empty (don't + // change it otherwise); the first overload uses the current time. + static void TimeStamp(wxString *str); + static void TimeStamp(wxString *str, time_t t); + + // these methods should only be called from derived classes DoLogRecord(), + // DoLogTextAtLevel() and DoLogText() implementations respectively and + // shouldn't be called directly, use logging functions instead + void LogRecord(wxLogLevel level, + const wxString& msg, + const wxLogRecordInfo& info) + { + DoLogRecord(level, msg, info); + } + + void LogTextAtLevel(wxLogLevel level, const wxString& msg) + { + DoLogTextAtLevel(level, msg); + } + + void LogText(const wxString& msg) + { + DoLogText(msg); + } + + // this is a helper used by wxLogXXX() functions, don't call it directly + // and see DoLog() for function to overload in the derived classes + static void OnLog(wxLogLevel level, + const wxString& msg, + const wxLogRecordInfo& info); + + // version called when no information about the location of the log record + // generation is available (but the time stamp is), it mainly exists for + // backwards compatibility, don't use it in new code + static void OnLog(wxLogLevel level, const wxString& msg, time_t t); + + // a helper calling the above overload with current time + static void OnLog(wxLogLevel level, const wxString& msg) + { + OnLog(level, msg, time(NULL)); + } + + + // this method exists for backwards compatibility only, don't use + bool HasPendingMessages() const { return true; } + +#if WXWIN_COMPATIBILITY_2_6 + // this function doesn't do anything any more, don't call it + static wxDEPRECATED_INLINE( + wxChar *SetLogBuffer(wxChar *, size_t = 0), return NULL; + ); +#endif // WXWIN_COMPATIBILITY_2_6 + + // don't use integer masks any more, use string trace masks instead +#if WXWIN_COMPATIBILITY_2_8 + static wxDEPRECATED_INLINE( void SetTraceMask(wxTraceMask ulMask), + ms_ulTraceMask = ulMask; ) + + // this one can't be marked deprecated as it's used in our own wxLogger + // below but it still is deprecated and shouldn't be used + static wxTraceMask GetTraceMask() { return ms_ulTraceMask; } +#endif // WXWIN_COMPATIBILITY_2_8 + +protected: + // the logging functions that can be overridden: DoLogRecord() is called + // for every "record", i.e. a unit of log output, to be logged and by + // default formats the message and passes it to DoLogTextAtLevel() which in + // turn passes it to DoLogText() by default + + // override this method if you want to change message formatting or do + // dynamic filtering + virtual void DoLogRecord(wxLogLevel level, + const wxString& msg, + const wxLogRecordInfo& info); + + // override this method to redirect output to different channels depending + // on its level only; if even the level doesn't matter, override + // DoLogText() instead + virtual void DoLogTextAtLevel(wxLogLevel level, const wxString& msg); + + // this function is not pure virtual as it might not be needed if you do + // the logging in overridden DoLogRecord() or DoLogTextAtLevel() directly + // but if you do not override them in your derived class you must override + // this one as the default implementation of it simply asserts + virtual void DoLogText(const wxString& msg); + + + // the rest of the functions are for backwards compatibility only, don't + // use them in new code; if you're updating your existing code you need to + // switch to overriding DoLogRecord/Text() above (although as long as these + // functions exist, log classes using them will continue to work) +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED_BUT_USED_INTERNALLY( + virtual void DoLog(wxLogLevel level, const char *szString, time_t t) + ); + + wxDEPRECATED_BUT_USED_INTERNALLY( + virtual void DoLog(wxLogLevel level, const wchar_t *wzString, time_t t) + ); + + // these shouldn't be used by new code + wxDEPRECATED_BUT_USED_INTERNALLY_INLINE( + virtual void DoLogString(const char *WXUNUSED(szString), + time_t WXUNUSED(t)), + wxEMPTY_PARAMETER_VALUE + ) + + wxDEPRECATED_BUT_USED_INTERNALLY_INLINE( + virtual void DoLogString(const wchar_t *WXUNUSED(wzString), + time_t WXUNUSED(t)), + wxEMPTY_PARAMETER_VALUE + ) +#endif // WXWIN_COMPATIBILITY_2_8 + + + // log a message indicating the number of times the previous message was + // repeated if previous repetition counter is strictly positive, does + // nothing otherwise; return the old value of repetition counter + unsigned LogLastRepeatIfNeeded(); + +private: +#if wxUSE_THREADS + // called from FlushActive() to really log any buffered messages logged + // from the other threads + void FlushThreadMessages(); + + // these functions are called for non-main thread only by IsEnabled() and + // EnableLogging() respectively + static bool IsThreadLoggingEnabled(); + static bool EnableThreadLogging(bool enable = true); +#endif // wxUSE_THREADS + + // get the active log target for the main thread, auto-creating it if + // necessary + // + // this is called from GetActiveTarget() and OnLog() when they're called + // from the main thread + static wxLog *GetMainThreadActiveTarget(); + + // called from OnLog() if it's called from the main thread or if we have a + // (presumably MT-safe) thread-specific logger and by FlushThreadMessages() + // when it plays back the buffered messages logged from the other threads + void CallDoLogNow(wxLogLevel level, + const wxString& msg, + const wxLogRecordInfo& info); + + + // variables + // ---------------- + + wxLogFormatter *m_formatter; // We own this pointer. + + + // static variables + // ---------------- + + // if true, don't log the same message multiple times, only log it once + // with the number of times it was repeated + static bool ms_bRepetCounting; + + static wxLog *ms_pLogger; // currently active log sink + static bool ms_doLog; // false => all logging disabled + static bool ms_bAutoCreate; // create new log targets on demand? + static bool ms_bVerbose; // false => ignore LogInfo messages + + static wxLogLevel ms_logLevel; // limit logging to levels <= ms_logLevel + + static size_t ms_suspendCount; // if positive, logs are not flushed + + // format string for strftime(), if empty, time stamping log messages is + // disabled + static wxString ms_timestamp; + +#if WXWIN_COMPATIBILITY_2_8 + static wxTraceMask ms_ulTraceMask; // controls wxLogTrace behaviour +#endif // WXWIN_COMPATIBILITY_2_8 +}; + +// ---------------------------------------------------------------------------- +// "trivial" derivations of wxLog +// ---------------------------------------------------------------------------- + +// log everything except for the debug/trace messages (which are passed to +// wxMessageOutputDebug) to a buffer +class WXDLLIMPEXP_BASE wxLogBuffer : public wxLog +{ +public: + wxLogBuffer() { } + + // get the string contents with all messages logged + const wxString& GetBuffer() const { return m_str; } + + // show the buffer contents to the user in the best possible way (this uses + // wxMessageOutputMessageBox) and clear it + virtual void Flush(); + +protected: + virtual void DoLogTextAtLevel(wxLogLevel level, const wxString& msg); + +private: + wxString m_str; + + wxDECLARE_NO_COPY_CLASS(wxLogBuffer); +}; + + +// log everything to a "FILE *", stderr by default +class WXDLLIMPEXP_BASE wxLogStderr : public wxLog +{ +public: + // redirect log output to a FILE + wxLogStderr(FILE *fp = NULL); + +protected: + // implement sink function + virtual void DoLogText(const wxString& msg); + + FILE *m_fp; + + wxDECLARE_NO_COPY_CLASS(wxLogStderr); +}; + +#if wxUSE_STD_IOSTREAM + +// log everything to an "ostream", cerr by default +class WXDLLIMPEXP_BASE wxLogStream : public wxLog +{ +public: + // redirect log output to an ostream + wxLogStream(wxSTD ostream *ostr = (wxSTD ostream *) NULL); + +protected: + // implement sink function + virtual void DoLogText(const wxString& msg); + + // using ptr here to avoid including <iostream.h> from this file + wxSTD ostream *m_ostr; +}; + +#endif // wxUSE_STD_IOSTREAM + +// ---------------------------------------------------------------------------- +// /dev/null log target: suppress logging until this object goes out of scope +// ---------------------------------------------------------------------------- + +// example of usage: +/* + void Foo() + { + wxFile file; + + // wxFile.Open() normally complains if file can't be opened, we don't + // want it + wxLogNull logNo; + + if ( !file.Open("bar") ) + ... process error ourselves ... + + // ~wxLogNull called, old log sink restored + } + */ +class WXDLLIMPEXP_BASE wxLogNull +{ +public: + wxLogNull() : m_flagOld(wxLog::EnableLogging(false)) { } + ~wxLogNull() { (void)wxLog::EnableLogging(m_flagOld); } + +private: + bool m_flagOld; // the previous value of the wxLog::ms_doLog +}; + +// ---------------------------------------------------------------------------- +// chaining log target: installs itself as a log target and passes all +// messages to the real log target given to it in the ctor but also forwards +// them to the previously active one +// +// note that you don't have to call SetActiveTarget() with this class, it +// does it itself in its ctor +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxLogChain : public wxLog +{ +public: + wxLogChain(wxLog *logger); + virtual ~wxLogChain(); + + // change the new log target + void SetLog(wxLog *logger); + + // this can be used to temporarily disable (and then reenable) passing + // messages to the old logger (by default we do pass them) + void PassMessages(bool bDoPass) { m_bPassMessages = bDoPass; } + + // are we passing the messages to the previous log target? + bool IsPassingMessages() const { return m_bPassMessages; } + + // return the previous log target (may be NULL) + wxLog *GetOldLog() const { return m_logOld; } + + // override base class version to flush the old logger as well + virtual void Flush(); + + // call to avoid destroying the old log target + void DetachOldLog() { m_logOld = NULL; } + +protected: + // pass the record to the old logger if needed + virtual void DoLogRecord(wxLogLevel level, + const wxString& msg, + const wxLogRecordInfo& info); + +private: + // the current log target + wxLog *m_logNew; + + // the previous log target + wxLog *m_logOld; + + // do we pass the messages to the old logger? + bool m_bPassMessages; + + wxDECLARE_NO_COPY_CLASS(wxLogChain); +}; + +// a chain log target which uses itself as the new logger + +#define wxLogPassThrough wxLogInterposer + +class WXDLLIMPEXP_BASE wxLogInterposer : public wxLogChain +{ +public: + wxLogInterposer(); + +private: + wxDECLARE_NO_COPY_CLASS(wxLogInterposer); +}; + +// a temporary interposer which doesn't destroy the old log target +// (calls DetachOldLog) + +class WXDLLIMPEXP_BASE wxLogInterposerTemp : public wxLogChain +{ +public: + wxLogInterposerTemp(); + +private: + wxDECLARE_NO_COPY_CLASS(wxLogInterposerTemp); +}; + +#if wxUSE_GUI + // include GUI log targets: + #include "wx/generic/logg.h" +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// wxLogger +// ---------------------------------------------------------------------------- + +// wxLogger is a helper class used by wxLogXXX() functions implementation, +// don't use it directly as it's experimental and subject to change (OTOH it +// might become public in the future if it's deemed to be useful enough) + +// contains information about the context from which a log message originates +// and provides Log() vararg method which forwards to wxLog::OnLog() and passes +// this context to it +class wxLogger +{ +public: + // ctor takes the basic information about the log record + wxLogger(wxLogLevel level, + const char *filename, + int line, + const char *func, + const char *component) + : m_level(level), + m_info(filename, line, func, component) + { + } + + // store extra data in our log record and return this object itself (so + // that further calls to its functions could be chained) + template <typename T> + wxLogger& Store(const wxString& key, T val) + { + m_info.StoreValue(key, val); + return *this; + } + + // hack for "overloaded" wxLogXXX() functions: calling this method + // indicates that we may have an extra first argument preceding the format + // string and that if we do have it, we should store it in m_info using the + // given key (while by default 0 value will be used) + wxLogger& MaybeStore(const wxString& key, wxUIntPtr value = 0) + { + wxASSERT_MSG( m_optKey.empty(), "can only have one optional value" ); + m_optKey = key; + + m_info.StoreValue(key, value); + return *this; + } + + + // non-vararg function used by wxVLogXXX(): + + // log the message at the level specified in the ctor if this log message + // is enabled + void LogV(const wxString& format, va_list argptr) + { + // remember that fatal errors can't be disabled + if ( m_level == wxLOG_FatalError || + wxLog::IsLevelEnabled(m_level, m_info.component) ) + DoCallOnLog(format, argptr); + } + + // overloads used by functions with optional leading arguments (whose + // values are stored in the key passed to MaybeStore()) + void LogV(long num, const wxString& format, va_list argptr) + { + Store(m_optKey, num); + + LogV(format, argptr); + } + + void LogV(void *ptr, const wxString& format, va_list argptr) + { + Store(m_optKey, wxPtrToUInt(ptr)); + + LogV(format, argptr); + } + + void LogVTrace(const wxString& mask, const wxString& format, va_list argptr) + { + if ( !wxLog::IsAllowedTraceMask(mask) ) + return; + + Store(wxLOG_KEY_TRACE_MASK, mask); + + LogV(format, argptr); + } + + + // vararg functions used by wxLogXXX(): + + // will log the message at the level specified in the ctor + // + // notice that this function supposes that the caller already checked that + // the level was enabled and does no checks itself + WX_DEFINE_VARARG_FUNC_VOID + ( + Log, + 1, (const wxFormatString&), + DoLog, DoLogUtf8 + ) + + // same as Log() but with an extra numeric or pointer parameters: this is + // used to pass an optional value by storing it in m_info under the name + // passed to MaybeStore() and is required to support "overloaded" versions + // of wxLogStatus() and wxLogSysError() + WX_DEFINE_VARARG_FUNC_VOID + ( + Log, + 2, (long, const wxFormatString&), + DoLogWithNum, DoLogWithNumUtf8 + ) + + // unfortunately we can't use "void *" here as we get overload ambiguities + // with Log(wxFormatString, ...) when the first argument is a "char *" or + // "wchar_t *" then -- so we only allow passing wxObject here, which is + // ugly but fine in practice as this overload is only used by wxLogStatus() + // whose first argument is a wxFrame + WX_DEFINE_VARARG_FUNC_VOID + ( + Log, + 2, (wxObject *, const wxFormatString&), + DoLogWithPtr, DoLogWithPtrUtf8 + ) + + // log the message at the level specified as its first argument + // + // as the macros don't have access to the level argument in this case, this + // function does check that the level is enabled itself + WX_DEFINE_VARARG_FUNC_VOID + ( + LogAtLevel, + 2, (wxLogLevel, const wxFormatString&), + DoLogAtLevel, DoLogAtLevelUtf8 + ) + + // special versions for wxLogTrace() which is passed either string or + // integer mask as first argument determining whether the message should be + // logged or not + WX_DEFINE_VARARG_FUNC_VOID + ( + LogTrace, + 2, (const wxString&, const wxFormatString&), + DoLogTrace, DoLogTraceUtf8 + ) + +#if WXWIN_COMPATIBILITY_2_8 + WX_DEFINE_VARARG_FUNC_VOID + ( + LogTrace, + 2, (wxTraceMask, const wxFormatString&), + DoLogTraceMask, DoLogTraceMaskUtf8 + ) +#endif // WXWIN_COMPATIBILITY_2_8 + +#ifdef __WATCOMC__ + // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351 + WX_VARARG_WATCOM_WORKAROUND(void, Log, + 1, (const wxString&), + (wxFormatString(f1))) + WX_VARARG_WATCOM_WORKAROUND(void, Log, + 1, (const wxCStrData&), + (wxFormatString(f1))) + WX_VARARG_WATCOM_WORKAROUND(void, Log, + 1, (const char*), + (wxFormatString(f1))) + WX_VARARG_WATCOM_WORKAROUND(void, Log, + 1, (const wchar_t*), + (wxFormatString(f1))) + + WX_VARARG_WATCOM_WORKAROUND(void, Log, + 2, (long, const wxString&), + (f1, wxFormatString(f2))) + WX_VARARG_WATCOM_WORKAROUND(void, Log, + 2, (long, const wxCStrData&), + (f1, wxFormatString(f2))) + WX_VARARG_WATCOM_WORKAROUND(void, Log, + 2, (long, const char *), + (f1, wxFormatString(f2))) + WX_VARARG_WATCOM_WORKAROUND(void, Log, + 2, (long, const wchar_t *), + (f1, wxFormatString(f2))) + + WX_VARARG_WATCOM_WORKAROUND(void, Log, + 2, (wxObject *, const wxString&), + (f1, wxFormatString(f2))) + WX_VARARG_WATCOM_WORKAROUND(void, Log, + 2, (wxObject *, const wxCStrData&), + (f1, wxFormatString(f2))) + WX_VARARG_WATCOM_WORKAROUND(void, Log, + 2, (wxObject *, const char *), + (f1, wxFormatString(f2))) + WX_VARARG_WATCOM_WORKAROUND(void, Log, + 2, (wxObject *, const wchar_t *), + (f1, wxFormatString(f2))) + + WX_VARARG_WATCOM_WORKAROUND(void, LogAtLevel, + 2, (wxLogLevel, const wxString&), + (f1, wxFormatString(f2))) + WX_VARARG_WATCOM_WORKAROUND(void, LogAtLevel, + 2, (wxLogLevel, const wxCStrData&), + (f1, wxFormatString(f2))) + WX_VARARG_WATCOM_WORKAROUND(void, LogAtLevel, + 2, (wxLogLevel, const char *), + (f1, wxFormatString(f2))) + WX_VARARG_WATCOM_WORKAROUND(void, LogAtLevel, + 2, (wxLogLevel, const wchar_t *), + (f1, wxFormatString(f2))) + + WX_VARARG_WATCOM_WORKAROUND(void, LogTrace, + 2, (const wxString&, const wxString&), + (f1, wxFormatString(f2))) + WX_VARARG_WATCOM_WORKAROUND(void, LogTrace, + 2, (const wxString&, const wxCStrData&), + (f1, wxFormatString(f2))) + WX_VARARG_WATCOM_WORKAROUND(void, LogTrace, + 2, (const wxString&, const char *), + (f1, wxFormatString(f2))) + WX_VARARG_WATCOM_WORKAROUND(void, LogTrace, + 2, (const wxString&, const wchar_t *), + (f1, wxFormatString(f2))) + +#if WXWIN_COMPATIBILITY_2_8 + WX_VARARG_WATCOM_WORKAROUND(void, LogTrace, + 2, (wxTraceMask, wxTraceMask), + (f1, wxFormatString(f2))) + WX_VARARG_WATCOM_WORKAROUND(void, LogTrace, + 2, (wxTraceMask, const wxCStrData&), + (f1, wxFormatString(f2))) + WX_VARARG_WATCOM_WORKAROUND(void, LogTrace, + 2, (wxTraceMask, const char *), + (f1, wxFormatString(f2))) + WX_VARARG_WATCOM_WORKAROUND(void, LogTrace, + 2, (wxTraceMask, const wchar_t *), + (f1, wxFormatString(f2))) +#endif // WXWIN_COMPATIBILITY_2_8 +#endif // __WATCOMC__ + +private: +#if !wxUSE_UTF8_LOCALE_ONLY + void DoLog(const wxChar *format, ...) + { + va_list argptr; + va_start(argptr, format); + DoCallOnLog(format, argptr); + va_end(argptr); + } + + void DoLogWithNum(long num, const wxChar *format, ...) + { + Store(m_optKey, num); + + va_list argptr; + va_start(argptr, format); + DoCallOnLog(format, argptr); + va_end(argptr); + } + + void DoLogWithPtr(void *ptr, const wxChar *format, ...) + { + Store(m_optKey, wxPtrToUInt(ptr)); + + va_list argptr; + va_start(argptr, format); + DoCallOnLog(format, argptr); + va_end(argptr); + } + + void DoLogAtLevel(wxLogLevel level, const wxChar *format, ...) + { + if ( !wxLog::IsLevelEnabled(level, m_info.component) ) + return; + + va_list argptr; + va_start(argptr, format); + DoCallOnLog(level, format, argptr); + va_end(argptr); + } + + void DoLogTrace(const wxString& mask, const wxChar *format, ...) + { + if ( !wxLog::IsAllowedTraceMask(mask) ) + return; + + Store(wxLOG_KEY_TRACE_MASK, mask); + + va_list argptr; + va_start(argptr, format); + DoCallOnLog(format, argptr); + va_end(argptr); + } + +#if WXWIN_COMPATIBILITY_2_8 + void DoLogTraceMask(wxTraceMask mask, const wxChar *format, ...) + { + if ( (wxLog::GetTraceMask() & mask) != mask ) + return; + + Store(wxLOG_KEY_TRACE_MASK, mask); + + va_list argptr; + va_start(argptr, format); + DoCallOnLog(format, argptr); + va_end(argptr); + } +#endif // WXWIN_COMPATIBILITY_2_8 +#endif // !wxUSE_UTF8_LOCALE_ONLY + +#if wxUSE_UNICODE_UTF8 + void DoLogUtf8(const char *format, ...) + { + va_list argptr; + va_start(argptr, format); + DoCallOnLog(format, argptr); + va_end(argptr); + } + + void DoLogWithNumUtf8(long num, const char *format, ...) + { + Store(m_optKey, num); + + va_list argptr; + va_start(argptr, format); + DoCallOnLog(format, argptr); + va_end(argptr); + } + + void DoLogWithPtrUtf8(void *ptr, const char *format, ...) + { + Store(m_optKey, wxPtrToUInt(ptr)); + + va_list argptr; + va_start(argptr, format); + DoCallOnLog(format, argptr); + va_end(argptr); + } + + void DoLogAtLevelUtf8(wxLogLevel level, const char *format, ...) + { + if ( !wxLog::IsLevelEnabled(level, m_info.component) ) + return; + + va_list argptr; + va_start(argptr, format); + DoCallOnLog(level, format, argptr); + va_end(argptr); + } + + void DoLogTraceUtf8(const wxString& mask, const char *format, ...) + { + if ( !wxLog::IsAllowedTraceMask(mask) ) + return; + + Store(wxLOG_KEY_TRACE_MASK, mask); + + va_list argptr; + va_start(argptr, format); + DoCallOnLog(format, argptr); + va_end(argptr); + } + +#if WXWIN_COMPATIBILITY_2_8 + void DoLogTraceMaskUtf8(wxTraceMask mask, const char *format, ...) + { + if ( (wxLog::GetTraceMask() & mask) != mask ) + return; + + Store(wxLOG_KEY_TRACE_MASK, mask); + + va_list argptr; + va_start(argptr, format); + DoCallOnLog(format, argptr); + va_end(argptr); + } +#endif // WXWIN_COMPATIBILITY_2_8 +#endif // wxUSE_UNICODE_UTF8 + + void DoCallOnLog(wxLogLevel level, const wxString& format, va_list argptr) + { + wxLog::OnLog(level, wxString::FormatV(format, argptr), m_info); + } + + void DoCallOnLog(const wxString& format, va_list argptr) + { + DoCallOnLog(m_level, format, argptr); + } + + + const wxLogLevel m_level; + wxLogRecordInfo m_info; + + wxString m_optKey; + + wxDECLARE_NO_COPY_CLASS(wxLogger); +}; + +// ============================================================================ +// global functions +// ============================================================================ + +// ---------------------------------------------------------------------------- +// get error code/error message from system in a portable way +// ---------------------------------------------------------------------------- + +// return the last system error code +WXDLLIMPEXP_BASE unsigned long wxSysErrorCode(); + +// return the error message for given (or last if 0) error code +WXDLLIMPEXP_BASE const wxChar* wxSysErrorMsg(unsigned long nErrCode = 0); + +// ---------------------------------------------------------------------------- +// define wxLog<level>() functions which can be used by application instead of +// stdio, iostream &c for log messages for easy redirection +// ---------------------------------------------------------------------------- + +/* + The code below is unreadable because it (unfortunately unavoidably) + contains a lot of macro magic but all it does is to define wxLogXXX() such + that you can call them as vararg functions to log a message at the + corresponding level. + + More precisely, it defines: + + - wxLog{FatalError,Error,Warning,Message,Verbose,Debug}() functions + taking the format string and additional vararg arguments if needed. + - wxLogGeneric(wxLogLevel level, const wxString& format, ...) which + takes the log level explicitly. + - wxLogSysError(const wxString& format, ...) and wxLogSysError(long + err, const wxString& format, ...) which log a wxLOG_Error severity + message with the error message corresponding to the system error code + err or the last error. + - wxLogStatus(const wxString& format, ...) which logs the message into + the status bar of the main application window and its overload + wxLogStatus(wxFrame *frame, const wxString& format, ...) which logs it + into the status bar of the specified frame. + - wxLogTrace(Mask mask, const wxString& format, ...) which only logs + the message is the specified mask is enabled. This comes in two kinds: + Mask can be a wxString or a long. Both are deprecated. + + In addition, wxVLogXXX() versions of all the functions above are also + defined. They take a va_list argument instead of "...". + */ + +// creates wxLogger object for the current location +#define wxMAKE_LOGGER(level) \ + wxLogger(wxLOG_##level, __FILE__, __LINE__, __WXFUNCTION__, wxLOG_COMPONENT) + +// this macro generates the expression which logs whatever follows it in +// parentheses at the level specified as argument +#define wxDO_LOG(level) wxMAKE_LOGGER(level).Log + +// this is the non-vararg equivalent +#define wxDO_LOGV(level, format, argptr) \ + wxMAKE_LOGGER(level).LogV(format, argptr) + +// this macro declares wxLog<level>() macro which logs whatever follows it if +// logging at specified level is enabled (notice that if it is false, the +// following arguments are not even evaluated which is good as it avoids +// unnecessary overhead) +// +// Note: the strange (because executing at most once) for() loop because we +// must arrange for wxDO_LOG() to be at the end of the macro and using a +// more natural "if (IsLevelEnabled()) wxDO_LOG()" would result in wrong +// behaviour for the following code ("else" would bind to the wrong "if"): +// +// if ( cond ) +// wxLogError("!!!"); +// else +// ... +// +// See also #11829 for the problems with other simpler approaches, +// notably the need for two macros due to buggy __LINE__ in MSVC. +// +// Note 2: Unfortunately we can't use the same solution for all compilers +// because the loop-based one results in problems with MSVC6 due to its +// wrong (pre-C++98) rules for the scope of the variables declared +// inside the loop, as this prevents us from using wxLogXXX() in switch +// statement clauses ("initialization of loopvar skipped by case"). So +// for now, i.e. while we still support VC6, use the previous solution +// for it (FIXME-VC6). +#ifdef __VISUALC6__ +#define wxDO_LOG_IF_ENABLED(level) \ + if ( !wxLog::IsLevelEnabled(wxLOG_##level, wxLOG_COMPONENT) ) \ + {} \ + else \ + wxDO_LOG(level) +#else +#define wxDO_LOG_IF_ENABLED_HELPER(level, loopvar) \ + for ( bool loopvar = false; \ + !loopvar && wxLog::IsLevelEnabled(wxLOG_##level, wxLOG_COMPONENT); \ + loopvar = true ) \ + wxDO_LOG(level) + +#define wxDO_LOG_IF_ENABLED(level) \ + wxDO_LOG_IF_ENABLED_HELPER(level, wxMAKE_UNIQUE_NAME(wxlogcheck)) +#endif + +// wxLogFatalError() is special as it can't be disabled +#define wxLogFatalError wxDO_LOG(FatalError) +#define wxVLogFatalError(format, argptr) wxDO_LOGV(FatalError, format, argptr) + +#define wxLogError wxDO_LOG_IF_ENABLED(Error) +#define wxVLogError(format, argptr) wxDO_LOGV(Error, format, argptr) + +#define wxLogWarning wxDO_LOG_IF_ENABLED(Warning) +#define wxVLogWarning(format, argptr) wxDO_LOGV(Warning, format, argptr) + +#define wxLogMessage wxDO_LOG_IF_ENABLED(Message) +#define wxVLogMessage(format, argptr) wxDO_LOGV(Message, format, argptr) + +// this one is special as it only logs if we're in verbose mode +#define wxLogVerbose \ + if ( !(wxLog::IsLevelEnabled(wxLOG_Info, wxLOG_COMPONENT) && \ + wxLog::GetVerbose()) ) \ + {} \ + else \ + wxDO_LOG(Info) +#define wxVLogVerbose(format, argptr) \ + if ( !(wxLog::IsLevelEnabled(wxLOG_Info, wxLOG_COMPONENT) && \ + wxLog::GetVerbose()) ) \ + {} \ + else \ + wxDO_LOGV(Info, format, argptr) + +// deprecated synonyms for wxLogVerbose() and wxVLogVerbose() +#define wxLogInfo wxLogVerbose +#define wxVLogInfo wxVLogVerbose + + +// another special case: the level is passed as first argument of the function +// and so is not available to the macro +// +// notice that because of this, arguments of wxLogGeneric() are currently +// always evaluated, unlike for the other log functions +#define wxLogGeneric wxMAKE_LOGGER(Max).LogAtLevel +#define wxVLogGeneric(level, format, argptr) \ + if ( !wxLog::IsLevelEnabled(wxLOG_##level, wxLOG_COMPONENT) ) \ + {} \ + else \ + wxDO_LOGV(level, format, argptr) + + +// wxLogSysError() needs to stash the error code value in the log record info +// so it needs special handling too; additional complications arise because the +// error code may or not be present as the first argument +// +// notice that we unfortunately can't avoid the call to wxSysErrorCode() even +// though it may be unneeded if an explicit error code is passed to us because +// the message might not be logged immediately (e.g. it could be queued for +// logging from the main thread later) and so we can't to wait until it is +// logged to determine whether we have last error or not as it will be too late +// and it will have changed already by then (in fact it even changes when +// wxString::Format() is called because of vsnprintf() inside it so it can +// change even much sooner) +#define wxLOG_KEY_SYS_ERROR_CODE "wx.sys_error" + +#define wxLogSysError \ + if ( !wxLog::IsLevelEnabled(wxLOG_Error, wxLOG_COMPONENT) ) \ + {} \ + else \ + wxMAKE_LOGGER(Error).MaybeStore(wxLOG_KEY_SYS_ERROR_CODE, \ + wxSysErrorCode()).Log + +// unfortunately we can't have overloaded macros so we can't define versions +// both with and without error code argument and have to rely on LogV() +// overloads in wxLogger to select between them +#define wxVLogSysError \ + wxMAKE_LOGGER(Error).MaybeStore(wxLOG_KEY_SYS_ERROR_CODE, \ + wxSysErrorCode()).LogV + +#if wxUSE_GUI + // wxLogStatus() is similar to wxLogSysError() as it allows to optionally + // specify the frame to which the message should go + #define wxLOG_KEY_FRAME "wx.frame" + + #define wxLogStatus \ + if ( !wxLog::IsLevelEnabled(wxLOG_Status, wxLOG_COMPONENT) ) \ + {} \ + else \ + wxMAKE_LOGGER(Status).MaybeStore(wxLOG_KEY_FRAME).Log + + #define wxVLogStatus \ + wxMAKE_LOGGER(Status).MaybeStore(wxLOG_KEY_FRAME).LogV +#endif // wxUSE_GUI + + +#else // !wxUSE_LOG + +#undef wxUSE_LOG_DEBUG +#define wxUSE_LOG_DEBUG 0 + +#undef wxUSE_LOG_TRACE +#define wxUSE_LOG_TRACE 0 + +#if defined(__WATCOMC__) || defined(__MINGW32__) + // Mingw has similar problem with wxLogSysError: + #define WX_WATCOM_OR_MINGW_ONLY_CODE( x ) x +#else + #define WX_WATCOM_OR_MINGW_ONLY_CODE( x ) +#endif + +// define macros for defining log functions which do nothing at all +// +// WX_WATCOM_ONLY_CODE is needed to work around +// http://bugzilla.openwatcom.org/show_bug.cgi?id=351 +#define wxDEFINE_EMPTY_LOG_FUNCTION(level) \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 1, (const wxFormatString&)) \ + WX_WATCOM_ONLY_CODE( \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 1, (const char*)) \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 1, (const wchar_t*)) \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 1, (const wxCStrData&)) \ + ) \ + inline void wxVLog##level(const wxFormatString& WXUNUSED(format), \ + va_list WXUNUSED(argptr)) { } \ + +#define wxDEFINE_EMPTY_LOG_FUNCTION2(level, argclass) \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 2, (argclass, const wxFormatString&)) \ + WX_WATCOM_OR_MINGW_ONLY_CODE( \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 2, (argclass, const char*)) \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 2, (argclass, const wchar_t*)) \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 2, (argclass, const wxCStrData&)) \ + ) \ + inline void wxVLog##level(argclass WXUNUSED(arg), \ + const wxFormatString& WXUNUSED(format), \ + va_list WXUNUSED(argptr)) {} + +wxDEFINE_EMPTY_LOG_FUNCTION(FatalError); +wxDEFINE_EMPTY_LOG_FUNCTION(Error); +wxDEFINE_EMPTY_LOG_FUNCTION(SysError); +wxDEFINE_EMPTY_LOG_FUNCTION2(SysError, long); +wxDEFINE_EMPTY_LOG_FUNCTION(Warning); +wxDEFINE_EMPTY_LOG_FUNCTION(Message); +wxDEFINE_EMPTY_LOG_FUNCTION(Info); +wxDEFINE_EMPTY_LOG_FUNCTION(Verbose); + +wxDEFINE_EMPTY_LOG_FUNCTION2(Generic, wxLogLevel); + +#if wxUSE_GUI + wxDEFINE_EMPTY_LOG_FUNCTION(Status); + wxDEFINE_EMPTY_LOG_FUNCTION2(Status, wxFrame *); +#endif // wxUSE_GUI + +// Empty Class to fake wxLogNull +class WXDLLIMPEXP_BASE wxLogNull +{ +public: + wxLogNull() { } +}; + +// Dummy macros to replace some functions. +#define wxSysErrorCode() (unsigned long)0 +#define wxSysErrorMsg( X ) (const wxChar*)NULL + +// Fake symbolic trace masks... for those that are used frequently +#define wxTRACE_OleCalls wxEmptyString // OLE interface calls + +#endif // wxUSE_LOG/!wxUSE_LOG + + +// debug functions can be completely disabled in optimized builds + +// if these log functions are disabled, we prefer to define them as (empty) +// variadic macros as this completely removes them and their argument +// evaluation from the object code but if this is not supported by compiler we +// use empty inline functions instead (defining them as nothing would result in +// compiler warnings) +// +// note that making wxVLogDebug/Trace() themselves (empty inline) functions is +// a bad idea as some compilers are stupid enough to not inline even empty +// functions if their parameters are complicated enough, but by defining them +// as an empty inline function we ensure that even dumbest compilers optimise +// them away +#ifdef __BORLANDC__ + // but Borland gives "W8019: Code has no effect" for wxLogNop() so we need + // to define it differently for it to avoid these warnings (same problem as + // with wxUnusedVar()) + #define wxLogNop() { } +#else + inline void wxLogNop() { } +#endif + +#if wxUSE_LOG_DEBUG + #define wxLogDebug wxDO_LOG_IF_ENABLED(Debug) + #define wxVLogDebug(format, argptr) wxDO_LOGV(Debug, format, argptr) +#else // !wxUSE_LOG_DEBUG + #define wxVLogDebug(fmt, valist) wxLogNop() + + #ifdef HAVE_VARIADIC_MACROS + #define wxLogDebug(fmt, ...) wxLogNop() + #else // !HAVE_VARIADIC_MACROS + WX_DEFINE_VARARG_FUNC_NOP(wxLogDebug, 1, (const wxFormatString&)) + #endif +#endif // wxUSE_LOG_DEBUG/!wxUSE_LOG_DEBUG + +#if wxUSE_LOG_TRACE + #define wxLogTrace \ + if ( !wxLog::IsLevelEnabled(wxLOG_Trace, wxLOG_COMPONENT) ) \ + {} \ + else \ + wxMAKE_LOGGER(Trace).LogTrace + #define wxVLogTrace \ + if ( !wxLog::IsLevelEnabled(wxLOG_Trace, wxLOG_COMPONENT) ) \ + {} \ + else \ + wxMAKE_LOGGER(Trace).LogVTrace +#else // !wxUSE_LOG_TRACE + #define wxVLogTrace(mask, fmt, valist) wxLogNop() + + #ifdef HAVE_VARIADIC_MACROS + #define wxLogTrace(mask, fmt, ...) wxLogNop() + #else // !HAVE_VARIADIC_MACROS + #if WXWIN_COMPATIBILITY_2_8 + WX_DEFINE_VARARG_FUNC_NOP(wxLogTrace, 2, (wxTraceMask, const wxFormatString&)) + #endif + WX_DEFINE_VARARG_FUNC_NOP(wxLogTrace, 2, (const wxString&, const wxFormatString&)) + #ifdef __WATCOMC__ + // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351 + WX_DEFINE_VARARG_FUNC_NOP(wxLogTrace, 2, (const char*, const char*)) + WX_DEFINE_VARARG_FUNC_NOP(wxLogTrace, 2, (const wchar_t*, const wchar_t*)) + #endif + #endif // HAVE_VARIADIC_MACROS/!HAVE_VARIADIC_MACROS +#endif // wxUSE_LOG_TRACE/!wxUSE_LOG_TRACE + +// wxLogFatalError helper: show the (fatal) error to the user in a safe way, +// i.e. without using wxMessageBox() for example because it could crash +void WXDLLIMPEXP_BASE +wxSafeShowMessage(const wxString& title, const wxString& text); + +// ---------------------------------------------------------------------------- +// debug only logging functions: use them with API name and error code +// ---------------------------------------------------------------------------- + +#if wxUSE_LOG_DEBUG + // make life easier for people using VC++ IDE: clicking on the message + // will take us immediately to the place of the failed API +#ifdef __VISUALC__ + #define wxLogApiError(api, rc) \ + wxLogDebug(wxT("%s(%d): '%s' failed with error 0x%08lx (%s)."), \ + __FILE__, __LINE__, api, \ + (long)rc, wxSysErrorMsg(rc)) +#else // !VC++ + #define wxLogApiError(api, rc) \ + wxLogDebug(wxT("In file %s at line %d: '%s' failed with ") \ + wxT("error 0x%08lx (%s)."), \ + __FILE__, __LINE__, api, \ + (long)rc, wxSysErrorMsg(rc)) +#endif // VC++/!VC++ + + #define wxLogLastError(api) wxLogApiError(api, wxSysErrorCode()) + +#else // !wxUSE_LOG_DEBUG + #define wxLogApiError(api, err) wxLogNop() + #define wxLogLastError(api) wxLogNop() +#endif // wxUSE_LOG_DEBUG/!wxUSE_LOG_DEBUG + +// wxCocoa has additiional trace masks +#if defined(__WXCOCOA__) +#include "wx/cocoa/log.h" +#endif + +#ifdef WX_WATCOM_ONLY_CODE + #undef WX_WATCOM_ONLY_CODE +#endif + +// macro which disables debug logging in release builds: this is done by +// default by wxIMPLEMENT_APP() so usually it doesn't need to be used explicitly +#if defined(NDEBUG) && wxUSE_LOG_DEBUG + #define wxDISABLE_DEBUG_LOGGING_IN_RELEASE_BUILD() \ + wxLog::SetLogLevel(wxLOG_Info) +#else // !NDEBUG + #define wxDISABLE_DEBUG_LOGGING_IN_RELEASE_BUILD() +#endif // NDEBUG/!NDEBUG + +#endif // _WX_LOG_H_ + diff --git a/wxmsw/include/wx-3.0/wx/longlong.h b/wxmsw/include/wx-3.0/wx/longlong.h new file mode 100644 index 00000000..8a2848c5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/longlong.h @@ -0,0 +1,1144 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/longlong.h +// Purpose: declaration of wxLongLong class - best implementation of a 64 +// bit integer for the current platform. +// Author: Jeffrey C. Ollie <jeff@ollie.clive.ia.us>, Vadim Zeitlin +// Modified by: +// Created: 10.02.99 +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LONGLONG_H +#define _WX_LONGLONG_H + +#include "wx/defs.h" + +#if wxUSE_LONGLONG + +#include "wx/string.h" + +#include <limits.h> // for LONG_MAX + +// define this to compile wxLongLongWx in "test" mode: the results of all +// calculations will be compared with the real results taken from +// wxLongLongNative -- this is extremely useful to find the bugs in +// wxLongLongWx class! + +// #define wxLONGLONG_TEST_MODE + +#ifdef wxLONGLONG_TEST_MODE + #define wxUSE_LONGLONG_WX 1 + #define wxUSE_LONGLONG_NATIVE 1 +#endif // wxLONGLONG_TEST_MODE + +// ---------------------------------------------------------------------------- +// decide upon which class we will use +// ---------------------------------------------------------------------------- + +#ifndef wxLongLong_t + // both warning and pragma warning are not portable, but at least an + // unknown pragma should never be an error -- except that, actually, some + // broken compilers don't like it, so we have to disable it in this case + // <sigh> + #ifdef __GNUC__ + #warning "Your compiler does not appear to support 64 bit "\ + "integers, using emulation class instead.\n" \ + "Please report your compiler version to " \ + "wx-dev@lists.wxwidgets.org!" + #elif !(defined(__WATCOMC__) || defined(__VISAGECPP__)) + #pragma warning "Your compiler does not appear to support 64 bit "\ + "integers, using emulation class instead.\n" \ + "Please report your compiler version to " \ + "wx-dev@lists.wxwidgets.org!" + #endif + + #define wxUSE_LONGLONG_WX 1 +#endif // compiler + +// the user may predefine wxUSE_LONGLONG_NATIVE and/or wxUSE_LONGLONG_NATIVE +// to disable automatic testing (useful for the test program which defines +// both classes) but by default we only use one class +#if (defined(wxUSE_LONGLONG_WX) && wxUSE_LONGLONG_WX) || !defined(wxLongLong_t) + // don't use both classes unless wxUSE_LONGLONG_NATIVE was explicitly set: + // this is useful in test programs and only there + #ifndef wxUSE_LONGLONG_NATIVE + #define wxUSE_LONGLONG_NATIVE 0 + #endif + + class WXDLLIMPEXP_FWD_BASE wxLongLongWx; + class WXDLLIMPEXP_FWD_BASE wxULongLongWx; +#if defined(__VISUALC__) && !defined(__WIN32__) + #define wxLongLong wxLongLongWx + #define wxULongLong wxULongLongWx +#else + typedef wxLongLongWx wxLongLong; + typedef wxULongLongWx wxULongLong; +#endif + +#else + // if nothing is defined, use native implementation by default, of course + #ifndef wxUSE_LONGLONG_NATIVE + #define wxUSE_LONGLONG_NATIVE 1 + #endif +#endif + +#ifndef wxUSE_LONGLONG_WX + #define wxUSE_LONGLONG_WX 0 + class WXDLLIMPEXP_FWD_BASE wxLongLongNative; + class WXDLLIMPEXP_FWD_BASE wxULongLongNative; + typedef wxLongLongNative wxLongLong; + typedef wxULongLongNative wxULongLong; +#endif + +// NB: if both wxUSE_LONGLONG_WX and NATIVE are defined, the user code should +// typedef wxLongLong as it wants, we don't do it + +// ---------------------------------------------------------------------------- +// choose the appropriate class +// ---------------------------------------------------------------------------- + +// we use iostream for wxLongLong output +#include "wx/iosfwrap.h" + +#if wxUSE_LONGLONG_NATIVE + +class WXDLLIMPEXP_BASE wxLongLongNative +{ +public: + // ctors + // default ctor initializes to 0 + wxLongLongNative() : m_ll(0) { } + // from long long + wxLongLongNative(wxLongLong_t ll) : m_ll(ll) { } + // from 2 longs + wxLongLongNative(wxInt32 hi, wxUint32 lo) + { + // cast to wxLongLong_t first to avoid precision loss! + m_ll = ((wxLongLong_t) hi) << 32; + m_ll |= (wxLongLong_t) lo; + } +#if wxUSE_LONGLONG_WX + wxLongLongNative(wxLongLongWx ll); +#endif + + // default copy ctor is ok + + // no dtor + + // assignment operators + // from native 64 bit integer +#ifndef wxLongLongIsLong + wxLongLongNative& operator=(wxLongLong_t ll) + { m_ll = ll; return *this; } + wxLongLongNative& operator=(wxULongLong_t ll) + { m_ll = ll; return *this; } +#endif // !wxLongLongNative + wxLongLongNative& operator=(const wxULongLongNative &ll); + wxLongLongNative& operator=(int l) + { m_ll = l; return *this; } + wxLongLongNative& operator=(long l) + { m_ll = l; return *this; } + wxLongLongNative& operator=(unsigned int l) + { m_ll = l; return *this; } + wxLongLongNative& operator=(unsigned long l) + { m_ll = l; return *this; } +#if wxUSE_LONGLONG_WX + wxLongLongNative& operator=(wxLongLongWx ll); + wxLongLongNative& operator=(const class wxULongLongWx &ll); +#endif + + + // from double: this one has an explicit name because otherwise we + // would have ambiguity with "ll = int" and also because we don't want + // to have implicit conversions between doubles and wxLongLongs + wxLongLongNative& Assign(double d) + { m_ll = (wxLongLong_t)d; return *this; } + + // assignment operators from wxLongLongNative is ok + + // accessors + // get high part + wxInt32 GetHi() const + { return wx_truncate_cast(wxInt32, m_ll >> 32); } + // get low part + wxUint32 GetLo() const + { return wx_truncate_cast(wxUint32, m_ll); } + + // get absolute value + wxLongLongNative Abs() const { return wxLongLongNative(*this).Abs(); } + wxLongLongNative& Abs() { if ( m_ll < 0 ) m_ll = -m_ll; return *this; } + + // convert to native long long + wxLongLong_t GetValue() const { return m_ll; } + + // convert to long with range checking in debug mode (only!) + long ToLong() const + { + wxASSERT_MSG( (m_ll >= LONG_MIN) && (m_ll <= LONG_MAX), + wxT("wxLongLong to long conversion loss of precision") ); + + return wx_truncate_cast(long, m_ll); + } + + // convert to double + double ToDouble() const { return wx_truncate_cast(double, m_ll); } + + // don't provide implicit conversion to wxLongLong_t or we will have an + // ambiguity for all arithmetic operations + //operator wxLongLong_t() const { return m_ll; } + + // operations + // addition + wxLongLongNative operator+(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll + ll.m_ll); } + wxLongLongNative& operator+=(const wxLongLongNative& ll) + { m_ll += ll.m_ll; return *this; } + + wxLongLongNative operator+(const wxLongLong_t ll) const + { return wxLongLongNative(m_ll + ll); } + wxLongLongNative& operator+=(const wxLongLong_t ll) + { m_ll += ll; return *this; } + + // pre increment + wxLongLongNative& operator++() + { m_ll++; return *this; } + + // post increment + wxLongLongNative operator++(int) + { wxLongLongNative value(*this); m_ll++; return value; } + + // negation operator + wxLongLongNative operator-() const + { return wxLongLongNative(-m_ll); } + wxLongLongNative& Negate() { m_ll = -m_ll; return *this; } + + // subtraction + wxLongLongNative operator-(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll - ll.m_ll); } + wxLongLongNative& operator-=(const wxLongLongNative& ll) + { m_ll -= ll.m_ll; return *this; } + + wxLongLongNative operator-(const wxLongLong_t ll) const + { return wxLongLongNative(m_ll - ll); } + wxLongLongNative& operator-=(const wxLongLong_t ll) + { m_ll -= ll; return *this; } + + // pre decrement + wxLongLongNative& operator--() + { m_ll--; return *this; } + + // post decrement + wxLongLongNative operator--(int) + { wxLongLongNative value(*this); m_ll--; return value; } + + // shifts + // left shift + wxLongLongNative operator<<(int shift) const + { return wxLongLongNative(m_ll << shift); } + wxLongLongNative& operator<<=(int shift) + { m_ll <<= shift; return *this; } + + // right shift + wxLongLongNative operator>>(int shift) const + { return wxLongLongNative(m_ll >> shift); } + wxLongLongNative& operator>>=(int shift) + { m_ll >>= shift; return *this; } + + // bitwise operators + wxLongLongNative operator&(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll & ll.m_ll); } + wxLongLongNative& operator&=(const wxLongLongNative& ll) + { m_ll &= ll.m_ll; return *this; } + + wxLongLongNative operator|(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll | ll.m_ll); } + wxLongLongNative& operator|=(const wxLongLongNative& ll) + { m_ll |= ll.m_ll; return *this; } + + wxLongLongNative operator^(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll ^ ll.m_ll); } + wxLongLongNative& operator^=(const wxLongLongNative& ll) + { m_ll ^= ll.m_ll; return *this; } + + // multiplication/division + wxLongLongNative operator*(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll * ll.m_ll); } + wxLongLongNative operator*(long l) const + { return wxLongLongNative(m_ll * l); } + wxLongLongNative& operator*=(const wxLongLongNative& ll) + { m_ll *= ll.m_ll; return *this; } + wxLongLongNative& operator*=(long l) + { m_ll *= l; return *this; } + + wxLongLongNative operator/(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll / ll.m_ll); } + wxLongLongNative operator/(long l) const + { return wxLongLongNative(m_ll / l); } + wxLongLongNative& operator/=(const wxLongLongNative& ll) + { m_ll /= ll.m_ll; return *this; } + wxLongLongNative& operator/=(long l) + { m_ll /= l; return *this; } + + wxLongLongNative operator%(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll % ll.m_ll); } + wxLongLongNative operator%(long l) const + { return wxLongLongNative(m_ll % l); } + + // comparison + bool operator==(const wxLongLongNative& ll) const + { return m_ll == ll.m_ll; } + bool operator==(long l) const + { return m_ll == l; } + bool operator!=(const wxLongLongNative& ll) const + { return m_ll != ll.m_ll; } + bool operator!=(long l) const + { return m_ll != l; } + bool operator<(const wxLongLongNative& ll) const + { return m_ll < ll.m_ll; } + bool operator<(long l) const + { return m_ll < l; } + bool operator>(const wxLongLongNative& ll) const + { return m_ll > ll.m_ll; } + bool operator>(long l) const + { return m_ll > l; } + bool operator<=(const wxLongLongNative& ll) const + { return m_ll <= ll.m_ll; } + bool operator<=(long l) const + { return m_ll <= l; } + bool operator>=(const wxLongLongNative& ll) const + { return m_ll >= ll.m_ll; } + bool operator>=(long l) const + { return m_ll >= l; } + + // miscellaneous + + // return the string representation of this number + wxString ToString() const; + + // conversion to byte array: returns a pointer to static buffer! + void *asArray() const; + +#if wxUSE_STD_IOSTREAM + // input/output + friend WXDLLIMPEXP_BASE + wxSTD ostream& operator<<(wxSTD ostream&, const wxLongLongNative&); +#endif + + friend WXDLLIMPEXP_BASE + wxString& operator<<(wxString&, const wxLongLongNative&); + +#if wxUSE_STREAMS + friend WXDLLIMPEXP_BASE + class wxTextOutputStream& operator<<(class wxTextOutputStream&, const wxLongLongNative&); + friend WXDLLIMPEXP_BASE + class wxTextInputStream& operator>>(class wxTextInputStream&, wxLongLongNative&); +#endif + +private: + wxLongLong_t m_ll; +}; + + +class WXDLLIMPEXP_BASE wxULongLongNative +{ +public: + // ctors + // default ctor initializes to 0 + wxULongLongNative() : m_ll(0) { } + // from long long + wxULongLongNative(wxULongLong_t ll) : m_ll(ll) { } + // from 2 longs + wxULongLongNative(wxUint32 hi, wxUint32 lo) : m_ll(0) + { + // cast to wxLongLong_t first to avoid precision loss! + m_ll = ((wxULongLong_t) hi) << 32; + m_ll |= (wxULongLong_t) lo; + } + +#if wxUSE_LONGLONG_WX + wxULongLongNative(const class wxULongLongWx &ll); +#endif + + // default copy ctor is ok + + // no dtor + + // assignment operators + // from native 64 bit integer +#ifndef wxLongLongIsLong + wxULongLongNative& operator=(wxULongLong_t ll) + { m_ll = ll; return *this; } + wxULongLongNative& operator=(wxLongLong_t ll) + { m_ll = ll; return *this; } +#endif // !wxLongLongNative + wxULongLongNative& operator=(int l) + { m_ll = l; return *this; } + wxULongLongNative& operator=(long l) + { m_ll = l; return *this; } + wxULongLongNative& operator=(unsigned int l) + { m_ll = l; return *this; } + wxULongLongNative& operator=(unsigned long l) + { m_ll = l; return *this; } + wxULongLongNative& operator=(const wxLongLongNative &ll) + { m_ll = ll.GetValue(); return *this; } +#if wxUSE_LONGLONG_WX + wxULongLongNative& operator=(wxLongLongWx ll); + wxULongLongNative& operator=(const class wxULongLongWx &ll); +#endif + + // assignment operators from wxULongLongNative is ok + + // accessors + // get high part + wxUint32 GetHi() const + { return wx_truncate_cast(wxUint32, m_ll >> 32); } + // get low part + wxUint32 GetLo() const + { return wx_truncate_cast(wxUint32, m_ll); } + + // convert to native ulong long + wxULongLong_t GetValue() const { return m_ll; } + + // convert to ulong with range checking in debug mode (only!) + unsigned long ToULong() const + { + wxASSERT_MSG( m_ll <= ULONG_MAX, + wxT("wxULongLong to long conversion loss of precision") ); + + return wx_truncate_cast(unsigned long, m_ll); + } + + // convert to double + // + // For some completely obscure reasons compiling the cast below with + // VC6 in DLL builds only (!) results in "error C2520: conversion from + // unsigned __int64 to double not implemented, use signed __int64" so + // we must use a different version for that compiler. +#ifdef __VISUALC6__ + double ToDouble() const; +#else + double ToDouble() const { return wx_truncate_cast(double, m_ll); } +#endif + + // operations + // addition + wxULongLongNative operator+(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll + ll.m_ll); } + wxULongLongNative& operator+=(const wxULongLongNative& ll) + { m_ll += ll.m_ll; return *this; } + + wxULongLongNative operator+(const wxULongLong_t ll) const + { return wxULongLongNative(m_ll + ll); } + wxULongLongNative& operator+=(const wxULongLong_t ll) + { m_ll += ll; return *this; } + + // pre increment + wxULongLongNative& operator++() + { m_ll++; return *this; } + + // post increment + wxULongLongNative operator++(int) + { wxULongLongNative value(*this); m_ll++; return value; } + + // subtraction + wxULongLongNative operator-(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll - ll.m_ll); } + wxULongLongNative& operator-=(const wxULongLongNative& ll) + { m_ll -= ll.m_ll; return *this; } + + wxULongLongNative operator-(const wxULongLong_t ll) const + { return wxULongLongNative(m_ll - ll); } + wxULongLongNative& operator-=(const wxULongLong_t ll) + { m_ll -= ll; return *this; } + + // pre decrement + wxULongLongNative& operator--() + { m_ll--; return *this; } + + // post decrement + wxULongLongNative operator--(int) + { wxULongLongNative value(*this); m_ll--; return value; } + + // shifts + // left shift + wxULongLongNative operator<<(int shift) const + { return wxULongLongNative(m_ll << shift); } + wxULongLongNative& operator<<=(int shift) + { m_ll <<= shift; return *this; } + + // right shift + wxULongLongNative operator>>(int shift) const + { return wxULongLongNative(m_ll >> shift); } + wxULongLongNative& operator>>=(int shift) + { m_ll >>= shift; return *this; } + + // bitwise operators + wxULongLongNative operator&(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll & ll.m_ll); } + wxULongLongNative& operator&=(const wxULongLongNative& ll) + { m_ll &= ll.m_ll; return *this; } + + wxULongLongNative operator|(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll | ll.m_ll); } + wxULongLongNative& operator|=(const wxULongLongNative& ll) + { m_ll |= ll.m_ll; return *this; } + + wxULongLongNative operator^(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll ^ ll.m_ll); } + wxULongLongNative& operator^=(const wxULongLongNative& ll) + { m_ll ^= ll.m_ll; return *this; } + + // multiplication/division + wxULongLongNative operator*(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll * ll.m_ll); } + wxULongLongNative operator*(unsigned long l) const + { return wxULongLongNative(m_ll * l); } + wxULongLongNative& operator*=(const wxULongLongNative& ll) + { m_ll *= ll.m_ll; return *this; } + wxULongLongNative& operator*=(unsigned long l) + { m_ll *= l; return *this; } + + wxULongLongNative operator/(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll / ll.m_ll); } + wxULongLongNative operator/(unsigned long l) const + { return wxULongLongNative(m_ll / l); } + wxULongLongNative& operator/=(const wxULongLongNative& ll) + { m_ll /= ll.m_ll; return *this; } + wxULongLongNative& operator/=(unsigned long l) + { m_ll /= l; return *this; } + + wxULongLongNative operator%(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll % ll.m_ll); } + wxULongLongNative operator%(unsigned long l) const + { return wxULongLongNative(m_ll % l); } + + // comparison + bool operator==(const wxULongLongNative& ll) const + { return m_ll == ll.m_ll; } + bool operator==(unsigned long l) const + { return m_ll == l; } + bool operator!=(const wxULongLongNative& ll) const + { return m_ll != ll.m_ll; } + bool operator!=(unsigned long l) const + { return m_ll != l; } + bool operator<(const wxULongLongNative& ll) const + { return m_ll < ll.m_ll; } + bool operator<(unsigned long l) const + { return m_ll < l; } + bool operator>(const wxULongLongNative& ll) const + { return m_ll > ll.m_ll; } + bool operator>(unsigned long l) const + { return m_ll > l; } + bool operator<=(const wxULongLongNative& ll) const + { return m_ll <= ll.m_ll; } + bool operator<=(unsigned long l) const + { return m_ll <= l; } + bool operator>=(const wxULongLongNative& ll) const + { return m_ll >= ll.m_ll; } + bool operator>=(unsigned long l) const + { return m_ll >= l; } + + // miscellaneous + + // return the string representation of this number + wxString ToString() const; + + // conversion to byte array: returns a pointer to static buffer! + void *asArray() const; + +#if wxUSE_STD_IOSTREAM + // input/output + friend WXDLLIMPEXP_BASE + wxSTD ostream& operator<<(wxSTD ostream&, const wxULongLongNative&); +#endif + + friend WXDLLIMPEXP_BASE + wxString& operator<<(wxString&, const wxULongLongNative&); + +#if wxUSE_STREAMS + friend WXDLLIMPEXP_BASE + class wxTextOutputStream& operator<<(class wxTextOutputStream&, const wxULongLongNative&); + friend WXDLLIMPEXP_BASE + class wxTextInputStream& operator>>(class wxTextInputStream&, wxULongLongNative&); +#endif + +private: + wxULongLong_t m_ll; +}; + +inline +wxLongLongNative& wxLongLongNative::operator=(const wxULongLongNative &ll) +{ + m_ll = ll.GetValue(); + return *this; +} + +#endif // wxUSE_LONGLONG_NATIVE + +#if wxUSE_LONGLONG_WX + +class WXDLLIMPEXP_BASE wxLongLongWx +{ +public: + // ctors + // default ctor initializes to 0 + wxLongLongWx() + { + m_lo = m_hi = 0; + +#ifdef wxLONGLONG_TEST_MODE + m_ll = 0; + + Check(); +#endif // wxLONGLONG_TEST_MODE + } + // from long + wxLongLongWx(long l) { *this = l; } + // from 2 longs + wxLongLongWx(long hi, unsigned long lo) + { + m_hi = hi; + m_lo = lo; + +#ifdef wxLONGLONG_TEST_MODE + m_ll = hi; + m_ll <<= 32; + m_ll |= lo; + + Check(); +#endif // wxLONGLONG_TEST_MODE + } + + // default copy ctor is ok in both cases + + // no dtor + + // assignment operators + // from long + wxLongLongWx& operator=(long l) + { + m_lo = l; + m_hi = (l < 0 ? -1l : 0l); + +#ifdef wxLONGLONG_TEST_MODE + m_ll = l; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; + } + // from int + wxLongLongWx& operator=(int l) + { + return operator=((long)l); + } + + wxLongLongWx& operator=(unsigned long l) + { + m_lo = l; + m_hi = 0; + +#ifdef wxLONGLONG_TEST_MODE + m_ll = l; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; + } + + wxLongLongWx& operator=(unsigned int l) + { + return operator=((unsigned long)l); + } + + wxLongLongWx& operator=(const class wxULongLongWx &ll); + + // from double + wxLongLongWx& Assign(double d); + // can't have assignment operator from 2 longs + + // accessors + // get high part + long GetHi() const { return m_hi; } + // get low part + unsigned long GetLo() const { return m_lo; } + + // get absolute value + wxLongLongWx Abs() const { return wxLongLongWx(*this).Abs(); } + wxLongLongWx& Abs() + { + if ( m_hi < 0 ) + m_hi = -m_hi; + +#ifdef wxLONGLONG_TEST_MODE + if ( m_ll < 0 ) + m_ll = -m_ll; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; + } + + // convert to long with range checking in debug mode (only!) + long ToLong() const + { + wxASSERT_MSG( (m_hi == 0l) || (m_hi == -1l), + wxT("wxLongLong to long conversion loss of precision") ); + + return (long)m_lo; + } + + // convert to double + double ToDouble() const; + + // operations + // addition + wxLongLongWx operator+(const wxLongLongWx& ll) const; + wxLongLongWx& operator+=(const wxLongLongWx& ll); + wxLongLongWx operator+(long l) const; + wxLongLongWx& operator+=(long l); + + // pre increment operator + wxLongLongWx& operator++(); + + // post increment operator + wxLongLongWx& operator++(int) { return ++(*this); } + + // negation operator + wxLongLongWx operator-() const; + wxLongLongWx& Negate(); + + // subraction + wxLongLongWx operator-(const wxLongLongWx& ll) const; + wxLongLongWx& operator-=(const wxLongLongWx& ll); + + // pre decrement operator + wxLongLongWx& operator--(); + + // post decrement operator + wxLongLongWx& operator--(int) { return --(*this); } + + // shifts + // left shift + wxLongLongWx operator<<(int shift) const; + wxLongLongWx& operator<<=(int shift); + + // right shift + wxLongLongWx operator>>(int shift) const; + wxLongLongWx& operator>>=(int shift); + + // bitwise operators + wxLongLongWx operator&(const wxLongLongWx& ll) const; + wxLongLongWx& operator&=(const wxLongLongWx& ll); + wxLongLongWx operator|(const wxLongLongWx& ll) const; + wxLongLongWx& operator|=(const wxLongLongWx& ll); + wxLongLongWx operator^(const wxLongLongWx& ll) const; + wxLongLongWx& operator^=(const wxLongLongWx& ll); + wxLongLongWx operator~() const; + + // comparison + bool operator==(const wxLongLongWx& ll) const + { return m_lo == ll.m_lo && m_hi == ll.m_hi; } +#if wxUSE_LONGLONG_NATIVE + bool operator==(const wxLongLongNative& ll) const + { return m_lo == ll.GetLo() && m_hi == ll.GetHi(); } +#endif + bool operator!=(const wxLongLongWx& ll) const + { return !(*this == ll); } + bool operator<(const wxLongLongWx& ll) const; + bool operator>(const wxLongLongWx& ll) const; + bool operator<=(const wxLongLongWx& ll) const + { return *this < ll || *this == ll; } + bool operator>=(const wxLongLongWx& ll) const + { return *this > ll || *this == ll; } + + bool operator<(long l) const { return *this < wxLongLongWx(l); } + bool operator>(long l) const { return *this > wxLongLongWx(l); } + bool operator==(long l) const + { + return l >= 0 ? (m_hi == 0 && m_lo == (unsigned long)l) + : (m_hi == -1 && m_lo == (unsigned long)l); + } + + bool operator<=(long l) const { return *this < l || *this == l; } + bool operator>=(long l) const { return *this > l || *this == l; } + + // multiplication + wxLongLongWx operator*(const wxLongLongWx& ll) const; + wxLongLongWx& operator*=(const wxLongLongWx& ll); + + // division + wxLongLongWx operator/(const wxLongLongWx& ll) const; + wxLongLongWx& operator/=(const wxLongLongWx& ll); + + wxLongLongWx operator%(const wxLongLongWx& ll) const; + + void Divide(const wxLongLongWx& divisor, + wxLongLongWx& quotient, + wxLongLongWx& remainder) const; + + // input/output + + // return the string representation of this number + wxString ToString() const; + + void *asArray() const; + +#if wxUSE_STD_IOSTREAM + friend WXDLLIMPEXP_BASE + wxSTD ostream& operator<<(wxSTD ostream&, const wxLongLongWx&); +#endif // wxUSE_STD_IOSTREAM + + friend WXDLLIMPEXP_BASE + wxString& operator<<(wxString&, const wxLongLongWx&); + +#if wxUSE_STREAMS + friend WXDLLIMPEXP_BASE + class wxTextOutputStream& operator<<(class wxTextOutputStream&, const wxLongLongWx&); + friend WXDLLIMPEXP_BASE + class wxTextInputStream& operator>>(class wxTextInputStream&, wxLongLongWx&); +#endif + +private: + // long is at least 32 bits, so represent our 64bit number as 2 longs + + long m_hi; // signed bit is in the high part + unsigned long m_lo; + +#ifdef wxLONGLONG_TEST_MODE + void Check() + { + wxASSERT( (m_ll >> 32) == m_hi && (unsigned long)m_ll == m_lo ); + } + + wxLongLong_t m_ll; +#endif // wxLONGLONG_TEST_MODE +}; + + +class WXDLLIMPEXP_BASE wxULongLongWx +{ +public: + // ctors + // default ctor initializes to 0 + wxULongLongWx() + { + m_lo = m_hi = 0; + +#ifdef wxLONGLONG_TEST_MODE + m_ll = 0; + + Check(); +#endif // wxLONGLONG_TEST_MODE + } + // from ulong + wxULongLongWx(unsigned long l) { *this = l; } + // from 2 ulongs + wxULongLongWx(unsigned long hi, unsigned long lo) + { + m_hi = hi; + m_lo = lo; + +#ifdef wxLONGLONG_TEST_MODE + m_ll = hi; + m_ll <<= 32; + m_ll |= lo; + + Check(); +#endif // wxLONGLONG_TEST_MODE + } + + // from signed to unsigned + wxULongLongWx(wxLongLongWx ll) + { + wxASSERT(ll.GetHi() >= 0); + m_hi = (unsigned long)ll.GetHi(); + m_lo = ll.GetLo(); + } + + // default copy ctor is ok in both cases + + // no dtor + + // assignment operators + // from long + wxULongLongWx& operator=(unsigned long l) + { + m_lo = l; + m_hi = 0; + +#ifdef wxLONGLONG_TEST_MODE + m_ll = l; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; + } + wxULongLongWx& operator=(long l) + { + m_lo = l; + m_hi = (unsigned long) ((l<0) ? -1l : 0); + +#ifdef wxLONGLONG_TEST_MODE + m_ll = (wxULongLong_t) (wxLongLong_t) l; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; + } + wxULongLongWx& operator=(const class wxLongLongWx &ll) { + // Should we use an assert like it was before in the constructor? + // wxASSERT(ll.GetHi() >= 0); + m_hi = (unsigned long)ll.GetHi(); + m_lo = ll.GetLo(); + return *this; + } + + // can't have assignment operator from 2 longs + + // accessors + // get high part + unsigned long GetHi() const { return m_hi; } + // get low part + unsigned long GetLo() const { return m_lo; } + + // convert to long with range checking in debug mode (only!) + unsigned long ToULong() const + { + wxASSERT_MSG( m_hi == 0ul, + wxT("wxULongLong to long conversion loss of precision") ); + + return (unsigned long)m_lo; + } + + // convert to double + double ToDouble() const; + + // operations + // addition + wxULongLongWx operator+(const wxULongLongWx& ll) const; + wxULongLongWx& operator+=(const wxULongLongWx& ll); + wxULongLongWx operator+(unsigned long l) const; + wxULongLongWx& operator+=(unsigned long l); + + // pre increment operator + wxULongLongWx& operator++(); + + // post increment operator + wxULongLongWx& operator++(int) { return ++(*this); } + + // subtraction + wxLongLongWx operator-(const wxULongLongWx& ll) const; + wxULongLongWx& operator-=(const wxULongLongWx& ll); + + // pre decrement operator + wxULongLongWx& operator--(); + + // post decrement operator + wxULongLongWx& operator--(int) { return --(*this); } + + // shifts + // left shift + wxULongLongWx operator<<(int shift) const; + wxULongLongWx& operator<<=(int shift); + + // right shift + wxULongLongWx operator>>(int shift) const; + wxULongLongWx& operator>>=(int shift); + + // bitwise operators + wxULongLongWx operator&(const wxULongLongWx& ll) const; + wxULongLongWx& operator&=(const wxULongLongWx& ll); + wxULongLongWx operator|(const wxULongLongWx& ll) const; + wxULongLongWx& operator|=(const wxULongLongWx& ll); + wxULongLongWx operator^(const wxULongLongWx& ll) const; + wxULongLongWx& operator^=(const wxULongLongWx& ll); + wxULongLongWx operator~() const; + + // comparison + bool operator==(const wxULongLongWx& ll) const + { return m_lo == ll.m_lo && m_hi == ll.m_hi; } + bool operator!=(const wxULongLongWx& ll) const + { return !(*this == ll); } + bool operator<(const wxULongLongWx& ll) const; + bool operator>(const wxULongLongWx& ll) const; + bool operator<=(const wxULongLongWx& ll) const + { return *this < ll || *this == ll; } + bool operator>=(const wxULongLongWx& ll) const + { return *this > ll || *this == ll; } + + bool operator<(unsigned long l) const { return *this < wxULongLongWx(l); } + bool operator>(unsigned long l) const { return *this > wxULongLongWx(l); } + bool operator==(unsigned long l) const + { + return (m_hi == 0 && m_lo == (unsigned long)l); + } + + bool operator<=(unsigned long l) const { return *this < l || *this == l; } + bool operator>=(unsigned long l) const { return *this > l || *this == l; } + + // multiplication + wxULongLongWx operator*(const wxULongLongWx& ll) const; + wxULongLongWx& operator*=(const wxULongLongWx& ll); + + // division + wxULongLongWx operator/(const wxULongLongWx& ll) const; + wxULongLongWx& operator/=(const wxULongLongWx& ll); + + wxULongLongWx operator%(const wxULongLongWx& ll) const; + + void Divide(const wxULongLongWx& divisor, + wxULongLongWx& quotient, + wxULongLongWx& remainder) const; + + // input/output + + // return the string representation of this number + wxString ToString() const; + + void *asArray() const; + +#if wxUSE_STD_IOSTREAM + friend WXDLLIMPEXP_BASE + wxSTD ostream& operator<<(wxSTD ostream&, const wxULongLongWx&); +#endif // wxUSE_STD_IOSTREAM + + friend WXDLLIMPEXP_BASE + wxString& operator<<(wxString&, const wxULongLongWx&); + +#if wxUSE_STREAMS + friend WXDLLIMPEXP_BASE + class wxTextOutputStream& operator<<(class wxTextOutputStream&, const wxULongLongWx&); + friend WXDLLIMPEXP_BASE + class wxTextInputStream& operator>>(class wxTextInputStream&, wxULongLongWx&); +#endif + +private: + // long is at least 32 bits, so represent our 64bit number as 2 longs + + unsigned long m_hi; + unsigned long m_lo; + +#ifdef wxLONGLONG_TEST_MODE + void Check() + { + wxASSERT( (m_ll >> 32) == m_hi && (unsigned long)m_ll == m_lo ); + } + + wxULongLong_t m_ll; +#endif // wxLONGLONG_TEST_MODE +}; + +#endif // wxUSE_LONGLONG_WX + +// ---------------------------------------------------------------------------- +// binary operators +// ---------------------------------------------------------------------------- + +inline bool operator<(long l, const wxLongLong& ll) { return ll > l; } +inline bool operator>(long l, const wxLongLong& ll) { return ll < l; } +inline bool operator<=(long l, const wxLongLong& ll) { return ll >= l; } +inline bool operator>=(long l, const wxLongLong& ll) { return ll <= l; } +inline bool operator==(long l, const wxLongLong& ll) { return ll == l; } +inline bool operator!=(long l, const wxLongLong& ll) { return ll != l; } + +inline wxLongLong operator+(long l, const wxLongLong& ll) { return ll + l; } +inline wxLongLong operator-(long l, const wxLongLong& ll) +{ + return wxLongLong(l) - ll; +} + +inline bool operator<(unsigned long l, const wxULongLong& ull) { return ull > l; } +inline bool operator>(unsigned long l, const wxULongLong& ull) { return ull < l; } +inline bool operator<=(unsigned long l, const wxULongLong& ull) { return ull >= l; } +inline bool operator>=(unsigned long l, const wxULongLong& ull) { return ull <= l; } +inline bool operator==(unsigned long l, const wxULongLong& ull) { return ull == l; } +inline bool operator!=(unsigned long l, const wxULongLong& ull) { return ull != l; } + +inline wxULongLong operator+(unsigned long l, const wxULongLong& ull) { return ull + l; } + +inline wxLongLong operator-(unsigned long l, const wxULongLong& ull) +{ + wxULongLong ret = wxULongLong(l) - ull; + return wxLongLong((wxInt32)ret.GetHi(),ret.GetLo()); +} + +#if wxUSE_LONGLONG_NATIVE && wxUSE_STREAMS + +WXDLLIMPEXP_BASE class wxTextOutputStream &operator<<(class wxTextOutputStream &stream, wxULongLong_t value); +WXDLLIMPEXP_BASE class wxTextOutputStream &operator<<(class wxTextOutputStream &stream, wxLongLong_t value); + +WXDLLIMPEXP_BASE class wxTextInputStream &operator>>(class wxTextInputStream &stream, wxULongLong_t &value); +WXDLLIMPEXP_BASE class wxTextInputStream &operator>>(class wxTextInputStream &stream, wxLongLong_t &value); + +#endif + +// ---------------------------------------------------------------------------- +// Specialize numeric_limits<> for our long long wrapper classes. +// ---------------------------------------------------------------------------- + +#if wxUSE_LONGLONG_NATIVE + +// VC6 is known to not have __int64 specializations of numeric_limits<> in its +// <limits> anyhow so don't bother including it, especially as it results in +// tons of warnings because the standard header itself uses obsolete template +// specialization syntax. +#ifndef __VISUALC6__ + +#include <limits> + +namespace std +{ + +#ifdef __clang__ + // libstdc++ (used by Clang) uses struct for numeric_limits; unlike gcc, clang + // warns about this + template<> struct numeric_limits<wxLongLong> : public numeric_limits<wxLongLong_t> {}; + template<> struct numeric_limits<wxULongLong> : public numeric_limits<wxULongLong_t> {}; +#else + template<> class numeric_limits<wxLongLong> : public numeric_limits<wxLongLong_t> {}; + template<> class numeric_limits<wxULongLong> : public numeric_limits<wxULongLong_t> {}; +#endif + +} // namespace std + +#endif // !VC6 + +#endif // wxUSE_LONGLONG_NATIVE + +// ---------------------------------------------------------------------------- +// Specialize wxArgNormalizer to allow using wxLongLong directly with wx pseudo +// vararg functions. +// ---------------------------------------------------------------------------- + +// Notice that this must be done here and not in wx/strvararg.h itself because +// we can't include wx/longlong.h from there as this header itself includes +// wx/string.h which includes wx/strvararg.h too, so to avoid the circular +// dependencies we can only do it here (or add another header just for this but +// it doesn't seem necessary). +#include "wx/strvararg.h" + +template<> +struct WXDLLIMPEXP_BASE wxArgNormalizer<wxLongLong> +{ + wxArgNormalizer(wxLongLong value, + const wxFormatString *fmt, unsigned index) + : m_value(value) + { + wxASSERT_ARG_TYPE( fmt, index, wxFormatString::Arg_LongLongInt ); + } + + wxLongLong_t get() const { return m_value.GetValue(); } + + wxLongLong m_value; +}; + +#endif // wxUSE_LONGLONG + +#endif // _WX_LONGLONG_H diff --git a/wxmsw/include/wx-3.0/wx/math.h b/wxmsw/include/wx-3.0/wx/math.h new file mode 100644 index 00000000..89a1b944 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/math.h @@ -0,0 +1,165 @@ +/** +* Name: wx/math.h +* Purpose: Declarations/definitions of common math functions +* Author: John Labenski and others +* Modified by: +* Created: 02/02/03 +* Copyright: (c) John Labenski +* Licence: wxWindows licence +*/ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_MATH_H_ +#define _WX_MATH_H_ + +#include "wx/defs.h" + +#include <math.h> + +#ifndef M_PI + #define M_PI 3.1415926535897932384626433832795 +#endif + +/* Scaling factors for various unit conversions: 1 inch = 2.54 cm */ +#ifndef METRIC_CONVERSION_CONSTANT + #define METRIC_CONVERSION_CONSTANT (1/25.4) +#endif + +#ifndef mm2inches + #define mm2inches (METRIC_CONVERSION_CONSTANT) +#endif + +#ifndef inches2mm + #define inches2mm (1/(mm2inches)) +#endif + +#ifndef mm2twips + #define mm2twips (METRIC_CONVERSION_CONSTANT*1440) +#endif + +#ifndef twips2mm + #define twips2mm (1/(mm2twips)) +#endif + +#ifndef mm2pt + #define mm2pt (METRIC_CONVERSION_CONSTANT*72) +#endif + +#ifndef pt2mm + #define pt2mm (1/(mm2pt)) +#endif + + +#ifdef __cplusplus + +/* Any C++11 compiler should provide isfinite() */ +#if __cplusplus >= 201103 + #include <cmath> + #define wxFinite(x) std::isfinite(x) +#elif defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__) + #include <float.h> + #define wxFinite(x) _finite(x) +#elif defined(__MINGW64_TOOLCHAIN__) || defined(__clang__) + /* + add more compilers with C99 support here: using C99 isfinite() is + preferable to using BSD-ish finite() + */ + #if defined(_GLIBCXX_CMATH) || defined(_LIBCPP_CMATH) + // these <cmath> headers #undef isfinite + #define wxFinite(x) std::isfinite(x) + #else + #define wxFinite(x) isfinite(x) + #endif +#elif ( defined(__GNUG__)||defined(__GNUWIN32__)||defined(__DJGPP__)|| \ + defined(__SGI_CC__)||defined(__SUNCC__)||defined(__XLC__)|| \ + defined(__HPUX__) ) && ( !defined(wxOSX_USE_IPHONE) || wxOSX_USE_IPHONE == 0 ) +#ifdef __SOLARIS__ +#include <ieeefp.h> +#endif + #define wxFinite(x) finite(x) +#else + #define wxFinite(x) ((x) == (x)) +#endif + + +#if defined(__VISUALC__)||defined(__BORLAND__) + #define wxIsNaN(x) _isnan(x) +#elif defined(__GNUG__)||defined(__GNUWIN32__)||defined(__DJGPP__)|| \ + defined(__SGI_CC__)||defined(__SUNCC__)||defined(__XLC__)|| \ + defined(__HPUX__) + #define wxIsNaN(x) isnan(x) +#else + #define wxIsNaN(x) ((x) != (x)) +#endif + +#ifdef __INTELC__ + + inline bool wxIsSameDouble(double x, double y) + { + // VZ: this warning, given for operators==() and !=() is not wrong, as == + // shouldn't be used with doubles, but we get too many of them and + // removing these operators is probably not a good idea + // + // Maybe we should always compare doubles up to some "epsilon" precision + #pragma warning(push) + + // floating-point equality and inequality comparisons are unreliable + #pragma warning(disable: 1572) + + return x == y; + + #pragma warning(pop) + } + +#else /* !__INTELC__ */ + wxGCC_WARNING_SUPPRESS(float-equal) + inline bool wxIsSameDouble(double x, double y) { return x == y; } + wxGCC_WARNING_RESTORE(float-equal) + +#endif /* __INTELC__/!__INTELC__ */ + +inline bool wxIsNullDouble(double x) { return wxIsSameDouble(x, 0.); } + +inline int wxRound(double x) +{ + wxASSERT_MSG( x > INT_MIN - 0.5 && x < INT_MAX + 0.5, + wxT("argument out of supported range") ); + + #if defined(HAVE_ROUND) + return int(round(x)); + #else + return (int)(x < 0 ? x - 0.5 : x + 0.5); + #endif +} + +#endif /* __cplusplus */ + + +#if defined(__WINDOWS__) && !defined(__WXWINCE__) + #define wxMulDivInt32( a , b , c ) ::MulDiv( a , b , c ) +#else + #define wxMulDivInt32( a , b , c ) (wxRound((a)*(((wxDouble)b)/((wxDouble)c)))) +#endif + +#if wxUSE_APPLE_IEEE +#ifdef __cplusplus + extern "C" { +#endif + /* functions from common/extended.c */ + WXDLLIMPEXP_BASE wxFloat64 wxConvertFromIeeeExtended(const wxInt8 *bytes); + WXDLLIMPEXP_BASE void wxConvertToIeeeExtended(wxFloat64 num, wxInt8 *bytes); + + /* use wxConvertFromIeeeExtended() and wxConvertToIeeeExtended() instead */ +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED( WXDLLIMPEXP_BASE wxFloat64 ConvertFromIeeeExtended(const wxInt8 *bytes) ); + wxDEPRECATED( WXDLLIMPEXP_BASE void ConvertToIeeeExtended(wxFloat64 num, wxInt8 *bytes) ); +#endif + +#ifdef __cplusplus + } +#endif +#endif /* wxUSE_APPLE_IEEE */ + + +#endif /* _WX_MATH_H_ */ diff --git a/wxmsw/include/wx-3.0/wx/matrix.h b/wxmsw/include/wx-3.0/wx/matrix.h new file mode 100644 index 00000000..859c2a28 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/matrix.h @@ -0,0 +1,234 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/matrix.h +// Purpose: wxTransformMatrix class. NOT YET USED +// Author: Chris Breeze, Julian Smart +// Modified by: Klaas Holwerda +// Created: 01/02/97 +// Copyright: (c) Julian Smart, Chris Breeze +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MATRIXH__ +#define _WX_MATRIXH__ + +//! headerfiles="matrix.h wx/object.h" +#include "wx/object.h" +#include "wx/math.h" + +//! codefiles="matrix.cpp" + +// A simple 3x3 matrix. This may be replaced by a more general matrix +// class some day. +// +// Note: this is intended to be used in wxDC at some point to replace +// the current system of scaling/translation. It is not yet used. + +//:definition +// A 3x3 matrix to do 2D transformations. +// It can be used to map data to window coordinates, +// and also for manipulating your own data. +// For example drawing a picture (composed of several primitives) +// at a certain coordinate and angle within another parent picture. +// At all times m_isIdentity is set if the matrix itself is an Identity matrix. +// It is used where possible to optimize calculations. +class WXDLLIMPEXP_CORE wxTransformMatrix: public wxObject +{ +public: + wxTransformMatrix(void); + wxTransformMatrix(const wxTransformMatrix& mat); + + //get the value in the matrix at col,row + //rows are horizontal (second index of m_matrix member) + //columns are vertical (first index of m_matrix member) + double GetValue(int col, int row) const; + + //set the value in the matrix at col,row + //rows are horizontal (second index of m_matrix member) + //columns are vertical (first index of m_matrix member) + void SetValue(int col, int row, double value); + + void operator = (const wxTransformMatrix& mat); + bool operator == (const wxTransformMatrix& mat) const; + bool operator != (const wxTransformMatrix& mat) const; + + //multiply every element by t + wxTransformMatrix& operator*=(const double& t); + //divide every element by t + wxTransformMatrix& operator/=(const double& t); + //add matrix m to this t + wxTransformMatrix& operator+=(const wxTransformMatrix& m); + //subtract matrix m from this + wxTransformMatrix& operator-=(const wxTransformMatrix& m); + //multiply matrix m with this + wxTransformMatrix& operator*=(const wxTransformMatrix& m); + + // constant operators + + //multiply every element by t and return result + wxTransformMatrix operator*(const double& t) const; + //divide this matrix by t and return result + wxTransformMatrix operator/(const double& t) const; + //add matrix m to this and return result + wxTransformMatrix operator+(const wxTransformMatrix& m) const; + //subtract matrix m from this and return result + wxTransformMatrix operator-(const wxTransformMatrix& m) const; + //multiply this by matrix m and return result + wxTransformMatrix operator*(const wxTransformMatrix& m) const; + wxTransformMatrix operator-() const; + + //rows are horizontal (second index of m_matrix member) + //columns are vertical (first index of m_matrix member) + double& operator()(int col, int row); + + //rows are horizontal (second index of m_matrix member) + //columns are vertical (first index of m_matrix member) + double operator()(int col, int row) const; + + // Invert matrix + bool Invert(void); + + // Make into identity matrix + bool Identity(void); + + // Is the matrix the identity matrix? + // Only returns a flag, which is set whenever an operation + // is done. + inline bool IsIdentity(void) const { return m_isIdentity; } + + // This does an actual check. + inline bool IsIdentity1(void) const ; + + //Scale by scale (isotropic scaling i.e. the same in x and y): + //!ex: + //!code: | scale 0 0 | + //!code: matrix' = | 0 scale 0 | x matrix + //!code: | 0 0 scale | + bool Scale(double scale); + + //Scale with center point and x/y scale + // + //!ex: + //!code: | xs 0 xc(1-xs) | + //!code: matrix' = | 0 ys yc(1-ys) | x matrix + //!code: | 0 0 1 | + wxTransformMatrix& Scale(const double &xs, const double &ys,const double &xc, const double &yc); + + // mirror a matrix in x, y + //!ex: + //!code: | -1 0 0 | + //!code: matrix' = | 0 -1 0 | x matrix + //!code: | 0 0 1 | + wxTransformMatrix& Mirror(bool x=true, bool y=false); + // Translate by dx, dy: + //!ex: + //!code: | 1 0 dx | + //!code: matrix' = | 0 1 dy | x matrix + //!code: | 0 0 1 | + bool Translate(double x, double y); + + // Rotate clockwise by the given number of degrees: + //!ex: + //!code: | cos sin 0 | + //!code: matrix' = | -sin cos 0 | x matrix + //!code: | 0 0 1 | + bool Rotate(double angle); + + //Rotate counter clockwise with point of rotation + // + //!ex: + //!code: | cos(r) -sin(r) x(1-cos(r))+y(sin(r)| + //!code: matrix' = | sin(r) cos(r) y(1-cos(r))-x(sin(r)| x matrix + //!code: | 0 0 1 | + wxTransformMatrix& Rotate(const double &r, const double &x, const double &y); + + // Transform X value from logical to device + inline double TransformX(double x) const; + + // Transform Y value from logical to device + inline double TransformY(double y) const; + + // Transform a point from logical to device coordinates + bool TransformPoint(double x, double y, double& tx, double& ty) const; + + // Transform a point from device to logical coordinates. + // Example of use: + // wxTransformMatrix mat = dc.GetTransformation(); + // mat.Invert(); + // mat.InverseTransformPoint(x, y, x1, y1); + // OR (shorthand:) + // dc.LogicalToDevice(x, y, x1, y1); + // The latter is slightly less efficient if we're doing several + // conversions, since the matrix is inverted several times. + // N.B. 'this' matrix is the inverse at this point + bool InverseTransformPoint(double x, double y, double& tx, double& ty) const; + + double Get_scaleX(); + double Get_scaleY(); + double GetRotation(); + void SetRotation(double rotation); + + +public: + double m_matrix[3][3]; + bool m_isIdentity; +}; + + +/* +Chris Breeze reported, that +some functions of wxTransformMatrix cannot work because it is not +known if he matrix has been inverted. Be careful when using it. +*/ + +// Transform X value from logical to device +// warning: this function can only be used for this purpose +// because no rotation is involved when mapping logical to device coordinates +// mirror and scaling for x and y will be part of the matrix +// if you have a matrix that is rotated, eg a shape containing a matrix to place +// it in the logical coordinate system, use TransformPoint +inline double wxTransformMatrix::TransformX(double x) const +{ + //normally like this, but since no rotation is involved (only mirror and scale) + //we can do without Y -> m_matrix[1]{0] is -sin(rotation angle) and therefore zero + //(x * m_matrix[0][0] + y * m_matrix[1][0] + m_matrix[2][0])) + return (m_isIdentity ? x : (x * m_matrix[0][0] + m_matrix[2][0])); +} + +// Transform Y value from logical to device +// warning: this function can only be used for this purpose +// because no rotation is involved when mapping logical to device coordinates +// mirror and scaling for x and y will be part of the matrix +// if you have a matrix that is rotated, eg a shape containing a matrix to place +// it in the logical coordinate system, use TransformPoint +inline double wxTransformMatrix::TransformY(double y) const +{ + //normally like this, but since no rotation is involved (only mirror and scale) + //we can do without X -> m_matrix[0]{1] is sin(rotation angle) and therefore zero + //(x * m_matrix[0][1] + y * m_matrix[1][1] + m_matrix[2][1])) + return (m_isIdentity ? y : (y * m_matrix[1][1] + m_matrix[2][1])); +} + + +// Is the matrix the identity matrix? +// Each operation checks whether the result is still the identity matrix and sets a flag. +inline bool wxTransformMatrix::IsIdentity1(void) const +{ + return + ( wxIsSameDouble(m_matrix[0][0], 1.0) && + wxIsSameDouble(m_matrix[1][1], 1.0) && + wxIsSameDouble(m_matrix[2][2], 1.0) && + wxIsSameDouble(m_matrix[1][0], 0.0) && + wxIsSameDouble(m_matrix[2][0], 0.0) && + wxIsSameDouble(m_matrix[0][1], 0.0) && + wxIsSameDouble(m_matrix[2][1], 0.0) && + wxIsSameDouble(m_matrix[0][2], 0.0) && + wxIsSameDouble(m_matrix[1][2], 0.0) ); +} + +// Calculates the determinant of a 2 x 2 matrix +inline double wxCalculateDet(double a11, double a21, double a12, double a22) +{ + return a11 * a22 - a12 * a21; +} + +#endif // _WX_MATRIXH__ diff --git a/wxmsw/include/wx-3.0/wx/mdi.h b/wxmsw/include/wx-3.0/wx/mdi.h new file mode 100644 index 00000000..837c1328 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/mdi.h @@ -0,0 +1,402 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/mdi.h +// Purpose: wxMDI base header +// Author: Julian Smart (original) +// Vadim Zeitlin (base MDI classes refactoring) +// Copyright: (c) 1998 Julian Smart +// (c) 2008 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MDI_H_BASE_ +#define _WX_MDI_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_MDI + +#include "wx/frame.h" +#include "wx/menu.h" + +// forward declarations +class WXDLLIMPEXP_FWD_CORE wxMDIParentFrame; +class WXDLLIMPEXP_FWD_CORE wxMDIChildFrame; +class WXDLLIMPEXP_FWD_CORE wxMDIClientWindowBase; +class WXDLLIMPEXP_FWD_CORE wxMDIClientWindow; + +// ---------------------------------------------------------------------------- +// wxMDIParentFrameBase: base class for parent frame for MDI children +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMDIParentFrameBase : public wxFrame +{ +public: + wxMDIParentFrameBase() + { + m_clientWindow = NULL; + m_currentChild = NULL; +#if wxUSE_MENUS + m_windowMenu = NULL; +#endif // wxUSE_MENUS + } + + /* + Derived classes should provide ctor and Create() with the following + declaration: + + bool Create(wxWindow *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL, + const wxString& name = wxFrameNameStr); + */ + +#if wxUSE_MENUS + virtual ~wxMDIParentFrameBase() + { + delete m_windowMenu; + } +#endif // wxUSE_MENUS + + // accessors + // --------- + + // Get or change the active MDI child window + virtual wxMDIChildFrame *GetActiveChild() const + { return m_currentChild; } + virtual void SetActiveChild(wxMDIChildFrame *child) + { m_currentChild = child; } + + + // Get the client window + wxMDIClientWindowBase *GetClientWindow() const { return m_clientWindow; } + + + // MDI windows menu functions + // -------------------------- + +#if wxUSE_MENUS + // return the pointer to the current window menu or NULL if we don't have + // because of wxFRAME_NO_WINDOW_MENU style + wxMenu* GetWindowMenu() const { return m_windowMenu; } + + // use the given menu instead of the default window menu + // + // menu can be NULL to disable the window menu completely + virtual void SetWindowMenu(wxMenu *menu) + { + if ( menu != m_windowMenu ) + { + delete m_windowMenu; + m_windowMenu = menu; + } + } +#endif // wxUSE_MENUS + + + // standard MDI window management functions + // ---------------------------------------- + + virtual void Cascade() { } + virtual void Tile(wxOrientation WXUNUSED(orient) = wxHORIZONTAL) { } + virtual void ArrangeIcons() { } + virtual void ActivateNext() = 0; + virtual void ActivatePrevious() = 0; + + /* + Derived classes must provide the following function: + + static bool IsTDI(); + */ + + // Create the client window class (don't Create() the window here, just + // return a new object of a wxMDIClientWindow-derived class) + // + // Notice that if you override this method you should use the default + // constructor and Create() and not the constructor creating the window + // when creating the frame or your overridden version is not going to be + // called (as the call to a virtual function from ctor will be dispatched + // to this class version) + virtual wxMDIClientWindow *OnCreateClient(); + +protected: + // Override to pass menu/toolbar events to the active child first. + virtual bool TryBefore(wxEvent& event); + + + // This is wxMDIClientWindow for all the native implementations but not for + // the generic MDI version which has its own wxGenericMDIClientWindow and + // so we store it as just a base class pointer because we don't need its + // exact type anyhow + wxMDIClientWindowBase *m_clientWindow; + wxMDIChildFrame *m_currentChild; + +#if wxUSE_MENUS + // the current window menu or NULL if we are not using it + wxMenu *m_windowMenu; +#endif // wxUSE_MENUS +}; + +// ---------------------------------------------------------------------------- +// wxMDIChildFrameBase: child frame managed by wxMDIParentFrame +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMDIChildFrameBase : public wxFrame +{ +public: + wxMDIChildFrameBase() { m_mdiParent = NULL; } + + /* + Derived classes should provide Create() with the following signature: + + bool Create(wxMDIParentFrame *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + And setting m_mdiParent to parent parameter. + */ + + // MDI children specific methods + virtual void Activate() = 0; + + // Return the MDI parent frame: notice that it may not be the same as + // GetParent() (our parent may be the client window or even its subwindow + // in some implementations) + wxMDIParentFrame *GetMDIParent() const { return m_mdiParent; } + + // Synonym for GetMDIParent(), was used in some other ports + wxMDIParentFrame *GetMDIParentFrame() const { return GetMDIParent(); } + + + // in most ports MDI children frames are not really top-level, the only + // exception are the Mac ports in which MDI children are just normal top + // level windows too + virtual bool IsTopLevel() const { return false; } + + // In all ports keyboard navigation must stop at MDI child frame level and + // can't cross its boundary. Indicate this by overriding this function to + // return true. + virtual bool IsTopNavigationDomain() const { return true; } + + // Raising any frame is supposed to show it but wxFrame Raise() + // implementation doesn't work for MDI child frames in most forms so + // forward this to Activate() which serves the same purpose by default. + virtual void Raise() { Activate(); } + +protected: + wxMDIParentFrame *m_mdiParent; +}; + +// ---------------------------------------------------------------------------- +// wxTDIChildFrame: child frame used by TDI implementations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTDIChildFrame : public wxMDIChildFrameBase +{ +public: + // override wxFrame methods for this non top-level window + +#if wxUSE_STATUSBAR + // no status bars + // + // TODO: MDI children should have their own status bars, why not? + virtual wxStatusBar* CreateStatusBar(int WXUNUSED(number) = 1, + long WXUNUSED(style) = 1, + wxWindowID WXUNUSED(id) = 1, + const wxString& WXUNUSED(name) + = wxEmptyString) + { return NULL; } + + virtual wxStatusBar *GetStatusBar() const + { return NULL; } + virtual void SetStatusText(const wxString &WXUNUSED(text), + int WXUNUSED(number)=0) + { } + virtual void SetStatusWidths(int WXUNUSED(n), + const int WXUNUSED(widths)[]) + { } +#endif // wxUSE_STATUSBAR + +#if wxUSE_TOOLBAR + // no toolbar + // + // TODO: again, it should be possible to have tool bars + virtual wxToolBar *CreateToolBar(long WXUNUSED(style), + wxWindowID WXUNUSED(id), + const wxString& WXUNUSED(name)) + { return NULL; } + virtual wxToolBar *GetToolBar() const { return NULL; } +#endif // wxUSE_TOOLBAR + + // no icon + virtual void SetIcons(const wxIconBundle& WXUNUSED(icons)) { } + + // title is used as the tab label + virtual wxString GetTitle() const { return m_title; } + virtual void SetTitle(const wxString& title) = 0; + + // no maximize etc + virtual void Maximize(bool WXUNUSED(maximize) = true) { } + virtual bool IsMaximized() const { return true; } + virtual bool IsAlwaysMaximized() const { return true; } + virtual void Iconize(bool WXUNUSED(iconize) = true) { } + virtual bool IsIconized() const { return false; } + virtual void Restore() { } + + virtual bool ShowFullScreen(bool WXUNUSED(show), + long WXUNUSED(style)) { return false; } + virtual bool IsFullScreen() const { return false; } + + + // we need to override these functions to ensure that a child window is + // created even though we derive from wxFrame -- basically we make it + // behave as just a wxWindow by short-circuiting wxTLW changes to the base + // class behaviour + + virtual void AddChild(wxWindowBase *child) { wxWindow::AddChild(child); } + + virtual bool Destroy() { return wxWindow::Destroy(); } + + // extra platform-specific hacks +#ifdef __WXMSW__ + virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle = NULL) const + { + return wxWindow::MSWGetStyle(flags, exstyle); + } + + virtual WXHWND MSWGetParent() const + { + return wxWindow::MSWGetParent(); + } + + WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) + { + return wxWindow::MSWWindowProc(message, wParam, lParam); + } +#endif // __WXMSW__ + +protected: + virtual void DoGetSize(int *width, int *height) const + { + wxWindow::DoGetSize(width, height); + } + + virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags) + { + wxWindow::DoSetSize(x, y, width, height, sizeFlags); + } + + virtual void DoGetClientSize(int *width, int *height) const + { + wxWindow::DoGetClientSize(width, height); + } + + virtual void DoSetClientSize(int width, int height) + { + wxWindow::DoSetClientSize(width, height); + } + + // no size hints + virtual void DoSetSizeHints(int WXUNUSED(minW), int WXUNUSED(minH), + int WXUNUSED(maxW), int WXUNUSED(maxH), + int WXUNUSED(incW), int WXUNUSED(incH)) { } + + wxString m_title; +}; + +// ---------------------------------------------------------------------------- +// wxMDIClientWindowBase: child of parent frame, parent of children frames +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMDIClientWindowBase : public wxWindow +{ +public: + /* + The derived class must provide the default ctor only (CreateClient() + will be called later). + */ + + // Can be overridden in the derived classes but the base class version must + // be usually called first to really create the client window. + virtual bool CreateClient(wxMDIParentFrame *parent, + long style = wxVSCROLL | wxHSCROLL) = 0; +}; + +// ---------------------------------------------------------------------------- +// Include the port-specific implementation of the base classes defined above +// ---------------------------------------------------------------------------- + +// wxUSE_GENERIC_MDI_AS_NATIVE may be predefined to force the generic MDI +// implementation use even on the platforms which usually don't use it +// +// notice that generic MDI can still be used without this, but you would need +// to explicitly use wxGenericMDIXXX classes in your code (and currently also +// add src/generic/mdig.cpp to your build as it's not compiled in if generic +// MDI is not used by default -- but this may change later...) +#ifndef wxUSE_GENERIC_MDI_AS_NATIVE + // wxUniv always uses the generic MDI implementation and so do the ports + // without native version (although wxCocoa seems to have one -- but it's + // probably not functional?) + #if defined(__WXCOCOA__) || \ + defined(__WXMOTIF__) || \ + defined(__WXPM__) || \ + defined(__WXUNIVERSAL__) + #define wxUSE_GENERIC_MDI_AS_NATIVE 1 + #else + #define wxUSE_GENERIC_MDI_AS_NATIVE 0 + #endif +#endif // wxUSE_GENERIC_MDI_AS_NATIVE + +#if wxUSE_GENERIC_MDI_AS_NATIVE + #include "wx/generic/mdig.h" +#elif defined(__WXMSW__) + #include "wx/msw/mdi.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/mdi.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/mdi.h" +#elif defined(__WXMAC__) + #include "wx/osx/mdi.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/mdi.h" +#endif + +inline wxMDIClientWindow *wxMDIParentFrameBase::OnCreateClient() +{ + return new wxMDIClientWindow; +} + +inline bool wxMDIParentFrameBase::TryBefore(wxEvent& event) +{ + // Menu (and toolbar) events should be sent to the active child frame + // first, if any. + if ( event.GetEventType() == wxEVT_MENU || + event.GetEventType() == wxEVT_UPDATE_UI ) + { + wxMDIChildFrame * const child = GetActiveChild(); + if ( child ) + { + // However avoid sending the event back to the child if it's + // currently being propagated to us from it. + wxWindow* const + from = static_cast<wxWindow*>(event.GetPropagatedFrom()); + if ( !from || !from->IsDescendant(child) ) + { + if ( child->ProcessWindowEventLocally(event) ) + return true; + } + } + } + + return wxFrame::TryBefore(event); +} + +#endif // wxUSE_MDI + +#endif // _WX_MDI_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/mediactrl.h b/wxmsw/include/wx-3.0/wx/mediactrl.h new file mode 100644 index 00000000..4d0fd7b0 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/mediactrl.h @@ -0,0 +1,403 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/mediactrl.h +// Purpose: wxMediaCtrl class +// Author: Ryan Norton <wxprojects@comcast.net> +// Modified by: +// Created: 11/07/04 +// Copyright: (c) Ryan Norton +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// Definitions +// ============================================================================ + +// ---------------------------------------------------------------------------- +// Header guard +// ---------------------------------------------------------------------------- +#ifndef _WX_MEDIACTRL_H_ +#define _WX_MEDIACTRL_H_ + +// ---------------------------------------------------------------------------- +// Pre-compiled header stuff +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +// ---------------------------------------------------------------------------- +// Compilation guard +// ---------------------------------------------------------------------------- + +#if wxUSE_MEDIACTRL + +// ---------------------------------------------------------------------------- +// Includes +// ---------------------------------------------------------------------------- + +#include "wx/control.h" +#include "wx/uri.h" + +// ============================================================================ +// Declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// +// Enumerations +// +// ---------------------------------------------------------------------------- + +enum wxMediaState +{ + wxMEDIASTATE_STOPPED, + wxMEDIASTATE_PAUSED, + wxMEDIASTATE_PLAYING +}; + +enum wxMediaCtrlPlayerControls +{ + wxMEDIACTRLPLAYERCONTROLS_NONE = 0, + //Step controls like fastforward, step one frame etc. + wxMEDIACTRLPLAYERCONTROLS_STEP = 1 << 0, + //Volume controls like the speaker icon, volume slider, etc. + wxMEDIACTRLPLAYERCONTROLS_VOLUME = 1 << 1, + wxMEDIACTRLPLAYERCONTROLS_DEFAULT = + wxMEDIACTRLPLAYERCONTROLS_STEP | + wxMEDIACTRLPLAYERCONTROLS_VOLUME +}; + +#define wxMEDIABACKEND_DIRECTSHOW wxT("wxAMMediaBackend") +#define wxMEDIABACKEND_MCI wxT("wxMCIMediaBackend") +#define wxMEDIABACKEND_QUICKTIME wxT("wxQTMediaBackend") +#define wxMEDIABACKEND_GSTREAMER wxT("wxGStreamerMediaBackend") +#define wxMEDIABACKEND_REALPLAYER wxT("wxRealPlayerMediaBackend") +#define wxMEDIABACKEND_WMP10 wxT("wxWMP10MediaBackend") + +// ---------------------------------------------------------------------------- +// +// wxMediaEvent +// +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_MEDIA wxMediaEvent : public wxNotifyEvent +{ +public: + // ------------------------------------------------------------------------ + // wxMediaEvent Constructor + // + // Normal constructor, much the same as wxNotifyEvent + // ------------------------------------------------------------------------ + wxMediaEvent(wxEventType commandType = wxEVT_NULL, int winid = 0) + : wxNotifyEvent(commandType, winid) + { } + + // ------------------------------------------------------------------------ + // wxMediaEvent Copy Constructor + // + // Normal copy constructor, much the same as wxNotifyEvent + // ------------------------------------------------------------------------ + wxMediaEvent(const wxMediaEvent &clone) + : wxNotifyEvent(clone) + { } + + // ------------------------------------------------------------------------ + // wxMediaEvent::Clone + // + // Allocates a copy of this object. + // Required for wxEvtHandler::AddPendingEvent + // ------------------------------------------------------------------------ + virtual wxEvent *Clone() const + { return new wxMediaEvent(*this); } + + + // Put this class on wxWidget's RTTI table + DECLARE_DYNAMIC_CLASS(wxMediaEvent) +}; + +// ---------------------------------------------------------------------------- +// +// wxMediaCtrl +// +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_MEDIA wxMediaCtrl : public wxControl +{ +public: + wxMediaCtrl() : m_imp(NULL), m_bLoaded(false) + { } + + wxMediaCtrl(wxWindow* parent, wxWindowID winid, + const wxString& fileName = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& szBackend = wxEmptyString, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("mediaCtrl")) + : m_imp(NULL), m_bLoaded(false) + { Create(parent, winid, fileName, pos, size, style, + szBackend, validator, name); } + + wxMediaCtrl(wxWindow* parent, wxWindowID winid, + const wxURI& location, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& szBackend = wxEmptyString, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("mediaCtrl")) + : m_imp(NULL), m_bLoaded(false) + { Create(parent, winid, location, pos, size, style, + szBackend, validator, name); } + + virtual ~wxMediaCtrl(); + + bool Create(wxWindow* parent, wxWindowID winid, + const wxString& fileName = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& szBackend = wxEmptyString, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("mediaCtrl")); + + bool Create(wxWindow* parent, wxWindowID winid, + const wxURI& location, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& szBackend = wxEmptyString, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("mediaCtrl")); + + bool DoCreate(const wxClassInfo* instance, + wxWindow* parent, wxWindowID winid, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("mediaCtrl")); + + bool Play(); + bool Pause(); + bool Stop(); + + bool Load(const wxString& fileName); + + wxMediaState GetState(); + + wxFileOffset Seek(wxFileOffset where, wxSeekMode mode = wxFromStart); + wxFileOffset Tell(); //FIXME: This should be const + wxFileOffset Length(); //FIXME: This should be const + + double GetPlaybackRate(); //All but MCI & GStreamer + bool SetPlaybackRate(double dRate); //All but MCI & GStreamer + + bool Load(const wxURI& location); + bool Load(const wxURI& location, const wxURI& proxy); + + wxFileOffset GetDownloadProgress(); // DirectShow only + wxFileOffset GetDownloadTotal(); // DirectShow only + + double GetVolume(); + bool SetVolume(double dVolume); + + bool ShowPlayerControls( + wxMediaCtrlPlayerControls flags = wxMEDIACTRLPLAYERCONTROLS_DEFAULT); + + //helpers for the wxPython people + bool LoadURI(const wxString& fileName) + { return Load(wxURI(fileName)); } + bool LoadURIWithProxy(const wxString& fileName, const wxString& proxy) + { return Load(wxURI(fileName), wxURI(proxy)); } + +protected: + static const wxClassInfo* NextBackend(wxClassInfo::const_iterator* it); + + void OnMediaFinished(wxMediaEvent& evt); + virtual void DoMoveWindow(int x, int y, int w, int h); + wxSize DoGetBestSize() const; + + //FIXME: This is nasty... find a better way to work around + //inheritance issues +#if defined(__WXOSX_CARBON__) + virtual void MacVisibilityChanged(); +#endif +#if defined(__WXOSX_CARBON__) || defined(__WXCOCOA__) + friend class wxQTMediaBackend; +#endif + class wxMediaBackend* m_imp; + bool m_bLoaded; + + DECLARE_DYNAMIC_CLASS(wxMediaCtrl) +}; + +// ---------------------------------------------------------------------------- +// +// wxMediaBackend +// +// Derive from this and use standard wxWidgets RTTI +// (DECLARE_DYNAMIC_CLASS and IMPLEMENT_CLASS) to make a backend +// for wxMediaCtrl. Backends are searched alphabetically - +// the one with the earliest letter is tried first. +// +// Note that this is currently not API or ABI compatible - +// so statically link or make the client compile on-site. +// +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_MEDIA wxMediaBackend : public wxObject +{ +public: + wxMediaBackend() + { } + + virtual ~wxMediaBackend(); + + virtual bool CreateControl(wxControl* WXUNUSED(ctrl), + wxWindow* WXUNUSED(parent), + wxWindowID WXUNUSED(winid), + const wxPoint& WXUNUSED(pos), + const wxSize& WXUNUSED(size), + long WXUNUSED(style), + const wxValidator& WXUNUSED(validator), + const wxString& WXUNUSED(name)) + { return false; } + + virtual bool Play() + { return false; } + virtual bool Pause() + { return false; } + virtual bool Stop() + { return false; } + + virtual bool Load(const wxString& WXUNUSED(fileName)) + { return false; } + virtual bool Load(const wxURI& WXUNUSED(location)) + { return false; } + + virtual bool SetPosition(wxLongLong WXUNUSED(where)) + { return 0; } + virtual wxLongLong GetPosition() + { return 0; } + virtual wxLongLong GetDuration() + { return 0; } + + virtual void Move(int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(w), int WXUNUSED(h)) + { } + virtual wxSize GetVideoSize() const + { return wxSize(0,0); } + + virtual double GetPlaybackRate() + { return 0.0; } + virtual bool SetPlaybackRate(double WXUNUSED(dRate)) + { return false; } + + virtual wxMediaState GetState() + { return wxMEDIASTATE_STOPPED; } + + virtual double GetVolume() + { return 0.0; } + virtual bool SetVolume(double WXUNUSED(dVolume)) + { return false; } + + virtual bool Load(const wxURI& WXUNUSED(location), + const wxURI& WXUNUSED(proxy)) + { return false; } + + virtual bool ShowPlayerControls( + wxMediaCtrlPlayerControls WXUNUSED(flags)) + { return false; } + virtual bool IsInterfaceShown() + { return false; } + + virtual wxLongLong GetDownloadProgress() + { return 0; } + virtual wxLongLong GetDownloadTotal() + { return 0; } + + virtual void MacVisibilityChanged() + { } + virtual void RESERVED9() {} + + DECLARE_DYNAMIC_CLASS(wxMediaBackend) +}; + + +//Our events +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_FINISHED, wxMediaEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_STOP, wxMediaEvent ); + +//Function type(s) our events need +typedef void (wxEvtHandler::*wxMediaEventFunction)(wxMediaEvent&); + +#define wxMediaEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxMediaEventFunction, func) + +//Macro for usage with message maps +#define EVT_MEDIA_FINISHED(winid, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_FINISHED, winid, wxID_ANY, wxMediaEventHandler(fn), NULL ), +#define EVT_MEDIA_STOP(winid, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STOP, winid, wxID_ANY, wxMediaEventHandler(fn), NULL ), + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_LOADED, wxMediaEvent ); +#define EVT_MEDIA_LOADED(winid, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_LOADED, winid, wxID_ANY, wxMediaEventHandler(fn), NULL ), + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_STATECHANGED, wxMediaEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_PLAY, wxMediaEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_PAUSE, wxMediaEvent ); +#define EVT_MEDIA_STATECHANGED(winid, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STATECHANGED, winid, wxID_ANY, wxMediaEventHandler(fn), NULL ), +#define EVT_MEDIA_PLAY(winid, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_PLAY, winid, wxID_ANY, wxMediaEventHandler(fn), NULL ), +#define EVT_MEDIA_PAUSE(winid, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_PAUSE, winid, wxID_ANY, wxMediaEventHandler(fn), NULL ), + +// ---------------------------------------------------------------------------- +// common backend base class used by many other backends +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_MEDIA wxMediaBackendCommonBase : public wxMediaBackend +{ +public: + // add a pending wxMediaEvent of the given type + void QueueEvent(wxEventType evtType); + + // notify that the movie playback is finished + void QueueFinishEvent() + { + QueueEvent(wxEVT_MEDIA_STATECHANGED); + QueueEvent(wxEVT_MEDIA_FINISHED); + } + + // send the stop event and return true if it hasn't been vetoed + bool SendStopEvent(); + + // Queue pause event + void QueuePlayEvent(); + + // Queue pause event + void QueuePauseEvent(); + + // Queue stop event (no veto) + void QueueStopEvent(); + +protected: + // call this when the movie size has changed but not because it has just + // been loaded (in this case, call NotifyMovieLoaded() below) + void NotifyMovieSizeChanged(); + + // call this when the movie is fully loaded + void NotifyMovieLoaded(); + + + wxMediaCtrl *m_ctrl; // parent control +}; + +// ---------------------------------------------------------------------------- +// End compilation guard +// ---------------------------------------------------------------------------- +#endif // wxUSE_MEDIACTRL + +// ---------------------------------------------------------------------------- +// End header guard and header itself +// ---------------------------------------------------------------------------- +#endif // _WX_MEDIACTRL_H_ + + diff --git a/wxmsw/include/wx-3.0/wx/memconf.h b/wxmsw/include/wx-3.0/wx/memconf.h new file mode 100644 index 00000000..3dbec634 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/memconf.h @@ -0,0 +1,53 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/memconf.h +// Purpose: wxMemoryConfig class: a wxConfigBase implementation which only +// stores the settings in memory (thus they are lost when the +// program terminates) +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.01.00 +// Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/* + * NB: I don't see how this class may possibly be useful to the application + * program (as the settings are lost on program termination), but it is + * handy to have it inside wxWidgets. So for now let's say that this class + * is private and should only be used by wxWidgets itself - this might + * change in the future. + */ + +#ifndef _WX_MEMCONF_H_ +#define _WX_MEMCONF_H_ + +#if wxUSE_CONFIG + +#include "wx/fileconf.h" // the base class + +// ---------------------------------------------------------------------------- +// wxMemoryConfig: a config class which stores settings in non-persistent way +// ---------------------------------------------------------------------------- + +// notice that we inherit from wxFileConfig which already stores its data in +// memory and just disable file reading/writing - this is probably not optimal +// and might be changed in future as well (this class will always deriev from +// wxConfigBase though) +class wxMemoryConfig : public wxFileConfig +{ +public: + // default (and only) ctor + wxMemoryConfig() : wxFileConfig(wxEmptyString, // default app name + wxEmptyString, // default vendor name + wxEmptyString, // no local config file + wxEmptyString, // no system config file + 0) // don't use any files + { + } + + wxDECLARE_NO_COPY_CLASS(wxMemoryConfig); +}; + +#endif // wxUSE_CONFIG + +#endif // _WX_MEMCONF_H_ diff --git a/wxmsw/include/wx-3.0/wx/memory.h b/wxmsw/include/wx-3.0/wx/memory.h new file mode 100644 index 00000000..834ae4ef --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/memory.h @@ -0,0 +1,370 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/memory.h +// Purpose: Memory operations +// Author: Arthur Seaton, Julian Smart +// Modified by: +// Created: 29/01/98 +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MEMORY_H_ +#define _WX_MEMORY_H_ + +#include "wx/defs.h" +#include "wx/string.h" +#include "wx/msgout.h" + +#if wxUSE_MEMORY_TRACING || wxUSE_DEBUG_CONTEXT + +#include <stddef.h> + +WXDLLIMPEXP_BASE void * wxDebugAlloc(size_t size, wxChar * fileName, int lineNum, bool isObject, bool isVect = false); +WXDLLIMPEXP_BASE void wxDebugFree(void * buf, bool isVect = false); + +//********************************************************************************** +/* + The global operator new used for everything apart from getting + dynamic storage within this function itself. +*/ + +// We'll only do malloc and free for the moment: leave the interesting +// stuff for the wxObject versions. + + +#if wxUSE_GLOBAL_MEMORY_OPERATORS + +// Undefine temporarily (new is #defined in object.h) because we want to +// declare some new operators. +#ifdef new + #undef new +#endif + +#if defined(__SUNCC__) + #define wxUSE_ARRAY_MEMORY_OPERATORS 0 +#elif !( defined (__VISUALC__) && (__VISUALC__ <= 1020) ) + #define wxUSE_ARRAY_MEMORY_OPERATORS 1 +#elif defined (__SGI_CC_) + // only supported by -n32 compilers + #ifndef __EDG_ABI_COMPATIBILITY_VERSION + #define wxUSE_ARRAY_MEMORY_OPERATORS 0 + #endif +#elif !( defined (__VISUALC__) && (__VISUALC__ <= 1020) ) + #define wxUSE_ARRAY_MEMORY_OPERATORS 1 +#else + // ::operator new[] is a recent C++ feature, so assume it's not supported + #define wxUSE_ARRAY_MEMORY_OPERATORS 0 +#endif + +// devik 2000-8-29: All new/delete ops are now inline because they can't +// be marked as dllexport/dllimport. It then leads to weird bugs when +// used on MSW as DLL +#if defined(__WINDOWS__) && (defined(WXUSINGDLL) || defined(WXMAKINGDLL_BASE)) +inline void * operator new (size_t size, wxChar * fileName, int lineNum) +{ + return wxDebugAlloc(size, fileName, lineNum, false, false); +} + +inline void * operator new (size_t size) +{ + return wxDebugAlloc(size, NULL, 0, false); +} + +inline void operator delete (void * buf) +{ + wxDebugFree(buf, false); +} + +#if wxUSE_ARRAY_MEMORY_OPERATORS +inline void * operator new[] (size_t size) +{ + return wxDebugAlloc(size, NULL, 0, false, true); +} + +inline void * operator new[] (size_t size, wxChar * fileName, int lineNum) +{ + return wxDebugAlloc(size, fileName, lineNum, false, true); +} + +inline void operator delete[] (void * buf) +{ + wxDebugFree(buf, true); +} +#endif // wxUSE_ARRAY_MEMORY_OPERATORS + +#else + +void * operator new (size_t size, wxChar * fileName, int lineNum); + +void * operator new (size_t size); + +void operator delete (void * buf); + +#if wxUSE_ARRAY_MEMORY_OPERATORS +void * operator new[] (size_t size); + +void * operator new[] (size_t size, wxChar * fileName, int lineNum); + +void operator delete[] (void * buf); +#endif // wxUSE_ARRAY_MEMORY_OPERATORS +#endif // defined(__WINDOWS__) && (defined(WXUSINGDLL) || defined(WXMAKINGDLL_BASE)) + +// VC++ 6.0 +#if ( defined(__VISUALC__) && (__VISUALC__ >= 1200) ) +inline void operator delete(void* pData, wxChar* /* fileName */, int /* lineNum */) +{ + wxDebugFree(pData, false); +} +inline void operator delete[](void* pData, wxChar* /* fileName */, int /* lineNum */) +{ + wxDebugFree(pData, true); +} +#endif // __VISUALC__>=1200 +#endif // wxUSE_GLOBAL_MEMORY_OPERATORS + +//********************************************************************************** + +typedef unsigned int wxMarkerType; + +/* + Define the struct which will be placed at the start of all dynamically + allocated memory. +*/ + +class WXDLLIMPEXP_BASE wxMemStruct { + +friend class WXDLLIMPEXP_FWD_BASE wxDebugContext; // access to the m_next pointer for list traversal. + +public: +public: + int AssertList (); + + size_t RequestSize () { return m_reqSize; } + wxMarkerType Marker () { return m_firstMarker; } + + // When an object is deleted we set the id slot to a specific value. + inline void SetDeleted (); + inline int IsDeleted (); + + int Append (); + int Unlink (); + + // Used to determine if the object is really a wxMemStruct. + // Not a foolproof test by any means, but better than none I hope! + int AssertIt (); + + // Do all validation on a node. + int ValidateNode (); + + // Check the integrity of a node and of the list, node by node. + int CheckBlock (); + int CheckAllPrevious (); + + // Print a single node. + void PrintNode (); + + // Called when the memory linking functions get an error. + void ErrorMsg (const char *); + void ErrorMsg (); + + inline void *GetActualData(void) const { return m_actualData; } + + void Dump(void); + +public: + // Check for underwriting. There are 2 of these checks. This one + // inside the struct and another right after the struct. + wxMarkerType m_firstMarker; + + // File name and line number are from cpp. + wxChar* m_fileName; + int m_lineNum; + + // The amount of memory requested by the caller. + size_t m_reqSize; + + // Used to try to verify that we really are dealing with an object + // of the required class. Can be 1 of 2 values these indicating a valid + // wxMemStruct object, or a deleted wxMemStruct object. + wxMarkerType m_id; + + wxMemStruct * m_prev; + wxMemStruct * m_next; + + void * m_actualData; + bool m_isObject; +}; + + +typedef void (wxMemStruct::*PmSFV) (); + +// Type of the app function that can be installed and called at wxWidgets shutdown +// (after all other registered files with global destructors have been closed down). +typedef void (*wxShutdownNotifyFunction)(); + +/* + Debugging class. This will only have a single instance, but it's + a reasonable way to keep everything together and to make this + available for change if needed by someone else. + A lot of this stuff would be better off within the wxMemStruct class, but + it's stuff which we need to access at times when there is no wxMemStruct + object so we use this class instead. Think of it as a collection of + globals which have to do with the wxMemStruct class. +*/ + +class WXDLLIMPEXP_BASE wxDebugContext { + +protected: + // Used to set alignment for markers. + static size_t CalcAlignment (); + + // Returns the amount of padding needed after something of the given + // size. This is so that when we cast pointers backwards and forwards + // the pointer value will be valid for a wxMarkerType. + static size_t GetPadding (const size_t size) ; + + // Traverse the list. + static void TraverseList (PmSFV, wxMemStruct *from = NULL); + + static int debugLevel; + static bool debugOn; + + static int m_balign; // byte alignment + static int m_balignmask; // mask for performing byte alignment +public: + // Set a checkpoint to dump only the memory from + // a given point + static wxMemStruct *checkPoint; + + wxDebugContext(void); + ~wxDebugContext(void); + + static int GetLevel(void) { return debugLevel; } + static void SetLevel(int level) { debugLevel = level; } + + static bool GetDebugMode(void) { return debugOn; } + static void SetDebugMode(bool flag) { debugOn = flag; } + + static void SetCheckpoint(bool all = false); + static wxMemStruct *GetCheckpoint(void) { return checkPoint; } + + // Calculated from the request size and any padding needed + // before the final marker. + static size_t PaddedSize (const size_t reqSize); + + // Calc the total amount of space we need from the system + // to satisfy a caller request. This includes all padding. + static size_t TotSize (const size_t reqSize); + + // Return valid pointers to offsets within the allocated memory. + static char * StructPos (const char * buf); + static char * MidMarkerPos (const char * buf); + static char * CallerMemPos (const char * buf); + static char * EndMarkerPos (const char * buf, const size_t size); + + // Given a pointer to the start of the caller requested area + // return a pointer to the start of the entire alloc\'d buffer. + static char * StartPos (const char * caller); + + // Access to the list. + static wxMemStruct * GetHead () { return m_head; } + static wxMemStruct * GetTail () { return m_tail; } + + // Set the list sentinals. + static wxMemStruct * SetHead (wxMemStruct * st) { return (m_head = st); } + static wxMemStruct * SetTail (wxMemStruct * st) { return (m_tail = st); } + + // If this is set then every new operation checks the validity + // of the all previous nodes in the list. + static bool GetCheckPrevious () { return m_checkPrevious; } + static void SetCheckPrevious (bool value) { m_checkPrevious = value; } + + // Checks all nodes, or all nodes if checkAll is true + static int Check(bool checkAll = false); + + // Print out the list of wxMemStruct nodes. + static bool PrintList(void); + + // Dump objects + static bool Dump(void); + + // Print statistics + static bool PrintStatistics(bool detailed = true); + + // Print out the classes in the application. + static bool PrintClasses(void); + + // Count the number of non-wxDebugContext-related objects + // that are outstanding + static int CountObjectsLeft(bool sinceCheckpoint = false); + + // This function is used to output the dump + static void OutputDumpLine(const wxChar *szFormat, ...); + + static void SetShutdownNotifyFunction(wxShutdownNotifyFunction shutdownFn); + +private: + // Store these here to allow access to the list without + // needing to have a wxMemStruct object. + static wxMemStruct* m_head; + static wxMemStruct* m_tail; + + // Set to false if we're not checking all previous nodes when + // we do a new. Set to true when we are. + static bool m_checkPrevious; + + // Holds a pointer to an optional application function to call at shutdown. + static wxShutdownNotifyFunction sm_shutdownFn; + + // Have to access our shutdown hook + friend class wxDebugContextDumpDelayCounter; +}; + +// Final cleanup (e.g. deleting the log object and doing memory leak checking) +// will be delayed until all wxDebugContextDumpDelayCounter objects have been +// destructed. Adding one wxDebugContextDumpDelayCounter per file will delay +// memory leak checking until after destructing all global objects. + +class WXDLLIMPEXP_BASE wxDebugContextDumpDelayCounter +{ +public: + wxDebugContextDumpDelayCounter(); + ~wxDebugContextDumpDelayCounter(); + +private: + void DoDump(); + static int sm_count; +}; + +// make leak dump after all globals have been destructed +static wxDebugContextDumpDelayCounter wxDebugContextDumpDelayCounter_File; +#define WXDEBUG_DUMPDELAYCOUNTER \ + static wxDebugContextDumpDelayCounter wxDebugContextDumpDelayCounter_Extra; + +// Output a debug message, in a system dependent fashion. +void WXDLLIMPEXP_BASE wxTrace(const wxChar *fmt ...) WX_ATTRIBUTE_PRINTF_1; +void WXDLLIMPEXP_BASE wxTraceLevel(int level, const wxChar *fmt ...) WX_ATTRIBUTE_PRINTF_2; + +#define WXTRACE wxTrace +#define WXTRACELEVEL wxTraceLevel + +#else // wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT + +#define WXDEBUG_DUMPDELAYCOUNTER + +// Borland C++ Builder 6 seems to have troubles with inline functions (see bug +// 819700) +#if 0 + inline void wxTrace(const wxChar *WXUNUSED(fmt)) {} + inline void wxTraceLevel(int WXUNUSED(level), const wxChar *WXUNUSED(fmt)) {} +#else + #define wxTrace(fmt) + #define wxTraceLevel(l, fmt) +#endif + +#define WXTRACE true ? (void)0 : wxTrace +#define WXTRACELEVEL true ? (void)0 : wxTraceLevel + +#endif // wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT + +#endif // _WX_MEMORY_H_ diff --git a/wxmsw/include/wx-3.0/wx/memtext.h b/wxmsw/include/wx-3.0/wx/memtext.h new file mode 100644 index 00000000..475e8fdc --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/memtext.h @@ -0,0 +1,54 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/memtext.h +// Purpose: wxMemoryText allows to use wxTextBuffer without a file +// Created: 14.11.01 +// Author: Morten Hanssen +// Copyright: (c) 2001 Morten Hanssen +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MEMTEXT_H +#define _WX_MEMTEXT_H + +#include "wx/defs.h" + +// there is no separate setting for wxMemoryText, it's smallish anyhow +#if wxUSE_TEXTBUFFER + +// ---------------------------------------------------------------------------- +// wxMemoryText +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMemoryText : public wxTextBuffer +{ +public: + // Constructors. + wxMemoryText() { } + wxMemoryText(const wxString& name) : wxTextBuffer(name) { } + +protected: + virtual bool OnExists() const + { return false; } + + virtual bool OnOpen(const wxString & WXUNUSED(strBufferName), + wxTextBufferOpenMode WXUNUSED(OpenMode)) + { return true; } + + virtual bool OnClose() + { return true; } + + virtual bool OnRead(const wxMBConv& WXUNUSED(conv)) + { return true; } + + virtual bool OnWrite(wxTextFileType WXUNUSED(typeNew), + const wxMBConv& WXUNUSED(conv) = wxMBConvUTF8()) + { return true; } + +private: + wxDECLARE_NO_COPY_CLASS(wxMemoryText); +}; + +#endif // wxUSE_TEXTBUFFER + +#endif // _WX_MEMTEXT_H + diff --git a/wxmsw/include/wx-3.0/wx/menu.h b/wxmsw/include/wx-3.0/wx/menu.h new file mode 100644 index 00000000..e4dedcf2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/menu.h @@ -0,0 +1,630 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/menu.h +// Purpose: wxMenu and wxMenuBar classes +// Author: Vadim Zeitlin +// Modified by: +// Created: 26.10.99 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MENU_H_BASE_ +#define _WX_MENU_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_MENUS + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/list.h" // for "template" list classes +#include "wx/window.h" // base class for wxMenuBar + +// also include this one to ensure compatibility with old code which only +// included wx/menu.h +#include "wx/menuitem.h" + +class WXDLLIMPEXP_FWD_CORE wxFrame; +class WXDLLIMPEXP_FWD_CORE wxMenu; +class WXDLLIMPEXP_FWD_CORE wxMenuBarBase; +class WXDLLIMPEXP_FWD_CORE wxMenuBar; +class WXDLLIMPEXP_FWD_CORE wxMenuItem; + +// pseudo template list classes +WX_DECLARE_EXPORTED_LIST(wxMenu, wxMenuList); +WX_DECLARE_EXPORTED_LIST(wxMenuItem, wxMenuItemList); + +// ---------------------------------------------------------------------------- +// wxMenu +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMenuBase : public wxEvtHandler +{ +public: + // create a menu + static wxMenu *New(const wxString& title = wxEmptyString, long style = 0); + + // ctors + wxMenuBase(const wxString& title, long style = 0) : m_title(title) + { Init(style); } + wxMenuBase(long style = 0) + { Init(style); } + + // dtor deletes all the menu items we own + virtual ~wxMenuBase(); + + // menu construction + // ----------------- + + // append any kind of item (normal/check/radio/separator) + wxMenuItem* Append(int itemid, + const wxString& text = wxEmptyString, + const wxString& help = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL) + { + return DoAppend(wxMenuItem::New((wxMenu *)this, itemid, text, help, kind)); + } + + // append a separator to the menu + wxMenuItem* AppendSeparator() { return Append(wxID_SEPARATOR); } + + // append a check item + wxMenuItem* AppendCheckItem(int itemid, + const wxString& text, + const wxString& help = wxEmptyString) + { + return Append(itemid, text, help, wxITEM_CHECK); + } + + // append a radio item + wxMenuItem* AppendRadioItem(int itemid, + const wxString& text, + const wxString& help = wxEmptyString) + { + return Append(itemid, text, help, wxITEM_RADIO); + } + + // append a submenu + wxMenuItem* AppendSubMenu(wxMenu *submenu, + const wxString& text, + const wxString& help = wxEmptyString) + { + return DoAppend(wxMenuItem::New((wxMenu *)this, wxID_ANY, text, help, + wxITEM_NORMAL, submenu)); + } + + // the most generic form of Append() - append anything + wxMenuItem* Append(wxMenuItem *item) { return DoAppend(item); } + + // insert a break in the menu (only works when appending the items, not + // inserting them) + virtual void Break() { } + + // insert an item before given position + wxMenuItem* Insert(size_t pos, wxMenuItem *item); + + // insert an item before given position + wxMenuItem* Insert(size_t pos, + int itemid, + const wxString& text = wxEmptyString, + const wxString& help = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL) + { + return Insert(pos, wxMenuItem::New((wxMenu *)this, itemid, text, help, kind)); + } + + // insert a separator + wxMenuItem* InsertSeparator(size_t pos) + { + return Insert(pos, wxMenuItem::New((wxMenu *)this, wxID_SEPARATOR)); + } + + // insert a check item + wxMenuItem* InsertCheckItem(size_t pos, + int itemid, + const wxString& text, + const wxString& help = wxEmptyString) + { + return Insert(pos, itemid, text, help, wxITEM_CHECK); + } + + // insert a radio item + wxMenuItem* InsertRadioItem(size_t pos, + int itemid, + const wxString& text, + const wxString& help = wxEmptyString) + { + return Insert(pos, itemid, text, help, wxITEM_RADIO); + } + + // insert a submenu + wxMenuItem* Insert(size_t pos, + int itemid, + const wxString& text, + wxMenu *submenu, + const wxString& help = wxEmptyString) + { + return Insert(pos, wxMenuItem::New((wxMenu *)this, itemid, text, help, + wxITEM_NORMAL, submenu)); + } + + // prepend an item to the menu + wxMenuItem* Prepend(wxMenuItem *item) + { + return Insert(0u, item); + } + + // prepend any item to the menu + wxMenuItem* Prepend(int itemid, + const wxString& text = wxEmptyString, + const wxString& help = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL) + { + return Insert(0u, itemid, text, help, kind); + } + + // prepend a separator + wxMenuItem* PrependSeparator() + { + return InsertSeparator(0u); + } + + // prepend a check item + wxMenuItem* PrependCheckItem(int itemid, + const wxString& text, + const wxString& help = wxEmptyString) + { + return InsertCheckItem(0u, itemid, text, help); + } + + // prepend a radio item + wxMenuItem* PrependRadioItem(int itemid, + const wxString& text, + const wxString& help = wxEmptyString) + { + return InsertRadioItem(0u, itemid, text, help); + } + + // prepend a submenu + wxMenuItem* Prepend(int itemid, + const wxString& text, + wxMenu *submenu, + const wxString& help = wxEmptyString) + { + return Insert(0u, itemid, text, submenu, help); + } + + // detach an item from the menu, but don't delete it so that it can be + // added back later (but if it's not, the caller is responsible for + // deleting it!) + wxMenuItem *Remove(int itemid) { return Remove(FindChildItem(itemid)); } + wxMenuItem *Remove(wxMenuItem *item); + + // delete an item from the menu (submenus are not destroyed by this + // function, see Destroy) + bool Delete(int itemid) { return Delete(FindChildItem(itemid)); } + bool Delete(wxMenuItem *item); + + // delete the item from menu and destroy it (if it's a submenu) + bool Destroy(int itemid) { return Destroy(FindChildItem(itemid)); } + bool Destroy(wxMenuItem *item); + + // menu items access + // ----------------- + + // get the items + size_t GetMenuItemCount() const { return m_items.GetCount(); } + + const wxMenuItemList& GetMenuItems() const { return m_items; } + wxMenuItemList& GetMenuItems() { return m_items; } + + // search + virtual int FindItem(const wxString& item) const; + wxMenuItem* FindItem(int itemid, wxMenu **menu = NULL) const; + + // find by position + wxMenuItem* FindItemByPosition(size_t position) const; + + // get/set items attributes + void Enable(int itemid, bool enable); + bool IsEnabled(int itemid) const; + + void Check(int itemid, bool check); + bool IsChecked(int itemid) const; + + void SetLabel(int itemid, const wxString& label); + wxString GetLabel(int itemid) const; + + // Returns the stripped label + wxString GetLabelText(int itemid) const { return wxMenuItem::GetLabelText(GetLabel(itemid)); } + + virtual void SetHelpString(int itemid, const wxString& helpString); + virtual wxString GetHelpString(int itemid) const; + + // misc accessors + // -------------- + + // the title + virtual void SetTitle(const wxString& title) { m_title = title; } + const wxString& GetTitle() const { return m_title; } + + // event handler + void SetEventHandler(wxEvtHandler *handler) { m_eventHandler = handler; } + wxEvtHandler *GetEventHandler() const { return m_eventHandler; } + + // Invoking window: this is set by wxWindow::PopupMenu() before showing a + // popup menu and reset after it's hidden. Notice that you probably want to + // use GetWindow() below instead of GetInvokingWindow() as the latter only + // returns non-NULL for the top level menus + // + // NB: avoid calling SetInvokingWindow() directly if possible, use + // wxMenuInvokingWindowSetter class below instead + void SetInvokingWindow(wxWindow *win); + wxWindow *GetInvokingWindow() const { return m_invokingWindow; } + + // the window associated with this menu: this is the invoking window for + // popup menus or the top level window to which the menu bar is attached + // for menus which are part of a menu bar + wxWindow *GetWindow() const; + + // style + long GetStyle() const { return m_style; } + + // implementation helpers + // ---------------------- + + // Updates the UI for a menu and all submenus recursively. source is the + // object that has the update event handlers defined for it. If NULL, the + // menu or associated window will be used. + void UpdateUI(wxEvtHandler* source = NULL); + + // get the menu bar this menu is attached to (may be NULL, always NULL for + // popup menus). Traverse up the menu hierarchy to find it. + wxMenuBar *GetMenuBar() const; + + // called when the menu is attached/detached to/from a menu bar + virtual void Attach(wxMenuBarBase *menubar); + virtual void Detach(); + + // is the menu attached to a menu bar (or is it a popup one)? + bool IsAttached() const { return GetMenuBar() != NULL; } + + // set/get the parent of this menu + void SetParent(wxMenu *parent) { m_menuParent = parent; } + wxMenu *GetParent() const { return m_menuParent; } + + // implementation only from now on + // ------------------------------- + + // unlike FindItem(), this function doesn't recurse but only looks through + // our direct children and also may return the index of the found child if + // pos != NULL + wxMenuItem *FindChildItem(int itemid, size_t *pos = NULL) const; + + // called to generate a wxCommandEvent, return true if it was processed, + // false otherwise + // + // the checked parameter may have boolean value or -1 for uncheckable items + bool SendEvent(int itemid, int checked = -1); + + // compatibility: these functions are deprecated, use the new ones instead + // ----------------------------------------------------------------------- + + // use the versions taking wxItem_XXX now instead, they're more readable + // and allow adding the radio items as well + void Append(int itemid, + const wxString& text, + const wxString& help, + bool isCheckable) + { + Append(itemid, text, help, isCheckable ? wxITEM_CHECK : wxITEM_NORMAL); + } + + // use more readable and not requiring unused itemid AppendSubMenu() instead + wxMenuItem* Append(int itemid, + const wxString& text, + wxMenu *submenu, + const wxString& help = wxEmptyString) + { + return DoAppend(wxMenuItem::New((wxMenu *)this, itemid, text, help, + wxITEM_NORMAL, submenu)); + } + + void Insert(size_t pos, + int itemid, + const wxString& text, + const wxString& help, + bool isCheckable) + { + Insert(pos, itemid, text, help, isCheckable ? wxITEM_CHECK : wxITEM_NORMAL); + } + + void Prepend(int itemid, + const wxString& text, + const wxString& help, + bool isCheckable) + { + Insert(0u, itemid, text, help, isCheckable); + } + + static void LockAccels(bool locked) + { + ms_locked = locked; + } + +protected: + // virtuals to override in derived classes + // --------------------------------------- + + virtual wxMenuItem* DoAppend(wxMenuItem *item); + virtual wxMenuItem* DoInsert(size_t pos, wxMenuItem *item); + + virtual wxMenuItem *DoRemove(wxMenuItem *item); + virtual bool DoDelete(wxMenuItem *item); + virtual bool DoDestroy(wxMenuItem *item); + + // helpers + // ------- + + // common part of all ctors + void Init(long style); + + // associate the submenu with this menu + void AddSubMenu(wxMenu *submenu); + + wxMenuBar *m_menuBar; // menubar we belong to or NULL + wxMenu *m_menuParent; // parent menu or NULL + + wxString m_title; // the menu title or label + wxMenuItemList m_items; // the list of menu items + + wxWindow *m_invokingWindow; // for popup menus + + long m_style; // combination of wxMENU_XXX flags + + wxEvtHandler *m_eventHandler; // a pluggable in event handler + + static bool ms_locked; + + wxDECLARE_NO_COPY_CLASS(wxMenuBase); +}; + +#if wxUSE_EXTENDED_RTTI + +// ---------------------------------------------------------------------------- +// XTI accessor +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMenuInfoHelper : public wxObject +{ +public: + wxMenuInfoHelper() { m_menu = NULL; } + virtual ~wxMenuInfoHelper() { } + + bool Create( wxMenu *menu, const wxString &title ) + { + m_menu = menu; + m_title = title; + return true; + } + + wxMenu* GetMenu() const { return m_menu; } + wxString GetTitle() const { return m_title; } + +private: + wxMenu *m_menu; + wxString m_title; + + DECLARE_DYNAMIC_CLASS(wxMenuInfoHelper) +}; + +WX_DECLARE_EXPORTED_LIST(wxMenuInfoHelper, wxMenuInfoHelperList ); + +#endif + +// ---------------------------------------------------------------------------- +// wxMenuBar +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMenuBarBase : public wxWindow +{ +public: + // default ctor + wxMenuBarBase(); + + // dtor will delete all menus we own + virtual ~wxMenuBarBase(); + + // menu bar construction + // --------------------- + + // append a menu to the end of menubar, return true if ok + virtual bool Append(wxMenu *menu, const wxString& title); + + // insert a menu before the given position into the menubar, return true + // if inserted ok + virtual bool Insert(size_t pos, wxMenu *menu, const wxString& title); + + // menu bar items access + // --------------------- + + // get the number of menus in the menu bar + size_t GetMenuCount() const { return m_menus.GetCount(); } + + // get the menu at given position + wxMenu *GetMenu(size_t pos) const; + + // replace the menu at given position with another one, returns the + // previous menu (which should be deleted by the caller) + virtual wxMenu *Replace(size_t pos, wxMenu *menu, const wxString& title); + + // delete the menu at given position from the menu bar, return the pointer + // to the menu (which should be deleted by the caller) + virtual wxMenu *Remove(size_t pos); + + // enable or disable a submenu + virtual void EnableTop(size_t pos, bool enable) = 0; + + // is the menu enabled? + virtual bool IsEnabledTop(size_t WXUNUSED(pos)) const { return true; } + + // get or change the label of the menu at given position + virtual void SetMenuLabel(size_t pos, const wxString& label) = 0; + virtual wxString GetMenuLabel(size_t pos) const = 0; + + // get the stripped label of the menu at given position + virtual wxString GetMenuLabelText(size_t pos) const { return wxMenuItem::GetLabelText(GetMenuLabel(pos)); } + + // item search + // ----------- + + // by menu and item names, returns wxNOT_FOUND if not found or id of the + // found item + virtual int FindMenuItem(const wxString& menu, const wxString& item) const; + + // find item by id (in any menu), returns NULL if not found + // + // if menu is !NULL, it will be filled with wxMenu this item belongs to + virtual wxMenuItem* FindItem(int itemid, wxMenu **menu = NULL) const; + + // find menu by its caption, return wxNOT_FOUND on failure + int FindMenu(const wxString& title) const; + + // item access + // ----------- + + // all these functions just use FindItem() and then call an appropriate + // method on it + // + // NB: under MSW, these methods can only be used after the menubar had + // been attached to the frame + + void Enable(int itemid, bool enable); + void Check(int itemid, bool check); + bool IsChecked(int itemid) const; + bool IsEnabled(int itemid) const; + virtual bool IsEnabled() const { return wxWindow::IsEnabled(); } + + void SetLabel(int itemid, const wxString &label); + wxString GetLabel(int itemid) const; + + void SetHelpString(int itemid, const wxString& helpString); + wxString GetHelpString(int itemid) const; + + // implementation helpers + + // get the frame we are attached to (may return NULL) + wxFrame *GetFrame() const { return m_menuBarFrame; } + + // returns true if we're attached to a frame + bool IsAttached() const { return GetFrame() != NULL; } + + // associate the menubar with the frame + virtual void Attach(wxFrame *frame); + + // called before deleting the menubar normally + virtual void Detach(); + + // need to override these ones to avoid virtual function hiding + virtual bool Enable(bool enable = true) { return wxWindow::Enable(enable); } + virtual void SetLabel(const wxString& s) { wxWindow::SetLabel(s); } + virtual wxString GetLabel() const { return wxWindow::GetLabel(); } + + // don't want menu bars to accept the focus by tabbing to them + virtual bool AcceptsFocusFromKeyboard() const { return false; } + + // update all menu item states in all menus + virtual void UpdateMenus(); + + virtual bool CanBeOutsideClientArea() const { return true; } + +#if wxUSE_EXTENDED_RTTI + // XTI helpers: + bool AppendMenuInfo( const wxMenuInfoHelper *info ) + { return Append( info->GetMenu(), info->GetTitle() ); } + const wxMenuInfoHelperList& GetMenuInfos() const; +#endif + +#if WXWIN_COMPATIBILITY_2_8 + // get or change the label of the menu at given position + // Deprecated in favour of SetMenuLabel + wxDEPRECATED( void SetLabelTop(size_t pos, const wxString& label) ); + // Deprecated in favour of GetMenuLabelText + wxDEPRECATED( wxString GetLabelTop(size_t pos) const ); +#endif + +protected: + // the list of all our menus + wxMenuList m_menus; + +#if wxUSE_EXTENDED_RTTI + // used by XTI + wxMenuInfoHelperList m_menuInfos; +#endif + + // the frame we are attached to (may be NULL) + wxFrame *m_menuBarFrame; + + wxDECLARE_NO_COPY_CLASS(wxMenuBarBase); +}; + +// ---------------------------------------------------------------------------- +// include the real class declaration +// ---------------------------------------------------------------------------- + +#ifdef wxUSE_BASE_CLASSES_ONLY + #define wxMenuItem wxMenuItemBase +#else // !wxUSE_BASE_CLASSES_ONLY +#if defined(__WXUNIVERSAL__) + #include "wx/univ/menu.h" +#elif defined(__WXMSW__) + #include "wx/msw/menu.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/menu.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/menu.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/menu.h" +#elif defined(__WXMAC__) + #include "wx/osx/menu.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/menu.h" +#elif defined(__WXPM__) + #include "wx/os2/menu.h" +#endif +#endif // wxUSE_BASE_CLASSES_ONLY/!wxUSE_BASE_CLASSES_ONLY + +// ---------------------------------------------------------------------------- +// Helper class used in the implementation only: sets the invoking window of +// the given menu in its ctor and resets it in dtor. +// ---------------------------------------------------------------------------- + +class wxMenuInvokingWindowSetter +{ +public: + // Ctor sets the invoking window for the given menu. + // + // The menu lifetime must be greater than that of this class. + wxMenuInvokingWindowSetter(wxMenu& menu, wxWindow *win) + : m_menu(menu) + { + menu.SetInvokingWindow(win); + } + + // Dtor resets the invoking window. + ~wxMenuInvokingWindowSetter() + { + m_menu.SetInvokingWindow(NULL); + } + +private: + wxMenu& m_menu; + + wxDECLARE_NO_COPY_CLASS(wxMenuInvokingWindowSetter); +}; + +#endif // wxUSE_MENUS + +#endif // _WX_MENU_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/menuitem.h b/wxmsw/include/wx-3.0/wx/menuitem.h new file mode 100644 index 00000000..4eb80b7b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/menuitem.h @@ -0,0 +1,217 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/menuitem.h +// Purpose: wxMenuItem class +// Author: Vadim Zeitlin +// Modified by: +// Created: 25.10.99 +// Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MENUITEM_H_BASE_ +#define _WX_MENUITEM_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_MENUS + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/object.h" // base class + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxAcceleratorEntry; +class WXDLLIMPEXP_FWD_CORE wxMenuItem; +class WXDLLIMPEXP_FWD_CORE wxMenu; + +// ---------------------------------------------------------------------------- +// wxMenuItem is an item in the menu which may be either a normal item, a sub +// menu or a separator +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMenuItemBase : public wxObject +{ +public: + // creation + static wxMenuItem *New(wxMenu *parentMenu = NULL, + int itemid = wxID_SEPARATOR, + const wxString& text = wxEmptyString, + const wxString& help = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL, + wxMenu *subMenu = NULL); + + // destruction: wxMenuItem will delete its submenu + virtual ~wxMenuItemBase(); + + // the menu we're in + wxMenu *GetMenu() const { return m_parentMenu; } + void SetMenu(wxMenu* menu) { m_parentMenu = menu; } + + // get/set id + void SetId(int itemid) { m_id = itemid; } + int GetId() const { return m_id; } + + // the item's text (or name) + // + // NB: the item's label includes the accelerators and mnemonics info (if + // any), i.e. it may contain '&' or '_' or "\t..." and thus is + // different from the item's text which only contains the text shown + // in the menu. This used to be called SetText. + virtual void SetItemLabel(const wxString& str); + + // return the item label including any mnemonics and accelerators. + // This used to be called GetText. + virtual wxString GetItemLabel() const { return m_text; } + + // return just the text of the item label, without any mnemonics + // This used to be called GetLabel. + virtual wxString GetItemLabelText() const { return GetLabelText(m_text); } + + // return just the text part of the given label (implemented in platform-specific code) + // This used to be called GetLabelFromText. + static wxString GetLabelText(const wxString& label); + + // what kind of menu item we are + wxItemKind GetKind() const { return m_kind; } + void SetKind(wxItemKind kind) { m_kind = kind; } + bool IsSeparator() const { return m_kind == wxITEM_SEPARATOR; } + + bool IsCheck() const { return m_kind == wxITEM_CHECK; } + bool IsRadio() const { return m_kind == wxITEM_RADIO; } + + virtual void SetCheckable(bool checkable) + { m_kind = checkable ? wxITEM_CHECK : wxITEM_NORMAL; } + + // Notice that this doesn't quite match SetCheckable(). + bool IsCheckable() const + { return m_kind == wxITEM_CHECK || m_kind == wxITEM_RADIO; } + + bool IsSubMenu() const { return m_subMenu != NULL; } + void SetSubMenu(wxMenu *menu) { m_subMenu = menu; } + wxMenu *GetSubMenu() const { return m_subMenu; } + + // state + virtual void Enable(bool enable = true) { m_isEnabled = enable; } + virtual bool IsEnabled() const { return m_isEnabled; } + + virtual void Check(bool check = true) { m_isChecked = check; } + virtual bool IsChecked() const { return m_isChecked; } + void Toggle() { Check(!m_isChecked); } + + // help string (displayed in the status bar by default) + void SetHelp(const wxString& str); + const wxString& GetHelp() const { return m_help; } + +#if wxUSE_ACCEL + // extract the accelerator from the given menu string, return NULL if none + // found + static wxAcceleratorEntry *GetAccelFromString(const wxString& label); + + // get our accelerator or NULL (caller must delete the pointer) + virtual wxAcceleratorEntry *GetAccel() const; + + // set the accel for this item - this may also be done indirectly with + // SetText() + virtual void SetAccel(wxAcceleratorEntry *accel); +#endif // wxUSE_ACCEL + +#if WXWIN_COMPATIBILITY_2_8 + // compatibility only, use new functions in the new code + wxDEPRECATED( void SetName(const wxString& str) ); + wxDEPRECATED( wxString GetName() const ); + + // Now use GetItemLabelText + wxDEPRECATED( wxString GetLabel() const ) ; + + // Now use GetItemLabel + wxDEPRECATED( const wxString& GetText() const ); + + // Now use GetLabelText to strip the accelerators + static wxDEPRECATED( wxString GetLabelFromText(const wxString& text) ); + + // Now use SetItemLabel + wxDEPRECATED( virtual void SetText(const wxString& str) ); +#endif // WXWIN_COMPATIBILITY_2_8 + + static wxMenuItem *New(wxMenu *parentMenu, + int itemid, + const wxString& text, + const wxString& help, + bool isCheckable, + wxMenu *subMenu = NULL) + { + return New(parentMenu, itemid, text, help, + isCheckable ? wxITEM_CHECK : wxITEM_NORMAL, subMenu); + } + +protected: + wxWindowIDRef m_id; // numeric id of the item >= 0 or wxID_ANY or wxID_SEPARATOR + wxMenu *m_parentMenu, // the menu we belong to + *m_subMenu; // our sub menu or NULL + wxString m_text, // label of the item + m_help; // the help string for the item + wxItemKind m_kind; // separator/normal/check/radio item? + bool m_isChecked; // is checked? + bool m_isEnabled; // is enabled? + + // this ctor is for the derived classes only, we're never created directly + wxMenuItemBase(wxMenu *parentMenu = NULL, + int itemid = wxID_SEPARATOR, + const wxString& text = wxEmptyString, + const wxString& help = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL, + wxMenu *subMenu = NULL); + +private: + // and, if we have one ctor, compiler won't generate a default copy one, so + // declare them ourselves - but don't implement as they shouldn't be used + wxMenuItemBase(const wxMenuItemBase& item); + wxMenuItemBase& operator=(const wxMenuItemBase& item); +}; + +#if WXWIN_COMPATIBILITY_2_8 +inline void wxMenuItemBase::SetName(const wxString &str) + { SetItemLabel(str); } +inline wxString wxMenuItemBase::GetName() const + { return GetItemLabel(); } +inline wxString wxMenuItemBase::GetLabel() const + { return GetLabelText(m_text); } +inline const wxString& wxMenuItemBase::GetText() const { return m_text; } +inline void wxMenuItemBase::SetText(const wxString& text) { SetItemLabel(text); } +#endif // WXWIN_COMPATIBILITY_2_8 + +// ---------------------------------------------------------------------------- +// include the real class declaration +// ---------------------------------------------------------------------------- + +#ifdef wxUSE_BASE_CLASSES_ONLY + #define wxMenuItem wxMenuItemBase +#else // !wxUSE_BASE_CLASSES_ONLY +#if defined(__WXUNIVERSAL__) + #include "wx/univ/menuitem.h" +#elif defined(__WXMSW__) + #include "wx/msw/menuitem.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/menuitem.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/menuitem.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/menuitem.h" +#elif defined(__WXMAC__) + #include "wx/osx/menuitem.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/menuitem.h" +#elif defined(__WXPM__) + #include "wx/os2/menuitem.h" +#endif +#endif // wxUSE_BASE_CLASSES_ONLY/!wxUSE_BASE_CLASSES_ONLY + +#endif // wxUSE_MENUS + +#endif + // _WX_MENUITEM_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/meta/convertible.h b/wxmsw/include/wx-3.0/wx/meta/convertible.h new file mode 100644 index 00000000..45999378 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/meta/convertible.h @@ -0,0 +1,38 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/meta/convertible.h +// Purpose: Test if types are convertible +// Author: Arne Steinarson +// Created: 2008-01-10 +// Copyright: (c) 2008 Arne Steinarson +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_META_CONVERTIBLE_H_ +#define _WX_META_CONVERTIBLE_H_ + +// +// Introduce an extra class to make this header compilable with g++3.2 +// +template <class D, class B> +struct wxConvertibleTo_SizeHelper +{ + static char Match(B* pb); + static int Match(...); +}; + +// Helper to decide if an object of type D is convertible to type B (the test +// succeeds in particular when D derives from B) +template <class D, class B> +struct wxConvertibleTo +{ + enum + { + value = + sizeof(wxConvertibleTo_SizeHelper<D,B>::Match(static_cast<D*>(NULL))) + == + sizeof(char) + }; +}; + +#endif // _WX_META_CONVERTIBLE_H_ + diff --git a/wxmsw/include/wx-3.0/wx/meta/if.h b/wxmsw/include/wx-3.0/wx/meta/if.h new file mode 100644 index 00000000..f6f3672f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/meta/if.h @@ -0,0 +1,72 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/meta/if.h +// Purpose: declares wxIf<> metaprogramming construct +// Author: Vaclav Slavik +// Created: 2008-01-22 +// Copyright: (c) 2008 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_META_IF_H_ +#define _WX_META_IF_H_ + +#include "wx/defs.h" + +// NB: This code is intentionally written without partial templates +// specialization, because some older compilers (notably VC6) don't +// support it. + +namespace wxPrivate +{ + +template <bool Cond> +struct wxIfImpl + +// broken VC6 needs not just an incomplete template class declaration but a +// "skeleton" declaration of the specialized versions below as it apparently +// tries to look up the types in the generic template definition at some moment +// even though it ends up by using the correct specialization in the end -- but +// without this skeleton it doesn't recognize Result as a class at all below +#if defined(__VISUALC__) && !wxCHECK_VISUALC_VERSION(7) +{ + template<typename TTrue, typename TFalse> struct Result {}; +} +#endif // VC++ <= 6 +; + +// specialization for true: +template <> +struct wxIfImpl<true> +{ + template<typename TTrue, typename TFalse> struct Result + { + typedef TTrue value; + }; +}; + +// specialization for false: +template<> +struct wxIfImpl<false> +{ + template<typename TTrue, typename TFalse> struct Result + { + typedef TFalse value; + }; +}; + +} // namespace wxPrivate + +// wxIf<> template defines nested type "value" which is the same as +// TTrue if the condition Cond (boolean compile-time constant) was met and +// TFalse if it wasn't. +// +// See wxVector<T> in vector.h for usage example +template<bool Cond, typename TTrue, typename TFalse> +struct wxIf +{ + typedef typename wxPrivate::wxIfImpl<Cond> + ::template Result<TTrue, TFalse>::value + value; +}; + +#endif // _WX_META_IF_H_ diff --git a/wxmsw/include/wx-3.0/wx/meta/implicitconversion.h b/wxmsw/include/wx-3.0/wx/meta/implicitconversion.h new file mode 100644 index 00000000..d596a6b2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/meta/implicitconversion.h @@ -0,0 +1,112 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/meta/implicitconversion.h +// Purpose: Determine resulting type from implicit conversion +// Author: Vaclav Slavik +// Created: 2010-10-22 +// Copyright: (c) 2010 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_META_IMPLICITCONVERSION_H_ +#define _WX_META_IMPLICITCONVERSION_H_ + +#include "wx/defs.h" +#include "wx/meta/if.h" + +// C++ hierarchy of data types is: +// +// Long double (highest) +// Double +// Float +// Unsigned long int +// Long int +// Unsigned int +// Int (lowest) +// +// Types lower in the hierarchy are converted into ones higher up if both are +// involved e.g. in arithmetic expressions. + +namespace wxPrivate +{ + +// Helper macro to define a constant inside a template class: it's needed +// because MSVC6 doesn't support initializing static integer members but the +// usual workaround of using enums instead doesn't work for Borland (at least +// in template classes). +#ifdef __VISUALC6__ + #define wxDEFINE_CLASS_INT_CONST(name, value) enum { name = value } +#else + #define wxDEFINE_CLASS_INT_CONST(name, value) static const int name = value +#endif + +template<typename T> +struct TypeHierarchy +{ + // consider unknown types (e.g. objects, pointers) to be of highest + // level, always convert to them if they occur + wxDEFINE_CLASS_INT_CONST( level, 9999 ); +}; + +#define WX_TYPE_HIERARCHY_LEVEL(level_num, type) \ + template<> struct TypeHierarchy<type> \ + { \ + wxDEFINE_CLASS_INT_CONST( level, level_num ); \ + } + +WX_TYPE_HIERARCHY_LEVEL( 1, char); +WX_TYPE_HIERARCHY_LEVEL( 2, unsigned char); +WX_TYPE_HIERARCHY_LEVEL( 3, short); +WX_TYPE_HIERARCHY_LEVEL( 4, unsigned short); +WX_TYPE_HIERARCHY_LEVEL( 5, int); +WX_TYPE_HIERARCHY_LEVEL( 6, unsigned int); +WX_TYPE_HIERARCHY_LEVEL( 7, long); +WX_TYPE_HIERARCHY_LEVEL( 8, unsigned long); +#ifdef wxLongLong_t +WX_TYPE_HIERARCHY_LEVEL( 9, wxLongLong_t); +WX_TYPE_HIERARCHY_LEVEL(10, wxULongLong_t); +#endif +WX_TYPE_HIERARCHY_LEVEL(11, float); +WX_TYPE_HIERARCHY_LEVEL(12, double); +WX_TYPE_HIERARCHY_LEVEL(13, long double); + +#if wxWCHAR_T_IS_REAL_TYPE + #if SIZEOF_WCHAR_T == SIZEOF_SHORT + template<> struct TypeHierarchy<wchar_t> : public TypeHierarchy<short> {}; + #elif SIZEOF_WCHAR_T == SIZEOF_INT + template<> struct TypeHierarchy<wchar_t> : public TypeHierarchy<int> {}; + #elif SIZEOF_WCHAR_T == SIZEOF_LONG + template<> struct TypeHierarchy<wchar_t> : public TypeHierarchy<long> {}; + #else + #error "weird wchar_t size, please update this code" + #endif +#endif + +#undef WX_TYPE_HIERARCHY_LEVEL + +} // namespace wxPrivate + +// Helper to determine resulting type of implicit conversion in +// an expression with two arithmetic types. +template<typename T1, typename T2> +struct wxImplicitConversionType +{ + typedef typename wxIf + < + // if T2 is "higher" type, convert to it + (int)(wxPrivate::TypeHierarchy<T1>::level) < (int)(wxPrivate::TypeHierarchy<T2>::level), + T2, + // otherwise use T1 + T1 + >::value + value; +}; + + +template<typename T1, typename T2, typename T3> +struct wxImplicitConversionType3 : public wxImplicitConversionType< + T1, + typename wxImplicitConversionType<T2,T3>::value> +{ +}; + +#endif // _WX_META_IMPLICITCONVERSION_H_ diff --git a/wxmsw/include/wx-3.0/wx/meta/int2type.h b/wxmsw/include/wx-3.0/wx/meta/int2type.h new file mode 100644 index 00000000..7b8d5dc0 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/meta/int2type.h @@ -0,0 +1,16 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/meta/int2type.h +// Purpose: Generate a unique type from a constant integer +// Author: Arne Steinarson +// Created: 2008-01-10 +// Copyright: (c) 2008 Arne Steinarson +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_META_INT2TYPE_H_ +#define _WX_META_INT2TYPE_H_ + +template <int N> +struct wxInt2Type { enum { value=N }; }; + +#endif // _WX_META_INT2TYPE_H_ diff --git a/wxmsw/include/wx-3.0/wx/meta/movable.h b/wxmsw/include/wx-3.0/wx/meta/movable.h new file mode 100644 index 00000000..e3a9f9e9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/meta/movable.h @@ -0,0 +1,44 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/meta/movable.h +// Purpose: Test if a type is movable using memmove() etc. +// Author: Vaclav Slavik +// Created: 2008-01-21 +// Copyright: (c) 2008 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_META_MOVABLE_H_ +#define _WX_META_MOVABLE_H_ + +#include "wx/meta/pod.h" +#include "wx/string.h" // for wxIsMovable<wxString> specialization + +// Helper to decide if an object of type T is "movable", i.e. if it can be +// copied to another memory location using memmove() or realloc() C functions. +// C++ only gurantees that POD types (including primitive types) are +// movable. +template<typename T> +struct wxIsMovable +{ + wxDEFINE_TEMPLATE_BOOL_VALUE(wxIsPod<T>::value); +}; + +// Macro to add wxIsMovable<T> specialization for given type that marks it +// as movable: +#define WX_DECLARE_TYPE_MOVABLE(type) \ + template<> struct wxIsMovable<type> \ + { \ + wxDEFINE_TEMPLATE_BOOL_VALUE(true); \ + }; + +// Our implementation of wxString is written in such way that it's safe to move +// it around (unless position cache is used which unfortunately breaks this). +// OTOH, we don't know anything about std::string. +// (NB: we don't put this into string.h and choose to include wx/string.h from +// here instead so that rarely-used wxIsMovable<T> code isn't included by +// everything) +#if !wxUSE_STD_STRING && !wxUSE_STRING_POS_CACHE +WX_DECLARE_TYPE_MOVABLE(wxString) +#endif + +#endif // _WX_META_MOVABLE_H_ diff --git a/wxmsw/include/wx-3.0/wx/meta/pod.h b/wxmsw/include/wx-3.0/wx/meta/pod.h new file mode 100644 index 00000000..b9dde13d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/meta/pod.h @@ -0,0 +1,87 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/meta/pod.h +// Purpose: Test if a type is POD +// Author: Vaclav Slavik, Jaakko Salli +// Created: 2010-06-14 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_META_POD_H_ +#define _WX_META_POD_H_ + +#include "wx/defs.h" + +// +// TODO: Use TR1 is_pod<> implementation where available. VC9 SP1 has it +// in tr1 namespace, VC10 has it in std namespace. GCC 4.2 has it in +// <tr1/type_traits>, while GCC 4.3 and later have it in <type_traits>. +// + +// This macro declares something called "value" inside a class declaration. +// +// It has to be used because VC6 doesn't handle initialization of the static +// variables in the class declaration itself while BCC5.82 doesn't understand +// enums (it compiles the template fine but can't use it later) +#if defined(__VISUALC__) && !wxCHECK_VISUALC_VERSION(7) + #define wxDEFINE_TEMPLATE_BOOL_VALUE(val) enum { value = val } +#else + #define wxDEFINE_TEMPLATE_BOOL_VALUE(val) static const bool value = val +#endif + +// Helper to decide if an object of type T is POD (Plain Old Data) +template<typename T> +struct wxIsPod +{ + wxDEFINE_TEMPLATE_BOOL_VALUE(false); +}; + +// Macro to add wxIsPod<T> specialization for given type that marks it +// as Plain Old Data: +#define WX_DECLARE_TYPE_POD(type) \ + template<> struct wxIsPod<type> \ + { \ + wxDEFINE_TEMPLATE_BOOL_VALUE(true); \ + }; + +WX_DECLARE_TYPE_POD(bool) +WX_DECLARE_TYPE_POD(unsigned char) +WX_DECLARE_TYPE_POD(signed char) +WX_DECLARE_TYPE_POD(unsigned int) +WX_DECLARE_TYPE_POD(signed int) +WX_DECLARE_TYPE_POD(unsigned short int) +WX_DECLARE_TYPE_POD(signed short int) +WX_DECLARE_TYPE_POD(signed long int) +WX_DECLARE_TYPE_POD(unsigned long int) +WX_DECLARE_TYPE_POD(float) +WX_DECLARE_TYPE_POD(double) +WX_DECLARE_TYPE_POD(long double) +#if wxWCHAR_T_IS_REAL_TYPE +WX_DECLARE_TYPE_POD(wchar_t) +#endif +#ifdef wxLongLong_t +WX_DECLARE_TYPE_POD(wxLongLong_t) +WX_DECLARE_TYPE_POD(wxULongLong_t) +#endif + +// Visual C++ 6.0 can't compile partial template specializations and as this is +// only an optimization, we can live with pointers not being recognized as +// POD types under VC6 +#if !defined(__VISUALC__) || wxCHECK_VISUALC_VERSION(7) + +// pointers are Plain Old Data: +template<typename T> +struct wxIsPod<T*> +{ + static const bool value = true; +}; + +template<typename T> +struct wxIsPod<const T*> +{ + static const bool value = true; +}; + +#endif // !VC++ < 7 + +#endif // _WX_META_POD_H_ diff --git a/wxmsw/include/wx-3.0/wx/meta/removeref.h b/wxmsw/include/wx-3.0/wx/meta/removeref.h new file mode 100644 index 00000000..e199d033 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/meta/removeref.h @@ -0,0 +1,36 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/meta/removeref.h +// Purpose: Allows to remove a reference from a type. +// Author: Vadim Zeitlin +// Created: 2012-10-21 +// Copyright: (c) 2012 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_META_REMOVEREF_H_ +#define _WX_META_REMOVEREF_H_ + +// wxRemoveRef<> is similar to C++11 std::remove_reference<> but works with all +// compilers (but, to compensate for this, doesn't work with rvalue references). + +// Except that it doesn't work with VC++ 6 as there doesn't seem to be any way +// to partially specialize a template for references with it. +#ifndef __VISUALC6__ + +template <typename T> +struct wxRemoveRef +{ + typedef T type; +}; + +template <typename T> +struct wxRemoveRef<T&> +{ + typedef T type; +}; + +#define wxHAS_REMOVEREF + +#endif // !__VISUALC6__ + +#endif // _WX_META_REMOVEREF_H_ diff --git a/wxmsw/include/wx-3.0/wx/metafile.h b/wxmsw/include/wx-3.0/wx/metafile.h new file mode 100644 index 00000000..c34d8ace --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/metafile.h @@ -0,0 +1,53 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/metafile.h +// Purpose: wxMetaFile class declaration +// Author: wxWidgets team +// Modified by: +// Created: 13.01.00 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_METAFILE_H_BASE_ +#define _WX_METAFILE_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_METAFILE + +// provide synonyms for all metafile classes +#define wxMetaFile wxMetafile +#define wxMetaFileDC wxMetafileDC +#define wxMetaFileDataObject wxMetafileDataObject + +#define wxMakeMetaFilePlaceable wxMakeMetafilePlaceable + +#if defined(__WXMSW__) + #if wxUSE_ENH_METAFILE + #include "wx/msw/enhmeta.h" + + #if wxUSE_WIN_METAFILES_ALWAYS + // use normal metafiles as well + #include "wx/msw/metafile.h" + #else // also map all metafile classes to enh metafile + typedef wxEnhMetaFile wxMetafile; + typedef wxEnhMetaFileDC wxMetafileDC; + #if wxUSE_DRAG_AND_DROP + typedef wxEnhMetaFileDataObject wxMetafileDataObject; + #endif + + // this flag will be set if wxMetafile class is wxEnhMetaFile + #define wxMETAFILE_IS_ENH + #endif // wxUSE_WIN_METAFILES_ALWAYS + #else // !wxUSE_ENH_METAFILE + #include "wx/msw/metafile.h" + #endif +#elif defined(__WXPM__) + #include "wx/os2/metafile.h" +#elif defined(__WXMAC__) + #include "wx/osx/metafile.h" +#endif + +#endif // wxUSE_METAFILE + +#endif // _WX_METAFILE_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/mimetype.h b/wxmsw/include/wx-3.0/wx/mimetype.h new file mode 100644 index 00000000..b3ae6b77 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/mimetype.h @@ -0,0 +1,536 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/mimetype.h +// Purpose: classes and functions to manage MIME types +// Author: Vadim Zeitlin +// Modified by: +// Chris Elliott (biol75@york.ac.uk) 5 Dec 00: write support for Win32 +// Created: 23.09.98 +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence (part of wxExtra library) +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MIMETYPE_H_ +#define _WX_MIMETYPE_H_ + +// ---------------------------------------------------------------------------- +// headers and such +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_MIMETYPE + +// the things we really need +#include "wx/string.h" +#include "wx/dynarray.h" +#include "wx/arrstr.h" + +#include <stdarg.h> + +// fwd decls +class WXDLLIMPEXP_FWD_BASE wxIconLocation; +class WXDLLIMPEXP_FWD_BASE wxFileTypeImpl; +class WXDLLIMPEXP_FWD_BASE wxMimeTypesManagerImpl; + +// these constants define the MIME informations source under UNIX and are used +// by wxMimeTypesManager::Initialize() +enum wxMailcapStyle +{ + wxMAILCAP_STANDARD = 1, + wxMAILCAP_NETSCAPE = 2, + wxMAILCAP_KDE = 4, + wxMAILCAP_GNOME = 8, + + wxMAILCAP_ALL = 15 +}; + +/* + TODO: would it be more convenient to have this class? + +class WXDLLIMPEXP_BASE wxMimeType : public wxString +{ +public: + // all string ctors here + + wxString GetType() const { return BeforeFirst(wxT('/')); } + wxString GetSubType() const { return AfterFirst(wxT('/')); } + + void SetSubType(const wxString& subtype) + { + *this = GetType() + wxT('/') + subtype; + } + + bool Matches(const wxMimeType& wildcard) + { + // implement using wxMimeTypesManager::IsOfType() + } +}; + +*/ + +// wxMimeTypeCommands stores the verbs defined for the given MIME type with +// their values +class WXDLLIMPEXP_BASE wxMimeTypeCommands +{ +public: + wxMimeTypeCommands() {} + + wxMimeTypeCommands(const wxArrayString& verbs, + const wxArrayString& commands) + : m_verbs(verbs), + m_commands(commands) + { + } + + // add a new verb with the command or replace the old value + void AddOrReplaceVerb(const wxString& verb, const wxString& cmd); + void Add(const wxString& s) + { + m_verbs.Add(s.BeforeFirst(wxT('='))); + m_commands.Add(s.AfterFirst(wxT('='))); + } + + // access the commands + size_t GetCount() const { return m_verbs.GetCount(); } + const wxString& GetVerb(size_t n) const { return m_verbs[n]; } + const wxString& GetCmd(size_t n) const { return m_commands[n]; } + + bool HasVerb(const wxString& verb) const + { return m_verbs.Index(verb) != wxNOT_FOUND; } + + // returns empty string and wxNOT_FOUND in idx if no such verb + wxString GetCommandForVerb(const wxString& verb, size_t *idx = NULL) const; + + // get a "verb=command" string + wxString GetVerbCmd(size_t n) const; + +private: + wxArrayString m_verbs; + wxArrayString m_commands; +}; + +// ---------------------------------------------------------------------------- +// wxFileTypeInfo: static container of information accessed via wxFileType. +// +// This class is used with wxMimeTypesManager::AddFallbacks() and Associate() +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFileTypeInfo +{ +private: + void DoVarArgInit(const wxString& mimeType, + const wxString& openCmd, + const wxString& printCmd, + const wxString& desc, + va_list argptr); + + void VarArgInit(const wxString *mimeType, + const wxString *openCmd, + const wxString *printCmd, + const wxString *desc, + // the other parameters form a NULL terminated list of + // extensions + ...); + +public: + // NB: This is a helper to get implicit conversion of variadic ctor's + // fixed arguments into something that can be passed to VarArgInit(). + // Do not use, it's used by the ctor only. + struct CtorString + { + CtorString(const char *str) : m_str(str) {} + CtorString(const wchar_t *str) : m_str(str) {} + CtorString(const wxString& str) : m_str(str) {} + CtorString(const wxCStrData& str) : m_str(str) {} + CtorString(const wxScopedCharBuffer& str) : m_str(str) {} + CtorString(const wxScopedWCharBuffer& str) : m_str(str) {} + + operator const wxString*() const { return &m_str; } + + wxString m_str; + }; + + // ctors + + // Ctor specifying just the MIME type (which is mandatory), the other + // fields can be set later if needed. + wxFileTypeInfo(const wxString& mimeType) + : m_mimeType(mimeType) + { + } + + // Ctor allowing to specify the values of all fields at once: + // + // wxFileTypeInfo(const wxString& mimeType, + // const wxString& openCmd, + // const wxString& printCmd, + // const wxString& desc, + // // the other parameters form a list of extensions for this + // // file type and should be terminated with wxNullPtr (not + // // just NULL!) + // ...); + WX_DEFINE_VARARG_FUNC_CTOR(wxFileTypeInfo, + 4, (const CtorString&, + const CtorString&, + const CtorString&, + const CtorString&), + VarArgInit, VarArgInit) +#ifdef __WATCOMC__ + // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351 + WX_VARARG_WATCOM_WORKAROUND_CTOR( + wxFileTypeInfo, + 4, (const wxString&, + const wxString&, + const wxString&, + const wxString&), + (CtorString(f1), + CtorString(f2), + CtorString(f3), + CtorString(f4))); + WX_VARARG_WATCOM_WORKAROUND_CTOR( + wxFileTypeInfo, + 4, (const wxCStrData&, + const wxCStrData&, + const wxCStrData&, + const wxCStrData&), + (CtorString(f1), + CtorString(f2), + CtorString(f3), + CtorString(f4))); + WX_VARARG_WATCOM_WORKAROUND_CTOR( + wxFileTypeInfo, + 4, (const char*, + const char*, + const char*, + const char*), + (CtorString(f1), + CtorString(f2), + CtorString(f3), + CtorString(f4))); + WX_VARARG_WATCOM_WORKAROUND_CTOR( + wxFileTypeInfo, + 4, (const wchar_t*, + const wchar_t*, + const wchar_t*, + const wchar_t*), + (CtorString(f1), + CtorString(f2), + CtorString(f3), + CtorString(f4))); +#endif + + // the array elements correspond to the parameters of the ctor above in + // the same order + wxFileTypeInfo(const wxArrayString& sArray); + + // invalid item - use this to terminate the array passed to + // wxMimeTypesManager::AddFallbacks + wxFileTypeInfo() { } + + // test if this object can be used + bool IsValid() const { return !m_mimeType.empty(); } + + // setters + // set the open/print commands + void SetOpenCommand(const wxString& command) { m_openCmd = command; } + void SetPrintCommand(const wxString& command) { m_printCmd = command; } + + // set the description + void SetDescription(const wxString& desc) { m_desc = desc; } + + // add another extension corresponding to this file type + void AddExtension(const wxString& ext) { m_exts.push_back(ext); } + + // set the icon info + void SetIcon(const wxString& iconFile, int iconIndex = 0) + { + m_iconFile = iconFile; + m_iconIndex = iconIndex; + } + // set the short desc + void SetShortDesc(const wxString& shortDesc) { m_shortDesc = shortDesc; } + + // accessors + // get the MIME type + const wxString& GetMimeType() const { return m_mimeType; } + // get the open command + const wxString& GetOpenCommand() const { return m_openCmd; } + // get the print command + const wxString& GetPrintCommand() const { return m_printCmd; } + // get the short description (only used under Win32 so far) + const wxString& GetShortDesc() const { return m_shortDesc; } + // get the long, user visible description + const wxString& GetDescription() const { return m_desc; } + // get the array of all extensions + const wxArrayString& GetExtensions() const { return m_exts; } + size_t GetExtensionsCount() const {return m_exts.GetCount(); } + // get the icon info + const wxString& GetIconFile() const { return m_iconFile; } + int GetIconIndex() const { return m_iconIndex; } + +private: + wxString m_mimeType, // the MIME type in "type/subtype" form + m_openCmd, // command to use for opening the file (%s allowed) + m_printCmd, // command to use for printing the file (%s allowed) + m_shortDesc, // a short string used in the registry + m_desc; // a free form description of this file type + + // icon stuff + wxString m_iconFile; // the file containing the icon + int m_iconIndex; // icon index in this file + + wxArrayString m_exts; // the extensions which are mapped on this filetype + + +#if 0 // TODO + // the additional (except "open" and "print") command names and values + wxArrayString m_commandNames, + m_commandValues; +#endif // 0 +}; + +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxFileTypeInfo, wxArrayFileTypeInfo, + WXDLLIMPEXP_BASE); + +// ---------------------------------------------------------------------------- +// wxFileType: gives access to all information about the files of given type. +// +// This class holds information about a given "file type". File type is the +// same as MIME type under Unix, but under Windows it corresponds more to an +// extension than to MIME type (in fact, several extensions may correspond to a +// file type). This object may be created in many different ways and depending +// on how it was created some fields may be unknown so the return value of all +// the accessors *must* be checked! +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFileType +{ +friend class WXDLLIMPEXP_FWD_BASE wxMimeTypesManagerImpl; // it has access to m_impl + +public: + // An object of this class must be passed to Get{Open|Print}Command. The + // default implementation is trivial and doesn't know anything at all about + // parameters, only filename and MIME type are used (so it's probably ok for + // Windows where %{param} is not used anyhow) + class MessageParameters + { + public: + // ctors + MessageParameters() { } + MessageParameters(const wxString& filename, + const wxString& mimetype = wxEmptyString) + : m_filename(filename), m_mimetype(mimetype) { } + + // accessors (called by GetOpenCommand) + // filename + const wxString& GetFileName() const { return m_filename; } + // mime type + const wxString& GetMimeType() const { return m_mimetype; } + + // override this function in derived class + virtual wxString GetParamValue(const wxString& WXUNUSED(name)) const + { return wxEmptyString; } + + // virtual dtor as in any base class + virtual ~MessageParameters() { } + + protected: + wxString m_filename, m_mimetype; + }; + + // ctor from static data + wxFileType(const wxFileTypeInfo& ftInfo); + + // accessors: all of them return true if the corresponding information + // could be retrieved/found, false otherwise (and in this case all [out] + // parameters are unchanged) + // return the MIME type for this file type + bool GetMimeType(wxString *mimeType) const; + bool GetMimeTypes(wxArrayString& mimeTypes) const; + // fill passed in array with all extensions associated with this file + // type + bool GetExtensions(wxArrayString& extensions); + // get the icon corresponding to this file type and of the given size + bool GetIcon(wxIconLocation *iconloc) const; + bool GetIcon(wxIconLocation *iconloc, + const MessageParameters& params) const; + // get a brief file type description ("*.txt" => "text document") + bool GetDescription(wxString *desc) const; + + // get the command to be used to open/print the given file. + // get the command to execute the file of given type + bool GetOpenCommand(wxString *openCmd, + const MessageParameters& params) const; + // a simpler to use version of GetOpenCommand() -- it only takes the + // filename and returns an empty string on failure + wxString GetOpenCommand(const wxString& filename) const; + // get the command to print the file of given type + bool GetPrintCommand(wxString *printCmd, + const MessageParameters& params) const; + + + // return the number of commands defined for this file type, 0 if none + size_t GetAllCommands(wxArrayString *verbs, wxArrayString *commands, + const wxFileType::MessageParameters& params) const; + + // set an arbitrary command, ask confirmation if it already exists and + // overwriteprompt is true + bool SetCommand(const wxString& cmd, const wxString& verb, + bool overwriteprompt = true); + + bool SetDefaultIcon(const wxString& cmd = wxEmptyString, int index = 0); + + + // remove the association for this filetype from the system MIME database: + // notice that it will only work if the association is defined in the user + // file/registry part, we will never modify the system-wide settings + bool Unassociate(); + + // operations + // expand a string in the format of GetOpenCommand (which may contain + // '%s' and '%t' format specifiers for the file name and mime type + // and %{param} constructions). + static wxString ExpandCommand(const wxString& command, + const MessageParameters& params); + + // dtor (not virtual, shouldn't be derived from) + ~wxFileType(); + +private: + // default ctor is private because the user code never creates us + wxFileType(); + + // no copy ctor/assignment operator + wxFileType(const wxFileType&); + wxFileType& operator=(const wxFileType&); + + // the static container of wxFileType data: if it's not NULL, it means that + // this object is used as fallback only + const wxFileTypeInfo *m_info; + + // the object which implements the real stuff like reading and writing + // to/from system MIME database + wxFileTypeImpl *m_impl; +}; + +//---------------------------------------------------------------------------- +// wxMimeTypesManagerFactory +//---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMimeTypesManagerFactory +{ +public: + wxMimeTypesManagerFactory() {} + virtual ~wxMimeTypesManagerFactory() {} + + virtual wxMimeTypesManagerImpl *CreateMimeTypesManagerImpl(); + + static void Set( wxMimeTypesManagerFactory *factory ); + static wxMimeTypesManagerFactory *Get(); + +private: + static wxMimeTypesManagerFactory *m_factory; +}; + +// ---------------------------------------------------------------------------- +// wxMimeTypesManager: interface to system MIME database. +// +// This class accesses the information about all known MIME types and allows +// the application to retrieve information (including how to handle data of +// given type) about them. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMimeTypesManager +{ +public: + // static helper functions + // ----------------------- + + // check if the given MIME type is the same as the other one: the + // second argument may contain wildcards ('*'), but not the first. If + // the types are equal or if the mimeType matches wildcard the function + // returns true, otherwise it returns false + static bool IsOfType(const wxString& mimeType, const wxString& wildcard); + + // ctor + wxMimeTypesManager(); + + // NB: the following 2 functions are for Unix only and don't do anything + // elsewhere + + // loads data from standard files according to the mailcap styles + // specified: this is a bitwise OR of wxMailcapStyle values + // + // use the extraDir parameter if you want to look for files in another + // directory + void Initialize(int mailcapStyle = wxMAILCAP_ALL, + const wxString& extraDir = wxEmptyString); + + // and this function clears all the data from the manager + void ClearData(); + + // Database lookup: all functions return a pointer to wxFileType object + // whose methods may be used to query it for the information you're + // interested in. If the return value is !NULL, caller is responsible for + // deleting it. + // get file type from file extension + wxFileType *GetFileTypeFromExtension(const wxString& ext); + // get file type from MIME type (in format <category>/<format>) + wxFileType *GetFileTypeFromMimeType(const wxString& mimeType); + + // enumerate all known MIME types + // + // returns the number of retrieved file types + size_t EnumAllFileTypes(wxArrayString& mimetypes); + + // these functions can be used to provide default values for some of the + // MIME types inside the program itself + // + // The filetypes array should be terminated by either NULL entry or an + // invalid wxFileTypeInfo (i.e. the one created with default ctor) + void AddFallbacks(const wxFileTypeInfo *filetypes); + void AddFallback(const wxFileTypeInfo& ft) { m_fallbacks.Add(ft); } + + // create or remove associations + + // create a new association using the fields of wxFileTypeInfo (at least + // the MIME type and the extension should be set) + // if the other fields are empty, the existing values should be left alone + wxFileType *Associate(const wxFileTypeInfo& ftInfo); + + // undo Associate() + bool Unassociate(wxFileType *ft) ; + + // dtor (not virtual, shouldn't be derived from) + ~wxMimeTypesManager(); + +private: + // no copy ctor/assignment operator + wxMimeTypesManager(const wxMimeTypesManager&); + wxMimeTypesManager& operator=(const wxMimeTypesManager&); + + // the fallback info which is used if the information is not found in the + // real system database + wxArrayFileTypeInfo m_fallbacks; + + // the object working with the system MIME database + wxMimeTypesManagerImpl *m_impl; + + // if m_impl is NULL, create one + void EnsureImpl(); + + friend class wxMimeTypeCmnModule; +}; + + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +// the default mime manager for wxWidgets programs +extern WXDLLIMPEXP_DATA_BASE(wxMimeTypesManager *) wxTheMimeTypesManager; + +#endif // wxUSE_MIMETYPE + +#endif + //_WX_MIMETYPE_H_ diff --git a/wxmsw/include/wx-3.0/wx/minifram.h b/wxmsw/include/wx-3.0/wx/minifram.h new file mode 100644 index 00000000..f769c5a6 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/minifram.h @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/minifram.h +// Purpose: wxMiniFrame base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MINIFRAM_H_BASE_ +#define _WX_MINIFRAM_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_MINIFRAME + +#if defined(__WXMSW__) +#include "wx/msw/minifram.h" +#elif defined(__WXMOTIF__) +#include "wx/motif/minifram.h" +#elif defined(__WXGTK20__) +#include "wx/gtk/minifram.h" +#elif defined(__WXGTK__) +#include "wx/gtk1/minifram.h" +#elif defined(__WXX11__) +#include "wx/x11/minifram.h" +#elif defined(__WXMAC__) +#include "wx/osx/minifram.h" +#elif defined(__WXPM__) +#include "wx/os2/minifram.h" +#else +// TODO: it seems that wxMiniFrame could be just defined here generically +// instead of having all the above port-specific headers +#include "wx/frame.h" +typedef wxFrame wxMiniFrame; +#endif + +#endif // wxUSE_MINIFRAME +#endif // _WX_MINIFRAM_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/modalhook.h b/wxmsw/include/wx-3.0/wx/modalhook.h new file mode 100644 index 00000000..55341f9b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/modalhook.h @@ -0,0 +1,104 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/modalhook.h +// Purpose: Allows to hook into showing modal dialogs. +// Author: Vadim Zeitlin +// Created: 2013-05-19 +// Copyright: (c) 2013 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MODALHOOK_H_ +#define _WX_MODALHOOK_H_ + +#include "wx/vector.h" + +class WXDLLIMPEXP_FWD_CORE wxDialog; + +// ---------------------------------------------------------------------------- +// Class allowing to be notified about any modal dialog calls. +// ---------------------------------------------------------------------------- + +// To be notified about entering and exiting modal dialogs and possibly to +// replace them with something else (e.g. just return a predefined value for +// testing), define an object of this class, override its Enter() and +// possibly Exit() methods and call Register() on it. +class WXDLLIMPEXP_CORE wxModalDialogHook +{ +public: + // Default ctor doesn't do anything, call Register() to activate the hook. + wxModalDialogHook() { } + + // Dtor unregisters the hook if it had been registered. + virtual ~wxModalDialogHook() { DoUnregister(); } + + // Register this hook as being active, i.e. its Enter() and Exit() methods + // will be called. + // + // Notice that the order of registration matters: the last hook registered + // is called first, and if its Enter() returns something != wxID_NONE, the + // subsequent hooks are skipped. + void Register(); + + // Unregister this hook. Notice that is done automatically from the dtor. + void Unregister(); + + // Called from wxWidgets code before showing any modal dialogs and calls + // Enter() for every registered hook. + static int CallEnter(wxDialog* dialog); + + // Called from wxWidgets code after dismissing the dialog and calls Exit() + // for every registered hook. + static void CallExit(wxDialog* dialog); + +protected: + // Called by wxWidgets before showing any modal dialogs, override this to + // be notified about this and return anything but wxID_NONE to skip showing + // the modal dialog entirely and just return the specified result. + virtual int Enter(wxDialog* dialog) = 0; + + // Called by wxWidgets after dismissing the modal dialog. Notice that it + // won't be called if Enter() hadn't been. + virtual void Exit(wxDialog* WXUNUSED(dialog)) { } + +private: + // Unregister the given hook, return true if it was done or false if the + // hook wasn't found. + bool DoUnregister(); + + // All the hooks in reverse registration order (i.e. in call order). + typedef wxVector<wxModalDialogHook*> Hooks; + static Hooks ms_hooks; + + wxDECLARE_NO_COPY_CLASS(wxModalDialogHook); +}; + +// Helper object used by WX_MODAL_DIALOG_HOOK below to ensure that CallExit() +// is called on scope exit. +class wxModalDialogHookExitGuard +{ +public: + wxEXPLICIT wxModalDialogHookExitGuard(wxDialog* dialog) + : m_dialog(dialog) + { + } + + ~wxModalDialogHookExitGuard() + { + wxModalDialogHook::CallExit(m_dialog); + } + +private: + wxDialog* const m_dialog; + + wxDECLARE_NO_COPY_CLASS(wxModalDialogHookExitGuard); +}; + +// This macro needs to be used at the top of every implementation of +// ShowModal() in order for wxModalDialogHook to work. +#define WX_HOOK_MODAL_DIALOG() \ + const int modalDialogHookRC = wxModalDialogHook::CallEnter(this); \ + if ( modalDialogHookRC != wxID_NONE ) \ + return modalDialogHookRC; \ + wxModalDialogHookExitGuard modalDialogHookExit(this) + +#endif // _WX_MODALHOOK_H_ diff --git a/wxmsw/include/wx-3.0/wx/module.h b/wxmsw/include/wx-3.0/wx/module.h new file mode 100644 index 00000000..96600b76 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/module.h @@ -0,0 +1,119 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/module.h +// Purpose: Modules handling +// Author: Wolfram Gloger/adapted by Guilhem Lavaux +// Modified by: +// Created: 04/11/98 +// Copyright: (c) Wolfram Gloger and Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MODULE_H_ +#define _WX_MODULE_H_ + +#include "wx/object.h" +#include "wx/list.h" +#include "wx/arrstr.h" +#include "wx/dynarray.h" + +// declare a linked list of modules +class WXDLLIMPEXP_FWD_BASE wxModule; +WX_DECLARE_USER_EXPORTED_LIST(wxModule, wxModuleList, WXDLLIMPEXP_BASE); + +// and an array of class info objects +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxClassInfo *, wxArrayClassInfo, + class WXDLLIMPEXP_BASE); + + +// declaring a class derived from wxModule will automatically create an +// instance of this class on program startup, call its OnInit() method and call +// OnExit() on program termination (but only if OnInit() succeeded) +class WXDLLIMPEXP_BASE wxModule : public wxObject +{ +public: + wxModule() {} + virtual ~wxModule() {} + + // if module init routine returns false the application + // will fail to startup + + bool Init() { return OnInit(); } + void Exit() { OnExit(); } + + // Override both of these + + // called on program startup + + virtual bool OnInit() = 0; + + // called just before program termination, but only if OnInit() + // succeeded + + virtual void OnExit() = 0; + + static void RegisterModule(wxModule *module); + static void RegisterModules(); + static bool InitializeModules(); + static void CleanUpModules() { DoCleanUpModules(m_modules); } + + // used by wxObjectLoader when unloading shared libs's + + static void UnregisterModule(wxModule *module); + +protected: + static wxModuleList m_modules; + + // the function to call from constructor of a deriving class add module + // dependency which will be initialized before the module and unloaded + // after that + void AddDependency(wxClassInfo *dep) + { + wxCHECK_RET( dep, wxT("NULL module dependency") ); + + m_dependencies.Add(dep); + } + + // same as the version above except it will look up wxClassInfo by name on + // its own + void AddDependency(const char *className) + { + m_namedDependencies.Add(className); + } + + +private: + // initialize module and Append it to initializedModules list recursively + // calling itself to satisfy module dependencies if needed + static bool + DoInitializeModule(wxModule *module, wxModuleList &initializedModules); + + // cleanup the modules in the specified list (which may not contain all + // modules if we're called during initialization because not all modules + // could be initialized) and also empty m_modules itself + static void DoCleanUpModules(const wxModuleList& modules); + + // resolve all named dependencies and add them to the normal m_dependencies + bool ResolveNamedDependencies(); + + + // module dependencies: contains wxClassInfo pointers for all modules which + // must be initialized before this one + wxArrayClassInfo m_dependencies; + + // and the named dependencies: those will be resolved during run-time and + // added to m_dependencies + wxArrayString m_namedDependencies; + + // used internally while initializing/cleaning up modules + enum + { + State_Registered, // module registered but not initialized yet + State_Initializing, // we're initializing this module but not done yet + State_Initialized // module initialized successfully + } m_state; + + + DECLARE_CLASS(wxModule) +}; + +#endif // _WX_MODULE_H_ diff --git a/wxmsw/include/wx-3.0/wx/mousemanager.h b/wxmsw/include/wx-3.0/wx/mousemanager.h new file mode 100644 index 00000000..caa2abea --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/mousemanager.h @@ -0,0 +1,153 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/mousemanager.h +// Purpose: wxMouseEventsManager class declaration +// Author: Vadim Zeitlin +// Created: 2009-04-20 +// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MOUSEMANAGER_H_ +#define _WX_MOUSEMANAGER_H_ + +#include "wx/event.h" + +// ---------------------------------------------------------------------------- +// wxMouseEventsManager +// ---------------------------------------------------------------------------- + +/* + This class handles mouse events and synthesizes high-level notifications + such as clicks and drag events from low level mouse button presses and + mouse movement events. It is useful because handling the mouse events is + less obvious than might seem at a first glance: for example, clicks on an + object should only be generated if the mouse was both pressed and released + over it and not just released (so it requires storing the previous state) + and dragging shouldn't start before the mouse moves away far enough. + + This class encapsulates all these dull details for controls containing + multiple items which can be identified by a positive integer index and you + just need to implement its pure virtual functions to use it. + */ +class WXDLLIMPEXP_CORE wxMouseEventsManager : public wxEvtHandler +{ +public: + // a mouse event manager is always associated with a window and must be + // deleted by the window when it is destroyed so if it is created using the + // default ctor Create() must be called later + wxMouseEventsManager() { Init(); } + wxMouseEventsManager(wxWindow *win) { Init(); Create(win); } + bool Create(wxWindow *win); + + virtual ~wxMouseEventsManager(); + +protected: + // called to find the item at the given position: return wxNOT_FOUND (-1) + // if there is no item here + virtual int MouseHitTest(const wxPoint& pos) = 0; + + // called when the user clicked (i.e. pressed and released mouse over the + // same item), should normally generate a notification about this click and + // return true if it was handled or false otherwise, determining whether + // the original mouse event is skipped or not + virtual bool MouseClicked(int item) = 0; + + // called to start dragging the given item, should generate the appropriate + // BEGIN_DRAG event and return false if dragging this item was forbidden + virtual bool MouseDragBegin(int item, const wxPoint& pos) = 0; + + // called while the item is being dragged, should normally update the + // feedback on screen (usually using wxOverlay) + virtual void MouseDragging(int item, const wxPoint& pos) = 0; + + // called when the mouse is released after dragging the item + virtual void MouseDragEnd(int item, const wxPoint& pos) = 0; + + // called when mouse capture is lost while dragging the item, should remove + // the visual feedback drawn by MouseDragging() + virtual void MouseDragCancelled(int item) = 0; + + + // you don't need to override those but you will want to do if it your + // control renders pressed items differently + + // called when the item is becomes pressed, can be used to change its + // appearance + virtual void MouseClickBegin(int WXUNUSED(item)) { } + + // called if the mouse capture was lost while the item was pressed, can be + // used to restore the default item appearance if it was changed in + // MouseClickBegin() + virtual void MouseClickCancelled(int WXUNUSED(item)) { } + +private: + /* + Here is a small diagram explaining the switches between different + states: + + + /---------->NORMAL<--------------- Drag end + / / / | event + / / | | ^ + / / | | | + Click / N | | mouse | mouse up + event / | | down | + | / | | DRAGGING + | / | | ^ + Y|/ N \ v |Y + +-------------+ +--------+ N +-----------+ + |On same item?| |On item?| -----------|Begin drag?| + +-------------+ +--------+ / +-----------+ + ^ | / ^ + | | / | + \ mouse | / mouse moved | + \ up v v far enough / + \--------PRESSED-------------------/ + + + There are also transitions from PRESSED and DRAGGING to NORMAL in case + the mouse capture is lost or Escape key is pressed which are not shown. + */ + enum State + { + State_Normal, // initial, default state + State_Pressed, // mouse was pressed over an item + State_Dragging // the item is being dragged + }; + + // common part of both ctors + void Init(); + + // various event handlers + void OnCaptureLost(wxMouseCaptureLostEvent& event); + void OnLeftDown(wxMouseEvent& event); + void OnLeftUp(wxMouseEvent& event); + void OnMove(wxMouseEvent& event); + + + // the associated window, never NULL except between the calls to the + // default ctor and Create() + wxWindow *m_win; + + // the current state + State m_state; + + // the details of the operation currently in progress, only valid if + // m_state is not normal + + // the item being pressed or dragged (always valid, i.e. != wxNOT_FOUND if + // m_state != State_Normal) + int m_item; + + // the position of the last mouse event of interest: either mouse press in + // State_Pressed or last movement event in State_Dragging + wxPoint m_posLast; + + + DECLARE_EVENT_TABLE() + + wxDECLARE_NO_COPY_CLASS(wxMouseEventsManager); +}; + +#endif // _WX_MOUSEMANAGER_H_ + diff --git a/wxmsw/include/wx-3.0/wx/mousestate.h b/wxmsw/include/wx-3.0/wx/mousestate.h new file mode 100644 index 00000000..2ea1cc5b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/mousestate.h @@ -0,0 +1,149 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/mousestate.h +// Purpose: Declaration of wxMouseState class +// Author: Vadim Zeitlin +// Created: 2008-09-19 (extracted from wx/utils.h) +// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MOUSESTATE_H_ +#define _WX_MOUSESTATE_H_ + +#include "wx/gdicmn.h" // for wxPoint +#include "wx/kbdstate.h" + +// the symbolic names for the mouse buttons +enum wxMouseButton +{ + wxMOUSE_BTN_ANY = -1, + wxMOUSE_BTN_NONE = 0, + wxMOUSE_BTN_LEFT = 1, + wxMOUSE_BTN_MIDDLE = 2, + wxMOUSE_BTN_RIGHT = 3, + wxMOUSE_BTN_AUX1 = 4, + wxMOUSE_BTN_AUX2 = 5, + wxMOUSE_BTN_MAX +}; + +// ---------------------------------------------------------------------------- +// wxMouseState contains the information about mouse position, buttons and also +// key modifiers +// ---------------------------------------------------------------------------- + +// wxMouseState is used to hold information about button and modifier state +// and is what is returned from wxGetMouseState. +class WXDLLIMPEXP_CORE wxMouseState : public wxKeyboardState +{ +public: + wxMouseState() + : m_leftDown(false), m_middleDown(false), m_rightDown(false), + m_aux1Down(false), m_aux2Down(false), + m_x(0), m_y(0) + { + } + + // default copy ctor, assignment operator and dtor are ok + + + // accessors for the mouse position + wxCoord GetX() const { return m_x; } + wxCoord GetY() const { return m_y; } + wxPoint GetPosition() const { return wxPoint(m_x, m_y); } + void GetPosition(wxCoord *x, wxCoord *y) const + { + if ( x ) + *x = m_x; + if ( y ) + *y = m_y; + } + + // this overload is for compatibility only + void GetPosition(long *x, long *y) const + { + if ( x ) + *x = m_x; + if ( y ) + *y = m_y; + } + + // accessors for the pressed buttons + bool LeftIsDown() const { return m_leftDown; } + bool MiddleIsDown() const { return m_middleDown; } + bool RightIsDown() const { return m_rightDown; } + bool Aux1IsDown() const { return m_aux1Down; } + bool Aux2IsDown() const { return m_aux2Down; } + + bool ButtonIsDown(wxMouseButton but) const + { + switch ( but ) + { + case wxMOUSE_BTN_ANY: + return LeftIsDown() || MiddleIsDown() || RightIsDown() || + Aux1IsDown() || Aux2IsDown(); + + case wxMOUSE_BTN_LEFT: + return LeftIsDown(); + + case wxMOUSE_BTN_MIDDLE: + return MiddleIsDown(); + + case wxMOUSE_BTN_RIGHT: + return RightIsDown(); + + case wxMOUSE_BTN_AUX1: + return Aux1IsDown(); + + case wxMOUSE_BTN_AUX2: + return Aux2IsDown(); + + case wxMOUSE_BTN_NONE: + case wxMOUSE_BTN_MAX: + break; + } + + wxFAIL_MSG(wxS("invalid parameter")); + return false; + } + + + // these functions are mostly used by wxWidgets itself + void SetX(wxCoord x) { m_x = x; } + void SetY(wxCoord y) { m_y = y; } + void SetPosition(wxPoint pos) { m_x = pos.x, m_y = pos.y; } + + void SetLeftDown(bool down) { m_leftDown = down; } + void SetMiddleDown(bool down) { m_middleDown = down; } + void SetRightDown(bool down) { m_rightDown = down; } + void SetAux1Down(bool down) { m_aux1Down = down; } + void SetAux2Down(bool down) { m_aux2Down = down; } + + // this mostly makes sense in the derived classes such as wxMouseEvent + void SetState(const wxMouseState& state) { *this = state; } + + // these functions are for compatibility only, they were used in 2.8 + // version of wxMouseState but their names are confusing as wxMouseEvent + // has methods with the same names which do something quite different so + // don't use them any more +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED_INLINE(bool LeftDown() const, return LeftIsDown(); ) + wxDEPRECATED_INLINE(bool MiddleDown() const, return MiddleIsDown(); ) + wxDEPRECATED_INLINE(bool RightDown() const, return RightIsDown(); ) +#endif // WXWIN_COMPATIBILITY_2_8 + + // for compatibility reasons these variables are public as the code using + // wxMouseEvent often uses them directly -- however they should not be + // accessed directly in this class, use the accessors above instead +// private: + bool m_leftDown : 1; + bool m_middleDown : 1; + bool m_rightDown : 1; + bool m_aux1Down : 1; + bool m_aux2Down : 1; + + wxCoord m_x, + m_y; +}; + +#endif // _WX_MOUSESTATE_H_ + diff --git a/wxmsw/include/wx-3.0/wx/msgdlg.h b/wxmsw/include/wx-3.0/wx/msgdlg.h new file mode 100644 index 00000000..8a234ac4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/msgdlg.h @@ -0,0 +1,321 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msgdlg.h +// Purpose: common header and base class for wxMessageDialog +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSGDLG_H_BASE_ +#define _WX_MSGDLG_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_MSGDLG + +#include "wx/dialog.h" +#include "wx/stockitem.h" + +extern WXDLLIMPEXP_DATA_CORE(const char) wxMessageBoxCaptionStr[]; + +// ---------------------------------------------------------------------------- +// wxMessageDialogBase: base class defining wxMessageDialog interface +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxMessageDialogBase : public wxDialog +{ +public: + // helper class for SetXXXLabels() methods: it makes it possible to pass + // either a stock id (wxID_CLOSE) or a string ("&Close") to them + class ButtonLabel + { + public: + // ctors are not explicit, objects of this class can be implicitly + // constructed from either stock ids or strings + ButtonLabel(int stockId) + : m_stockId(stockId) + { + wxASSERT_MSG( wxIsStockID(stockId), "invalid stock id" ); + } + + ButtonLabel(const wxString& label) + : m_label(label), m_stockId(wxID_NONE) + { + } + + ButtonLabel(const char *label) + : m_label(label), m_stockId(wxID_NONE) + { + } + + ButtonLabel(const wchar_t *label) + : m_label(label), m_stockId(wxID_NONE) + { + } + + ButtonLabel(const wxCStrData& label) + : m_label(label), m_stockId(wxID_NONE) + { + } + + // default copy ctor and dtor are ok + + // get the string label, whether it was originally specified directly + // or as a stock id -- this is only useful for platforms without native + // stock items id support + wxString GetAsString() const + { + return m_stockId == wxID_NONE + ? m_label + : wxGetStockLabel(m_stockId, wxSTOCK_FOR_BUTTON); + } + + // return the stock id or wxID_NONE if this is not a stock label + int GetStockId() const { return m_stockId; } + + private: + // the label if explicitly given or empty if this is a stock item + const wxString m_label; + + // the stock item id or wxID_NONE if m_label should be used + const int m_stockId; + }; + + // ctors + wxMessageDialogBase() { m_dialogStyle = 0; } + wxMessageDialogBase(wxWindow *parent, + const wxString& message, + const wxString& caption, + long style) + : m_message(message), + m_caption(caption) + { + m_parent = parent; + SetMessageDialogStyle(style); + } + + // virtual dtor for the base class + virtual ~wxMessageDialogBase() { } + + wxString GetCaption() const { return m_caption; } + + virtual void SetMessage(const wxString& message) + { + m_message = message; + } + + wxString GetMessage() const { return m_message; } + + void SetExtendedMessage(const wxString& extendedMessage) + { + m_extendedMessage = extendedMessage; + } + + wxString GetExtendedMessage() const { return m_extendedMessage; } + + // change the dialog style flag + void SetMessageDialogStyle(long style) + { + wxASSERT_MSG( ((style & wxYES_NO) == wxYES_NO) || !(style & wxYES_NO), + "wxYES and wxNO may only be used together" ); + + wxASSERT_MSG( !(style & wxYES) || !(style & wxOK), + "wxOK and wxYES/wxNO can't be used together" ); + + // It is common to specify just the icon, without wxOK, in the existing + // code, especially one written by Windows programmers as MB_OK is 0 + // and so they're used to omitting wxOK. Don't complain about it but + // just add wxOK implicitly for compatibility. + if ( !(style & wxYES) && !(style & wxOK) ) + style |= wxOK; + + wxASSERT_MSG( (style & wxID_OK) != wxID_OK, + "wxMessageBox: Did you mean wxOK (and not wxID_OK)?" ); + + wxASSERT_MSG( !(style & wxNO_DEFAULT) || (style & wxNO), + "wxNO_DEFAULT is invalid without wxNO" ); + + wxASSERT_MSG( !(style & wxCANCEL_DEFAULT) || (style & wxCANCEL), + "wxCANCEL_DEFAULT is invalid without wxCANCEL" ); + + wxASSERT_MSG( !(style & wxCANCEL_DEFAULT) || !(style & wxNO_DEFAULT), + "only one default button can be specified" ); + + m_dialogStyle = style; + } + + long GetMessageDialogStyle() const { return m_dialogStyle; } + + // customization of the message box buttons + virtual bool SetYesNoLabels(const ButtonLabel& yes,const ButtonLabel& no) + { + DoSetCustomLabel(m_yes, yes); + DoSetCustomLabel(m_no, no); + return true; + } + + virtual bool SetYesNoCancelLabels(const ButtonLabel& yes, + const ButtonLabel& no, + const ButtonLabel& cancel) + { + DoSetCustomLabel(m_yes, yes); + DoSetCustomLabel(m_no, no); + DoSetCustomLabel(m_cancel, cancel); + return true; + } + + virtual bool SetOKLabel(const ButtonLabel& ok) + { + DoSetCustomLabel(m_ok, ok); + return true; + } + + virtual bool SetOKCancelLabels(const ButtonLabel& ok, + const ButtonLabel& cancel) + { + DoSetCustomLabel(m_ok, ok); + DoSetCustomLabel(m_cancel, cancel); + return true; + } + + virtual bool SetHelpLabel(const ButtonLabel& help) + { + DoSetCustomLabel(m_help, help); + return true; + } + + // test if any custom labels were set + bool HasCustomLabels() const + { + return !(m_ok.empty() && m_cancel.empty() && m_help.empty() && + m_yes.empty() && m_no.empty()); + } + + // these functions return the label to be used for the button which is + // either a custom label explicitly set by the user or the default label, + // i.e. they always return a valid string + wxString GetYesLabel() const + { return m_yes.empty() ? GetDefaultYesLabel() : m_yes; } + wxString GetNoLabel() const + { return m_no.empty() ? GetDefaultNoLabel() : m_no; } + wxString GetOKLabel() const + { return m_ok.empty() ? GetDefaultOKLabel() : m_ok; } + wxString GetCancelLabel() const + { return m_cancel.empty() ? GetDefaultCancelLabel() : m_cancel; } + wxString GetHelpLabel() const + { return m_help.empty() ? GetDefaultHelpLabel() : m_help; } + + // based on message dialog style, returns exactly one of: wxICON_NONE, + // wxICON_ERROR, wxICON_WARNING, wxICON_QUESTION, wxICON_INFORMATION, + // wxICON_AUTH_NEEDED + virtual long GetEffectiveIcon() const + { + if ( m_dialogStyle & wxICON_NONE ) + return wxICON_NONE; + else if ( m_dialogStyle & wxICON_ERROR ) + return wxICON_ERROR; + else if ( m_dialogStyle & wxICON_WARNING ) + return wxICON_WARNING; + else if ( m_dialogStyle & wxICON_QUESTION ) + return wxICON_QUESTION; + else if ( m_dialogStyle & wxICON_INFORMATION ) + return wxICON_INFORMATION; + else if ( m_dialogStyle & wxYES ) + return wxICON_QUESTION; + else + return wxICON_INFORMATION; + } + +protected: + // for the platforms not supporting separate main and extended messages + // this function should be used to combine both of them in a single string + wxString GetFullMessage() const + { + wxString msg = m_message; + if ( !m_extendedMessage.empty() ) + msg << "\n\n" << m_extendedMessage; + + return msg; + } + + wxString m_message, + m_extendedMessage, + m_caption; + long m_dialogStyle; + + // this function is called by our public SetXXXLabels() and should assign + // the value to var with possibly some transformation (e.g. Cocoa version + // currently uses this to remove any accelerators from the button strings + // while GTK+ one handles stock items specifically here) + virtual void DoSetCustomLabel(wxString& var, const ButtonLabel& label) + { + var = label.GetAsString(); + } + + // these functions return the custom label or empty string and should be + // used only in specific circumstances such as creating the buttons with + // these labels (in which case it makes sense to only use a custom label if + // it was really given and fall back on stock label otherwise), use the + // Get{Yes,No,OK,Cancel}Label() methods above otherwise + const wxString& GetCustomYesLabel() const { return m_yes; } + const wxString& GetCustomNoLabel() const { return m_no; } + const wxString& GetCustomOKLabel() const { return m_ok; } + const wxString& GetCustomHelpLabel() const { return m_help; } + const wxString& GetCustomCancelLabel() const { return m_cancel; } + +private: + // these functions may be overridden to provide different defaults for the + // default button labels (this is used by wxGTK) + virtual wxString GetDefaultYesLabel() const { return wxGetTranslation("Yes"); } + virtual wxString GetDefaultNoLabel() const { return wxGetTranslation("No"); } + virtual wxString GetDefaultOKLabel() const { return wxGetTranslation("OK"); } + virtual wxString GetDefaultCancelLabel() const { return wxGetTranslation("Cancel"); } + virtual wxString GetDefaultHelpLabel() const { return wxGetTranslation("Help"); } + + // labels for the buttons, initially empty meaning that the defaults should + // be used, use GetYes/No/OK/CancelLabel() to access them + wxString m_yes, + m_no, + m_ok, + m_cancel, + m_help; + + wxDECLARE_NO_COPY_CLASS(wxMessageDialogBase); +}; + +#include "wx/generic/msgdlgg.h" + +#if defined(__WX_COMPILING_MSGDLGG_CPP__) || \ + defined(__WXUNIVERSAL__) || defined(__WXGPE__) || \ + (defined(__WXGTK__) && !defined(__WXGTK20__)) + + #define wxMessageDialog wxGenericMessageDialog +#elif defined(__WXCOCOA__) + #include "wx/cocoa/msgdlg.h" +#elif defined(__WXMSW__) + #include "wx/msw/msgdlg.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/msgdlg.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/msgdlg.h" +#elif defined(__WXMAC__) + #include "wx/osx/msgdlg.h" +#elif defined(__WXPM__) + #include "wx/os2/msgdlg.h" +#endif + +// ---------------------------------------------------------------------------- +// wxMessageBox: the simplest way to use wxMessageDialog +// ---------------------------------------------------------------------------- + +int WXDLLIMPEXP_CORE wxMessageBox(const wxString& message, + const wxString& caption = wxMessageBoxCaptionStr, + long style = wxOK | wxCENTRE, + wxWindow *parent = NULL, + int x = wxDefaultCoord, int y = wxDefaultCoord); + +#endif // wxUSE_MSGDLG + +#endif // _WX_MSGDLG_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/msgout.h b/wxmsw/include/wx-3.0/wx/msgout.h new file mode 100644 index 00000000..63b39b92 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/msgout.h @@ -0,0 +1,185 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msgout.h +// Purpose: wxMessageOutput class. Shows a message to the user +// Author: Mattia Barbon +// Modified by: +// Created: 17.07.02 +// Copyright: (c) Mattia Barbon +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSGOUT_H_ +#define _WX_MSGOUT_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" +#include "wx/chartype.h" +#include "wx/strvararg.h" + +// ---------------------------------------------------------------------------- +// wxMessageOutput is a class abstracting formatted output target, i.e. +// something you can printf() to +// ---------------------------------------------------------------------------- + +// NB: VC6 has a bug that causes linker errors if you have template methods +// in a class using __declspec(dllimport). The solution is to split such +// class into two classes, one that contains the template methods and does +// *not* use WXDLLIMPEXP_BASE and another class that contains the rest +// (with DLL linkage). +class wxMessageOutputBase +{ +public: + virtual ~wxMessageOutputBase() { } + + // show a message to the user + // void Printf(const wxString& format, ...) = 0; + WX_DEFINE_VARARG_FUNC_VOID(Printf, 1, (const wxFormatString&), + DoPrintfWchar, DoPrintfUtf8) +#ifdef __WATCOMC__ + // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351 + WX_VARARG_WATCOM_WORKAROUND(void, Printf, 1, (const wxString&), + (wxFormatString(f1))); + WX_VARARG_WATCOM_WORKAROUND(void, Printf, 1, (const wxCStrData&), + (wxFormatString(f1))); + WX_VARARG_WATCOM_WORKAROUND(void, Printf, 1, (const char*), + (wxFormatString(f1))); + WX_VARARG_WATCOM_WORKAROUND(void, Printf, 1, (const wchar_t*), + (wxFormatString(f1))); +#endif + + // called by DoPrintf() to output formatted string but can also be called + // directly if no formatting is needed + virtual void Output(const wxString& str) = 0; + +protected: + // NB: this is pure virtual so that it can be implemented in dllexported + // wxMessagOutput class +#if !wxUSE_UTF8_LOCALE_ONLY + virtual void DoPrintfWchar(const wxChar *format, ...) = 0; +#endif +#if wxUSE_UNICODE_UTF8 + virtual void DoPrintfUtf8(const char *format, ...) = 0; +#endif +}; + +#ifdef __VISUALC__ + // "non dll-interface class 'wxStringPrintfMixin' used as base interface + // for dll-interface class 'wxString'" -- this is OK in our case + #pragma warning (push) + #pragma warning (disable:4275) +#endif + +class WXDLLIMPEXP_BASE wxMessageOutput : public wxMessageOutputBase +{ +public: + virtual ~wxMessageOutput() { } + + // gets the current wxMessageOutput object (may be NULL during + // initialization or shutdown) + static wxMessageOutput* Get(); + + // sets the global wxMessageOutput instance; returns the previous one + static wxMessageOutput* Set(wxMessageOutput* msgout); + +protected: +#if !wxUSE_UTF8_LOCALE_ONLY + virtual void DoPrintfWchar(const wxChar *format, ...); +#endif +#if wxUSE_UNICODE_UTF8 + virtual void DoPrintfUtf8(const char *format, ...); +#endif + +private: + static wxMessageOutput* ms_msgOut; +}; + +#ifdef __VISUALC__ + #pragma warning (pop) +#endif + +// ---------------------------------------------------------------------------- +// implementation which sends output to stderr or specified file +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMessageOutputStderr : public wxMessageOutput +{ +public: + wxMessageOutputStderr(FILE *fp = stderr) : m_fp(fp) { } + + virtual void Output(const wxString& str); + +protected: + // return the string with "\n" appended if it doesn't already terminate + // with it (in which case it's returned unchanged) + wxString AppendLineFeedIfNeeded(const wxString& str); + + FILE *m_fp; +}; + +// ---------------------------------------------------------------------------- +// implementation showing the message to the user in "best" possible way: +// uses stderr or message box if available according to the flag given to ctor. +// ---------------------------------------------------------------------------- + +enum wxMessageOutputFlags +{ + wxMSGOUT_PREFER_STDERR = 0, // use stderr if available (this is the default) + wxMSGOUT_PREFER_MSGBOX = 1 // always use message box if available +}; + +class WXDLLIMPEXP_BASE wxMessageOutputBest : public wxMessageOutputStderr +{ +public: + wxMessageOutputBest(wxMessageOutputFlags flags = wxMSGOUT_PREFER_STDERR) + : m_flags(flags) { } + + virtual void Output(const wxString& str); + +private: + wxMessageOutputFlags m_flags; +}; + +// ---------------------------------------------------------------------------- +// implementation which shows output in a message box +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI && wxUSE_MSGDLG + +class WXDLLIMPEXP_CORE wxMessageOutputMessageBox : public wxMessageOutput +{ +public: + wxMessageOutputMessageBox() { } + + virtual void Output(const wxString& str); +}; + +#endif // wxUSE_GUI && wxUSE_MSGDLG + +// ---------------------------------------------------------------------------- +// implementation using the native way of outputting debug messages +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMessageOutputDebug : public wxMessageOutputStderr +{ +public: + wxMessageOutputDebug() { } + + virtual void Output(const wxString& str); +}; + +// ---------------------------------------------------------------------------- +// implementation using wxLog (mainly for backwards compatibility) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMessageOutputLog : public wxMessageOutput +{ +public: + wxMessageOutputLog() { } + + virtual void Output(const wxString& str); +}; + +#endif // _WX_MSGOUT_H_ diff --git a/wxmsw/include/wx-3.0/wx/msgqueue.h b/wxmsw/include/wx-3.0/wx/msgqueue.h new file mode 100644 index 00000000..8b8da87d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/msgqueue.h @@ -0,0 +1,168 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msqqueue.h +// Purpose: Message queues for inter-thread communication +// Author: Evgeniy Tarassov +// Created: 2007-10-31 +// Copyright: (C) 2007 TT-Solutions SARL +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSGQUEUE_H_ +#define _WX_MSGQUEUE_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/thread.h" + +#if wxUSE_THREADS + +#include "wx/stopwatch.h" + +#include "wx/beforestd.h" +#include <queue> +#include "wx/afterstd.h" + +enum wxMessageQueueError +{ + wxMSGQUEUE_NO_ERROR = 0, // operation completed successfully + wxMSGQUEUE_TIMEOUT, // no messages received before timeout expired + wxMSGQUEUE_MISC_ERROR // some unexpected (and fatal) error has occurred +}; + +// --------------------------------------------------------------------------- +// Message queue allows passing message between threads. +// +// This class is typically used for communicating between the main and worker +// threads. The main thread calls Post() and the worker thread calls Receive(). +// +// For this class a message is an object of arbitrary type T. Notice that +// typically there must be some special message indicating that the thread +// should terminate as there is no other way to gracefully shutdown a thread +// waiting on the message queue. +// --------------------------------------------------------------------------- +template <typename T> +class wxMessageQueue +{ +public: + // The type of the messages transported by this queue + typedef T Message; + + // Default ctor creates an initially empty queue + wxMessageQueue() + : m_conditionNotEmpty(m_mutex) + { + } + + // Add a message to this queue and signal the threads waiting for messages. + // + // This method is safe to call from multiple threads in parallel. + wxMessageQueueError Post(const Message& msg) + { + wxMutexLocker locker(m_mutex); + + wxCHECK( locker.IsOk(), wxMSGQUEUE_MISC_ERROR ); + + m_messages.push(msg); + + m_conditionNotEmpty.Signal(); + + return wxMSGQUEUE_NO_ERROR; + } + + // Remove all messages from the queue. + // + // This method is meant to be called from the same thread(s) that call + // Post() to discard any still pending requests if they became unnecessary. + wxMessageQueueError Clear() + { + wxCHECK( IsOk(), wxMSGQUEUE_MISC_ERROR ); + + wxMutexLocker locker(m_mutex); + + std::queue<T> empty; + std::swap(m_messages, empty); + + return wxMSGQUEUE_NO_ERROR; + } + + // Wait no more than timeout milliseconds until a message becomes available. + // + // Setting timeout to 0 is equivalent to an infinite timeout. See Receive(). + wxMessageQueueError ReceiveTimeout(long timeout, T& msg) + { + wxCHECK( IsOk(), wxMSGQUEUE_MISC_ERROR ); + + wxMutexLocker locker(m_mutex); + + wxCHECK( locker.IsOk(), wxMSGQUEUE_MISC_ERROR ); + + const wxMilliClock_t waitUntil = wxGetLocalTimeMillis() + timeout; + while ( m_messages.empty() ) + { + wxCondError result = m_conditionNotEmpty.WaitTimeout(timeout); + + if ( result == wxCOND_NO_ERROR ) + continue; + + wxCHECK( result == wxCOND_TIMEOUT, wxMSGQUEUE_MISC_ERROR ); + + const wxMilliClock_t now = wxGetLocalTimeMillis(); + + if ( now >= waitUntil ) + return wxMSGQUEUE_TIMEOUT; + + timeout = (waitUntil - now).ToLong(); + wxASSERT(timeout > 0); + } + + msg = m_messages.front(); + m_messages.pop(); + + return wxMSGQUEUE_NO_ERROR; + } + + // Same as ReceiveTimeout() but waits for as long as it takes for a message + // to become available (so it can't return wxMSGQUEUE_TIMEOUT) + wxMessageQueueError Receive(T& msg) + { + wxCHECK( IsOk(), wxMSGQUEUE_MISC_ERROR ); + + wxMutexLocker locker(m_mutex); + + wxCHECK( locker.IsOk(), wxMSGQUEUE_MISC_ERROR ); + + while ( m_messages.empty() ) + { + wxCondError result = m_conditionNotEmpty.Wait(); + + wxCHECK( result == wxCOND_NO_ERROR, wxMSGQUEUE_MISC_ERROR ); + } + + msg = m_messages.front(); + m_messages.pop(); + + return wxMSGQUEUE_NO_ERROR; + } + + // Return false only if there was a fatal error in ctor + bool IsOk() const + { + return m_conditionNotEmpty.IsOk(); + } + +private: + // Disable copy ctor and assignment operator + wxMessageQueue(const wxMessageQueue<T>& rhs); + wxMessageQueue<T>& operator=(const wxMessageQueue<T>& rhs); + + mutable wxMutex m_mutex; + wxCondition m_conditionNotEmpty; + + std::queue<T> m_messages; +}; + +#endif // wxUSE_THREADS + +#endif // _WX_MSGQUEUE_H_ diff --git a/wxmsw/include/wx-3.0/wx/mstream.h b/wxmsw/include/wx-3.0/wx/mstream.h new file mode 100644 index 00000000..435aebdf --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/mstream.h @@ -0,0 +1,109 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/mstream.h +// Purpose: Memory stream classes +// Author: Guilhem Lavaux +// Modified by: +// Created: 11/07/98 +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WXMMSTREAM_H__ +#define _WX_WXMMSTREAM_H__ + +#include "wx/defs.h" + +#if wxUSE_STREAMS + +#include "wx/stream.h" + +class WXDLLIMPEXP_FWD_BASE wxMemoryOutputStream; + +class WXDLLIMPEXP_BASE wxMemoryInputStream : public wxInputStream +{ +public: + wxMemoryInputStream(const void *data, size_t length); + wxMemoryInputStream(const wxMemoryOutputStream& stream); + wxMemoryInputStream(wxInputStream& stream, + wxFileOffset lenFile = wxInvalidOffset) + { + InitFromStream(stream, lenFile); + } + wxMemoryInputStream(wxMemoryInputStream& stream) + : wxInputStream() + { + InitFromStream(stream, wxInvalidOffset); + } + + virtual ~wxMemoryInputStream(); + virtual wxFileOffset GetLength() const { return m_length; } + virtual bool IsSeekable() const { return true; } + + virtual char Peek(); + virtual bool CanRead() const; + + wxStreamBuffer *GetInputStreamBuffer() const { return m_i_streambuf; } + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, compatibility only + wxDEPRECATED( wxStreamBuffer *InputStreamBuffer() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + wxStreamBuffer *m_i_streambuf; + + size_t OnSysRead(void *buffer, size_t nbytes); + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + wxFileOffset OnSysTell() const; + +private: + // common part of ctors taking wxInputStream + void InitFromStream(wxInputStream& stream, wxFileOffset lenFile); + + size_t m_length; + + // copy ctor is implemented above: it copies the other stream in this one + DECLARE_ABSTRACT_CLASS(wxMemoryInputStream) + wxDECLARE_NO_ASSIGN_CLASS(wxMemoryInputStream); +}; + +class WXDLLIMPEXP_BASE wxMemoryOutputStream : public wxOutputStream +{ +public: + // if data is !NULL it must be allocated with malloc() + wxMemoryOutputStream(void *data = NULL, size_t length = 0); + virtual ~wxMemoryOutputStream(); + virtual wxFileOffset GetLength() const { return m_o_streambuf->GetLastAccess(); } + virtual bool IsSeekable() const { return true; } + + size_t CopyTo(void *buffer, size_t len) const; + + wxStreamBuffer *GetOutputStreamBuffer() const { return m_o_streambuf; } + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, compatibility only + wxDEPRECATED( wxStreamBuffer *OutputStreamBuffer() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + wxStreamBuffer *m_o_streambuf; + +protected: + size_t OnSysWrite(const void *buffer, size_t nbytes); + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + wxFileOffset OnSysTell() const; + + DECLARE_DYNAMIC_CLASS(wxMemoryOutputStream) + wxDECLARE_NO_COPY_CLASS(wxMemoryOutputStream); +}; + +#if WXWIN_COMPATIBILITY_2_6 + inline wxStreamBuffer *wxMemoryInputStream::InputStreamBuffer() const { return m_i_streambuf; } + inline wxStreamBuffer *wxMemoryOutputStream::OutputStreamBuffer() const { return m_o_streambuf; } +#endif // WXWIN_COMPATIBILITY_2_6 + +#endif + // wxUSE_STREAMS + +#endif + // _WX_WXMMSTREAM_H__ diff --git a/wxmsw/include/wx-3.0/wx/nativewin.h b/wxmsw/include/wx-3.0/wx/nativewin.h new file mode 100644 index 00000000..e0328e95 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/nativewin.h @@ -0,0 +1,173 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/nativewin.h +// Purpose: classes allowing to wrap a native window handle +// Author: Vadim Zeitlin +// Created: 2008-03-05 +// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_NATIVEWIN_H_ +#define _WX_NATIVEWIN_H_ + +#include "wx/toplevel.h" + +// this symbol can be tested in the user code to see if the current wx port has +// support for creating wxNativeContainerWindow from native windows +// +// be optimistic by default, we undefine it below if we don't have it finally +#define wxHAS_NATIVE_CONTAINER_WINDOW + +// we define the following typedefs for each of the platform supporting native +// windows wrapping: +// +// - wxNativeContainerWindowHandle is the toolkit-level handle of the native +// window, i.e. HWND/GdkWindow*/NSWindow +// +// - wxNativeContainerWindowId is the lowest level identifier of the native +// window, i.e. HWND/GdkNativeWindow/NSWindow (so it's the same as above for +// all platforms except GTK where we also can work with Window/XID) +// +// later we'll also have +// +// - wxNativeWindowHandle for child windows (which will be wrapped by +// wxNativeWindow<T> class), it is HWND/GtkWidget*/ControlRef +#if defined(__WXMSW__) + #include "wx/msw/wrapwin.h" + + typedef HWND wxNativeContainerWindowId; + typedef HWND wxNativeContainerWindowHandle; +#elif defined(__WXGTK__) + // GdkNativeWindow is guint32 under GDK/X11 and gpointer under GDK/WIN32 + #ifdef __UNIX__ + typedef unsigned long wxNativeContainerWindowId; + #else + typedef void *wxNativeContainerWindowId; + #endif + typedef GdkWindow *wxNativeContainerWindowHandle; +#else + // no support for using native windows under this platform yet + #undef wxHAS_NATIVE_CONTAINER_WINDOW +#endif + +#ifdef wxHAS_NATIVE_CONTAINER_WINDOW + +// ---------------------------------------------------------------------------- +// wxNativeContainerWindow: can be used for creating other wxWindows inside it +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxNativeContainerWindow : public wxTopLevelWindow +{ +public: + // default ctor, call Create() later + wxNativeContainerWindow() { } + + // create a window from an existing native window handle + // + // use GetHandle() to check if the creation was successful, it will return + // 0 if the handle was invalid + wxNativeContainerWindow(wxNativeContainerWindowHandle handle) + { + Create(handle); + } + + // same as ctor above but with a return code + bool Create(wxNativeContainerWindowHandle handle); + +#if defined(__WXGTK__) + // this is a convenient ctor for wxGTK applications which can also create + // the objects of this class from the really native window handles and not + // only the GdkWindow objects + // + // wxNativeContainerWindowId is Window (i.e. an XID, i.e. an int) under X11 + // (when GDK_WINDOWING_X11 is defined) or HWND under Win32 + wxNativeContainerWindow(wxNativeContainerWindowId winid) { Create(winid); } + + bool Create(wxNativeContainerWindowId winid); +#endif // wxGTK + + // unlike for the normal windows, dtor will not destroy the native window + // as it normally doesn't belong to us + virtual ~wxNativeContainerWindow(); + + + // provide (trivial) implementation of the base class pure virtuals + virtual void SetTitle(const wxString& WXUNUSED(title)) + { + wxFAIL_MSG( "not implemented for native windows" ); + } + + virtual wxString GetTitle() const + { + wxFAIL_MSG( "not implemented for native windows" ); + + return wxString(); + } + + virtual void Maximize(bool WXUNUSED(maximize) = true) + { + wxFAIL_MSG( "not implemented for native windows" ); + } + + virtual bool IsMaximized() const + { + wxFAIL_MSG( "not implemented for native windows" ); + + return false; + } + + virtual void Iconize(bool WXUNUSED(iconize) = true) + { + wxFAIL_MSG( "not implemented for native windows" ); + } + + virtual bool IsIconized() const + { + // this is called by wxGTK implementation so don't assert + return false; + } + + virtual void Restore() + { + wxFAIL_MSG( "not implemented for native windows" ); + } + + virtual bool ShowFullScreen(bool WXUNUSED(show), + long WXUNUSED(style) = wxFULLSCREEN_ALL) + { + wxFAIL_MSG( "not implemented for native windows" ); + + return false; + } + + virtual bool IsFullScreen() const + { + wxFAIL_MSG( "not implemented for native windows" ); + + return false; + } + +#ifdef __WXMSW__ + virtual bool IsShown() const; +#endif // __WXMSW__ + + // this is an implementation detail: called when the native window is + // destroyed by an outside agency; deletes the C++ object too but can in + // principle be overridden to something else (knowing that the window + // handle of this object and all of its children is invalid any more) + virtual void OnNativeDestroyed(); + +protected: +#ifdef __WXMSW__ + virtual WXLRESULT + MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); +#endif // __WXMSW__ + +private: + wxDECLARE_NO_COPY_CLASS(wxNativeContainerWindow); +}; + +#endif // wxHAS_NATIVE_CONTAINER_WINDOW + +#endif // _WX_NATIVEWIN_H_ + diff --git a/wxmsw/include/wx-3.0/wx/nonownedwnd.h b/wxmsw/include/wx-3.0/wx/nonownedwnd.h new file mode 100644 index 00000000..7d870993 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/nonownedwnd.h @@ -0,0 +1,113 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/nonownedwnd.h +// Purpose: declares wxNonTopLevelWindow class +// Author: Vaclav Slavik +// Modified by: +// Created: 2006-12-24 +// Copyright: (c) 2006 TT-Solutions +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_NONOWNEDWND_H_ +#define _WX_NONOWNEDWND_H_ + +#include "wx/window.h" + +// Styles that can be used with any wxNonOwnedWindow: +#define wxFRAME_SHAPED 0x0010 // Create a window that is able to be shaped + +class WXDLLIMPEXP_FWD_CORE wxGraphicsPath; + +// ---------------------------------------------------------------------------- +// wxNonOwnedWindow: a window that is not a child window of another one. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxNonOwnedWindowBase : public wxWindow +{ +public: + // Set the shape of the window to the given region. + // Returns true if the platform supports this feature (and the + // operation is successful.) + bool SetShape(const wxRegion& region) + { + // This style is in fact only needed by wxOSX/Carbon so once we don't + // use this port any more, we could get rid of this requirement, but + // for now you must specify wxFRAME_SHAPED for SetShape() to work on + // all platforms. + wxCHECK_MSG + ( + HasFlag(wxFRAME_SHAPED), false, + wxS("Shaped windows must be created with the wxFRAME_SHAPED style.") + ); + + return region.IsEmpty() ? DoClearShape() : DoSetRegionShape(region); + } + +#if wxUSE_GRAPHICS_CONTEXT + // Set the shape using the specified path. + bool SetShape(const wxGraphicsPath& path) + { + wxCHECK_MSG + ( + HasFlag(wxFRAME_SHAPED), false, + wxS("Shaped windows must be created with the wxFRAME_SHAPED style.") + ); + + return DoSetPathShape(path); + } +#endif // wxUSE_GRAPHICS_CONTEXT + + + // Overridden base class methods. + // ------------------------------ + + virtual void AdjustForParentClientOrigin(int& WXUNUSED(x), int& WXUNUSED(y), + int WXUNUSED(sizeFlags) = 0) const + { + // Non owned windows positions don't need to be adjusted for parent + // client area origin so simply do nothing here. + } + + virtual void InheritAttributes() + { + // Non owned windows don't inherit attributes from their parent window + // (if the parent frame is red, it doesn't mean that all dialogs shown + // by it should be red as well), so don't do anything here neither. + } + +protected: + virtual bool DoClearShape() + { + return false; + } + + virtual bool DoSetRegionShape(const wxRegion& WXUNUSED(region)) + { + return false; + } + +#if wxUSE_GRAPHICS_CONTEXT + virtual bool DoSetPathShape(const wxGraphicsPath& WXUNUSED(path)) + { + return false; + } +#endif // wxUSE_GRAPHICS_CONTEXT +}; + +#if defined(__WXDFB__) + #include "wx/dfb/nonownedwnd.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/nonownedwnd.h" +#elif defined(__WXMAC__) + #include "wx/osx/nonownedwnd.h" +#elif defined(__WXMSW__) && !defined(__WXWINCE__) + #include "wx/msw/nonownedwnd.h" +#else + // No special class needed in other ports, they can derive both wxTLW and + // wxPopupWindow directly from wxWindow and don't implement SetShape(). + class wxNonOwnedWindow : public wxNonOwnedWindowBase + { + }; +#endif + +#endif // _WX_NONOWNEDWND_H_ diff --git a/wxmsw/include/wx-3.0/wx/notebook.h b/wxmsw/include/wx-3.0/wx/notebook.h new file mode 100644 index 00000000..1535229a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/notebook.h @@ -0,0 +1,209 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/notebook.h +// Purpose: wxNotebook interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 01.02.01 +// Copyright: (c) 1996-2000 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_NOTEBOOK_H_BASE_ +#define _WX_NOTEBOOK_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_NOTEBOOK + +#include "wx/bookctrl.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// wxNotebook hit results, use wxBK_HITTEST so other book controls can share them +// if wxUSE_NOTEBOOK is disabled +enum +{ + wxNB_HITTEST_NOWHERE = wxBK_HITTEST_NOWHERE, + wxNB_HITTEST_ONICON = wxBK_HITTEST_ONICON, + wxNB_HITTEST_ONLABEL = wxBK_HITTEST_ONLABEL, + wxNB_HITTEST_ONITEM = wxBK_HITTEST_ONITEM, + wxNB_HITTEST_ONPAGE = wxBK_HITTEST_ONPAGE +}; + +// wxNotebook flags + +// use common book wxBK_* flags for describing alignment +#define wxNB_DEFAULT wxBK_DEFAULT +#define wxNB_TOP wxBK_TOP +#define wxNB_BOTTOM wxBK_BOTTOM +#define wxNB_LEFT wxBK_LEFT +#define wxNB_RIGHT wxBK_RIGHT + +#define wxNB_FIXEDWIDTH 0x0100 +#define wxNB_MULTILINE 0x0200 +#define wxNB_NOPAGETHEME 0x0400 +#define wxNB_FLAT 0x0800 + + +typedef wxWindow wxNotebookPage; // so far, any window can be a page + +extern WXDLLIMPEXP_DATA_CORE(const char) wxNotebookNameStr[]; + +#if wxUSE_EXTENDED_RTTI + +// ---------------------------------------------------------------------------- +// XTI accessor +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxNotebookPageInfo : public wxObject +{ +public: + wxNotebookPageInfo() { m_page = NULL; m_imageId = -1; m_selected = false; } + virtual ~wxNotebookPageInfo() { } + + bool Create(wxNotebookPage *page, + const wxString& text, + bool selected, + int imageId) + { + m_page = page; + m_text = text; + m_selected = selected; + m_imageId = imageId; + return true; + } + + wxNotebookPage* GetPage() const { return m_page; } + wxString GetText() const { return m_text; } + bool GetSelected() const { return m_selected; } + int GetImageId() const { return m_imageId; } + +private: + wxNotebookPage *m_page; + wxString m_text; + bool m_selected; + int m_imageId; + + DECLARE_DYNAMIC_CLASS(wxNotebookPageInfo) +}; + +WX_DECLARE_EXPORTED_LIST(wxNotebookPageInfo, wxNotebookPageInfoList ); + +#endif + +// ---------------------------------------------------------------------------- +// wxNotebookBase: define wxNotebook interface +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxNotebookBase : public wxBookCtrlBase +{ +public: + // ctors + // ----- + + wxNotebookBase() { } + + // wxNotebook-specific additions to wxBookCtrlBase interface + // --------------------------------------------------------- + + // get the number of rows for a control with wxNB_MULTILINE style (not all + // versions support it - they will always return 1 then) + virtual int GetRowCount() const { return 1; } + + // set the padding between tabs (in pixels) + virtual void SetPadding(const wxSize& padding) = 0; + + // set the size of the tabs for wxNB_FIXEDWIDTH controls + virtual void SetTabSize(const wxSize& sz) = 0; + + + + // implement some base class functions + virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const; + + // On platforms that support it, get the theme page background colour, else invalid colour + virtual wxColour GetThemeBackgroundColour() const { return wxNullColour; } + + + // send wxEVT_NOTEBOOK_PAGE_CHANGING/ED events + + // returns false if the change to nPage is vetoed by the program + bool SendPageChangingEvent(int nPage); + + // sends the event about page change from old to new (or GetSelection() if + // new is wxNOT_FOUND) + void SendPageChangedEvent(int nPageOld, int nPageNew = wxNOT_FOUND); + + // wxBookCtrlBase overrides this method to return false but we do need + // focus because we have tabs + virtual bool AcceptsFocus() const { return wxControl::AcceptsFocus(); } + +#if wxUSE_EXTENDED_RTTI + // XTI accessors + virtual void AddPageInfo( wxNotebookPageInfo* info ); + virtual const wxNotebookPageInfoList& GetPageInfos() const; +#endif + +protected: +#if wxUSE_EXTENDED_RTTI + wxNotebookPageInfoList m_pageInfos; +#endif + wxDECLARE_NO_COPY_CLASS(wxNotebookBase); +}; + +// ---------------------------------------------------------------------------- +// notebook event class and related stuff +// ---------------------------------------------------------------------------- + +// wxNotebookEvent is obsolete and defined for compatibility only (notice that +// we use #define and not typedef to also keep compatibility with the existing +// code which forward declares it) +#define wxNotebookEvent wxBookCtrlEvent +typedef wxBookCtrlEventFunction wxNotebookEventFunction; +#define wxNotebookEventHandler(func) wxBookCtrlEventHandler(func) + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_NOTEBOOK_PAGE_CHANGED, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_NOTEBOOK_PAGE_CHANGING, wxBookCtrlEvent ); + +#define EVT_NOTEBOOK_PAGE_CHANGED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_NOTEBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) + +#define EVT_NOTEBOOK_PAGE_CHANGING(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_NOTEBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) + +// ---------------------------------------------------------------------------- +// wxNotebook class itself +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/notebook.h" +#elif defined(__WXMSW__) + #include "wx/msw/notebook.h" +#elif defined(__WXMOTIF__) + #include "wx/generic/notebook.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/notebook.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/notebook.h" +#elif defined(__WXMAC__) + #include "wx/osx/notebook.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/notebook.h" +#elif defined(__WXPM__) + #include "wx/os2/notebook.h" +#endif + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED wxEVT_NOTEBOOK_PAGE_CHANGED +#define wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING wxEVT_NOTEBOOK_PAGE_CHANGING + +#endif // wxUSE_NOTEBOOK + +#endif + // _WX_NOTEBOOK_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/notifmsg.h b/wxmsw/include/wx-3.0/wx/notifmsg.h new file mode 100644 index 00000000..fe49c876 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/notifmsg.h @@ -0,0 +1,159 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/notifmsg.h +// Purpose: class allowing to show notification messages to the user +// Author: Vadim Zeitlin +// Created: 2007-11-19 +// Copyright: (c) 2007 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_NOTIFMSG_H_ +#define _WX_NOTIFMSG_H_ + +#include "wx/event.h" + +#if wxUSE_NOTIFICATION_MESSAGE + +// ---------------------------------------------------------------------------- +// wxNotificationMessage: allows to show the user a message non intrusively +// ---------------------------------------------------------------------------- + +// notice that this class is not a window and so doesn't derive from wxWindow + +class WXDLLIMPEXP_ADV wxNotificationMessageBase : public wxEvtHandler +{ +public: + // ctors and initializers + // ---------------------- + + // default ctor, use setters below to initialize it later + wxNotificationMessageBase() + { + m_parent = NULL; + m_flags = wxICON_INFORMATION; + } + + // create a notification object with the given title and message (the + // latter may be empty in which case only the title will be shown) + wxNotificationMessageBase(const wxString& title, + const wxString& message = wxEmptyString, + wxWindow *parent = NULL, + int flags = wxICON_INFORMATION) + : m_title(title), + m_message(message), + m_parent(parent) + { + SetFlags(flags); + } + + // note that the setters must be called before Show() + + // set the title: short string, markup not allowed + void SetTitle(const wxString& title) { m_title = title; } + + // set the text of the message: this is a longer string than the title and + // some platforms allow simple HTML-like markup in it + void SetMessage(const wxString& message) { m_message = message; } + + // set the parent for this notification: we'll be associated with the top + // level parent of this window or, if this method is not called, with the + // main application window by default + void SetParent(wxWindow *parent) { m_parent = parent; } + + // this method can currently be used to choose a standard icon to use: the + // parameter may be one of wxICON_INFORMATION, wxICON_WARNING or + // wxICON_ERROR only (but not wxICON_QUESTION) + void SetFlags(int flags) + { + wxASSERT_MSG( flags == wxICON_INFORMATION || + flags == wxICON_WARNING || flags == wxICON_ERROR, + "Invalid icon flags specified" ); + + m_flags = flags; + } + + + // showing and hiding + // ------------------ + + // possible values for Show() timeout + enum + { + Timeout_Auto = -1, // notification will be hidden automatically + Timeout_Never = 0 // notification will never time out + }; + + // show the notification to the user and hides it after timeout seconds + // pass (special values Timeout_Auto and Timeout_Never can be used) + // + // returns false if an error occurred + virtual bool Show(int timeout = Timeout_Auto) = 0; + + // hide the notification, returns true if it was hidden or false if it + // couldn't be done (e.g. on some systems automatically hidden + // notifications can't be hidden manually) + virtual bool Close() = 0; + +protected: + // accessors for the derived classes + const wxString& GetTitle() const { return m_title; } + const wxString& GetMessage() const { return m_message; } + wxWindow *GetParent() const { return m_parent; } + int GetFlags() const { return m_flags; } + + // return the concatenation of title and message separated by a new line, + // this is suitable for simple implementation which have no support for + // separate title and message parts of the notification + wxString GetFullMessage() const + { + wxString text(m_title); + if ( !m_message.empty() ) + { + text << "\n\n" << m_message; + } + + return text; + } + +private: + wxString m_title, + m_message; + + wxWindow *m_parent; + + int m_flags; + + wxDECLARE_NO_COPY_CLASS(wxNotificationMessageBase); +}; + +/* + TODO: Implement under OS X using notification centre (10.8+) or + Growl (http://growl.info/) for the previous versions. + */ +#if defined(__WXGTK__) && wxUSE_LIBNOTIFY + #include "wx/gtk/notifmsg.h" +#elif defined(__WXGTK__) && (wxUSE_LIBHILDON || wxUSE_LIBHILDON2) + #include "wx/gtk/hildon/notifmsg.h" +#elif defined(__WXMSW__) && wxUSE_TASKBARICON && wxUSE_TASKBARICON_BALLOONS + #include "wx/msw/notifmsg.h" +#else + #include "wx/generic/notifmsg.h" + + class wxNotificationMessage : public wxGenericNotificationMessage + { + public: + wxNotificationMessage() { } + wxNotificationMessage(const wxString& title, + const wxString& message = wxEmptyString, + wxWindow *parent = NULL, + int flags = wxICON_INFORMATION) + : wxGenericNotificationMessage(title, message, parent, flags) + { + } + }; +#endif + +#endif // wxUSE_NOTIFICATION_MESSAGE + +#endif // _WX_NOTIFMSG_H_ + diff --git a/wxmsw/include/wx-3.0/wx/numdlg.h b/wxmsw/include/wx-3.0/wx/numdlg.h new file mode 100644 index 00000000..c1c39742 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/numdlg.h @@ -0,0 +1,22 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/numdlg.h +// Purpose: wxNumberEntryDialog class +// Author: John Labenski +// Modified by: +// Created: 07.02.04 (extracted from wx/textdlg.h) +// Copyright: (c) John Labenski +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_NUMDLGDLG_H_BASE_ +#define _WX_NUMDLGDLG_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_NUMBERDLG + +#include "wx/generic/numdlgg.h" + +#endif // wxUSE_NUMBERDLG + +#endif // _WX_NUMDLGDLG_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/numformatter.h b/wxmsw/include/wx-3.0/wx/numformatter.h new file mode 100644 index 00000000..13b47b21 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/numformatter.h @@ -0,0 +1,78 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/numformatter.h +// Purpose: wxNumberFormatter class +// Author: Fulvio Senore, Vadim Zeitlin +// Created: 2010-11-06 +// Copyright: (c) 2010 wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_NUMFORMATTER_H_ +#define _WX_NUMFORMATTER_H_ + +#include "wx/string.h" + +// Helper class for formatting numbers with thousands separators which also +// supports parsing the numbers formatted by it. +class WXDLLIMPEXP_BASE wxNumberFormatter +{ +public: + // Bit masks for ToString() + enum Style + { + Style_None = 0x00, + Style_WithThousandsSep = 0x01, + Style_NoTrailingZeroes = 0x02 // Only for floating point numbers + }; + + // Format a number as a string. By default, the thousands separator is + // used, specify Style_None to prevent this. For floating point numbers, + // precision can also be specified. + static wxString ToString(long val, + int style = Style_WithThousandsSep); +#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + static wxString ToString(wxLongLong_t val, + int style = Style_WithThousandsSep); +#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + static wxString ToString(double val, + int precision, + int style = Style_WithThousandsSep); + + // Parse a string representing a number, possibly with thousands separator. + // + // Return true on success and stores the result in the provided location + // which must be a valid non-NULL pointer. + static bool FromString(wxString s, long *val); +#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + static bool FromString(wxString s, wxLongLong_t *val); +#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + static bool FromString(wxString s, double *val); + + + // Get the decimal separator for the current locale. It is always defined + // and we fall back to returning '.' in case of an error. + static wxChar GetDecimalSeparator(); + + // Get the thousands separator if grouping of the digits is used by the + // current locale. The value returned in sep should be only used if the + // function returns true. + static bool GetThousandsSeparatorIfUsed(wxChar *sep); + +private: + // Post-process the string representing an integer. + static wxString PostProcessIntString(wxString s, int style); + + // Add the thousands separators to a string representing a number without + // the separators. This is used by ToString(Style_WithThousandsSep). + static void AddThousandsSeparators(wxString& s); + + // Remove trailing zeroes and, if there is nothing left after it, the + // decimal separator itself from a string representing a floating point + // number. Also used by ToString(). + static void RemoveTrailingZeroes(wxString& s); + + // Remove all thousands separators from a string representing a number. + static void RemoveThousandsSeparators(wxString& s); +}; + +#endif // _WX_NUMFORMATTER_H_ diff --git a/wxmsw/include/wx-3.0/wx/object.h b/wxmsw/include/wx-3.0/wx/object.h new file mode 100644 index 00000000..04c65122 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/object.h @@ -0,0 +1,497 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/object.h +// Purpose: wxObject class, plus run-time type information macros +// Author: Julian Smart +// Modified by: Ron Lee +// Created: 01/02/97 +// Copyright: (c) 1997 Julian Smart +// (c) 2001 Ron Lee <ron@debian.org> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_OBJECTH__ +#define _WX_OBJECTH__ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/memory.h" + +#define wxDECLARE_CLASS_INFO_ITERATORS() \ +class WXDLLIMPEXP_BASE const_iterator \ + { \ + typedef wxHashTable_Node Node; \ + public: \ + typedef const wxClassInfo* value_type; \ + typedef const value_type& const_reference; \ + typedef const_iterator itor; \ + typedef value_type* ptr_type; \ + \ + Node* m_node; \ + wxHashTable* m_table; \ + public: \ + typedef const_reference reference_type; \ + typedef ptr_type pointer_type; \ + \ + const_iterator(Node* node, wxHashTable* table) \ + : m_node(node), m_table(table) { } \ + const_iterator() : m_node(NULL), m_table(NULL) { } \ + value_type operator*() const; \ + itor& operator++(); \ + const itor operator++(int); \ + bool operator!=(const itor& it) const \ + { return it.m_node != m_node; } \ + bool operator==(const itor& it) const \ + { return it.m_node == m_node; } \ + }; \ + \ + static const_iterator begin_classinfo(); \ + static const_iterator end_classinfo() + +// based on the value of wxUSE_EXTENDED_RTTI symbol, +// only one of the RTTI system will be compiled: +// - the "old" one (defined by rtti.h) or +// - the "new" one (defined by xti.h) +#include "wx/xti.h" +#include "wx/rtti.h" + +#define wxIMPLEMENT_CLASS(name, basename) \ + wxIMPLEMENT_ABSTRACT_CLASS(name, basename) + +#define wxIMPLEMENT_CLASS2(name, basename1, basename2) \ + wxIMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) + +// ----------------------------------- +// for pluggable classes +// ----------------------------------- + + // NOTE: this should probably be the very first statement + // in the class declaration so wxPluginSentinel is + // the first member initialised and the last destroyed. + +// _DECLARE_DL_SENTINEL(name) wxPluginSentinel m_pluginsentinel; + +#if wxUSE_NESTED_CLASSES + +#define _DECLARE_DL_SENTINEL(name, exportdecl) \ +class exportdecl name##PluginSentinel { \ +private: \ + static const wxString sm_className; \ +public: \ + name##PluginSentinel(); \ + ~name##PluginSentinel(); \ +}; \ +name##PluginSentinel m_pluginsentinel + +#define _IMPLEMENT_DL_SENTINEL(name) \ + const wxString name::name##PluginSentinel::sm_className(#name); \ + name::name##PluginSentinel::name##PluginSentinel() { \ + wxPluginLibrary *e = (wxPluginLibrary*) wxPluginLibrary::ms_classes.Get(#name); \ + if( e != 0 ) { e->RefObj(); } \ + } \ + name::name##PluginSentinel::~name##PluginSentinel() { \ + wxPluginLibrary *e = (wxPluginLibrary*) wxPluginLibrary::ms_classes.Get(#name); \ + if( e != 0 ) { e->UnrefObj(); } \ + } +#else + +#define _DECLARE_DL_SENTINEL(name) +#define _IMPLEMENT_DL_SENTINEL(name) + +#endif // wxUSE_NESTED_CLASSES + +#define wxDECLARE_PLUGGABLE_CLASS(name) \ + wxDECLARE_DYNAMIC_CLASS(name); _DECLARE_DL_SENTINEL(name, WXDLLIMPEXP_CORE) +#define wxDECLARE_ABSTRACT_PLUGGABLE_CLASS(name) \ + wxDECLARE_ABSTRACT_CLASS(name); _DECLARE_DL_SENTINEL(name, WXDLLIMPEXP_CORE) + +#define wxDECLARE_USER_EXPORTED_PLUGGABLE_CLASS(name, usergoo) \ + wxDECLARE_DYNAMIC_CLASS(name); _DECLARE_DL_SENTINEL(name, usergoo) +#define wxDECLARE_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(name, usergoo) \ + wxDECLARE_ABSTRACT_CLASS(name); _DECLARE_DL_SENTINEL(name, usergoo) + +#define wxIMPLEMENT_PLUGGABLE_CLASS(name, basename) \ + wxIMPLEMENT_DYNAMIC_CLASS(name, basename) _IMPLEMENT_DL_SENTINEL(name) +#define wxIMPLEMENT_PLUGGABLE_CLASS2(name, basename1, basename2) \ + wxIMPLEMENT_DYNAMIC_CLASS2(name, basename1, basename2) _IMPLEMENT_DL_SENTINEL(name) +#define wxIMPLEMENT_ABSTRACT_PLUGGABLE_CLASS(name, basename) \ + wxIMPLEMENT_ABSTRACT_CLASS(name, basename) _IMPLEMENT_DL_SENTINEL(name) +#define wxIMPLEMENT_ABSTRACT_PLUGGABLE_CLASS2(name, basename1, basename2) \ + wxIMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) _IMPLEMENT_DL_SENTINEL(name) + +#define wxIMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS(name, basename) \ + wxIMPLEMENT_PLUGGABLE_CLASS(name, basename) +#define wxIMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS2(name, basename1, basename2) \ + wxIMPLEMENT_PLUGGABLE_CLASS2(name, basename1, basename2) +#define wxIMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(name, basename) \ + wxIMPLEMENT_ABSTRACT_PLUGGABLE_CLASS(name, basename) +#define wxIMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS2(name, basename1, basename2) \ + wxIMPLEMENT_ABSTRACT_PLUGGABLE_CLASS2(name, basename1, basename2) + +#define wxCLASSINFO(name) (&name::ms_classInfo) + +#define wxIS_KIND_OF(obj, className) obj->IsKindOf(&className::ms_classInfo) + +// Just seems a bit nicer-looking (pretend it's not a macro) +#define wxIsKindOf(obj, className) obj->IsKindOf(&className::ms_classInfo) + +// this cast does some more checks at compile time as it uses static_cast +// internally +// +// note that it still has different semantics from dynamic_cast<> and so can't +// be replaced by it as long as there are any compilers not supporting it +#define wxDynamicCast(obj, className) \ + ((className *) wxCheckDynamicCast( \ + const_cast<wxObject *>(static_cast<const wxObject *>(\ + const_cast<className *>(static_cast<const className *>(obj)))), \ + &className::ms_classInfo)) + +// The 'this' pointer is always true, so use this version +// to cast the this pointer and avoid compiler warnings. +#define wxDynamicCastThis(className) \ + (IsKindOf(&className::ms_classInfo) ? (className *)(this) : (className *)0) + +// FIXME-VC6: dummy argument needed because VC6 doesn't support explicitly +// choosing the template function to call +template <class T> +inline T *wxCheckCast(const void *ptr, T * = NULL) +{ + wxASSERT_MSG( wxDynamicCast(ptr, T), "wxStaticCast() used incorrectly" ); + return const_cast<T *>(static_cast<const T *>(ptr)); +} + +#define wxStaticCast(obj, className) wxCheckCast((obj), (className *)NULL) + +// ---------------------------------------------------------------------------- +// set up memory debugging macros +// ---------------------------------------------------------------------------- + +/* + Which new/delete operator variants do we want? + + _WX_WANT_NEW_SIZET_WXCHAR_INT = void *operator new (size_t size, wxChar *fileName = 0, int lineNum = 0) + _WX_WANT_DELETE_VOID = void operator delete (void * buf) + _WX_WANT_DELETE_VOID_CONSTCHAR_SIZET = void operator delete (void *buf, const char *_fname, size_t _line) + _WX_WANT_DELETE_VOID_WXCHAR_INT = void operator delete(void *buf, wxChar*, int) + _WX_WANT_ARRAY_NEW_SIZET_WXCHAR_INT = void *operator new[] (size_t size, wxChar *fileName , int lineNum = 0) + _WX_WANT_ARRAY_DELETE_VOID = void operator delete[] (void *buf) + _WX_WANT_ARRAY_DELETE_VOID_WXCHAR_INT = void operator delete[] (void* buf, wxChar*, int ) +*/ + +#if wxUSE_MEMORY_TRACING + +// All compilers get this one +#define _WX_WANT_NEW_SIZET_WXCHAR_INT + +// Everyone except Visage gets the next one +#ifndef __VISAGECPP__ + #define _WX_WANT_DELETE_VOID +#endif + +// Only visage gets this one under the correct circumstances +#if defined(__VISAGECPP__) && __DEBUG_ALLOC__ + #define _WX_WANT_DELETE_VOID_CONSTCHAR_SIZET +#endif + +// Only VC++ 6 gets overloaded delete that matches new +#if (defined(__VISUALC__) && (__VISUALC__ >= 1200)) + #define _WX_WANT_DELETE_VOID_WXCHAR_INT +#endif + +// Now see who (if anyone) gets the array memory operators +#if wxUSE_ARRAY_MEMORY_OPERATORS + + // Everyone except Visual C++ (cause problems for VC++ - crashes) + #if !defined(__VISUALC__) + #define _WX_WANT_ARRAY_NEW_SIZET_WXCHAR_INT + #endif + + // Everyone except Visual C++ (cause problems for VC++ - crashes) + #if !defined(__VISUALC__) + #define _WX_WANT_ARRAY_DELETE_VOID + #endif +#endif // wxUSE_ARRAY_MEMORY_OPERATORS + +#endif // wxUSE_MEMORY_TRACING + +// ---------------------------------------------------------------------------- +// Compatibility macro aliases DECLARE group +// ---------------------------------------------------------------------------- +// deprecated variants _not_ requiring a semicolon after them and without wx prefix. +// (note that also some wx-prefixed macro do _not_ require a semicolon because +// it's not always possible to force the compire to require it) + +#define DECLARE_CLASS_INFO_ITERATORS() wxDECLARE_CLASS_INFO_ITERATORS(); +#define DECLARE_ABSTRACT_CLASS(n) wxDECLARE_ABSTRACT_CLASS(n); +#define DECLARE_DYNAMIC_CLASS_NO_ASSIGN(n) wxDECLARE_DYNAMIC_CLASS_NO_ASSIGN(n); +#define DECLARE_DYNAMIC_CLASS_NO_COPY(n) wxDECLARE_DYNAMIC_CLASS_NO_COPY(n); +#define DECLARE_DYNAMIC_CLASS(n) wxDECLARE_DYNAMIC_CLASS(n); +#define DECLARE_CLASS(n) wxDECLARE_CLASS(n); + +#define DECLARE_PLUGGABLE_CLASS(n) wxDECLARE_PLUGGABLE_CLASS(n); +#define DECLARE_ABSTRACT_PLUGGABLE_CLASS(n) wxDECLARE_ABSTRACT_PLUGGABLE_CLASS(n); +#define DECLARE_USER_EXPORTED_PLUGGABLE_CLASS(n,u) wxDECLARE_USER_EXPORTED_PLUGGABLE_CLASS(n,u); +#define DECLARE_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(n,u) wxDECLARE_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(n,u); + +// ---------------------------------------------------------------------------- +// wxRefCounter: ref counted data "manager" +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxRefCounter +{ +public: + wxRefCounter() { m_count = 1; } + + int GetRefCount() const { return m_count; } + + void IncRef() { m_count++; } + void DecRef(); + +protected: + // this object should never be destroyed directly but only as a + // result of a DecRef() call: + virtual ~wxRefCounter() { } + +private: + // our refcount: + int m_count; + + // It doesn't make sense to copy the reference counted objects, a new ref + // counter should be created for a new object instead and compilation + // errors in the code using wxRefCounter due to the lack of copy ctor often + // indicate a problem, e.g. a forgotten copy ctor implementation somewhere. + wxDECLARE_NO_COPY_CLASS(wxRefCounter); +}; + +// ---------------------------------------------------------------------------- +// wxObjectRefData: ref counted data meant to be stored in wxObject +// ---------------------------------------------------------------------------- + +typedef wxRefCounter wxObjectRefData; + +// ---------------------------------------------------------------------------- +// wxObjectDataPtr: helper class to avoid memleaks because of missing calls +// to wxObjectRefData::DecRef +// ---------------------------------------------------------------------------- + +template <class T> +class wxObjectDataPtr +{ +public: + typedef T element_type; + + wxEXPLICIT wxObjectDataPtr(T *ptr = NULL) : m_ptr(ptr) {} + + // copy ctor + wxObjectDataPtr(const wxObjectDataPtr<T> &tocopy) + : m_ptr(tocopy.m_ptr) + { + if (m_ptr) + m_ptr->IncRef(); + } + + ~wxObjectDataPtr() + { + if (m_ptr) + m_ptr->DecRef(); + } + + T *get() const { return m_ptr; } + + // test for pointer validity: defining conversion to unspecified_bool_type + // and not more obvious bool to avoid implicit conversions to integer types + typedef T *(wxObjectDataPtr<T>::*unspecified_bool_type)() const; + operator unspecified_bool_type() const + { + return m_ptr ? &wxObjectDataPtr<T>::get : NULL; + } + + T& operator*() const + { + wxASSERT(m_ptr != NULL); + return *(m_ptr); + } + + T *operator->() const + { + wxASSERT(m_ptr != NULL); + return get(); + } + + void reset(T *ptr) + { + if (m_ptr) + m_ptr->DecRef(); + m_ptr = ptr; + } + + wxObjectDataPtr& operator=(const wxObjectDataPtr &tocopy) + { + if (m_ptr) + m_ptr->DecRef(); + m_ptr = tocopy.m_ptr; + if (m_ptr) + m_ptr->IncRef(); + return *this; + } + + wxObjectDataPtr& operator=(T *ptr) + { + if (m_ptr) + m_ptr->DecRef(); + m_ptr = ptr; + return *this; + } + +private: + T *m_ptr; +}; + +// ---------------------------------------------------------------------------- +// wxObject: the root class of wxWidgets object hierarchy +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxObject +{ + wxDECLARE_ABSTRACT_CLASS(wxObject); + +public: + wxObject() { m_refData = NULL; } + virtual ~wxObject() { UnRef(); } + + wxObject(const wxObject& other) + { + m_refData = other.m_refData; + if (m_refData) + m_refData->IncRef(); + } + + wxObject& operator=(const wxObject& other) + { + if ( this != &other ) + { + Ref(other); + } + return *this; + } + + bool IsKindOf(const wxClassInfo *info) const; + + + // Turn on the correct set of new and delete operators + +#ifdef _WX_WANT_NEW_SIZET_WXCHAR_INT + void *operator new ( size_t size, const wxChar *fileName = NULL, int lineNum = 0 ); +#endif + +#ifdef _WX_WANT_DELETE_VOID + void operator delete ( void * buf ); +#endif + +#ifdef _WX_WANT_DELETE_VOID_CONSTCHAR_SIZET + void operator delete ( void *buf, const char *_fname, size_t _line ); +#endif + +#ifdef _WX_WANT_DELETE_VOID_WXCHAR_INT + void operator delete ( void *buf, const wxChar*, int ); +#endif + +#ifdef _WX_WANT_ARRAY_NEW_SIZET_WXCHAR_INT + void *operator new[] ( size_t size, const wxChar *fileName = NULL, int lineNum = 0 ); +#endif + +#ifdef _WX_WANT_ARRAY_DELETE_VOID + void operator delete[] ( void *buf ); +#endif + +#ifdef _WX_WANT_ARRAY_DELETE_VOID_WXCHAR_INT + void operator delete[] (void* buf, const wxChar*, int ); +#endif + + // ref counted data handling methods + + // get/set + wxObjectRefData *GetRefData() const { return m_refData; } + void SetRefData(wxObjectRefData *data) { m_refData = data; } + + // make a 'clone' of the object + void Ref(const wxObject& clone); + + // destroy a reference + void UnRef(); + + // Make sure this object has only one reference + void UnShare() { AllocExclusive(); } + + // check if this object references the same data as the other one + bool IsSameAs(const wxObject& o) const { return m_refData == o.m_refData; } + +protected: + // ensure that our data is not shared with anybody else: if we have no + // data, it is created using CreateRefData() below, if we have shared data + // it is copied using CloneRefData(), otherwise nothing is done + void AllocExclusive(); + + // both methods must be implemented if AllocExclusive() is used, not pure + // virtual only because of the backwards compatibility reasons + + // create a new m_refData + virtual wxObjectRefData *CreateRefData() const; + + // create a new m_refData initialized with the given one + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + + wxObjectRefData *m_refData; +}; + +inline wxObject *wxCheckDynamicCast(wxObject *obj, wxClassInfo *classInfo) +{ + return obj && obj->GetClassInfo()->IsKindOf(classInfo) ? obj : NULL; +} + +#include "wx/xti2.h" + +// ---------------------------------------------------------------------------- +// more debugging macros +// ---------------------------------------------------------------------------- + +#if wxUSE_DEBUG_NEW_ALWAYS + #define WXDEBUG_NEW new(__TFILE__,__LINE__) + + #if wxUSE_GLOBAL_MEMORY_OPERATORS + #define new WXDEBUG_NEW + #elif defined(__VISUALC__) + // Including this file redefines new and allows leak reports to + // contain line numbers + #include "wx/msw/msvcrt.h" + #endif +#endif // wxUSE_DEBUG_NEW_ALWAYS + +// ---------------------------------------------------------------------------- +// Compatibility macro aliases IMPLEMENT group +// ---------------------------------------------------------------------------- + +// deprecated variants _not_ requiring a semicolon after them and without wx prefix. +// (note that also some wx-prefixed macro do _not_ require a semicolon because +// it's not always possible to force the compire to require it) + +#define IMPLEMENT_DYNAMIC_CLASS(n,b) wxIMPLEMENT_DYNAMIC_CLASS(n,b) +#define IMPLEMENT_DYNAMIC_CLASS2(n,b1,b2) wxIMPLEMENT_DYNAMIC_CLASS2(n,b1,b2) +#define IMPLEMENT_ABSTRACT_CLASS(n,b) wxIMPLEMENT_ABSTRACT_CLASS(n,b) +#define IMPLEMENT_ABSTRACT_CLASS2(n,b1,b2) wxIMPLEMENT_ABSTRACT_CLASS2(n,b1,b2) +#define IMPLEMENT_CLASS(n,b) wxIMPLEMENT_CLASS(n,b) +#define IMPLEMENT_CLASS2(n,b1,b2) wxIMPLEMENT_CLASS2(n,b1,b2) + +#define IMPLEMENT_PLUGGABLE_CLASS(n,b) wxIMPLEMENT_PLUGGABLE_CLASS(n,b) +#define IMPLEMENT_PLUGGABLE_CLASS2(n,b,b2) wxIMPLEMENT_PLUGGABLE_CLASS2(n,b,b2) +#define IMPLEMENT_ABSTRACT_PLUGGABLE_CLASS(n,b) wxIMPLEMENT_ABSTRACT_PLUGGABLE_CLASS(n,b) +#define IMPLEMENT_ABSTRACT_PLUGGABLE_CLASS2(n,b,b2) wxIMPLEMENT_ABSTRACT_PLUGGABLE_CLASS2(n,b,b2) +#define IMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS(n,b) wxIMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS(n,b) +#define IMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS2(n,b,b2) wxIMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS2(n,b,b2) +#define IMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(n,b) wxIMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(n,b) +#define IMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS2(n,b,b2) wxIMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS2(n,b,b2) + +#define CLASSINFO(n) wxCLASSINFO(n) + +#endif // _WX_OBJECTH__ diff --git a/wxmsw/include/wx-3.0/wx/odcombo.h b/wxmsw/include/wx-3.0/wx/odcombo.h new file mode 100644 index 00000000..af0f1160 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/odcombo.h @@ -0,0 +1,399 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/odcombo.h +// Purpose: wxOwnerDrawnComboBox and wxVListBoxPopup +// Author: Jaakko Salli +// Modified by: +// Created: Apr-30-2006 +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ODCOMBO_H_ +#define _WX_ODCOMBO_H_ + +#include "wx/defs.h" + +#if wxUSE_ODCOMBOBOX + +#include "wx/combo.h" +#include "wx/ctrlsub.h" +#include "wx/vlbox.h" +#include "wx/timer.h" + + +// +// New window styles for wxOwnerDrawnComboBox +// +enum +{ + // Double-clicking cycles item if wxCB_READONLY is also used. + wxODCB_DCLICK_CYCLES = wxCC_SPECIAL_DCLICK, + + // If used, control itself is not custom paint using callback. + // Even if this is not used, writable combo is never custom paint + // until SetCustomPaintWidth is called + wxODCB_STD_CONTROL_PAINT = 0x1000 +}; + + +// +// Callback flags (see wxOwnerDrawnComboBox::OnDrawItem) +// +enum wxOwnerDrawnComboBoxPaintingFlags +{ + // when set, we are painting the selected item in control, + // not in the popup + wxODCB_PAINTING_CONTROL = 0x0001, + + + // when set, we are painting an item which should have + // focus rectangle painted in the background. Text colour + // and clipping region are then appropriately set in + // the default OnDrawBackground implementation. + wxODCB_PAINTING_SELECTED = 0x0002 +}; + + +// ---------------------------------------------------------------------------- +// wxVListBoxComboPopup is a wxVListBox customized to act as a popup control. +// +// Notes: +// wxOwnerDrawnComboBox uses this as its popup. However, it always derives +// from native wxComboCtrl. If you need to use this popup with +// wxGenericComboControl, then remember that vast majority of item manipulation +// functionality is implemented in the wxVListBoxComboPopup class itself. +// +// ---------------------------------------------------------------------------- + + +class WXDLLIMPEXP_ADV wxVListBoxComboPopup : public wxVListBox, + public wxComboPopup +{ + friend class wxOwnerDrawnComboBox; +public: + + // init and dtor + wxVListBoxComboPopup() : wxVListBox(), wxComboPopup() { } + virtual ~wxVListBoxComboPopup(); + + // required virtuals + virtual void Init(); + virtual bool Create(wxWindow* parent); + virtual void SetFocus(); + virtual wxWindow *GetControl() { return this; } + virtual void SetStringValue( const wxString& value ); + virtual wxString GetStringValue() const; + + // more customization + virtual void OnPopup(); + virtual wxSize GetAdjustedSize( int minWidth, int prefHeight, int maxHeight ); + virtual void PaintComboControl( wxDC& dc, const wxRect& rect ); + virtual void OnComboKeyEvent( wxKeyEvent& event ); + virtual void OnComboCharEvent( wxKeyEvent& event ); + virtual void OnComboDoubleClick(); + virtual bool LazyCreate(); + virtual bool FindItem(const wxString& item, wxString* trueItem); + + // Item management + void SetSelection( int item ); + void Insert( const wxString& item, int pos ); + int Append(const wxString& item); + void Clear(); + void Delete( unsigned int item ); + void SetItemClientData(unsigned int n, void* clientData, wxClientDataType clientDataItemsType); + void *GetItemClientData(unsigned int n) const; + void SetString( int item, const wxString& str ); + wxString GetString( int item ) const; + unsigned int GetCount() const; + int FindString(const wxString& s, bool bCase = false) const; + int GetSelection() const; + + //void Populate( int n, const wxString choices[] ); + void Populate( const wxArrayString& choices ); + void ClearClientDatas(); + + // helpers + int GetItemAtPosition( const wxPoint& pos ) { return HitTest(pos); } + wxCoord GetTotalHeight() const { return EstimateTotalHeight(); } + wxCoord GetLineHeight(int line) const { return OnGetRowHeight(line); } + +protected: + + // Called by OnComboDoubleClick and OnCombo{Key,Char}Event + bool HandleKey( int keycode, bool saturate, wxChar keychar = 0 ); + + // sends combobox select event from the parent combo control + void SendComboBoxEvent( int selection ); + + // gets value, sends event and dismisses + void DismissWithEvent(); + + // OnMeasureItemWidth will be called on next GetAdjustedSize. + void ItemWidthChanged(unsigned int item) + { + m_widths[item] = -1; + m_widthsDirty = true; + } + + // Callbacks for drawing and measuring items. Override in a derived class for + // owner-drawnness. Font, background and text colour have been prepared according + // to selection, focus and such. + // + // item: item index to be drawn, may be wxNOT_FOUND when painting combo control itself + // and there is no valid selection + // flags: wxODCB_PAINTING_CONTROL is set if painting to combo control instead of list + // + // NOTE: If wxVListBoxComboPopup is used with a wxComboCtrl class not derived from + // wxOwnerDrawnComboBox, this method must be overridden. + virtual void OnDrawItem( wxDC& dc, const wxRect& rect, int item, int flags) const; + + // This is same as in wxVListBox + virtual wxCoord OnMeasureItem( size_t item ) const; + + // Return item width, or -1 for calculating from text extent (default) + virtual wxCoord OnMeasureItemWidth( size_t item ) const; + + // Draw item and combo control background. Flags are same as with OnDrawItem. + // NB: Can't use name OnDrawBackground because of virtual function hiding warnings. + virtual void OnDrawBg(wxDC& dc, const wxRect& rect, int item, int flags) const; + + // Additional wxVListBox implementation (no need to override in derived classes) + virtual void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const; + void OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const; + + // filter mouse move events happening outside the list box + // move selection with cursor + void OnMouseMove(wxMouseEvent& event); + void OnKey(wxKeyEvent& event); + void OnChar(wxKeyEvent& event); + void OnLeftClick(wxMouseEvent& event); + + // Return the widest item width (recalculating it if necessary) + int GetWidestItemWidth() { CalcWidths(); return m_widestWidth; } + + // Return the index of the widest item (recalculating it if necessary) + int GetWidestItem() { CalcWidths(); return m_widestItem; } + + // Stop partial completion (when some other event occurs) + void StopPartialCompletion(); + + wxArrayString m_strings; + wxArrayPtrVoid m_clientDatas; + + wxFont m_useFont; + + //wxString m_stringValue; // displayed text (may be different than m_strings[m_value]) + int m_value; // selection + int m_itemHover; // on which item the cursor is + int m_itemHeight; // default item height (calculate from font size + // and used in the absence of callback) + wxClientDataType m_clientDataItemsType; + +private: + + // Cached item widths (in pixels). + wxArrayInt m_widths; + + // Width of currently widest item. + int m_widestWidth; + + // Index of currently widest item. + int m_widestItem; + + // Measure some items in next GetAdjustedSize? + bool m_widthsDirty; + + // Find widest item in next GetAdjustedSize? + bool m_findWidest; + + // has the mouse been released on this control? + bool m_clicked; + + // Recalculate widths if they are dirty + void CalcWidths(); + + // Partial completion string + wxString m_partialCompletionString; + + wxString m_stringValue; + +#if wxUSE_TIMER + // Partial completion timer + wxTimer m_partialCompletionTimer; +#endif // wxUSE_TIMER + + DECLARE_EVENT_TABLE() +}; + + +// ---------------------------------------------------------------------------- +// wxOwnerDrawnComboBox: a generic wxComboBox that allows custom paint items +// in addition to many other types of customization already allowed by +// the wxComboCtrl. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxOwnerDrawnComboBox : + public wxWindowWithItems<wxComboCtrl, wxItemContainer> +{ + //friend class wxComboPopupWindow; + friend class wxVListBoxComboPopup; +public: + + // ctors and such + wxOwnerDrawnComboBox() { Init(); } + + wxOwnerDrawnComboBox(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + int n, + const wxString choices[], + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr) + { + Init(); + + (void)Create(parent, id, value, pos, size, n, + choices, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + wxOwnerDrawnComboBox(wxWindow *parent, + wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxArrayString& choices = wxArrayString(), + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + int n, + const wxString choices[], + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + virtual ~wxOwnerDrawnComboBox(); + + // Prevent app from using wxComboPopup + void SetPopupControl(wxVListBoxComboPopup* popup) + { + DoSetPopupControl(popup); + } + + // wxControlWithItems methods + virtual unsigned int GetCount() const; + virtual wxString GetString(unsigned int n) const; + virtual void SetString(unsigned int n, const wxString& s); + virtual int FindString(const wxString& s, bool bCase = false) const; + virtual void Select(int n); + virtual int GetSelection() const; + + // Override these just to maintain consistency with virtual methods + // between classes. + virtual void Clear(); + virtual void GetSelection(long *from, long *to) const; + + virtual void SetSelection(int n) { Select(n); } + + + // Prevent a method from being hidden + virtual void SetSelection(long from, long to) + { + wxComboCtrl::SetSelection(from,to); + } + + // Return the widest item width (recalculating it if necessary) + virtual int GetWidestItemWidth() { EnsurePopupControl(); return GetVListBoxComboPopup()->GetWidestItemWidth(); } + + // Return the index of the widest item (recalculating it if necessary) + virtual int GetWidestItem() { EnsurePopupControl(); return GetVListBoxComboPopup()->GetWidestItem(); } + + virtual bool IsSorted() const { return HasFlag(wxCB_SORT); } + +protected: + virtual void DoClear(); + virtual void DoDeleteOneItem(unsigned int n); + + // Callback for drawing. Font, background and text colour have been + // prepared according to selection, focus and such. + // item: item index to be drawn, may be wxNOT_FOUND when painting combo control itself + // and there is no valid selection + // flags: wxODCB_PAINTING_CONTROL is set if painting to combo control instead of list + virtual void OnDrawItem( wxDC& dc, const wxRect& rect, int item, int flags ) const; + + // Callback for item height, or -1 for default + virtual wxCoord OnMeasureItem( size_t item ) const; + + // Callback for item width, or -1 for default/undetermined + virtual wxCoord OnMeasureItemWidth( size_t item ) const; + + // override base implementation so we can return the size for the + // largest item + virtual wxSize DoGetBestSize() const; + + // Callback for background drawing. Flags are same as with + // OnDrawItem. + virtual void OnDrawBackground( wxDC& dc, const wxRect& rect, int item, int flags ) const; + + // NULL popup can be used to indicate default interface + virtual void DoSetPopupControl(wxComboPopup* popup); + + // clears all allocated client datas + void ClearClientDatas(); + + wxVListBoxComboPopup* GetVListBoxComboPopup() const + { + return (wxVListBoxComboPopup*) m_popupInterface; + } + + virtual int DoInsertItems(const wxArrayStringsAdapter& items, + unsigned int pos, + void **clientData, wxClientDataType type); + virtual void DoSetItemClientData(unsigned int n, void* clientData); + virtual void* DoGetItemClientData(unsigned int n) const; + + // temporary storage for the initial choices + //const wxString* m_baseChoices; + //int m_baseChoicesCount; + wxArrayString m_initChs; + +private: + void Init(); + + DECLARE_EVENT_TABLE() + + DECLARE_DYNAMIC_CLASS(wxOwnerDrawnComboBox) +}; + + +#endif // wxUSE_ODCOMBOBOX + +#endif + // _WX_ODCOMBO_H_ diff --git a/wxmsw/include/wx-3.0/wx/overlay.h b/wxmsw/include/wx-3.0/wx/overlay.h new file mode 100644 index 00000000..adde26db --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/overlay.h @@ -0,0 +1,96 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/overlay.h +// Purpose: wxOverlay class +// Author: Stefan Csomor +// Modified by: +// Created: 2006-10-20 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_OVERLAY_H_ +#define _WX_OVERLAY_H_ + +#include "wx/defs.h" + +#if defined(__WXMAC__) && wxOSX_USE_CARBON + #define wxHAS_NATIVE_OVERLAY 1 +#elif defined(__WXDFB__) + #define wxHAS_NATIVE_OVERLAY 1 +#else + // don't define wxHAS_NATIVE_OVERLAY +#endif + +// ---------------------------------------------------------------------------- +// creates an overlay over an existing window, allowing for manipulations like +// rubberbanding etc. This API is not stable yet, not to be used outside wx +// internal code +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxOverlayImpl; +class WXDLLIMPEXP_FWD_CORE wxDC; + +class WXDLLIMPEXP_CORE wxOverlay +{ +public: + wxOverlay(); + ~wxOverlay(); + + // clears the overlay without restoring the former state + // to be done eg when the window content has been changed and repainted + void Reset(); + + // returns (port-specific) implementation of the overlay + wxOverlayImpl *GetImpl() { return m_impl; } + +private: + friend class WXDLLIMPEXP_FWD_CORE wxDCOverlay; + + // returns true if it has been setup + bool IsOk(); + + void Init(wxDC* dc, int x , int y , int width , int height); + + void BeginDrawing(wxDC* dc); + + void EndDrawing(wxDC* dc); + + void Clear(wxDC* dc); + + wxOverlayImpl* m_impl; + + bool m_inDrawing; + + + wxDECLARE_NO_COPY_CLASS(wxOverlay); +}; + + +class WXDLLIMPEXP_CORE wxDCOverlay +{ +public: + // connects this overlay to the corresponding drawing dc, if the overlay is + // not initialized yet this call will do so + wxDCOverlay(wxOverlay &overlay, wxDC *dc, int x , int y , int width , int height); + + // convenience wrapper that behaves the same using the entire area of the dc + wxDCOverlay(wxOverlay &overlay, wxDC *dc); + + // removes the connection between the overlay and the dc + virtual ~wxDCOverlay(); + + // clears the layer, restoring the state at the last init + void Clear(); + +private: + void Init(wxDC *dc, int x , int y , int width , int height); + + wxOverlay& m_overlay; + + wxDC* m_dc; + + + wxDECLARE_NO_COPY_CLASS(wxDCOverlay); +}; + +#endif // _WX_OVERLAY_H_ diff --git a/wxmsw/include/wx-3.0/wx/ownerdrw.h b/wxmsw/include/wx-3.0/wx/ownerdrw.h new file mode 100644 index 00000000..b25f5cc7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ownerdrw.h @@ -0,0 +1,144 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ownerdrw.h +// Purpose: interface for owner-drawn GUI elements +// Author: Vadim Zeitlin +// Modified by: Marcin Malich +// Created: 11.11.97 +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_OWNERDRW_H_BASE +#define _WX_OWNERDRW_H_BASE + +#include "wx/defs.h" + +#if wxUSE_OWNER_DRAWN + +#include "wx/font.h" +#include "wx/colour.h" + +class WXDLLIMPEXP_FWD_CORE wxDC; + +// ---------------------------------------------------------------------------- +// wxOwnerDrawn - a mix-in base class, derive from it to implement owner-drawn +// behaviour +// +// wxOwnerDrawn supports drawing of an item with non standard font, color and +// also supports 3 bitmaps: either a checked/unchecked bitmap for a checkable +// element or one unchangeable bitmap otherwise. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxOwnerDrawnBase +{ +public: + wxOwnerDrawnBase() + { + m_ownerDrawn = false; + m_margin = ms_defaultMargin; + } + + virtual ~wxOwnerDrawnBase() {} + + void SetFont(const wxFont& font) + { m_font = font; m_ownerDrawn = true; } + + wxFont& GetFont() const + { return (wxFont&) m_font; } + + + void SetTextColour(const wxColour& colText) + { m_colText = colText; m_ownerDrawn = true; } + + wxColour& GetTextColour() const + { return (wxColour&) m_colText; } + + void SetBackgroundColour(const wxColour& colBack) + { m_colBack = colBack; m_ownerDrawn = true; } + + wxColour& GetBackgroundColour() const + { return (wxColour&) m_colBack ; } + + + void SetMarginWidth(int width) + { m_margin = width; } + + int GetMarginWidth() const + { return m_margin; } + + static int GetDefaultMarginWidth() + { return ms_defaultMargin; } + + + // get item name (with mnemonics if exist) + virtual wxString GetName() const = 0; + + + // this function might seem strange, but if it returns false it means that + // no non-standard attribute are set, so there is no need for this control + // to be owner-drawn. Moreover, you can force owner-drawn to false if you + // want to change, say, the color for the item but only if it is owner-drawn + // (see wxMenuItem::wxMenuItem for example) + bool IsOwnerDrawn() const + { return m_ownerDrawn; } + + // switch on/off owner-drawing the item + void SetOwnerDrawn(bool ownerDrawn = true) + { m_ownerDrawn = ownerDrawn; } + + + // constants used in OnDrawItem + // (they have the same values as corresponding Win32 constants) + enum wxODAction + { + wxODDrawAll = 0x0001, // redraw entire control + wxODSelectChanged = 0x0002, // selection changed (see Status.Select) + wxODFocusChanged = 0x0004 // keyboard focus changed (see Status.Focus) + }; + + enum wxODStatus + { + wxODSelected = 0x0001, // control is currently selected + wxODGrayed = 0x0002, // item is to be grayed + wxODDisabled = 0x0004, // item is to be drawn as disabled + wxODChecked = 0x0008, // item is to be checked + wxODHasFocus = 0x0010, // item has the keyboard focus + wxODDefault = 0x0020, // item is the default item + wxODHidePrefix= 0x0100 // hide keyboard cues (w2k and xp only) + }; + + // virtual functions to implement drawing (return true if processed) + virtual bool OnMeasureItem(size_t *width, size_t *height); + virtual bool OnDrawItem(wxDC& dc, const wxRect& rc, wxODAction act, wxODStatus stat) = 0; + +protected: + + // get the font and colour to use, whether it is set or not + virtual void GetFontToUse(wxFont& font) const; + virtual void GetColourToUse(wxODStatus stat, wxColour& colText, wxColour& colBack) const; + +private: + bool m_ownerDrawn; // true if something is non standard + + wxFont m_font; // font to use for drawing + wxColour m_colText, // color ----"---"---"---- + m_colBack; // background color + + int m_margin; // space occupied by bitmap to the left of the item + + static int ms_defaultMargin; +}; + +// ---------------------------------------------------------------------------- +// include the platform-specific class declaration +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/ownerdrw.h" +#elif defined(__WXPM__) + #include "wx/os2/ownerdrw.h" +#endif + +#endif // wxUSE_OWNER_DRAWN + +#endif // _WX_OWNERDRW_H_BASE diff --git a/wxmsw/include/wx-3.0/wx/palette.h b/wxmsw/include/wx-3.0/wx/palette.h new file mode 100644 index 00000000..85bf7dd6 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/palette.h @@ -0,0 +1,44 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/palette.h +// Purpose: Common header and base class for wxPalette +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PALETTE_H_BASE_ +#define _WX_PALETTE_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_PALETTE + +#include "wx/object.h" +#include "wx/gdiobj.h" + +// wxPaletteBase +class WXDLLIMPEXP_CORE wxPaletteBase: public wxGDIObject +{ +public: + virtual ~wxPaletteBase() { } + + virtual int GetColoursCount() const { wxFAIL_MSG( wxT("not implemented") ); return 0; } +}; + +#if defined(__WXMSW__) + #include "wx/msw/palette.h" +#elif defined(__WXX11__) || defined(__WXMOTIF__) + #include "wx/x11/palette.h" +#elif defined(__WXGTK__) || defined(__WXCOCOA__) + #include "wx/generic/paletteg.h" +#elif defined(__WXMAC__) + #include "wx/osx/palette.h" +#elif defined(__WXPM__) + #include "wx/os2/palette.h" +#endif + +#endif // wxUSE_PALETTE + +#endif // _WX_PALETTE_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/panel.h b/wxmsw/include/wx-3.0/wx/panel.h new file mode 100644 index 00000000..11fc2c64 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/panel.h @@ -0,0 +1,72 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/panel.h +// Purpose: Base header for wxPanel +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PANEL_H_BASE_ +#define _WX_PANEL_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers and forward declarations +// ---------------------------------------------------------------------------- + +#include "wx/window.h" +#include "wx/containr.h" + +class WXDLLIMPEXP_FWD_CORE wxControlContainer; + +extern WXDLLIMPEXP_DATA_CORE(const char) wxPanelNameStr[]; + +// ---------------------------------------------------------------------------- +// wxPanel contains other controls and implements TAB traversal between them +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPanelBase : public wxNavigationEnabled<wxWindow> +{ +public: + wxPanelBase() { } + + // Derived classes should also provide this constructor: + /* + wxPanelBase(wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL | wxNO_BORDER, + const wxString& name = wxPanelNameStr); + */ + + // Pseudo ctor + bool Create(wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL | wxNO_BORDER, + const wxString& name = wxPanelNameStr); + + + // implementation from now on + // -------------------------- + + virtual void InitDialog(); + +private: + wxDECLARE_NO_COPY_CLASS(wxPanelBase); +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/panel.h" +#elif defined(__WXMSW__) + #include "wx/msw/panel.h" +#else + #define wxHAS_GENERIC_PANEL + #include "wx/generic/panelg.h" +#endif + +#endif // _WX_PANELH_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/paper.h b/wxmsw/include/wx-3.0/wx/paper.h new file mode 100644 index 00000000..d50d5498 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/paper.h @@ -0,0 +1,121 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/paper.h +// Purpose: Paper database types and classes +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PAPERH__ +#define _WX_PAPERH__ + +#include "wx/defs.h" +#include "wx/event.h" +#include "wx/cmndata.h" +#include "wx/intl.h" +#include "wx/hashmap.h" + +/* + * Paper type: see defs.h for wxPaperSize enum. + * A wxPrintPaperType can have an id and a name, or just a name and wxPAPER_NONE, + * so you can add further paper types without needing new ids. + */ + +#ifdef __WXMSW__ +#define WXADDPAPER(paperId, platformId, name, w, h) AddPaperType(paperId, platformId, name, w, h) +#else +#define WXADDPAPER(paperId, platformId, name, w, h) AddPaperType(paperId, 0, name, w, h) +#endif + +class WXDLLIMPEXP_CORE wxPrintPaperType: public wxObject +{ +public: + wxPrintPaperType(); + + // platformId is a platform-specific id, such as in Windows, DMPAPER_... + wxPrintPaperType(wxPaperSize paperId, int platformId, const wxString& name, int w, int h); + + inline wxString GetName() const { return wxGetTranslation(m_paperName); } + inline wxPaperSize GetId() const { return m_paperId; } + inline int GetPlatformId() const { return m_platformId; } + + // Get width and height in tenths of a millimetre + inline int GetWidth() const { return m_width; } + inline int GetHeight() const { return m_height; } + + // Get size in tenths of a millimetre + inline wxSize GetSize() const { return wxSize(m_width, m_height); } + + // Get size in a millimetres + inline wxSize GetSizeMM() const { return wxSize(m_width/10, m_height/10); } + + // Get width and height in device units (1/72th of an inch) + wxSize GetSizeDeviceUnits() const ; + +public: + wxPaperSize m_paperId; + int m_platformId; + int m_width; // In tenths of a millimetre + int m_height; // In tenths of a millimetre + wxString m_paperName; + +private: + DECLARE_DYNAMIC_CLASS(wxPrintPaperType) +}; + +WX_DECLARE_STRING_HASH_MAP(wxPrintPaperType*, wxStringToPrintPaperTypeHashMap); + +class WXDLLIMPEXP_FWD_CORE wxPrintPaperTypeList; + +class WXDLLIMPEXP_CORE wxPrintPaperDatabase +{ +public: + wxPrintPaperDatabase(); + ~wxPrintPaperDatabase(); + + void CreateDatabase(); + void ClearDatabase(); + + void AddPaperType(wxPaperSize paperId, const wxString& name, int w, int h); + void AddPaperType(wxPaperSize paperId, int platformId, const wxString& name, int w, int h); + + // Find by name + wxPrintPaperType *FindPaperType(const wxString& name); + + // Find by size id + wxPrintPaperType *FindPaperType(wxPaperSize id); + + // Find by platform id + wxPrintPaperType *FindPaperTypeByPlatformId(int id); + + // Find by size + wxPrintPaperType *FindPaperType(const wxSize& size); + + // Convert name to size id + wxPaperSize ConvertNameToId(const wxString& name); + + // Convert size id to name + wxString ConvertIdToName(wxPaperSize paperId); + + // Get the paper size + wxSize GetSize(wxPaperSize paperId); + + // Get the paper size + wxPaperSize GetSize(const wxSize& size); + + // + wxPrintPaperType* Item(size_t index) const; + size_t GetCount() const; +private: + wxStringToPrintPaperTypeHashMap* m_map; + wxPrintPaperTypeList* m_list; + // DECLARE_DYNAMIC_CLASS(wxPrintPaperDatabase) +}; + +extern WXDLLIMPEXP_DATA_CORE(wxPrintPaperDatabase*) wxThePrintPaperDatabase; + + +#endif + // _WX_PAPERH__ diff --git a/wxmsw/include/wx-3.0/wx/pen.h b/wxmsw/include/wx-3.0/wx/pen.h new file mode 100644 index 00000000..e55b046e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/pen.h @@ -0,0 +1,164 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/pen.h +// Purpose: Base header for wxPen +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PEN_H_BASE_ +#define _WX_PEN_H_BASE_ + +#include "wx/gdiobj.h" +#include "wx/gdicmn.h" + +enum wxPenStyle +{ + wxPENSTYLE_INVALID = -1, + + wxPENSTYLE_SOLID = wxSOLID, + wxPENSTYLE_DOT = wxDOT, + wxPENSTYLE_LONG_DASH = wxLONG_DASH, + wxPENSTYLE_SHORT_DASH = wxSHORT_DASH, + wxPENSTYLE_DOT_DASH = wxDOT_DASH, + wxPENSTYLE_USER_DASH = wxUSER_DASH, + + wxPENSTYLE_TRANSPARENT = wxTRANSPARENT, + + wxPENSTYLE_STIPPLE_MASK_OPAQUE = wxSTIPPLE_MASK_OPAQUE, + wxPENSTYLE_STIPPLE_MASK = wxSTIPPLE_MASK, + wxPENSTYLE_STIPPLE = wxSTIPPLE, + + wxPENSTYLE_BDIAGONAL_HATCH = wxHATCHSTYLE_BDIAGONAL, + wxPENSTYLE_CROSSDIAG_HATCH = wxHATCHSTYLE_CROSSDIAG, + wxPENSTYLE_FDIAGONAL_HATCH = wxHATCHSTYLE_FDIAGONAL, + wxPENSTYLE_CROSS_HATCH = wxHATCHSTYLE_CROSS, + wxPENSTYLE_HORIZONTAL_HATCH = wxHATCHSTYLE_HORIZONTAL, + wxPENSTYLE_VERTICAL_HATCH = wxHATCHSTYLE_VERTICAL, + wxPENSTYLE_FIRST_HATCH = wxHATCHSTYLE_FIRST, + wxPENSTYLE_LAST_HATCH = wxHATCHSTYLE_LAST +}; + +enum wxPenJoin +{ + wxJOIN_INVALID = -1, + + wxJOIN_BEVEL = 120, + wxJOIN_MITER, + wxJOIN_ROUND +}; + +enum wxPenCap +{ + wxCAP_INVALID = -1, + + wxCAP_ROUND = 130, + wxCAP_PROJECTING, + wxCAP_BUTT +}; + + +class WXDLLIMPEXP_CORE wxPenBase : public wxGDIObject +{ +public: + virtual ~wxPenBase() { } + + virtual void SetColour(const wxColour& col) = 0; + virtual void SetColour(unsigned char r, unsigned char g, unsigned char b) = 0; + + virtual void SetWidth(int width) = 0; + virtual void SetStyle(wxPenStyle style) = 0; + virtual void SetStipple(const wxBitmap& stipple) = 0; + virtual void SetDashes(int nb_dashes, const wxDash *dash) = 0; + virtual void SetJoin(wxPenJoin join) = 0; + virtual void SetCap(wxPenCap cap) = 0; + + virtual wxColour GetColour() const = 0; + virtual wxBitmap *GetStipple() const = 0; + virtual wxPenStyle GetStyle() const = 0; + virtual wxPenJoin GetJoin() const = 0; + virtual wxPenCap GetCap() const = 0; + virtual int GetWidth() const = 0; + virtual int GetDashes(wxDash **ptr) const = 0; + + // Convenient helpers for testing whether the pen is a transparent one: + // unlike GetStyle() == wxPENSTYLE_TRANSPARENT, they work correctly even if + // the pen is invalid (they both return false in this case). + bool IsTransparent() const + { + return IsOk() && GetStyle() == wxPENSTYLE_TRANSPARENT; + } + + bool IsNonTransparent() const + { + return IsOk() && GetStyle() != wxPENSTYLE_TRANSPARENT; + } +}; + +#if defined(__WXMSW__) + #include "wx/msw/pen.h" +#elif defined(__WXMOTIF__) || defined(__WXX11__) + #include "wx/x11/pen.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/pen.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/pen.h" +#elif defined(__WXDFB__) + #include "wx/dfb/pen.h" +#elif defined(__WXMAC__) + #include "wx/osx/pen.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/pen.h" +#elif defined(__WXPM__) + #include "wx/os2/pen.h" +#endif + +class WXDLLIMPEXP_CORE wxPenList: public wxGDIObjListBase +{ +public: + wxPen *FindOrCreatePen(const wxColour& colour, + int width = 1, + wxPenStyle style = wxPENSTYLE_SOLID); + +#if FUTURE_WXWIN_COMPATIBILITY_3_0 + wxPen *FindOrCreatePen(const wxColour& colour, int width, int style) + { return FindOrCreatePen(colour, width, (wxPenStyle)style); } +#endif +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( void AddPen(wxPen*) ); + wxDEPRECATED( void RemovePen(wxPen*) ); +#endif +}; + +extern WXDLLIMPEXP_DATA_CORE(wxPenList*) wxThePenList; + +// provide comparison operators to allow code such as +// +// if ( pen.GetStyle() == wxTRANSPARENT ) +// +// to compile without warnings which it would otherwise provoke from some +// compilers as it compares elements of different enums +#if FUTURE_WXWIN_COMPATIBILITY_3_0 + +// Unfortunately some compilers have ambiguity issues when enum comparisons are +// overloaded so we have to disable the overloads in this case, see +// wxCOMPILER_NO_OVERLOAD_ON_ENUM definition in wx/platform.h for more details. +#ifndef wxCOMPILER_NO_OVERLOAD_ON_ENUM + +inline bool operator==(wxPenStyle s, wxDeprecatedGUIConstants t) +{ + return static_cast<int>(s) == static_cast<int>(t); +} + +inline bool operator!=(wxPenStyle s, wxDeprecatedGUIConstants t) +{ + return !(s == t); +} + +#endif // wxCOMPILER_NO_OVERLOAD_ON_ENUM + +#endif // FUTURE_WXWIN_COMPATIBILITY_3_0 + +#endif // _WX_PEN_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/persist.h b/wxmsw/include/wx-3.0/wx/persist.h new file mode 100644 index 00000000..45ed61eb --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/persist.h @@ -0,0 +1,263 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/persist.h +// Purpose: common classes for persistence support +// Author: Vadim Zeitlin +// Created: 2009-01-18 +// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PERSIST_H_ +#define _WX_PERSIST_H_ + +#include "wx/string.h" +#include "wx/hashmap.h" +#include "wx/confbase.h" + +class wxPersistentObject; + +WX_DECLARE_VOIDPTR_HASH_MAP(wxPersistentObject *, wxPersistentObjectsMap); + +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +/* + We do _not_ declare this function as doing this would force us to specialize + it for the user classes deriving from the standard persistent classes. + However we do define overloads of wxCreatePersistentObject() for all the wx + classes which means that template wxPersistentObject::Restore() picks up the + right overload to use provided that the header defining the correct overload + is included before calling it. And a compilation error happens if this is + not done. + +template <class T> +wxPersistentObject *wxCreatePersistentObject(T *obj); + + */ + +// ---------------------------------------------------------------------------- +// wxPersistenceManager: global aspects of persistent windows +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPersistenceManager +{ +public: + // Call this method to specify a non-default persistence manager to use. + // This function should usually be called very early to affect creation of + // all persistent controls and the object passed to it must have a lifetime + // long enough to be still alive when the persistent controls are destroyed + // and need it to save their state so typically this would be a global or a + // wxApp member. + static void Set(wxPersistenceManager& manager); + + // accessor to the unique persistence manager object + static wxPersistenceManager& Get(); + + // trivial but virtual dtor + // + // FIXME-VC6: this only needs to be public because of VC6 bug + virtual ~wxPersistenceManager(); + + + // globally disable restoring or saving the persistent properties (both are + // enabled by default) + void DisableSaving() { m_doSave = false; } + void DisableRestoring() { m_doRestore = false; } + + + // register an object with the manager: when using the first overload, + // wxCreatePersistentObject() must be specialized for this object class; + // with the second one the persistent adapter is created by the caller + // + // the object shouldn't be already registered with us + template <class T> + wxPersistentObject *Register(T *obj) + { + return Register(obj, wxCreatePersistentObject(obj)); + } + + wxPersistentObject *Register(void *obj, wxPersistentObject *po); + + // check if the object is registered and return the associated + // wxPersistentObject if it is or NULL otherwise + wxPersistentObject *Find(void *obj) const; + + // unregister the object, this is called by wxPersistentObject itself so + // there is usually no need to do it explicitly + // + // deletes the associated wxPersistentObject + void Unregister(void *obj); + + + // save/restore the state of an object + // + // these methods do nothing if DisableSaving/Restoring() was called + // + // Restore() returns true if the object state was really restored + void Save(void *obj); + bool Restore(void *obj); + + // combines both Save() and Unregister() calls + void SaveAndUnregister(void *obj) + { + Save(obj); + Unregister(obj); + } + + // combines both Register() and Restore() calls + template <class T> + bool RegisterAndRestore(T *obj) + { + return Register(obj) && Restore(obj); + } + + bool RegisterAndRestore(void *obj, wxPersistentObject *po) + { + return Register(obj, po) && Restore(obj); + } + + + // methods used by the persistent objects to save and restore the data + // + // currently these methods simply use wxConfig::Get() but they may be + // overridden in the derived class (once we allow creating custom + // persistent managers) +#define wxPERSIST_DECLARE_SAVE_RESTORE_FOR(Type) \ + virtual bool SaveValue(const wxPersistentObject& who, \ + const wxString& name, \ + Type value); \ + \ + virtual bool \ + RestoreValue(const wxPersistentObject& who, \ + const wxString& name, \ + Type *value) + + wxPERSIST_DECLARE_SAVE_RESTORE_FOR(bool); + wxPERSIST_DECLARE_SAVE_RESTORE_FOR(int); + wxPERSIST_DECLARE_SAVE_RESTORE_FOR(long); + wxPERSIST_DECLARE_SAVE_RESTORE_FOR(wxString); + +#undef wxPERSIST_DECLARE_SAVE_RESTORE_FOR + +protected: + // ctor is private, use Get() + wxPersistenceManager() + { + m_doSave = + m_doRestore = true; + } + + + // Return the config object to use, by default just the global one but a + // different one could be used by the derived class if needed. + virtual wxConfigBase *GetConfig() const { return wxConfigBase::Get(); } + + // Return the path to use for saving the setting with the given name for + // the specified object (notice that the name is the name of the setting, + // not the name of the object itself which can be retrieved with GetName()). + virtual wxString GetKey(const wxPersistentObject& who, + const wxString& name) const; + + +private: + // map with the registered objects as keys and associated + // wxPersistentObjects as values + wxPersistentObjectsMap m_persistentObjects; + + // true if we should restore/save the settings (it doesn't make much sense + // to use this class when both of them are false but setting one of them to + // false may make sense in some situations) + bool m_doSave, + m_doRestore; + + wxDECLARE_NO_COPY_CLASS(wxPersistenceManager); +}; + +// ---------------------------------------------------------------------------- +// wxPersistentObject: ABC for anything persistent +// ---------------------------------------------------------------------------- + +class wxPersistentObject +{ +public: + // ctor associates us with the object whose options we save/restore + wxPersistentObject(void *obj) : m_obj(obj) { } + + // trivial but virtual dtor + virtual ~wxPersistentObject() { } + + + // methods used by wxPersistenceManager + // ------------------------------------ + + // save/restore the corresponding objects settings + // + // these methods shouldn't be used directly as they don't respect the + // global wxPersistenceManager::DisableSaving/Restoring() settings, use + // wxPersistenceManager methods with the same name instead + virtual void Save() const = 0; + virtual bool Restore() = 0; + + + // get the kind of the objects we correspond to, e.g. "Frame" + virtual wxString GetKind() const = 0; + + // get the name of the object we correspond to, e.g. "Main" + virtual wxString GetName() const = 0; + + + // return the associated object + void *GetObject() const { return m_obj; } + +protected: + // wrappers for wxPersistenceManager methods which don't require passing + // "this" as the first parameter all the time + template <typename T> + bool SaveValue(const wxString& name, T value) const + { + return wxPersistenceManager::Get().SaveValue(*this, name, value); + } + + template <typename T> + bool RestoreValue(const wxString& name, T *value) + { + return wxPersistenceManager::Get().RestoreValue(*this, name, value); + } + +private: + void * const m_obj; + + wxDECLARE_NO_COPY_CLASS(wxPersistentObject); +}; + +// FIXME-VC6: VC6 has troubles with template methods of DLL-exported classes, +// apparently it believes they should be defined in the DLL (which +// is, of course, impossible as the DLL doesn't know for which types +// will they be instantiated) instead of compiling them when +// building the main application itself. Because of this problem +// (which only arises in debug build!) we can't use the usual +// RegisterAndRestore(obj) with it and need to explicitly create the +// persistence adapter. To hide this ugliness we define a global +// function which does it for us. +template <typename T> +inline bool wxPersistentRegisterAndRestore(T *obj) +{ + wxPersistentObject * const pers = wxCreatePersistentObject(obj); + + return wxPersistenceManager::Get().RegisterAndRestore(obj, pers); + +} + +// A helper function which also sets the name for the (wxWindow-derived) object +// before registering and restoring it. +template <typename T> +inline bool wxPersistentRegisterAndRestore(T *obj, const wxString& name) +{ + obj->SetName(name); + + return wxPersistentRegisterAndRestore(obj); +} + +#endif // _WX_PERSIST_H_ + diff --git a/wxmsw/include/wx-3.0/wx/persist/bookctrl.h b/wxmsw/include/wx-3.0/wx/persist/bookctrl.h new file mode 100644 index 00000000..38eee262 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/persist/bookctrl.h @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/persist/bookctrl.h +// Purpose: persistence support for wxBookCtrl +// Author: Vadim Zeitlin +// Created: 2009-01-19 +// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PERSIST_BOOKCTRL_H_ +#define _WX_PERSIST_BOOKCTRL_H_ + +#include "wx/persist/window.h" + +#include "wx/bookctrl.h" + +// ---------------------------------------------------------------------------- +// string constants used by wxPersistentBookCtrl +// ---------------------------------------------------------------------------- + +#define wxPERSIST_BOOK_KIND "Book" + +#define wxPERSIST_BOOK_SELECTION "Selection" + +// ---------------------------------------------------------------------------- +// wxPersistentBookCtrl: supports saving/restoring book control selection +// ---------------------------------------------------------------------------- + +class wxPersistentBookCtrl : public wxPersistentWindow<wxBookCtrlBase> +{ +public: + wxPersistentBookCtrl(wxBookCtrlBase *book) + : wxPersistentWindow<wxBookCtrlBase>(book) + { + } + + virtual void Save() const + { + SaveValue(wxPERSIST_BOOK_SELECTION, Get()->GetSelection()); + } + + virtual bool Restore() + { + long sel; + if ( RestoreValue(wxPERSIST_BOOK_SELECTION, &sel) ) + { + wxBookCtrlBase * const book = Get(); + if ( sel >= 0 && (unsigned)sel < book->GetPageCount() ) + { + book->SetSelection(sel); + return true; + } + } + + return false; + } + + virtual wxString GetKind() const { return wxPERSIST_BOOK_KIND; } +}; + +inline wxPersistentObject *wxCreatePersistentObject(wxBookCtrlBase *book) +{ + return new wxPersistentBookCtrl(book); +} + +#endif // _WX_PERSIST_BOOKCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/persist/splitter.h b/wxmsw/include/wx-3.0/wx/persist/splitter.h new file mode 100644 index 00000000..d8369c37 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/persist/splitter.h @@ -0,0 +1,68 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/persist/splitter.h +// Purpose: Persistence support for wxSplitterWindow. +// Author: Vadim Zeitlin +// Created: 2011-08-31 +// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PERSIST_SPLITTER_H_ +#define _WX_PERSIST_SPLITTER_H_ + +#include "wx/persist/window.h" + +#include "wx/splitter.h" + +// ---------------------------------------------------------------------------- +// string constants used by wxPersistentSplitter +// ---------------------------------------------------------------------------- + +#define wxPERSIST_SPLITTER_KIND "Splitter" + +// Special position value of -1 means the splitter is not split at all. +#define wxPERSIST_SPLITTER_POSITION "Position" + +// ---------------------------------------------------------------------------- +// wxPersistentSplitter: supports saving/restoring splitter position +// ---------------------------------------------------------------------------- + +class wxPersistentSplitter : public wxPersistentWindow<wxSplitterWindow> +{ +public: + wxPersistentSplitter(wxSplitterWindow* splitter) + : wxPersistentWindow<wxSplitterWindow>(splitter) + { + } + + virtual void Save() const + { + wxSplitterWindow* const splitter = Get(); + + int pos = splitter->IsSplit() ? splitter->GetSashPosition() : -1; + SaveValue(wxPERSIST_SPLITTER_POSITION, pos); + } + + virtual bool Restore() + { + int pos; + if ( !RestoreValue(wxPERSIST_SPLITTER_POSITION, &pos) ) + return false; + + if ( pos == -1 ) + Get()->Unsplit(); + else + Get()->SetSashPosition(pos); + + return true; + } + + virtual wxString GetKind() const { return wxPERSIST_SPLITTER_KIND; } +}; + +inline wxPersistentObject *wxCreatePersistentObject(wxSplitterWindow* splitter) +{ + return new wxPersistentSplitter(splitter); +} + +#endif // _WX_PERSIST_SPLITTER_H_ diff --git a/wxmsw/include/wx-3.0/wx/persist/toplevel.h b/wxmsw/include/wx-3.0/wx/persist/toplevel.h new file mode 100644 index 00000000..7d79f234 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/persist/toplevel.h @@ -0,0 +1,128 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/persist/toplevel.h +// Purpose: persistence support for wxTLW +// Author: Vadim Zeitlin +// Created: 2009-01-19 +// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PERSIST_TOPLEVEL_H_ +#define _WX_PERSIST_TOPLEVEL_H_ + +#include "wx/persist/window.h" + +#include "wx/toplevel.h" +#include "wx/display.h" + +// ---------------------------------------------------------------------------- +// string constants used by wxPersistentTLW +// ---------------------------------------------------------------------------- + +// we use just "Window" to keep configuration files and such short, there +// should be no confusion with wxWindow itself as we don't have persistent +// windows, just persistent controls which have their own specific kind strings +#define wxPERSIST_TLW_KIND "Window" + +// names for various persistent options +#define wxPERSIST_TLW_X "x" +#define wxPERSIST_TLW_Y "y" +#define wxPERSIST_TLW_W "w" +#define wxPERSIST_TLW_H "h" + +#define wxPERSIST_TLW_MAXIMIZED "Maximized" +#define wxPERSIST_TLW_ICONIZED "Iconized" + +// ---------------------------------------------------------------------------- +// wxPersistentTLW: supports saving/restoring window position and size as well +// as maximized/iconized/restore state +// ---------------------------------------------------------------------------- + +class wxPersistentTLW : public wxPersistentWindow<wxTopLevelWindow> +{ +public: + wxPersistentTLW(wxTopLevelWindow *tlw) + : wxPersistentWindow<wxTopLevelWindow>(tlw) + { + } + + virtual void Save() const + { + const wxTopLevelWindow * const tlw = Get(); + + const wxPoint pos = tlw->GetScreenPosition(); + SaveValue(wxPERSIST_TLW_X, pos.x); + SaveValue(wxPERSIST_TLW_Y, pos.y); + + // notice that we use GetSize() here and not GetClientSize() because + // the latter doesn't return correct results for the minimized windows + // (at least not under Windows) + // + // of course, it shouldn't matter anyhow usually, the client size + // should be preserved as well unless the size of the decorations + // changed between the runs + const wxSize size = tlw->GetSize(); + SaveValue(wxPERSIST_TLW_W, size.x); + SaveValue(wxPERSIST_TLW_H, size.y); + + SaveValue(wxPERSIST_TLW_MAXIMIZED, tlw->IsMaximized()); + SaveValue(wxPERSIST_TLW_ICONIZED, tlw->IsIconized()); + } + + virtual bool Restore() + { + wxTopLevelWindow * const tlw = Get(); + + long x wxDUMMY_INITIALIZE(-1), + y wxDUMMY_INITIALIZE(-1), + w wxDUMMY_INITIALIZE(-1), + h wxDUMMY_INITIALIZE(-1); + const bool hasPos = RestoreValue(wxPERSIST_TLW_X, &x) && + RestoreValue(wxPERSIST_TLW_Y, &y); + const bool hasSize = RestoreValue(wxPERSIST_TLW_W, &w) && + RestoreValue(wxPERSIST_TLW_H, &h); + + if ( hasPos ) + { + // to avoid making the window completely invisible if it had been + // shown on a monitor which was disconnected since the last run + // (this is pretty common for notebook with external displays) + // + // NB: we should allow window position to be (slightly) off screen, + // it's not uncommon to position the window so that its upper + // left corner has slightly negative coordinate + if ( wxDisplay::GetFromPoint(wxPoint(x, y)) != wxNOT_FOUND || + (hasSize && wxDisplay::GetFromPoint( + wxPoint(x + w, y + h)) != wxNOT_FOUND) ) + { + tlw->Move(x, y, wxSIZE_ALLOW_MINUS_ONE); + } + //else: should we try to adjust position/size somehow? + } + + if ( hasSize ) + tlw->SetSize(w, h); + + // note that the window can be both maximized and iconized + bool maximized; + if ( RestoreValue(wxPERSIST_TLW_MAXIMIZED, &maximized) && maximized ) + tlw->Maximize(); + + bool iconized; + if ( RestoreValue(wxPERSIST_TLW_ICONIZED, &iconized) && iconized ) + tlw->Iconize(); + + // the most important property of the window that we restore is its + // size, so disregard the value of hasPos here + return hasSize; + } + + virtual wxString GetKind() const { return wxPERSIST_TLW_KIND; } +}; + +inline wxPersistentObject *wxCreatePersistentObject(wxTopLevelWindow *tlw) +{ + return new wxPersistentTLW(tlw); +} + +#endif // _WX_PERSIST_TOPLEVEL_H_ diff --git a/wxmsw/include/wx-3.0/wx/persist/treebook.h b/wxmsw/include/wx-3.0/wx/persist/treebook.h new file mode 100644 index 00000000..1c0ba946 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/persist/treebook.h @@ -0,0 +1,96 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/persist/treebook.h +// Purpose: persistence support for wxBookCtrl +// Author: Vadim Zeitlin +// Created: 2009-01-19 +// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PERSIST_TREEBOOK_H_ +#define _WX_PERSIST_TREEBOOK_H_ + +#include "wx/persist/bookctrl.h" + +#include "wx/arrstr.h" +#include "wx/treebook.h" + +// ---------------------------------------------------------------------------- +// string constants used by wxPersistentTreeBookCtrl +// ---------------------------------------------------------------------------- + +#define wxPERSIST_TREEBOOK_KIND "TreeBook" + +// this key contains the indices of all expanded nodes in the tree book +// separated by wxPERSIST_TREEBOOK_EXPANDED_SEP +#define wxPERSIST_TREEBOOK_EXPANDED_BRANCHES "Expanded" +#define wxPERSIST_TREEBOOK_EXPANDED_SEP ',' + +// ---------------------------------------------------------------------------- +// wxPersistentTreeBookCtrl: supports saving/restoring open tree branches +// ---------------------------------------------------------------------------- + +class wxPersistentTreeBookCtrl : public wxPersistentBookCtrl +{ +public: + wxPersistentTreeBookCtrl(wxTreebook *book) + : wxPersistentBookCtrl(book) + { + } + + virtual void Save() const + { + const wxTreebook * const book = GetTreeBook(); + + wxString expanded; + const size_t count = book->GetPageCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( book->IsNodeExpanded(n) ) + { + if ( !expanded.empty() ) + expanded += wxPERSIST_TREEBOOK_EXPANDED_SEP; + + expanded += wxString::Format("%u", static_cast<unsigned>(n)); + } + } + + SaveValue(wxPERSIST_TREEBOOK_EXPANDED_BRANCHES, expanded); + + wxPersistentBookCtrl::Save(); + } + + virtual bool Restore() + { + wxTreebook * const book = GetTreeBook(); + + wxString expanded; + if ( RestoreValue(wxPERSIST_TREEBOOK_EXPANDED_BRANCHES, &expanded) ) + { + const wxArrayString + indices(wxSplit(expanded, wxPERSIST_TREEBOOK_EXPANDED_SEP)); + + const size_t pageCount = book->GetPageCount(); + const size_t count = indices.size(); + for ( size_t n = 0; n < count; n++ ) + { + unsigned long idx; + if ( indices[n].ToULong(&idx) && idx < pageCount ) + book->ExpandNode(idx); + } + } + + return wxPersistentBookCtrl::Restore(); + } + + virtual wxString GetKind() const { return wxPERSIST_TREEBOOK_KIND; } + + wxTreebook *GetTreeBook() const { return static_cast<wxTreebook *>(Get()); } +}; + +inline wxPersistentObject *wxCreatePersistentObject(wxTreebook *book) +{ + return new wxPersistentTreeBookCtrl(book); +} + +#endif // _WX_PERSIST_TREEBOOK_H_ diff --git a/wxmsw/include/wx-3.0/wx/persist/window.h b/wxmsw/include/wx-3.0/wx/persist/window.h new file mode 100644 index 00000000..279e11d2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/persist/window.h @@ -0,0 +1,79 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/persist/window.h +// Purpose: wxPersistentWindow declaration +// Author: Vadim Zeitlin +// Created: 2009-01-23 +// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PERSIST_WINDOW_H_ +#define _WX_PERSIST_WINDOW_H_ + +#include "wx/persist.h" + +#include "wx/window.h" + +// ---------------------------------------------------------------------------- +// wxPersistentWindow: base class for persistent windows, uses the window name +// as persistent name by default and automatically reacts +// to the window destruction +// ---------------------------------------------------------------------------- + +// type-independent part of wxPersistentWindow +class wxPersistentWindowBase : + wxBIND_OR_CONNECT_HACK_BASE_CLASS + public wxPersistentObject +{ +public: + wxPersistentWindowBase(wxWindow *win) + : wxPersistentObject(win) + { + wxBIND_OR_CONNECT_HACK(win, wxEVT_DESTROY, wxWindowDestroyEventHandler, + wxPersistentWindowBase::HandleDestroy, this); + } + + virtual wxString GetName() const + { + const wxString name = GetWindow()->GetName(); + wxASSERT_MSG( !name.empty(), "persistent windows should be named!" ); + + return name; + } + +protected: + wxWindow *GetWindow() const { return static_cast<wxWindow *>(GetObject()); } + +private: + void HandleDestroy(wxWindowDestroyEvent& event) + { + event.Skip(); + + // only react to the destruction of this object itself, not of any of + // its children + if ( event.GetEventObject() == GetObject() ) + { + // this will delete this object itself + wxPersistenceManager::Get().SaveAndUnregister(GetWindow()); + } + } + + wxDECLARE_NO_COPY_CLASS(wxPersistentWindowBase); +}; + +template <class T> +class wxPersistentWindow : public wxPersistentWindowBase +{ +public: + typedef T WindowType; + + wxPersistentWindow(WindowType *win) + : wxPersistentWindowBase(win) + { + } + + WindowType *Get() const { return static_cast<WindowType *>(GetWindow()); } +}; + +#endif // _WX_PERSIST_WINDOW_H_ + diff --git a/wxmsw/include/wx-3.0/wx/pickerbase.h b/wxmsw/include/wx-3.0/wx/pickerbase.h new file mode 100644 index 00000000..3c761da8 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/pickerbase.h @@ -0,0 +1,188 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/pickerbase.h +// Purpose: wxPickerBase definition +// Author: Francesco Montorsi (based on Vadim Zeitlin's code) +// Modified by: +// Created: 14/4/2006 +// Copyright: (c) Vadim Zeitlin, Francesco Montorsi +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PICKERBASE_H_BASE_ +#define _WX_PICKERBASE_H_BASE_ + +#include "wx/control.h" +#include "wx/sizer.h" +#include "wx/containr.h" + +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxToolTip; + +extern WXDLLIMPEXP_DATA_CORE(const char) wxButtonNameStr[]; + +// ---------------------------------------------------------------------------- +// wxPickerBase is the base class for the picker controls which support +// a wxPB_USE_TEXTCTRL style; i.e. for those pickers which can use an auxiliary +// text control next to the 'real' picker. +// +// The wxTextPickerHelper class manages enabled/disabled state of the text control, +// its sizing and positioning. +// ---------------------------------------------------------------------------- + +#define wxPB_USE_TEXTCTRL 0x0002 +#define wxPB_SMALL 0x8000 + +class WXDLLIMPEXP_CORE wxPickerBase : public wxNavigationEnabled<wxControl> +{ +public: + // ctor: text is the associated text control + wxPickerBase() : m_text(NULL), m_picker(NULL), m_sizer(NULL) + { } + virtual ~wxPickerBase() {} + + + // if present, intercepts wxPB_USE_TEXTCTRL style and creates the text control + // The 3rd argument is the initial wxString to display in the text control + bool CreateBase(wxWindow *parent, + wxWindowID id, + const wxString& text = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr); + +public: // public API + + // margin between the text control and the picker + void SetInternalMargin(int newmargin) + { GetTextCtrlItem()->SetBorder(newmargin); m_sizer->Layout(); } + int GetInternalMargin() const + { return GetTextCtrlItem()->GetBorder(); } + + // proportion of the text control + void SetTextCtrlProportion(int prop) + { GetTextCtrlItem()->SetProportion(prop); m_sizer->Layout(); } + int GetTextCtrlProportion() const + { return GetTextCtrlItem()->GetProportion(); } + + // proportion of the picker control + void SetPickerCtrlProportion(int prop) + { GetPickerCtrlItem()->SetProportion(prop); m_sizer->Layout(); } + int GetPickerCtrlProportion() const + { return GetPickerCtrlItem()->GetProportion(); } + + bool IsTextCtrlGrowable() const + { return (GetTextCtrlItem()->GetFlag() & wxGROW) != 0; } + void SetTextCtrlGrowable(bool grow = true) + { + int f = GetDefaultTextCtrlFlag(); + if ( grow ) + f |= wxGROW; + else + f &= ~wxGROW; + + GetTextCtrlItem()->SetFlag(f); + } + + bool IsPickerCtrlGrowable() const + { return (GetPickerCtrlItem()->GetFlag() & wxGROW) != 0; } + void SetPickerCtrlGrowable(bool grow = true) + { + int f = GetDefaultPickerCtrlFlag(); + if ( grow ) + f |= wxGROW; + else + f &= ~wxGROW; + + GetPickerCtrlItem()->SetFlag(f); + } + + bool HasTextCtrl() const + { return m_text != NULL; } + wxTextCtrl *GetTextCtrl() + { return m_text; } + wxControl *GetPickerCtrl() + { return m_picker; } + + void SetTextCtrl(wxTextCtrl* text) + { m_text = text; } + void SetPickerCtrl(wxControl* picker) + { m_picker = picker; } + + // methods that derived class must/may override + virtual void UpdatePickerFromTextCtrl() = 0; + virtual void UpdateTextCtrlFromPicker() = 0; + +protected: + // overridden base class methods +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip(wxToolTip *tip); +#endif // wxUSE_TOOLTIPS + + + // event handlers + void OnTextCtrlDelete(wxWindowDestroyEvent &); + void OnTextCtrlUpdate(wxCommandEvent &); + void OnTextCtrlKillFocus(wxFocusEvent &); + + // returns the set of styles for the attached wxTextCtrl + // from given wxPickerBase's styles + virtual long GetTextCtrlStyle(long style) const + { return (style & wxWINDOW_STYLE_MASK); } + + // returns the set of styles for the m_picker + virtual long GetPickerStyle(long style) const + { return (style & wxWINDOW_STYLE_MASK); } + + + wxSizerItem *GetPickerCtrlItem() const + { + if (this->HasTextCtrl()) + return m_sizer->GetItem((size_t)1); + return m_sizer->GetItem((size_t)0); + } + + wxSizerItem *GetTextCtrlItem() const + { + wxASSERT(this->HasTextCtrl()); + return m_sizer->GetItem((size_t)0); + } + + int GetDefaultPickerCtrlFlag() const + { + // on macintosh, without additional borders + // there's not enough space for focus rect + return wxALIGN_CENTER_VERTICAL|wxGROW +#ifdef __WXMAC__ + | wxTOP | wxRIGHT | wxBOTTOM +#endif + ; + } + + int GetDefaultTextCtrlFlag() const + { + // on macintosh, without wxALL there's not enough space for focus rect + return wxALIGN_CENTER_VERTICAL +#ifdef __WXMAC__ + | wxALL +#else + | wxRIGHT +#endif + ; + } + + void PostCreation(); + +protected: + wxTextCtrl *m_text; // can be NULL + wxControl *m_picker; + wxBoxSizer *m_sizer; + +private: + DECLARE_ABSTRACT_CLASS(wxPickerBase) +}; + + +#endif + // _WX_PICKERBASE_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/platform.h b/wxmsw/include/wx-3.0/wx/platform.h new file mode 100644 index 00000000..97c669f7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/platform.h @@ -0,0 +1,713 @@ +/** +* Name: wx/platform.h +* Purpose: define the OS and compiler identification macros +* Author: Vadim Zeitlin +* Modified by: +* Created: 29.10.01 (extracted from wx/defs.h) +* Copyright: (c) 1997-2001 Vadim Zeitlin +* Licence: wxWindows licence +*/ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_PLATFORM_H_ +#define _WX_PLATFORM_H_ + +#ifdef __WXMAC_XCODE__ +# include <unistd.h> +# include <TargetConditionals.h> +# include <AvailabilityMacros.h> +# ifndef MAC_OS_X_VERSION_10_4 +# define MAC_OS_X_VERSION_10_4 1040 +# endif +# ifndef MAC_OS_X_VERSION_10_5 +# define MAC_OS_X_VERSION_10_5 1050 +# endif +# ifndef MAC_OS_X_VERSION_10_6 +# define MAC_OS_X_VERSION_10_6 1060 +# endif +# ifndef MAC_OS_X_VERSION_10_7 +# define MAC_OS_X_VERSION_10_7 1070 +# endif +# ifndef MAC_OS_X_VERSION_10_8 +# define MAC_OS_X_VERSION_10_8 1080 +# endif +# include "wx/osx/config_xcode.h" +# ifndef __WXOSX__ +# define __WXOSX__ 1 +# endif +# ifndef __WXMAC__ +# define __WXMAC__ 1 +# endif +#endif + +/* + We use __WINDOWS__ as our main identification symbol for Microsoft Windows + but it's actually not predefined directly by any commonly used compilers + (only Watcom defines it itself and it's not supported any longer), so we + define it ourselves if any of the following macros is defined: + + - MSVC _WIN32 (notice that this is also defined under Win64) + - Borland __WIN32__ + - Our __WXMSW__ which selects Windows as platform automatically + */ +#if defined(_WIN32) || defined(__WIN32__) || defined(__WXMSW__) +# ifndef __WINDOWS__ +# define __WINDOWS__ +# endif /* !__WINDOWS__ */ +#endif /* Any standard symbol indicating Windows */ + +#if defined(_WIN64) +# ifndef _WIN32 + /* + a lot of code (mistakenly) uses #ifdef _WIN32 to either test for + Windows or to test for !__WIN16__, so we must define _WIN32 for + Win64 as well to ensure that the existing code continues to work. + */ +# define _WIN32 +# endif /* !_WIN32 */ + +# ifndef __WIN64__ +# define __WIN64__ +# endif /* !__WIN64__ */ +#endif /* _WIN64 */ + +#if defined(__WINDOWS__) + /* Select wxMSW under Windows if no other port is specified. */ +# if !defined(__WXMSW__) && !defined(__WXMOTIF__) && !defined(__WXGTK__) && !defined(__WXX11__) +# define __WXMSW__ +# endif + +# if !defined(__WINDOWS__) +# define __WINDOWS__ +# endif + +# ifndef _WIN32 +# define _WIN32 +# endif + +# ifndef WIN32 +# define WIN32 +# endif + +# ifndef __WIN32__ +# define __WIN32__ +# endif +#endif /* __WINDOWS__ */ + +/* + Don't use widget toolkit specific code in non-GUI code in the library + itself to ensure that the same base library is used for both MSW and GTK + ports. But keep __WXMSW__ defined for (console) applications using + wxWidgets for compatibility. + */ +#if defined(WXBUILDING) && defined(wxUSE_GUI) && !wxUSE_GUI +# ifdef __WXMSW__ +# undef __WXMSW__ +# endif +# ifdef __WXGTK__ +# undef __WXGTK__ +# endif +#endif + +#if defined(__WXGTK__) && defined(__WINDOWS__) + +# ifdef __WXMSW__ +# undef __WXMSW__ +# endif + +#endif /* __WXGTK__ && __WINDOWS__ */ + +/* detect MS SmartPhone */ +#if defined( WIN32_PLATFORM_WFSP ) +# ifndef __SMARTPHONE__ +# define __SMARTPHONE__ +# endif +# ifndef __WXWINCE__ +# define __WXWINCE__ +# endif +#endif + +/* detect PocketPC */ +#if defined( WIN32_PLATFORM_PSPC ) +# ifndef __POCKETPC__ +# define __POCKETPC__ +# endif +# ifndef __WXWINCE__ +# define __WXWINCE__ +# endif +#endif + +/* detect Standard WinCE SDK */ +#if defined( WCE_PLATFORM_STANDARDSDK ) +# ifndef __WINCE_STANDARDSDK__ +# define __WINCE_STANDARDSDK__ +# endif +# ifndef __WXWINCE__ +# define __WXWINCE__ +# endif +#endif + +#if defined(_WIN32_WCE) && !defined(WIN32_PLATFORM_WFSP) && !defined(WIN32_PLATFORM_PSPC) +# if (_WIN32_WCE >= 400) +# ifndef __WINCE_NET__ +# define __WINCE_NET__ +# endif +# elif (_WIN32_WCE >= 200) +# ifndef __HANDHELDPC__ +# define __HANDHELDPC__ +# endif +# endif +# ifndef __WXWINCE__ +# define __WXWINCE__ +# endif +#endif + +#if defined(__WXWINCE__) && defined(_MSC_VER) && (_MSC_VER == 1201) + #define __EVC4__ +#endif + +#if defined(__POCKETPC__) || defined(__SMARTPHONE__) || defined(__WXGPE__) +# define __WXHANDHELD__ +#endif + +#ifdef __ANDROID__ +# define __WXANDROID__ +# include "wx/android/config_android.h" +#endif + +#include "wx/compiler.h" + +/* + Include wx/setup.h for the Unix platform defines generated by configure and + the library compilation options + + Note that it must be included before defining hardware symbols below as they + could be already defined by configure but it must be included after defining + the compiler macros above as msvc/wx/setup.h relies on them under Windows. + */ +#include "wx/setup.h" + +/* + Convenience for any optional classes that use the wxAnyButton base class. + */ +#if wxUSE_TOGGLEBTN || wxUSE_BUTTON + #define wxHAS_ANY_BUTTON +#endif + + +/* + Hardware platform detection. + + VC++ defines _M_xxx symbols. + */ +#if defined(_M_IX86) || defined(i386) || defined(__i386) || defined(__i386__) + #ifndef __INTEL__ + #define __INTEL__ + #endif +#endif /* x86 */ + +#if defined(_M_IA64) + #ifndef __IA64__ + #define __IA64__ + #endif +#endif /* ia64 */ + +#if defined(_M_MPPC) || defined(__PPC__) || defined(__ppc__) + #ifndef __POWERPC__ + #define __POWERPC__ + #endif +#endif /* alpha */ + +#if defined(_M_ALPHA) || defined(__AXP__) + #ifndef __ALPHA__ + #define __ALPHA__ + #endif +#endif /* alpha */ + + +/* + adjust the Unicode setting: wxUSE_UNICODE should be defined as 0 or 1 + and is used by wxWidgets, _UNICODE and/or UNICODE may be defined or used by + the system headers so bring these settings in sync + */ + +/* set wxUSE_UNICODE to 1 if UNICODE or _UNICODE is defined */ +#if defined(_UNICODE) || defined(UNICODE) +# undef wxUSE_UNICODE +# define wxUSE_UNICODE 1 +#else /* !UNICODE */ +# ifndef wxUSE_UNICODE +# define wxUSE_UNICODE 0 +# endif +#endif /* UNICODE/!UNICODE */ + +/* and vice versa: define UNICODE and _UNICODE if wxUSE_UNICODE is 1 */ +#if wxUSE_UNICODE +# ifndef _UNICODE +# define _UNICODE +# endif +# ifndef UNICODE +# define UNICODE +# endif +#endif /* wxUSE_UNICODE */ + + +/* + test for old versions of Borland C, normally need at least 5.82, Turbo + explorer, available for free at http://www.turboexplorer.com/downloads +*/ + + +/* + Older versions of Borland C have some compiler bugs that need + workarounds. Mostly pertains to the free command line compiler 5.5.1. +*/ +#if defined(__BORLANDC__) && (__BORLANDC__ <= 0x551) + /* + The Borland free compiler is unable to handle overloaded enum + comparisons under certain conditions e.g. when any class has a + conversion ctor for an integral type and there's an overload to + compare between an integral type and that class type. + */ +# define wxCOMPILER_NO_OVERLOAD_ON_ENUM + + /* + This is needed to overcome bugs in 5.5.1 STL, linking errors will + result if it is not defined. + */ +# define _RWSTD_COMPILE_INSTANTIATE + + /* + Preprocessor in older Borland compilers have major problems + concatenating with ##. Specifically, if the string operands being + concatenated have special meaning (e.g. L"str", 123i64 etc) + then ## will not concatenate the operands correctly. + + As a workaround, define wxPREPEND* and wxAPPEND* without using + wxCONCAT_HELPER. + */ +# define wxCOMPILER_BROKEN_CONCAT_OPER +#endif /* __BORLANDC__ */ + +/* + OS: first of all, test for MS-DOS platform. We must do this before testing + for Unix, because DJGPP compiler defines __unix__ under MS-DOS + */ +#if defined(__GO32__) || defined(__DJGPP__) || defined(__DOS__) +# ifndef __DOS__ +# define __DOS__ +# endif + /* size_t is the same as unsigned int for Watcom 11 compiler, */ + /* so define it if it hadn't been done by configure yet */ +# if !defined(wxSIZE_T_IS_UINT) && !defined(wxSIZE_T_IS_ULONG) +# ifdef __WATCOMC__ +# define wxSIZE_T_IS_UINT +# endif +# ifdef __DJGPP__ +# define wxSIZE_T_IS_ULONG +# endif +# endif + +/* + OS: then test for generic Unix defines, then for particular flavours and + finally for Unix-like systems + Mac OS X matches this case (__MACH__), prior Mac OS do not. + */ +#elif defined(__UNIX__) || defined(__unix) || defined(__unix__) || \ + defined(____SVR4____) || defined(__LINUX__) || defined(__sgi) || \ + defined(__hpux) || defined(sun) || defined(__SUN__) || defined(_AIX) || \ + defined(__EMX__) || defined(__VMS) || defined(__BEOS__) || defined(__MACH__) + +# define __UNIX_LIKE__ + + /* Helps SGI compilation, apparently */ +# ifdef __SGI__ +# ifdef __GNUG__ +# define __need_wchar_t +# else /* !gcc */ + /* + Note I use the term __SGI_CC__ for both cc and CC, its not a good + idea to mix gcc and cc/CC, the name mangling is different + */ +# define __SGI_CC__ +# endif /* gcc/!gcc */ + + /* system headers use this symbol and not __cplusplus in some places */ +# ifndef _LANGUAGE_C_PLUS_PLUS +# define _LANGUAGE_C_PLUS_PLUS +# endif +# endif /* SGI */ + +# ifdef __EMX__ +# define OS2EMX_PLAIN_CHAR +# endif +# if defined(__INNOTEK_LIBC__) + /* Ensure visibility of strnlen declaration */ +# define _GNU_SOURCE +# endif + + /* define __HPUX__ for HP-UX where standard macro is __hpux */ +# if defined(__hpux) && !defined(__HPUX__) +# define __HPUX__ +# endif /* HP-UX */ + +# if defined(__CYGWIN__) || defined(__WINE__) +# if !defined(wxSIZE_T_IS_UINT) +# define wxSIZE_T_IS_UINT +# endif +# endif + + /* All of these should already be defined by including configure- + generated setup.h but we wish to support Xcode compilation without + requiring the user to define these himself. + */ +# if defined(__APPLE__) && defined(__MACH__) +# ifndef __UNIX__ +# define __UNIX__ 1 +# endif +# ifndef __BSD__ +# define __BSD__ 1 +# endif + /* __DARWIN__ is our own define to mean OS X or pure Darwin */ +# ifndef __DARWIN__ +# define __DARWIN__ 1 +# endif + /* NOTE: TARGET_CARBON is actually a 0/1 and must be 1 for OS X */ +# ifndef TARGET_CARBON +# define TARGET_CARBON 1 +# endif + /* OS X uses unsigned long size_t for both ILP32 and LP64 modes. */ +# if !defined(wxSIZE_T_IS_UINT) && !defined(wxSIZE_T_IS_ULONG) +# define wxSIZE_T_IS_ULONG +# endif +# endif + +/* + OS: OS/2 + */ +#elif defined(__OS2__) + + /* wxOS2 vs. non wxOS2 ports on OS2 platform */ +# if !defined(__WXMOTIF__) && !defined(__WXGTK__) && !defined(__WXX11__) +# ifndef __WXPM__ +# define __WXPM__ +# endif +# endif + +# if defined(__IBMCPP__) +# define __VISAGEAVER__ __IBMCPP__ +# endif + + /* Place other OS/2 compiler environment defines here */ +# if defined(__VISAGECPP__) + /* VisualAge is the only thing that understands _Optlink */ +# define LINKAGEMODE _Optlink +# endif +# define wxSIZE_T_IS_UINT + +/* + OS: Windows + */ +#elif defined(__WINDOWS__) + + /* to be changed for Win64! */ +# ifndef __WIN32__ +# error "__WIN32__ should be defined for Win32 and Win64, Win16 is not supported" +# endif + + /* size_t is the same as unsigned int for all Windows compilers we know, */ + /* so define it if it hadn't been done by configure yet */ +# if !defined(wxSIZE_T_IS_UINT) && !defined(wxSIZE_T_IS_ULONG) && !defined(__WIN64__) +# define wxSIZE_T_IS_UINT +# endif +#else +# error "Unknown platform." +#endif /* OS */ + +/* + if we're on a Unix system but didn't use configure (so that setup.h didn't + define __UNIX__), do define __UNIX__ now + */ +#if !defined(__UNIX__) && defined(__UNIX_LIKE__) +# define __UNIX__ +#endif /* Unix */ + +#if defined(__WXMOTIF__) || defined(__WXX11__) +# define __X__ +#endif + +/* + We get "Large Files (ILP32) not supported in strict ANSI mode." #error + from HP-UX standard headers when compiling with g++ without this: + */ +#if defined(__HPUX__) && !defined(__STDC_EXT__) +# define __STDC_EXT__ 1 +#endif + +/* Force linking against required libraries under Windows: */ +#ifdef __WXWINCE__ +# include "wx/msw/wince/libraries.h" +#elif defined __WINDOWS__ +# include "wx/msw/libraries.h" +#endif + +#if defined(__BORLANDC__) || (defined(__GNUC__) && __GNUC__ < 3) +#define wxNEEDS_CHARPP +#endif + +#if ( defined( __GNUWIN32__ ) || defined( __MINGW32__ ) || \ + ( defined( __CYGWIN__ ) && defined( __WINDOWS__ ) ) || \ + wxCHECK_WATCOM_VERSION(1,0) ) && \ + !defined(__DOS__) && \ + !defined(__WXPM__) && \ + !defined(__WXMOTIF__) && \ + !defined(__WXX11__) +# include "wx/msw/gccpriv.h" +#else +# undef wxCHECK_W32API_VERSION +# define wxCHECK_W32API_VERSION(maj, min) (0) +#endif + + +/* + Handle Darwin gcc universal compilation. Don't do this in an Apple- + specific case since no sane compiler should be defining either + __BIG_ENDIAN__ or __LITTLE_ENDIAN__ unless it really is generating + code that will be hosted on a machine with the appropriate endianness. + If a compiler defines neither, assume the user or configure set + WORDS_BIGENDIAN appropriately. + */ +#if defined(__BIG_ENDIAN__) +# undef WORDS_BIGENDIAN +# define WORDS_BIGENDIAN 1 +#elif defined(__LITTLE_ENDIAN__) +# undef WORDS_BIGENDIAN +#elif defined(__WXMAC__) && !defined(WORDS_BIGENDIAN) +/* According to Stefan even ancient Mac compilers defined __BIG_ENDIAN__ */ +# warning "Compiling wxMac with probably wrong endianness" +#endif +/* also the 32/64 bit universal builds must be handled accordingly */ +#ifdef __DARWIN__ +# ifdef __LP64__ +# undef SIZEOF_VOID_P +# undef SIZEOF_LONG +# undef SIZEOF_SIZE_T +# define SIZEOF_VOID_P 8 +# define SIZEOF_LONG 8 +# define SIZEOF_SIZE_T 8 +# else +# undef SIZEOF_VOID_P +# undef SIZEOF_LONG +# undef SIZEOF_SIZE_T +# define SIZEOF_VOID_P 4 +# define SIZEOF_LONG 4 +# define SIZEOF_SIZE_T 4 +# endif +#endif + +/* + Define various OS X symbols before including wx/chkconf.h which uses them. + + __WXOSX_MAC__ means Mac OS X, non embedded + __WXOSX_IPHONE__ means OS X iPhone + */ + +/* + Normally all of __WXOSX_XXX__, __WXOSX__ and __WXMAC__ are defined by + configure but ensure that we also define them if configure was not used for + whatever reason. + + The primary symbol remains __WXOSX_XXX__ one, __WXOSX__ exists to allow + checking for any OS X port (Carbon and Cocoa) and __WXMAC__ is an old name + for it. + */ +#if defined(__WXOSX_CARBON__) || defined(__WXOSX_COCOA__) || defined(__WXOSX_IPHONE__) +# ifndef __WXOSX__ +# define __WXOSX__ 1 +# endif +# ifndef __WXMAC__ +# define __WXMAC__ 1 +# endif +#endif + +#ifdef __WXOSX__ +/* setup precise defines according to sdk used */ +# include <TargetConditionals.h> +# if defined(__WXOSX_IPHONE__) +# if !( defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE ) +# error "incorrect SDK for an iPhone build" +# endif +# else +# if wxUSE_GUI && !(defined(__WXOSX_CARBON__) || defined(__WXOSX_COCOA__)) +# error "one of __WXOSX_IPHONE__, __WXOSX_CARBON__ or __WXOSX_COCOA__ must be defined for the GUI build" +# endif +# if !( defined(TARGET_OS_MAC) && TARGET_OS_MAC ) +# error "incorrect SDK for a Mac OS X build" +# endif +# define __WXOSX_MAC__ 1 +# endif +#endif + +#ifdef __WXOSX_MAC__ +# if defined(__MACH__) +# include <AvailabilityMacros.h> +# ifndef MAC_OS_X_VERSION_10_4 +# define MAC_OS_X_VERSION_10_4 1040 +# endif +# ifndef MAC_OS_X_VERSION_10_5 +# define MAC_OS_X_VERSION_10_5 1050 +# endif +# ifndef MAC_OS_X_VERSION_10_6 +# define MAC_OS_X_VERSION_10_6 1060 +# endif +# ifndef MAC_OS_X_VERSION_10_7 +# define MAC_OS_X_VERSION_10_7 1070 +# endif +# ifndef MAC_OS_X_VERSION_10_8 +# define MAC_OS_X_VERSION_10_8 1080 +# endif +# else +# error "only mach-o configurations are supported" +# endif +#endif + +/* + __WXOSX_OR_COCOA__ is a common define to wxOSX (Carbon or Cocoa) and wxCocoa ports under OS X. + + DO NOT use this define in base library code. Although wxMac has its own + private base library (and thus __WXOSX_OR_COCOA__,__WXMAC__ and related defines are + valid there), wxCocoa shares its library with other ports like wxGTK and wxX11. + + To keep wx authors from screwing this up, only enable __WXOSX_OR_COCOA__ for wxCocoa when + not compiling the base library. We determine this by first checking if + wxUSE_BASE is not defined. If it is not defined, then we're not buildling + the base library, and possibly not building wx at all (but actually building + user code that's using wx). If it is defined then we must check to make sure + it is not true. If it is true, we're building base. + + If you want it in the common darwin base library then use __DARWIN__. You + can use any Darwin-available libraries like CoreFoundation but please avoid + using OS X libraries like Carbon or CoreServices. + + */ +#if defined(__WXOSX__) || (defined(__WXCOCOA__) && (!defined(wxUSE_BASE) || !wxUSE_BASE)) +# define __WXOSX_OR_COCOA__ 1 +#endif + +/* + check the consistency of the settings in setup.h: note that this must be + done after setting wxUSE_UNICODE correctly as it is used in wx/chkconf.h + and after defining the compiler macros which are used in it too + */ +#include "wx/chkconf.h" + + +/* + some compilers don't support iostream.h any longer, while some of theme + are not updated with <iostream> yet, so override the users setting here + in such case. + */ +#if defined(_MSC_VER) && (_MSC_VER >= 1310) +# undef wxUSE_IOSTREAMH +# define wxUSE_IOSTREAMH 0 +#elif defined(__DMC__) || defined(__WATCOMC__) +# undef wxUSE_IOSTREAMH +# define wxUSE_IOSTREAMH 1 +#elif defined(__MINGW32__) +# undef wxUSE_IOSTREAMH +# define wxUSE_IOSTREAMH 0 +#endif /* compilers with/without iostream.h */ + +/* + old C++ headers (like <iostream.h>) declare classes in the global namespace + while the new, standard ones (like <iostream>) do it in std:: namespace, + unless it's an old gcc version. + + using this macro allows constuctions like "wxSTD iostream" to work in + either case + */ +#if !wxUSE_IOSTREAMH && (!defined(__GNUC__) || ( __GNUC__ > 2 ) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)) +# define wxSTD std:: +#else +# define wxSTD +#endif + +/* On OpenVMS with the most recent HP C++ compiler some function (i.e. wscanf) + * are only available in the std-namespace. (BUG???) + */ +#if defined( __VMS ) && (__DECCXX_VER >= 70100000) && !defined(__STD_CFRONT) && !defined( __NONAMESPACE_STD ) +# define wxVMS_USE_STD std:: +#else +# define wxVMS_USE_STD +#endif + +#ifdef __VMS +#define XtDisplay XTDISPLAY +#ifdef __WXMOTIF__ +#define XtParent XTPARENT +#define XtScreen XTSCREEN +#define XtWindow XTWINDOW +#endif +#endif + +/* Choose which method we will use for updating menus + * - in OnIdle, or when we receive a wxEVT_MENU_OPEN event. + * Presently, only Windows, OS X and GTK+ support wxEVT_MENU_OPEN. + */ +#ifndef wxUSE_IDLEMENUUPDATES +# if (defined(__WXMSW__) || defined(__WXGTK__) || defined(__WXOSX__)) && !defined(__WXUNIVERSAL__) +# define wxUSE_IDLEMENUUPDATES 0 +# else +# define wxUSE_IDLEMENUUPDATES 1 +# endif +#endif + +/* + * Define symbols that are not yet in + * configure or possibly some setup.h files. + * They will need to be added. + */ + +#ifndef wxUSE_FILECONFIG +# if wxUSE_CONFIG && wxUSE_TEXTFILE +# define wxUSE_FILECONFIG 1 +# else +# define wxUSE_FILECONFIG 0 +# endif +#endif + +#ifndef wxUSE_HOTKEY +# define wxUSE_HOTKEY 0 +#endif + +#if !defined(wxUSE_WXDIB) && defined(__WXMSW__) +# define wxUSE_WXDIB 1 +#endif + +/* + Optionally supported C++ features. + */ + +/* + RTTI: if it is disabled in build/msw/makefile.* then this symbol will + already be defined but it's also possible to do it from configure (with + g++) or by editing project files with MSVC so test for it here too. + */ +#ifndef wxNO_RTTI + /* + Only 4.3 defines __GXX_RTTI by default so its absence is not an + indication of disabled RTTI with the previous versions. + */ +# if wxCHECK_GCC_VERSION(4, 3) +# ifndef __GXX_RTTI +# define wxNO_RTTI +# endif +# elif defined(_MSC_VER) +# ifndef _CPPRTTI +# define wxNO_RTTI +# endif +# endif +#endif /* wxNO_RTTI */ + +#endif /* _WX_PLATFORM_H_ */ diff --git a/wxmsw/include/wx-3.0/wx/platinfo.h b/wxmsw/include/wx-3.0/wx/platinfo.h new file mode 100644 index 00000000..f82080e5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/platinfo.h @@ -0,0 +1,369 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/platinfo.h +// Purpose: declaration of the wxPlatformInfo class +// Author: Francesco Montorsi +// Modified by: +// Created: 07.07.2006 (based on wxToolkitInfo) +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PLATINFO_H_ +#define _WX_PLATINFO_H_ + +#include "wx/string.h" + +// ---------------------------------------------------------------------------- +// wxPlatformInfo enums & structs +// ---------------------------------------------------------------------------- + +// VERY IMPORTANT: when changing these enum values, also change the relative +// string tables in src/common/platinfo.cpp + + +// families & sub-families of operating systems +enum wxOperatingSystemId +{ + wxOS_UNKNOWN = 0, // returned on error + + wxOS_MAC_OS = 1 << 0, // Apple Mac OS 8/9/X with Mac paths + wxOS_MAC_OSX_DARWIN = 1 << 1, // Apple Mac OS X with Unix paths + wxOS_MAC = wxOS_MAC_OS|wxOS_MAC_OSX_DARWIN, + + wxOS_WINDOWS_9X = 1 << 2, // Windows 9x family (95/98/ME) + wxOS_WINDOWS_NT = 1 << 3, // Windows NT family (NT/2000/XP) + wxOS_WINDOWS_MICRO = 1 << 4, // MicroWindows + wxOS_WINDOWS_CE = 1 << 5, // Windows CE (Window Mobile) + wxOS_WINDOWS = wxOS_WINDOWS_9X | + wxOS_WINDOWS_NT | + wxOS_WINDOWS_MICRO | + wxOS_WINDOWS_CE, + + wxOS_UNIX_LINUX = 1 << 6, // Linux + wxOS_UNIX_FREEBSD = 1 << 7, // FreeBSD + wxOS_UNIX_OPENBSD = 1 << 8, // OpenBSD + wxOS_UNIX_NETBSD = 1 << 9, // NetBSD + wxOS_UNIX_SOLARIS = 1 << 10, // SunOS + wxOS_UNIX_AIX = 1 << 11, // AIX + wxOS_UNIX_HPUX = 1 << 12, // HP/UX + wxOS_UNIX = wxOS_UNIX_LINUX | + wxOS_UNIX_FREEBSD | + wxOS_UNIX_OPENBSD | + wxOS_UNIX_NETBSD | + wxOS_UNIX_SOLARIS | + wxOS_UNIX_AIX | + wxOS_UNIX_HPUX, + + // 1<<13 and 1<<14 available for other Unix flavours + + wxOS_DOS = 1 << 15, // Microsoft DOS + wxOS_OS2 = 1 << 16 // OS/2 +}; + +// list of wxWidgets ports - some of them can be used with more than +// a single toolkit. +enum wxPortId +{ + wxPORT_UNKNOWN = 0, // returned on error + + wxPORT_BASE = 1 << 0, // wxBase, no native toolkit used + + wxPORT_MSW = 1 << 1, // wxMSW, native toolkit is Windows API + wxPORT_MOTIF = 1 << 2, // wxMotif, using [Open]Motif or Lesstif + wxPORT_GTK = 1 << 3, // wxGTK, using GTK+ 1.x, 2.x, GPE or Maemo + wxPORT_DFB = 1 << 4, // wxDFB, using wxUniversal + wxPORT_X11 = 1 << 5, // wxX11, using wxUniversal + wxPORT_PM = 1 << 6, // wxOS2, using OS/2 Presentation Manager + wxPORT_OS2 = wxPORT_PM, // wxOS2, using OS/2 Presentation Manager + wxPORT_MAC = 1 << 7, // wxOSX (former wxMac), using Cocoa, Carbon or iPhone API + wxPORT_OSX = wxPORT_MAC, // wxOSX, using Cocoa, Carbon or iPhone API + wxPORT_COCOA = 1 << 8, // wxCocoa, using Cocoa NextStep/Mac API + wxPORT_WINCE = 1 << 9 // wxWinCE, toolkit is WinCE SDK API +}; + +// architecture of the operating system +// (regardless of the build environment of wxWidgets library - see +// wxIsPlatform64bit documentation for more info) +enum wxArchitecture +{ + wxARCH_INVALID = -1, // returned on error + + wxARCH_32, // 32 bit + wxARCH_64, + + wxARCH_MAX +}; + + +// endian-ness of the machine +enum wxEndianness +{ + wxENDIAN_INVALID = -1, // returned on error + + wxENDIAN_BIG, // 4321 + wxENDIAN_LITTLE, // 1234 + wxENDIAN_PDP, // 3412 + + wxENDIAN_MAX +}; + +// informations about a linux distro returned by the lsb_release utility +struct wxLinuxDistributionInfo +{ + wxString Id; + wxString Release; + wxString CodeName; + wxString Description; + + bool operator==(const wxLinuxDistributionInfo& ldi) const + { + return Id == ldi.Id && + Release == ldi.Release && + CodeName == ldi.CodeName && + Description == ldi.Description; + } + + bool operator!=(const wxLinuxDistributionInfo& ldi) const + { return !(*this == ldi); } +}; + + +// ---------------------------------------------------------------------------- +// wxPlatformInfo +// ---------------------------------------------------------------------------- + +// Information about the toolkit that the app is running under and some basic +// platform and architecture info +class WXDLLIMPEXP_BASE wxPlatformInfo +{ +public: + wxPlatformInfo(); + wxPlatformInfo(wxPortId pid, + int tkMajor = -1, int tkMinor = -1, + wxOperatingSystemId id = wxOS_UNKNOWN, + int osMajor = -1, int osMinor = -1, + wxArchitecture arch = wxARCH_INVALID, + wxEndianness endian = wxENDIAN_INVALID, + bool usingUniversal = false); + + // default copy ctor, assignment operator and dtor are ok + + bool operator==(const wxPlatformInfo &t) const; + + bool operator!=(const wxPlatformInfo &t) const + { return !(*this == t); } + + // Gets a wxPlatformInfo already initialized with the values for + // the currently running platform. + static const wxPlatformInfo& Get(); + + + + // string -> enum conversions + // --------------------------------- + + static wxOperatingSystemId GetOperatingSystemId(const wxString &name); + static wxPortId GetPortId(const wxString &portname); + + static wxArchitecture GetArch(const wxString &arch); + static wxEndianness GetEndianness(const wxString &end); + + // enum -> string conversions + // --------------------------------- + + static wxString GetOperatingSystemFamilyName(wxOperatingSystemId os); + static wxString GetOperatingSystemIdName(wxOperatingSystemId os); + static wxString GetPortIdName(wxPortId port, bool usingUniversal); + static wxString GetPortIdShortName(wxPortId port, bool usingUniversal); + + static wxString GetArchName(wxArchitecture arch); + static wxString GetEndiannessName(wxEndianness end); + + + // getters + // ----------------- + + int GetOSMajorVersion() const + { return m_osVersionMajor; } + int GetOSMinorVersion() const + { return m_osVersionMinor; } + + // return true if the OS version >= major.minor + bool CheckOSVersion(int major, int minor) const + { + return DoCheckVersion(GetOSMajorVersion(), + GetOSMinorVersion(), + major, + minor); + } + + int GetToolkitMajorVersion() const + { return m_tkVersionMajor; } + int GetToolkitMinorVersion() const + { return m_tkVersionMinor; } + + bool CheckToolkitVersion(int major, int minor) const + { + return DoCheckVersion(GetToolkitMajorVersion(), + GetToolkitMinorVersion(), + major, + minor); + } + + bool IsUsingUniversalWidgets() const + { return m_usingUniversal; } + + wxOperatingSystemId GetOperatingSystemId() const + { return m_os; } + wxLinuxDistributionInfo GetLinuxDistributionInfo() const + { return m_ldi; } + wxPortId GetPortId() const + { return m_port; } + wxArchitecture GetArchitecture() const + { return m_arch; } + wxEndianness GetEndianness() const + { return m_endian; } + + + // string getters + // ----------------- + + wxString GetOperatingSystemFamilyName() const + { return GetOperatingSystemFamilyName(m_os); } + wxString GetOperatingSystemIdName() const + { return GetOperatingSystemIdName(m_os); } + wxString GetPortIdName() const + { return GetPortIdName(m_port, m_usingUniversal); } + wxString GetPortIdShortName() const + { return GetPortIdShortName(m_port, m_usingUniversal); } + wxString GetArchName() const + { return GetArchName(m_arch); } + wxString GetEndiannessName() const + { return GetEndiannessName(m_endian); } + wxString GetOperatingSystemDescription() const + { return m_osDesc; } + wxString GetDesktopEnvironment() const + { return m_desktopEnv; } + + static wxString GetOperatingSystemDirectory(); + // doesn't make sense to store inside wxPlatformInfo the OS directory, + // thus this function is static; note that this function simply calls + // wxGetOSDirectory() and is here just to make it easier for the user to + // find it that feature (global functions can be difficult to find in the docs) + + // setters + // ----------------- + + void SetOSVersion(int major, int minor) + { m_osVersionMajor=major; m_osVersionMinor=minor; } + void SetToolkitVersion(int major, int minor) + { m_tkVersionMajor=major; m_tkVersionMinor=minor; } + + void SetOperatingSystemId(wxOperatingSystemId n) + { m_os = n; } + void SetOperatingSystemDescription(const wxString& desc) + { m_osDesc = desc; } + void SetPortId(wxPortId n) + { m_port = n; } + void SetArchitecture(wxArchitecture n) + { m_arch = n; } + void SetEndianness(wxEndianness n) + { m_endian = n; } + + void SetDesktopEnvironment(const wxString& de) + { m_desktopEnv = de; } + void SetLinuxDistributionInfo(const wxLinuxDistributionInfo& di) + { m_ldi = di; } + + + // miscellaneous + // ----------------- + + bool IsOk() const + { + return m_osVersionMajor != -1 && m_osVersionMinor != -1 && + m_os != wxOS_UNKNOWN && + !m_osDesc.IsEmpty() && + m_tkVersionMajor != -1 && m_tkVersionMinor != -1 && + m_port != wxPORT_UNKNOWN && + m_arch != wxARCH_INVALID && + m_endian != wxENDIAN_INVALID; + + // do not check linux-specific info; it's ok to have them empty + } + + +protected: + static bool DoCheckVersion(int majorCur, int minorCur, int major, int minor) + { + return majorCur > major || (majorCur == major && minorCur >= minor); + } + + void InitForCurrentPlatform(); + + + // OS stuff + // ----------------- + + // Version of the OS; valid if m_os != wxOS_UNKNOWN + // (-1 means not initialized yet). + int m_osVersionMajor, + m_osVersionMinor; + + // Operating system ID. + wxOperatingSystemId m_os; + + // Operating system description. + wxString m_osDesc; + + + // linux-specific + // ----------------- + + wxString m_desktopEnv; + wxLinuxDistributionInfo m_ldi; + + + // toolkit + // ----------------- + + // Version of the underlying toolkit + // (-1 means not initialized yet; zero means no toolkit). + int m_tkVersionMajor, m_tkVersionMinor; + + // name of the wxWidgets port + wxPortId m_port; + + // is using wxUniversal widgets? + bool m_usingUniversal; + + + // others + // ----------------- + + // architecture of the OS/machine + wxArchitecture m_arch; + + // endianness of the machine + wxEndianness m_endian; +}; + + +#if WXWIN_COMPATIBILITY_2_6 + #define wxUNKNOWN_PLATFORM wxOS_UNKNOWN + #define wxUnix wxOS_UNIX + #define wxWin95 wxOS_WINDOWS_9X + #define wxWIN95 wxOS_WINDOWS_9X + #define wxWINDOWS_NT wxOS_WINDOWS_NT + #define wxMSW wxOS_WINDOWS + #define wxWinCE wxOS_WINDOWS_CE + #define wxWIN32S wxOS_WINDOWS_9X + + #define wxOS2 wxPORT_OS2 + #define wxCocoa wxPORT_MAC + #define wxMac wxPORT_MAC + #define wxMotif wxPORT_MOTIF + #define wxGTK wxPORT_GTK +#endif // WXWIN_COMPATIBILITY_2_6 + +#endif // _WX_PLATINFO_H_ diff --git a/wxmsw/include/wx-3.0/wx/popupwin.h b/wxmsw/include/wx-3.0/wx/popupwin.h new file mode 100644 index 00000000..6b61517f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/popupwin.h @@ -0,0 +1,195 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/popupwin.h +// Purpose: wxPopupWindow interface declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 06.01.01 +// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_POPUPWIN_H_BASE_ +#define _WX_POPUPWIN_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_POPUPWIN + +#include "wx/nonownedwnd.h" + +// ---------------------------------------------------------------------------- +// wxPopupWindow: a special kind of top level window used for popup menus, +// combobox popups and such. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPopupWindowBase : public wxNonOwnedWindow +{ +public: + wxPopupWindowBase() { } + virtual ~wxPopupWindowBase(); + + // create the popup window + // + // style may only contain border flags + bool Create(wxWindow *parent, int style = wxBORDER_NONE); + + // move the popup window to the right position, i.e. such that it is + // entirely visible + // + // the popup is positioned at ptOrigin + size if it opens below and to the + // right (default), at ptOrigin - sizePopup if it opens above and to the + // left &c + // + // the point must be given in screen coordinates! + virtual void Position(const wxPoint& ptOrigin, + const wxSize& size); + + virtual bool IsTopLevel() const { return true; } + + wxDECLARE_NO_COPY_CLASS(wxPopupWindowBase); +}; + + +// include the real class declaration +#if defined(__WXMSW__) + #include "wx/msw/popupwin.h" +#elif defined(__WXPM__) + #include "wx/os2/popupwin.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/popupwin.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/popupwin.h" +#elif defined(__WXX11__) + #include "wx/x11/popupwin.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/popupwin.h" +#elif defined(__WXDFB__) + #include "wx/dfb/popupwin.h" +#elif defined(__WXMAC__) + #include "wx/osx/popupwin.h" +#else + #error "wxPopupWindow is not supported under this platform." +#endif + +// ---------------------------------------------------------------------------- +// wxPopupTransientWindow: a wxPopupWindow which disappears automatically +// when the user clicks mouse outside it or if it loses focus in any other way +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxPopupWindowHandler; +class WXDLLIMPEXP_FWD_CORE wxPopupFocusHandler; + +class WXDLLIMPEXP_CORE wxPopupTransientWindow : public wxPopupWindow +{ +public: + // ctors + wxPopupTransientWindow() { Init(); } + wxPopupTransientWindow(wxWindow *parent, int style = wxBORDER_NONE); + + virtual ~wxPopupTransientWindow(); + + // popup the window (this will show it too) and keep focus at winFocus + // (or itself if it's NULL), dismiss the popup if we lose focus + virtual void Popup(wxWindow *focus = NULL); + + // hide the window + virtual void Dismiss(); + + // can the window be dismissed now? + // + // VZ: where is this used?? + virtual bool CanDismiss() + { return true; } + + // called when a mouse is pressed while the popup is shown: return true + // from here to prevent its normal processing by the popup (which consists + // in dismissing it if the mouse is clicked outside it) + virtual bool ProcessLeftDown(wxMouseEvent& event); + + // Overridden to grab the input on some plaforms + virtual bool Show( bool show = true ); + + // Override to implement delayed destruction of this window. + virtual bool Destroy(); + +protected: + // common part of all ctors + void Init(); + + // this is called when the popup is disappeared because of anything + // else but direct call to Dismiss() + virtual void OnDismiss(); + + // dismiss and notify the derived class + void DismissAndNotify(); + + // remove our event handlers + void PopHandlers(); + + // get alerted when child gets deleted from under us + void OnDestroy(wxWindowDestroyEvent& event); + +#if defined(__WXMSW__) ||(defined(__WXMAC__) && wxOSX_USE_COCOA_OR_CARBON) + // Check if the mouse needs to be captured or released: we must release + // when it's inside our window if we want the embedded controls to work. + void OnIdle(wxIdleEvent& event); +#endif + + // the child of this popup if any + wxWindow *m_child; + + // the window which has the focus while we're shown + wxWindow *m_focus; + + // these classes may call our DismissAndNotify() + friend class wxPopupWindowHandler; + friend class wxPopupFocusHandler; + + // the handlers we created, may be NULL (if not, must be deleted) + wxPopupWindowHandler *m_handlerPopup; + wxPopupFocusHandler *m_handlerFocus; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxPopupTransientWindow) + wxDECLARE_NO_COPY_CLASS(wxPopupTransientWindow); +}; + +#if wxUSE_COMBOBOX && defined(__WXUNIVERSAL__) + +// ---------------------------------------------------------------------------- +// wxPopupComboWindow: wxPopupTransientWindow used by wxComboBox +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxComboBox; +class WXDLLIMPEXP_FWD_CORE wxComboCtrl; + +class WXDLLIMPEXP_CORE wxPopupComboWindow : public wxPopupTransientWindow +{ +public: + wxPopupComboWindow() { m_combo = NULL; } + wxPopupComboWindow(wxComboCtrl *parent); + + bool Create(wxComboCtrl *parent); + + // position the window correctly relatively to the combo + void PositionNearCombo(); + +protected: + // notify the combo here + virtual void OnDismiss(); + + // forward the key presses to the combobox + void OnKeyDown(wxKeyEvent& event); + + // the parent combobox + wxComboCtrl *m_combo; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxPopupComboWindow) +}; + +#endif // wxUSE_COMBOBOX && defined(__WXUNIVERSAL__) + +#endif // wxUSE_POPUPWIN + +#endif // _WX_POPUPWIN_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/position.h b/wxmsw/include/wx-3.0/wx/position.h new file mode 100644 index 00000000..bd324e23 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/position.h @@ -0,0 +1,59 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/position.h +// Purpose: Common structure and methods for positional information. +// Author: Vadim Zeitlin, Robin Dunn, Brad Anderson, Bryan Petty +// Created: 2007-03-13 +// Copyright: (c) 2007 The wxWidgets Team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_POSITION_H_ +#define _WX_POSITION_H_ + +#include "wx/gdicmn.h" + +class WXDLLIMPEXP_CORE wxPosition +{ +public: + wxPosition() : m_row(0), m_column(0) {} + wxPosition(int row, int col) : m_row(row), m_column(col) {} + + // default copy ctor and assignment operator are okay. + + int GetRow() const { return m_row; } + int GetColumn() const { return m_column; } + int GetCol() const { return GetColumn(); } + void SetRow(int row) { m_row = row; } + void SetColumn(int column) { m_column = column; } + void SetCol(int column) { SetColumn(column); } + + bool operator==(const wxPosition& p) const + { return m_row == p.m_row && m_column == p.m_column; } + bool operator!=(const wxPosition& p) const + { return !(*this == p); } + + wxPosition& operator+=(const wxPosition& p) + { m_row += p.m_row; m_column += p.m_column; return *this; } + wxPosition& operator-=(const wxPosition& p) + { m_row -= p.m_row; m_column -= p.m_column; return *this; } + wxPosition& operator+=(const wxSize& s) + { m_row += s.y; m_column += s.x; return *this; } + wxPosition& operator-=(const wxSize& s) + { m_row -= s.y; m_column -= s.x; return *this; } + + wxPosition operator+(const wxPosition& p) const + { return wxPosition(m_row + p.m_row, m_column + p.m_column); } + wxPosition operator-(const wxPosition& p) const + { return wxPosition(m_row - p.m_row, m_column - p.m_column); } + wxPosition operator+(const wxSize& s) const + { return wxPosition(m_row + s.y, m_column + s.x); } + wxPosition operator-(const wxSize& s) const + { return wxPosition(m_row - s.y, m_column - s.x); } + +private: + int m_row; + int m_column; +}; + +#endif // _WX_POSITION_H_ + diff --git a/wxmsw/include/wx-3.0/wx/power.h b/wxmsw/include/wx-3.0/wx/power.h new file mode 100644 index 00000000..17e81b6e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/power.h @@ -0,0 +1,108 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/power.h +// Purpose: functions and classes for system power management +// Author: Vadim Zeitlin +// Modified by: +// Created: 2006-05-27 +// Copyright: (c) 2006 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_POWER_H_ +#define _WX_POWER_H_ + +#include "wx/event.h" + +// ---------------------------------------------------------------------------- +// power management constants +// ---------------------------------------------------------------------------- + +enum wxPowerType +{ + wxPOWER_SOCKET, + wxPOWER_BATTERY, + wxPOWER_UNKNOWN +}; + +enum wxBatteryState +{ + wxBATTERY_NORMAL_STATE, // system is fully usable + wxBATTERY_LOW_STATE, // start to worry + wxBATTERY_CRITICAL_STATE, // save quickly + wxBATTERY_SHUTDOWN_STATE, // too late + wxBATTERY_UNKNOWN_STATE +}; + +// ---------------------------------------------------------------------------- +// wxPowerEvent is generated when the system online status changes +// ---------------------------------------------------------------------------- + +// currently the power events are only available under Windows, to avoid +// compiling in the code for handling them which is never going to be invoked +// under the other platforms, we define wxHAS_POWER_EVENTS symbol if this event +// is available, it should be used to guard all code using wxPowerEvent +#ifdef __WINDOWS__ + +#define wxHAS_POWER_EVENTS + +class WXDLLIMPEXP_BASE wxPowerEvent : public wxEvent +{ +public: + wxPowerEvent() // just for use by wxRTTI + : m_veto(false) { } + + wxPowerEvent(wxEventType evtType) : wxEvent(wxID_NONE, evtType) + { + m_veto = false; + } + + // Veto the operation (only makes sense with EVT_POWER_SUSPENDING) + void Veto() { m_veto = true; } + + bool IsVetoed() const { return m_veto; } + + + // default copy ctor, assignment operator and dtor are ok + + virtual wxEvent *Clone() const { return new wxPowerEvent(*this); } + +private: + bool m_veto; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxPowerEvent) +}; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_BASE, wxEVT_POWER_SUSPENDING, wxPowerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_BASE, wxEVT_POWER_SUSPENDED, wxPowerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_BASE, wxEVT_POWER_SUSPEND_CANCEL, wxPowerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_BASE, wxEVT_POWER_RESUME, wxPowerEvent ); + +typedef void (wxEvtHandler::*wxPowerEventFunction)(wxPowerEvent&); + +#define wxPowerEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxPowerEventFunction, func) + +#define EVT_POWER_SUSPENDING(func) \ + wx__DECLARE_EVT0(wxEVT_POWER_SUSPENDING, wxPowerEventHandler(func)) +#define EVT_POWER_SUSPENDED(func) \ + wx__DECLARE_EVT0(wxEVT_POWER_SUSPENDED, wxPowerEventHandler(func)) +#define EVT_POWER_SUSPEND_CANCEL(func) \ + wx__DECLARE_EVT0(wxEVT_POWER_SUSPEND_CANCEL, wxPowerEventHandler(func)) +#define EVT_POWER_RESUME(func) \ + wx__DECLARE_EVT0(wxEVT_POWER_RESUME, wxPowerEventHandler(func)) + +#else // no support for power events + #undef wxHAS_POWER_EVENTS +#endif // support for power events/no support + +// ---------------------------------------------------------------------------- +// power management functions +// ---------------------------------------------------------------------------- + +// return the current system power state: online or offline +WXDLLIMPEXP_BASE wxPowerType wxGetPowerType(); + +// return approximate battery state +WXDLLIMPEXP_BASE wxBatteryState wxGetBatteryState(); + +#endif // _WX_POWER_H_ diff --git a/wxmsw/include/wx-3.0/wx/print.h b/wxmsw/include/wx-3.0/wx/print.h new file mode 100644 index 00000000..56ebcf65 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/print.h @@ -0,0 +1,38 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/print.h +// Purpose: Base header for printer classes +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRINT_H_BASE_ +#define _WX_PRINT_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_PRINTING_ARCHITECTURE + +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + +#include "wx/msw/printwin.h" + +#elif defined(__WXMAC__) + +#include "wx/osx/printmac.h" + +#elif defined(__WXPM__) + +#include "wx/os2/printos2.h" + +#else + +#include "wx/generic/printps.h" + +#endif + +#endif // wxUSE_PRINTING_ARCHITECTURE +#endif + // _WX_PRINT_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/printdlg.h b/wxmsw/include/wx-3.0/wx/printdlg.h new file mode 100644 index 00000000..d7e7e4e2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/printdlg.h @@ -0,0 +1,121 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/printdlg.h +// Purpose: Base header and class for print dialogs +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRINTDLG_H_BASE_ +#define _WX_PRINTDLG_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_PRINTING_ARCHITECTURE + +#include "wx/event.h" +#include "wx/dialog.h" +#include "wx/intl.h" +#include "wx/cmndata.h" + + +// --------------------------------------------------------------------------- +// wxPrintDialogBase: interface for the dialog for printing +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPrintDialogBase : public wxDialog +{ +public: + wxPrintDialogBase() { } + wxPrintDialogBase(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString &title = wxEmptyString, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE); + + virtual wxPrintDialogData& GetPrintDialogData() = 0; + virtual wxPrintData& GetPrintData() = 0; + virtual wxDC *GetPrintDC() = 0; + +private: + DECLARE_ABSTRACT_CLASS(wxPrintDialogBase) + wxDECLARE_NO_COPY_CLASS(wxPrintDialogBase); +}; + +// --------------------------------------------------------------------------- +// wxPrintDialog: the dialog for printing. +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPrintDialog : public wxObject +{ +public: + wxPrintDialog(wxWindow *parent, wxPrintDialogData* data = NULL); + wxPrintDialog(wxWindow *parent, wxPrintData* data); + virtual ~wxPrintDialog(); + + virtual int ShowModal(); + + virtual wxPrintDialogData& GetPrintDialogData(); + virtual wxPrintData& GetPrintData(); + virtual wxDC *GetPrintDC(); + +private: + wxPrintDialogBase *m_pimpl; + +private: + DECLARE_DYNAMIC_CLASS(wxPrintDialog) + wxDECLARE_NO_COPY_CLASS(wxPrintDialog); +}; + +// --------------------------------------------------------------------------- +// wxPageSetupDialogBase: interface for the page setup dialog +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPageSetupDialogBase: public wxDialog +{ +public: + wxPageSetupDialogBase() { } + wxPageSetupDialogBase(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString &title = wxEmptyString, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE); + + virtual wxPageSetupDialogData& GetPageSetupDialogData() = 0; + +private: + DECLARE_ABSTRACT_CLASS(wxPageSetupDialogBase) + wxDECLARE_NO_COPY_CLASS(wxPageSetupDialogBase); +}; + +// --------------------------------------------------------------------------- +// wxPageSetupDialog: the page setup dialog +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPageSetupDialog: public wxObject +{ +public: + wxPageSetupDialog(wxWindow *parent, wxPageSetupDialogData *data = NULL); + virtual ~wxPageSetupDialog(); + + int ShowModal(); + wxPageSetupDialogData& GetPageSetupDialogData(); + // old name + wxPageSetupDialogData& GetPageSetupData(); + +private: + wxPageSetupDialogBase *m_pimpl; + +private: + DECLARE_DYNAMIC_CLASS(wxPageSetupDialog) + wxDECLARE_NO_COPY_CLASS(wxPageSetupDialog); +}; + +#endif + +#endif + // _WX_PRINTDLG_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/prntbase.h b/wxmsw/include/wx-3.0/wx/prntbase.h new file mode 100644 index 00000000..a6f22fa0 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/prntbase.h @@ -0,0 +1,758 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/prntbase.h +// Purpose: Base classes for printing framework +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRNTBASEH__ +#define _WX_PRNTBASEH__ + +#include "wx/defs.h" + +#if wxUSE_PRINTING_ARCHITECTURE + +#include "wx/event.h" +#include "wx/cmndata.h" +#include "wx/panel.h" +#include "wx/scrolwin.h" +#include "wx/dialog.h" +#include "wx/frame.h" +#include "wx/dc.h" + +class WXDLLIMPEXP_FWD_CORE wxDC; +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxChoice; +class WXDLLIMPEXP_FWD_CORE wxPrintout; +class WXDLLIMPEXP_FWD_CORE wxPrinterBase; +class WXDLLIMPEXP_FWD_CORE wxPrintDialogBase; +class WXDLLIMPEXP_FWD_CORE wxPrintDialog; +class WXDLLIMPEXP_FWD_CORE wxPageSetupDialogBase; +class WXDLLIMPEXP_FWD_CORE wxPageSetupDialog; +class WXDLLIMPEXP_FWD_CORE wxPrintPreviewBase; +class WXDLLIMPEXP_FWD_CORE wxPreviewCanvas; +class WXDLLIMPEXP_FWD_CORE wxPreviewControlBar; +class WXDLLIMPEXP_FWD_CORE wxPreviewFrame; +class WXDLLIMPEXP_FWD_CORE wxPrintFactory; +class WXDLLIMPEXP_FWD_CORE wxPrintNativeDataBase; +class WXDLLIMPEXP_FWD_CORE wxPrintPreview; +class WXDLLIMPEXP_FWD_CORE wxPrintAbortDialog; +class WXDLLIMPEXP_FWD_CORE wxStaticText; +class wxPrintPageMaxCtrl; +class wxPrintPageTextCtrl; + +//---------------------------------------------------------------------------- +// error consts +//---------------------------------------------------------------------------- + +enum wxPrinterError +{ + wxPRINTER_NO_ERROR = 0, + wxPRINTER_CANCELLED, + wxPRINTER_ERROR +}; + +// Preview frame modality kind used with wxPreviewFrame::Initialize() +enum wxPreviewFrameModalityKind +{ + // Disable all the other top level windows while the preview is shown. + wxPreviewFrame_AppModal, + + // Disable only the parent window while the preview is shown. + wxPreviewFrame_WindowModal, + + // Don't disable any windows. + wxPreviewFrame_NonModal +}; + +//---------------------------------------------------------------------------- +// wxPrintFactory +//---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPrintFactory +{ +public: + wxPrintFactory() {} + virtual ~wxPrintFactory() {} + + virtual wxPrinterBase *CreatePrinter( wxPrintDialogData* data ) = 0; + + virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview, + wxPrintout *printout = NULL, + wxPrintDialogData *data = NULL ) = 0; + virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview, + wxPrintout *printout, + wxPrintData *data ) = 0; + + virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent, + wxPrintDialogData *data = NULL ) = 0; + virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent, + wxPrintData *data ) = 0; + + virtual wxPageSetupDialogBase *CreatePageSetupDialog( wxWindow *parent, + wxPageSetupDialogData * data = NULL ) = 0; + + virtual wxDCImpl* CreatePrinterDCImpl( wxPrinterDC *owner, const wxPrintData& data ) = 0; + + // What to do and what to show in the wxPrintDialog + // a) Use the generic print setup dialog or a native one? + virtual bool HasPrintSetupDialog() = 0; + virtual wxDialog *CreatePrintSetupDialog( wxWindow *parent, wxPrintData *data ) = 0; + // b) Provide the "print to file" option ourselves or via print setup? + virtual bool HasOwnPrintToFile() = 0; + // c) Show current printer + virtual bool HasPrinterLine() = 0; + virtual wxString CreatePrinterLine() = 0; + // d) Show Status line for current printer? + virtual bool HasStatusLine() = 0; + virtual wxString CreateStatusLine() = 0; + + + virtual wxPrintNativeDataBase *CreatePrintNativeData() = 0; + + static void SetPrintFactory( wxPrintFactory *factory ); + static wxPrintFactory *GetFactory(); +private: + static wxPrintFactory *m_factory; +}; + +class WXDLLIMPEXP_CORE wxNativePrintFactory: public wxPrintFactory +{ +public: + virtual wxPrinterBase *CreatePrinter( wxPrintDialogData *data ); + + virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview, + wxPrintout *printout = NULL, + wxPrintDialogData *data = NULL ); + virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview, + wxPrintout *printout, + wxPrintData *data ); + + virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent, + wxPrintDialogData *data = NULL ); + virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent, + wxPrintData *data ); + + virtual wxPageSetupDialogBase *CreatePageSetupDialog( wxWindow *parent, + wxPageSetupDialogData * data = NULL ); + + virtual wxDCImpl* CreatePrinterDCImpl( wxPrinterDC *owner, const wxPrintData& data ); + + virtual bool HasPrintSetupDialog(); + virtual wxDialog *CreatePrintSetupDialog( wxWindow *parent, wxPrintData *data ); + virtual bool HasOwnPrintToFile(); + virtual bool HasPrinterLine(); + virtual wxString CreatePrinterLine(); + virtual bool HasStatusLine(); + virtual wxString CreateStatusLine(); + + virtual wxPrintNativeDataBase *CreatePrintNativeData(); +}; + +//---------------------------------------------------------------------------- +// wxPrintNativeDataBase +//---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPrintNativeDataBase: public wxObject +{ +public: + wxPrintNativeDataBase(); + virtual ~wxPrintNativeDataBase() {} + + virtual bool TransferTo( wxPrintData &data ) = 0; + virtual bool TransferFrom( const wxPrintData &data ) = 0; + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const = 0; + + int m_ref; + +private: + DECLARE_CLASS(wxPrintNativeDataBase) + wxDECLARE_NO_COPY_CLASS(wxPrintNativeDataBase); +}; + +//---------------------------------------------------------------------------- +// wxPrinterBase +//---------------------------------------------------------------------------- + +/* + * Represents the printer: manages printing a wxPrintout object + */ + +class WXDLLIMPEXP_CORE wxPrinterBase: public wxObject +{ +public: + wxPrinterBase(wxPrintDialogData *data = NULL); + virtual ~wxPrinterBase(); + + virtual wxPrintAbortDialog *CreateAbortWindow(wxWindow *parent, wxPrintout *printout); + virtual void ReportError(wxWindow *parent, wxPrintout *printout, const wxString& message); + + virtual wxPrintDialogData& GetPrintDialogData() const; + bool GetAbort() const { return sm_abortIt; } + + static wxPrinterError GetLastError() { return sm_lastError; } + + /////////////////////////////////////////////////////////////////////////// + // OVERRIDES + + virtual bool Setup(wxWindow *parent) = 0; + virtual bool Print(wxWindow *parent, wxPrintout *printout, bool prompt = true) = 0; + virtual wxDC* PrintDialog(wxWindow *parent) = 0; + +protected: + wxPrintDialogData m_printDialogData; + wxPrintout* m_currentPrintout; + + static wxPrinterError sm_lastError; + +public: + static wxWindow* sm_abortWindow; + static bool sm_abortIt; + +private: + DECLARE_CLASS(wxPrinterBase) + wxDECLARE_NO_COPY_CLASS(wxPrinterBase); +}; + +//---------------------------------------------------------------------------- +// wxPrinter +//---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPrinter: public wxPrinterBase +{ +public: + wxPrinter(wxPrintDialogData *data = NULL); + virtual ~wxPrinter(); + + virtual wxPrintAbortDialog *CreateAbortWindow(wxWindow *parent, wxPrintout *printout); + virtual void ReportError(wxWindow *parent, wxPrintout *printout, const wxString& message); + + virtual bool Setup(wxWindow *parent); + virtual bool Print(wxWindow *parent, wxPrintout *printout, bool prompt = true); + virtual wxDC* PrintDialog(wxWindow *parent); + + virtual wxPrintDialogData& GetPrintDialogData() const; + +protected: + wxPrinterBase *m_pimpl; + +private: + DECLARE_CLASS(wxPrinter) + wxDECLARE_NO_COPY_CLASS(wxPrinter); +}; + +//---------------------------------------------------------------------------- +// wxPrintout +//---------------------------------------------------------------------------- + +/* + * Represents an object via which a document may be printed. + * The programmer derives from this, overrides (at least) OnPrintPage, + * and passes it to a wxPrinter object for printing, or a wxPrintPreview + * object for previewing. + */ + +class WXDLLIMPEXP_CORE wxPrintout: public wxObject +{ +public: + wxPrintout(const wxString& title = wxGetTranslation("Printout")); + virtual ~wxPrintout(); + + virtual bool OnBeginDocument(int startPage, int endPage); + virtual void OnEndDocument(); + virtual void OnBeginPrinting(); + virtual void OnEndPrinting(); + + // Guaranteed to be before any other functions are called + virtual void OnPreparePrinting() { } + + virtual bool HasPage(int page); + virtual bool OnPrintPage(int page) = 0; + virtual void GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *pageTo); + + virtual wxString GetTitle() const { return m_printoutTitle; } + + wxDC *GetDC() const { return m_printoutDC; } + void SetDC(wxDC *dc) { m_printoutDC = dc; } + + void FitThisSizeToPaper(const wxSize& imageSize); + void FitThisSizeToPage(const wxSize& imageSize); + void FitThisSizeToPageMargins(const wxSize& imageSize, const wxPageSetupDialogData& pageSetupData); + void MapScreenSizeToPaper(); + void MapScreenSizeToPage(); + void MapScreenSizeToPageMargins(const wxPageSetupDialogData& pageSetupData); + void MapScreenSizeToDevice(); + + wxRect GetLogicalPaperRect() const; + wxRect GetLogicalPageRect() const; + wxRect GetLogicalPageMarginsRect(const wxPageSetupDialogData& pageSetupData) const; + + void SetLogicalOrigin(wxCoord x, wxCoord y); + void OffsetLogicalOrigin(wxCoord xoff, wxCoord yoff); + + void SetPageSizePixels(int w, int h) { m_pageWidthPixels = w; m_pageHeightPixels = h; } + void GetPageSizePixels(int *w, int *h) const { *w = m_pageWidthPixels; *h = m_pageHeightPixels; } + void SetPageSizeMM(int w, int h) { m_pageWidthMM = w; m_pageHeightMM = h; } + void GetPageSizeMM(int *w, int *h) const { *w = m_pageWidthMM; *h = m_pageHeightMM; } + + void SetPPIScreen(int x, int y) { m_PPIScreenX = x; m_PPIScreenY = y; } + void SetPPIScreen(const wxSize& ppi) { SetPPIScreen(ppi.x, ppi.y); } + void GetPPIScreen(int *x, int *y) const { *x = m_PPIScreenX; *y = m_PPIScreenY; } + void SetPPIPrinter(int x, int y) { m_PPIPrinterX = x; m_PPIPrinterY = y; } + void SetPPIPrinter(const wxSize& ppi) { SetPPIPrinter(ppi.x, ppi.y); } + void GetPPIPrinter(int *x, int *y) const { *x = m_PPIPrinterX; *y = m_PPIPrinterY; } + + void SetPaperRectPixels(const wxRect& paperRectPixels) { m_paperRectPixels = paperRectPixels; } + wxRect GetPaperRectPixels() const { return m_paperRectPixels; } + + // This must be called by wxPrintPreview to associate itself with the + // printout it uses. + virtual void SetPreview(wxPrintPreview *preview) { m_preview = preview; } + + wxPrintPreview *GetPreview() const { return m_preview; } + virtual bool IsPreview() const { return GetPreview() != NULL; } + +private: + wxString m_printoutTitle; + wxDC* m_printoutDC; + wxPrintPreview *m_preview; + + int m_pageWidthPixels; + int m_pageHeightPixels; + + int m_pageWidthMM; + int m_pageHeightMM; + + int m_PPIScreenX; + int m_PPIScreenY; + int m_PPIPrinterX; + int m_PPIPrinterY; + + wxRect m_paperRectPixels; + +private: + DECLARE_ABSTRACT_CLASS(wxPrintout) + wxDECLARE_NO_COPY_CLASS(wxPrintout); +}; + +//---------------------------------------------------------------------------- +// wxPreviewCanvas +//---------------------------------------------------------------------------- + +/* + * Canvas upon which a preview is drawn. + */ + +class WXDLLIMPEXP_CORE wxPreviewCanvas: public wxScrolledWindow +{ +public: + wxPreviewCanvas(wxPrintPreviewBase *preview, + wxWindow *parent, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxT("canvas")); + virtual ~wxPreviewCanvas(); + + void SetPreview(wxPrintPreviewBase *preview) { m_printPreview = preview; } + + void OnPaint(wxPaintEvent& event); + void OnChar(wxKeyEvent &event); + // Responds to colour changes + void OnSysColourChanged(wxSysColourChangedEvent& event); + +private: +#if wxUSE_MOUSEWHEEL + void OnMouseWheel(wxMouseEvent& event); +#endif // wxUSE_MOUSEWHEEL + void OnIdle(wxIdleEvent& event); + + wxPrintPreviewBase* m_printPreview; + + DECLARE_CLASS(wxPreviewCanvas) + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxPreviewCanvas); +}; + +//---------------------------------------------------------------------------- +// wxPreviewFrame +//---------------------------------------------------------------------------- + +/* + * Default frame for showing preview. + */ + +class WXDLLIMPEXP_CORE wxPreviewFrame: public wxFrame +{ +public: + wxPreviewFrame(wxPrintPreviewBase *preview, + wxWindow *parent, + const wxString& title = wxGetTranslation("Print Preview"), + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE | wxFRAME_FLOAT_ON_PARENT, + const wxString& name = wxFrameNameStr); + virtual ~wxPreviewFrame(); + + // Either Initialize() or InitializeWithModality() must be called before + // showing the preview frame, the former being just a particular case of + // the latter initializing the frame for being showing app-modally. + + // Notice that we must keep Initialize() with its existing signature to + // avoid breaking the old code that overrides it and we can't reuse the + // same name for the other functions to avoid virtual function hiding + // problem and the associated warnings given by some compilers (e.g. from + // g++ with -Woverloaded-virtual). + virtual void Initialize() + { + InitializeWithModality(wxPreviewFrame_AppModal); + } + + // Also note that this method is not virtual as it doesn't need to be + // overridden: it's never called by wxWidgets (of course, the same is true + // for Initialize() but, again, it must remain virtual for compatibility). + void InitializeWithModality(wxPreviewFrameModalityKind kind); + + void OnCloseWindow(wxCloseEvent& event); + virtual void CreateCanvas(); + virtual void CreateControlBar(); + + inline wxPreviewControlBar* GetControlBar() const { return m_controlBar; } + +protected: + wxPreviewCanvas* m_previewCanvas; + wxPreviewControlBar* m_controlBar; + wxPrintPreviewBase* m_printPreview; + wxWindowDisabler* m_windowDisabler; + + wxPreviewFrameModalityKind m_modalityKind; + + +private: + void OnChar(wxKeyEvent& event); + + DECLARE_EVENT_TABLE() + DECLARE_CLASS(wxPreviewFrame) + wxDECLARE_NO_COPY_CLASS(wxPreviewFrame); +}; + +//---------------------------------------------------------------------------- +// wxPreviewControlBar +//---------------------------------------------------------------------------- + +/* + * A panel with buttons for controlling a print preview. + * The programmer may wish to use other means for controlling + * the print preview. + */ + +#define wxPREVIEW_PRINT 1 +#define wxPREVIEW_PREVIOUS 2 +#define wxPREVIEW_NEXT 4 +#define wxPREVIEW_ZOOM 8 +#define wxPREVIEW_FIRST 16 +#define wxPREVIEW_LAST 32 +#define wxPREVIEW_GOTO 64 + +#define wxPREVIEW_DEFAULT (wxPREVIEW_PREVIOUS|wxPREVIEW_NEXT|wxPREVIEW_ZOOM\ + |wxPREVIEW_FIRST|wxPREVIEW_GOTO|wxPREVIEW_LAST) + +// Ids for controls +#define wxID_PREVIEW_CLOSE 1 +#define wxID_PREVIEW_NEXT 2 +#define wxID_PREVIEW_PREVIOUS 3 +#define wxID_PREVIEW_PRINT 4 +#define wxID_PREVIEW_ZOOM 5 +#define wxID_PREVIEW_FIRST 6 +#define wxID_PREVIEW_LAST 7 +#define wxID_PREVIEW_GOTO 8 +#define wxID_PREVIEW_ZOOM_IN 9 +#define wxID_PREVIEW_ZOOM_OUT 10 + +class WXDLLIMPEXP_CORE wxPreviewControlBar: public wxPanel +{ + DECLARE_CLASS(wxPreviewControlBar) + +public: + wxPreviewControlBar(wxPrintPreviewBase *preview, + long buttons, + wxWindow *parent, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL, + const wxString& name = wxT("panel")); + virtual ~wxPreviewControlBar(); + + virtual void CreateButtons(); + virtual void SetPageInfo(int minPage, int maxPage); + virtual void SetZoomControl(int zoom); + virtual int GetZoomControl(); + virtual wxPrintPreviewBase *GetPrintPreview() const + { return m_printPreview; } + + + // Implementation only from now on. + void OnWindowClose(wxCommandEvent& event); + void OnNext(); + void OnPrevious(); + void OnFirst(); + void OnLast(); + void OnGotoPage(); + void OnPrint(); + + void OnPrintButton(wxCommandEvent& WXUNUSED(event)) { OnPrint(); } + void OnNextButton(wxCommandEvent & WXUNUSED(event)) { OnNext(); } + void OnPreviousButton(wxCommandEvent & WXUNUSED(event)) { OnPrevious(); } + void OnFirstButton(wxCommandEvent & WXUNUSED(event)) { OnFirst(); } + void OnLastButton(wxCommandEvent & WXUNUSED(event)) { OnLast(); } + void OnPaint(wxPaintEvent& event); + + void OnUpdateNextButton(wxUpdateUIEvent& event) + { event.Enable(IsNextEnabled()); } + void OnUpdatePreviousButton(wxUpdateUIEvent& event) + { event.Enable(IsPreviousEnabled()); } + void OnUpdateFirstButton(wxUpdateUIEvent& event) + { event.Enable(IsFirstEnabled()); } + void OnUpdateLastButton(wxUpdateUIEvent& event) + { event.Enable(IsLastEnabled()); } + void OnUpdateZoomInButton(wxUpdateUIEvent& event) + { event.Enable(IsZoomInEnabled()); } + void OnUpdateZoomOutButton(wxUpdateUIEvent& event) + { event.Enable(IsZoomOutEnabled()); } + + // These methods are not private because they are called by wxPreviewCanvas. + void DoZoomIn(); + void DoZoomOut(); + +protected: + wxPrintPreviewBase* m_printPreview; + wxButton* m_closeButton; + wxChoice* m_zoomControl; + wxPrintPageTextCtrl* m_currentPageText; + wxPrintPageMaxCtrl* m_maxPageText; + + long m_buttonFlags; + +private: + void DoGotoPage(int page); + + void DoZoom(); + + bool IsNextEnabled() const; + bool IsPreviousEnabled() const; + bool IsFirstEnabled() const; + bool IsLastEnabled() const; + bool IsZoomInEnabled() const; + bool IsZoomOutEnabled() const; + + void OnZoomInButton(wxCommandEvent & WXUNUSED(event)) { DoZoomIn(); } + void OnZoomOutButton(wxCommandEvent & WXUNUSED(event)) { DoZoomOut(); } + void OnZoomChoice(wxCommandEvent& WXUNUSED(event)) { DoZoom(); } + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxPreviewControlBar); +}; + +//---------------------------------------------------------------------------- +// wxPrintPreviewBase +//---------------------------------------------------------------------------- + +/* + * Programmer creates an object of this class to preview a wxPrintout. + */ + +class WXDLLIMPEXP_CORE wxPrintPreviewBase: public wxObject +{ +public: + wxPrintPreviewBase(wxPrintout *printout, + wxPrintout *printoutForPrinting = NULL, + wxPrintDialogData *data = NULL); + wxPrintPreviewBase(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintData *data); + virtual ~wxPrintPreviewBase(); + + virtual bool SetCurrentPage(int pageNum); + virtual int GetCurrentPage() const; + + virtual void SetPrintout(wxPrintout *printout); + virtual wxPrintout *GetPrintout() const; + virtual wxPrintout *GetPrintoutForPrinting() const; + + virtual void SetFrame(wxFrame *frame); + virtual void SetCanvas(wxPreviewCanvas *canvas); + + virtual wxFrame *GetFrame() const; + virtual wxPreviewCanvas *GetCanvas() const; + + // This is a helper routine, used by the next 4 routines. + + virtual void CalcRects(wxPreviewCanvas *canvas, wxRect& printableAreaRect, wxRect& paperRect); + + // The preview canvas should call this from OnPaint + virtual bool PaintPage(wxPreviewCanvas *canvas, wxDC& dc); + + // Updates rendered page by calling RenderPage() if needed, returns true + // if there was some change. Preview canvas should call it at idle time + virtual bool UpdatePageRendering(); + + // This draws a blank page onto the preview canvas + virtual bool DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc); + + // Adjusts the scrollbars for the current scale + virtual void AdjustScrollbars(wxPreviewCanvas *canvas); + + // This is called by wxPrintPreview to render a page into a wxMemoryDC. + virtual bool RenderPage(int pageNum); + + + virtual void SetZoom(int percent); + virtual int GetZoom() const; + + virtual wxPrintDialogData& GetPrintDialogData(); + + virtual int GetMaxPage() const; + virtual int GetMinPage() const; + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const; + virtual void SetOk(bool ok); + + /////////////////////////////////////////////////////////////////////////// + // OVERRIDES + + // If we own a wxPrintout that can be used for printing, this + // will invoke the actual printing procedure. Called + // by the wxPreviewControlBar. + virtual bool Print(bool interactive) = 0; + + // Calculate scaling that needs to be done to get roughly + // the right scaling for the screen pretending to be + // the currently selected printer. + virtual void DetermineScaling() = 0; + +protected: + // helpers for RenderPage(): + virtual bool RenderPageIntoDC(wxDC& dc, int pageNum); + // renders preview into m_previewBitmap + virtual bool RenderPageIntoBitmap(wxBitmap& bmp, int pageNum); + + void InvalidatePreviewBitmap(); + +protected: + wxPrintDialogData m_printDialogData; + wxPreviewCanvas* m_previewCanvas; + wxFrame* m_previewFrame; + wxBitmap* m_previewBitmap; + bool m_previewFailed; + wxPrintout* m_previewPrintout; + wxPrintout* m_printPrintout; + int m_currentPage; + int m_currentZoom; + float m_previewScaleX; + float m_previewScaleY; + int m_topMargin; + int m_leftMargin; + int m_pageWidth; + int m_pageHeight; + int m_minPage; + int m_maxPage; + + bool m_isOk; + bool m_printingPrepared; // Called OnPreparePrinting? + +private: + void Init(wxPrintout *printout, wxPrintout *printoutForPrinting); + + wxDECLARE_NO_COPY_CLASS(wxPrintPreviewBase); + DECLARE_CLASS(wxPrintPreviewBase) +}; + +//---------------------------------------------------------------------------- +// wxPrintPreview +//---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPrintPreview: public wxPrintPreviewBase +{ +public: + wxPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting = NULL, + wxPrintDialogData *data = NULL); + wxPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintData *data); + virtual ~wxPrintPreview(); + + virtual bool SetCurrentPage(int pageNum); + virtual int GetCurrentPage() const; + virtual void SetPrintout(wxPrintout *printout); + virtual wxPrintout *GetPrintout() const; + virtual wxPrintout *GetPrintoutForPrinting() const; + virtual void SetFrame(wxFrame *frame); + virtual void SetCanvas(wxPreviewCanvas *canvas); + + virtual wxFrame *GetFrame() const; + virtual wxPreviewCanvas *GetCanvas() const; + virtual bool PaintPage(wxPreviewCanvas *canvas, wxDC& dc); + virtual bool UpdatePageRendering(); + virtual bool DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc); + virtual void AdjustScrollbars(wxPreviewCanvas *canvas); + virtual bool RenderPage(int pageNum); + virtual void SetZoom(int percent); + virtual int GetZoom() const; + + virtual bool Print(bool interactive); + virtual void DetermineScaling(); + + virtual wxPrintDialogData& GetPrintDialogData(); + + virtual int GetMaxPage() const; + virtual int GetMinPage() const; + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const; + virtual void SetOk(bool ok); + +private: + wxPrintPreviewBase *m_pimpl; + +private: + DECLARE_CLASS(wxPrintPreview) + wxDECLARE_NO_COPY_CLASS(wxPrintPreview); +}; + +//---------------------------------------------------------------------------- +// wxPrintAbortDialog +//---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPrintAbortDialog: public wxDialog +{ +public: + wxPrintAbortDialog(wxWindow *parent, + const wxString& documentTitle, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE, + const wxString& name = wxT("dialog")); + + void SetProgress(int currentPage, int totalPages, + int currentCopy, int totalCopies); + + void OnCancel(wxCommandEvent& event); + +private: + wxStaticText *m_progress; + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxPrintAbortDialog); +}; + +#endif // wxUSE_PRINTING_ARCHITECTURE + +#endif + // _WX_PRNTBASEH__ diff --git a/wxmsw/include/wx-3.0/wx/process.h b/wxmsw/include/wx-3.0/wx/process.h new file mode 100644 index 00000000..4c0018e6 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/process.h @@ -0,0 +1,187 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/process.h +// Purpose: wxProcess class +// Author: Guilhem Lavaux +// Modified by: Vadim Zeitlin to check error codes, added Detach() method +// Created: 24/06/98 +// Copyright: (c) 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROCESSH__ +#define _WX_PROCESSH__ + +#include "wx/event.h" + +#if wxUSE_STREAMS + #include "wx/stream.h" +#endif + +#include "wx/utils.h" // for wxSignal + +// the wxProcess creation flags +enum +{ + // no redirection + wxPROCESS_DEFAULT = 0, + + // redirect the IO of the child process + wxPROCESS_REDIRECT = 1 +}; + +// ---------------------------------------------------------------------------- +// A wxProcess object should be passed to wxExecute - than its OnTerminate() +// function will be called when the process terminates. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxProcess : public wxEvtHandler +{ +public: + // kill the process with the given PID + static wxKillError Kill(int pid, wxSignal sig = wxSIGTERM, int flags = wxKILL_NOCHILDREN); + + // test if the given process exists + static bool Exists(int pid); + + // this function replaces the standard popen() one: it launches a process + // asynchronously and allows the caller to get the streams connected to its + // std{in|out|err} + // + // on error NULL is returned, in any case the process object will be + // deleted automatically when the process terminates and should *not* be + // deleted by the caller + static wxProcess *Open(const wxString& cmd, int flags = wxEXEC_ASYNC); + + + // ctors + wxProcess(wxEvtHandler *parent = NULL, int nId = wxID_ANY) + { Init(parent, nId, wxPROCESS_DEFAULT); } + + wxProcess(int flags) { Init(NULL, wxID_ANY, flags); } + + virtual ~wxProcess(); + + // get the process ID of the process executed by Open() + long GetPid() const { return m_pid; } + + // may be overridden to be notified about process termination + virtual void OnTerminate(int pid, int status); + + // call this before passing the object to wxExecute() to redirect the + // launched process stdin/stdout, then use GetInputStream() and + // GetOutputStream() to get access to them + void Redirect() { m_redirect = true; } + bool IsRedirected() const { return m_redirect; } + + // detach from the parent - should be called by the parent if it's deleted + // before the process it started terminates + void Detach(); + +#if wxUSE_STREAMS + // Pipe handling + wxInputStream *GetInputStream() const { return m_inputStream; } + wxInputStream *GetErrorStream() const { return m_errorStream; } + wxOutputStream *GetOutputStream() const { return m_outputStream; } + + // close the output stream indicating that nothing more will be written + void CloseOutput() { delete m_outputStream; m_outputStream = NULL; } + + // return true if the child process stdout is not closed + bool IsInputOpened() const; + + // return true if any input is available on the child process stdout/err + bool IsInputAvailable() const; + bool IsErrorAvailable() const; + + // implementation only (for wxExecute) + // + // NB: the streams passed here should correspond to the child process + // stdout, stdin and stderr and here the normal naming convention is + // used unlike elsewhere in this class + void SetPipeStreams(wxInputStream *outStream, + wxOutputStream *inStream, + wxInputStream *errStream); +#endif // wxUSE_STREAMS + + // priority + // Sets the priority to the given value: see wxPRIORITY_XXX constants. + // + // NB: the priority can only be set before the process is created + void SetPriority(unsigned priority); + + // Get the current priority. + unsigned GetPriority() const { return m_priority; } + + // implementation only - don't use! + // -------------------------------- + + // needs to be public since it needs to be used from wxExecute() global func + void SetPid(long pid) { m_pid = pid; } + +protected: + void Init(wxEvtHandler *parent, int id, int flags); + + int m_id; + long m_pid; + + unsigned m_priority; + +#if wxUSE_STREAMS + // these streams are connected to stdout, stderr and stdin of the child + // process respectively (yes, m_inputStream corresponds to stdout -- very + // confusing but too late to change now) + wxInputStream *m_inputStream, + *m_errorStream; + wxOutputStream *m_outputStream; +#endif // wxUSE_STREAMS + + bool m_redirect; + + DECLARE_DYNAMIC_CLASS(wxProcess) + wxDECLARE_NO_COPY_CLASS(wxProcess); +}; + +// ---------------------------------------------------------------------------- +// wxProcess events +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxProcessEvent; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_BASE, wxEVT_END_PROCESS, wxProcessEvent ); + +class WXDLLIMPEXP_BASE wxProcessEvent : public wxEvent +{ +public: + wxProcessEvent(int nId = 0, int pid = 0, int exitcode = 0) : wxEvent(nId) + { + m_eventType = wxEVT_END_PROCESS; + m_pid = pid; + m_exitcode = exitcode; + } + + // accessors + // PID of process which terminated + int GetPid() { return m_pid; } + + // the exit code + int GetExitCode() { return m_exitcode; } + + // implement the base class pure virtual + virtual wxEvent *Clone() const { return new wxProcessEvent(*this); } + +public: + int m_pid, + m_exitcode; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxProcessEvent) +}; + +typedef void (wxEvtHandler::*wxProcessEventFunction)(wxProcessEvent&); + +#define wxProcessEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxProcessEventFunction, func) + +#define EVT_END_PROCESS(id, func) \ + wx__DECLARE_EVT1(wxEVT_END_PROCESS, id, wxProcessEventHandler(func)) + +#endif // _WX_PROCESSH__ diff --git a/wxmsw/include/wx-3.0/wx/progdlg.h b/wxmsw/include/wx-3.0/wx/progdlg.h new file mode 100644 index 00000000..e17d37ea --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/progdlg.h @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/progdlg.h +// Purpose: Base header for wxProgressDialog +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROGDLG_H_BASE_ +#define _WX_PROGDLG_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_PROGRESSDLG + +/* + * wxProgressDialog flags + */ +#define wxPD_CAN_ABORT 0x0001 +#define wxPD_APP_MODAL 0x0002 +#define wxPD_AUTO_HIDE 0x0004 +#define wxPD_ELAPSED_TIME 0x0008 +#define wxPD_ESTIMATED_TIME 0x0010 +#define wxPD_SMOOTH 0x0020 +#define wxPD_REMAINING_TIME 0x0040 +#define wxPD_CAN_SKIP 0x0080 + + +#include "wx/generic/progdlgg.h" + +#if defined(__WXMSW__) && wxUSE_THREADS && !defined(__WXUNIVERSAL__) + #include "wx/msw/progdlg.h" +#else + class WXDLLIMPEXP_CORE wxProgressDialog + : public wxGenericProgressDialog + { + public: + wxProgressDialog( const wxString& title, const wxString& message, + int maximum = 100, + wxWindow *parent = NULL, + int style = wxPD_APP_MODAL | wxPD_AUTO_HIDE ) + : wxGenericProgressDialog( title, message, maximum, + parent, style ) + { } + + private: + wxDECLARE_DYNAMIC_CLASS_NO_COPY( wxProgressDialog ); + }; +#endif // defined(__WXMSW__) && wxUSE_THREADS + +#endif // wxUSE_PROGRESSDLG + +#endif // _WX_PROGDLG_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/propdlg.h b/wxmsw/include/wx-3.0/wx/propdlg.h new file mode 100644 index 00000000..1f91c6fb --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/propdlg.h @@ -0,0 +1,18 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/propdlg.h +// Purpose: wxPropertySheetDialog base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROPDLG_H_BASE_ +#define _WX_PROPDLG_H_BASE_ + +#include "wx/generic/propdlg.h" + +#endif + // _WX_PROPDLG_H_BASE_ + diff --git a/wxmsw/include/wx-3.0/wx/propgrid/advprops.h b/wxmsw/include/wx-3.0/wx/propgrid/advprops.h new file mode 100644 index 00000000..16930c4b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/propgrid/advprops.h @@ -0,0 +1,519 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/propgrid/advprops.h +// Purpose: wxPropertyGrid Advanced Properties (font, colour, etc.) +// Author: Jaakko Salli +// Modified by: +// Created: 2004-09-25 +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROPGRID_ADVPROPS_H_ +#define _WX_PROPGRID_ADVPROPS_H_ + +#include "wx/defs.h" + +#if wxUSE_PROPGRID + +#include "wx/propgrid/props.h" + +// ----------------------------------------------------------------------- + +// +// Additional Value Type Handlers +// +bool WXDLLIMPEXP_PROPGRID +operator==(const wxArrayInt& array1, const wxArrayInt& array2); + +// +// Additional Property Editors +// +#if wxUSE_SPINBTN +WX_PG_DECLARE_EDITOR_WITH_DECL(SpinCtrl,WXDLLIMPEXP_PROPGRID) +#endif + +#if wxUSE_DATEPICKCTRL +WX_PG_DECLARE_EDITOR_WITH_DECL(DatePickerCtrl,WXDLLIMPEXP_PROPGRID) +#endif + +// ----------------------------------------------------------------------- + + +// Web colour is currently unsupported +#define wxPG_COLOUR_WEB_BASE 0x10000 +//#define wxPG_TO_WEB_COLOUR(A) ((wxUint32)(A+wxPG_COLOUR_WEB_BASE)) + + +#define wxPG_COLOUR_CUSTOM 0xFFFFFF +#define wxPG_COLOUR_UNSPECIFIED (wxPG_COLOUR_CUSTOM+1) + +/** @class wxColourPropertyValue + + Because text, background and other colours tend to differ between + platforms, wxSystemColourProperty must be able to select between system + colour and, when necessary, to pick a custom one. wxSystemColourProperty + value makes this possible. +*/ +class WXDLLIMPEXP_PROPGRID wxColourPropertyValue : public wxObject +{ +public: + /** An integer value relating to the colour, and which exact + meaning depends on the property with which it is used. + + For wxSystemColourProperty: + + Any of wxSYS_COLOUR_XXX, or any web-colour ( use wxPG_TO_WEB_COLOUR + macro - (currently unsupported) ), or wxPG_COLOUR_CUSTOM. + + For custom colour properties without values array specified: + + index or wxPG_COLOUR_CUSTOM + + For custom colour properties <b>with</b> values array specified: + + m_arrValues[index] or wxPG_COLOUR_CUSTOM + */ + wxUint32 m_type; + + /** Resulting colour. Should be correct regardless of type. */ + wxColour m_colour; + + wxColourPropertyValue() + : wxObject() + { + m_type = 0; + } + + virtual ~wxColourPropertyValue() + { + } + + wxColourPropertyValue( const wxColourPropertyValue& v ) + : wxObject() + { + m_type = v.m_type; + m_colour = v.m_colour; + } + + void Init( wxUint32 type, const wxColour& colour ) + { + m_type = type; + m_colour = colour; + } + + wxColourPropertyValue( const wxColour& colour ) + : wxObject() + { + m_type = wxPG_COLOUR_CUSTOM; + m_colour = colour; + } + + wxColourPropertyValue( wxUint32 type ) + : wxObject() + { + m_type = type; + } + + wxColourPropertyValue( wxUint32 type, const wxColour& colour ) + : wxObject() + { + Init( type, colour ); + } + + void operator=(const wxColourPropertyValue& cpv) + { + if (this != &cpv) + Init( cpv.m_type, cpv.m_colour ); + } + +private: + DECLARE_DYNAMIC_CLASS(wxColourPropertyValue) +}; + + +bool WXDLLIMPEXP_PROPGRID +operator==(const wxColourPropertyValue&, const wxColourPropertyValue&); + +DECLARE_VARIANT_OBJECT_EXPORTED(wxColourPropertyValue, WXDLLIMPEXP_PROPGRID) + +// ----------------------------------------------------------------------- +// Declare part of custom colour property macro pairs. + +#if wxUSE_IMAGE + #include "wx/image.h" +#endif + +// ----------------------------------------------------------------------- + +/** @class wxFontProperty + @ingroup classes + Property representing wxFont. +*/ +class WXDLLIMPEXP_PROPGRID wxFontProperty : public wxPGProperty +{ + WX_PG_DECLARE_PROPERTY_CLASS(wxFontProperty) +public: + + wxFontProperty(const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + const wxFont& value = wxFont()); + virtual ~wxFontProperty(); + virtual void OnSetValue(); + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + virtual bool OnEvent( wxPropertyGrid* propgrid, + wxWindow* primary, wxEvent& event ); + virtual wxVariant ChildChanged( wxVariant& thisValue, + int childIndex, + wxVariant& childValue ) const; + virtual void RefreshChildren(); + +protected: +}; + +// ----------------------------------------------------------------------- + + +/** If set, then match from list is searched for a custom colour. */ +#define wxPG_PROP_TRANSLATE_CUSTOM wxPG_PROP_CLASS_SPECIFIC_1 + + +/** @class wxSystemColourProperty + @ingroup classes + Has dropdown list of wxWidgets system colours. Value used is + of wxColourPropertyValue type. +*/ +class WXDLLIMPEXP_PROPGRID wxSystemColourProperty : public wxEnumProperty +{ + WX_PG_DECLARE_PROPERTY_CLASS(wxSystemColourProperty) +public: + + wxSystemColourProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + const wxColourPropertyValue& + value = wxColourPropertyValue() ); + virtual ~wxSystemColourProperty(); + + virtual void OnSetValue(); + virtual bool IntToValue(wxVariant& variant, + int number, + int argFlags = 0) const; + + /** + Override in derived class to customize how colours are printed as + strings. + */ + virtual wxString ColourToString( const wxColour& col, int index, + int argFlags = 0 ) const; + + /** Returns index of entry that triggers colour picker dialog + (default is last). + */ + virtual int GetCustomColourIndex() const; + + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + virtual bool StringToValue( wxVariant& variant, + const wxString& text, + int argFlags = 0 ) const; + virtual bool OnEvent( wxPropertyGrid* propgrid, + wxWindow* primary, wxEvent& event ); + virtual bool DoSetAttribute( const wxString& name, wxVariant& value ); + virtual wxSize OnMeasureImage( int item ) const; + virtual void OnCustomPaint( wxDC& dc, + const wxRect& rect, wxPGPaintData& paintdata ); + + // Helper function to show the colour dialog + bool QueryColourFromUser( wxVariant& variant ) const; + + /** Default is to use wxSystemSettings::GetColour(index). Override to use + custom colour tables etc. + */ + virtual wxColour GetColour( int index ) const; + + wxColourPropertyValue GetVal( const wxVariant* pVariant = NULL ) const; + +protected: + + // Special constructors to be used by derived classes. + wxSystemColourProperty( const wxString& label, const wxString& name, + const wxChar* const* labels, const long* values, wxPGChoices* choicesCache, + const wxColourPropertyValue& value ); + wxSystemColourProperty( const wxString& label, const wxString& name, + const wxChar* const* labels, const long* values, wxPGChoices* choicesCache, + const wxColour& value ); + + void Init( int type, const wxColour& colour ); + + // Utility functions for internal use + virtual wxVariant DoTranslateVal( wxColourPropertyValue& v ) const; + wxVariant TranslateVal( wxColourPropertyValue& v ) const + { + return DoTranslateVal( v ); + } + wxVariant TranslateVal( int type, const wxColour& colour ) const + { + wxColourPropertyValue v(type, colour); + return DoTranslateVal( v ); + } + + // Translates colour to a int value, return wxNOT_FOUND if no match. + int ColToInd( const wxColour& colour ) const; +}; + +// ----------------------------------------------------------------------- + +class WXDLLIMPEXP_PROPGRID wxColourProperty : public wxSystemColourProperty +{ + WX_PG_DECLARE_PROPERTY_CLASS(wxColourProperty) +public: + wxColourProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + const wxColour& value = *wxWHITE ); + virtual ~wxColourProperty(); + + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + virtual wxColour GetColour( int index ) const; + +protected: + virtual wxVariant DoTranslateVal( wxColourPropertyValue& v ) const; + +private: + void Init( wxColour colour ); +}; + +// ----------------------------------------------------------------------- + +/** @class wxCursorProperty + @ingroup classes + Property representing wxCursor. +*/ +class WXDLLIMPEXP_PROPGRID wxCursorProperty : public wxEnumProperty +{ + DECLARE_DYNAMIC_CLASS(wxCursorProperty) + + wxCursorProperty( const wxString& label= wxPG_LABEL, + const wxString& name= wxPG_LABEL, + int value = 0 ); + virtual ~wxCursorProperty(); + + virtual wxSize OnMeasureImage( int item ) const; + virtual void OnCustomPaint( wxDC& dc, + const wxRect& rect, wxPGPaintData& paintdata ); +}; + +// ----------------------------------------------------------------------- + +#if wxUSE_IMAGE + +WXDLLIMPEXP_PROPGRID const wxString& wxPGGetDefaultImageWildcard(); + +/** @class wxImageFileProperty + @ingroup classes + Property representing image file(name). +*/ +class WXDLLIMPEXP_PROPGRID wxImageFileProperty : public wxFileProperty +{ + DECLARE_DYNAMIC_CLASS(wxImageFileProperty) +public: + + wxImageFileProperty( const wxString& label= wxPG_LABEL, + const wxString& name = wxPG_LABEL, + const wxString& value = wxEmptyString); + virtual ~wxImageFileProperty(); + + virtual void OnSetValue(); + + virtual wxSize OnMeasureImage( int item ) const; + virtual void OnCustomPaint( wxDC& dc, + const wxRect& rect, wxPGPaintData& paintdata ); + +protected: + wxBitmap* m_pBitmap; // final thumbnail area + wxImage* m_pImage; // intermediate thumbnail area + +private: + // Initialize m_pImage using the current file name. + void LoadImageFromFile(); +}; + +#endif + +#if wxUSE_CHOICEDLG + +/** @class wxMultiChoiceProperty + @ingroup classes + Property that manages a value resulting from wxMultiChoiceDialog. Value is + array of strings. You can get value as array of choice values/indices by + calling wxMultiChoiceProperty::GetValueAsArrayInt(). + + <b>Supported special attributes:</b> + - "UserStringMode": If > 0, allow user to manually enter strings that are + not in the list of choices. If this value is 1, user strings are + preferably placed in front of valid choices. If value is 2, then those + strings will placed behind valid choices. +*/ +class WXDLLIMPEXP_PROPGRID wxMultiChoiceProperty : public wxPGProperty +{ + WX_PG_DECLARE_PROPERTY_CLASS(wxMultiChoiceProperty) +public: + + wxMultiChoiceProperty( const wxString& label, + const wxString& name, + const wxArrayString& strings, + const wxArrayString& value ); + wxMultiChoiceProperty( const wxString& label, + const wxString& name, + const wxPGChoices& choices, + const wxArrayString& value = wxArrayString() ); + + wxMultiChoiceProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + const wxArrayString& value = wxArrayString() ); + + virtual ~wxMultiChoiceProperty(); + + virtual void OnSetValue(); + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + virtual bool StringToValue(wxVariant& variant, + const wxString& text, + int argFlags = 0) const; + virtual bool OnEvent( wxPropertyGrid* propgrid, + wxWindow* primary, wxEvent& event ); + + wxArrayInt GetValueAsArrayInt() const + { + return m_choices.GetValuesForStrings(m_value.GetArrayString()); + } + +protected: + + void GenerateValueAsString( wxVariant& value, wxString* target ) const; + + // Returns translation of values into string indices. + wxArrayInt GetValueAsIndices() const; + + wxArrayString m_valueAsStrings; // Value as array of strings + + // Cache displayed text since generating it is relatively complicated. + wxString m_display; +}; + +#endif // wxUSE_CHOICEDLG + +// ----------------------------------------------------------------------- + +#if wxUSE_DATETIME + +/** @class wxDateProperty + @ingroup classes + Property representing wxDateTime. + + <b>Supported special attributes:</b> + - "DateFormat": Determines displayed date format. + - "PickerStyle": Determines window style used with wxDatePickerCtrl. + Default is wxDP_DEFAULT | wxDP_SHOWCENTURY. Using wxDP_ALLOWNONE + enables additional support for unspecified property value. +*/ +class WXDLLIMPEXP_PROPGRID wxDateProperty : public wxPGProperty +{ + WX_PG_DECLARE_PROPERTY_CLASS(wxDateProperty) +public: + + wxDateProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + const wxDateTime& value = wxDateTime() ); + virtual ~wxDateProperty(); + + virtual void OnSetValue(); + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + virtual bool StringToValue(wxVariant& variant, + const wxString& text, + int argFlags = 0) const; + + virtual bool DoSetAttribute( const wxString& name, wxVariant& value ); + + void SetFormat( const wxString& format ) + { + m_format = format; + } + + const wxString& GetFormat() const + { + return m_format; + } + + void SetDateValue( const wxDateTime& dt ) + { + //m_valueDateTime = dt; + m_value = dt; + } + + wxDateTime GetDateValue() const + { + //return m_valueDateTime; + return m_value; + } + + long GetDatePickerStyle() const + { + return m_dpStyle; + } + +protected: + wxString m_format; + long m_dpStyle; // DatePicker style + + static wxString ms_defaultDateFormat; + static wxString DetermineDefaultDateFormat( bool showCentury ); +}; + +#endif // wxUSE_DATETIME + +// ----------------------------------------------------------------------- + +#if wxUSE_SPINBTN + +// +// Implement an editor control that allows using wxSpinCtrl (actually, a +// combination of wxTextCtrl and wxSpinButton) to edit value of wxIntProperty +// and wxFloatProperty (and similar). +// +// Note that new editor classes needs to be registered before use. This can be +// accomplished using wxPGRegisterEditorClass macro, which is used for SpinCtrl +// in wxPropertyGridInterface::RegisterAdditionalEditors (see below). +// Registration can also be performed in a constructor of a property that is +// likely to require the editor in question. +// + + +#include "wx/spinbutt.h" +#include "wx/propgrid/editors.h" + + +// NOTE: Regardless that this class inherits from a working editor, it has +// all necessary methods to work independently. wxTextCtrl stuff is only +// used for event handling here. +class WXDLLIMPEXP_PROPGRID wxPGSpinCtrlEditor : public wxPGTextCtrlEditor +{ + DECLARE_DYNAMIC_CLASS(wxPGSpinCtrlEditor) +public: + virtual ~wxPGSpinCtrlEditor(); + + wxString GetName() const; + virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid, + wxPGProperty* property, + const wxPoint& pos, + const wxSize& size) const; + virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property, + wxWindow* wnd, wxEvent& event ) const; + +private: + mutable wxString m_tempString; +}; + +#endif // wxUSE_SPINBTN + +// ----------------------------------------------------------------------- + +#endif // wxUSE_PROPGRID + +#endif // _WX_PROPGRID_ADVPROPS_H_ diff --git a/wxmsw/include/wx-3.0/wx/propgrid/editors.h b/wxmsw/include/wx-3.0/wx/propgrid/editors.h new file mode 100644 index 00000000..2f64ce10 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/propgrid/editors.h @@ -0,0 +1,559 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/propgrid/editors.h +// Purpose: wxPropertyGrid editors +// Author: Jaakko Salli +// Modified by: +// Created: 2007-04-14 +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROPGRID_EDITORS_H_ +#define _WX_PROPGRID_EDITORS_H_ + +#include "wx/defs.h" + +#if wxUSE_PROPGRID + +class WXDLLIMPEXP_FWD_PROPGRID wxPGCell; +class WXDLLIMPEXP_FWD_PROPGRID wxPGProperty; +class WXDLLIMPEXP_FWD_PROPGRID wxPropertyGrid; + +// ----------------------------------------------------------------------- +// wxPGWindowList contains list of editor windows returned by CreateControls. + +class wxPGWindowList +{ +public: + wxPGWindowList() + { + m_primary = m_secondary = NULL; + } + + void SetSecondary( wxWindow* secondary ) { m_secondary = secondary; } + + wxWindow* m_primary; + wxWindow* m_secondary; + + wxPGWindowList( wxWindow* a ) + { + m_primary = a; + m_secondary = NULL; + }; + wxPGWindowList( wxWindow* a, wxWindow* b ) + { + m_primary = a; + m_secondary = b; + }; +}; + +// ----------------------------------------------------------------------- + +/** @class wxPGEditor + + Base class for custom wxPropertyGrid editors. + + @remarks + - Names of builtin property editors are: TextCtrl, Choice, + ComboBox, CheckBox, TextCtrlAndButton, and ChoiceAndButton. Additional + editors include SpinCtrl and DatePickerCtrl, but using them requires + calling wxPropertyGrid::RegisterAdditionalEditors() prior use. + + - Pointer to builtin editor is available as wxPGEditor_EditorName + (eg. wxPGEditor_TextCtrl). + + - To add new editor you need to register it first using static function + wxPropertyGrid::RegisterEditorClass(), with code like this: + @code + wxPGEditor *editorPointer = wxPropertyGrid::RegisterEditorClass( + new MyEditorClass(), "MyEditor"); + @endcode + After that, wxPropertyGrid will take ownership of the given object, but + you should still store editorPointer somewhere, so you can pass it to + wxPGProperty::SetEditor(), or return it from + wxPGEditor::DoGetEditorClass(). + + @library{wxpropgrid} + @category{propgrid} +*/ +class WXDLLIMPEXP_PROPGRID wxPGEditor : public wxObject +{ + DECLARE_ABSTRACT_CLASS(wxPGEditor) +public: + + /** Constructor. */ + wxPGEditor() + : wxObject() + { + m_clientData = NULL; + } + + /** Destructor. */ + virtual ~wxPGEditor(); + + /** + Returns pointer to the name of the editor. For example, + wxPGEditor_TextCtrl has name "TextCtrl". If you dont' need to access + your custom editor by string name, then you do not need to implement + this function. + */ + virtual wxString GetName() const; + + /** + Instantiates editor controls. + + @param propgrid + wxPropertyGrid to which the property belongs (use as parent for + control). + @param property + Property for which this method is called. + @param pos + Position, inside wxPropertyGrid, to create control(s) to. + @param size + Initial size for control(s). + + @remarks + - Primary control shall use id wxPG_SUBID1, and secondary (button) + control shall use wxPG_SUBID2. + - Unlike in previous version of wxPropertyGrid, it is no longer + necessary to call wxEvtHandler::Connect() for interesting editor + events. Instead, all events from control are now automatically + forwarded to wxPGEditor::OnEvent() and wxPGProperty::OnEvent(). + */ + virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid, + wxPGProperty* property, + const wxPoint& pos, + const wxSize& size) const = 0; + + /** Loads value from property to the control. */ + virtual void UpdateControl( wxPGProperty* property, + wxWindow* ctrl ) const = 0; + + /** + Used to get the renderer to draw the value with when the control is + hidden. + + Default implementation returns g_wxPGDefaultRenderer. + */ + //virtual wxPGCellRenderer* GetCellRenderer() const; + + /** Draws value for given property. + */ + virtual void DrawValue( wxDC& dc, + const wxRect& rect, + wxPGProperty* property, + const wxString& text ) const; + + /** Handles events. Returns true if value in control was modified + (see wxPGProperty::OnEvent for more information). + + @remarks wxPropertyGrid will automatically unfocus the editor when + wxEVT_TEXT_ENTER is received and when it results in + property value being modified. This happens regardless of + editor type (ie. behaviour is same for any wxTextCtrl and + wxComboBox based editor). + */ + virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property, + wxWindow* wnd_primary, wxEvent& event ) const = 0; + + /** Returns value from control, via parameter 'variant'. + Usually ends up calling property's StringToValue or IntToValue. + Returns true if value was different. + */ + virtual bool GetValueFromControl( wxVariant& variant, + wxPGProperty* property, + wxWindow* ctrl ) const; + + /** + Sets new appearance for the control. Default implementation + sets foreground colour, background colour, font, plus text + for wxTextCtrl and wxComboCtrl. + + @param appearance + New appearance to be applied. + + @param oldAppearance + Previously applied appearance. Used to detect which + control attributes need to be changed (e.g. so we only + change background colour if really needed). + + @param unspecified + @true if the new appearance represents an unspecified + property value. + */ + virtual void SetControlAppearance( wxPropertyGrid* pg, + wxPGProperty* property, + wxWindow* ctrl, + const wxPGCell& appearance, + const wxPGCell& oldAppearance, + bool unspecified ) const; + + /** + Sets value in control to unspecified. + */ + virtual void SetValueToUnspecified( wxPGProperty* property, + wxWindow* ctrl ) const; + + /** Sets control's value specifically from string. */ + virtual void SetControlStringValue( wxPGProperty* property, + wxWindow* ctrl, + const wxString& txt ) const; + + /** Sets control's value specifically from int (applies to choice etc.). */ + virtual void SetControlIntValue( wxPGProperty* property, + wxWindow* ctrl, + int value ) const; + + /** Inserts item to existing control. Index -1 means appending. + Default implementation does nothing. Returns index of item added. + */ + virtual int InsertItem( wxWindow* ctrl, + const wxString& label, + int index ) const; + + /** Deletes item from existing control. + Default implementation does nothing. + */ + virtual void DeleteItem( wxWindow* ctrl, int index ) const; + + /** Extra processing when control gains focus. For example, wxTextCtrl + based controls should select all text. + */ + virtual void OnFocus( wxPGProperty* property, wxWindow* wnd ) const; + + /** Returns true if control itself can contain the custom image. Default is + to return false. + */ + virtual bool CanContainCustomImage() const; + + // + // This member is public so scripting language bindings + // wrapper code can access it freely. + void* m_clientData; +}; + + +#define WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(EDITOR,CLASSNAME,BASECLASS) \ +IMPLEMENT_DYNAMIC_CLASS(CLASSNAME, BASECLASS) \ +wxString CLASSNAME::GetName() const \ +{ \ + return wxS(#EDITOR); \ +} \ +wxPGEditor* wxPGEditor_##EDITOR = NULL; + + +// +// Following are the built-in editor classes. +// + +class WXDLLIMPEXP_PROPGRID wxPGTextCtrlEditor : public wxPGEditor +{ + DECLARE_DYNAMIC_CLASS(wxPGTextCtrlEditor) +public: + wxPGTextCtrlEditor() {} + virtual ~wxPGTextCtrlEditor(); + + virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid, + wxPGProperty* property, + const wxPoint& pos, + const wxSize& size) const; + virtual void UpdateControl( wxPGProperty* property, + wxWindow* ctrl ) const; + virtual bool OnEvent( wxPropertyGrid* propgrid, + wxPGProperty* property, + wxWindow* primaryCtrl, + wxEvent& event ) const; + virtual bool GetValueFromControl( wxVariant& variant, + wxPGProperty* property, + wxWindow* ctrl ) const; + + virtual wxString GetName() const; + + //virtual wxPGCellRenderer* GetCellRenderer() const; + virtual void SetControlStringValue( wxPGProperty* property, + wxWindow* ctrl, + const wxString& txt ) const; + virtual void OnFocus( wxPGProperty* property, wxWindow* wnd ) const; + + // Provided so that, for example, ComboBox editor can use the same code + // (multiple inheritance would get way too messy). + static bool OnTextCtrlEvent( wxPropertyGrid* propgrid, + wxPGProperty* property, + wxWindow* ctrl, + wxEvent& event ); + + static bool GetTextCtrlValueFromControl( wxVariant& variant, + wxPGProperty* property, + wxWindow* ctrl ); + +}; + + +class WXDLLIMPEXP_PROPGRID wxPGChoiceEditor : public wxPGEditor +{ + DECLARE_DYNAMIC_CLASS(wxPGChoiceEditor) +public: + wxPGChoiceEditor() {} + virtual ~wxPGChoiceEditor(); + + virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid, + wxPGProperty* property, + const wxPoint& pos, + const wxSize& size) const; + virtual void UpdateControl( wxPGProperty* property, + wxWindow* ctrl ) const; + virtual bool OnEvent( wxPropertyGrid* propgrid, + wxPGProperty* property, + wxWindow* primaryCtrl, + wxEvent& event ) const; + virtual bool GetValueFromControl( wxVariant& variant, + wxPGProperty* property, + wxWindow* ctrl ) const; + virtual void SetValueToUnspecified( wxPGProperty* property, + wxWindow* ctrl ) const; + virtual wxString GetName() const; + + virtual void SetControlIntValue( wxPGProperty* property, + wxWindow* ctrl, + int value ) const; + virtual void SetControlStringValue( wxPGProperty* property, + wxWindow* ctrl, + const wxString& txt ) const; + + virtual int InsertItem( wxWindow* ctrl, + const wxString& label, + int index ) const; + virtual void DeleteItem( wxWindow* ctrl, int index ) const; + virtual bool CanContainCustomImage() const; + + // CreateControls calls this with CB_READONLY in extraStyle + wxWindow* CreateControlsBase( wxPropertyGrid* propgrid, + wxPGProperty* property, + const wxPoint& pos, + const wxSize& sz, + long extraStyle ) const; + +}; + + +class WXDLLIMPEXP_PROPGRID wxPGComboBoxEditor : public wxPGChoiceEditor +{ + DECLARE_DYNAMIC_CLASS(wxPGComboBoxEditor) +public: + wxPGComboBoxEditor() {} + virtual ~wxPGComboBoxEditor(); + + virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid, + wxPGProperty* property, + const wxPoint& pos, + const wxSize& size) const; + + virtual wxString GetName() const; + + virtual void UpdateControl( wxPGProperty* property, wxWindow* ctrl ) const; + + virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property, + wxWindow* ctrl, wxEvent& event ) const; + + virtual bool GetValueFromControl( wxVariant& variant, + wxPGProperty* property, + wxWindow* ctrl ) const; + + virtual void OnFocus( wxPGProperty* property, wxWindow* wnd ) const; + +}; + + +class WXDLLIMPEXP_PROPGRID wxPGChoiceAndButtonEditor : public wxPGChoiceEditor +{ +public: + wxPGChoiceAndButtonEditor() {} + virtual ~wxPGChoiceAndButtonEditor(); + virtual wxString GetName() const; + + virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid, + wxPGProperty* property, + const wxPoint& pos, + const wxSize& size) const; + + DECLARE_DYNAMIC_CLASS(wxPGChoiceAndButtonEditor) +}; + +class WXDLLIMPEXP_PROPGRID +wxPGTextCtrlAndButtonEditor : public wxPGTextCtrlEditor +{ +public: + wxPGTextCtrlAndButtonEditor() {} + virtual ~wxPGTextCtrlAndButtonEditor(); + virtual wxString GetName() const; + + virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid, + wxPGProperty* property, + const wxPoint& pos, + const wxSize& size) const; + + DECLARE_DYNAMIC_CLASS(wxPGTextCtrlAndButtonEditor) +}; + + +#if wxPG_INCLUDE_CHECKBOX + +// +// Use custom check box code instead of native control +// for cleaner (ie. more integrated) look. +// +class WXDLLIMPEXP_PROPGRID wxPGCheckBoxEditor : public wxPGEditor +{ + DECLARE_DYNAMIC_CLASS(wxPGCheckBoxEditor) +public: + wxPGCheckBoxEditor() {} + virtual ~wxPGCheckBoxEditor(); + + virtual wxString GetName() const; + virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid, + wxPGProperty* property, + const wxPoint& pos, + const wxSize& size) const; + virtual void UpdateControl( wxPGProperty* property, + wxWindow* ctrl ) const; + virtual bool OnEvent( wxPropertyGrid* propgrid, + wxPGProperty* property, + wxWindow* primaryCtrl, + wxEvent& event ) const; + virtual bool GetValueFromControl( wxVariant& variant, + wxPGProperty* property, + wxWindow* ctrl ) const; + virtual void SetValueToUnspecified( wxPGProperty* property, + wxWindow* ctrl ) const; + + virtual void DrawValue( wxDC& dc, + const wxRect& rect, + wxPGProperty* property, + const wxString& text ) const; + //virtual wxPGCellRenderer* GetCellRenderer() const; + + virtual void SetControlIntValue( wxPGProperty* property, + wxWindow* ctrl, + int value ) const; +}; + +#endif + + +// ----------------------------------------------------------------------- +// Editor class registeration macro (mostly for internal use) + +#define wxPGRegisterEditorClass(EDITOR) \ + if ( wxPGEditor_##EDITOR == NULL ) \ + { \ + wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( \ + new wxPG##EDITOR##Editor ); \ + } + +// ----------------------------------------------------------------------- + +/** @class wxPGEditorDialogAdapter + + Derive a class from this to adapt an existing editor dialog or function to + be used when editor button of a property is pushed. + + You only need to derive class and implement DoShowDialog() to create and + show the dialog, and finally submit the value returned by the dialog + via SetValue(). + + @library{wxpropgrid} + @category{propgrid} +*/ +class WXDLLIMPEXP_PROPGRID wxPGEditorDialogAdapter : public wxObject +{ + DECLARE_ABSTRACT_CLASS(wxPGEditorDialogAdapter) +public: + wxPGEditorDialogAdapter() + : wxObject() + { + m_clientData = NULL; + } + + virtual ~wxPGEditorDialogAdapter() { } + + bool ShowDialog( wxPropertyGrid* propGrid, wxPGProperty* property ); + + virtual bool DoShowDialog( wxPropertyGrid* propGrid, + wxPGProperty* property ) = 0; + + void SetValue( wxVariant value ) + { + m_value = value; + } + + /** + This method is typically only used if deriving class from existing + adapter with value conversion purposes. + */ + wxVariant& GetValue() { return m_value; } + + // + // This member is public so scripting language bindings + // wrapper code can access it freely. + void* m_clientData; + +private: + wxVariant m_value; +}; + +// ----------------------------------------------------------------------- + + +/** @class wxPGMultiButton + + This class can be used to have multiple buttons in a property editor. + You will need to create a new property editor class, override + CreateControls, and have it return wxPGMultiButton instance in + wxPGWindowList::SetSecondary(). +*/ +class WXDLLIMPEXP_PROPGRID wxPGMultiButton : public wxWindow +{ +public: + wxPGMultiButton( wxPropertyGrid* pg, const wxSize& sz ); + virtual ~wxPGMultiButton() {} + + wxWindow* GetButton( unsigned int i ) { return (wxWindow*) m_buttons[i]; } + const wxWindow* GetButton( unsigned int i ) const + { return (const wxWindow*) m_buttons[i]; } + + /** Utility function to be used in event handlers. + */ + int GetButtonId( unsigned int i ) const { return GetButton(i)->GetId(); } + + /** Returns number of buttons. + */ + unsigned int GetCount() const { return (unsigned int) m_buttons.size(); } + + void Add( const wxString& label, int id = -2 ); +#if wxUSE_BMPBUTTON + void Add( const wxBitmap& bitmap, int id = -2 ); +#endif + + wxSize GetPrimarySize() const + { + return wxSize(m_fullEditorSize.x - m_buttonsWidth, m_fullEditorSize.y); + } + + void Finalize( wxPropertyGrid* propGrid, const wxPoint& pos ); + +protected: + + void DoAddButton( wxWindow* button, const wxSize& sz ); + + int GenId( int id ) const; + + wxArrayPtrVoid m_buttons; + wxSize m_fullEditorSize; + int m_buttonsWidth; +}; + +// ----------------------------------------------------------------------- + +#endif // wxUSE_PROPGRID + +#endif // _WX_PROPGRID_EDITORS_H_ diff --git a/wxmsw/include/wx-3.0/wx/propgrid/manager.h b/wxmsw/include/wx-3.0/wx/propgrid/manager.h new file mode 100644 index 00000000..833254bc --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/propgrid/manager.h @@ -0,0 +1,768 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/propgrid/manager.h +// Purpose: wxPropertyGridManager +// Author: Jaakko Salli +// Modified by: +// Created: 2005-01-14 +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROPGRID_MANAGER_H_ +#define _WX_PROPGRID_MANAGER_H_ + +#include "wx/defs.h" + +#if wxUSE_PROPGRID + +#include "wx/propgrid/propgrid.h" + +#include "wx/dcclient.h" +#include "wx/scrolwin.h" +#include "wx/toolbar.h" +#include "wx/stattext.h" +#include "wx/button.h" +#include "wx/textctrl.h" +#include "wx/dialog.h" +#include "wx/headerctrl.h" + +// ----------------------------------------------------------------------- + +#ifndef SWIG +extern WXDLLIMPEXP_DATA_PROPGRID(const char) wxPropertyGridManagerNameStr[]; +#endif + +/** @class wxPropertyGridPage + + Holder of property grid page information. You can subclass this and + give instance in wxPropertyGridManager::AddPage. It inherits from + wxEvtHandler and can be used to process events specific to this + page (id of events will still be same as manager's). If you don't + want to use it to process all events of the page, you need to + return false in the derived wxPropertyGridPage::IsHandlingAllEvents. + + Please note that wxPropertyGridPage lacks many non-const property + manipulation functions found in wxPropertyGridManager. Please use + parent manager (m_manager member variable) when needed. + + Please note that most member functions are inherited and as such not + documented on this page. This means you will probably also want to read + wxPropertyGridInterface class reference. + + @section propgridpage_event_handling Event Handling + + wxPropertyGridPage receives events emitted by its wxPropertyGridManager, but + only those events that are specific to that page. If + wxPropertyGridPage::IsHandlingAllEvents returns false, then unhandled + events are sent to the manager's parent, as usual. + + See @ref propgrid_event_handling "wxPropertyGrid Event Handling" + for more information. + + @library{wxpropgrid} + @category{propgrid} +*/ +class WXDLLIMPEXP_PROPGRID wxPropertyGridPage : public wxEvtHandler, + public wxPropertyGridInterface, + public wxPropertyGridPageState +{ + friend class wxPropertyGridManager; + DECLARE_CLASS(wxPropertyGridPage) +public: + + wxPropertyGridPage(); + virtual ~wxPropertyGridPage(); + + /** Deletes all properties on page. + */ + virtual void Clear(); + + /** + Reduces column sizes to minimum possible that contents are still + visibly (naturally some margin space will be applied as well). + + @return + Minimum size for the page to still display everything. + + @remarks + This function only works properly if size of containing grid was + already fairly large. + + Note that you can also get calculated column widths by calling + GetColumnWidth() immediately after this function returns. + */ + wxSize FitColumns(); + + /** Returns page index in manager; + */ + inline int GetIndex() const; + + /** Returns x-coordinate position of splitter on a page. + */ + int GetSplitterPosition( int col = 0 ) const + { return GetStatePtr()->DoGetSplitterPosition(col); } + + /** Returns "root property". It does not have name, etc. and it is not + visible. It is only useful for accessing its children. + */ + wxPGProperty* GetRoot() const { return GetStatePtr()->DoGetRoot(); } + + /** Return pointer to contained property grid state. + */ + wxPropertyGridPageState* GetStatePtr() + { + return this; + } + + /** Return pointer to contained property grid state. + */ + const wxPropertyGridPageState* GetStatePtr() const + { + return this; + } + + /** + Returns id of the tool bar item that represents this page on + wxPropertyGridManager's wxToolBar. + */ + int GetToolId() const + { + return m_toolId; + } + + /** Do any member initialization in this method. + @remarks + - Called every time the page is added into a manager. + - You can add properties to the page here. + */ + virtual void Init() {} + + /** Return false here to indicate unhandled events should be + propagated to manager's parent, as normal. + */ + virtual bool IsHandlingAllEvents() const { return true; } + + /** Called every time page is about to be shown. + Useful, for instance, creating properties just-in-time. + */ + virtual void OnShow(); + + virtual void RefreshProperty( wxPGProperty* p ); + + /** Sets splitter position on page. + @remarks + Splitter position cannot exceed grid size, and therefore setting it + during form creation may fail as initial grid size is often smaller + than desired splitter position, especially when sizers are being used. + */ + void SetSplitterPosition( int splitterPos, int col = 0 ); + +protected: + + /** Propagate to other pages. + */ + virtual void DoSetSplitterPosition( int pos, + int splitterColumn = 0, + int flags = wxPG_SPLITTER_REFRESH ); + + /** Page label (may be referred as name in some parts of documentation). + Can be set in constructor, or passed in + wxPropertyGridManager::AddPage(), but *not* in both. + */ + wxString m_label; + + //virtual bool ProcessEvent( wxEvent& event ); + + wxPropertyGridManager* m_manager; + + // Toolbar tool id. Note that this is only valid when the tool bar + // exists. + int m_toolId; + +private: + bool m_isDefault; // is this base page object? + + DECLARE_EVENT_TABLE() +}; + +// ----------------------------------------------------------------------- + +#if wxUSE_HEADERCTRL +class wxPGHeaderCtrl; +#endif + + +/** @class wxPropertyGridManager + + wxPropertyGridManager is an efficient multi-page version of wxPropertyGrid, + which can optionally have toolbar for mode and page selection, and help + text box. + Use window flags to select components to include. + + @section propgridmanager_window_styles_ Window Styles + + See @ref propgrid_window_styles. + + @section propgridmanager_event_handling Event Handling + + See @ref propgrid_event_handling "wxPropertyGrid Event Handling" + for more information. + + @library{wxpropgrid} + @category{propgrid} +*/ +class WXDLLIMPEXP_PROPGRID + wxPropertyGridManager : public wxPanel, public wxPropertyGridInterface +{ + DECLARE_CLASS(wxPropertyGridManager) + friend class wxPropertyGridPage; +public: + +#ifndef SWIG + /** + Two step constructor. + Call Create when this constructor is called to build up the + wxPropertyGridManager. + */ + wxPropertyGridManager(); +#endif + + /** The default constructor. The styles to be used are styles valid for + the wxWindow. + @see @link wndflags Additional Window Styles@endlink + */ + wxPropertyGridManager( wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxPGMAN_DEFAULT_STYLE, + const wxString& name = wxPropertyGridManagerNameStr ); + + /** Destructor */ + virtual ~wxPropertyGridManager(); + + /** Creates new property page. Note that the first page is not created + automatically. + @param label + A label for the page. This may be shown as a toolbar tooltip etc. + @param bmp + Bitmap image for toolbar. If wxNullBitmap is used, then a built-in + default image is used. + @param pageObj + wxPropertyGridPage instance. Manager will take ownership of this object. + NULL indicates that a default page instance should be created. + + @return + Returns pointer to created page. + + @remarks + If toolbar is used, it is highly recommended that the pages are + added when the toolbar is not turned off using window style flag + switching. + */ + wxPropertyGridPage* AddPage( const wxString& label = wxEmptyString, + const wxBitmap& bmp = wxPG_NULL_BITMAP, + wxPropertyGridPage* pageObj = NULL ) + { + return InsertPage(-1, label, bmp, pageObj); + } + + /** Deletes all all properties and all pages. + */ + virtual void Clear(); + + /** Deletes all properties on given page. + */ + void ClearPage( int page ); + + /** Forces updating the value of property from the editor control. + Returns true if DoPropertyChanged was actually called. + */ + bool CommitChangesFromEditor( wxUint32 flags = 0 ) + { + return m_pPropGrid->CommitChangesFromEditor(flags); + } + + /** + Two step creation. + Whenever the control is created without any parameters, use Create to + actually create it. Don't access the control's public methods before + this is called. + @see @link wndflags Additional Window Styles@endlink + */ + bool Create( wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxPGMAN_DEFAULT_STYLE, + const wxString& name = wxPropertyGridManagerNameStr ); + + /** + Enables or disables (shows/hides) categories according to parameter + enable. + + WARNING: Not tested properly, use at your own risk. + */ + bool EnableCategories( bool enable ) + { + long fl = m_windowStyle | wxPG_HIDE_CATEGORIES; + if ( enable ) fl = m_windowStyle & ~(wxPG_HIDE_CATEGORIES); + SetWindowStyleFlag(fl); + return true; + } + + /** Selects page, scrolls and/or expands items to ensure that the + given item is visible. Returns true if something was actually done. + */ + bool EnsureVisible( wxPGPropArg id ); + + /** Returns number of columns on given page. By the default, + returns number of columns on current page. */ + int GetColumnCount( int page = -1 ) const; + + /** Returns height of the description text box. */ + int GetDescBoxHeight() const; + + /** Returns pointer to the contained wxPropertyGrid. This does not change + after wxPropertyGridManager has been created, so you can safely obtain + pointer once and use it for the entire lifetime of the instance. + */ + wxPropertyGrid* GetGrid() + { + wxASSERT(m_pPropGrid); + return m_pPropGrid; + }; + + const wxPropertyGrid* GetGrid() const + { + wxASSERT(m_pPropGrid); + return (const wxPropertyGrid*)m_pPropGrid; + }; + + /** Returns iterator class instance. + @remarks + Calling this method in wxPropertyGridManager causes run-time assertion + failure. Please only iterate through individual pages or use + CreateVIterator(). + */ + wxPropertyGridIterator GetIterator( int flags = wxPG_ITERATE_DEFAULT, + wxPGProperty* firstProp = NULL ) + { + wxFAIL_MSG( "Please only iterate through individual pages " + "or use CreateVIterator()" ); + return wxPropertyGridInterface::GetIterator( flags, firstProp ); + } + + wxPropertyGridConstIterator + GetIterator(int flags = wxPG_ITERATE_DEFAULT, + wxPGProperty* firstProp = NULL) const + { + wxFAIL_MSG( "Please only iterate through individual pages " + " or use CreateVIterator()" ); + return wxPropertyGridInterface::GetIterator( flags, firstProp ); + } + + /** Returns iterator class instance. + @remarks + Calling this method in wxPropertyGridManager causes run-time assertion + failure. Please only iterate through individual pages or use + CreateVIterator(). + */ + wxPropertyGridIterator GetIterator( int flags, int startPos ) + { + wxFAIL_MSG( "Please only iterate through individual pages " + "or use CreateVIterator()" ); + + return wxPropertyGridInterface::GetIterator( flags, startPos ); + } + + wxPropertyGridConstIterator GetIterator( int flags, int startPos ) const + { + wxFAIL_MSG( "Please only iterate through individual pages " + "or use CreateVIterator()" ); + return wxPropertyGridInterface::GetIterator( flags, startPos ); + } + + /** Similar to GetIterator, but instead returns wxPGVIterator instance, + which can be useful for forward-iterating through arbitrary property + containers. + */ + virtual wxPGVIterator GetVIterator( int flags ) const; + + /** Returns currently selected page. + */ + wxPropertyGridPage* GetCurrentPage() const + { + return GetPage(m_selPage); + } + + /** Returns page object for given page index. + */ + wxPropertyGridPage* GetPage( unsigned int ind ) const + { + return m_arrPages[ind]; + } + + /** Returns page object for given page name. + */ + wxPropertyGridPage* GetPage( const wxString& name ) const + { + return GetPage(GetPageByName(name)); + } + + /** + Returns index for a page name. + + If no match is found, wxNOT_FOUND is returned. + */ + int GetPageByName( const wxString& name ) const; + + /** Returns index for a relevant propertygrid state. + + If no match is found, wxNOT_FOUND is returned. + */ + int GetPageByState( const wxPropertyGridPageState* pstate ) const; + +protected: + /** Returns wxPropertyGridPageState of given page, current page's for -1. + */ + virtual wxPropertyGridPageState* GetPageState( int page ) const; + +public: + /** Returns number of managed pages. */ + size_t GetPageCount() const; + + /** Returns name of given page. */ + const wxString& GetPageName( int index ) const; + + /** Returns "root property" of the given page. It does not have name, etc. + and it is not visible. It is only useful for accessing its children. + */ + wxPGProperty* GetPageRoot( int index ) const; + + /** Returns index to currently selected page. */ + int GetSelectedPage() const { return m_selPage; } + + /** Alias for GetSelection(). */ + wxPGProperty* GetSelectedProperty() const + { + return GetSelection(); + } + + /** Shortcut for GetGrid()->GetSelection(). */ + wxPGProperty* GetSelection() const + { + return m_pPropGrid->GetSelection(); + } + + /** Returns a pointer to the toolbar currently associated with the + wxPropertyGridManager (if any). */ + wxToolBar* GetToolBar() const { return m_pToolbar; } + + /** Creates new property page. Note that the first page is not created + automatically. + @param index + Add to this position. -1 will add as the last item. + @param label + A label for the page. This may be shown as a toolbar tooltip etc. + @param bmp + Bitmap image for toolbar. If wxNullBitmap is used, then a built-in + default image is used. + @param pageObj + wxPropertyGridPage instance. Manager will take ownership of this object. + If NULL, default page object is constructed. + + @return + Returns pointer to created page. + */ + virtual wxPropertyGridPage* InsertPage( int index, + const wxString& label, + const wxBitmap& bmp = wxNullBitmap, + wxPropertyGridPage* pageObj = NULL ); + + /** + Returns true if any property on any page has been modified by the user. + */ + bool IsAnyModified() const; + + /** + Returns true if updating is frozen (ie Freeze() called but not yet + Thaw() ). + */ + bool IsFrozen() const { return m_pPropGrid->m_frozen > 0; } + + /** + Returns true if any property on given page has been modified by the + user. + */ + bool IsPageModified( size_t index ) const; + + /** + Returns true if property is selected. Since selection is page + based, this function checks every page in the manager. + */ + virtual bool IsPropertySelected( wxPGPropArg id ) const; + + virtual void Refresh( bool eraseBackground = true, + const wxRect* rect = (const wxRect*) NULL ); + + /** Removes a page. + @return + Returns false if it was not possible to remove page in question. + */ + virtual bool RemovePage( int page ); + + /** Select and displays a given page. + + @param index + Index of page being seleced. Can be -1 to select nothing. + */ + void SelectPage( int index ); + + /** Select and displays a given page (by label). */ + void SelectPage( const wxString& label ) + { + int index = GetPageByName(label); + wxCHECK_RET( index >= 0, wxT("No page with such name") ); + SelectPage( index ); + } + + /** Select and displays a given page. */ + void SelectPage( wxPropertyGridPage* ptr ) + { + SelectPage( GetPageByState(ptr) ); + } + + /** Select a property. */ + bool SelectProperty( wxPGPropArg id, bool focus = false ) + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false) + return p->GetParentState()->DoSelectProperty(p, focus); + } + + /** + Sets a column title. Default title for column 0 is "Property", + and "Value" for column 1. + + @remarks If header is not shown yet, then calling this + member function will make it visible. + */ + void SetColumnTitle( int idx, const wxString& title ); + + /** + Sets number of columns on given page (default is current page). + + @remarks If you use header, then you should always use this + member function to set the column count, instead of + ones present in wxPropertyGrid or wxPropertyGridPage. + */ + void SetColumnCount( int colCount, int page = -1 ); + + /** Sets label and text in description box. + */ + void SetDescription( const wxString& label, const wxString& content ); + + /** Sets y coordinate of the description box splitter. */ + void SetDescBoxHeight( int ht, bool refresh = true ); + + /** Moves splitter as left as possible, while still allowing all + labels to be shown in full. + @param subProps + If false, will still allow sub-properties (ie. properties which + parent is not root or category) to be cropped. + @param allPages + If true, takes labels on all pages into account. + */ + void SetSplitterLeft( bool subProps = false, bool allPages = true ); + + /** Moves splitter as left as possible on an individual page, while still allowing all + labels to be shown in full. + */ + void SetPageSplitterLeft(int page, bool subProps = false); + + /** + Sets splitter position on individual page. + + @remarks If you use header, then you should always use this + member function to set the splitter position, instead of + ones present in wxPropertyGrid or wxPropertyGridPage. + */ + void SetPageSplitterPosition( int page, int pos, int column = 0 ); + + /** + Sets splitter position for all pages. + + @remarks Splitter position cannot exceed grid size, and therefore + setting it during form creation may fail as initial grid + size is often smaller than desired splitter position, + especially when sizers are being used. + + If you use header, then you should always use this + member function to set the splitter position, instead of + ones present in wxPropertyGrid or wxPropertyGridPage. + */ + void SetSplitterPosition( int pos, int column = 0 ); + +#if wxUSE_HEADERCTRL + /** + Show or hide the property grid header control. It is hidden + by the default. + + @remarks Grid may look better if you use wxPG_NO_INTERNAL_BORDER + window style when showing a header. + */ + void ShowHeader(bool show = true); +#endif + +protected: + + // + // Subclassing helpers + // + + /** + Creates property grid for the manager. Reimplement in derived class to + use subclassed wxPropertyGrid. However, if you do this then you + must also use the two-step construction (ie. default constructor and + Create() instead of constructor with arguments) when creating the + manager. + */ + virtual wxPropertyGrid* CreatePropertyGrid() const; + +public: + virtual void RefreshProperty( wxPGProperty* p ); + + // + // Overridden functions - no documentation required. + // + + void SetId( wxWindowID winid ); + + virtual void Freeze(); + virtual void Thaw(); + virtual void SetExtraStyle ( long exStyle ); + virtual bool SetFont ( const wxFont& font ); + virtual void SetWindowStyleFlag ( long style ); + virtual bool Reparent( wxWindowBase *newParent ); + +protected: + virtual wxSize DoGetBestSize() const; + + // + // Event handlers + // + void OnMouseMove( wxMouseEvent &event ); + void OnMouseClick( wxMouseEvent &event ); + void OnMouseUp( wxMouseEvent &event ); + void OnMouseEntry( wxMouseEvent &event ); + + void OnPaint( wxPaintEvent &event ); + + void OnToolbarClick( wxCommandEvent &event ); + void OnResize( wxSizeEvent& event ); + void OnPropertyGridSelect( wxPropertyGridEvent& event ); + void OnPGColDrag( wxPropertyGridEvent& event ); + + + wxPropertyGrid* m_pPropGrid; + + wxVector<wxPropertyGridPage*> m_arrPages; + +#if wxUSE_TOOLBAR + wxToolBar* m_pToolbar; +#endif +#if wxUSE_HEADERCTRL + wxPGHeaderCtrl* m_pHeaderCtrl; +#endif + wxStaticText* m_pTxtHelpCaption; + wxStaticText* m_pTxtHelpContent; + + wxPropertyGridPage* m_emptyPage; + + wxArrayString m_columnLabels; + + long m_iFlags; + + // Selected page index. + int m_selPage; + + int m_width; + + int m_height; + + int m_extraHeight; + + int m_splitterY; + + int m_splitterHeight; + + int m_dragOffset; + + wxCursor m_cursorSizeNS; + + int m_nextDescBoxSize; + + // Toolbar tool ids for categorized and alphabetic mode selectors. + int m_categorizedModeToolId; + int m_alphabeticModeToolId; + + unsigned char m_dragStatus; + + unsigned char m_onSplitter; + + bool m_showHeader; + + virtual wxPGProperty* DoGetPropertyByName( const wxString& name ) const; + + /** Select and displays a given page. */ + virtual bool DoSelectPage( int index ); + + // Sets some members to defaults. + void Init1(); + + // Initializes some members. + void Init2( int style ); + +/*#ifdef __WXMSW__ + virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle) const; +#endif*/ + + virtual bool ProcessEvent( wxEvent& event ); + + /** Recalculates new positions for components, according to the + given size. + */ + void RecalculatePositions( int width, int height ); + + /** (Re)creates/destroys controls, according to the window style bits. */ + void RecreateControls(); + + void UpdateDescriptionBox( int new_splittery, int new_width, int new_height ); + + void RepaintDescBoxDecorations( wxDC& dc, + int newSplitterY, + int newWidth, + int newHeight ); + + void SetDescribedProperty( wxPGProperty* p ); + + // Reimplement these to handle "descboxheight" state item + virtual bool SetEditableStateItem( const wxString& name, wxVariant value ); + virtual wxVariant GetEditableStateItem( const wxString& name ) const; + +private: + DECLARE_EVENT_TABLE() +}; + +// ----------------------------------------------------------------------- + +inline int wxPropertyGridPage::GetIndex() const +{ + if ( !m_manager ) + return wxNOT_FOUND; + return m_manager->GetPageByState(this); +} + +// ----------------------------------------------------------------------- + +#endif // wxUSE_PROPGRID + +#endif // _WX_PROPGRID_MANAGER_H_ diff --git a/wxmsw/include/wx-3.0/wx/propgrid/property.h b/wxmsw/include/wx-3.0/wx/propgrid/property.h new file mode 100644 index 00000000..36356ddd --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/propgrid/property.h @@ -0,0 +1,2584 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/propgrid/property.h +// Purpose: wxPGProperty and related support classes +// Author: Jaakko Salli +// Modified by: +// Created: 2008-08-23 +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROPGRID_PROPERTY_H_ +#define _WX_PROPGRID_PROPERTY_H_ + +#include "wx/defs.h" + +#if wxUSE_PROPGRID + +#include "wx/propgrid/propgriddefs.h" + +// ----------------------------------------------------------------------- + +#define wxNullProperty ((wxPGProperty*)NULL) + + +/** @class wxPGPaintData + + Contains information relayed to property's OnCustomPaint. +*/ +struct wxPGPaintData +{ + /** wxPropertyGrid. */ + const wxPropertyGrid* m_parent; + + /** + Normally -1, otherwise index to drop-down list item that has to be + drawn. + */ + int m_choiceItem; + + /** Set to drawn width in OnCustomPaint (optional). */ + int m_drawnWidth; + + /** + In a measure item call, set this to the height of item at m_choiceItem + index. + */ + int m_drawnHeight; +}; + + +// space between vertical sides of a custom image +#define wxPG_CUSTOM_IMAGE_SPACINGY 1 + +// space between caption and selection rectangle, +#define wxPG_CAPRECTXMARGIN 2 + +// horizontally and vertically +#define wxPG_CAPRECTYMARGIN 1 + + +/** @class wxPGCellRenderer + + Base class for wxPropertyGrid cell renderers. +*/ +class WXDLLIMPEXP_PROPGRID wxPGCellRenderer : public wxObjectRefData +{ +public: + + wxPGCellRenderer() + : wxObjectRefData() { } + virtual ~wxPGCellRenderer() { } + + // Render flags + enum + { + // We are painting selected item + Selected = 0x00010000, + + // We are painting item in choice popup + ChoicePopup = 0x00020000, + + // We are rendering wxOwnerDrawnComboBox control + // (or other owner drawn control, but that is only + // officially supported one ATM). + Control = 0x00040000, + + // We are painting a disable property + Disabled = 0x00080000, + + // We are painting selected, disabled, or similar + // item that dictates fore- and background colours, + // overriding any cell values. + DontUseCellFgCol = 0x00100000, + DontUseCellBgCol = 0x00200000, + DontUseCellColours = DontUseCellFgCol | + DontUseCellBgCol + }; + + /** + Returns @true if rendered something in the foreground (text or + bitmap. + */ + virtual bool Render( wxDC& dc, + const wxRect& rect, + const wxPropertyGrid* propertyGrid, + wxPGProperty* property, + int column, + int item, + int flags ) const = 0; + + /** Returns size of the image in front of the editable area. + @remarks + If property is NULL, then this call is for a custom value. In that case + the item is index to wxPropertyGrid's custom values. + */ + virtual wxSize GetImageSize( const wxPGProperty* property, + int column, + int item ) const; + + /** Paints property category selection rectangle. + */ + virtual void DrawCaptionSelectionRect( wxDC& dc, + int x, int y, + int w, int h ) const; + + /** Utility to draw vertically centered text. + */ + void DrawText( wxDC& dc, + const wxRect& rect, + int imageWidth, + const wxString& text ) const; + + /** + Utility to draw editor's value, or vertically aligned text if editor is + NULL. + */ + void DrawEditorValue( wxDC& dc, const wxRect& rect, + int xOffset, const wxString& text, + wxPGProperty* property, + const wxPGEditor* editor ) const; + + /** Utility to render cell bitmap and set text colour plus bg brush + colour. + + @return Returns image width, which, for instance, can be passed to + DrawText. + */ + int PreDrawCell( wxDC& dc, + const wxRect& rect, + const wxPGCell& cell, + int flags ) const; + + /** + Utility to be called after drawing is done, to revert whatever + changes PreDrawCell() did. + + @param flags + Same as those passed to PreDrawCell(). + */ + void PostDrawCell( wxDC& dc, + const wxPropertyGrid* propGrid, + const wxPGCell& cell, + int flags ) const; +}; + + +/** + @class wxPGDefaultRenderer + + Default cell renderer, that can handles the common + scenarios. +*/ +class WXDLLIMPEXP_PROPGRID wxPGDefaultRenderer : public wxPGCellRenderer +{ +public: + virtual bool Render( wxDC& dc, + const wxRect& rect, + const wxPropertyGrid* propertyGrid, + wxPGProperty* property, + int column, + int item, + int flags ) const; + + virtual wxSize GetImageSize( const wxPGProperty* property, + int column, + int item ) const; + +protected: +}; + + +class WXDLLIMPEXP_PROPGRID wxPGCellData : public wxObjectRefData +{ + friend class wxPGCell; +public: + wxPGCellData(); + + void SetText( const wxString& text ) + { + m_text = text; + m_hasValidText = true; + } + void SetBitmap( const wxBitmap& bitmap ) { m_bitmap = bitmap; } + void SetFgCol( const wxColour& col ) { m_fgCol = col; } + void SetBgCol( const wxColour& col ) { m_bgCol = col; } + void SetFont( const wxFont& font ) { m_font = font; } + +protected: + virtual ~wxPGCellData() { } + + wxString m_text; + wxBitmap m_bitmap; + wxColour m_fgCol; + wxColour m_bgCol; + wxFont m_font; + + // True if m_text is valid and specified + bool m_hasValidText; +}; + + +/** + @class wxPGCell + + Base class for wxPropertyGrid cell information. +*/ +class WXDLLIMPEXP_PROPGRID wxPGCell : public wxObject +{ +public: + wxPGCell(); + wxPGCell(const wxPGCell& other) + : wxObject(other) + { + } + + wxPGCell( const wxString& text, + const wxBitmap& bitmap = wxNullBitmap, + const wxColour& fgCol = wxNullColour, + const wxColour& bgCol = wxNullColour ); + + virtual ~wxPGCell() { } + + wxPGCellData* GetData() + { + return (wxPGCellData*) m_refData; + } + + const wxPGCellData* GetData() const + { + return (const wxPGCellData*) m_refData; + } + + bool HasText() const + { + return (m_refData && GetData()->m_hasValidText); + } + + /** + Sets empty but valid data to this cell object. + */ + void SetEmptyData(); + + /** + Merges valid data from srcCell into this. + */ + void MergeFrom( const wxPGCell& srcCell ); + + void SetText( const wxString& text ); + void SetBitmap( const wxBitmap& bitmap ); + void SetFgCol( const wxColour& col ); + + /** + Sets font of the cell. + + @remarks Because wxPropertyGrid does not support rows of + different height, it makes little sense to change + size of the font. Therefore it is recommended + to use return value of wxPropertyGrid::GetFont() + or wxPropertyGrid::GetCaptionFont() as a basis + for the font that, after modifications, is passed + to this member function. + */ + void SetFont( const wxFont& font ); + + void SetBgCol( const wxColour& col ); + + const wxString& GetText() const { return GetData()->m_text; } + const wxBitmap& GetBitmap() const { return GetData()->m_bitmap; } + const wxColour& GetFgCol() const { return GetData()->m_fgCol; } + + /** + Returns font of the cell. If no specific font is set for this + cell, then the font will be invalid. + */ + const wxFont& GetFont() const { return GetData()->m_font; } + + const wxColour& GetBgCol() const { return GetData()->m_bgCol; } + + wxPGCell& operator=( const wxPGCell& other ) + { + if ( this != &other ) + { + Ref(other); + } + return *this; + } + + // Used mostly internally to figure out if this cell is supposed + // to have default values when attached to a grid. + bool IsInvalid() const + { + return ( m_refData == NULL ); + } + +private: + virtual wxObjectRefData *CreateRefData() const + { return new wxPGCellData(); } + + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; +}; + +// ----------------------------------------------------------------------- + +/** @class wxPGAttributeStorage + + wxPGAttributeStorage is somewhat optimized storage for + key=variant pairs (ie. a map). +*/ +class WXDLLIMPEXP_PROPGRID wxPGAttributeStorage +{ +public: + wxPGAttributeStorage(); + ~wxPGAttributeStorage(); + + void Set( const wxString& name, const wxVariant& value ); + unsigned int GetCount() const { return (unsigned int) m_map.size(); } + wxVariant FindValue( const wxString& name ) const + { + wxPGHashMapS2P::const_iterator it = m_map.find(name); + if ( it != m_map.end() ) + { + wxVariantData* data = (wxVariantData*) it->second; + data->IncRef(); + return wxVariant(data, it->first); + } + return wxVariant(); + } + + typedef wxPGHashMapS2P::const_iterator const_iterator; + const_iterator StartIteration() const + { + return m_map.begin(); + } + bool GetNext( const_iterator& it, wxVariant& variant ) const + { + if ( it == m_map.end() ) + return false; + + wxVariantData* data = (wxVariantData*) it->second; + data->IncRef(); + variant.SetData(data); + variant.SetName(it->first); + ++it; + return true; + } + +protected: + wxPGHashMapS2P m_map; +}; + + +// ----------------------------------------------------------------------- + +/** @section propgrid_propflags wxPGProperty Flags + @{ +*/ + +enum wxPGPropertyFlags +{ + +/** Indicates bold font. +*/ +wxPG_PROP_MODIFIED = 0x0001, + +/** Disables ('greyed' text and editor does not activate) property. +*/ +wxPG_PROP_DISABLED = 0x0002, + +/** Hider button will hide this property. +*/ +wxPG_PROP_HIDDEN = 0x0004, + +/** This property has custom paint image just in front of its value. + If property only draws custom images into a popup list, then this + flag should not be set. +*/ +wxPG_PROP_CUSTOMIMAGE = 0x0008, + +/** Do not create text based editor for this property (but button-triggered + dialog and choice are ok). +*/ +wxPG_PROP_NOEDITOR = 0x0010, + +/** Property is collapsed, ie. it's children are hidden. +*/ +wxPG_PROP_COLLAPSED = 0x0020, + +/** + If property is selected, then indicates that validation failed for pending + value. + + If property is not selected, that indicates that the actual property + value has failed validation (NB: this behaviour is not currently supported, + but may be used in future). +*/ +wxPG_PROP_INVALID_VALUE = 0x0040, + +// 0x0080, + +/** Switched via SetWasModified(). Temporary flag - only used when + setting/changing property value. +*/ +wxPG_PROP_WAS_MODIFIED = 0x0200, + +/** + If set, then child properties (if any) are private, and should be + "invisible" to the application. +*/ +wxPG_PROP_AGGREGATE = 0x0400, + +/** If set, then child properties (if any) are copies and should not + be deleted in dtor. +*/ +wxPG_PROP_CHILDREN_ARE_COPIES = 0x0800, + +/** + Classifies this item as a non-category. + + Used for faster item type identification. +*/ +wxPG_PROP_PROPERTY = 0x1000, + +/** + Classifies this item as a category. + + Used for faster item type identification. +*/ +wxPG_PROP_CATEGORY = 0x2000, + +/** Classifies this item as a property that has children, but is not aggregate + (ie children are not private). +*/ +wxPG_PROP_MISC_PARENT = 0x4000, + +/** Property is read-only. Editor is still created for wxTextCtrl-based + property editors. For others, editor is not usually created because + they do implement wxTE_READONLY style or equivalent. +*/ +wxPG_PROP_READONLY = 0x8000, + +// +// NB: FLAGS ABOVE 0x8000 CANNOT BE USED WITH PROPERTY ITERATORS +// + +/** Property's value is composed from values of child properties. + @remarks + This flag cannot be used with property iterators. +*/ +wxPG_PROP_COMPOSED_VALUE = 0x00010000, + +/** Common value of property is selectable in editor. + @remarks + This flag cannot be used with property iterators. +*/ +wxPG_PROP_USES_COMMON_VALUE = 0x00020000, + +/** Property can be set to unspecified value via editor. + Currently, this applies to following properties: + - wxIntProperty, wxUIntProperty, wxFloatProperty, wxEditEnumProperty: + Clear the text field + + @remarks + This flag cannot be used with property iterators. + + @see wxPGProperty::SetAutoUnspecified() +*/ +wxPG_PROP_AUTO_UNSPECIFIED = 0x00040000, + +/** Indicates the bit useable by derived properties. +*/ +wxPG_PROP_CLASS_SPECIFIC_1 = 0x00080000, + +/** Indicates the bit useable by derived properties. +*/ +wxPG_PROP_CLASS_SPECIFIC_2 = 0x00100000, + +/** Indicates that the property is being deleted and should be ignored. +*/ +wxPG_PROP_BEING_DELETED = 0x00200000 + +}; + +/** Topmost flag. +*/ +#define wxPG_PROP_MAX wxPG_PROP_AUTO_UNSPECIFIED + +/** Property with children must have one of these set, otherwise iterators + will not work correctly. + Code should automatically take care of this, however. +*/ +#define wxPG_PROP_PARENTAL_FLAGS \ + ((wxPGPropertyFlags)(wxPG_PROP_AGGREGATE | \ + wxPG_PROP_CATEGORY | \ + wxPG_PROP_MISC_PARENT)) + +/** @} +*/ + +// Combination of flags that can be stored by GetFlagsAsString +#define wxPG_STRING_STORED_FLAGS \ + (wxPG_PROP_DISABLED|wxPG_PROP_HIDDEN|wxPG_PROP_NOEDITOR|wxPG_PROP_COLLAPSED) + +// ----------------------------------------------------------------------- + +/** + @section propgrid_property_attributes wxPropertyGrid Property Attribute + Identifiers. + + wxPGProperty::SetAttribute() and + wxPropertyGridInterface::SetPropertyAttribute() accept one of these as + attribute name argument. + + You can use strings instead of constants. However, some of these + constants are redefined to use cached strings which may reduce + your binary size by some amount. + + @{ +*/ + +/** Set default value for property. +*/ +#define wxPG_ATTR_DEFAULT_VALUE wxS("DefaultValue") + +/** Universal, int or double. Minimum value for numeric properties. +*/ +#define wxPG_ATTR_MIN wxS("Min") + +/** Universal, int or double. Maximum value for numeric properties. +*/ +#define wxPG_ATTR_MAX wxS("Max") + +/** Universal, string. When set, will be shown as text after the displayed + text value. Alternatively, if third column is enabled, text will be shown + there (for any type of property). +*/ +#define wxPG_ATTR_UNITS wxS("Units") + +/** When set, will be shown as 'greyed' text in property's value cell when + the actual displayed value is blank. +*/ +#define wxPG_ATTR_HINT wxS("Hint") + +#if wxPG_COMPATIBILITY_1_4 +/** + @deprecated Use "Hint" (wxPG_ATTR_HINT) instead. +*/ +#define wxPG_ATTR_INLINE_HELP wxS("InlineHelp") +#endif + +/** Universal, wxArrayString. Set to enable auto-completion in any + wxTextCtrl-based property editor. +*/ +#define wxPG_ATTR_AUTOCOMPLETE wxS("AutoComplete") + +/** wxBoolProperty and wxFlagsProperty specific. Value type is bool. + Default value is False. + + When set to True, bool property will use check box instead of a + combo box as its editor control. If you set this attribute + for a wxFlagsProperty, it is automatically applied to child + bool properties. +*/ +#define wxPG_BOOL_USE_CHECKBOX wxS("UseCheckbox") + +/** wxBoolProperty and wxFlagsProperty specific. Value type is bool. + Default value is False. + + Set to True for the bool property to cycle value on double click + (instead of showing the popup listbox). If you set this attribute + for a wxFlagsProperty, it is automatically applied to child + bool properties. +*/ +#define wxPG_BOOL_USE_DOUBLE_CLICK_CYCLING wxS("UseDClickCycling") + +/** + wxFloatProperty (and similar) specific, int, default -1. + + Sets the (max) precision used when floating point value is rendered as + text. The default -1 means infinite precision. +*/ +#define wxPG_FLOAT_PRECISION wxS("Precision") + +/** + The text will be echoed as asterisks (wxTE_PASSWORD will be passed to + textctrl etc). +*/ +#define wxPG_STRING_PASSWORD wxS("Password") + +/** Define base used by a wxUIntProperty. Valid constants are + wxPG_BASE_OCT, wxPG_BASE_DEC, wxPG_BASE_HEX and wxPG_BASE_HEXL + (lowercase characters). +*/ +#define wxPG_UINT_BASE wxS("Base") + +/** Define prefix rendered to wxUIntProperty. Accepted constants + wxPG_PREFIX_NONE, wxPG_PREFIX_0x, and wxPG_PREFIX_DOLLAR_SIGN. + <b>Note:</b> Only wxPG_PREFIX_NONE works with Decimal and Octal + numbers. +*/ +#define wxPG_UINT_PREFIX wxS("Prefix") + +/** + wxFileProperty/wxImageFileProperty specific, wxChar*, default is + detected/varies. + Sets the wildcard used in the triggered wxFileDialog. Format is the same. +*/ +#define wxPG_FILE_WILDCARD wxS("Wildcard") + +/** wxFileProperty/wxImageFileProperty specific, int, default 1. + When 0, only the file name is shown (i.e. drive and directory are hidden). +*/ +#define wxPG_FILE_SHOW_FULL_PATH wxS("ShowFullPath") + +/** Specific to wxFileProperty and derived properties, wxString, default empty. + If set, then the filename is shown relative to the given path string. +*/ +#define wxPG_FILE_SHOW_RELATIVE_PATH wxS("ShowRelativePath") + +/** + Specific to wxFileProperty and derived properties, wxString, default is + empty. + + Sets the initial path of where to look for files. +*/ +#define wxPG_FILE_INITIAL_PATH wxS("InitialPath") + +/** Specific to wxFileProperty and derivatives, wxString, default is empty. + Sets a specific title for the dir dialog. +*/ +#define wxPG_FILE_DIALOG_TITLE wxS("DialogTitle") + +/** Specific to wxFileProperty and derivatives, long, default is 0. + Sets a specific wxFileDialog style for the file dialog. +*/ +#define wxPG_FILE_DIALOG_STYLE wxS("DialogStyle") + +/** Specific to wxDirProperty, wxString, default is empty. + Sets a specific message for the dir dialog. +*/ +#define wxPG_DIR_DIALOG_MESSAGE wxS("DialogMessage") + +/** + wxArrayStringProperty's string delimiter character. If this is a quotation + mark or hyphen, then strings will be quoted instead (with given + character). + + Default delimiter is quotation mark. +*/ +#define wxPG_ARRAY_DELIMITER wxS("Delimiter") + +/** Sets displayed date format for wxDateProperty. +*/ +#define wxPG_DATE_FORMAT wxS("DateFormat") + +/** Sets wxDatePickerCtrl window style used with wxDateProperty. Default + is wxDP_DEFAULT | wxDP_SHOWCENTURY. +*/ +#define wxPG_DATE_PICKER_STYLE wxS("PickerStyle") + +/** SpinCtrl editor, int or double. How much number changes when button is + pressed (or up/down on keyboard). +*/ +#define wxPG_ATTR_SPINCTRL_STEP wxS("Step") + +/** SpinCtrl editor, bool. If true, value wraps at Min/Max. +*/ +#define wxPG_ATTR_SPINCTRL_WRAP wxS("Wrap") + +/** + wxMultiChoiceProperty, int. + If 0, no user strings allowed. If 1, user strings appear before list + strings. If 2, user strings appear after list string. +*/ +#define wxPG_ATTR_MULTICHOICE_USERSTRINGMODE wxS("UserStringMode") + +/** + wxColourProperty and its kind, int, default 1. + + Setting this attribute to 0 hides custom colour from property's list of + choices. +*/ +#define wxPG_COLOUR_ALLOW_CUSTOM wxS("AllowCustom") + +/** + wxColourProperty and its kind: Set to True in order to support editing + alpha colour component. +*/ +#define wxPG_COLOUR_HAS_ALPHA wxS("HasAlpha") + +/** @} +*/ + +// Redefine attribute macros to use cached strings +#undef wxPG_ATTR_DEFAULT_VALUE +#define wxPG_ATTR_DEFAULT_VALUE wxPGGlobalVars->m_strDefaultValue +#undef wxPG_ATTR_MIN +#define wxPG_ATTR_MIN wxPGGlobalVars->m_strMin +#undef wxPG_ATTR_MAX +#define wxPG_ATTR_MAX wxPGGlobalVars->m_strMax +#undef wxPG_ATTR_UNITS +#define wxPG_ATTR_UNITS wxPGGlobalVars->m_strUnits +#undef wxPG_ATTR_HINT +#define wxPG_ATTR_HINT wxPGGlobalVars->m_strHint +#if wxPG_COMPATIBILITY_1_4 +#undef wxPG_ATTR_INLINE_HELP +#define wxPG_ATTR_INLINE_HELP wxPGGlobalVars->m_strInlineHelp +#endif + +// ----------------------------------------------------------------------- + +/** @class wxPGChoiceEntry + Data of a single wxPGChoices choice. +*/ +class WXDLLIMPEXP_PROPGRID wxPGChoiceEntry : public wxPGCell +{ +public: + wxPGChoiceEntry(); + wxPGChoiceEntry(const wxPGChoiceEntry& other) + : wxPGCell(other) + { + m_value = other.m_value; + } + wxPGChoiceEntry( const wxString& label, + int value = wxPG_INVALID_VALUE ) + : wxPGCell(), m_value(value) + { + SetText(label); + } + + virtual ~wxPGChoiceEntry() { } + + void SetValue( int value ) { m_value = value; } + int GetValue() const { return m_value; } + + wxPGChoiceEntry& operator=( const wxPGChoiceEntry& other ) + { + if ( this != &other ) + { + Ref(other); + } + m_value = other.m_value; + return *this; + } + +protected: + int m_value; +}; + + +typedef void* wxPGChoicesId; + +class WXDLLIMPEXP_PROPGRID wxPGChoicesData : public wxObjectRefData +{ + friend class wxPGChoices; +public: + // Constructor sets m_refCount to 1. + wxPGChoicesData(); + + void CopyDataFrom( wxPGChoicesData* data ); + + wxPGChoiceEntry& Insert( int index, const wxPGChoiceEntry& item ); + + // Delete all entries + void Clear(); + + unsigned int GetCount() const + { + return (unsigned int) m_items.size(); + } + + const wxPGChoiceEntry& Item( unsigned int i ) const + { + wxASSERT_MSG( i < GetCount(), "invalid index" ); + return m_items[i]; + } + + wxPGChoiceEntry& Item( unsigned int i ) + { + wxASSERT_MSG( i < GetCount(), "invalid index" ); + return m_items[i]; + } + +private: + wxVector<wxPGChoiceEntry> m_items; + + virtual ~wxPGChoicesData(); +}; + +#define wxPGChoicesEmptyData ((wxPGChoicesData*)NULL) + + +/** @class wxPGChoices + + Helper class for managing choices of wxPropertyGrid properties. + Each entry can have label, value, bitmap, text colour, and background + colour. + + wxPGChoices uses reference counting, similar to other wxWidgets classes. + This means that assignment operator and copy constructor only copy the + reference and not the actual data. Use Copy() member function to create a + real copy. + + @remarks If you do not specify value for entry, index is used. + + @library{wxpropgrid} + @category{propgrid} +*/ +class WXDLLIMPEXP_PROPGRID wxPGChoices +{ +public: + typedef long ValArrItem; + + /** Default constructor. */ + wxPGChoices() + { + Init(); + } + + /** + Copy constructor, uses reference counting. To create a real copy, + use Copy() member function instead. + */ + wxPGChoices( const wxPGChoices& a ) + { + if ( a.m_data != wxPGChoicesEmptyData ) + { + m_data = a.m_data; + m_data->IncRef(); + } + } + + /** + Constructor. + + @param labels + Labels for choices + + @param values + Values for choices. If NULL, indexes are used. + */ + wxPGChoices( const wxChar* const* labels, const long* values = NULL ) + { + Init(); + Set(labels,values); + } + + /** + Constructor. + + @param labels + Labels for choices + + @param values + Values for choices. If empty, indexes are used. + */ + wxPGChoices( const wxArrayString& labels, + const wxArrayInt& values = wxArrayInt() ) + { + Init(); + Set(labels,values); + } + + /** Simple interface constructor. */ + wxPGChoices( wxPGChoicesData* data ) + { + wxASSERT(data); + m_data = data; + data->IncRef(); + } + + /** Destructor. */ + ~wxPGChoices() + { + Free(); + } + + /** + Adds to current. + + If did not have own copies, creates them now. If was empty, identical + to set except that creates copies. + + @param labels + Labels for added choices. + + @param values + Values for added choices. If empty, relevant entry indexes are used. + */ + void Add( const wxChar* const* labels, const ValArrItem* values = NULL ); + + /** Version that works with wxArrayString and wxArrayInt. */ + void Add( const wxArrayString& arr, const wxArrayInt& arrint = wxArrayInt() ); + + /** + Adds a single choice. + + @param label + Label for added choice. + + @param value + Value for added choice. If unspecified, index is used. + */ + wxPGChoiceEntry& Add( const wxString& label, + int value = wxPG_INVALID_VALUE ); + + /** Adds a single item, with bitmap. */ + wxPGChoiceEntry& Add( const wxString& label, + const wxBitmap& bitmap, + int value = wxPG_INVALID_VALUE ); + + /** Adds a single item with full entry information. */ + wxPGChoiceEntry& Add( const wxPGChoiceEntry& entry ) + { + return Insert(entry, -1); + } + + /** Adds single item. */ + wxPGChoiceEntry& AddAsSorted( const wxString& label, + int value = wxPG_INVALID_VALUE ); + + /** + Assigns choices data, using reference counting. To create a real copy, + use Copy() member function instead. + */ + void Assign( const wxPGChoices& a ) + { + AssignData(a.m_data); + } + + void AssignData( wxPGChoicesData* data ); + + /** Delete all choices. */ + void Clear(); + + /** + Returns a real copy of the choices. + */ + wxPGChoices Copy() const + { + wxPGChoices dst; + dst.EnsureData(); + dst.m_data->CopyDataFrom(m_data); + return dst; + } + + void EnsureData() + { + if ( m_data == wxPGChoicesEmptyData ) + m_data = new wxPGChoicesData(); + } + + /** Gets a unsigned number identifying this list. */ + wxPGChoicesId GetId() const { return (wxPGChoicesId) m_data; } + + const wxString& GetLabel( unsigned int ind ) const + { + return Item(ind).GetText(); + } + + unsigned int GetCount () const + { + if ( !m_data ) + return 0; + + return m_data->GetCount(); + } + + int GetValue( unsigned int ind ) const { return Item(ind).GetValue(); } + + /** Returns array of values matching the given strings. Unmatching strings + result in wxPG_INVALID_VALUE entry in array. + */ + wxArrayInt GetValuesForStrings( const wxArrayString& strings ) const; + + /** Returns array of indices matching given strings. Unmatching strings + are added to 'unmatched', if not NULL. + */ + wxArrayInt GetIndicesForStrings( const wxArrayString& strings, + wxArrayString* unmatched = NULL ) const; + + int Index( const wxString& str ) const; + int Index( int val ) const; + + /** Inserts single item. */ + wxPGChoiceEntry& Insert( const wxString& label, + int index, + int value = wxPG_INVALID_VALUE ); + + /** Inserts a single item with full entry information. */ + wxPGChoiceEntry& Insert( const wxPGChoiceEntry& entry, int index ); + + /** Returns false if this is a constant empty set of choices, + which should not be modified. + */ + bool IsOk() const + { + return ( m_data != wxPGChoicesEmptyData ); + } + + const wxPGChoiceEntry& Item( unsigned int i ) const + { + wxASSERT( IsOk() ); + return m_data->Item(i); + } + + wxPGChoiceEntry& Item( unsigned int i ) + { + wxASSERT( IsOk() ); + return m_data->Item(i); + } + + /** Removes count items starting at position nIndex. */ + void RemoveAt(size_t nIndex, size_t count = 1); + + /** Does not create copies for itself. + TODO: Deprecate. + */ + void Set( const wxChar* const* labels, const long* values = NULL ) + { + Free(); + Add(labels,values); + } + + /** Version that works with wxArrayString and wxArrayInt. */ + void Set( const wxArrayString& labels, + const wxArrayInt& values = wxArrayInt() ) + { + Free(); + if ( &values ) + Add(labels,values); + else + Add(labels); + } + + // Creates exclusive copy of current choices + void AllocExclusive(); + + // Returns data, increases refcount. + wxPGChoicesData* GetData() + { + wxASSERT( m_data->GetRefCount() != -1 ); + m_data->IncRef(); + return m_data; + } + + // Returns plain data ptr - no refcounting stuff is done. + wxPGChoicesData* GetDataPtr() const { return m_data; } + + // Changes ownership of data to you. + wxPGChoicesData* ExtractData() + { + wxPGChoicesData* data = m_data; + m_data = wxPGChoicesEmptyData; + return data; + } + + wxArrayString GetLabels() const; + + void operator= (const wxPGChoices& a) + { + if (this != &a) + AssignData(a.m_data); + } + + wxPGChoiceEntry& operator[](unsigned int i) + { + return Item(i); + } + + const wxPGChoiceEntry& operator[](unsigned int i) const + { + return Item(i); + } + +protected: + wxPGChoicesData* m_data; + + void Init(); + void Free(); +}; + +// ----------------------------------------------------------------------- + +/** @class wxPGProperty + + wxPGProperty is base class for all wxPropertyGrid properties. + + NB: Full class overview is now only present in + interface/wx/propgrid/property.h. + + @library{wxpropgrid} + @category{propgrid} +*/ +class WXDLLIMPEXP_PROPGRID wxPGProperty : public wxObject +{ + friend class wxPropertyGrid; + friend class wxPropertyGridInterface; + friend class wxPropertyGridPageState; + friend class wxPropertyGridPopulator; + friend class wxStringProperty; // Proper "<composed>" support requires this + + DECLARE_ABSTRACT_CLASS(wxPGProperty) +public: + typedef wxUint32 FlagType; + + /** + Default constructor. + */ + wxPGProperty(); + + /** + Constructor. + + All non-abstract property classes should have a constructor with + the same first two arguments as this one. + */ + wxPGProperty( const wxString& label, const wxString& name ); + + /** + Virtual destructor. + It is customary for derived properties to implement this. + */ + virtual ~wxPGProperty(); + + /** This virtual function is called after m_value has been set. + + @remarks + - If m_value was set to Null variant (ie. unspecified value), + OnSetValue() will not be called. + - m_value may be of any variant type. Typically properties internally + support only one variant type, and as such OnSetValue() provides a + good opportunity to convert + supported values into internal type. + - Default implementation does nothing. + */ + virtual void OnSetValue(); + + /** Override this to return something else than m_value as the value. + */ + virtual wxVariant DoGetValue() const { return m_value; } + + /** Implement this function in derived class to check the value. + Return true if it is ok. Returning false prevents property change events + from occurring. + + @remarks + - Default implementation always returns true. + */ + virtual bool ValidateValue( wxVariant& value, + wxPGValidationInfo& validationInfo ) const; + + /** + Converts text into wxVariant value appropriate for this property. + + @param variant + On function entry this is the old value (should not be wxNullVariant + in normal cases). Translated value must be assigned back to it. + + @param text + Text to be translated into variant. + + @param argFlags + If wxPG_FULL_VALUE is set, returns complete, storable value instead + of displayable one (they may be different). + If wxPG_COMPOSITE_FRAGMENT is set, text is interpreted as a part of + composite property string value (as generated by ValueToString() + called with this same flag). + + @return Returns @true if resulting wxVariant value was different. + + @remarks Default implementation converts semicolon delimited tokens into + child values. Only works for properties with children. + + You might want to take into account that m_value is Null variant + if property value is unspecified (which is usually only case if + you explicitly enabled that sort behaviour). + */ + virtual bool StringToValue( wxVariant& variant, + const wxString& text, + int argFlags = 0 ) const; + + /** + Converts integer (possibly a choice selection) into wxVariant value + appropriate for this property. + + @param variant + On function entry this is the old value (should not be wxNullVariant + in normal cases). Translated value must be assigned back to it. + + @param number + Integer to be translated into variant. + + @param argFlags + If wxPG_FULL_VALUE is set, returns complete, storable value instead + of displayable one. + + @return Returns @true if resulting wxVariant value was different. + + @remarks + - If property is not supposed to use choice or spinctrl or other editor + with int-based value, it is not necessary to implement this method. + - Default implementation simply assign given int to m_value. + - If property uses choice control, and displays a dialog on some choice + items, then it is preferred to display that dialog in IntToValue + instead of OnEvent. + - You might want to take into account that m_value is Null variant if + property value is unspecified (which is usually only case if you + explicitly enabled that sort behaviour). + */ + virtual bool IntToValue( wxVariant& value, + int number, + int argFlags = 0 ) const; + + /** + Converts property value into a text representation. + + @param value + Value to be converted. + + @param argFlags + If 0 (default value), then displayed string is returned. + If wxPG_FULL_VALUE is set, returns complete, storable string value + instead of displayable. If wxPG_EDITABLE_VALUE is set, returns + string value that must be editable in textctrl. If + wxPG_COMPOSITE_FRAGMENT is set, returns text that is appropriate to + display as a part of string property's composite text + representation. + + @remarks Default implementation calls GenerateComposedValue(). + */ + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + + /** Converts string to a value, and if successful, calls SetValue() on it. + Default behaviour is to do nothing. + @param text + String to get the value from. + @return + true if value was changed. + */ + bool SetValueFromString( const wxString& text, int flags = wxPG_PROGRAMMATIC_VALUE ); + + /** Converts integer to a value, and if successful, calls SetValue() on it. + Default behaviour is to do nothing. + @param value + Int to get the value from. + @param flags + If has wxPG_FULL_VALUE, then the value given is a actual value and + not an index. + @return + True if value was changed. + */ + bool SetValueFromInt( long value, int flags = 0 ); + + /** + Returns size of the custom painted image in front of property. + + This method must be overridden to return non-default value if + OnCustomPaint is to be called. + @param item + Normally -1, but can be an index to the property's list of items. + @remarks + - Default behaviour is to return wxSize(0,0), which means no image. + - Default image width or height is indicated with dimension -1. + - You can also return wxPG_DEFAULT_IMAGE_SIZE, i.e. wxSize(-1, -1). + */ + virtual wxSize OnMeasureImage( int item = -1 ) const; + + /** + Events received by editor widgets are processed here. + + Note that editor class usually processes most events. Some, such as + button press events of TextCtrlAndButton class, can be handled here. + Also, if custom handling for regular events is desired, then that can + also be done (for example, wxSystemColourProperty custom handles + wxEVT_CHOICE to display colour picker dialog when + 'custom' selection is made). + + If the event causes value to be changed, SetValueInEvent() + should be called to set the new value. + + @param event + Associated wxEvent. + @return + Should return true if any changes in value should be reported. + @remarks + If property uses choice control, and displays a dialog on some choice + items, then it is preferred to display that dialog in IntToValue + instead of OnEvent. + */ + virtual bool OnEvent( wxPropertyGrid* propgrid, + wxWindow* wnd_primary, + wxEvent& event ); + + /** + Called after value of a child property has been altered. Must return + new value of the whole property (after any alterations warranted by + child's new value). + + Note that this function is usually called at the time that value of + this property, or given child property, is still pending for change, + and as such, result of GetValue() or m_value should not be relied + on. + + Sample pseudo-code implementation: + + @code + wxVariant MyProperty::ChildChanged( wxVariant& thisValue, + int childIndex, + wxVariant& childValue ) const + { + // Acquire reference to actual type of data stored in variant + // (TFromVariant only exists if wxPropertyGrid's wxVariant-macros + // were used to create the variant class). + T& data = TFromVariant(thisValue); + + // Copy childValue into data. + switch ( childIndex ) + { + case 0: + data.SetSubProp1( childvalue.GetLong() ); + break; + case 1: + data.SetSubProp2( childvalue.GetString() ); + break; + ... + } + + // Return altered data + return data; + } + @endcode + + @param thisValue + Value of this property. Changed value should be returned (in + previous versions of wxPropertyGrid it was only necessary to + write value back to this argument). + @param childIndex + Index of child changed (you can use Item(childIndex) to get + child property). + @param childValue + (Pending) value of the child property. + + @return + Modified value of the whole property. + */ + virtual wxVariant ChildChanged( wxVariant& thisValue, + int childIndex, + wxVariant& childValue ) const; + + /** Returns pointer to an instance of used editor. + */ + virtual const wxPGEditor* DoGetEditorClass() const; + + /** Returns pointer to the wxValidator that should be used + with the editor of this property (NULL for no validator). + Setting validator explicitly via SetPropertyValidator + will override this. + + In most situations, code like this should work well + (macros are used to maintain one actual validator instance, + so on the second call the function exits within the first + macro): + + @code + + wxValidator* wxMyPropertyClass::DoGetValidator () const + { + WX_PG_DOGETVALIDATOR_ENTRY() + + wxMyValidator* validator = new wxMyValidator(...); + + ... prepare validator... + + WX_PG_DOGETVALIDATOR_EXIT(validator) + } + + @endcode + + @remarks + You can get common filename validator by returning + wxFileProperty::GetClassValidator(). wxDirProperty, + for example, uses it. + */ + virtual wxValidator* DoGetValidator () const; + + /** + Override to paint an image in front of the property value text or + drop-down list item (but only if wxPGProperty::OnMeasureImage is + overridden as well). + + If property's OnMeasureImage() returns size that has height != 0 but + less than row height ( < 0 has special meanings), wxPropertyGrid calls + this method to draw a custom image in a limited area in front of the + editor control or value text/graphics, and if control has drop-down + list, then the image is drawn there as well (even in the case + OnMeasureImage() returned higher height than row height). + + NOTE: Following applies when OnMeasureImage() returns a "flexible" + height ( using wxPG_FLEXIBLE_SIZE(W,H) macro), which implies variable + height items: If rect.x is < 0, then this is a measure item call, which + means that dc is invalid and only thing that should be done is to set + paintdata.m_drawnHeight to the height of the image of item at index + paintdata.m_choiceItem. This call may be done even as often as once + every drop-down popup show. + + @param dc + wxDC to paint on. + @param rect + Box reserved for custom graphics. Includes surrounding rectangle, + if any. If x is < 0, then this is a measure item call (see above). + @param paintdata + wxPGPaintData structure with much useful data. + + @remarks + - You can actually exceed rect width, but if you do so then + paintdata.m_drawnWidth must be set to the full width drawn in + pixels. + - Due to technical reasons, rect's height will be default even if + custom height was reported during measure call. + - Brush is guaranteed to be default background colour. It has been + already used to clear the background of area being painted. It + can be modified. + - Pen is guaranteed to be 1-wide 'black' (or whatever is the proper + colour) pen for drawing framing rectangle. It can be changed as + well. + + @see ValueToString() + */ + virtual void OnCustomPaint( wxDC& dc, + const wxRect& rect, + wxPGPaintData& paintdata ); + + /** + Returns used wxPGCellRenderer instance for given property column + (label=0, value=1). + + Default implementation returns editor's renderer for all columns. + */ + virtual wxPGCellRenderer* GetCellRenderer( int column ) const; + + /** Returns which choice is currently selected. Only applies to properties + which have choices. + + Needs to reimplemented in derived class if property value does not + map directly to a choice. Integer as index, bool, and string usually do. + */ + virtual int GetChoiceSelection() const; + + /** + Refresh values of child properties. + + Automatically called after value is set. + */ + virtual void RefreshChildren(); + + /** + Reimplement this member function to add special handling for + attributes of this property. + + @return Return @false to have the attribute automatically stored in + m_attributes. Default implementation simply does that and + nothing else. + + @remarks To actually set property attribute values from the + application, use wxPGProperty::SetAttribute() instead. + */ + virtual bool DoSetAttribute( const wxString& name, wxVariant& value ); + + /** Returns value of an attribute. + + Override if custom handling of attributes is needed. + + Default implementation simply return NULL variant. + */ + virtual wxVariant DoGetAttribute( const wxString& name ) const; + + /** Returns instance of a new wxPGEditorDialogAdapter instance, which is + used when user presses the (optional) button next to the editor control; + + Default implementation returns NULL (ie. no action is generated when + button is pressed). + */ + virtual wxPGEditorDialogAdapter* GetEditorDialog() const; + + /** + Called whenever validation has failed with given pending value. + + @remarks If you implement this in your custom property class, please + remember to call the baser implementation as well, since they + may use it to revert property into pre-change state. + */ + virtual void OnValidationFailure( wxVariant& pendingValue ); + + /** Append a new choice to property's list of choices. + */ + int AddChoice( const wxString& label, int value = wxPG_INVALID_VALUE ) + { + return InsertChoice(label, wxNOT_FOUND, value); + } + + /** + Returns true if children of this property are component values (for + instance, points size, face name, and is_underlined are component + values of a font). + */ + bool AreChildrenComponents() const + { + if ( m_flags & (wxPG_PROP_COMPOSED_VALUE|wxPG_PROP_AGGREGATE) ) + return true; + + return false; + } + + /** + Deletes children of the property. + */ + void DeleteChildren(); + + /** + Removes entry from property's wxPGChoices and editor control (if it is + active). + + If selected item is deleted, then the value is set to unspecified. + */ + void DeleteChoice( int index ); + + /** + Enables or disables the property. Disabled property usually appears + as having grey text. + + @param enable + If @false, property is disabled instead. + + @see wxPropertyGridInterface::EnableProperty() + */ + void Enable( bool enable = true ); + + /** + Call to enable or disable usage of common value (integer value that can + be selected for properties instead of their normal values) for this + property. + + Common values are disabled by the default for all properties. + */ + void EnableCommonValue( bool enable = true ) + { + if ( enable ) SetFlag( wxPG_PROP_USES_COMMON_VALUE ); + else ClearFlag( wxPG_PROP_USES_COMMON_VALUE ); + } + + /** + Composes text from values of child properties. + */ + wxString GenerateComposedValue() const + { + wxString s; + DoGenerateComposedValue(s); + return s; + } + + /** Returns property's label. */ + const wxString& GetLabel() const { return m_label; } + + /** Returns property's name with all (non-category, non-root) parents. */ + wxString GetName() const; + + /** + Returns property's base name (ie parent's name is not added in any + case) + */ + const wxString& GetBaseName() const { return m_name; } + + /** Returns read-only reference to property's list of choices. + */ + const wxPGChoices& GetChoices() const + { + return m_choices; + } + + /** Returns coordinate to the top y of the property. Note that the + position of scrollbars is not taken into account. + */ + int GetY() const; + + wxVariant GetValue() const + { + return DoGetValue(); + } + + /** Returns reference to the internal stored value. GetValue is preferred + way to get the actual value, since GetValueRef ignores DoGetValue, + which may override stored value. + */ + wxVariant& GetValueRef() + { + return m_value; + } + + const wxVariant& GetValueRef() const + { + return m_value; + } + + // Helper function (for wxPython bindings and such) for settings protected + // m_value. + wxVariant GetValuePlain() const + { + return m_value; + } + + /** Returns text representation of property's value. + + @param argFlags + If 0 (default value), then displayed string is returned. + If wxPG_FULL_VALUE is set, returns complete, storable string value + instead of displayable. If wxPG_EDITABLE_VALUE is set, returns + string value that must be editable in textctrl. If + wxPG_COMPOSITE_FRAGMENT is set, returns text that is appropriate to + display as a part of string property's composite text + representation. + + @remarks In older versions, this function used to be overridden to convert + property's value into a string representation. This function is + now handled by ValueToString(), and overriding this function now + will result in run-time assertion failure. + */ + virtual wxString GetValueAsString( int argFlags = 0 ) const; + + /** Synonymous to GetValueAsString(). + + @deprecated Use GetValueAsString() instead. + + @see GetValueAsString() + */ + wxDEPRECATED( wxString GetValueString( int argFlags = 0 ) const ); + + /** + Returns wxPGCell of given column. + + @remarks const version of this member function returns 'default' + wxPGCell object if the property itself didn't hold + cell data. + */ + const wxPGCell& GetCell( unsigned int column ) const; + + /** + Returns wxPGCell of given column, creating one if necessary. + */ + wxPGCell& GetCell( unsigned int column ) + { + return GetOrCreateCell(column); + } + + /** + Returns wxPGCell of given column, creating one if necessary. + */ + wxPGCell& GetOrCreateCell( unsigned int column ); + + /** Return number of displayed common values for this property. + */ + int GetDisplayedCommonValueCount() const; + + wxString GetDisplayedString() const + { + return GetValueAsString(0); + } + + /** + Returns property's hint text (shown in empty value cell). + */ + inline wxString GetHintText() const; + + /** Returns property grid where property lies. */ + wxPropertyGrid* GetGrid() const; + + /** Returns owner wxPropertyGrid, but only if one is currently on a page + displaying this property. */ + wxPropertyGrid* GetGridIfDisplayed() const; + + /** Returns highest level non-category, non-root parent. Useful when you + have nested wxCustomProperties/wxParentProperties. + @remarks + Thus, if immediate parent is root or category, this will return the + property itself. + */ + wxPGProperty* GetMainParent() const; + + /** Return parent of property */ + wxPGProperty* GetParent() const { return m_parent; } + + /** Returns true if property has editable wxTextCtrl when selected. + + @remarks + Although disabled properties do not displayed editor, they still + return True here as being disabled is considered a temporary + condition (unlike being read-only or having limited editing enabled). + */ + bool IsTextEditable() const; + + bool IsValueUnspecified() const + { + return m_value.IsNull(); + } + + /** + Returns non-zero if property has given flag set. + + @see propgrid_propflags + */ + FlagType HasFlag( wxPGPropertyFlags flag ) const + { + return ( m_flags & flag ); + } + + /** Returns comma-delimited string of property attributes. + */ + const wxPGAttributeStorage& GetAttributes() const + { + return m_attributes; + } + + /** Returns m_attributes as list wxVariant. + */ + wxVariant GetAttributesAsList() const; + + /** + Returns property flags. + */ + FlagType GetFlags() const + { + return m_flags; + } + + const wxPGEditor* GetEditorClass() const; + + wxString GetValueType() const + { + return m_value.GetType(); + } + + /** Returns editor used for given column. NULL for no editor. + */ + const wxPGEditor* GetColumnEditor( int column ) const + { + if ( column == 1 ) + return GetEditorClass(); + + return NULL; + } + + /** Returns common value selected for this property. -1 for none. + */ + int GetCommonValue() const + { + return m_commonValue; + } + + /** Returns true if property has even one visible child. + */ + bool HasVisibleChildren() const; + + /** + Use this member function to add independent (ie. regular) children to + a property. + + @return Inserted childProperty. + + @remarks wxPropertyGrid is not automatically refreshed by this + function. + + @see AddPrivateChild() + */ + wxPGProperty* InsertChild( int index, wxPGProperty* childProperty ); + + /** Inserts a new choice to property's list of choices. + */ + int InsertChoice( const wxString& label, int index, int value = wxPG_INVALID_VALUE ); + + /** + Returns true if this property is actually a wxPropertyCategory. + */ + bool IsCategory() const { return HasFlag(wxPG_PROP_CATEGORY)?true:false; } + + /** Returns true if this property is actually a wxRootProperty. + */ + bool IsRoot() const { return (m_parent == NULL); } + + /** Returns true if this is a sub-property. */ + bool IsSubProperty() const + { + wxPGProperty* parent = (wxPGProperty*)m_parent; + if ( parent && !parent->IsCategory() ) + return true; + return false; + } + + /** Returns last visible sub-property, recursively. + */ + const wxPGProperty* GetLastVisibleSubItem() const; + + wxVariant GetDefaultValue() const; + + int GetMaxLength() const + { + return (int) m_maxLen; + } + + /** + Determines, recursively, if all children are not unspecified. + + @param pendingList + Assumes members in this wxVariant list as pending + replacement values. + */ + bool AreAllChildrenSpecified( wxVariant* pendingList = NULL ) const; + + /** Updates composed values of parent non-category properties, recursively. + Returns topmost property updated. + + @remarks + - Must not call SetValue() (as can be called in it). + */ + wxPGProperty* UpdateParentValues(); + + /** Returns true if containing grid uses wxPG_EX_AUTO_UNSPECIFIED_VALUES. + */ + bool UsesAutoUnspecified() const + { + return HasFlag(wxPG_PROP_AUTO_UNSPECIFIED)?true:false; + } + + wxBitmap* GetValueImage() const + { + return m_valueBitmap; + } + + wxVariant GetAttribute( const wxString& name ) const; + + /** + Returns named attribute, as string, if found. + + Otherwise defVal is returned. + */ + wxString GetAttribute( const wxString& name, const wxString& defVal ) const; + + /** + Returns named attribute, as long, if found. + + Otherwise defVal is returned. + */ + long GetAttributeAsLong( const wxString& name, long defVal ) const; + + /** + Returns named attribute, as double, if found. + + Otherwise defVal is returned. + */ + double GetAttributeAsDouble( const wxString& name, double defVal ) const; + + unsigned int GetDepth() const { return (unsigned int)m_depth; } + + /** Gets flags as a'|' delimited string. Note that flag names are not + prepended with 'wxPG_PROP_'. + @param flagsMask + String will only be made to include flags combined by this parameter. + */ + wxString GetFlagsAsString( FlagType flagsMask ) const; + + /** Returns position in parent's array. */ + unsigned int GetIndexInParent() const + { + return (unsigned int)m_arrIndex; + } + + /** Hides or reveals the property. + @param hide + true for hide, false for reveal. + @param flags + By default changes are applied recursively. Set this paramter + wxPG_DONT_RECURSE to prevent this. + */ + bool Hide( bool hide, int flags = wxPG_RECURSE ); + + bool IsExpanded() const + { return (!(m_flags & wxPG_PROP_COLLAPSED) && GetChildCount()); } + + /** Returns true if all parents expanded. + */ + bool IsVisible() const; + + bool IsEnabled() const { return !(m_flags & wxPG_PROP_DISABLED); } + + /** If property's editor is created this forces its recreation. + Useful in SetAttribute etc. Returns true if actually did anything. + */ + bool RecreateEditor(); + + /** If property's editor is active, then update it's value. + */ + void RefreshEditor(); + + /** Sets an attribute for this property. + @param name + Text identifier of attribute. See @ref propgrid_property_attributes. + @param value + Value of attribute. + */ + void SetAttribute( const wxString& name, wxVariant value ); + + void SetAttributes( const wxPGAttributeStorage& attributes ); + + /** + Set if user can change the property's value to unspecified by + modifying the value of the editor control (usually by clearing + it). Currently, this can work with following properties: + wxIntProperty, wxUIntProperty, wxFloatProperty, wxEditEnumProperty. + + @param enable + Whether to enable or disable this behaviour (it is disabled by + default). + */ + void SetAutoUnspecified( bool enable = true ) + { + ChangeFlag(wxPG_PROP_AUTO_UNSPECIFIED, enable); + } + + /** + Sets property's background colour. + + @param colour + Background colour to use. + + @param flags + Default is wxPG_RECURSE which causes colour to be set recursively. + Omit this flag to only set colour for the property in question + and not any of its children. + */ + void SetBackgroundColour( const wxColour& colour, + int flags = wxPG_RECURSE ); + + /** + Sets property's text colour. + + @param colour + Text colour to use. + + @param flags + Default is wxPG_RECURSE which causes colour to be set recursively. + Omit this flag to only set colour for the property in question + and not any of its children. + */ + void SetTextColour( const wxColour& colour, + int flags = wxPG_RECURSE ); + + /** Set default value of a property. Synonymous to + + @code + SetAttribute("DefaultValue", value); + @endcode + */ + void SetDefaultValue( wxVariant& value ); + + /** Sets editor for a property. + + @param editor + For builtin editors, use wxPGEditor_X, where X is builtin editor's + name (TextCtrl, Choice, etc. see wxPGEditor documentation for full + list). + + For custom editors, use pointer you received from + wxPropertyGrid::RegisterEditorClass(). + */ + void SetEditor( const wxPGEditor* editor ) + { + m_customEditor = editor; + } + + /** Sets editor for a property. + */ + inline void SetEditor( const wxString& editorName ); + + /** + Sets cell information for given column. + */ + void SetCell( int column, const wxPGCell& cell ); + + /** Sets common value selected for this property. -1 for none. + */ + void SetCommonValue( int commonValue ) + { + m_commonValue = commonValue; + } + + /** Sets flags from a '|' delimited string. Note that flag names are not + prepended with 'wxPG_PROP_'. + */ + void SetFlagsFromString( const wxString& str ); + + /** Sets property's "is it modified?" flag. Affects children recursively. + */ + void SetModifiedStatus( bool modified ) + { + SetFlagRecursively(wxPG_PROP_MODIFIED, modified); + } + + /** Call in OnEvent(), OnButtonClick() etc. to change the property value + based on user input. + + @remarks + This method is const since it doesn't actually modify value, but posts + given variant as pending value, stored in wxPropertyGrid. + */ + void SetValueInEvent( wxVariant value ) const; + + /** + Call this to set value of the property. + + Unlike methods in wxPropertyGrid, this does not automatically update + the display. + + @remarks + Use wxPropertyGrid::ChangePropertyValue() instead if you need to run + through validation process and send property change event. + + If you need to change property value in event, based on user input, use + SetValueInEvent() instead. + + @param pList + Pointer to list variant that contains child values. Used to + indicate which children should be marked as modified. + + @param flags + Various flags (for instance, wxPG_SETVAL_REFRESH_EDITOR, which is + enabled by default). + */ + void SetValue( wxVariant value, wxVariant* pList = NULL, + int flags = wxPG_SETVAL_REFRESH_EDITOR ); + + /** Set wxBitmap in front of the value. This bitmap may be ignored + by custom cell renderers. + */ + void SetValueImage( wxBitmap& bmp ); + + /** Sets selected choice and changes property value. + + Tries to retain value type, although currently if it is not string, + then it is forced to integer. + */ + void SetChoiceSelection( int newValue ); + + void SetExpanded( bool expanded ) + { + if ( !expanded ) m_flags |= wxPG_PROP_COLLAPSED; + else m_flags &= ~wxPG_PROP_COLLAPSED; + } + + /** + Sets or clears given property flag. Mainly for internal use. + + @remarks Setting a property flag never has any side-effect, and is + intended almost exclusively for internal use. So, for + example, if you want to disable a property, call + Enable(false) instead of setting wxPG_PROP_DISABLED flag. + + @see HasFlag(), GetFlags() + */ + void ChangeFlag( wxPGPropertyFlags flag, bool set ) + { + if ( set ) + m_flags |= flag; + else + m_flags &= ~flag; + } + + /** + Sets or clears given property flag, recursively. This function is + primarily intended for internal use. + + @see ChangeFlag() + */ + void SetFlagRecursively( wxPGPropertyFlags flag, bool set ); + + void SetHelpString( const wxString& helpString ) + { + m_helpString = helpString; + } + + void SetLabel( const wxString& label ) { m_label = label; } + + void SetName( const wxString& newName ); + + /** + Changes what sort of parent this property is for its children. + + @param flag + Use one of the following values: wxPG_PROP_MISC_PARENT (for + generic parents), wxPG_PROP_CATEGORY (for categories), or + wxPG_PROP_AGGREGATE (for derived property classes with private + children). + + @remarks You generally do not need to call this function. + */ + void SetParentalType( int flag ) + { + m_flags &= ~(wxPG_PROP_PROPERTY|wxPG_PROP_PARENTAL_FLAGS); + m_flags |= flag; + } + + void SetValueToUnspecified() + { + wxVariant val; // Create NULL variant + SetValue(val, NULL, wxPG_SETVAL_REFRESH_EDITOR); + } + + // Helper function (for wxPython bindings and such) for settings protected + // m_value. + void SetValuePlain( wxVariant value ) + { + m_value = value; + } + +#if wxUSE_VALIDATORS + /** Sets wxValidator for a property*/ + void SetValidator( const wxValidator& validator ) + { + m_validator = wxDynamicCast(validator.Clone(),wxValidator); + } + + /** Gets assignable version of property's validator. */ + wxValidator* GetValidator() const + { + if ( m_validator ) + return m_validator; + return DoGetValidator(); + } +#endif // wxUSE_VALIDATORS + + /** Returns client data (void*) of a property. + */ + void* GetClientData() const + { + return m_clientData; + } + + /** Sets client data (void*) of a property. + @remarks + This untyped client data has to be deleted manually. + */ + void SetClientData( void* clientData ) + { + m_clientData = clientData; + } + + /** Returns client object of a property. + */ + void SetClientObject(wxClientData* clientObject) + { + delete m_clientObject; + m_clientObject = clientObject; + } + + /** Sets managed client object of a property. + */ + wxClientData *GetClientObject() const { return m_clientObject; } + + /** + Sets new set of choices for the property. + + @remarks This operation deselects the property and clears its + value. + */ + bool SetChoices( const wxPGChoices& choices ); + + /** Set max length of text in text editor. + */ + inline bool SetMaxLength( int maxLen ); + + /** Call with 'false' in OnSetValue to cancel value changes after all + (ie. cancel 'true' returned by StringToValue() or IntToValue()). + */ + void SetWasModified( bool set = true ) + { + if ( set ) m_flags |= wxPG_PROP_WAS_MODIFIED; + else m_flags &= ~wxPG_PROP_WAS_MODIFIED; + } + + const wxString& GetHelpString() const + { + return m_helpString; + } + + // Use, for example, to detect if item is inside collapsed section. + bool IsSomeParent( wxPGProperty* candidate_parent ) const; + + /** + Adapts list variant into proper value using consecutive + ChildChanged-calls. + */ + void AdaptListToValue( wxVariant& list, wxVariant* value ) const; + +#if wxPG_COMPATIBILITY_1_4 + /** + Adds a private child property. + + @deprecated Use AddPrivateChild() instead. + + @see AddPrivateChild() + */ + wxDEPRECATED( void AddChild( wxPGProperty* prop ) ); +#endif + + /** + Adds a private child property. If you use this instead of + wxPropertyGridInterface::Insert() or + wxPropertyGridInterface::AppendIn(), then property's parental + type will automatically be set up to wxPG_PROP_AGGREGATE. In other + words, all properties of this property will become private. + */ + void AddPrivateChild( wxPGProperty* prop ); + + /** + Appends a new child property. + */ + wxPGProperty* AppendChild( wxPGProperty* prop ) + { + return InsertChild(-1, prop); + } + + /** Returns height of children, recursively, and + by taking expanded/collapsed status into account. + + iMax is used when finding property y-positions. + */ + int GetChildrenHeight( int lh, int iMax = -1 ) const; + + /** Returns number of child properties */ + unsigned int GetChildCount() const + { + return (unsigned int) m_children.size(); + } + + /** Returns sub-property at index i. */ + wxPGProperty* Item( unsigned int i ) const + { return m_children[i]; } + + /** Returns last sub-property. + */ + wxPGProperty* Last() const { return m_children.back(); } + + /** Returns index of given child property. */ + int Index( const wxPGProperty* p ) const; + + // Puts correct indexes to children + void FixIndicesOfChildren( unsigned int starthere = 0 ); + + /** + Converts image width into full image offset, with margins. + */ + int GetImageOffset( int imageWidth ) const; + + // Returns wxPropertyGridPageState in which this property resides. + wxPropertyGridPageState* GetParentState() const { return m_parentState; } + + wxPGProperty* GetItemAtY( unsigned int y, + unsigned int lh, + unsigned int* nextItemY ) const; + + /** Returns property at given virtual y coordinate. + */ + wxPGProperty* GetItemAtY( unsigned int y ) const; + + /** Returns (direct) child property with given name (or NULL if not found). + */ + wxPGProperty* GetPropertyByName( const wxString& name ) const; + + // Returns various display-related information for given column + void GetDisplayInfo( unsigned int column, + int choiceIndex, + int flags, + wxString* pString, + const wxPGCell** pCell ); + + static wxString* sm_wxPG_LABEL; + + /** This member is public so scripting language bindings + wrapper code can access it freely. + */ + void* m_clientData; + +protected: + + /** + Sets property cell in fashion that reduces number of exclusive + copies of cell data. Used when setting, for instance, same + background colour for a number of properties. + + @param firstCol + First column to affect. + + @param lastCol + Last column to affect. + + @param preparedCell + Pre-prepared cell that is used for those which cell data + before this matched unmodCellData. + + @param srcData + If unmodCellData did not match, valid cell data from this + is merged into cell (usually generating new exclusive copy + of cell's data). + + @param unmodCellData + If cell's cell data matches this, its cell is now set to + preparedCell. + + @param ignoreWithFlags + Properties with any one of these flags are skipped. + + @param recursively + If @true, apply this operation recursively in child properties. + */ + void AdaptiveSetCell( unsigned int firstCol, + unsigned int lastCol, + const wxPGCell& preparedCell, + const wxPGCell& srcData, + wxPGCellData* unmodCellData, + FlagType ignoreWithFlags, + bool recursively ); + + /** + Makes sure m_cells has size of column+1 (or more). + */ + void EnsureCells( unsigned int column ); + + /** Returns (direct) child property with given name (or NULL if not found), + with hint index. + + @param hintIndex + Start looking for the child at this index. + + @remarks + Does not support scope (ie. Parent.Child notation). + */ + wxPGProperty* GetPropertyByNameWH( const wxString& name, + unsigned int hintIndex ) const; + + /** This is used by Insert etc. */ + void DoAddChild( wxPGProperty* prop, + int index = -1, + bool correct_mode = true ); + + void DoGenerateComposedValue( wxString& text, + int argFlags = wxPG_VALUE_IS_CURRENT, + const wxVariantList* valueOverrides = NULL, + wxPGHashMapS2S* childResults = NULL ) const; + + bool DoHide( bool hide, int flags ); + + void DoSetName(const wxString& str) { m_name = str; } + + /** Deletes all sub-properties. */ + void Empty(); + + bool HasCell( unsigned int column ) const + { + if ( m_cells.size() > column ) + return true; + return false; + } + + void InitAfterAdded( wxPropertyGridPageState* pageState, + wxPropertyGrid* propgrid ); + + /** + Returns true if child property is selected. + */ + bool IsChildSelected( bool recursive = false ) const; + + // Removes child property with given pointer. Does not delete it. + void RemoveChild( wxPGProperty* p ); + + void DoEnable( bool enable ); + + void DoPreAddChild( int index, wxPGProperty* prop ); + + void SetParentState( wxPropertyGridPageState* pstate ) + { m_parentState = pstate; } + + void SetFlag( wxPGPropertyFlags flag ) + { + // + // NB: While using wxPGPropertyFlags here makes it difficult to + // combine different flags, it usefully prevents user from + // using incorrect flags (say, wxWindow styles). + m_flags |= flag; + } + + void ClearFlag( FlagType flag ) { m_flags &= ~(flag); } + + // Called when the property is being removed from the grid and/or + // page state (but *not* when it is also deleted). + void OnDetached(wxPropertyGridPageState* state, + wxPropertyGrid* propgrid); + + // Call after fixed sub-properties added/removed after creation. + // if oldSelInd >= 0 and < new max items, then selection is + // moved to it. + void SubPropsChanged( int oldSelInd = -1 ); + + int GetY2( int lh ) const; + + wxString m_label; + wxString m_name; + wxPGProperty* m_parent; + wxPropertyGridPageState* m_parentState; + + wxClientData* m_clientObject; + + // Overrides editor returned by property class + const wxPGEditor* m_customEditor; +#if wxUSE_VALIDATORS + // Editor is going to get this validator + wxValidator* m_validator; +#endif + // Show this in front of the value + // + // TODO: Can bitmap be implemented with wxPGCell? + wxBitmap* m_valueBitmap; + + wxVariant m_value; + wxPGAttributeStorage m_attributes; + wxArrayPGProperty m_children; + + // Extended cell information + wxVector<wxPGCell> m_cells; + + // Choices shown in drop-down list of editor control. + wxPGChoices m_choices; + + // Help shown in statusbar or help box. + wxString m_helpString; + + // Index in parent's property array. + unsigned int m_arrIndex; + + // If not -1, then overrides m_value + int m_commonValue; + + FlagType m_flags; + + // Maximum length (mainly for string properties). Could be in some sort of + // wxBaseStringProperty, but currently, for maximum flexibility and + // compatibility, we'll stick it here. Anyway, we had 3 excess bytes to use + // so short int will fit in just fine. + short m_maxLen; + + // Root has 0, categories etc. at that level 1, etc. + unsigned char m_depth; + + // m_depthBgCol indicates width of background colour between margin and item + // (essentially this is category's depth, if none then equals m_depth). + unsigned char m_depthBgCol; + +private: + // Called in constructors. + void Init(); + void Init( const wxString& label, const wxString& name ); +}; + +// ----------------------------------------------------------------------- + +// +// Property class declaration helper macros +// (wxPGRootPropertyClass and wxPropertyCategory require this). +// + +#define WX_PG_DECLARE_DOGETEDITORCLASS \ + virtual const wxPGEditor* DoGetEditorClass() const; + +#ifndef WX_PG_DECLARE_PROPERTY_CLASS + #define WX_PG_DECLARE_PROPERTY_CLASS(CLASSNAME) \ + public: \ + DECLARE_DYNAMIC_CLASS(CLASSNAME) \ + WX_PG_DECLARE_DOGETEDITORCLASS \ + private: +#endif + +// Implements sans constructor function. Also, first arg is class name, not +// property name. +#define WX_PG_IMPLEMENT_PROPERTY_CLASS_PLAIN(PROPNAME,T,EDITOR) \ +const wxPGEditor* PROPNAME::DoGetEditorClass() const \ +{ \ + return wxPGEditor_##EDITOR; \ +} + +// ----------------------------------------------------------------------- + +/** @class wxPGRootProperty + @ingroup classes + Root parent property. +*/ +class WXDLLIMPEXP_PROPGRID wxPGRootProperty : public wxPGProperty +{ +public: + WX_PG_DECLARE_PROPERTY_CLASS(wxPGRootProperty) +public: + + /** Constructor. */ + wxPGRootProperty( const wxString& name = wxS("<Root>") ); + virtual ~wxPGRootProperty(); + + virtual bool StringToValue( wxVariant&, const wxString&, int ) const + { + return false; + } + +protected: +}; + +// ----------------------------------------------------------------------- + +/** @class wxPropertyCategory + @ingroup classes + Category (caption) property. +*/ +class WXDLLIMPEXP_PROPGRID wxPropertyCategory : public wxPGProperty +{ + friend class wxPropertyGrid; + friend class wxPropertyGridPageState; + WX_PG_DECLARE_PROPERTY_CLASS(wxPropertyCategory) +public: + + /** Default constructor is only used in special cases. */ + wxPropertyCategory(); + + wxPropertyCategory( const wxString& label, + const wxString& name = wxPG_LABEL ); + ~wxPropertyCategory(); + + int GetTextExtent( const wxWindow* wnd, const wxFont& font ) const; + + virtual wxString ValueToString( wxVariant& value, int argFlags ) const; + virtual wxString GetValueAsString( int argFlags = 0 ) const; + +protected: + void SetTextColIndex( unsigned int colInd ) + { m_capFgColIndex = (wxByte) colInd; } + unsigned int GetTextColIndex() const + { return (unsigned int) m_capFgColIndex; } + + void CalculateTextExtent( wxWindow* wnd, const wxFont& font ); + + int m_textExtent; // pre-calculated length of text + wxByte m_capFgColIndex; // caption text colour index + +private: + void Init(); +}; + +// ----------------------------------------------------------------------- + +#endif // wxUSE_PROPGRID + +#endif // _WX_PROPGRID_PROPERTY_H_ diff --git a/wxmsw/include/wx-3.0/wx/propgrid/propgrid.h b/wxmsw/include/wx-3.0/wx/propgrid/propgrid.h new file mode 100644 index 00000000..9b12b2eb --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/propgrid/propgrid.h @@ -0,0 +1,2698 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/propgrid/propgrid.h +// Purpose: wxPropertyGrid +// Author: Jaakko Salli +// Modified by: +// Created: 2004-09-25 +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROPGRID_PROPGRID_H_ +#define _WX_PROPGRID_PROPGRID_H_ + +#include "wx/defs.h" + +#if wxUSE_PROPGRID + +#include "wx/thread.h" +#include "wx/dcclient.h" +#include "wx/control.h" +#include "wx/scrolwin.h" +#include "wx/tooltip.h" +#include "wx/datetime.h" +#include "wx/recguard.h" + +#include "wx/propgrid/property.h" +#include "wx/propgrid/propgridiface.h" + + +#ifndef SWIG +extern WXDLLIMPEXP_DATA_PROPGRID(const char) wxPropertyGridNameStr[]; +#endif + +class wxPGComboBox; + +#if wxUSE_STATUSBAR +class WXDLLIMPEXP_FWD_CORE wxStatusBar; +#endif + +// ----------------------------------------------------------------------- +// Global variables +// ----------------------------------------------------------------------- + +// This is required for sharing common global variables. +class WXDLLIMPEXP_PROPGRID wxPGGlobalVarsClass +{ +public: + + wxPGGlobalVarsClass(); + ~wxPGGlobalVarsClass(); + +#if wxUSE_THREADS + // Critical section for handling the globals. Generally it is not needed + // since GUI code is supposed to be in single thread. However, + // we do want the user to be able to convey wxPropertyGridEvents to other + // threads. + wxCriticalSection m_critSect; +#endif + + // Used by advprops, but here to make things easier. + wxString m_pDefaultImageWildcard; + + // Map of editor class instances (keys are name string). + wxPGHashMapS2P m_mapEditorClasses; + +#if wxUSE_VALIDATORS + wxVector<wxValidator*> m_arrValidators; // These wxValidators need to be freed +#endif + + wxPGHashMapS2P m_dictPropertyClassInfo; // PropertyName -> ClassInfo + + wxPGChoices* m_fontFamilyChoices; + + // Replace with your own to affect all properties using default renderer. + wxPGCellRenderer* m_defaultRenderer; + + wxPGChoices m_boolChoices; + + wxVariant m_vEmptyString; + wxVariant m_vZero; + wxVariant m_vMinusOne; + wxVariant m_vTrue; + wxVariant m_vFalse; + + // Cached constant strings + wxPGCachedString m_strstring; + wxPGCachedString m_strlong; + wxPGCachedString m_strbool; + wxPGCachedString m_strlist; + + wxPGCachedString m_strDefaultValue; + wxPGCachedString m_strMin; + wxPGCachedString m_strMax; + wxPGCachedString m_strUnits; + wxPGCachedString m_strHint; +#if wxPG_COMPATIBILITY_1_4 + wxPGCachedString m_strInlineHelp; +#endif + + // If true then some things are automatically translated + bool m_autoGetTranslation; + + // > 0 if errors cannot or should not be shown in statusbar etc. + int m_offline; + + int m_extraStyle; // global extra style + + int m_warnings; + + int HasExtraStyle( int style ) const { return (m_extraStyle & style); } +}; + +extern WXDLLIMPEXP_DATA_PROPGRID(wxPGGlobalVarsClass*) wxPGGlobalVars; + +#define wxPGVariant_EmptyString (wxPGGlobalVars->m_vEmptyString) +#define wxPGVariant_Zero (wxPGGlobalVars->m_vZero) +#define wxPGVariant_MinusOne (wxPGGlobalVars->m_vMinusOne) +#define wxPGVariant_True (wxPGGlobalVars->m_vTrue) +#define wxPGVariant_False (wxPGGlobalVars->m_vFalse) + +#define wxPGVariant_Bool(A) (A?wxPGVariant_True:wxPGVariant_False) + +// When wxPG is loaded dynamically after the application is already running +// then the built-in module system won't pick this one up. Add it manually. +WXDLLIMPEXP_PROPGRID void wxPGInitResourceModule(); + +// ----------------------------------------------------------------------- + +/** @section propgrid_window_styles wxPropertyGrid Window Styles + + SetWindowStyleFlag method can be used to modify some of these at run-time. + @{ +*/ +enum wxPG_WINDOW_STYLES +{ + +/** This will cause Sort() automatically after an item is added. + When inserting a lot of items in this mode, it may make sense to + use Freeze() before operations and Thaw() afterwards to increase + performance. +*/ +wxPG_AUTO_SORT = 0x00000010, + +/** Categories are not initially shown (even if added). + IMPORTANT NOTE: If you do not plan to use categories, then this + style will waste resources. + This flag can also be changed using wxPropertyGrid::EnableCategories method. +*/ +wxPG_HIDE_CATEGORIES = 0x00000020, + +/* This style combines non-categoric mode and automatic sorting. +*/ +wxPG_ALPHABETIC_MODE = (wxPG_HIDE_CATEGORIES|wxPG_AUTO_SORT), + +/** Modified values are shown in bold font. Changing this requires Refresh() + to show changes. +*/ +wxPG_BOLD_MODIFIED = 0x00000040, + +/** Using this style, the column splitters move automatically based on column + proportions (default is equal proportion for every column). This behaviour + stops once the user manually moves a splitter, and returns when a + splitter is double-clicked. + + @see wxPropertyGridInterface::SetColumnProportion(). +*/ +wxPG_SPLITTER_AUTO_CENTER = 0x00000080, + +/** Display tooltips for cell text that cannot be shown completely. If + wxUSE_TOOLTIPS is 0, then this doesn't have any effect. +*/ +wxPG_TOOLTIPS = 0x00000100, + +/** Disables margin and hides all expand/collapse buttons that would appear + outside the margin (for sub-properties). Toggling this style automatically + expands all collapsed items. +*/ +wxPG_HIDE_MARGIN = 0x00000200, + +/** This style prevents user from moving the splitter. +*/ +wxPG_STATIC_SPLITTER = 0x00000400, + +/** Combination of other styles that make it impossible for user to modify + the layout. +*/ +wxPG_STATIC_LAYOUT = (wxPG_HIDE_MARGIN|wxPG_STATIC_SPLITTER), + +/** Disables wxTextCtrl based editors for properties which + can be edited in another way. + + Equals calling wxPropertyGrid::LimitPropertyEditing for all added + properties. +*/ +wxPG_LIMITED_EDITING = 0x00000800, + +/** wxPropertyGridManager only: Show toolbar for mode and page selection. */ +wxPG_TOOLBAR = 0x00001000, + +/** wxPropertyGridManager only: Show adjustable text box showing description + or help text, if available, for currently selected property. +*/ +wxPG_DESCRIPTION = 0x00002000, + +/** wxPropertyGridManager only: don't show an internal border around the + property grid. Recommended if you use a header. +*/ +wxPG_NO_INTERNAL_BORDER = 0x00004000 +}; + +#if wxPG_COMPATIBILITY_1_4 + // In wxPG 1.4 this was used to enable now-default theme border support + // in wxPropertyGridManager. + #define wxPG_THEME_BORDER 0x00000000 +#endif + + +enum wxPG_EX_WINDOW_STYLES +{ + +/** + NOTE: wxPG_EX_xxx are extra window styles and must be set using + SetExtraStyle() member function. + + Speeds up switching to wxPG_HIDE_CATEGORIES mode. Initially, if + wxPG_HIDE_CATEGORIES is not defined, the non-categorized data storage is + not activated, and switching the mode first time becomes somewhat slower. + wxPG_EX_INIT_NOCAT activates the non-categorized data storage right away. + IMPORTANT NOTE: If you do plan not switching to non-categoric mode, or if + you don't plan to use categories at all, then using this style will result + in waste of resources. + +*/ +wxPG_EX_INIT_NOCAT = 0x00001000, + +/** Extended window style that sets wxPropertyGridManager toolbar to not + use flat style. +*/ +wxPG_EX_NO_FLAT_TOOLBAR = 0x00002000, + +/** Shows alphabetic/categoric mode buttons from toolbar. +*/ +wxPG_EX_MODE_BUTTONS = 0x00008000, + +/** Show property help strings as tool tips instead as text on the status bar. + You can set the help strings using SetPropertyHelpString member function. +*/ +wxPG_EX_HELP_AS_TOOLTIPS = 0x00010000, + +/** Prevent TAB from focusing to wxButtons. This behaviour was default + in version 1.2.0 and earlier. + NOTE! Tabbing to button doesn't work yet. Problem seems to be that on wxMSW + atleast the button doesn't properly propagate key events (yes, I'm using + wxWANTS_CHARS). +*/ +//wxPG_EX_NO_TAB_TO_BUTTON = 0x00020000, + +/** Allows relying on native double-buffering. +*/ +wxPG_EX_NATIVE_DOUBLE_BUFFERING = 0x00080000, + +/** Set this style to let user have ability to set values of properties to + unspecified state. Same as setting wxPG_PROP_AUTO_UNSPECIFIED for + all properties. +*/ +wxPG_EX_AUTO_UNSPECIFIED_VALUES = 0x00200000, + +/** + If this style is used, built-in attributes (such as wxPG_FLOAT_PRECISION + and wxPG_STRING_PASSWORD) are not stored into property's attribute storage + (thus they are not readable). + + Note that this option is global, and applies to all wxPG property + containers. +*/ +wxPG_EX_WRITEONLY_BUILTIN_ATTRIBUTES = 0x00400000, + +/** Hides page selection buttons from toolbar. +*/ +wxPG_EX_HIDE_PAGE_BUTTONS = 0x01000000, + +/** Allows multiple properties to be selected by user (by pressing SHIFT + when clicking on a property, or by dragging with left mouse button + down). + + You can get array of selected properties with + wxPropertyGridInterface::GetSelectedProperties(). In multiple selection + mode wxPropertyGridInterface::GetSelection() returns + property which has editor active (usually the first one + selected). Other useful member functions are ClearSelection(), + AddToSelection() and RemoveFromSelection(). +*/ +wxPG_EX_MULTIPLE_SELECTION = 0x02000000, + +/** + This enables top-level window tracking which allows wxPropertyGrid to + notify the application of last-minute property value changes by user. + + This style is not enabled by default because it may cause crashes when + wxPropertyGrid is used in with wxAUI or similar system. + + @remarks If you are not in fact using any system that may change + wxPropertyGrid's top-level parent window on its own, then you + are recommended to enable this style. +*/ +wxPG_EX_ENABLE_TLP_TRACKING = 0x04000000, + +/** Don't show divider above toolbar, on Windows. +*/ +wxPG_EX_NO_TOOLBAR_DIVIDER = 0x08000000, + +/** Show a separator below the toolbar. +*/ +wxPG_EX_TOOLBAR_SEPARATOR = 0x10000000 + +}; + +#if wxPG_COMPATIBILITY_1_4 + #define wxPG_EX_DISABLE_TLP_TRACKING 0x00000000 +#endif + +/** Combines various styles. +*/ +#define wxPG_DEFAULT_STYLE (0) + +/** Combines various styles. +*/ +#define wxPGMAN_DEFAULT_STYLE (0) + +/** @} +*/ + +// ----------------------------------------------------------------------- + +// +// Ids for sub-controls +// NB: It should not matter what these are. +#define wxPG_SUBID1 2 +#define wxPG_SUBID2 3 +#define wxPG_SUBID_TEMP1 4 + +// ----------------------------------------------------------------------- + +/** @class wxPGCommonValue + + wxPropertyGrid stores information about common values in these + records. + + NB: Common value feature is not complete, and thus not mentioned in + documentation. +*/ +class WXDLLIMPEXP_PROPGRID wxPGCommonValue +{ +public: + + wxPGCommonValue( const wxString& label, wxPGCellRenderer* renderer ) + { + m_label = label; + m_renderer = renderer; + renderer->IncRef(); + } + virtual ~wxPGCommonValue() + { + m_renderer->DecRef(); + } + + virtual wxString GetEditableText() const { return m_label; } + const wxString& GetLabel() const { return m_label; } + wxPGCellRenderer* GetRenderer() const { return m_renderer; } + +protected: + wxString m_label; + wxPGCellRenderer* m_renderer; +}; + +// ----------------------------------------------------------------------- + +/** @section propgrid_vfbflags wxPropertyGrid Validation Failure behaviour Flags + @{ +*/ + +enum wxPG_VALIDATION_FAILURE_BEHAVIOR_FLAGS +{ + +/** Prevents user from leaving property unless value is valid. If this + behaviour flag is not used, then value change is instead cancelled. +*/ +wxPG_VFB_STAY_IN_PROPERTY = 0x01, + +/** Calls wxBell() on validation failure. +*/ +wxPG_VFB_BEEP = 0x02, + +/** Cell with invalid value will be marked (with red colour). +*/ +wxPG_VFB_MARK_CELL = 0x04, + +/** + Display a text message explaining the situation. + + To customize the way the message is displayed, you need to + reimplement wxPropertyGrid::DoShowPropertyError() in a + derived class. Default behaviour is to display the text on + the top-level frame's status bar, if present, and otherwise + using wxMessageBox. +*/ +wxPG_VFB_SHOW_MESSAGE = 0x08, + +/** + Similar to wxPG_VFB_SHOW_MESSAGE, except always displays the + message using wxMessageBox. +*/ +wxPG_VFB_SHOW_MESSAGEBOX = 0x10, + +/** + Similar to wxPG_VFB_SHOW_MESSAGE, except always displays the + message on the status bar (when present - you can reimplement + wxPropertyGrid::GetStatusBar() in a derived class to specify + this yourself). +*/ +wxPG_VFB_SHOW_MESSAGE_ON_STATUSBAR = 0x20, + +/** Defaults. */ +wxPG_VFB_DEFAULT = wxPG_VFB_MARK_CELL | + wxPG_VFB_SHOW_MESSAGEBOX, + +/** Only used internally. */ +wxPG_VFB_UNDEFINED = 0x80 + +}; + +/** @} +*/ + +// Having this as define instead of wxByte typedef makes things easier for +// wxPython bindings (ignoring and redefining it in SWIG interface file +// seemed rather tricky) +#define wxPGVFBFlags unsigned char + +/** + wxPGValidationInfo + + Used to convey validation information to and from functions that + actually perform validation. Mostly used in custom property + classes. +*/ +class WXDLLIMPEXP_PROPGRID wxPGValidationInfo +{ + friend class wxPropertyGrid; +public: + wxPGValidationInfo() + { + m_failureBehavior = 0; + m_isFailing = false; + } + + ~wxPGValidationInfo() + { + } + + /** + @return Returns failure behaviour which is a combination of + @ref propgrid_vfbflags. + */ + wxPGVFBFlags GetFailureBehavior() const + { return m_failureBehavior; } + + /** + Returns current failure message. + */ + const wxString& GetFailureMessage() const + { return m_failureMessage; } + + /** + Returns reference to pending value. + */ + wxVariant& GetValue() + { + wxASSERT(m_pValue); + return *m_pValue; + } + + /** Set validation failure behaviour + + @param failureBehavior + Mixture of @ref propgrid_vfbflags. + */ + void SetFailureBehavior(wxPGVFBFlags failureBehavior) + { m_failureBehavior = failureBehavior; } + + /** + Set current failure message. + */ + void SetFailureMessage(const wxString& message) + { m_failureMessage = message; } + +private: + /** Value to be validated. + */ + wxVariant* m_pValue; + + /** Message displayed on validation failure. + */ + wxString m_failureMessage; + + /** Validation failure behaviour. Use wxPG_VFB_XXX flags. + */ + wxPGVFBFlags m_failureBehavior; + + // True when validation is currently failing. + bool m_isFailing; +}; + +// ----------------------------------------------------------------------- + +/** @section propgrid_pgactions wxPropertyGrid Action Identifiers + + These are used with wxPropertyGrid::AddActionTrigger() and + wxPropertyGrid::ClearActionTriggers(). + @{ +*/ + +enum wxPG_KEYBOARD_ACTIONS +{ + wxPG_ACTION_INVALID = 0, + + /** Select the next property. */ + wxPG_ACTION_NEXT_PROPERTY, + + /** Select the previous property. */ + wxPG_ACTION_PREV_PROPERTY, + + /** Expand the selected property, if it has child items. */ + wxPG_ACTION_EXPAND_PROPERTY, + + /** Collapse the selected property, if it has child items. */ + wxPG_ACTION_COLLAPSE_PROPERTY, + + /** Cancel and undo any editing done in the currently active property + editor. + */ + wxPG_ACTION_CANCEL_EDIT, + + /** Move focus to the editor control of the currently selected + property. + */ + wxPG_ACTION_EDIT, + + /** Causes editor's button (if any) to be pressed. */ + wxPG_ACTION_PRESS_BUTTON, + + wxPG_ACTION_MAX +}; + +/** @} +*/ + +// ----------------------------------------------------------------------- + + +// wxPropertyGrid::DoSelectProperty flags (selFlags) + +// Focuses to created editor +#define wxPG_SEL_FOCUS 0x0001 +// Forces deletion and recreation of editor +#define wxPG_SEL_FORCE 0x0002 +// For example, doesn't cause EnsureVisible +#define wxPG_SEL_NONVISIBLE 0x0004 +// Do not validate editor's value before selecting +#define wxPG_SEL_NOVALIDATE 0x0008 +// Property being deselected is about to be deleted +#define wxPG_SEL_DELETING 0x0010 +// Property's values was set to unspecified by the user +#define wxPG_SEL_SETUNSPEC 0x0020 +// Property's event handler changed the value +#define wxPG_SEL_DIALOGVAL 0x0040 +// Set to disable sending of wxEVT_PG_SELECTED event +#define wxPG_SEL_DONT_SEND_EVENT 0x0080 +// Don't make any graphics updates +#define wxPG_SEL_NO_REFRESH 0x0100 + +// ----------------------------------------------------------------------- + +// DoSetSplitterPosition() flags + +enum wxPG_SET_SPLITTER_POSITION_SPLITTER_FLAGS +{ + wxPG_SPLITTER_REFRESH = 0x0001, + wxPG_SPLITTER_ALL_PAGES = 0x0002, + wxPG_SPLITTER_FROM_EVENT = 0x0004, + wxPG_SPLITTER_FROM_AUTO_CENTER = 0x0008 +}; + + +// ----------------------------------------------------------------------- + +// Internal flags +#define wxPG_FL_INITIALIZED 0x0001 +// Set when creating editor controls if it was clicked on. +#define wxPG_FL_ACTIVATION_BY_CLICK 0x0002 +#define wxPG_FL_DONT_CENTER_SPLITTER 0x0004 +#define wxPG_FL_FOCUSED 0x0008 +#define wxPG_FL_MOUSE_CAPTURED 0x0010 +#define wxPG_FL_MOUSE_INSIDE 0x0020 +#define wxPG_FL_VALUE_MODIFIED 0x0040 +// don't clear background of m_wndEditor +#define wxPG_FL_PRIMARY_FILLS_ENTIRE 0x0080 +// currently active editor uses custom image +#define wxPG_FL_CUR_USES_CUSTOM_IMAGE 0x0100 +// cell colours override selection colours for selected cell +#define wxPG_FL_CELL_OVERRIDES_SEL 0x0200 +#define wxPG_FL_SCROLLED 0x0400 +// set when all added/inserted properties get hideable flag +#define wxPG_FL_ADDING_HIDEABLES 0x0800 +// Disables showing help strings on statusbar. +#define wxPG_FL_NOSTATUSBARHELP 0x1000 +// Marks that we created the state, so we have to destroy it too. +#define wxPG_FL_CREATEDSTATE 0x2000 +// Set if scrollbar's existence was detected in last onresize. +#define wxPG_FL_SCROLLBAR_DETECTED 0x4000 +// Set if wxPGMan requires redrawing of description text box. +#define wxPG_FL_DESC_REFRESH_REQUIRED 0x8000 +// Set if contained in wxPropertyGridManager +#define wxPG_FL_IN_MANAGER 0x00020000 +// Set after wxPropertyGrid is shown in its initial good size +#define wxPG_FL_GOOD_SIZE_SET 0x00040000 +// Set when in SelectProperty. +#define wxPG_FL_IN_SELECT_PROPERTY 0x00100000 +// Set when help string is shown in status bar +#define wxPG_FL_STRING_IN_STATUSBAR 0x00200000 +// Auto sort is enabled (for categorized mode) +#define wxPG_FL_CATMODE_AUTO_SORT 0x01000000 +// Set after page has been inserted to manager +#define wxPG_MAN_FL_PAGE_INSERTED 0x02000000 +// Active editor control is abnormally large +#define wxPG_FL_ABNORMAL_EDITOR 0x04000000 +// Recursion guard for HandleCustomEditorEvent +#define wxPG_FL_IN_HANDLECUSTOMEDITOREVENT 0x08000000 +#define wxPG_FL_VALUE_CHANGE_IN_EVENT 0x10000000 +// Editor control width should not change on resize +#define wxPG_FL_FIXED_WIDTH_EDITOR 0x20000000 +// Width of panel can be different than width of grid +#define wxPG_FL_HAS_VIRTUAL_WIDTH 0x40000000 +// Prevents RecalculateVirtualSize re-entrancy +#define wxPG_FL_RECALCULATING_VIRTUAL_SIZE 0x80000000 + +#if !defined(__wxPG_SOURCE_FILE__) + // Reduce compile time, but still include in user app + #include "wx/propgrid/props.h" +#endif + +// ----------------------------------------------------------------------- + +/** @class wxPropertyGrid + + wxPropertyGrid is a specialized grid for editing properties + such as strings, numbers, flagsets, fonts, and colours. wxPropertySheet + used to do the very same thing, but it hasn't been updated for a while + and it is currently deprecated. + + Please note that most member functions are inherited and as such not + documented on this page. This means you will probably also want to read + wxPropertyGridInterface class reference. + + See also @ref overview_propgrid. + + @section propgrid_window_styles_ Window Styles + + See @ref propgrid_window_styles. + + @section propgrid_event_handling Event Handling + + To process input from a propertygrid control, use these event handler + macros to direct input to member functions that take a wxPropertyGridEvent + argument. + + @beginEventTable{wxPropertyGridEvent} + @event{EVT_PG_SELECTED (id, func)} + Respond to wxEVT_PG_SELECTED event, generated when a property selection + has been changed, either by user action or by indirect program + function. For instance, collapsing a parent property programmatically + causes any selected child property to become unselected, and may + therefore cause this event to be generated. + @event{EVT_PG_CHANGING(id, func)} + Respond to wxEVT_PG_CHANGING event, generated when property value + is about to be changed by user. Use wxPropertyGridEvent::GetValue() + to take a peek at the pending value, and wxPropertyGridEvent::Veto() + to prevent change from taking place, if necessary. + @event{EVT_PG_HIGHLIGHTED(id, func)} + Respond to wxEVT_PG_HIGHLIGHTED event, which occurs when mouse + moves over a property. Event's property is NULL if hovered area does + not belong to any property. + @event{EVT_PG_RIGHT_CLICK(id, func)} + Respond to wxEVT_PG_RIGHT_CLICK event, which occurs when property is + clicked on with right mouse button. + @event{EVT_PG_DOUBLE_CLICK(id, func)} + Respond to wxEVT_PG_DOUBLE_CLICK event, which occurs when property is + double-clicked onwith left mouse button. + @event{EVT_PG_ITEM_COLLAPSED(id, func)} + Respond to wxEVT_PG_ITEM_COLLAPSED event, generated when user collapses + a property or category.. + @event{EVT_PG_ITEM_EXPANDED(id, func)} + Respond to wxEVT_PG_ITEM_EXPANDED event, generated when user expands + a property or category.. + @event{EVT_PG_LABEL_EDIT_BEGIN(id, func)} + Respond to wxEVT_PG_LABEL_EDIT_BEGIN event, generated when is about to + begin editing a property label. You can veto this event to prevent the + action. + @event{EVT_PG_LABEL_EDIT_ENDING(id, func)} + Respond to wxEVT_PG_LABEL_EDIT_ENDING event, generated when is about to + end editing of a property label. You can veto this event to prevent the + action. + @event{EVT_PG_COL_BEGIN_DRAG(id, func)} + Respond to wxEVT_PG_COL_BEGIN_DRAG event, generated when user + starts resizing a column - can be vetoed. + @event{EVT_PG_COL_DRAGGING,(id, func)} + Respond to wxEVT_PG_COL_DRAGGING, event, generated when a + column resize by user is in progress. This event is also generated + when user double-clicks the splitter in order to recenter + it. + @event{EVT_PG_COL_END_DRAG(id, func)} + Respond to wxEVT_PG_COL_END_DRAG event, generated after column + resize by user has finished. + @endEventTable + + @remarks + + - Use Freeze() and Thaw() respectively to disable and enable drawing. This + will also delay sorting etc. miscellaneous calculations to the last + possible moment. + + @library{wxpropgrid} + @category{propgrid} +*/ +class WXDLLIMPEXP_PROPGRID wxPropertyGrid : public wxControl, + public wxScrollHelper, + public wxPropertyGridInterface +{ + friend class wxPropertyGridEvent; + friend class wxPropertyGridPageState; + friend class wxPropertyGridInterface; + friend class wxPropertyGridManager; + friend class wxPGHeaderCtrl; + + DECLARE_DYNAMIC_CLASS(wxPropertyGrid) +public: + +#ifndef SWIG + /** + Two step constructor. + + Call Create when this constructor is called to build up the + wxPropertyGrid + */ + wxPropertyGrid(); +#endif + + /** The default constructor. The styles to be used are styles valid for + the wxWindow. + + @see @link wndflags Additional Window Styles @endlink + */ + wxPropertyGrid( wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxPG_DEFAULT_STYLE, + const wxString& name = wxPropertyGridNameStr ); + + /** Destructor */ + virtual ~wxPropertyGrid(); + + /** Adds given key combination to trigger given action. + + Here is a sample code to make Enter key press move focus to + the next property. + + @code + propGrid->AddActionTrigger(wxPG_ACTION_NEXT_PROPERTY, + WXK_RETURN); + propGrid->DedicateKey(WXK_RETURN); + @endcode + + @param action + Which action to trigger. See @ref propgrid_keyboard_actions. + @param keycode + Which keycode triggers the action. + @param modifiers + Which key event modifiers, in addition to keycode, are needed to + trigger the action. + */ + void AddActionTrigger( int action, int keycode, int modifiers = 0 ); + + /** + Dedicates a specific keycode to wxPropertyGrid. This means that such + key presses will not be redirected to editor controls. + + Using this function allows, for example, navigation between + properties using arrow keys even when the focus is in the editor + control. + */ + void DedicateKey( int keycode ) + { + m_dedicatedKeys.push_back(keycode); + } + + /** + This static function enables or disables automatic use of + wxGetTranslation for following strings: wxEnumProperty list labels, + wxFlagsProperty sub-property labels. + + Default is false. + */ + static void AutoGetTranslation( bool enable ); + + /** + Changes value of a property, as if from an editor. + + Use this instead of SetPropertyValue() if you need the value to run + through validation process, and also send the property change event. + + @return + Returns true if value was successfully changed. + */ + bool ChangePropertyValue( wxPGPropArg id, wxVariant newValue ); + + /** + Centers the splitter. + + @param enableAutoResizing + If @true, automatic column resizing is enabled (only applicapple + if window style wxPG_SPLITTER_AUTO_CENTER is used). + */ + void CenterSplitter( bool enableAutoResizing = false ); + + /** Deletes all properties. + */ + virtual void Clear(); + + /** Clears action triggers for given action. + @param action + Which action to trigger. See @link pgactions List of list of + wxPropertyGrid actions@endlink. + */ + void ClearActionTriggers( int action ); + + /** Forces updating the value of property from the editor control. + + Note that wxEVT_PG_CHANGING and wxEVT_PG_CHANGED are dispatched using + ProcessEvent, meaning your event handlers will be called immediately. + + @return + Returns true if anything was changed. + */ + virtual bool CommitChangesFromEditor( wxUint32 flags = 0 ); + + /** + Two step creation. + + Whenever the control is created without any parameters, use Create to + actually create it. Don't access the control's public methods before + this is called @see @link wndflags Additional Window Styles@endlink + */ + bool Create( wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxPG_DEFAULT_STYLE, + const wxString& name = wxPropertyGridNameStr ); + + /** + Call when editor widget's contents is modified. + + For example, this is called when changes text in wxTextCtrl (used in + wxStringProperty and wxIntProperty). + + @remarks + This function should only be called by custom properties. + + @see wxPGProperty::OnEvent() + */ + void EditorsValueWasModified() { m_iFlags |= wxPG_FL_VALUE_MODIFIED; } + + /** Reverse of EditorsValueWasModified(). + + @remarks + This function should only be called by custom properties. + */ + void EditorsValueWasNotModified() + { + m_iFlags &= ~(wxPG_FL_VALUE_MODIFIED); + } + + /** + Enables or disables (shows/hides) categories according to parameter + enable. + */ + bool EnableCategories( bool enable ); + + /** Scrolls and/or expands items to ensure that the given item is visible. + Returns true if something was actually done. + */ + bool EnsureVisible( wxPGPropArg id ); + + /** + Reduces column sizes to minimum possible that contents are still + visibly (naturally some margin space will be applied as well). + + @return + Minimum size for the grid to still display everything. + + @remarks + Does not work well with wxPG_SPLITTER_AUTO_CENTER window style. + + This function only works properly if grid size prior to call was already + fairly large. + + Note that you can also get calculated column widths by calling + GetState->GetColumnWidth() immediately after this function returns. + */ + wxSize FitColumns() + { + wxSize sz = m_pState->DoFitColumns(); + return sz; + } + + /** + Returns wxWindow that the properties are painted on, and which should + be used as the parent for editor controls. + */ + wxWindow* GetPanel() + { + return this; + } + + /** Returns current category caption background colour. */ + wxColour GetCaptionBackgroundColour() const { return m_colCapBack; } + + wxFont& GetCaptionFont() { return m_captionFont; } + + const wxFont& GetCaptionFont() const { return m_captionFont; } + + /** Returns current category caption text colour. */ + wxColour GetCaptionForegroundColour() const { return m_colCapFore; } + + /** Returns current cell background colour. */ + wxColour GetCellBackgroundColour() const { return m_colPropBack; } + + /** Returns current cell text colour when disabled. */ + wxColour GetCellDisabledTextColour() const { return m_colDisPropFore; } + + /** Returns current cell text colour. */ + wxColour GetCellTextColour() const { return m_colPropFore; } + + /** + Returns number of columns currently on grid. + */ + unsigned int GetColumnCount() const + { + return (unsigned int) m_pState->m_colWidths.size(); + } + + /** Returns colour of empty space below properties. */ + wxColour GetEmptySpaceColour() const { return m_colEmptySpace; } + + /** Returns height of highest characters of used font. */ + int GetFontHeight() const { return m_fontHeight; } + + /** Returns pointer to itself. Dummy function that enables same kind + of code to use wxPropertyGrid and wxPropertyGridManager. + */ + wxPropertyGrid* GetGrid() { return this; } + + /** Returns rectangle of custom paint image. + */ + wxRect GetImageRect( wxPGProperty* p, int item ) const; + + /** Returns size of the custom paint image in front of property. + If no argument is given, returns preferred size. + */ + wxSize GetImageSize( wxPGProperty* p = NULL, int item = -1 ) const; + + //@{ + /** Returns last item which could be iterated using given flags. + @param flags + See @ref propgrid_iterator_flags. + */ + wxPGProperty* GetLastItem( int flags = wxPG_ITERATE_DEFAULT ) + { + return m_pState->GetLastItem(flags); + } + + const wxPGProperty* GetLastItem( int flags = wxPG_ITERATE_DEFAULT ) const + { + return m_pState->GetLastItem(flags); + } + //@} + + /** Returns colour of lines between cells. */ + wxColour GetLineColour() const { return m_colLine; } + + /** Returns background colour of margin. */ + wxColour GetMarginColour() const { return m_colMargin; } + + /** Returns margin width. */ + int GetMarginWidth() const { return m_marginWidth; } + + /** + Returns most up-to-date value of selected property. This will return + value different from GetSelectedProperty()->GetValue() only when text + editor is activate and string edited by user represents valid, + uncommitted property value. + */ + wxVariant GetUncommittedPropertyValue(); + + /** Returns "root property". It does not have name, etc. and it is not + visible. It is only useful for accessing its children. + */ + wxPGProperty* GetRoot() const { return m_pState->m_properties; } + + /** Returns height of a single grid row (in pixels). */ + int GetRowHeight() const { return m_lineHeight; } + + /** Returns currently selected property. */ + wxPGProperty* GetSelectedProperty() const { return GetSelection(); } + + /** Returns current selection background colour. */ + wxColour GetSelectionBackgroundColour() const { return m_colSelBack; } + + /** Returns current selection text colour. */ + wxColour GetSelectionForegroundColour() const { return m_colSelFore; } + + /** + Returns current splitter x position. + */ + int GetSplitterPosition( unsigned int splitterIndex = 0 ) const + { + return m_pState->DoGetSplitterPosition(splitterIndex); + } + + /** Returns wxTextCtrl active in currently selected property, if any. Takes + into account wxOwnerDrawnComboBox. + */ + wxTextCtrl* GetEditorTextCtrl() const; + + wxPGValidationInfo& GetValidationInfo() + { + return m_validationInfo; + } + + /** Returns current vertical spacing. */ + int GetVerticalSpacing() const { return (int)m_vspacing; } + + /** + Returns @true if a property editor control has focus. + */ + bool IsEditorFocused() const; + + /** Returns true if editor's value was marked modified. + */ + bool IsEditorsValueModified() const + { return ( m_iFlags & wxPG_FL_VALUE_MODIFIED ) ? true : false; } + + /** + Returns information about arbitrary position in the grid. + + @param pt + Coordinates in the virtual grid space. You may need to use + wxScrolled<T>::CalcScrolledPosition() for translating + wxPropertyGrid client coordinates into something this member + function can use. + */ + wxPropertyGridHitTestResult HitTest( const wxPoint& pt ) const; + + /** Returns true if any property has been modified by the user. */ + bool IsAnyModified() const { return (m_pState->m_anyModified>0); } + + /** + Returns true if updating is frozen (ie Freeze() called but not yet + Thaw() ). + */ + bool IsFrozen() const { return (m_frozen>0)?true:false; } + + /** + It is recommended that you call this function any time your code causes + wxPropertyGrid's top-level parent to change. wxPropertyGrid's OnIdle() + handler should be able to detect most changes, but it is not perfect. + + @param newTLP + New top-level parent that is about to be set. Old top-level parent + window should still exist as the current one. + + @remarks This function is automatically called from wxPropertyGrid:: + Reparent() and wxPropertyGridManager::Reparent(). You only + need to use it if you reparent wxPropertyGrid indirectly. + */ + void OnTLPChanging( wxWindow* newTLP ); + + /** Redraws given property. + */ + virtual void RefreshProperty( wxPGProperty* p ); + + /** Registers a new editor class. + @return + Pointer to the editor class instance that should be used. + */ + static wxPGEditor* RegisterEditorClass( wxPGEditor* editor, + bool noDefCheck = false ) + { + return DoRegisterEditorClass(editor, wxEmptyString, noDefCheck); + } + + static wxPGEditor* DoRegisterEditorClass( wxPGEditor* editorClass, + const wxString& editorName, + bool noDefCheck = false ); + + /** Resets all colours to the original system values. + */ + void ResetColours(); + + /** + Resets column sizes and splitter positions, based on proportions. + + @param enableAutoResizing + If @true, automatic column resizing is enabled (only applicapple + if window style wxPG_SPLITTER_AUTO_CENTER is used). + + @see wxPropertyGridInterface::SetColumnProportion() + */ + void ResetColumnSizes( bool enableAutoResizing = false ); + + /** + Selects a property. + Editor widget is automatically created, but not focused unless focus is + true. + + @param id + Property to select. + + @return + True if selection finished successfully. Usually only fails if + current value in editor is not valid. + + @remarks In wxPropertyGrid 1.4, this member function used to generate + wxEVT_PG_SELECTED. In wxWidgets 2.9 and later, it no longer + does that. + + @remarks This clears any previous selection. + */ + bool SelectProperty( wxPGPropArg id, bool focus = false ); + + /** + Set entire new selection from given list of properties. + */ + void SetSelection( const wxArrayPGProperty& newSelection ) + { + DoSetSelection( newSelection, wxPG_SEL_DONT_SEND_EVENT ); + } + + /** + Adds given property into selection. If wxPG_EX_MULTIPLE_SELECTION + extra style is not used, then this has same effect as + calling SelectProperty(). + + @remarks Multiple selection is not supported for categories. This + means that if you have properties selected, you cannot + add category to selection, and also if you have category + selected, you cannot add other properties to selection. + This member function will fail silently in these cases, + even returning true. + */ + bool AddToSelection( wxPGPropArg id ) + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false) + return DoAddToSelection(p, wxPG_SEL_DONT_SEND_EVENT); + } + + /** + Removes given property from selection. If property is not selected, + an assertion failure will occur. + */ + bool RemoveFromSelection( wxPGPropArg id ) + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false) + return DoRemoveFromSelection(p, wxPG_SEL_DONT_SEND_EVENT); + } + + /** + Makes given column editable by user. + + @param editable + Using @false here will disable column from being editable. + */ + void MakeColumnEditable( unsigned int column, bool editable = true ); + + /** + Creates label editor wxTextCtrl for given column, for property + that is currently selected. When multiple selection is + enabled, this applies to whatever property GetSelection() + returns. + + @param colIndex + Which column's label to edit. Note that you should not + use value 1, which is reserved for property value + column. + + @see EndLabelEdit(), MakeColumnEditable() + */ + void BeginLabelEdit( unsigned int column = 0 ) + { + DoBeginLabelEdit(column, wxPG_SEL_DONT_SEND_EVENT); + } + + /** + Destroys label editor wxTextCtrl, if any. + + @param commit + Use @true (default) to store edited label text in + property cell data. + + @see BeginLabelEdit(), MakeColumnEditable() + */ + void EndLabelEdit( bool commit = true ) + { + DoEndLabelEdit(commit, wxPG_SEL_DONT_SEND_EVENT); + } + + /** + Returns currently active label editor, NULL if none. + */ + wxTextCtrl* GetLabelEditor() const + { + return m_labelEditor; + } + + /** Sets category caption background colour. */ + void SetCaptionBackgroundColour(const wxColour& col); + + /** Sets category caption text colour. */ + void SetCaptionTextColour(const wxColour& col); + + /** Sets default cell background colour - applies to property cells. + Note that appearance of editor widgets may not be affected. + */ + void SetCellBackgroundColour(const wxColour& col); + + /** Sets cell text colour for disabled properties. + */ + void SetCellDisabledTextColour(const wxColour& col); + + /** Sets default cell text colour - applies to property name and value text. + Note that appearance of editor widgets may not be affected. + */ + void SetCellTextColour(const wxColour& col); + + /** Set number of columns (2 or more). + */ + void SetColumnCount( int colCount ) + { + m_pState->SetColumnCount(colCount); + Refresh(); + } + + /** + Sets the 'current' category - Append will add non-category properties + under it. + */ + void SetCurrentCategory( wxPGPropArg id ) + { + wxPG_PROP_ARG_CALL_PROLOG() + wxPropertyCategory* pc = wxDynamicCast(p, wxPropertyCategory); + wxASSERT(pc); + m_pState->m_currentCategory = pc; + } + + /** Sets colour of empty space below properties. */ + void SetEmptySpaceColour(const wxColour& col); + + /** Sets colour of lines between cells. */ + void SetLineColour(const wxColour& col); + + /** Sets background colour of margin. */ + void SetMarginColour(const wxColour& col); + + /** + Sets selection background colour - applies to selected property name + background. + */ + void SetSelectionBackgroundColour(const wxColour& col); + + /** + Sets selection foreground colour - applies to selected property name + text. + */ + void SetSelectionTextColour(const wxColour& col); + + /** Sets x coordinate of the splitter. + @remarks + Splitter position cannot exceed grid size, and therefore setting it + during form creation may fail as initial grid size is often smaller + than desired splitter position, especially when sizers are being used. + */ + void SetSplitterPosition( int newXPos, int col = 0 ) + { + DoSetSplitterPosition(newXPos, col, wxPG_SPLITTER_REFRESH); + } + + /** + Sets the property sorting function. + + @param sortFunction + The sorting function to be used. It should return a value greater + than 0 if position of p1 is after p2. So, for instance, when + comparing property names, you can use following implementation: + + @code + int MyPropertySortFunction(wxPropertyGrid* propGrid, + wxPGProperty* p1, + wxPGProperty* p2) + { + return p1->GetBaseName().compare( p2->GetBaseName() ); + } + @endcode + + @remarks + Default property sort function sorts properties by their labels + (case-insensitively). + + @see GetSortFunction, wxPropertyGridInterface::Sort, + wxPropertyGridInterface::SortChildren + */ + void SetSortFunction( wxPGSortCallback sortFunction ) + { + m_sortFunction = sortFunction; + } + + /** + Returns the property sort function (default is @NULL). + + @see SetSortFunction + */ + wxPGSortCallback GetSortFunction() const + { + return m_sortFunction; + } + + /** + Sets appearance of value cells representing an unspecified property + value. Default appearance is blank. + + @remarks If you set the unspecified value to have any + textual representation, then that will override + "InlineHelp" attribute. + + @see wxPGProperty::SetValueToUnspecified(), + wxPGProperty::IsValueUnspecified() + */ + void SetUnspecifiedValueAppearance( const wxPGCell& cell ) + { + m_unspecifiedAppearance = m_propertyDefaultCell; + m_unspecifiedAppearance.MergeFrom(cell); + } + + /** + Returns current appearance of unspecified value cells. + + @see SetUnspecifiedValueAppearance() + */ + const wxPGCell& GetUnspecifiedValueAppearance() const + { + return m_unspecifiedAppearance; + } + + /** + Returns (visual) text representation of the unspecified + property value. + + @param argFlags For internal use only. + */ + wxString GetUnspecifiedValueText( int argFlags = 0 ) const; + + /** Set virtual width for this particular page. Width -1 indicates that the + virtual width should be disabled. */ + void SetVirtualWidth( int width ); + + /** + Moves splitter as left as possible, while still allowing all + labels to be shown in full. + + @param privateChildrenToo + If @false, will still allow private children to be cropped. + */ + void SetSplitterLeft( bool privateChildrenToo = false ) + { + m_pState->SetSplitterLeft(privateChildrenToo); + } + + /** Sets vertical spacing. Can be 1, 2, or 3 - a value relative to font + height. Value of 2 should be default on most platforms. + */ + void SetVerticalSpacing( int vspacing ) + { + m_vspacing = (unsigned char)vspacing; + CalculateFontAndBitmapStuff( vspacing ); + if ( !m_pState->m_itemsAdded ) Refresh(); + } + + /** Shows an brief error message that is related to a property. */ + void ShowPropertyError( wxPGPropArg id, const wxString& msg ) + { + wxPG_PROP_ARG_CALL_PROLOG() + DoShowPropertyError(p, msg); + } + + ///////////////////////////////////////////////////////////////// + // + // Following methods do not need to be (currently) documented + // + ///////////////////////////////////////////////////////////////// + + bool HasVirtualWidth() const + { return (m_iFlags & wxPG_FL_HAS_VIRTUAL_WIDTH) ? true : false; } + + const wxPGCommonValue* GetCommonValue( unsigned int i ) const + { + return (wxPGCommonValue*) m_commonValues[i]; + } + + /** Returns number of common values. + */ + unsigned int GetCommonValueCount() const + { + return (unsigned int) m_commonValues.size(); + } + + /** Returns label of given common value. + */ + wxString GetCommonValueLabel( unsigned int i ) const + { + wxASSERT( GetCommonValue(i) ); + return GetCommonValue(i)->GetLabel(); + } + + /** + Returns index of common value that will truly change value to + unspecified. + */ + int GetUnspecifiedCommonValue() const { return m_cvUnspecified; } + + /** Set index of common value that will truly change value to unspecified. + Using -1 will set none to have such effect. + Default is 0. + */ + void SetUnspecifiedCommonValue( int index ) { m_cvUnspecified = index; } + + /** + Shortcut for creating dialog-caller button. Used, for example, by + wxFontProperty. + @remarks + This should only be called by properties. + */ + wxWindow* GenerateEditorButton( const wxPoint& pos, const wxSize& sz ); + + /** Fixes position of wxTextCtrl-like control (wxSpinCtrl usually + fits as one). Call after control has been created (but before + shown). + */ + void FixPosForTextCtrl( wxWindow* ctrl, + unsigned int forColumn = 1, + const wxPoint& offset = wxPoint(0, 0) ); + + /** Shortcut for creating text editor widget. + @param pos + Same as pos given for CreateEditor. + @param sz + Same as sz given for CreateEditor. + @param value + Initial text for wxTextCtrl. + @param secondary + If right-side control, such as button, also created, then create it + first and pass it as this parameter. + @param extraStyle + Extra style flags to pass for wxTextCtrl. + @remarks + Note that this should generally be called only by new classes derived + from wxPGProperty. + */ + wxWindow* GenerateEditorTextCtrl( const wxPoint& pos, + const wxSize& sz, + const wxString& value, + wxWindow* secondary, + int extraStyle = 0, + int maxLen = 0, + unsigned int forColumn = 1 ); + + /* Generates both textctrl and button. + */ + wxWindow* GenerateEditorTextCtrlAndButton( const wxPoint& pos, + const wxSize& sz, wxWindow** psecondary, int limited_editing, + wxPGProperty* property ); + + /** Generates position for a widget editor dialog box. + @param p + Property for which dialog is positioned. + @param sz + Known or over-approximated size of the dialog. + @return + Position for dialog. + */ + wxPoint GetGoodEditorDialogPosition( wxPGProperty* p, + const wxSize& sz ); + + // Converts escape sequences in src_str to newlines, + // tabs, etc. and copies result to dst_str. + static wxString& ExpandEscapeSequences( wxString& dst_str, + wxString& src_str ); + + // Converts newlines, tabs, etc. in src_str to escape + // sequences, and copies result to dst_str. + static wxString& CreateEscapeSequences( wxString& dst_str, + wxString& src_str ); + + /** + Returns rectangle that fully contains properties between and including + p1 and p2. Rectangle is in virtual scrolled window coordinates. + */ + wxRect GetPropertyRect( const wxPGProperty* p1, + const wxPGProperty* p2 ) const; + + /** Returns pointer to current active primary editor control (NULL if none). + */ + wxWindow* GetEditorControl() const; + + wxWindow* GetPrimaryEditor() const + { + return GetEditorControl(); + } + + /** + Returns pointer to current active secondary editor control (NULL if + none). + */ + wxWindow* GetEditorControlSecondary() const + { + return m_wndEditor2; + } + + /** + Refreshes any active editor control. + */ + void RefreshEditor(); + + // Events from editor controls are forward to this function + bool HandleCustomEditorEvent( wxEvent &event ); + + // Mostly useful for page switching. + void SwitchState( wxPropertyGridPageState* pNewState ); + + long GetInternalFlags() const { return m_iFlags; } + bool HasInternalFlag( long flag ) const + { return (m_iFlags & flag) ? true : false; } + void SetInternalFlag( long flag ) { m_iFlags |= flag; } + void ClearInternalFlag( long flag ) { m_iFlags &= ~(flag); } + void IncFrozen() { m_frozen++; } + void DecFrozen() { m_frozen--; } + + void OnComboItemPaint( const wxPGComboBox* pCb, + int item, + wxDC* pDc, + wxRect& rect, + int flags ); + + /** Standardized double-to-string conversion. + */ + static const wxString& DoubleToString( wxString& target, + double value, + int precision, + bool removeZeroes, + wxString* precTemplate = NULL ); + + /** + Call this from wxPGProperty::OnEvent() to cause property value to be + changed after the function returns (with true as return value). + ValueChangeInEvent() must be used if you wish the application to be + able to use wxEVT_PG_CHANGING to potentially veto the given value. + */ + void ValueChangeInEvent( wxVariant variant ) + { + m_changeInEventValue = variant; + m_iFlags |= wxPG_FL_VALUE_CHANGE_IN_EVENT; + } + + /** + You can use this member function, for instance, to detect in + wxPGProperty::OnEvent() if wxPGProperty::SetValueInEvent() was + already called in wxPGEditor::OnEvent(). It really only detects + if was value was changed using wxPGProperty::SetValueInEvent(), which + is usually used when a 'picker' dialog is displayed. If value was + written by "normal means" in wxPGProperty::StringToValue() or + IntToValue(), then this function will return false (on the other hand, + wxPGProperty::OnEvent() is not even called in those cases). + */ + bool WasValueChangedInEvent() const + { + return (m_iFlags & wxPG_FL_VALUE_CHANGE_IN_EVENT) ? true : false; + } + + /** Returns true if given event is from first of an array of buttons + (as can be in case when wxPGMultiButton is used). + */ + bool IsMainButtonEvent( const wxEvent& event ) + { + return (event.GetEventType() == wxEVT_BUTTON) + && (m_wndSecId == event.GetId()); + } + + /** Pending value is expected to be passed in PerformValidation(). + */ + virtual bool DoPropertyChanged( wxPGProperty* p, + unsigned int selFlags = 0 ); + + /** Called when validation for given property fails. + @param invalidValue + Value which failed in validation. + @return + Return true if user is allowed to change to another property even + if current has invalid value. + @remarks + To add your own validation failure behaviour, override + wxPropertyGrid::DoOnValidationFailure(). + */ + bool OnValidationFailure( wxPGProperty* property, + wxVariant& invalidValue ); + + /** Called to indicate property and editor has valid value now. + */ + void OnValidationFailureReset( wxPGProperty* property ) + { + if ( property && property->HasFlag(wxPG_PROP_INVALID_VALUE) ) + { + DoOnValidationFailureReset(property); + property->ClearFlag(wxPG_PROP_INVALID_VALUE); + } + m_validationInfo.m_failureMessage.clear(); + } + + /** + Override in derived class to display error messages in custom manner + (these message usually only result from validation failure). + + @remarks If you implement this, then you also need to implement + DoHidePropertyError() - possibly to do nothing, if error + does not need hiding (e.g. it was logged or shown in a + message box). + + @see DoHidePropertyError() + */ + virtual void DoShowPropertyError( wxPGProperty* property, + const wxString& msg ); + + /** + Override in derived class to hide an error displayed by + DoShowPropertyError(). + + @see DoShowPropertyError() + */ + virtual void DoHidePropertyError( wxPGProperty* property ); + +#if wxUSE_STATUSBAR + /** + Return wxStatusBar that is used by this wxPropertyGrid. You can + reimplement this member function in derived class to override + the default behaviour of using the top-level wxFrame's status + bar, if any. + */ + virtual wxStatusBar* GetStatusBar(); +#endif + + /** Override to customize property validation failure behaviour. + @param invalidValue + Value which failed in validation. + @return + Return true if user is allowed to change to another property even + if current has invalid value. + */ + virtual bool DoOnValidationFailure( wxPGProperty* property, + wxVariant& invalidValue ); + + /** Override to customize resetting of property validation failure status. + @remarks + Property is guaranteed to have flag wxPG_PROP_INVALID_VALUE set. + */ + virtual void DoOnValidationFailureReset( wxPGProperty* property ); + + int GetSpacingY() const { return m_spacingy; } + + /** + Must be called in wxPGEditor::CreateControls() if primary editor window + is wxTextCtrl, just before textctrl is created. + @param text + Initial text value of created wxTextCtrl. + */ + void SetupTextCtrlValue( const wxString text ) { m_prevTcValue = text; } + + /** + Unfocuses or closes editor if one was open, but does not deselect + property. + */ + bool UnfocusEditor(); + + virtual void SetWindowStyleFlag( long style ); + + void DrawItems( const wxPGProperty* p1, const wxPGProperty* p2 ); + + void DrawItem( wxPGProperty* p ) + { + DrawItems(p,p); + } + + virtual void DrawItemAndChildren( wxPGProperty* p ); + + /** + Draws item, children, and consequtive parents as long as category is + not met. + */ + void DrawItemAndValueRelated( wxPGProperty* p ); + +protected: + + /** + wxPropertyGridPageState used by the grid is created here. + + If grid is used in wxPropertyGridManager, there is no point overriding + this - instead, set custom wxPropertyGridPage classes. + */ + virtual wxPropertyGridPageState* CreateState() const; + + enum PerformValidationFlags + { + SendEvtChanging = 0x0001, + IsStandaloneValidation = 0x0002 // Not called in response to event + }; + + /** + Runs all validation functionality (includes sending wxEVT_PG_CHANGING). + Returns true if all tests passed. Implement in derived class to + add additional validation behaviour. + */ + virtual bool PerformValidation( wxPGProperty* p, + wxVariant& pendingValue, + int flags = SendEvtChanging ); + +public: + + // Control font changer helper. + void SetCurControlBoldFont(); + + wxPGCell& GetPropertyDefaultCell() + { + return m_propertyDefaultCell; + } + + wxPGCell& GetCategoryDefaultCell() + { + return m_categoryDefaultCell; + } + + // + // Public methods for semi-public use + // + bool DoSelectProperty( wxPGProperty* p, unsigned int flags = 0 ); + + // Overridden functions. + virtual bool Destroy(); + // Returns property at given y coordinate (relative to grid's top left). + wxPGProperty* GetItemAtY( int y ) const { return DoGetItemAtY(y); } + + virtual void Refresh( bool eraseBackground = true, + const wxRect *rect = (const wxRect *) NULL ); + virtual bool SetFont( const wxFont& font ); + virtual void Freeze(); + virtual void SetExtraStyle( long exStyle ); + virtual void Thaw(); + virtual bool Reparent( wxWindowBase *newParent ); + +protected: + virtual wxSize DoGetBestSize() const; + +#ifndef wxPG_ICON_WIDTH + wxBitmap *m_expandbmp, *m_collbmp; +#endif + + wxCursor *m_cursorSizeWE; + + /** wxWindow pointers to editor control(s). */ + wxWindow *m_wndEditor; + wxWindow *m_wndEditor2; + + wxBitmap *m_doubleBuffer; + + /** Local time ms when control was created. */ + wxLongLong m_timeCreated; + + /** wxPGProperty::OnEvent can change value by setting this. */ + wxVariant m_changeInEventValue; + + /** Id of m_wndEditor2, or its first child, if any. */ + int m_wndSecId; + + /** Extra Y spacing between the items. */ + int m_spacingy; + + /** Control client area width; updated on resize. */ + int m_width; + + /** Control client area height; updated on resize. */ + int m_height; + + /** Current non-client width (needed when auto-centering). */ + int m_ncWidth; + + /** Non-client width (auto-centering helper). */ + //int m_fWidth; + + /** Previously recorded scroll start position. */ + int m_prevVY; + + /** + The gutter spacing in front and back of the image. + This determines the amount of spacing in front of each item + */ + int m_gutterWidth; + + /** Includes separator line. */ + int m_lineHeight; + + /** Gutter*2 + image width. */ + int m_marginWidth; + + // y spacing for expand/collapse button. + int m_buttonSpacingY; + + /** Extra margin for expanded sub-group items. */ + int m_subgroup_extramargin; + + /** + The image width of the [+] icon. + + This is also calculated in the gutter + */ + int m_iconWidth; + +#ifndef wxPG_ICON_WIDTH + + /** + The image height of the [+] icon. + + This is calculated as minimal size and to align + */ + int m_iconHeight; +#endif + + /** Current cursor id. */ + int m_curcursor; + + // Caption font. Same as normal font plus bold style. + wxFont m_captionFont; + + int m_fontHeight; // Height of the font. + + /** m_splitterx when drag began. */ + int m_startingSplitterX; + + /** + Index to splitter currently being dragged (0=one after the first + column). + */ + int m_draggedSplitter; + + /** Changed property, calculated in PerformValidation(). */ + wxPGProperty* m_chgInfo_changedProperty; + + /** + Lowest property for which editing happened, but which does not have + aggregate parent + */ + wxPGProperty* m_chgInfo_baseChangedProperty; + + /** Changed property value, calculated in PerformValidation(). */ + wxVariant m_chgInfo_pendingValue; + + /** Passed to SetValue. */ + wxVariant m_chgInfo_valueList; + + /** Validation information. */ + wxPGValidationInfo m_validationInfo; + + /** Actions and keys that trigger them. */ + wxPGHashMapI2I m_actionTriggers; + + /** Appearance of currently active editor. */ + wxPGCell m_editorAppearance; + + /** Appearance of a unspecified value cell. */ + wxPGCell m_unspecifiedAppearance; + + /** List of properties to be deleted/removed in idle event handler. */ + wxArrayPGProperty m_deletedProperties; + wxArrayPGProperty m_removedProperties; + + /** List of key codes that will not be handed over to editor controls. */ + // FIXME: Make this a hash set once there is template-based wxHashSet. + wxVector<int> m_dedicatedKeys; + + // + // Temporary values + // + + /** Bits are used to indicate which colours are customized. */ + unsigned short m_coloursCustomized; + + /** x - m_splitterx. */ + signed char m_dragOffset; + + /** 0 = not dragging, 1 = drag just started, 2 = drag in progress */ + unsigned char m_dragStatus; + + /** 0 = margin, 1 = label, 2 = value. */ + unsigned char m_mouseSide; + + /** True when editor control is focused. */ + unsigned char m_editorFocused; + + /** 1 if m_latsCaption is also the bottommost caption. */ + //unsigned char m_lastCaptionBottomnest; + + /** Set to 1 when graphics frozen. */ + unsigned char m_frozen; + + unsigned char m_vspacing; + + // Used to track when Alt/Ctrl+Key was consumed. + unsigned char m_keyComboConsumed; + + /** 1 if in DoPropertyChanged() */ + bool m_inDoPropertyChanged; + + /** 1 if in CommitChangesFromEditor() */ + bool m_inCommitChangesFromEditor; + + /** 1 if in DoSelectProperty() */ + bool m_inDoSelectProperty; + + bool m_inOnValidationFailure; + + wxPGVFBFlags m_permanentValidationFailureBehavior; // Set by app + + // DoEditorValidate() recursion guard + wxRecursionGuardFlag m_validatingEditor; + + /** Internal flags - see wxPG_FL_XXX constants. */ + wxUint32 m_iFlags; + + /** When drawing next time, clear this many item slots at the end. */ + int m_clearThisMany; + + // Mouse is hovering over this column (index) + unsigned int m_colHover; + + // pointer to property that has mouse hovering + wxPGProperty* m_propHover; + + // Active label editor + wxTextCtrl* m_labelEditor; + + // For which property the label editor is active + wxPGProperty* m_labelEditorProperty; + + // EventObject for wxPropertyGridEvents + wxWindow* m_eventObject; + + // What (global) window is currently focused (needed to resolve event + // handling mess). + wxWindow* m_curFocused; + + // Event currently being sent - NULL if none at the moment + wxPropertyGridEvent* m_processedEvent; + + // Last known top-level parent + wxWindow* m_tlp; + + // Last closed top-level parent + wxWindow* m_tlpClosed; + + // Local time ms when tlp was closed. + wxLongLong m_tlpClosedTime; + + // Sort function + wxPGSortCallback m_sortFunction; + + // y coordinate of property that mouse hovering + int m_propHoverY; + + // Which column's editor is selected (usually 1)? + unsigned int m_selColumn; + + // x relative to splitter (needed for resize). + int m_ctrlXAdjust; + + // lines between cells + wxColour m_colLine; + // property labels and values are written in this colour + wxColour m_colPropFore; + // or with this colour when disabled + wxColour m_colDisPropFore; + // background for m_colPropFore + wxColour m_colPropBack; + // text color for captions + wxColour m_colCapFore; + // background color for captions + wxColour m_colCapBack; + // foreground for selected property + wxColour m_colSelFore; + // background for selected property (actually use background color when + // control out-of-focus) + wxColour m_colSelBack; + // background colour for margin + wxColour m_colMargin; + // background colour for empty space below the grid + wxColour m_colEmptySpace; + + // Default property colours + wxPGCell m_propertyDefaultCell; + + // Default property category + wxPGCell m_categoryDefaultCell; + + // Backup of selected property's cells + wxVector<wxPGCell> m_propCellsBackup; + + // NB: These *cannot* be moved to globals. + + // labels when properties use common values + wxVector<wxPGCommonValue*> m_commonValues; + + // array of live events + wxVector<wxPropertyGridEvent*> m_liveEvents; + + // Which cv selection really sets value to unspecified? + int m_cvUnspecified; + + // Used to skip excess text editor events + wxString m_prevTcValue; + +protected: + + // Sets some members to defaults (called constructors). + void Init1(); + + // Initializes some members (called by Create and complex constructor). + void Init2(); + + void OnPaint(wxPaintEvent &event ); + + // main event receivers + void OnMouseMove( wxMouseEvent &event ); + void OnMouseClick( wxMouseEvent &event ); + void OnMouseRightClick( wxMouseEvent &event ); + void OnMouseDoubleClick( wxMouseEvent &event ); + void OnMouseUp( wxMouseEvent &event ); + void OnKey( wxKeyEvent &event ); + void OnResize( wxSizeEvent &event ); + + // event handlers + bool HandleMouseMove( int x, unsigned int y, wxMouseEvent &event ); + bool HandleMouseClick( int x, unsigned int y, wxMouseEvent &event ); + bool HandleMouseRightClick( int x, unsigned int y, wxMouseEvent &event ); + bool HandleMouseDoubleClick( int x, unsigned int y, wxMouseEvent &event ); + bool HandleMouseUp( int x, unsigned int y, wxMouseEvent &event ); + void HandleKeyEvent( wxKeyEvent &event, bool fromChild ); + + void OnMouseEntry( wxMouseEvent &event ); + + void OnIdle( wxIdleEvent &event ); + void OnFocusEvent( wxFocusEvent &event ); + void OnChildFocusEvent( wxChildFocusEvent& event ); + + bool OnMouseCommon( wxMouseEvent &event, int* px, int *py ); + bool OnMouseChildCommon( wxMouseEvent &event, int* px, int *py ); + + // sub-control event handlers + void OnMouseClickChild( wxMouseEvent &event ); + void OnMouseRightClickChild( wxMouseEvent &event ); + void OnMouseMoveChild( wxMouseEvent &event ); + void OnMouseUpChild( wxMouseEvent &event ); + void OnChildKeyDown( wxKeyEvent &event ); + + void OnCaptureChange( wxMouseCaptureChangedEvent &event ); + + void OnScrollEvent( wxScrollWinEvent &event ); + + void OnSysColourChanged( wxSysColourChangedEvent &event ); + + void OnTLPClose( wxCloseEvent& event ); + +protected: + + bool AddToSelectionFromInputEvent( wxPGProperty* prop, + unsigned int colIndex, + wxMouseEvent* event = NULL, + int selFlags = 0 ); + + /** + Adjust the centering of the bitmap icons (collapse / expand) when the + caption font changes. + + They need to be centered in the middle of the font, so a bit of deltaY + adjustment is needed. On entry, m_captionFont must be set to window + font. It will be modified properly. + */ + void CalculateFontAndBitmapStuff( int vspacing ); + + wxRect GetEditorWidgetRect( wxPGProperty* p, int column ) const; + + void CorrectEditorWidgetSizeX(); + + /** Called in RecalculateVirtualSize() to reposition control + on virtual height changes. + */ + void CorrectEditorWidgetPosY(); + + int DoDrawItems( wxDC& dc, + const wxRect* itemsRect, + bool isBuffered ) const; + + /** Draws an expand/collapse (ie. +/-) button. + */ + virtual void DrawExpanderButton( wxDC& dc, const wxRect& rect, + wxPGProperty* property ) const; + + /** Draws items from topitemy to bottomitemy */ + void DrawItems( wxDC& dc, + unsigned int topItemY, + unsigned int bottomItemY, + const wxRect* itemsRect = NULL ); + + // Translate wxKeyEvent to wxPG_ACTION_XXX + int KeyEventToActions(wxKeyEvent &event, int* pSecond) const; + + int KeyEventToAction(wxKeyEvent &event) const + { + return KeyEventToActions(event, NULL); + } + + void ImprovedClientToScreen( int* px, int* py ); + + // Called by focus event handlers. newFocused is the window that becomes + // focused. + void HandleFocusChange( wxWindow* newFocused ); + + /** Reloads all non-customized colours from system settings. */ + void RegainColours(); + + virtual bool DoEditorValidate(); + + // Similar to DoSelectProperty() but also works on columns + // other than 1. Does not active editor if column is not + // editable. + bool DoSelectAndEdit( wxPGProperty* prop, + unsigned int colIndex, + unsigned int selFlags ); + + void DoSetSelection( const wxArrayPGProperty& newSelection, + int selFlags = 0 ); + + void DoSetSplitterPosition( int newxpos, + int splitterIndex = 0, + int flags = wxPG_SPLITTER_REFRESH ); + + bool DoAddToSelection( wxPGProperty* prop, + int selFlags = 0 ); + + bool DoRemoveFromSelection( wxPGProperty* prop, + int selFlags = 0 ); + + void DoBeginLabelEdit( unsigned int colIndex, int selFlags = 0 ); + void DoEndLabelEdit( bool commit, int selFlags = 0 ); + void OnLabelEditorEnterPress( wxCommandEvent& event ); + void OnLabelEditorKeyPress( wxKeyEvent& event ); + + wxPGProperty* DoGetItemAtY( int y ) const; + + void DestroyEditorWnd( wxWindow* wnd ); + void FreeEditors(); + + virtual bool DoExpand( wxPGProperty* p, bool sendEvent = false ); + + virtual bool DoCollapse( wxPGProperty* p, bool sendEvent = false ); + + // Returns nearest paint visible property (such that will be painted unless + // window is scrolled or resized). If given property is paint visible, then + // it itself will be returned. + wxPGProperty* GetNearestPaintVisible( wxPGProperty* p ) const; + + static void RegisterDefaultEditors(); + + // Sets up basic event handling for child control + void SetupChildEventHandling( wxWindow* wnd ); + + void CustomSetCursor( int type, bool override = false ); + + /** + Repositions scrollbar and underlying panel according to changed virtual + size. + */ + void RecalculateVirtualSize( int forceXPos = -1 ); + + void SetEditorAppearance( const wxPGCell& cell, + bool unspecified = false ); + + void ResetEditorAppearance() + { + wxPGCell cell; + cell.SetEmptyData(); + SetEditorAppearance(cell, false); + } + + void PrepareAfterItemsAdded(); + + /** + Send event from the property grid. + + Omit the wxPG_SEL_NOVALIDATE flag to allow vetoing the event + */ + bool SendEvent( int eventType, wxPGProperty* p, + wxVariant* pValue = NULL, + unsigned int selFlags = wxPG_SEL_NOVALIDATE, + unsigned int column = 1 ); + + // This function only moves focus to the wxPropertyGrid if it already + // was on one of its child controls. + void SetFocusOnCanvas(); + + bool DoHideProperty( wxPGProperty* p, bool hide, int flags ); + +private: + + bool ButtonTriggerKeyTest( int action, wxKeyEvent& event ); + + DECLARE_EVENT_TABLE() +}; + +// ----------------------------------------------------------------------- +// +// Bunch of inlines that need to resolved after all classes have been defined. +// + +inline bool wxPropertyGridPageState::IsDisplayed() const +{ + return ( this == m_pPropGrid->GetState() ); +} + +inline unsigned int wxPropertyGridPageState::GetActualVirtualHeight() const +{ + return DoGetRoot()->GetChildrenHeight(GetGrid()->GetRowHeight()); +} + +inline wxString wxPGProperty::GetHintText() const +{ + wxVariant vHintText = GetAttribute(wxPGGlobalVars->m_strHint); + +#if wxPG_COMPATIBILITY_1_4 + // Try the old, deprecated "InlineHelp" + if ( vHintText.IsNull() ) + vHintText = GetAttribute(wxPGGlobalVars->m_strInlineHelp); +#endif + + if ( !vHintText.IsNull() ) + return vHintText.GetString(); + + return wxEmptyString; +} + +inline int wxPGProperty::GetDisplayedCommonValueCount() const +{ + if ( HasFlag(wxPG_PROP_USES_COMMON_VALUE) ) + { + wxPropertyGrid* pg = GetGrid(); + if ( pg ) + return (int) pg->GetCommonValueCount(); + } + return 0; +} + +inline void wxPGProperty::SetDefaultValue( wxVariant& value ) +{ + SetAttribute(wxPG_ATTR_DEFAULT_VALUE, value); +} + +inline void wxPGProperty::SetEditor( const wxString& editorName ) +{ + m_customEditor = wxPropertyGridInterface::GetEditorByName(editorName); +} + +inline bool wxPGProperty::SetMaxLength( int maxLen ) +{ + return GetGrid()->SetPropertyMaxLength(this,maxLen); +} + +// ----------------------------------------------------------------------- + +#define wxPG_BASE_EVT_PRE_ID 1775 + +#ifndef SWIG + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_SELECTED, wxPropertyGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_CHANGING, wxPropertyGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_CHANGED, wxPropertyGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_HIGHLIGHTED, wxPropertyGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_RIGHT_CLICK, wxPropertyGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_PAGE_CHANGED, wxPropertyGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_ITEM_COLLAPSED, wxPropertyGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_ITEM_EXPANDED, wxPropertyGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_DOUBLE_CLICK, wxPropertyGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, + wxEVT_PG_LABEL_EDIT_BEGIN, wxPropertyGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, + wxEVT_PG_LABEL_EDIT_ENDING, wxPropertyGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, + wxEVT_PG_COL_BEGIN_DRAG, wxPropertyGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, + wxEVT_PG_COL_DRAGGING, wxPropertyGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, + wxEVT_PG_COL_END_DRAG, wxPropertyGridEvent ); + +#else + enum { + wxEVT_PG_SELECTED = wxPG_BASE_EVT_PRE_ID, + wxEVT_PG_CHANGING, + wxEVT_PG_CHANGED, + wxEVT_PG_HIGHLIGHTED, + wxEVT_PG_RIGHT_CLICK, + wxEVT_PG_PAGE_CHANGED, + wxEVT_PG_ITEM_COLLAPSED, + wxEVT_PG_ITEM_EXPANDED, + wxEVT_PG_DOUBLE_CLICK, + wxEVT_PG_LABEL_EDIT_BEGIN, + wxEVT_PG_LABEL_EDIT_ENDING, + wxEVT_PG_COL_BEGIN_DRAG, + wxEVT_PG_COL_DRAGGING, + wxEVT_PG_COL_END_DRAG + }; +#endif + + +#define wxPG_BASE_EVT_TYPE wxEVT_PG_SELECTED +#define wxPG_MAX_EVT_TYPE (wxPG_BASE_EVT_TYPE+30) + + +#ifndef SWIG +typedef void (wxEvtHandler::*wxPropertyGridEventFunction)(wxPropertyGridEvent&); + +#define EVT_PG_SELECTED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_SELECTED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ), +#define EVT_PG_CHANGING(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_CHANGING, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ), +#define EVT_PG_CHANGED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_CHANGED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ), +#define EVT_PG_HIGHLIGHTED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_HIGHLIGHTED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ), +#define EVT_PG_RIGHT_CLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_RIGHT_CLICK, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ), +#define EVT_PG_DOUBLE_CLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_DOUBLE_CLICK, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ), +#define EVT_PG_PAGE_CHANGED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_PAGE_CHANGED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ), +#define EVT_PG_ITEM_COLLAPSED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_COLLAPSED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ), +#define EVT_PG_ITEM_EXPANDED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_EXPANDED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ), +#define EVT_PG_LABEL_EDIT_BEGIN(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_LABEL_EDIT_BEGIN, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ), +#define EVT_PG_LABEL_EDIT_ENDING(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_LABEL_EDIT_ENDING, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ), +#define EVT_PG_COL_BEGIN_DRAG(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COL_BEGIN_DRAG, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ), +#define EVT_PG_COL_DRAGGING(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COL_DRAGGING, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ), +#define EVT_PG_COL_END_DRAG(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COL_END_DRAG, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ), + +#define wxPropertyGridEventHandler(fn) \ + wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ) + +#endif + + +/** @class wxPropertyGridEvent + + A propertygrid event holds information about events associated with + wxPropertyGrid objects. + + @library{wxpropgrid} + @category{propgrid} +*/ +class WXDLLIMPEXP_PROPGRID wxPropertyGridEvent : public wxCommandEvent +{ +public: + + /** Constructor. */ + wxPropertyGridEvent(wxEventType commandType=0, int id=0); + + /** Copy constructor. */ + wxPropertyGridEvent(const wxPropertyGridEvent& event); + + /** Destructor. */ + ~wxPropertyGridEvent(); + + /** Copyer. */ + virtual wxEvent* Clone() const; + + /** + Returns the column index associated with this event. + For the column dragging events, it is the column to the left + of the splitter being dragged + */ + unsigned int GetColumn() const + { + return m_column; + } + + wxPGProperty* GetMainParent() const + { + wxASSERT(m_property); + return m_property->GetMainParent(); + } + + /** Returns id of associated property. */ + wxPGProperty* GetProperty() const + { + return m_property; + } + + wxPGValidationInfo& GetValidationInfo() + { + wxASSERT(m_validationInfo); + return *m_validationInfo; + } + + /** Returns true if you can veto the action that the event is signaling. + */ + bool CanVeto() const { return m_canVeto; } + + /** + Call this from your event handler to veto action that the event is + signaling. + + You can only veto a shutdown if wxPropertyGridEvent::CanVeto returns + true. + @remarks + Currently only wxEVT_PG_CHANGING supports vetoing. + */ + void Veto( bool veto = true ) { m_wasVetoed = veto; } + + /** + Returns name of the associated property. + + @remarks Property name is stored in event, so it remains + accessible even after the associated property or + the property grid has been deleted. + */ + wxString GetPropertyName() const + { + return m_propertyName; + } + + /** + Returns value of the associated property. Works for all event + types, but for wxEVT_PG_CHANGING this member function returns + the value that is pending, so you can call Veto() if the + value is not satisfactory. + + @remarks Property value is stored in event, so it remains + accessible even after the associated property or + the property grid has been deleted. + */ + wxVariant GetPropertyValue() const + { + if ( m_validationInfo ) + return m_validationInfo->GetValue(); + return m_value; + } + + /** + Returns value of the associated property. + + @see GetPropertyValue + */ + wxVariant GetValue() const + { + return GetPropertyValue(); + } + + /** + Set override validation failure behaviour. + + Only effective if Veto was also called, and only allowed if event type + is wxEVT_PG_CHANGING. + */ + void SetValidationFailureBehavior( wxPGVFBFlags flags ) + { + wxASSERT( GetEventType() == wxEVT_PG_CHANGING ); + m_validationInfo->SetFailureBehavior( flags ); + } + + /** Sets custom failure message for this time only. Only applies if + wxPG_VFB_SHOW_MESSAGE is set in validation failure flags. + */ + void SetValidationFailureMessage( const wxString& message ) + { + wxASSERT( GetEventType() == wxEVT_PG_CHANGING ); + m_validationInfo->SetFailureMessage( message ); + } + + wxPGVFBFlags GetValidationFailureBehavior() const + { + wxASSERT( GetEventType() == wxEVT_PG_CHANGING ); + return m_validationInfo->GetFailureBehavior(); + } + + void SetColumn( unsigned int column ) + { + m_column = column; + } + + void SetCanVeto( bool canVeto ) { m_canVeto = canVeto; } + bool WasVetoed() const { return m_wasVetoed; } + + /** Changes the associated property. */ + void SetProperty( wxPGProperty* p ) + { + m_property = p; + if ( p ) + m_propertyName = p->GetName(); + } + + void SetPropertyValue( wxVariant value ) + { + m_value = value; + } + + void SetPropertyGrid( wxPropertyGrid* pg ) + { + m_pg = pg; + OnPropertyGridSet(); + } + + void SetupValidationInfo() + { + wxASSERT(m_pg); + wxASSERT( GetEventType() == wxEVT_PG_CHANGING ); + m_validationInfo = &m_pg->GetValidationInfo(); + m_value = m_validationInfo->GetValue(); + } + +private: + void Init(); + void OnPropertyGridSet(); + DECLARE_DYNAMIC_CLASS(wxPropertyGridEvent) + + wxPGProperty* m_property; + wxPropertyGrid* m_pg; + wxPGValidationInfo* m_validationInfo; + + wxString m_propertyName; + wxVariant m_value; + + unsigned int m_column; + + bool m_canVeto; + bool m_wasVetoed; +}; + + +// ----------------------------------------------------------------------- + +/** @class wxPropertyGridPopulator + @ingroup classes + Allows populating wxPropertyGrid from arbitrary text source. +*/ +class WXDLLIMPEXP_PROPGRID wxPropertyGridPopulator +{ +public: + /** Default constructor. + */ + wxPropertyGridPopulator(); + + /** Destructor. */ + virtual ~wxPropertyGridPopulator(); + + void SetState( wxPropertyGridPageState* state ); + + void SetGrid( wxPropertyGrid* pg ); + + /** Appends a new property under bottommost parent. + @param propClass + Property class as string. + */ + wxPGProperty* Add( const wxString& propClass, + const wxString& propLabel, + const wxString& propName, + const wxString* propValue, + wxPGChoices* pChoices = NULL ); + + /** + Pushes property to the back of parent array (ie it becomes bottommost + parent), and starts scanning/adding children for it. + + When finished, parent array is returned to the original state. + */ + void AddChildren( wxPGProperty* property ); + + /** Adds attribute to the bottommost property. + @param type + Allowed values: "string", (same as string), "int", "bool". Empty string + mean autodetect. + */ + bool AddAttribute( const wxString& name, + const wxString& type, + const wxString& value ); + + /** Called once in AddChildren. + */ + virtual void DoScanForChildren() = 0; + + /** + Returns id of parent property for which children can currently be + added. + */ + wxPGProperty* GetCurParent() const + { + return (wxPGProperty*) m_propHierarchy[m_propHierarchy.size()-1]; + } + + wxPropertyGridPageState* GetState() { return m_state; } + const wxPropertyGridPageState* GetState() const { return m_state; } + + /** Like wxString::ToLong, except allows N% in addition of N. + */ + static bool ToLongPCT( const wxString& s, long* pval, long max ); + + /** Parses strings of format "choice1"[=value1] ... "choiceN"[=valueN] into + wxPGChoices. Registers parsed result using idString (if not empty). + Also, if choices with given id already registered, then don't parse but + return those choices instead. + */ + wxPGChoices ParseChoices( const wxString& choicesString, + const wxString& idString ); + + /** Implement in derived class to do custom process when an error occurs. + Default implementation uses wxLogError. + */ + virtual void ProcessError( const wxString& msg ); + +protected: + + /** Used property grid. */ + wxPropertyGrid* m_pg; + + /** Used property grid state. */ + wxPropertyGridPageState* m_state; + + /** Tree-hierarchy of added properties (that can have children). */ + wxArrayPGProperty m_propHierarchy; + + /** Hashmap for string-id to wxPGChoicesData mapping. */ + wxPGHashMapS2P m_dictIdChoices; +}; + +// ----------------------------------------------------------------------- + +// +// Undefine macros that are not needed outside propertygrid sources +// +#ifndef __wxPG_SOURCE_FILE__ + #undef wxPG_FL_DESC_REFRESH_REQUIRED + #undef wxPG_FL_SCROLLBAR_DETECTED + #undef wxPG_FL_CREATEDSTATE + #undef wxPG_FL_NOSTATUSBARHELP + #undef wxPG_FL_SCROLLED + #undef wxPG_FL_FOCUS_INSIDE_CHILD + #undef wxPG_FL_FOCUS_INSIDE + #undef wxPG_FL_MOUSE_INSIDE_CHILD + #undef wxPG_FL_CUR_USES_CUSTOM_IMAGE + #undef wxPG_FL_PRIMARY_FILLS_ENTIRE + #undef wxPG_FL_VALUE_MODIFIED + #undef wxPG_FL_MOUSE_INSIDE + #undef wxPG_FL_FOCUSED + #undef wxPG_FL_MOUSE_CAPTURED + #undef wxPG_FL_INITIALIZED + #undef wxPG_FL_ACTIVATION_BY_CLICK + #undef wxPG_SUPPORT_TOOLTIPS + #undef wxPG_ICON_WIDTH + #undef wxPG_USE_RENDERER_NATIVE +// Following are needed by the manager headers +// #undef const wxString& +#endif + +// ----------------------------------------------------------------------- + +#endif + +#endif // _WX_PROPGRID_PROPGRID_H_ + diff --git a/wxmsw/include/wx-3.0/wx/propgrid/propgriddefs.h b/wxmsw/include/wx-3.0/wx/propgrid/propgriddefs.h new file mode 100644 index 00000000..ae2e462b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/propgrid/propgriddefs.h @@ -0,0 +1,714 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/propgrid/propgriddefs.h +// Purpose: wxPropertyGrid miscellaneous definitions +// Author: Jaakko Salli +// Modified by: +// Created: 2008-08-31 +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROPGRID_PROPGRIDDEFS_H_ +#define _WX_PROPGRID_PROPGRIDDEFS_H_ + +#include "wx/defs.h" + +#if wxUSE_PROPGRID + +#include "wx/dynarray.h" +#include "wx/vector.h" +#include "wx/hashmap.h" +#include "wx/variant.h" +#include "wx/any.h" +#include "wx/longlong.h" +#include "wx/clntdata.h" + +// ----------------------------------------------------------------------- + +// +// Here are some platform dependent defines +// NOTE: More in propertygrid.cpp +// + +#if defined(__WXMSW__) + + // space between vertical line and value text + #define wxPG_XBEFORETEXT 4 + // space between vertical line and value editor control + #define wxPG_XBEFOREWIDGET 1 + + // comment to use bitmap buttons + #define wxPG_ICON_WIDTH 9 + // 1 if wxRendererNative should be employed + #define wxPG_USE_RENDERER_NATIVE 0 + + // Enable tooltips + #define wxPG_SUPPORT_TOOLTIPS 1 + + // width of optional bitmap/image in front of property + #define wxPG_CUSTOM_IMAGE_WIDTH 20 + + // 1 if splitter drag detect margin and control cannot overlap + #define wxPG_NO_CHILD_EVT_MOTION 0 + + #define wxPG_NAT_BUTTON_BORDER_ANY 1 + #define wxPG_NAT_BUTTON_BORDER_X 1 + #define wxPG_NAT_BUTTON_BORDER_Y 1 + + // If 1 then controls are refreshed explicitly in a few places + #define wxPG_REFRESH_CONTROLS 0 + +#elif defined(__WXGTK__) + + // space between vertical line and value text + #define wxPG_XBEFORETEXT 5 + // space between vertical line and value editor control + #define wxPG_XBEFOREWIDGET 1 + + // x position adjustment for wxTextCtrl (and like) + // NB: Only define wxPG_TEXTCTRLXADJUST for platforms that do not + // (yet) support wxTextEntry::SetMargins() for the left margin. + //#define wxPG_TEXTCTRLXADJUST 3 + + // comment to use bitmap buttons + #define wxPG_ICON_WIDTH 9 + // 1 if wxRendererNative should be employed + #define wxPG_USE_RENDERER_NATIVE 1 + + // Enable tooltips + #define wxPG_SUPPORT_TOOLTIPS 1 + + // width of optional bitmap/image in front of property + #define wxPG_CUSTOM_IMAGE_WIDTH 20 + + // 1 if splitter drag detect margin and control cannot overlap + #define wxPG_NO_CHILD_EVT_MOTION 1 + + #define wxPG_NAT_BUTTON_BORDER_ANY 1 + #define wxPG_NAT_BUTTON_BORDER_X 1 + #define wxPG_NAT_BUTTON_BORDER_Y 1 + + // If 1 then controls are refreshed after selected was drawn. + #define wxPG_REFRESH_CONTROLS 1 + +#elif defined(__WXMAC__) + + // space between vertical line and value text + #define wxPG_XBEFORETEXT 4 + // space between vertical line and value editor widget + #define wxPG_XBEFOREWIDGET 1 + + // x position adjustment for wxTextCtrl (and like) + #define wxPG_TEXTCTRLXADJUST 0 + + // comment to use bitmap buttons + #define wxPG_ICON_WIDTH 11 + // 1 if wxRendererNative should be employed + #define wxPG_USE_RENDERER_NATIVE 1 + + // Enable tooltips + #define wxPG_SUPPORT_TOOLTIPS 1 + + // width of optional bitmap/image in front of property + #define wxPG_CUSTOM_IMAGE_WIDTH 20 + + // 1 if splitter drag detect margin and control cannot overlap + #define wxPG_NO_CHILD_EVT_MOTION 0 + + #define wxPG_NAT_BUTTON_BORDER_ANY 0 + #define wxPG_NAT_BUTTON_BORDER_X 0 + #define wxPG_NAT_BUTTON_BORDER_Y 0 + + // If 1 then controls are refreshed after selected was drawn. + #define wxPG_REFRESH_CONTROLS 0 + +#else // defaults + + // space between vertical line and value text + #define wxPG_XBEFORETEXT 5 + // space between vertical line and value editor widget + #define wxPG_XBEFOREWIDGET 1 + + // x position adjustment for wxTextCtrl (and like) + #define wxPG_TEXTCTRLXADJUST 3 + + // comment to use bitmap buttons + #define wxPG_ICON_WIDTH 9 + // 1 if wxRendererNative should be employed + #define wxPG_USE_RENDERER_NATIVE 0 + + // Enable tooltips + #define wxPG_SUPPORT_TOOLTIPS 0 + + // width of optional bitmap/image in front of property + #define wxPG_CUSTOM_IMAGE_WIDTH 20 + + // 1 if splitter drag detect margin and control cannot overlap + #define wxPG_NO_CHILD_EVT_MOTION 1 + + #define wxPG_NAT_BUTTON_BORDER_ANY 0 + #define wxPG_NAT_BUTTON_BORDER_X 0 + #define wxPG_NAT_BUTTON_BORDER_Y 0 + + // If 1 then controls are refreshed after selected was drawn. + #define wxPG_REFRESH_CONTROLS 0 +#endif // platform + + +#define wxPG_CONTROL_MARGIN 0 // space between splitter and control + +#define wxCC_CUSTOM_IMAGE_MARGIN1 4 // before image +#define wxCC_CUSTOM_IMAGE_MARGIN2 5 // after image + +#define DEFAULT_IMAGE_OFFSET_INCREMENT \ + (wxCC_CUSTOM_IMAGE_MARGIN1 + wxCC_CUSTOM_IMAGE_MARGIN2) + +#define wxPG_DRAG_MARGIN 30 + +#if wxPG_NO_CHILD_EVT_MOTION + #define wxPG_SPLITTERX_DETECTMARGIN1 3 // this much on left + #define wxPG_SPLITTERX_DETECTMARGIN2 2 // this much on right +#else + #define wxPG_SPLITTERX_DETECTMARGIN1 3 // this much on left + #define wxPG_SPLITTERX_DETECTMARGIN2 2 // this much on right +#endif + +// Use this macro to generate standard custom image height from +#define wxPG_STD_CUST_IMAGE_HEIGHT(LINEHEIGHT) (LINEHEIGHT-3) + + +#if defined(__WXWINCE__) + #define wxPG_SMALL_SCREEN 1 +#else + #define wxPG_SMALL_SCREEN 0 +#endif + + +// Undefine wxPG_ICON_WIDTH to use supplied xpm bitmaps instead +// (for tree buttons) +//#undef wxPG_ICON_WIDTH + +#if WXWIN_COMPATIBILITY_2_6 || WXWIN_COMPATIBILITY_2_8 + #define wxPG_COMPATIBILITY_1_4 1 +#else + #define wxPG_COMPATIBILITY_1_4 0 +#endif + +// Need to force disable tooltips? +#if !wxUSE_TOOLTIPS + #undef wxPG_SUPPORT_TOOLTIPS + #define wxPG_SUPPORT_TOOLTIPS 0 +#endif + +// Set 1 to include advanced properties (wxFontProperty, wxColourProperty, etc.) +#ifndef wxPG_INCLUDE_ADVPROPS + #define wxPG_INCLUDE_ADVPROPS 1 +#endif + +// Set 1 to include checkbox editor class +#define wxPG_INCLUDE_CHECKBOX 1 + +// ----------------------------------------------------------------------- + + +class wxPGEditor; +class wxPGProperty; +class wxPropertyCategory; +class wxPGChoices; +class wxPropertyGridPageState; +class wxPGCell; +class wxPGCellRenderer; +class wxPGChoiceEntry; +class wxPGPropArgCls; +class wxPropertyGridInterface; +class wxPropertyGrid; +class wxPropertyGridEvent; +class wxPropertyGridManager; +class wxPGOwnerDrawnComboBox; +class wxPGEditorDialogAdapter; +class wxPGValidationInfo; + + +// ----------------------------------------------------------------------- + +/** @section propgrid_misc wxPropertyGrid Miscellanous + + This section describes some miscellanous values, types and macros. + @{ +*/ + +// Used to tell wxPGProperty to use label as name as well +#define wxPG_LABEL (*wxPGProperty::sm_wxPG_LABEL) + +// This is the value placed in wxPGProperty::sm_wxPG_LABEL +#define wxPG_LABEL_STRING wxS("@!") +#define wxPG_NULL_BITMAP wxNullBitmap +#define wxPG_COLOUR_BLACK (*wxBLACK) + +/** Convert Red, Green and Blue to a single 32-bit value. +*/ +#define wxPG_COLOUR(R,G,B) ((wxUint32)(R+(G<<8)+(B<<16))) + + +/** If property is supposed to have custom-painted image, then returning + this in OnMeasureImage() will usually be enough. +*/ +#define wxPG_DEFAULT_IMAGE_SIZE wxSize(-1, -1) + + +/** This callback function is used for sorting properties. + + Call wxPropertyGrid::SetSortFunction() to set it. + + Sort function should return a value greater than 0 if position of p1 is + after p2. So, for instance, when comparing property names, you can use + following implementation: + + @code + int MyPropertySortFunction(wxPropertyGrid* propGrid, + wxPGProperty* p1, + wxPGProperty* p2) + { + return p1->GetBaseName().compare( p2->GetBaseName() ); + } + @endcode +*/ +typedef int (*wxPGSortCallback)(wxPropertyGrid* propGrid, + wxPGProperty* p1, + wxPGProperty* p2); + + + +typedef wxString wxPGCachedString; + +/** @} +*/ + +// ----------------------------------------------------------------------- + +// Used to indicate wxPGChoices::Add etc that the value is actually not given +// by the caller. +#define wxPG_INVALID_VALUE INT_MAX + +// ----------------------------------------------------------------------- + +WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(wxPGProperty*, wxArrayPGProperty, + wxBaseArrayPtrVoid, + class WXDLLIMPEXP_PROPGRID); + +WX_DECLARE_STRING_HASH_MAP_WITH_DECL(void*, + wxPGHashMapS2P, + class WXDLLIMPEXP_PROPGRID); + +WX_DECLARE_STRING_HASH_MAP_WITH_DECL(wxString, + wxPGHashMapS2S, + class WXDLLIMPEXP_PROPGRID); + +WX_DECLARE_VOIDPTR_HASH_MAP_WITH_DECL(void*, + wxPGHashMapP2P, + class WXDLLIMPEXP_PROPGRID); + +WX_DECLARE_HASH_MAP_WITH_DECL(wxInt32, + wxInt32, + wxIntegerHash, + wxIntegerEqual, + wxPGHashMapI2I, + class WXDLLIMPEXP_PROPGRID); + +// Utility to find if specific item is in a vector. Returns index to +// the item, or wxNOT_FOUND if not present. +template<typename CONTAINER, typename T> +int wxPGFindInVector( CONTAINER vector, const T& item ) +{ + for ( unsigned int i=0; i<vector.size(); i++ ) + { + if ( vector[i] == item ) + return (int) i; + } + return wxNOT_FOUND; +} + +// ----------------------------------------------------------------------- + +enum wxPG_GETPROPERTYVALUES_FLAGS +{ + +/** Flags for wxPropertyGridInterface::GetPropertyValues */ +wxPG_KEEP_STRUCTURE = 0x00000010, + +/** Flags for wxPropertyGrid::SetPropertyAttribute() etc */ +wxPG_RECURSE = 0x00000020, + +/** Include attributes for GetPropertyValues. */ +wxPG_INC_ATTRIBUTES = 0x00000040, + +/** Used when first starting recursion. */ +wxPG_RECURSE_STARTS = 0x00000080, + +/** Force value change. */ +wxPG_FORCE = 0x00000100, + +/** Only sort categories and their immediate children. + Sorting done by wxPG_AUTO_SORT option uses this. +*/ +wxPG_SORT_TOP_LEVEL_ONLY = 0x00000200 + +}; + +/** Flags for wxPropertyGrid::SetPropertyAttribute() etc */ +#define wxPG_DONT_RECURSE 0x00000000 + +// ----------------------------------------------------------------------- + +// Misc argument flags. +enum wxPG_MISC_ARG_FLAGS +{ + // Get/Store full value instead of displayed value. + wxPG_FULL_VALUE = 0x00000001, + + wxPG_REPORT_ERROR = 0x00000002, + + wxPG_PROPERTY_SPECIFIC = 0x00000004, + + // Get/Store editable value instead of displayed one (should only be + // different in the case of common values) + wxPG_EDITABLE_VALUE = 0x00000008, + + // Used when dealing with fragments of composite string value + wxPG_COMPOSITE_FRAGMENT = 0x00000010, + + // Means property for which final string value is for cannot really be + // edited. + wxPG_UNEDITABLE_COMPOSITE_FRAGMENT = 0x00000020, + + // ValueToString() called from GetValueAsString() + // (guarantees that input wxVariant value is current own value) + wxPG_VALUE_IS_CURRENT = 0x00000040, + + // Value is being set programmatically (ie. not by user) + wxPG_PROGRAMMATIC_VALUE = 0x00000080 +}; + +// ----------------------------------------------------------------------- + +// wxPGProperty::SetValue() flags +enum wxPG_SETVALUE_FLAGS +{ + wxPG_SETVAL_REFRESH_EDITOR = 0x0001, + wxPG_SETVAL_AGGREGATED = 0x0002, + wxPG_SETVAL_FROM_PARENT = 0x0004, + wxPG_SETVAL_BY_USER = 0x0008 // Set if value changed by user +}; + +// ----------------------------------------------------------------------- + +// +// Valid constants for wxPG_UINT_BASE attribute +// (long because of wxVariant constructor) +#define wxPG_BASE_OCT (long)8 +#define wxPG_BASE_DEC (long)10 +#define wxPG_BASE_HEX (long)16 +#define wxPG_BASE_HEXL (long)32 + +// +// Valid constants for wxPG_UINT_PREFIX attribute +#define wxPG_PREFIX_NONE (long)0 +#define wxPG_PREFIX_0x (long)1 +#define wxPG_PREFIX_DOLLAR_SIGN (long)2 + +// ----------------------------------------------------------------------- +// Editor class. + +// Editor accessor (for backwards compatiblity use only). +#define wxPG_EDITOR(T) wxPGEditor_##T + +// Macro for declaring editor class, with optional impexpdecl part. +#ifndef WX_PG_DECLARE_EDITOR_WITH_DECL + + #define WX_PG_DECLARE_EDITOR_WITH_DECL(EDITOR,DECL) \ + extern DECL wxPGEditor* wxPGEditor_##EDITOR; \ + extern DECL wxPGEditor* wxPGConstruct##EDITOR##EditorClass(); + +#endif + +// Declare editor class. +#define WX_PG_DECLARE_EDITOR(EDITOR) \ +extern wxPGEditor* wxPGEditor_##EDITOR; \ +extern wxPGEditor* wxPGConstruct##EDITOR##EditorClass(); + +// Declare builtin editor classes. +WX_PG_DECLARE_EDITOR_WITH_DECL(TextCtrl,WXDLLIMPEXP_PROPGRID) +WX_PG_DECLARE_EDITOR_WITH_DECL(Choice,WXDLLIMPEXP_PROPGRID) +WX_PG_DECLARE_EDITOR_WITH_DECL(ComboBox,WXDLLIMPEXP_PROPGRID) +WX_PG_DECLARE_EDITOR_WITH_DECL(TextCtrlAndButton,WXDLLIMPEXP_PROPGRID) +#if wxPG_INCLUDE_CHECKBOX +WX_PG_DECLARE_EDITOR_WITH_DECL(CheckBox,WXDLLIMPEXP_PROPGRID) +#endif +WX_PG_DECLARE_EDITOR_WITH_DECL(ChoiceAndButton,WXDLLIMPEXP_PROPGRID) + +// ----------------------------------------------------------------------- + +#ifndef SWIG + +// +// Macro WXVARIANT allows creation of wxVariant from any type supported by +// wxWidgets internally, and of all types created using +// WX_PG_DECLARE_VARIANT_DATA. +template<class T> +wxVariant WXVARIANT( const T& WXUNUSED(value) ) +{ + wxFAIL_MSG("Code should always call specializations of this template"); + return wxVariant(); +} + +template<> inline wxVariant WXVARIANT( const int& value ) + { return wxVariant((long)value); } +template<> inline wxVariant WXVARIANT( const long& value ) + { return wxVariant(value); } +template<> inline wxVariant WXVARIANT( const bool& value ) + { return wxVariant(value); } +template<> inline wxVariant WXVARIANT( const double& value ) + { return wxVariant(value); } +template<> inline wxVariant WXVARIANT( const wxArrayString& value ) + { return wxVariant(value); } +template<> inline wxVariant WXVARIANT( const wxString& value ) + { return wxVariant(value); } +#if wxUSE_LONGLONG +template<> inline wxVariant WXVARIANT( const wxLongLong& value ) + { return wxVariant(value); } +template<> inline wxVariant WXVARIANT( const wxULongLong& value ) + { return wxVariant(value); } +#endif +#if wxUSE_DATETIME +template<> inline wxVariant WXVARIANT( const wxDateTime& value ) + { return wxVariant(value); } +#endif + + +// +// These are modified versions of DECLARE/WX_PG_IMPLEMENT_VARIANT_DATA +// macros found in variant.h. Difference are as follows: +// * These support non-wxObject data +// * These implement classname##RefFromVariant function which returns +// reference to data within. +// * const char* classname##_VariantType which equals classname. +// * WXVARIANT +// +#define WX_PG_DECLARE_VARIANT_DATA(classname) \ + WX_PG_DECLARE_VARIANT_DATA_EXPORTED(classname, wxEMPTY_PARAMETER_VALUE) + +#define WX_PG_DECLARE_VARIANT_DATA_EXPORTED(classname,expdecl) \ +expdecl classname& operator << ( classname &object, const wxVariant &variant ); \ +expdecl wxVariant& operator << ( wxVariant &variant, const classname &object ); \ +expdecl const classname& classname##RefFromVariant( const wxVariant& variant ); \ +expdecl classname& classname##RefFromVariant( wxVariant& variant ); \ +template<> inline wxVariant WXVARIANT( const classname& value ) \ +{ \ + wxVariant variant; \ + variant << value; \ + return variant; \ +} \ +extern expdecl const char* classname##_VariantType; + + +#define WX_PG_IMPLEMENT_VARIANT_DATA(classname) \ + WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED(classname, wxEMPTY_PARAMETER_VALUE) + +// Add getter (ie. classname << variant) separately to allow +// custom implementations. +#define WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_NO_EQ_NO_GETTER(classname,expdecl) \ +const char* classname##_VariantType = #classname; \ +class classname##VariantData: public wxVariantData \ +{ \ +public:\ + classname##VariantData() {} \ + classname##VariantData( const classname &value ) { m_value = value; } \ +\ + classname &GetValue() { return m_value; } \ +\ + const classname &GetValue() const { return m_value; } \ +\ + virtual bool Eq(wxVariantData& data) const; \ +\ + virtual wxString GetType() const; \ +\ + virtual wxVariantData* Clone() const { return new classname##VariantData(m_value); } \ +\ + DECLARE_WXANY_CONVERSION() \ +protected:\ + classname m_value; \ +};\ +\ +IMPLEMENT_TRIVIAL_WXANY_CONVERSION(classname, classname##VariantData) \ +\ +wxString classname##VariantData::GetType() const\ +{\ + return wxS(#classname);\ +}\ +\ +expdecl wxVariant& operator << ( wxVariant &variant, const classname &value )\ +{\ + classname##VariantData *data = new classname##VariantData( value );\ + variant.SetData( data );\ + return variant;\ +} \ +expdecl classname& classname##RefFromVariant( wxVariant& variant ) \ +{ \ + wxASSERT_MSG( variant.GetType() == wxS(#classname), \ + wxString::Format("Variant type should have been '%s'" \ + "instead of '%s'", \ + wxS(#classname), \ + variant.GetType().c_str())); \ + classname##VariantData *data = \ + (classname##VariantData*) variant.GetData(); \ + return data->GetValue();\ +} \ +expdecl const classname& classname##RefFromVariant( const wxVariant& variant ) \ +{ \ + wxASSERT_MSG( variant.GetType() == wxS(#classname), \ + wxString::Format("Variant type should have been '%s'" \ + "instead of '%s'", \ + wxS(#classname), \ + variant.GetType().c_str())); \ + classname##VariantData *data = \ + (classname##VariantData*) variant.GetData(); \ + return data->GetValue();\ +} + +#define WX_PG_IMPLEMENT_VARIANT_DATA_GETTER(classname, expdecl) \ +expdecl classname& operator << ( classname &value, const wxVariant &variant )\ +{\ + wxASSERT( variant.GetType() == #classname );\ + \ + classname##VariantData *data = (classname##VariantData*) variant.GetData();\ + value = data->GetValue();\ + return value;\ +} + +#define WX_PG_IMPLEMENT_VARIANT_DATA_EQ(classname, expdecl) \ +bool classname##VariantData::Eq(wxVariantData& data) const \ +{\ + wxASSERT( GetType() == data.GetType() );\ +\ + classname##VariantData & otherData = (classname##VariantData &) data;\ +\ + return otherData.m_value == m_value;\ +} + +// implements a wxVariantData-derived class using for the Eq() method the +// operator== which must have been provided by "classname" +#define WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED(classname,expdecl) \ +WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_NO_EQ_NO_GETTER(classname,wxEMPTY_PARAMETER_VALUE expdecl) \ +WX_PG_IMPLEMENT_VARIANT_DATA_GETTER(classname,wxEMPTY_PARAMETER_VALUE expdecl) \ +WX_PG_IMPLEMENT_VARIANT_DATA_EQ(classname,wxEMPTY_PARAMETER_VALUE expdecl) + +#define WX_PG_IMPLEMENT_VARIANT_DATA(classname) \ +WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED(classname, wxEMPTY_PARAMETER_VALUE) + +// with Eq() implementation that always returns false +#define WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_DUMMY_EQ(classname,expdecl) \ +WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_NO_EQ_NO_GETTER(classname,wxEMPTY_PARAMETER_VALUE expdecl) \ +WX_PG_IMPLEMENT_VARIANT_DATA_GETTER(classname,wxEMPTY_PARAMETER_VALUE expdecl) \ +\ +bool classname##VariantData::Eq(wxVariantData& WXUNUSED(data)) const \ +{\ + return false; \ +} + +#define WX_PG_IMPLEMENT_VARIANT_DATA_DUMMY_EQ(classname) \ +WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_DUMMY_EQ(classname, wxEMPTY_PARAMETER_VALUE) + +WX_PG_DECLARE_VARIANT_DATA_EXPORTED(wxPoint, WXDLLIMPEXP_PROPGRID) +WX_PG_DECLARE_VARIANT_DATA_EXPORTED(wxSize, WXDLLIMPEXP_PROPGRID) +WX_PG_DECLARE_VARIANT_DATA_EXPORTED(wxArrayInt, WXDLLIMPEXP_PROPGRID) +DECLARE_VARIANT_OBJECT_EXPORTED(wxFont, WXDLLIMPEXP_PROPGRID) +template<> inline wxVariant WXVARIANT( const wxFont& value ) +{ + wxVariant variant; + variant << value; + return variant; +} + +template<> inline wxVariant WXVARIANT( const wxColour& value ) +{ + wxVariant variant; + variant << value; + return variant; +} + +// Define constants for common wxVariant type strings + +#define wxPG_VARIANT_TYPE_STRING wxPGGlobalVars->m_strstring +#define wxPG_VARIANT_TYPE_LONG wxPGGlobalVars->m_strlong +#define wxPG_VARIANT_TYPE_BOOL wxPGGlobalVars->m_strbool +#define wxPG_VARIANT_TYPE_LIST wxPGGlobalVars->m_strlist +#define wxPG_VARIANT_TYPE_DOUBLE wxS("double") +#define wxPG_VARIANT_TYPE_ARRSTRING wxS("arrstring") +#define wxPG_VARIANT_TYPE_DATETIME wxS("datetime") +#define wxPG_VARIANT_TYPE_LONGLONG wxS("longlong") +#define wxPG_VARIANT_TYPE_ULONGLONG wxS("ulonglong") + +#endif // !SWIG + +// ----------------------------------------------------------------------- + +// +// Tokenizer macros. +// NOTE: I have made two versions - worse ones (performance and consistency +// wise) use wxStringTokenizer and better ones (may have unfound bugs) +// use custom code. +// + +#include "wx/tokenzr.h" + +// TOKENIZER1 can be done with wxStringTokenizer +#define WX_PG_TOKENIZER1_BEGIN(WXSTRING,DELIMITER) \ + wxStringTokenizer tkz(WXSTRING,DELIMITER,wxTOKEN_RET_EMPTY); \ + while ( tkz.HasMoreTokens() ) \ + { \ + wxString token = tkz.GetNextToken(); \ + token.Trim(true); \ + token.Trim(false); + +#define WX_PG_TOKENIZER1_END() \ + } + + +// +// 2nd version: tokens are surrounded by DELIMITERs (for example, C-style +// strings). TOKENIZER2 must use custom code (a class) for full compliance with +// " surrounded strings with \" inside. +// +// class implementation is in propgrid.cpp +// + +class WXDLLIMPEXP_PROPGRID wxPGStringTokenizer +{ +public: + wxPGStringTokenizer( const wxString& str, wxChar delimeter ); + ~wxPGStringTokenizer(); + + bool HasMoreTokens(); // not const so we can do some stuff in it + wxString GetNextToken(); + +protected: + const wxString* m_str; + wxString::const_iterator m_curPos; + wxString m_readyToken; + wxUniChar m_delimeter; +}; + +#define WX_PG_TOKENIZER2_BEGIN(WXSTRING,DELIMITER) \ + wxPGStringTokenizer tkz(WXSTRING,DELIMITER); \ + while ( tkz.HasMoreTokens() ) \ + { \ + wxString token = tkz.GetNextToken(); + +#define WX_PG_TOKENIZER2_END() \ + } + +// ----------------------------------------------------------------------- + +#endif // wxUSE_PROPGRID + +#endif // _WX_PROPGRID_PROPGRIDDEFS_H_ diff --git a/wxmsw/include/wx-3.0/wx/propgrid/propgridiface.h b/wxmsw/include/wx-3.0/wx/propgrid/propgridiface.h new file mode 100644 index 00000000..a553d6db --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/propgrid/propgridiface.h @@ -0,0 +1,1396 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/propgrid/propgridiface.h +// Purpose: wxPropertyGridInterface class +// Author: Jaakko Salli +// Modified by: +// Created: 2008-08-24 +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __WX_PROPGRID_PROPGRIDIFACE_H__ +#define __WX_PROPGRID_PROPGRIDIFACE_H__ + +#include "wx/defs.h" + +#if wxUSE_PROPGRID + +#include "wx/propgrid/property.h" +#include "wx/propgrid/propgridpagestate.h" + +// ----------------------------------------------------------------------- + +/** @section wxPGPropArgCls + + Most property grid functions have this type as their argument, as it can + convey a property by either a pointer or name. +*/ +class WXDLLIMPEXP_PROPGRID wxPGPropArgCls +{ +public: + wxPGPropArgCls( const wxPGProperty* property ) + { + m_ptr.property = (wxPGProperty*) property; + m_flags = IsProperty; + } + wxPGPropArgCls( const wxString& str ) + { + m_ptr.stringName = &str; + m_flags = IsWxString; + } + wxPGPropArgCls( const wxPGPropArgCls& id ) + { + m_ptr = id.m_ptr; + m_flags = id.m_flags; + } + // This is only needed for wxPython bindings + wxPGPropArgCls( wxString* str, bool WXUNUSED(deallocPtr) ) + { + m_ptr.stringName = str; + m_flags = IsWxString | OwnsWxString; + } + ~wxPGPropArgCls() + { + if ( m_flags & OwnsWxString ) + delete m_ptr.stringName; + } + wxPGProperty* GetPtr() const + { + wxCHECK( m_flags == IsProperty, NULL ); + return m_ptr.property; + } + wxPGPropArgCls( const char* str ) + { + m_ptr.charName = str; + m_flags = IsCharPtr; + } + wxPGPropArgCls( const wchar_t* str ) + { + m_ptr.wcharName = str; + m_flags = IsWCharPtr; + } + /** This constructor is required for NULL. */ + wxPGPropArgCls( int ) + { + m_ptr.property = NULL; + m_flags = IsProperty; + } + wxPGProperty* GetPtr( wxPropertyGridInterface* iface ) const; + wxPGProperty* GetPtr( const wxPropertyGridInterface* iface ) const + { + return GetPtr((wxPropertyGridInterface*)iface); + } + wxPGProperty* GetPtr0() const { return m_ptr.property; } + bool HasName() const { return (m_flags != IsProperty); } + const wxString& GetName() const { return *m_ptr.stringName; } +private: + + enum + { + IsProperty = 0x00, + IsWxString = 0x01, + IsCharPtr = 0x02, + IsWCharPtr = 0x04, + OwnsWxString = 0x10 + }; + + union + { + wxPGProperty* property; + const char* charName; + const wchar_t* wcharName; + const wxString* stringName; + } m_ptr; + unsigned char m_flags; +}; + +typedef const wxPGPropArgCls& wxPGPropArg; + +// ----------------------------------------------------------------------- + +WXDLLIMPEXP_PROPGRID +void wxPGTypeOperationFailed( const wxPGProperty* p, + const wxString& typestr, + const wxString& op ); +WXDLLIMPEXP_PROPGRID +void wxPGGetFailed( const wxPGProperty* p, const wxString& typestr ); + +// ----------------------------------------------------------------------- + +// Helper macro that does necessary preparations when calling +// some wxPGProperty's member function. +#define wxPG_PROP_ARG_CALL_PROLOG_0(PROPERTY) \ + PROPERTY *p = (PROPERTY*)id.GetPtr(this); \ + if ( !p ) return; + +#define wxPG_PROP_ARG_CALL_PROLOG_RETVAL_0(PROPERTY, RETVAL) \ + PROPERTY *p = (PROPERTY*)id.GetPtr(this); \ + if ( !p ) return RETVAL; + +#define wxPG_PROP_ARG_CALL_PROLOG() \ + wxPG_PROP_ARG_CALL_PROLOG_0(wxPGProperty) + +#define wxPG_PROP_ARG_CALL_PROLOG_RETVAL(RVAL) \ + wxPG_PROP_ARG_CALL_PROLOG_RETVAL_0(wxPGProperty, RVAL) + +#define wxPG_PROP_ID_CONST_CALL_PROLOG() \ + wxPG_PROP_ARG_CALL_PROLOG_0(const wxPGProperty) + +#define wxPG_PROP_ID_CONST_CALL_PROLOG_RETVAL(RVAL) \ + wxPG_PROP_ARG_CALL_PROLOG_RETVAL_0(const wxPGProperty, RVAL) + +// ----------------------------------------------------------------------- + + +/** @class wxPropertyGridInterface + + Most of the shared property manipulation interface shared by wxPropertyGrid, + wxPropertyGridPage, and wxPropertyGridManager is defined in this class. + + @remarks + - In separate wxPropertyGrid component this class was known as + wxPropertyContainerMethods. + + @library{wxpropgrid} + @category{propgrid} +*/ +class WXDLLIMPEXP_PROPGRID wxPropertyGridInterface +{ +public: + + /** Destructor */ + virtual ~wxPropertyGridInterface() { } + + /** + Appends property to the list. + + wxPropertyGrid assumes ownership of the object. + Becomes child of most recently added category. + @remarks + - wxPropertyGrid takes the ownership of the property pointer. + - If appending a category with name identical to a category already in + the wxPropertyGrid, then newly created category is deleted, and most + recently added category (under which properties are appended) is set + to the one with same name. This allows easier adding of items to same + categories in multiple passes. + - Does not automatically redraw the control, so you may need to call + Refresh when calling this function after control has been shown for + the first time. + */ + wxPGProperty* Append( wxPGProperty* property ); + + wxPGProperty* AppendIn( wxPGPropArg id, wxPGProperty* newproperty ); + + /** + In order to add new items into a property with fixed children (for + instance, wxFlagsProperty), you need to call this method. After + populating has been finished, you need to call EndAddChildren. + */ + void BeginAddChildren( wxPGPropArg id ); + + /** Deletes all properties. + */ + virtual void Clear() = 0; + + /** + Clears current selection, if any. + + @param validation + If set to @false, deselecting the property will always work, + even if its editor had invalid value in it. + + @return Returns @true if successful or if there was no selection. May + fail if validation was enabled and active editor had invalid + value. + + @remarks In wxPropertyGrid 1.4, this member function used to send + wxPG_EVT_SELECTED. In wxWidgets 2.9 and later, it no longer + does that. + */ + bool ClearSelection( bool validation = false ); + + /** Resets modified status of all properties. + */ + void ClearModifiedStatus(); + + /** Collapses given category or property with children. + Returns true if actually collapses. + */ + bool Collapse( wxPGPropArg id ); + + /** Collapses all items that can be collapsed. + + @return + Return false if failed (may fail if editor value cannot be validated). + */ + bool CollapseAll() { return ExpandAll(false); } + + /** + Changes value of a property, as if from an editor. + Use this instead of SetPropertyValue() if you need the value to run + through validation process, and also send the property change event. + + @return + Returns true if value was successfully changed. + */ + bool ChangePropertyValue( wxPGPropArg id, wxVariant newValue ); + + /** + Removes and deletes a property and any children. + + @param id + Pointer or name of a property. + + @remarks If you delete a property in a wxPropertyGrid event + handler, the actual deletion is postponed until the next + idle event. + + This functions deselects selected property, if any. + Validation failure option wxPG_VFB_STAY_IN_PROPERTY is not + respected, ie. selection is cleared even if editor had + invalid value. + */ + void DeleteProperty( wxPGPropArg id ); + + /** + Removes a property. Does not delete the property object, but + instead returns it. + + @param id + Pointer or name of a property. + + @remarks Removed property cannot have any children. + + Also, if you remove property in a wxPropertyGrid event + handler, the actual removal is postponed until the next + idle event. + */ + wxPGProperty* RemoveProperty( wxPGPropArg id ); + + /** + Disables a property. + + @see EnableProperty(), wxPGProperty::Enable() + */ + bool DisableProperty( wxPGPropArg id ) { return EnableProperty(id,false); } + + /** + Returns true if all property grid data changes have been committed. + + Usually only returns false if value in active editor has been + invalidated by a wxValidator. + */ + bool EditorValidate(); + + /** + Enables or disables property, depending on whether enable is true or + false. Disabled property usually appears as having grey text. + + @param id + Name or pointer to a property. + @param enable + If @false, property is disabled instead. + + @see wxPGProperty::Enable() + */ + bool EnableProperty( wxPGPropArg id, bool enable = true ); + + /** Called after population of property with fixed children has finished. + */ + void EndAddChildren( wxPGPropArg id ); + + /** Expands given category or property with children. + Returns true if actually expands. + */ + bool Expand( wxPGPropArg id ); + + /** Expands all items that can be expanded. + */ + bool ExpandAll( bool expand = true ); + + /** Returns id of first child of given property. + @remarks + Does not return sub-properties! + */ + wxPGProperty* GetFirstChild( wxPGPropArg id ) + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxNullProperty) + + if ( !p->GetChildCount() || p->HasFlag(wxPG_PROP_AGGREGATE) ) + return wxNullProperty; + + return p->Item(0); + } + + //@{ + /** Returns iterator class instance. + @param flags + See @ref propgrid_iterator_flags. Value wxPG_ITERATE_DEFAULT causes + iteration over everything except private child properties. + @param firstProp + Property to start iteration from. If NULL, then first child of root + is used. + @param startPos + Either wxTOP or wxBOTTOM. wxTOP will indicate that iterations start + from the first property from the top, and wxBOTTOM means that the + iteration will instead begin from bottommost valid item. + */ + wxPropertyGridIterator GetIterator( int flags = wxPG_ITERATE_DEFAULT, + wxPGProperty* firstProp = NULL ) + { + return wxPropertyGridIterator( m_pState, flags, firstProp ); + } + + wxPropertyGridConstIterator + GetIterator( int flags = wxPG_ITERATE_DEFAULT, + wxPGProperty* firstProp = NULL ) const + { + return wxPropertyGridConstIterator( m_pState, flags, firstProp ); + } + + wxPropertyGridIterator GetIterator( int flags, int startPos ) + { + return wxPropertyGridIterator( m_pState, flags, startPos ); + } + + wxPropertyGridConstIterator GetIterator( int flags, int startPos ) const + { + return wxPropertyGridConstIterator( m_pState, flags, startPos ); + } + //@} + + /** Returns id of first item, whether it is a category or property. + @param flags + @link iteratorflags List of iterator flags@endlink + */ + wxPGProperty* GetFirst( int flags = wxPG_ITERATE_ALL ) + { + wxPropertyGridIterator it( m_pState, flags, wxNullProperty, 1 ); + return *it; + } + + const wxPGProperty* GetFirst( int flags = wxPG_ITERATE_ALL ) const + { + return ((wxPropertyGridInterface*)this)->GetFirst(flags); + } + + /** + Returns pointer to a property with given name (case-sensitive). + If there is no property with such name, @NULL pointer is returned. + + @remarks Properties which have non-category, non-root parent + cannot be accessed globally by their name. Instead, use + "<property>.<subproperty>" instead of "<subproperty>". + */ + wxPGProperty* GetProperty( const wxString& name ) const + { + return GetPropertyByName(name); + } + + /** Returns map-like storage of property's attributes. + @remarks + Note that if extra style wxPG_EX_WRITEONLY_BUILTIN_ATTRIBUTES is set, + then builtin-attributes are not included in the storage. + */ + const wxPGAttributeStorage& GetPropertyAttributes( wxPGPropArg id ) const + { + // If 'id' refers to invalid property, then we will return dummy + // attributes (ie. root property's attributes, which contents should + // should always be empty and of no consequence). + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_pState->DoGetRoot()->GetAttributes()); + return p->GetAttributes(); + } + + /** Adds to 'targetArr' pointers to properties that have given + flags 'flags' set. However, if 'inverse' is set to true, then + only properties without given flags are stored. + @param flags + Property flags to use. + @param iterFlags + Iterator flags to use. Default is everything expect private children. + */ + void GetPropertiesWithFlag( wxArrayPGProperty* targetArr, + wxPGProperty::FlagType flags, + bool inverse = false, + int iterFlags = wxPG_ITERATE_PROPERTIES | + wxPG_ITERATE_HIDDEN | + wxPG_ITERATE_CATEGORIES) const; + + /** Returns value of given attribute. If none found, returns NULL-variant. + */ + wxVariant GetPropertyAttribute( wxPGPropArg id, + const wxString& attrName ) const + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxNullVariant) + return p->GetAttribute(attrName); + } + + /** Returns pointer of property's nearest parent category. If no category + found, returns NULL. + */ + wxPropertyCategory* GetPropertyCategory( wxPGPropArg id ) const + { + wxPG_PROP_ID_CONST_CALL_PROLOG_RETVAL(NULL) + return m_pState->GetPropertyCategory(p); + } + + /** Returns client data (void*) of a property. */ + void* GetPropertyClientData( wxPGPropArg id ) const + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL) + return p->GetClientData(); + } + + /** + Returns first property which label matches given string. + + NULL if none found. Note that this operation is extremely slow when + compared to GetPropertyByName(). + */ + wxPGProperty* GetPropertyByLabel( const wxString& label ) const; + + /** Returns property with given name. NULL if none found. + */ + wxPGProperty* GetPropertyByName( const wxString& name ) const; + + /** Returns child property 'subname' of property 'name'. Same as + calling GetPropertyByName("name.subname"), albeit slightly faster. + */ + wxPGProperty* GetPropertyByName( const wxString& name, + const wxString& subname ) const; + + /** Returns property's editor. */ + const wxPGEditor* GetPropertyEditor( wxPGPropArg id ) const + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL) + return p->GetEditorClass(); + } + + /** Returns help string associated with a property. */ + wxString GetPropertyHelpString( wxPGPropArg id ) const + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_emptyString) + return p->GetHelpString(); + } + + /** Returns property's custom value image (NULL of none). */ + wxBitmap* GetPropertyImage( wxPGPropArg id ) const + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL) + return p->GetValueImage(); + } + + /** Returns label of a property. */ + const wxString& GetPropertyLabel( wxPGPropArg id ) + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_emptyString) + return p->GetLabel(); + } + + /** Returns name of a property, by which it is globally accessible. */ + wxString GetPropertyName( wxPGProperty* property ) + { + return property->GetName(); + } + + /** Returns parent item of a property. */ + wxPGProperty* GetPropertyParent( wxPGPropArg id ) + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxNullProperty) + return p->GetParent(); + } + +#if wxUSE_VALIDATORS + /** Returns validator of a property as a reference, which you + can pass to any number of SetPropertyValidator. + */ + wxValidator* GetPropertyValidator( wxPGPropArg id ) + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL) + return p->GetValidator(); + } +#endif + + /** Returns value as wxVariant. To get wxObject pointer from it, + you will have to use WX_PG_VARIANT_TO_WXOBJECT(VARIANT,CLASSNAME) macro. + + If property value is unspecified, Null variant is returned. + */ + wxVariant GetPropertyValue( wxPGPropArg id ) + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxVariant()) + return p->GetValue(); + } + + wxString GetPropertyValueAsString( wxPGPropArg id ) const; + long GetPropertyValueAsLong( wxPGPropArg id ) const; + unsigned long GetPropertyValueAsULong( wxPGPropArg id ) const + { + return (unsigned long) GetPropertyValueAsLong(id); + } + int GetPropertyValueAsInt( wxPGPropArg id ) const + { return (int)GetPropertyValueAsLong(id); } + bool GetPropertyValueAsBool( wxPGPropArg id ) const; + double GetPropertyValueAsDouble( wxPGPropArg id ) const; + +#define wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(TYPENAME, DEFVAL) \ + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(DEFVAL) \ + wxString typeName(wxS(TYPENAME)); \ + wxVariant value = p->GetValue(); \ + if ( value.GetType() != typeName ) \ + { \ + wxPGGetFailed(p, typeName); \ + return DEFVAL; \ + } + +#define wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL_WFALLBACK(TYPENAME, DEFVAL) \ + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(DEFVAL) \ + wxVariant value = p->GetValue(); \ + if ( value.GetType() != wxS(TYPENAME) ) \ + return DEFVAL; \ + + wxArrayString GetPropertyValueAsArrayString( wxPGPropArg id ) const + { + wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("arrstring", + wxArrayString()) + return value.GetArrayString(); + } + +#ifdef wxLongLong_t + wxLongLong_t GetPropertyValueAsLongLong( wxPGPropArg id ) const + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(0) + return p->GetValue().GetLongLong().GetValue(); + } + + wxULongLong_t GetPropertyValueAsULongLong( wxPGPropArg id ) const + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(0) + return p->GetValue().GetULongLong().GetValue(); + } +#endif + + wxArrayInt GetPropertyValueAsArrayInt( wxPGPropArg id ) const + { + wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("wxArrayInt", + wxArrayInt()) + wxArrayInt arr; + arr << value; + return arr; + } + +#if wxUSE_DATETIME + wxDateTime GetPropertyValueAsDateTime( wxPGPropArg id ) const + { + wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("datetime", + wxDateTime()) + return value.GetDateTime(); + } +#endif + + /** Returns a wxVariant list containing wxVariant versions of all + property values. Order is not guaranteed. + @param flags + Use wxPG_KEEP_STRUCTURE to retain category structure; each sub + category will be its own wxVariantList of wxVariant. + Use wxPG_INC_ATTRIBUTES to include property attributes as well. + Each attribute will be stored as list variant named + "@@<propname>@@attr." + @remarks + */ + wxVariant GetPropertyValues( const wxString& listname = wxEmptyString, + wxPGProperty* baseparent = NULL, long flags = 0 ) const + { + return m_pState->DoGetPropertyValues(listname, baseparent, flags); + } + + /** + Returns currently selected property. NULL if none. + + @remarks When wxPG_EX_MULTIPLE_SELECTION extra style is used, this + member function returns the focused property, that is the + one which can have active editor. + */ + wxPGProperty* GetSelection() const; + + /** + Returns list of currently selected properties. + + @remarks wxArrayPGProperty should be compatible with std::vector API. + */ + const wxArrayPGProperty& GetSelectedProperties() const + { + return m_pState->m_selection; + } + + wxPropertyGridPageState* GetState() const { return m_pState; } + + /** Similar to GetIterator(), but instead returns wxPGVIterator instance, + which can be useful for forward-iterating through arbitrary property + containers. + + @param flags + See @ref propgrid_iterator_flags. + */ + virtual wxPGVIterator GetVIterator( int flags ) const; + + /** Hides or reveals a property. + @param hide + If true, hides property, otherwise reveals it. + @param flags + By default changes are applied recursively. Set this paramter + wxPG_DONT_RECURSE to prevent this. + */ + bool HideProperty( wxPGPropArg id, + bool hide = true, + int flags = wxPG_RECURSE ); + +#if wxPG_INCLUDE_ADVPROPS + /** Initializes *all* property types. Causes references to most object + files in the library, so calling this may cause significant increase + in executable size when linking with static library. + */ + static void InitAllTypeHandlers(); +#else + static void InitAllTypeHandlers() { } +#endif + + //@{ + /** Inserts property to the property container. + + @param priorThis + New property is inserted just prior to this. Available only + in the first variant. There are two versions of this function + to allow this parameter to be either an id or name to + a property. + + @param newproperty + Pointer to the inserted property. wxPropertyGrid will take + ownership of this object. + + @param parent + New property is inserted under this category. Available only + in the second variant. There are two versions of this function + to allow this parameter to be either an id or name to + a property. + + @param index + Index under category. Available only in the second variant. + If index is < 0, property is appended in category. + + @return + Returns id for the property, + + @remarks + + - wxPropertyGrid takes the ownership of the property pointer. + + - While Append may be faster way to add items, make note that when + both types of data storage (categoric and + non-categoric) are active, Insert becomes even more slow. This is + especially true if current mode is non-categoric. + + Example of use: + + @code + + // append category + wxPGProperty* my_cat_id = propertygrid->Append( + new wxPropertyCategory("My Category") ); + + ... + + // insert into category - using second variant + wxPGProperty* my_item_id_1 = propertygrid->Insert( + my_cat_id, 0, new wxStringProperty("My String 1") ); + + // insert before to first item - using first variant + wxPGProperty* my_item_id_2 = propertygrid->Insert( + my_item_id, new wxStringProperty("My String 2") ); + + @endcode + + */ + wxPGProperty* Insert( wxPGPropArg priorThis, wxPGProperty* newproperty ); + wxPGProperty* Insert( wxPGPropArg parent, + int index, + wxPGProperty* newproperty ); + //@} + + /** Returns true if property is a category. */ + bool IsPropertyCategory( wxPGPropArg id ) const + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false) + return p->IsCategory(); + } + + /** Returns true if property is enabled. */ + bool IsPropertyEnabled( wxPGPropArg id ) const + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false) + return (!(p->GetFlags() & wxPG_PROP_DISABLED))?true:false; + } + + /** + Returns true if given property is expanded. + + Naturally, always returns false for properties that cannot be expanded. + */ + bool IsPropertyExpanded( wxPGPropArg id ) const; + + /** + Returns true if property has been modified after value set or modify + flag clear by software. + */ + bool IsPropertyModified( wxPGPropArg id ) const + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false) + return ( (p->GetFlags() & wxPG_PROP_MODIFIED) ? true : false ); + } + + /** + Returns true if property is selected. + */ + bool IsPropertySelected( wxPGPropArg id ) const + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false) + return m_pState->DoIsPropertySelected(p); + } + + /** + Returns true if property is shown (ie hideproperty with true not + called for it). + */ + bool IsPropertyShown( wxPGPropArg id ) const + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false) + return (!(p->GetFlags() & wxPG_PROP_HIDDEN))?true:false; + } + + /** Returns true if property value is set to unspecified. + */ + bool IsPropertyValueUnspecified( wxPGPropArg id ) const + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false) + return p->IsValueUnspecified(); + } + + /** + Disables (limit = true) or enables (limit = false) wxTextCtrl editor of + a property, if it is not the sole mean to edit the value. + */ + void LimitPropertyEditing( wxPGPropArg id, bool limit = true ); + + /** If state is shown in it's grid, refresh it now. + */ + virtual void RefreshGrid( wxPropertyGridPageState* state = NULL ); + +#if wxPG_INCLUDE_ADVPROPS + /** + Initializes additional property editors (SpinCtrl etc.). Causes + references to most object files in the library, so calling this may + cause significant increase in executable size when linking with static + library. + */ + static void RegisterAdditionalEditors(); +#else + static void RegisterAdditionalEditors() { } +#endif + + /** Replaces property with id with newly created property. For example, + this code replaces existing property named "Flags" with one that + will have different set of items: + @code + pg->ReplaceProperty("Flags", + wxFlagsProperty("Flags", wxPG_LABEL, newItems)) + @endcode + For more info, see wxPropertyGrid::Insert. + */ + wxPGProperty* ReplaceProperty( wxPGPropArg id, wxPGProperty* property ); + + /** @anchor propgridinterface_editablestate_flags + + Flags for wxPropertyGridInterface::SaveEditableState() and + wxPropertyGridInterface::RestoreEditableState(). + */ + enum EditableStateFlags + { + /** Include selected property. */ + SelectionState = 0x01, + /** Include expanded/collapsed property information. */ + ExpandedState = 0x02, + /** Include scrolled position. */ + ScrollPosState = 0x04, + /** Include selected page information. + Only applies to wxPropertyGridManager. */ + PageState = 0x08, + /** Include splitter position. Stored for each page. */ + SplitterPosState = 0x10, + /** Include description box size. + Only applies to wxPropertyGridManager. */ + DescBoxState = 0x20, + + /** + Include all supported user editable state information. + This is usually the default value. */ + AllStates = SelectionState | + ExpandedState | + ScrollPosState | + PageState | + SplitterPosState | + DescBoxState + }; + + /** + Restores user-editable state. + + See also wxPropertyGridInterface::SaveEditableState(). + + @param src + String generated by SaveEditableState. + + @param restoreStates + Which parts to restore from source string. See @ref + propgridinterface_editablestate_flags "list of editable state + flags". + + @return + False if there was problem reading the string. + + @remarks + If some parts of state (such as scrolled or splitter position) fail to + restore correctly, please make sure that you call this function after + wxPropertyGrid size has been set (this may sometimes be tricky when + sizers are used). + */ + bool RestoreEditableState( const wxString& src, + int restoreStates = AllStates ); + + /** + Used to acquire user-editable state (selected property, expanded + properties, scrolled position, splitter positions). + + @param includedStates + Which parts of state to include. See @ref + propgridinterface_editablestate_flags "list of editable state flags". + */ + wxString SaveEditableState( int includedStates = AllStates ) const; + + /** + Lets user set the strings listed in the choice dropdown of a + wxBoolProperty. Defaults are "True" and "False", so changing them to, + say, "Yes" and "No" may be useful in some less technical applications. + */ + static void SetBoolChoices( const wxString& trueChoice, + const wxString& falseChoice ); + + /** + Set proportion of a auto-stretchable column. wxPG_SPLITTER_AUTO_CENTER + window style needs to be used to indicate that columns are auto- + resizable. + + @returns Returns @false on failure. + + @remarks You should call this for individual pages of + wxPropertyGridManager (if used). + + @see GetColumnProportion() + */ + bool SetColumnProportion( unsigned int column, int proportion ); + + /** + Returns auto-resize proportion of the given column. + + @see SetColumnProportion() + */ + int GetColumnProportion( unsigned int column ) const + { + return m_pState->DoGetColumnProportion(column); + } + + /** Sets an attribute for this property. + @param name + Text identifier of attribute. See @ref propgrid_property_attributes. + @param value + Value of attribute. + @param argFlags + Optional. Use wxPG_RECURSE to set the attribute to child properties + recursively. + */ + void SetPropertyAttribute( wxPGPropArg id, + const wxString& attrName, + wxVariant value, + long argFlags = 0 ) + { + DoSetPropertyAttribute(id,attrName,value,argFlags); + } + + /** Sets property attribute for all applicapple properties. + Be sure to use this method only after all properties have been + added to the grid. + */ + void SetPropertyAttributeAll( const wxString& attrName, wxVariant value ); + + /** + Sets background colour of a property. + + @param id + Property name or pointer. + + @param colour + New background colour. + + @param flags + Default is wxPG_RECURSE which causes colour to be set recursively. + Omit this flag to only set colour for the property in question + and not any of its children. + */ + void SetPropertyBackgroundColour( wxPGPropArg id, + const wxColour& colour, + int flags = wxPG_RECURSE ); + + /** Resets text and background colours of given property. + */ + void SetPropertyColoursToDefault( wxPGPropArg id ); + + /** + Sets text colour of a property. + + @param id + Property name or pointer. + + @param colour + New background colour. + + @param flags + Default is wxPG_RECURSE which causes colour to be set recursively. + Omit this flag to only set colour for the property in question + and not any of its children. + */ + void SetPropertyTextColour( wxPGPropArg id, + const wxColour& col, + int flags = wxPG_RECURSE ); + + /** + Returns background colour of first cell of a property. + */ + wxColour GetPropertyBackgroundColour( wxPGPropArg id ) const + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxColour()) + return p->GetCell(0).GetBgCol(); + } + + /** + Returns text colour of first cell of a property. + */ + wxColour GetPropertyTextColour( wxPGPropArg id ) const + { + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxColour()) + return p->GetCell(0).GetFgCol(); + } + + /** Sets text, bitmap, and colours for given column's cell. + + @remarks + - You can set label cell by setting column to 0. + - You can use wxPG_LABEL as text to use default text for column. + */ + void SetPropertyCell( wxPGPropArg id, + int column, + const wxString& text = wxEmptyString, + const wxBitmap& bitmap = wxNullBitmap, + const wxColour& fgCol = wxNullColour, + const wxColour& bgCol = wxNullColour ); + + /** Sets client data (void*) of a property. + @remarks + This untyped client data has to be deleted manually. + */ + void SetPropertyClientData( wxPGPropArg id, void* clientData ) + { + wxPG_PROP_ARG_CALL_PROLOG() + p->SetClientData(clientData); + } + + /** Sets editor for a property. + + @param editor + For builtin editors, use wxPGEditor_X, where X is builtin editor's + name (TextCtrl, Choice, etc. see wxPGEditor documentation for full + list). + + For custom editors, use pointer you received from + wxPropertyGrid::RegisterEditorClass(). + */ + void SetPropertyEditor( wxPGPropArg id, const wxPGEditor* editor ) + { + wxPG_PROP_ARG_CALL_PROLOG() + wxCHECK_RET( editor, wxT("unknown/NULL editor") ); + p->SetEditor(editor); + RefreshProperty(p); + } + + /** Sets editor control of a property. As editor argument, use + editor name string, such as "TextCtrl" or "Choice". + */ + void SetPropertyEditor( wxPGPropArg id, const wxString& editorName ) + { + SetPropertyEditor(id,GetEditorByName(editorName)); + } + + /** Sets label of a property. + */ + void SetPropertyLabel( wxPGPropArg id, const wxString& newproplabel ); + + /** + Sets name of a property. + + @param id + Name or pointer of property which name to change. + + @param newName + New name for property. + */ + void SetPropertyName( wxPGPropArg id, const wxString& newName ) + { + wxPG_PROP_ARG_CALL_PROLOG() + m_pState->DoSetPropertyName( p, newName ); + } + + /** + Sets property (and, recursively, its children) to have read-only value. + In other words, user cannot change the value in the editor, but they + can still copy it. + @remarks + This is mainly for use with textctrl editor. Not all other editors fully + support it. + @param flags + By default changes are applied recursively. Set this paramter + wxPG_DONT_RECURSE to prevent this. + */ + void SetPropertyReadOnly( wxPGPropArg id, + bool set = true, + int flags = wxPG_RECURSE ) + { + wxPG_PROP_ARG_CALL_PROLOG() + if ( flags & wxPG_RECURSE ) + p->SetFlagRecursively(wxPG_PROP_READONLY, set); + else + p->ChangeFlag(wxPG_PROP_READONLY, set); + } + + /** Sets property's value to unspecified. + If it has children (it may be category), then the same thing is done to + them. + */ + void SetPropertyValueUnspecified( wxPGPropArg id ) + { + wxPG_PROP_ARG_CALL_PROLOG() + p->SetValueToUnspecified(); + } + + /** + Sets property values from a list of wxVariants. + */ + void SetPropertyValues( const wxVariantList& list, + wxPGPropArg defaultCategory = wxNullProperty ) + { + wxPGProperty *p; + if ( defaultCategory.HasName() ) p = defaultCategory.GetPtr(this); + else p = defaultCategory.GetPtr0(); + m_pState->DoSetPropertyValues(list, p); + } + + /** + Sets property values from a list of wxVariants. + */ + void SetPropertyValues( const wxVariant& list, + wxPGPropArg defaultCategory = wxNullProperty ) + { + SetPropertyValues(list.GetList(),defaultCategory); + } + + /** Associates the help string with property. + @remarks + By default, text is shown either in the manager's "description" + text box or in the status bar. If extra window style + wxPG_EX_HELP_AS_TOOLTIPS is used, then the text will appear as a + tooltip. + */ + void SetPropertyHelpString( wxPGPropArg id, const wxString& helpString ) + { + wxPG_PROP_ARG_CALL_PROLOG() + p->SetHelpString(helpString); + } + + /** Set wxBitmap in front of the value. + @remarks + - Bitmap will be scaled to a size returned by + wxPropertyGrid::GetImageSize(); + */ + void SetPropertyImage( wxPGPropArg id, wxBitmap& bmp ) + { + wxPG_PROP_ARG_CALL_PROLOG() + p->SetValueImage(bmp); + RefreshProperty(p); + } + + /** Sets max length of property's text. + */ + bool SetPropertyMaxLength( wxPGPropArg id, int maxLen ); + +#if wxUSE_VALIDATORS + /** Sets validator of a property. + */ + void SetPropertyValidator( wxPGPropArg id, const wxValidator& validator ) + { + wxPG_PROP_ARG_CALL_PROLOG() + p->SetValidator(validator); + } +#endif + + /** Sets value (long integer) of a property. + */ + void SetPropertyValue( wxPGPropArg id, long value ) + { + wxVariant v(value); + SetPropVal( id, v ); + } + + /** Sets value (integer) of a property. + */ + void SetPropertyValue( wxPGPropArg id, int value ) + { + wxVariant v((long)value); + SetPropVal( id, v ); + } + /** Sets value (floating point) of a property. + */ + void SetPropertyValue( wxPGPropArg id, double value ) + { + wxVariant v(value); + SetPropVal( id, v ); + } + /** Sets value (bool) of a property. + */ + void SetPropertyValue( wxPGPropArg id, bool value ) + { + wxVariant v(value); + SetPropVal( id, v ); + } + void SetPropertyValue( wxPGPropArg id, const wchar_t* value ) + { + SetPropertyValueString( id, wxString(value) ); + } + void SetPropertyValue( wxPGPropArg id, const char* value ) + { + SetPropertyValueString( id, wxString(value) ); + } + void SetPropertyValue( wxPGPropArg id, const wxString& value ) + { + SetPropertyValueString( id, value ); + } + + /** Sets value (wxArrayString) of a property. + */ + void SetPropertyValue( wxPGPropArg id, const wxArrayString& value ) + { + wxVariant v(value); + SetPropVal( id, v ); + } + +#if wxUSE_DATETIME + void SetPropertyValue( wxPGPropArg id, const wxDateTime& value ) + { + wxVariant v(value); + SetPropVal( id, v ); + } +#endif + + /** Sets value (wxObject*) of a property. + */ + void SetPropertyValue( wxPGPropArg id, wxObject* value ) + { + wxVariant v(value); + SetPropVal( id, v ); + } + + void SetPropertyValue( wxPGPropArg id, wxObject& value ) + { + wxVariant v(&value); + SetPropVal( id, v ); + } + +#ifdef wxLongLong_t + /** Sets value (wxLongLong&) of a property. + */ + void SetPropertyValue( wxPGPropArg id, wxLongLong_t value ) + { + wxVariant v = WXVARIANT(wxLongLong(value)); + SetPropVal( id, v ); + } + /** Sets value (wxULongLong&) of a property. + */ + void SetPropertyValue( wxPGPropArg id, wxULongLong_t value ) + { + wxVariant v = WXVARIANT(wxULongLong(value)); + SetPropVal( id, v ); + } +#endif + + /** Sets value (wxArrayInt&) of a property. + */ + void SetPropertyValue( wxPGPropArg id, const wxArrayInt& value ) + { + wxVariant v = WXVARIANT(value); + SetPropVal( id, v ); + } + + /** Sets value (wxString) of a property. + + @remarks + This method uses wxPGProperty::SetValueFromString, which all properties + should implement. This means that there should not be a type error, + and instead the string is converted to property's actual value type. + */ + void SetPropertyValueString( wxPGPropArg id, const wxString& value ); + + /** Sets value (wxVariant&) of a property. + + @remarks + Use wxPropertyGrid::ChangePropertyValue() instead if you need to run + through validation process and send property change event. + */ + void SetPropertyValue( wxPGPropArg id, wxVariant value ) + { + SetPropVal( id, value ); + } + + /** Sets value (wxVariant&) of a property. Same as SetPropertyValue, but + accepts reference. */ + void SetPropVal( wxPGPropArg id, wxVariant& value ); + + /** Adjusts how wxPropertyGrid behaves when invalid value is entered + in a property. + @param vfbFlags + See @link vfbflags list of valid flags values@endlink + */ + void SetValidationFailureBehavior( int vfbFlags ); + + /** + Sorts all properties recursively. + + @param flags + This can contain any of the following options: + wxPG_SORT_TOP_LEVEL_ONLY: Only sort categories and their + immediate children. Sorting done by wxPG_AUTO_SORT option + uses this. + + @see SortChildren, wxPropertyGrid::SetSortFunction + */ + void Sort( int flags = 0 ); + + /** + Sorts children of a property. + + @param id + Name or pointer to a property. + + @param flags + This can contain any of the following options: + wxPG_RECURSE: Sorts recursively. + + @see Sort, wxPropertyGrid::SetSortFunction + */ + void SortChildren( wxPGPropArg id, int flags = 0 ) + { + wxPG_PROP_ARG_CALL_PROLOG() + m_pState->DoSortChildren(p, flags); + } + + // GetPropertyByName With nice assertion error message. + wxPGProperty* GetPropertyByNameA( const wxString& name ) const; + + static wxPGEditor* GetEditorByName( const wxString& editorName ); + + // NOTE: This function reselects the property and may cause + // excess flicker, so to just call Refresh() on a rect + // of single property, call DrawItem() instead. + virtual void RefreshProperty( wxPGProperty* p ) = 0; + +protected: + + bool DoClearSelection( bool validation = false, + int selFlags = 0 ); + + /** + In derived class, implement to set editable state component with + given name to given value. + */ + virtual bool SetEditableStateItem( const wxString& name, wxVariant value ) + { + wxUnusedVar(name); + wxUnusedVar(value); + return false; + } + + /** + In derived class, implement to return editable state component with + given name. + */ + virtual wxVariant GetEditableStateItem( const wxString& name ) const + { + wxUnusedVar(name); + return wxNullVariant; + } + + // Returns page state data for given (sub) page (-1 means current page). + virtual wxPropertyGridPageState* GetPageState( int pageIndex ) const + { + if ( pageIndex <= 0 ) + return m_pState; + return NULL; + } + + virtual bool DoSelectPage( int WXUNUSED(index) ) { return true; } + + // Default call's m_pState's BaseGetPropertyByName + virtual wxPGProperty* DoGetPropertyByName( const wxString& name ) const; + + // Deriving classes must set this (it must be only or current page). + wxPropertyGridPageState* m_pState; + + // Intermediate version needed due to wxVariant copying inefficiency + void DoSetPropertyAttribute( wxPGPropArg id, + const wxString& name, + wxVariant& value, long argFlags ); + + // Empty string object to return from member functions returning const + // wxString&. + wxString m_emptyString; + +private: + // Cannot be GetGrid() due to ambiguity issues. + wxPropertyGrid* GetPropertyGrid() + { + if ( !m_pState ) + return NULL; + return m_pState->GetGrid(); + } + + // Cannot be GetGrid() due to ambiguity issues. + const wxPropertyGrid* GetPropertyGrid() const + { + if ( !m_pState ) + return NULL; + + return m_pState->GetGrid(); + } + + friend class wxPropertyGrid; + friend class wxPropertyGridManager; +}; + +#endif // wxUSE_PROPGRID + +#endif // __WX_PROPGRID_PROPGRIDIFACE_H__ diff --git a/wxmsw/include/wx-3.0/wx/propgrid/propgridpagestate.h b/wxmsw/include/wx-3.0/wx/propgrid/propgridpagestate.h new file mode 100644 index 00000000..77f38b28 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/propgrid/propgridpagestate.h @@ -0,0 +1,763 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/propgrid/propgridpagestate.h +// Purpose: wxPropertyGridPageState class +// Author: Jaakko Salli +// Modified by: +// Created: 2008-08-24 +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROPGRID_PROPGRIDPAGESTATE_H_ +#define _WX_PROPGRID_PROPGRIDPAGESTATE_H_ + +#include "wx/defs.h" + +#if wxUSE_PROPGRID + +#include "wx/propgrid/property.h" + +// ----------------------------------------------------------------------- + +/** @section propgrid_hittestresult wxPropertyGridHitTestResult + + A return value from wxPropertyGrid::HitTest(), + contains all you need to know about an arbitrary location on the grid. +*/ +class WXDLLIMPEXP_PROPGRID wxPropertyGridHitTestResult +{ + friend class wxPropertyGridPageState; +public: + wxPropertyGridHitTestResult() + { + m_property = NULL; + m_column = -1; + m_splitter = -1; + m_splitterHitOffset = 0; + } + + ~wxPropertyGridHitTestResult() + { + } + + /** + Returns column hit. -1 for margin. + */ + int GetColumn() const { return m_column; } + + /** + Returns property hit. NULL if empty space below + properties was hit instead. + */ + wxPGProperty* GetProperty() const + { + return m_property; + } + + /** + Returns index of splitter hit, -1 for none. + */ + int GetSplitter() const { return m_splitter; } + + /** + If splitter hit, then this member function + returns offset to the exact splitter position. + */ + int GetSplitterHitOffset() const { return m_splitterHitOffset; } + +private: + /** Property. NULL if empty space below properties was hit */ + wxPGProperty* m_property; + + /** Column. -1 for margin. */ + int m_column; + + /** Index of splitter hit, -1 for none. */ + int m_splitter; + + /** If splitter hit, offset to that */ + int m_splitterHitOffset; +}; + +// ----------------------------------------------------------------------- + +#define wxPG_IT_CHILDREN(A) ((A)<<16) + +/** @section propgrid_iterator_flags wxPropertyGridIterator Flags + @{ + + NOTES: At lower 16-bits, there are flags to check if item will be included. + At higher 16-bits, there are same flags, but to instead check if children + will be included. +*/ + +enum wxPG_ITERATOR_FLAGS +{ + +/** + Iterate through 'normal' property items (does not include children of + aggregate or hidden items by default). +*/ +wxPG_ITERATE_PROPERTIES = wxPG_PROP_PROPERTY | + wxPG_PROP_MISC_PARENT | + wxPG_PROP_AGGREGATE | + wxPG_PROP_COLLAPSED | + wxPG_IT_CHILDREN(wxPG_PROP_MISC_PARENT) | + wxPG_IT_CHILDREN(wxPG_PROP_CATEGORY), + +/** Iterate children of collapsed parents, and individual items that are hidden. +*/ +wxPG_ITERATE_HIDDEN = wxPG_PROP_HIDDEN | + wxPG_IT_CHILDREN(wxPG_PROP_COLLAPSED), + +/** + Iterate children of parent that is an aggregate property (ie has fixed + children). +*/ +wxPG_ITERATE_FIXED_CHILDREN = wxPG_IT_CHILDREN(wxPG_PROP_AGGREGATE) | + wxPG_ITERATE_PROPERTIES, + +/** Iterate categories. + Note that even without this flag, children of categories are still iterated + through. +*/ +wxPG_ITERATE_CATEGORIES = wxPG_PROP_CATEGORY | + wxPG_IT_CHILDREN(wxPG_PROP_CATEGORY) | + wxPG_PROP_COLLAPSED, + +wxPG_ITERATE_ALL_PARENTS = wxPG_PROP_MISC_PARENT | + wxPG_PROP_AGGREGATE | + wxPG_PROP_CATEGORY, + +wxPG_ITERATE_ALL_PARENTS_RECURSIVELY = wxPG_ITERATE_ALL_PARENTS | + wxPG_IT_CHILDREN( + wxPG_ITERATE_ALL_PARENTS), + +wxPG_ITERATOR_FLAGS_ALL = wxPG_PROP_PROPERTY | + wxPG_PROP_MISC_PARENT | + wxPG_PROP_AGGREGATE | + wxPG_PROP_HIDDEN | + wxPG_PROP_CATEGORY | + wxPG_PROP_COLLAPSED, + +wxPG_ITERATOR_MASK_OP_ITEM = wxPG_ITERATOR_FLAGS_ALL, + +// (wxPG_PROP_MISC_PARENT|wxPG_PROP_AGGREGATE|wxPG_PROP_CATEGORY) +wxPG_ITERATOR_MASK_OP_PARENT = wxPG_ITERATOR_FLAGS_ALL, + +/** Combines all flags needed to iterate through visible properties + (ie hidden properties and children of collapsed parents are skipped). +*/ +wxPG_ITERATE_VISIBLE = wxPG_ITERATE_PROPERTIES | + wxPG_PROP_CATEGORY | + wxPG_IT_CHILDREN(wxPG_PROP_AGGREGATE), + +/** Iterate all items. +*/ +wxPG_ITERATE_ALL = wxPG_ITERATE_VISIBLE | + wxPG_ITERATE_HIDDEN, + +/** Iterate through individual properties (ie categories and children of + aggregate properties are skipped). +*/ +wxPG_ITERATE_NORMAL = wxPG_ITERATE_PROPERTIES | + wxPG_ITERATE_HIDDEN, + +/** Default iterator flags. +*/ +wxPG_ITERATE_DEFAULT = wxPG_ITERATE_NORMAL + +}; + +/** @} +*/ + + +#define wxPG_ITERATOR_CREATE_MASKS(FLAGS, A, B) \ + A = (FLAGS ^ wxPG_ITERATOR_MASK_OP_ITEM) & \ + wxPG_ITERATOR_MASK_OP_ITEM & 0xFFFF; \ + B = ((FLAGS>>16) ^ wxPG_ITERATOR_MASK_OP_PARENT) & \ + wxPG_ITERATOR_MASK_OP_PARENT & 0xFFFF; + + +// Macro to test if children of PWC should be iterated through +#define wxPG_ITERATOR_PARENTEXMASK_TEST(PWC, PARENTMASK) \ + ( \ + !(PWC->GetFlags() & PARENTMASK) && \ + PWC->GetChildCount() \ + ) + + +// Base for wxPropertyGridIterator classes. +class WXDLLIMPEXP_PROPGRID wxPropertyGridIteratorBase +{ +public: + wxPropertyGridIteratorBase() + { + } + + void Assign( const wxPropertyGridIteratorBase& it ); + + bool AtEnd() const { return m_property == NULL; } + + /** Get current property. + */ + wxPGProperty* GetProperty() const { return m_property; } + + void Init( wxPropertyGridPageState* state, + int flags, + wxPGProperty* property, + int dir = 1 ); + + void Init( wxPropertyGridPageState* state, + int flags, + int startPos = wxTOP, + int dir = 0 ); + + /** Iterate to the next property. + */ + void Next( bool iterateChildren = true ); + + /** Iterate to the previous property. + */ + void Prev(); + + /** + Set base parent, ie a property when, in which iteration returns, it + ends. + + Default base parent is the root of the used wxPropertyGridPageState. + */ + void SetBaseParent( wxPGProperty* baseParent ) + { m_baseParent = baseParent; } + +protected: + + wxPGProperty* m_property; + +private: + wxPropertyGridPageState* m_state; + wxPGProperty* m_baseParent; + + // Masks are used to quickly exclude items + int m_itemExMask; + int m_parentExMask; +}; + + +#define wxPG_IMPLEMENT_ITERATOR(CLASS, PROPERTY, STATE) \ + CLASS( STATE* state, int flags = wxPG_ITERATE_DEFAULT, \ + PROPERTY* property = NULL, int dir = 1 ) \ + : wxPropertyGridIteratorBase() \ + { Init( (wxPropertyGridPageState*)state, flags, \ + (wxPGProperty*)property, dir ); } \ + CLASS( STATE* state, int flags, int startPos, int dir = 0 ) \ + : wxPropertyGridIteratorBase() \ + { Init( (wxPropertyGridPageState*)state, flags, startPos, dir ); } \ + CLASS() \ + : wxPropertyGridIteratorBase() \ + { \ + m_property = NULL; \ + } \ + CLASS( const CLASS& it ) \ + : wxPropertyGridIteratorBase( ) \ + { \ + Assign(it); \ + } \ + ~CLASS() \ + { \ + } \ + const CLASS& operator=( const CLASS& it ) \ + { \ + if (this != &it) \ + Assign(it); \ + return *this; \ + } \ + CLASS& operator++() { Next(); return *this; } \ + CLASS operator++(int) { CLASS it=*this;Next();return it; } \ + CLASS& operator--() { Prev(); return *this; } \ + CLASS operator--(int) { CLASS it=*this;Prev();return it; } \ + PROPERTY* operator *() const { return (PROPERTY*)m_property; } \ + static PROPERTY* OneStep( STATE* state, \ + int flags = wxPG_ITERATE_DEFAULT, \ + PROPERTY* property = NULL, \ + int dir = 1 ) \ + { \ + CLASS it( state, flags, property, dir ); \ + if ( property ) \ + { \ + if ( dir == 1 ) it.Next(); \ + else it.Prev(); \ + } \ + return *it; \ + } + + +/** @class wxPropertyGridIterator + + Preferable way to iterate through contents of wxPropertyGrid, + wxPropertyGridManager, and wxPropertyGridPage. + + See wxPropertyGridInterface::GetIterator() for more information about usage. + + @library{wxpropgrid} + @category{propgrid} +*/ +class WXDLLIMPEXP_PROPGRID + wxPropertyGridIterator : public wxPropertyGridIteratorBase +{ +public: + + wxPG_IMPLEMENT_ITERATOR(wxPropertyGridIterator, + wxPGProperty, + wxPropertyGridPageState) + +protected: +}; + + +// Const version of wxPropertyGridIterator. +class WXDLLIMPEXP_PROPGRID + wxPropertyGridConstIterator : public wxPropertyGridIteratorBase +{ +public: + wxPG_IMPLEMENT_ITERATOR(wxPropertyGridConstIterator, + const wxPGProperty, + const wxPropertyGridPageState) + + /** + Additional copy constructor. + */ + wxPropertyGridConstIterator( const wxPropertyGridIterator& other ) + { + Assign(other); + } + + /** + Additional assignment operator. + */ + const wxPropertyGridConstIterator& operator=( const wxPropertyGridIterator& it ) + { + Assign(it); + return *this; + } + +protected: +}; + +// ----------------------------------------------------------------------- + +/** Base class to derive new viterators. +*/ +class WXDLLIMPEXP_PROPGRID wxPGVIteratorBase : public wxObjectRefData +{ + friend class wxPGVIterator; +public: + wxPGVIteratorBase() { } + virtual void Next() = 0; +protected: + virtual ~wxPGVIteratorBase() { } + + wxPropertyGridIterator m_it; +}; + +/** @class wxPGVIterator + + Abstract implementation of a simple iterator. Can only be used + to iterate in forward order, and only through the entire container. + Used to have functions dealing with all properties work with both + wxPropertyGrid and wxPropertyGridManager. +*/ +class WXDLLIMPEXP_PROPGRID wxPGVIterator +{ +public: + wxPGVIterator() { m_pIt = NULL; } + wxPGVIterator( wxPGVIteratorBase* obj ) { m_pIt = obj; } + ~wxPGVIterator() { UnRef(); } + void UnRef() { if (m_pIt) m_pIt->DecRef(); } + wxPGVIterator( const wxPGVIterator& it ) + { + m_pIt = it.m_pIt; + m_pIt->IncRef(); + } + const wxPGVIterator& operator=( const wxPGVIterator& it ) + { + if (this != &it) + { + UnRef(); + m_pIt = it.m_pIt; + m_pIt->IncRef(); + } + return *this; + } + void Next() { m_pIt->Next(); } + bool AtEnd() const { return m_pIt->m_it.AtEnd(); } + wxPGProperty* GetProperty() const { return m_pIt->m_it.GetProperty(); } +protected: + wxPGVIteratorBase* m_pIt; +}; + +// ----------------------------------------------------------------------- + +/** @class wxPropertyGridPageState + + Contains low-level property page information (properties, column widths, + etc) of a single wxPropertyGrid or single wxPropertyGridPage. Generally you + should not use this class directly, but instead member functions in + wxPropertyGridInterface, wxPropertyGrid, wxPropertyGridPage, and + wxPropertyGridManager. + + @remarks + - In separate wxPropertyGrid component this class was known as + wxPropertyGridState. + - Currently this class is not implemented in wxPython. + + @library{wxpropgrid} + @category{propgrid} +*/ +class WXDLLIMPEXP_PROPGRID wxPropertyGridPageState +{ + friend class wxPGProperty; + friend class wxPropertyGrid; + friend class wxPGCanvas; + friend class wxPropertyGridInterface; + friend class wxPropertyGridPage; + friend class wxPropertyGridManager; +public: + + /** Default constructor. */ + wxPropertyGridPageState(); + + /** Destructor. */ + virtual ~wxPropertyGridPageState(); + + /** Makes sure all columns have minimum width. + */ + void CheckColumnWidths( int widthChange = 0 ); + + /** + Override this member function to add custom behaviour on property + deletion. + */ + virtual void DoDelete( wxPGProperty* item, bool doDelete = true ); + + wxSize DoFitColumns( bool allowGridResize = false ); + + wxPGProperty* DoGetItemAtY( int y ) const; + + /** + Override this member function to add custom behaviour on property + insertion. + */ + virtual wxPGProperty* DoInsert( wxPGProperty* parent, + int index, + wxPGProperty* property ); + + /** + This needs to be overridden in grid used the manager so that splitter + changes can be propagated to other pages. + */ + virtual void DoSetSplitterPosition( int pos, + int splitterColumn = 0, + int flags = 0 ); + + bool EnableCategories( bool enable ); + + /** Make sure virtual height is up-to-date. + */ + void EnsureVirtualHeight() + { + if ( m_vhCalcPending ) + { + RecalculateVirtualHeight(); + m_vhCalcPending = 0; + } + } + + /** Returns (precalculated) height of contained visible properties. + */ + unsigned int GetVirtualHeight() const + { + wxASSERT( !m_vhCalcPending ); + return m_virtualHeight; + } + + /** Returns (precalculated) height of contained visible properties. + */ + unsigned int GetVirtualHeight() + { + EnsureVirtualHeight(); + return m_virtualHeight; + } + + /** Returns actual height of contained visible properties. + @remarks + Mostly used for internal diagnostic purposes. + */ + inline unsigned int GetActualVirtualHeight() const; + + unsigned int GetColumnCount() const + { + return (unsigned int) m_colWidths.size(); + } + + int GetColumnMinWidth( int column ) const; + + int GetColumnWidth( unsigned int column ) const + { + return m_colWidths[column]; + } + + wxPropertyGrid* GetGrid() const { return m_pPropGrid; } + + /** Returns last item which could be iterated using given flags. + @param flags + @link iteratorflags List of iterator flags@endlink + */ + wxPGProperty* GetLastItem( int flags = wxPG_ITERATE_DEFAULT ); + + const wxPGProperty* GetLastItem( int flags = wxPG_ITERATE_DEFAULT ) const + { + return ((wxPropertyGridPageState*)this)->GetLastItem(flags); + } + + /** + Returns currently selected property. + */ + wxPGProperty* GetSelection() const + { + if ( m_selection.size() == 0 ) + return NULL; + return m_selection[0]; + } + + void DoSetSelection( wxPGProperty* prop ) + { + m_selection.clear(); + if ( prop ) + m_selection.push_back(prop); + } + + bool DoClearSelection() + { + return DoSelectProperty(NULL); + } + + void DoRemoveFromSelection( wxPGProperty* prop ); + + void DoSetColumnProportion( unsigned int column, int proportion ); + + int DoGetColumnProportion( unsigned int column ) const + { + return m_columnProportions[column]; + } + + void ResetColumnSizes( int setSplitterFlags ); + + wxPropertyCategory* GetPropertyCategory( const wxPGProperty* p ) const; + + wxPGProperty* GetPropertyByLabel( const wxString& name, + wxPGProperty* parent = NULL ) const; + + wxVariant DoGetPropertyValues( const wxString& listname, + wxPGProperty* baseparent, + long flags ) const; + + wxPGProperty* DoGetRoot() const { return m_properties; } + + void DoSetPropertyName( wxPGProperty* p, const wxString& newName ); + + // Returns combined width of margin and all the columns + int GetVirtualWidth() const + { + return m_width; + } + + /** + Returns minimal width for given column so that all images and texts + will fit entirely. + + Used by SetSplitterLeft() and DoFitColumns(). + */ + int GetColumnFitWidth(wxClientDC& dc, + wxPGProperty* pwc, + unsigned int col, + bool subProps) const; + + int GetColumnFullWidth(wxClientDC &dc, wxPGProperty *p, unsigned int col); + + /** + Returns information about arbitrary position in the grid. + + @param pt + Logical coordinates in the virtual grid space. Use + wxScrolled<T>::CalcUnscrolledPosition() if you need to + translate a scrolled position into a logical one. + */ + wxPropertyGridHitTestResult HitTest( const wxPoint& pt ) const; + + /** Returns true if page is visibly displayed. + */ + inline bool IsDisplayed() const; + + bool IsInNonCatMode() const { return (bool)(m_properties == m_abcArray); } + + void DoLimitPropertyEditing( wxPGProperty* p, bool limit = true ) + { + p->SetFlagRecursively(wxPG_PROP_NOEDITOR, limit); + } + + bool DoSelectProperty( wxPGProperty* p, unsigned int flags = 0 ); + + /** widthChange is non-client. + */ + void OnClientWidthChange( int newWidth, + int widthChange, + bool fromOnResize = false ); + + /** Recalculates m_virtualHeight. + */ + void RecalculateVirtualHeight() + { + m_virtualHeight = GetActualVirtualHeight(); + } + + void SetColumnCount( int colCount ); + + void PropagateColSizeDec( int column, int decrease, int dir ); + + bool DoHideProperty( wxPGProperty* p, bool hide, int flags = wxPG_RECURSE ); + + bool DoSetPropertyValueString( wxPGProperty* p, const wxString& value ); + + bool DoSetPropertyValue( wxPGProperty* p, wxVariant& value ); + + bool DoSetPropertyValueWxObjectPtr( wxPGProperty* p, wxObject* value ); + void DoSetPropertyValues( const wxVariantList& list, + wxPGProperty* default_category ); + + void SetSplitterLeft( bool subProps = false ); + + /** Set virtual width for this particular page. */ + void SetVirtualWidth( int width ); + + void DoSortChildren( wxPGProperty* p, int flags = 0 ); + void DoSort( int flags = 0 ); + + bool PrepareAfterItemsAdded(); + + /** Called after virtual height needs to be recalculated. + */ + void VirtualHeightChanged() + { + m_vhCalcPending = 1; + } + + /** Base append. */ + wxPGProperty* DoAppend( wxPGProperty* property ); + + /** Returns property by its name. */ + wxPGProperty* BaseGetPropertyByName( const wxString& name ) const; + + /** Called in, for example, wxPropertyGrid::Clear. */ + void DoClear(); + + bool DoIsPropertySelected( wxPGProperty* prop ) const; + + bool DoCollapse( wxPGProperty* p ); + + bool DoExpand( wxPGProperty* p ); + + void CalculateFontAndBitmapStuff( int vspacing ); + +protected: + + // Utility to check if two properties are visibly next to each other + bool ArePropertiesAdjacent( wxPGProperty* prop1, + wxPGProperty* prop2, + int iterFlags = wxPG_ITERATE_VISIBLE ) const; + + int DoGetSplitterPosition( int splitterIndex = 0 ) const; + + /** Returns column at x coordinate (in GetGrid()->GetPanel()). + @param pSplitterHit + Give pointer to int that receives index to splitter that is at x. + @param pSplitterHitOffset + Distance from said splitter. + */ + int HitTestH( int x, int* pSplitterHit, int* pSplitterHitOffset ) const; + + bool PrepareToAddItem( wxPGProperty* property, + wxPGProperty* scheduledParent ); + + /** If visible, then this is pointer to wxPropertyGrid. + This shall *never* be NULL to indicate that this state is not visible. + */ + wxPropertyGrid* m_pPropGrid; + + /** Pointer to currently used array. */ + wxPGProperty* m_properties; + + /** Array for categoric mode. */ + wxPGRootProperty m_regularArray; + + /** Array for root of non-categoric mode. */ + wxPGRootProperty* m_abcArray; + + /** Dictionary for name-based access. */ + wxPGHashMapS2P m_dictName; + + /** List of column widths (first column does not include margin). */ + wxArrayInt m_colWidths; + + /** List of indices of columns the user can edit by clicking it. */ + wxArrayInt m_editableColumns; + + /** Column proportions */ + wxArrayInt m_columnProportions; + + double m_fSplitterX; + + /** Most recently added category. */ + wxPropertyCategory* m_currentCategory; + + /** Array of selected property. */ + wxArrayPGProperty m_selection; + + /** Virtual width. */ + int m_width; + + /** Indicates total virtual height of visible properties. */ + unsigned int m_virtualHeight; + + /** 1 if m_lastCaption is also the bottommost caption. */ + unsigned char m_lastCaptionBottomnest; + + /** 1 items appended/inserted, so stuff needs to be done before drawing; + If m_virtualHeight == 0, then calcylatey's must be done. + Otherwise just sort. + */ + unsigned char m_itemsAdded; + + /** 1 if any value is modified. */ + unsigned char m_anyModified; + + unsigned char m_vhCalcPending; + + /** True if splitter has been pre-set by the application. */ + bool m_isSplitterPreSet; + + /** Used to (temporarily) disable splitter centering. */ + bool m_dontCenterSplitter; + +private: + /** Only inits arrays, doesn't migrate things or such. */ + void InitNonCatMode(); +}; + +// ----------------------------------------------------------------------- + +#endif // wxUSE_PROPGRID + +#endif // _WX_PROPGRID_PROPGRIDPAGESTATE_H_ + diff --git a/wxmsw/include/wx-3.0/wx/propgrid/props.h b/wxmsw/include/wx-3.0/wx/propgrid/props.h new file mode 100644 index 00000000..ea902d13 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/propgrid/props.h @@ -0,0 +1,1029 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/propgrid/props.h +// Purpose: wxPropertyGrid Property Classes +// Author: Jaakko Salli +// Modified by: +// Created: 2007-03-28 +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROPGRID_PROPS_H_ +#define _WX_PROPGRID_PROPS_H_ + +#include "wx/defs.h" + +#if wxUSE_PROPGRID + +// ----------------------------------------------------------------------- + +class wxPGArrayEditorDialog; + +#include "wx/propgrid/editors.h" + +#include "wx/filename.h" +#include "wx/dialog.h" +#include "wx/textctrl.h" +#include "wx/button.h" +#include "wx/listbox.h" +#include "wx/valtext.h" + +// ----------------------------------------------------------------------- + +// +// Property class implementation helper macros. +// + +#define WX_PG_IMPLEMENT_PROPERTY_CLASS(NAME, UPCLASS, T, T_AS_ARG, EDITOR) \ +IMPLEMENT_DYNAMIC_CLASS(NAME, UPCLASS) \ +WX_PG_IMPLEMENT_PROPERTY_CLASS_PLAIN(NAME, T, EDITOR) + +// ----------------------------------------------------------------------- + +// +// These macros help creating DoGetValidator +#define WX_PG_DOGETVALIDATOR_ENTRY() \ + static wxValidator* s_ptr = NULL; \ + if ( s_ptr ) return s_ptr; + +// Common function exit +#define WX_PG_DOGETVALIDATOR_EXIT(VALIDATOR) \ + s_ptr = VALIDATOR; \ + wxPGGlobalVars->m_arrValidators.push_back( VALIDATOR ); \ + return VALIDATOR; + +// ----------------------------------------------------------------------- + +/** @class wxPGInDialogValidator + @ingroup classes + Creates and manages a temporary wxTextCtrl for validation purposes. + Uses wxPropertyGrid's current editor, if available. +*/ +class WXDLLIMPEXP_PROPGRID wxPGInDialogValidator +{ +public: + wxPGInDialogValidator() + { + m_textCtrl = NULL; + } + + ~wxPGInDialogValidator() + { + if ( m_textCtrl ) + m_textCtrl->Destroy(); + } + + bool DoValidate( wxPropertyGrid* propGrid, + wxValidator* validator, + const wxString& value ); + +private: + wxTextCtrl* m_textCtrl; +}; + + +// ----------------------------------------------------------------------- +// Property classes +// ----------------------------------------------------------------------- + +#define wxPG_PROP_PASSWORD wxPG_PROP_CLASS_SPECIFIC_2 + +/** @class wxStringProperty + @ingroup classes + Basic property with string value. + + <b>Supported special attributes:</b> + - "Password": set to 1 in order to enable wxTE_PASSWORD on the editor. + + @remarks + - If value "<composed>" is set, then actual value is formed (or composed) + from values of child properties. +*/ +class WXDLLIMPEXP_PROPGRID wxStringProperty : public wxPGProperty +{ + WX_PG_DECLARE_PROPERTY_CLASS(wxStringProperty) +public: + wxStringProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + const wxString& value = wxEmptyString ); + virtual ~wxStringProperty(); + + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + virtual bool StringToValue( wxVariant& variant, + const wxString& text, + int argFlags = 0 ) const; + + virtual bool DoSetAttribute( const wxString& name, wxVariant& value ); + + /** This is updated so "<composed>" special value can be handled. + */ + virtual void OnSetValue(); + +protected: +}; + +// ----------------------------------------------------------------------- + +/** Constants used with NumericValidation<>(). +*/ +enum wxPGNumericValidationConstants +{ + /** Instead of modifying the value, show an error message. + */ + wxPG_PROPERTY_VALIDATION_ERROR_MESSAGE = 0, + + /** Modify value, but stick with the limitations. + */ + wxPG_PROPERTY_VALIDATION_SATURATE = 1, + + /** Modify value, wrap around on overflow. + */ + wxPG_PROPERTY_VALIDATION_WRAP = 2 +}; + +// ----------------------------------------------------------------------- + +#if wxUSE_VALIDATORS + +/** + A more comprehensive numeric validator class. +*/ +class WXDLLIMPEXP_PROPGRID wxNumericPropertyValidator : public wxTextValidator +{ +public: + enum NumericType + { + Signed = 0, + Unsigned, + Float + }; + + wxNumericPropertyValidator( NumericType numericType, int base = 10 ); + virtual ~wxNumericPropertyValidator() { } + virtual bool Validate(wxWindow* parent); +}; + +#endif // wxUSE_VALIDATORS + + +/** @class wxIntProperty + @ingroup classes + Basic property with integer value. + + Seamlessly supports 64-bit integer (wxLongLong) on overflow. + + <b>Example how to use seamless 64-bit integer support</b> + + Getting value: + + @code + wxLongLong_t value = pg->GetPropertyValueAsLongLong(); + @endcode + + or + + @code + wxLongLong_t value; + wxVariant variant = property->GetValue(); + if ( variant.GetType() == "wxLongLong" ) + value = wxLongLongFromVariant(variant); + else + value = variant.GetLong(); + @endcode + + Setting value: + + @code + pg->SetPropertyValue(longLongVal); + @endcode + + or + + @code + property->SetValue(WXVARIANT(longLongVal)); + @endcode + + + <b>Supported special attributes:</b> + - "Min", "Max": Specify acceptable value range. +*/ +class WXDLLIMPEXP_PROPGRID wxIntProperty : public wxPGProperty +{ + WX_PG_DECLARE_PROPERTY_CLASS(wxIntProperty) +public: + wxIntProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + long value = 0 ); + virtual ~wxIntProperty(); + + wxIntProperty( const wxString& label, + const wxString& name, + const wxLongLong& value ); + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + virtual bool StringToValue( wxVariant& variant, + const wxString& text, + int argFlags = 0 ) const; + virtual bool ValidateValue( wxVariant& value, + wxPGValidationInfo& validationInfo ) const; + virtual bool IntToValue( wxVariant& variant, + int number, + int argFlags = 0 ) const; + static wxValidator* GetClassValidator(); + virtual wxValidator* DoGetValidator() const; + + /** Validation helper. + */ + static bool DoValidation( const wxPGProperty* property, + wxLongLong_t& value, + wxPGValidationInfo* pValidationInfo, + int mode = + wxPG_PROPERTY_VALIDATION_ERROR_MESSAGE ); + +protected: +}; + +// ----------------------------------------------------------------------- + +/** @class wxUIntProperty + @ingroup classes + Basic property with unsigned integer value. + Seamlessly supports 64-bit integer (wxULongLong) on overflow. + + <b>Supported special attributes:</b> + - "Min", "Max": Specify acceptable value range. + - "Base": Define base. Valid constants are wxPG_BASE_OCT, wxPG_BASE_DEC, + wxPG_BASE_HEX and wxPG_BASE_HEXL (lowercase characters). Arbitrary bases + are <b>not</b> supported. + - "Prefix": Possible values are wxPG_PREFIX_NONE, wxPG_PREFIX_0x, and + wxPG_PREFIX_DOLLAR_SIGN. Only wxPG_PREFIX_NONE works with Decimal and Octal + numbers. + + @remarks + - For example how to use seamless 64-bit integer support, see wxIntProperty + documentation (just use wxULongLong instead of wxLongLong). +*/ +class WXDLLIMPEXP_PROPGRID wxUIntProperty : public wxPGProperty +{ + WX_PG_DECLARE_PROPERTY_CLASS(wxUIntProperty) +public: + wxUIntProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + unsigned long value = 0 ); + virtual ~wxUIntProperty(); + wxUIntProperty( const wxString& label, + const wxString& name, + const wxULongLong& value ); + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + virtual bool StringToValue( wxVariant& variant, + const wxString& text, + int argFlags = 0 ) const; + virtual bool DoSetAttribute( const wxString& name, wxVariant& value ); + virtual bool ValidateValue( wxVariant& value, + wxPGValidationInfo& validationInfo ) const; + virtual wxValidator* DoGetValidator () const; + virtual bool IntToValue( wxVariant& variant, + int number, + int argFlags = 0 ) const; +protected: + wxByte m_base; + wxByte m_realBase; // translated to 8,16,etc. + wxByte m_prefix; +private: + void Init(); +}; + +// ----------------------------------------------------------------------- + +/** @class wxFloatProperty + @ingroup classes + Basic property with double-precision floating point value. + + <b>Supported special attributes:</b> + - "Precision": Sets the (max) precision used when floating point value is + rendered as text. The default -1 means infinite precision. +*/ +class WXDLLIMPEXP_PROPGRID wxFloatProperty : public wxPGProperty +{ + WX_PG_DECLARE_PROPERTY_CLASS(wxFloatProperty) +public: + wxFloatProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + double value = 0.0 ); + virtual ~wxFloatProperty(); + + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + virtual bool StringToValue( wxVariant& variant, + const wxString& text, + int argFlags = 0 ) const; + virtual bool DoSetAttribute( const wxString& name, wxVariant& value ); + virtual bool ValidateValue( wxVariant& value, + wxPGValidationInfo& validationInfo ) const; + + /** Validation helper. + */ + static bool DoValidation( const wxPGProperty* property, + double& value, + wxPGValidationInfo* pValidationInfo, + int mode = + wxPG_PROPERTY_VALIDATION_ERROR_MESSAGE ); + static wxValidator* GetClassValidator(); + virtual wxValidator* DoGetValidator () const; + +protected: + int m_precision; +}; + +// ----------------------------------------------------------------------- + +/** @class wxBoolProperty + @ingroup classes + Basic property with boolean value. + + <b>Supported special attributes:</b> + - "UseCheckbox": Set to 1 to use check box editor instead of combo box. + - "UseDClickCycling": Set to 1 to cycle combo box instead showing the list. +*/ +class WXDLLIMPEXP_PROPGRID wxBoolProperty : public wxPGProperty +{ + WX_PG_DECLARE_PROPERTY_CLASS(wxBoolProperty) +public: + wxBoolProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + bool value = false ); + virtual ~wxBoolProperty(); + + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + virtual bool StringToValue( wxVariant& variant, + const wxString& text, + int argFlags = 0 ) const; + virtual bool IntToValue( wxVariant& variant, + int number, int argFlags = 0 ) const; + virtual bool DoSetAttribute( const wxString& name, wxVariant& value ); +}; + +// ----------------------------------------------------------------------- + +// If set, then selection of choices is static and should not be +// changed (i.e. returns NULL in GetPropertyChoices). +#define wxPG_PROP_STATIC_CHOICES wxPG_PROP_CLASS_SPECIFIC_1 + +/** @class wxEnumProperty + @ingroup classes + You can derive custom properties with choices from this class. See + wxBaseEnumProperty for remarks. + + @remarks + - Updating private index is important. You can do this either by calling + SetIndex() in IntToValue, and then letting wxBaseEnumProperty::OnSetValue + be called (by not implementing it, or by calling super class function in + it) -OR- you can just call SetIndex in OnSetValue. +*/ +class WXDLLIMPEXP_PROPGRID wxEnumProperty : public wxPGProperty +{ + WX_PG_DECLARE_PROPERTY_CLASS(wxEnumProperty) +public: + +#ifndef SWIG + wxEnumProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + const wxChar* const* labels = NULL, + const long* values = NULL, + int value = 0 ); + wxEnumProperty( const wxString& label, + const wxString& name, + wxPGChoices& choices, + int value = 0 ); + + // Special constructor for caching choices (used by derived class) + wxEnumProperty( const wxString& label, + const wxString& name, + const wxChar* const* labels, + const long* values, + wxPGChoices* choicesCache, + int value = 0 ); + + wxEnumProperty( const wxString& label, + const wxString& name, + const wxArrayString& labels, + const wxArrayInt& values = wxArrayInt(), + int value = 0 ); +#else + wxEnumProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + const wxArrayString& labels = wxArrayString(), + const wxArrayInt& values = wxArrayInt(), + int value = 0 ); +#endif + + virtual ~wxEnumProperty(); + + size_t GetItemCount() const { return m_choices.GetCount(); } + + virtual void OnSetValue(); + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + virtual bool StringToValue( wxVariant& variant, + const wxString& text, + int argFlags = 0 ) const; + virtual bool ValidateValue( wxVariant& value, + wxPGValidationInfo& validationInfo ) const; + + // If wxPG_FULL_VALUE is not set in flags, then the value is interpreted + // as index to choices list. Otherwise, it is actual value. + virtual bool IntToValue( wxVariant& variant, + int number, + int argFlags = 0 ) const; + + // + // Additional virtuals + + // This must be overridden to have non-index based value + virtual int GetIndexForValue( int value ) const; + + // GetChoiceSelection needs to overridden since m_index is + // the true index, and various property classes derived from + // this take advantage of it. + virtual int GetChoiceSelection() const { return m_index; } + + virtual void OnValidationFailure( wxVariant& pendingValue ); + +protected: + + int GetIndex() const; + void SetIndex( int index ); + + bool ValueFromString_( wxVariant& value, + const wxString& text, + int argFlags ) const; + bool ValueFromInt_( wxVariant& value, int intVal, int argFlags ) const; + + static void ResetNextIndex() { ms_nextIndex = -2; } + +private: + // This is private so that classes are guaranteed to use GetIndex + // for up-to-date index value. + int m_index; + + // Relies on ValidateValue being called always before OnSetValue + static int ms_nextIndex; +}; + +// ----------------------------------------------------------------------- + +/** @class wxEditEnumProperty + @ingroup classes + wxEnumProperty with wxString value and writable combo box editor. + + @remarks + Uses int value, similar to wxEnumProperty, unless text entered by user is + is not in choices (in which case string value is used). +*/ +class WXDLLIMPEXP_PROPGRID wxEditEnumProperty : public wxEnumProperty +{ + WX_PG_DECLARE_PROPERTY_CLASS(wxEditEnumProperty) +public: + + wxEditEnumProperty( const wxString& label, + const wxString& name, + const wxChar* const* labels, + const long* values, + const wxString& value ); + wxEditEnumProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + const wxArrayString& labels = wxArrayString(), + const wxArrayInt& values = wxArrayInt(), + const wxString& value = wxEmptyString ); + wxEditEnumProperty( const wxString& label, + const wxString& name, + wxPGChoices& choices, + const wxString& value = wxEmptyString ); + + // Special constructor for caching choices (used by derived class) + wxEditEnumProperty( const wxString& label, + const wxString& name, + const wxChar* const* labels, + const long* values, + wxPGChoices* choicesCache, + const wxString& value ); + + virtual ~wxEditEnumProperty(); + +protected: +}; + +// ----------------------------------------------------------------------- + +/** @class wxFlagsProperty + @ingroup classes + Represents a bit set that fits in a long integer. wxBoolProperty + sub-properties are created for editing individual bits. Textctrl is created + to manually edit the flags as a text; a continuous sequence of spaces, + commas and semicolons is considered as a flag id separator. + <b>Note:</b> When changing "choices" (ie. flag labels) of wxFlagsProperty, + you will need to use SetPropertyChoices - otherwise they will not get + updated properly. +*/ +class WXDLLIMPEXP_PROPGRID wxFlagsProperty : public wxPGProperty +{ + WX_PG_DECLARE_PROPERTY_CLASS(wxFlagsProperty) +public: + +#ifndef SWIG + wxFlagsProperty( const wxString& label, + const wxString& name, + const wxChar* const* labels, + const long* values = NULL, + long value = 0 ); + wxFlagsProperty( const wxString& label, + const wxString& name, + wxPGChoices& choices, + long value = 0 ); +#endif + wxFlagsProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + const wxArrayString& labels = wxArrayString(), + const wxArrayInt& values = wxArrayInt(), + int value = 0 ); + virtual ~wxFlagsProperty (); + + virtual void OnSetValue(); + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + virtual bool StringToValue( wxVariant& variant, + const wxString& text, + int flags ) const; + virtual wxVariant ChildChanged( wxVariant& thisValue, + int childIndex, + wxVariant& childValue ) const; + virtual void RefreshChildren(); + virtual bool DoSetAttribute( const wxString& name, wxVariant& value ); + + // GetChoiceSelection needs to overridden since m_choices is + // used and value is integer, but it is not index. + virtual int GetChoiceSelection() const { return wxNOT_FOUND; } + + // helpers + size_t GetItemCount() const { return m_choices.GetCount(); } + const wxString& GetLabel( size_t ind ) const + { return m_choices.GetLabel(static_cast<int>(ind)); } + +protected: + // Used to detect if choices have been changed + wxPGChoicesData* m_oldChoicesData; + + // Needed to properly mark changed sub-properties + long m_oldValue; + + // Converts string id to a relevant bit. + long IdToBit( const wxString& id ) const; + + // Creates children and sets value. + void Init(); +}; + +// ----------------------------------------------------------------------- + +/** @class wxPGFileDialogAdapter + @ingroup classes +*/ +class WXDLLIMPEXP_PROPGRID + wxPGFileDialogAdapter : public wxPGEditorDialogAdapter +{ +public: + virtual bool DoShowDialog( wxPropertyGrid* propGrid, + wxPGProperty* property ); +}; + +// ----------------------------------------------------------------------- + +// Indicates first bit useable by derived properties. +#define wxPG_PROP_SHOW_FULL_FILENAME wxPG_PROP_CLASS_SPECIFIC_1 + +/** @class wxFileProperty + @ingroup classes + Like wxLongStringProperty, but the button triggers file selector instead. + + <b>Supported special attributes:</b> + - "Wildcard": Sets wildcard (see wxFileDialog for format details), "All + files..." is default. + - "ShowFullPath": Default 1. When 0, only the file name is shown (i.e. drive + and directory are hidden). + - "ShowRelativePath": If set, then the filename is shown relative to the + given path string. + - "InitialPath": Sets the initial path of where to look for files. + - "DialogTitle": Sets a specific title for the dir dialog. +*/ +class WXDLLIMPEXP_PROPGRID wxFileProperty : public wxPGProperty +{ + friend class wxPGFileDialogAdapter; + WX_PG_DECLARE_PROPERTY_CLASS(wxFileProperty) +public: + + wxFileProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + const wxString& value = wxEmptyString ); + virtual ~wxFileProperty (); + + virtual void OnSetValue(); + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + virtual bool StringToValue( wxVariant& variant, + const wxString& text, + int argFlags = 0 ) const; + virtual wxPGEditorDialogAdapter* GetEditorDialog() const; + virtual bool DoSetAttribute( const wxString& name, wxVariant& value ); + + static wxValidator* GetClassValidator(); + virtual wxValidator* DoGetValidator() const; + + /** + Returns filename to file represented by current value. + */ + wxFileName GetFileName() const; + +protected: + wxString m_wildcard; + wxString m_basePath; // If set, then show path relative to it + wxString m_initialPath; // If set, start the file dialog here + wxString m_dlgTitle; // If set, used as title for file dialog + int m_indFilter; // index to the selected filter +}; + +// ----------------------------------------------------------------------- + +#define wxPG_PROP_NO_ESCAPE wxPG_PROP_CLASS_SPECIFIC_1 + + +/** @class wxPGLongStringDialogAdapter + @ingroup classes +*/ +class WXDLLIMPEXP_PROPGRID + wxPGLongStringDialogAdapter : public wxPGEditorDialogAdapter +{ +public: + virtual bool DoShowDialog( wxPropertyGrid* propGrid, + wxPGProperty* property ); +}; + + +/** @class wxLongStringProperty + @ingroup classes + Like wxStringProperty, but has a button that triggers a small text + editor dialog. +*/ +class WXDLLIMPEXP_PROPGRID wxLongStringProperty : public wxPGProperty +{ + WX_PG_DECLARE_PROPERTY_CLASS(wxLongStringProperty) +public: + + wxLongStringProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + const wxString& value = wxEmptyString ); + virtual ~wxLongStringProperty(); + + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + virtual bool StringToValue( wxVariant& variant, + const wxString& text, + int argFlags = 0 ) const; + virtual bool OnEvent( wxPropertyGrid* propgrid, + wxWindow* primary, wxEvent& event ); + + // Shows string editor dialog. Value to be edited should be read from + // value, and if dialog is not cancelled, it should be stored back and true + // should be returned if that was the case. + virtual bool OnButtonClick( wxPropertyGrid* propgrid, wxString& value ); + + static bool DisplayEditorDialog( wxPGProperty* prop, + wxPropertyGrid* propGrid, + wxString& value ); + +protected: +}; + +// ----------------------------------------------------------------------- + + +/** @class wxDirProperty + @ingroup classes + Like wxLongStringProperty, but the button triggers dir selector instead. + + <b>Supported special attributes:</b> + - "DialogMessage": Sets specific message in the dir selector. +*/ +class WXDLLIMPEXP_PROPGRID wxDirProperty : public wxLongStringProperty +{ + DECLARE_DYNAMIC_CLASS(wxDirProperty) +public: + wxDirProperty( const wxString& name = wxPG_LABEL, + const wxString& label = wxPG_LABEL, + const wxString& value = wxEmptyString ); + virtual ~wxDirProperty(); + + virtual bool DoSetAttribute( const wxString& name, wxVariant& value ); + virtual wxValidator* DoGetValidator() const; + + virtual bool OnButtonClick ( wxPropertyGrid* propGrid, wxString& value ); + +protected: + wxString m_dlgMessage; +}; + +// ----------------------------------------------------------------------- + +// wxBoolProperty specific flags +#define wxPG_PROP_USE_CHECKBOX wxPG_PROP_CLASS_SPECIFIC_1 +// DCC = Double Click Cycles +#define wxPG_PROP_USE_DCC wxPG_PROP_CLASS_SPECIFIC_2 + + +// ----------------------------------------------------------------------- + +/** @class wxArrayStringProperty + @ingroup classes + Property that manages a list of strings. +*/ +class WXDLLIMPEXP_PROPGRID wxArrayStringProperty : public wxPGProperty +{ + WX_PG_DECLARE_PROPERTY_CLASS(wxArrayStringProperty) +public: + wxArrayStringProperty( const wxString& label = wxPG_LABEL, + const wxString& name = wxPG_LABEL, + const wxArrayString& value = wxArrayString() ); + virtual ~wxArrayStringProperty(); + + virtual void OnSetValue(); + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; + virtual bool StringToValue( wxVariant& variant, + const wxString& text, + int argFlags = 0 ) const; + virtual bool OnEvent( wxPropertyGrid* propgrid, + wxWindow* primary, wxEvent& event ); + virtual bool DoSetAttribute( const wxString& name, wxVariant& value ); + + // Implement in derived class for custom array-to-string conversion. + virtual void ConvertArrayToString(const wxArrayString& arr, + wxString* pString, + const wxUniChar& delimiter) const; + + // Shows string editor dialog. Value to be edited should be read from + // value, and if dialog is not cancelled, it should be stored back and true + // should be returned if that was the case. + virtual bool OnCustomStringEdit( wxWindow* parent, wxString& value ); + + // Helper. + virtual bool OnButtonClick( wxPropertyGrid* propgrid, + wxWindow* primary, + const wxChar* cbt ); + + // Creates wxPGArrayEditorDialog for string editing. Called in OnButtonClick. + virtual wxPGArrayEditorDialog* CreateEditorDialog(); + + enum ConversionFlags + { + Escape = 0x01, + QuoteStrings = 0x02 + }; + + /** + Generates contents for string dst based on the contents of + wxArrayString src. + */ + static void ArrayStringToString( wxString& dst, const wxArrayString& src, + wxUniChar delimiter, int flags ); + +protected: + // Previously this was to be implemented in derived class for array-to- + // string conversion. Now you should implement ConvertValueToString() + // instead. + virtual void GenerateValueAsString(); + + wxString m_display; // Cache for displayed text. + wxUniChar m_delimiter; +}; + +// ----------------------------------------------------------------------- + +#define WX_PG_DECLARE_ARRAYSTRING_PROPERTY_WITH_VALIDATOR_WITH_DECL(PROPNAME, \ + DECL) \ +DECL PROPNAME : public wxArrayStringProperty \ +{ \ + WX_PG_DECLARE_PROPERTY_CLASS(PROPNAME) \ +public: \ + PROPNAME( const wxString& label = wxPG_LABEL, \ + const wxString& name = wxPG_LABEL, \ + const wxArrayString& value = wxArrayString() ); \ + ~PROPNAME(); \ + virtual bool OnEvent( wxPropertyGrid* propgrid, \ + wxWindow* primary, wxEvent& event ); \ + virtual bool OnCustomStringEdit( wxWindow* parent, wxString& value ); \ + virtual wxValidator* DoGetValidator() const; \ +}; + +#define WX_PG_DECLARE_ARRAYSTRING_PROPERTY_WITH_VALIDATOR(PROPNAM) \ +WX_PG_DECLARE_ARRAYSTRING_PROPERTY_WITH_VALIDATOR(PROPNAM, class) + +#define WX_PG_IMPLEMENT_ARRAYSTRING_PROPERTY_WITH_VALIDATOR(PROPNAME, \ + DELIMCHAR, \ + CUSTBUTTXT) \ +WX_PG_IMPLEMENT_PROPERTY_CLASS(PROPNAME, wxArrayStringProperty, \ + wxArrayString, const wxArrayString&, \ + TextCtrlAndButton) \ +PROPNAME::PROPNAME( const wxString& label, \ + const wxString& name, \ + const wxArrayString& value ) \ + : wxArrayStringProperty(label,name,value) \ +{ \ + PROPNAME::GenerateValueAsString(); \ + m_delimiter = DELIMCHAR; \ +} \ +PROPNAME::~PROPNAME() { } \ +bool PROPNAME::OnEvent( wxPropertyGrid* propgrid, \ + wxWindow* primary, wxEvent& event ) \ +{ \ + if ( event.GetEventType() == wxEVT_BUTTON ) \ + return OnButtonClick(propgrid,primary,(const wxChar*) CUSTBUTTXT); \ + return false; \ +} + +#define WX_PG_DECLARE_ARRAYSTRING_PROPERTY(PROPNAME) \ +WX_PG_DECLARE_ARRAYSTRING_PROPERTY_WITH_VALIDATOR(PROPNAME) + +#define WX_PG_DECLARE_ARRAYSTRING_PROPERTY_WITH_DECL(PROPNAME, DECL) \ +WX_PG_DECLARE_ARRAYSTRING_PROPERTY_WITH_VALIDATOR_WITH_DECL(PROPNAME, DECL) + +#define WX_PG_IMPLEMENT_ARRAYSTRING_PROPERTY(PROPNAME,DELIMCHAR,CUSTBUTTXT) \ +WX_PG_IMPLEMENT_ARRAYSTRING_PROPERTY_WITH_VALIDATOR(PROPNAME, \ + DELIMCHAR, \ + CUSTBUTTXT) \ +wxValidator* PROPNAME::DoGetValidator () const \ +{ return NULL; } + + +// ----------------------------------------------------------------------- +// wxPGArrayEditorDialog +// ----------------------------------------------------------------------- + +#if wxUSE_EDITABLELISTBOX + +class WXDLLIMPEXP_FWD_ADV wxEditableListBox; +class WXDLLIMPEXP_FWD_CORE wxListEvent; + +#define wxAEDIALOG_STYLE \ + (wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxOK | wxCANCEL | wxCENTRE) + +class WXDLLIMPEXP_PROPGRID wxPGArrayEditorDialog : public wxDialog +{ +public: + wxPGArrayEditorDialog(); + virtual ~wxPGArrayEditorDialog() { } + + void Init(); + + wxPGArrayEditorDialog( wxWindow *parent, + const wxString& message, + const wxString& caption, + long style = wxAEDIALOG_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize ); + + bool Create( wxWindow *parent, + const wxString& message, + const wxString& caption, + long style = wxAEDIALOG_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize ); + + void EnableCustomNewAction() + { + m_hasCustomNewAction = true; + } + + /** Set value modified by dialog. + */ + virtual void SetDialogValue( const wxVariant& WXUNUSED(value) ) + { + wxFAIL_MSG(wxT("re-implement this member function in derived class")); + } + + /** Return value modified by dialog. + */ + virtual wxVariant GetDialogValue() const + { + wxFAIL_MSG(wxT("re-implement this member function in derived class")); + return wxVariant(); + } + + /** Override to return wxValidator to be used with the wxTextCtrl + in dialog. Note that the validator is used in the standard + wx way, ie. it immediately prevents user from entering invalid + input. + + @remarks + Dialog frees the validator. + */ + virtual wxValidator* GetTextCtrlValidator() const + { + return NULL; + } + + // Returns true if array was actually modified + bool IsModified() const { return m_modified; } + + // wxEditableListBox utilities + int GetSelection() const; + + // implementation from now on + void OnAddClick(wxCommandEvent& event); + void OnDeleteClick(wxCommandEvent& event); + void OnUpClick(wxCommandEvent& event); + void OnDownClick(wxCommandEvent& event); + void OnEndLabelEdit(wxListEvent& event); + void OnIdle(wxIdleEvent& event); + +protected: + wxEditableListBox* m_elb; + + // These are used for focus repair + wxWindow* m_elbSubPanel; + wxWindow* m_lastFocused; + + // A new item, edited by user, is pending at this index. + // It will be committed once list ctrl item editing is done. + int m_itemPendingAtIndex; + + bool m_modified; + bool m_hasCustomNewAction; + + // These must be overridden - must return true on success. + virtual wxString ArrayGet( size_t index ) = 0; + virtual size_t ArrayGetCount() = 0; + virtual bool ArrayInsert( const wxString& str, int index ) = 0; + virtual bool ArraySet( size_t index, const wxString& str ) = 0; + virtual void ArrayRemoveAt( int index ) = 0; + virtual void ArraySwap( size_t first, size_t second ) = 0; + virtual bool OnCustomNewAction(wxString* WXUNUSED(resString)) + { + return false; + } + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxPGArrayEditorDialog) + DECLARE_EVENT_TABLE() +}; + +#endif // wxUSE_EDITABLELISTBOX + +// ----------------------------------------------------------------------- +// wxPGArrayStringEditorDialog +// ----------------------------------------------------------------------- + +class WXDLLIMPEXP_PROPGRID + wxPGArrayStringEditorDialog : public wxPGArrayEditorDialog +{ +public: + wxPGArrayStringEditorDialog(); + virtual ~wxPGArrayStringEditorDialog() { } + + void Init(); + + virtual void SetDialogValue( const wxVariant& value ) + { + m_array = value.GetArrayString(); + } + + virtual wxVariant GetDialogValue() const + { + return m_array; + } + + void SetCustomButton( const wxString& custBtText, + wxArrayStringProperty* pcc ) + { + if ( !custBtText.empty() ) + { + EnableCustomNewAction(); + m_pCallingClass = pcc; + } + } + + virtual bool OnCustomNewAction(wxString* resString); + +protected: + wxArrayString m_array; + + wxArrayStringProperty* m_pCallingClass; + + virtual wxString ArrayGet( size_t index ); + virtual size_t ArrayGetCount(); + virtual bool ArrayInsert( const wxString& str, int index ); + virtual bool ArraySet( size_t index, const wxString& str ); + virtual void ArrayRemoveAt( int index ); + virtual void ArraySwap( size_t first, size_t second ); + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxPGArrayStringEditorDialog) + DECLARE_EVENT_TABLE() +}; + +// ----------------------------------------------------------------------- + +#endif // wxUSE_PROPGRID + +#endif // _WX_PROPGRID_PROPS_H_ diff --git a/wxmsw/include/wx-3.0/wx/protocol/file.h b/wxmsw/include/wx-3.0/wx/protocol/file.h new file mode 100644 index 00000000..fd44ce59 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/protocol/file.h @@ -0,0 +1,38 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/protocol/file.h +// Purpose: File protocol +// Author: Guilhem Lavaux +// Modified by: +// Created: 1997 +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __WX_PROTO_FILE_H__ +#define __WX_PROTO_FILE_H__ + +#include "wx/defs.h" + +#if wxUSE_PROTOCOL_FILE + +#include "wx/protocol/protocol.h" + +class WXDLLIMPEXP_NET wxFileProto: public wxProtocol +{ +public: + wxFileProto(); + virtual ~wxFileProto(); + + bool Abort() { return true; } + wxString GetContentType() const { return wxEmptyString; } + + wxInputStream *GetInputStream(const wxString& path); + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxFileProto) + DECLARE_PROTOCOL(wxFileProto) +}; + +#endif // wxUSE_PROTOCOL_FILE + +#endif // __WX_PROTO_FILE_H__ diff --git a/wxmsw/include/wx-3.0/wx/protocol/ftp.h b/wxmsw/include/wx-3.0/wx/protocol/ftp.h new file mode 100644 index 00000000..a87a6380 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/protocol/ftp.h @@ -0,0 +1,176 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/protocol/ftp.h +// Purpose: FTP protocol +// Author: Vadim Zeitlin +// Modified by: Mark Johnson, wxWindows@mj10777.de +// 20000917 : RmDir, GetLastResult, GetList +// Created: 07/07/1997 +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __WX_FTP_H__ +#define __WX_FTP_H__ + +#include "wx/defs.h" + +#if wxUSE_PROTOCOL_FTP + +#include "wx/sckaddr.h" +#include "wx/protocol/protocol.h" +#include "wx/url.h" + +class WXDLLIMPEXP_NET wxFTP : public wxProtocol +{ +public: + enum TransferMode + { + NONE, // not set by user explicitly + ASCII, + BINARY + }; + + wxFTP(); + virtual ~wxFTP(); + + // Connecting and disconnecting + virtual bool Connect(const wxSockAddress& addr, bool wait = true); + virtual bool Connect(const wxString& host) { return Connect(host, 0); } + virtual bool Connect(const wxString& host, unsigned short port); + + // disconnect + virtual bool Close(); + + // Parameters set up + + // set transfer mode now + void SetPassive(bool pasv) { m_bPassive = pasv; } + bool SetBinary() { return SetTransferMode(BINARY); } + bool SetAscii() { return SetTransferMode(ASCII); } + bool SetTransferMode(TransferMode mode); + + // Generic FTP interface + + // FTP doesn't know the MIME type of the last downloaded/uploaded file + virtual wxString GetContentType() const { return wxEmptyString; } + + // the last FTP server reply + const wxString& GetLastResult() const { return m_lastResult; } + + // send any FTP command (should be full FTP command line but without + // trailing "\r\n") and return its return code + char SendCommand(const wxString& command); + + // check that the command returned the given code + bool CheckCommand(const wxString& command, char expectedReturn) + { + // SendCommand() does updates m_lastError + return SendCommand(command) == expectedReturn; + } + + // Filesystem commands + bool ChDir(const wxString& dir); + bool MkDir(const wxString& dir); + bool RmDir(const wxString& dir); + wxString Pwd(); + bool Rename(const wxString& src, const wxString& dst); + bool RmFile(const wxString& path); + + // Get the size of a file in the current dir. + // this function tries its best to deliver the size in bytes using BINARY + // (the SIZE command reports different sizes depending on whether + // type is set to ASCII or BINARY) + // returns -1 if file is non-existent or size could not be found + int GetFileSize(const wxString& fileName); + + // Check to see if a file exists in the current dir + bool FileExists(const wxString& fileName); + + // Download methods + bool Abort(); + + virtual wxInputStream *GetInputStream(const wxString& path); + virtual wxOutputStream *GetOutputStream(const wxString& path); + + // Directory listing + + // get the list of full filenames, the format is fixed: one file name per + // line + bool GetFilesList(wxArrayString& files, + const wxString& wildcard = wxEmptyString) + { + return GetList(files, wildcard, false); + } + + // get a directory list in server dependent format - this can be shown + // directly to the user + bool GetDirList(wxArrayString& files, + const wxString& wildcard = wxEmptyString) + { + return GetList(files, wildcard, true); + } + + // equivalent to either GetFilesList() (default) or GetDirList() + bool GetList(wxArrayString& files, + const wxString& wildcard = wxEmptyString, + bool details = false); + +protected: + // this executes a simple ftp command with the given argument and returns + // true if it its return code starts with '2' + bool DoSimpleCommand(const wxChar *command, + const wxString& arg = wxEmptyString); + + // get the server reply, return the first character of the reply code, + // '1'..'5' for normal FTP replies, 0 (*not* '0') if an error occurred + char GetResult(); + + // check that the result is equal to expected value + bool CheckResult(char ch) { return GetResult() == ch; } + + // return the socket to be used, Passive/Active versions are used only by + // GetPort() + wxSocketBase *GetPort(); + wxSocketBase *GetPassivePort(); + wxSocketBase *GetActivePort(); + + // helper for GetPort() + wxString GetPortCmdArgument(const wxIPV4address& Local, const wxIPV4address& New); + + // accept connection from server in active mode, returns the same socket as + // passed in passive mode + wxSocketBase *AcceptIfActive(wxSocketBase *sock); + + + // internal variables: + + wxString m_lastResult; + + // true if there is an FTP transfer going on + bool m_streaming; + + // although this should be set to ASCII by default according to STD9, + // we will use BINARY transfer mode by default for backwards compatibility + TransferMode m_currentTransfermode; + + bool m_bPassive; + + // following is true when a read or write times out, we then assume + // the connection is dead and abort. we avoid additional delays this way + bool m_bEncounteredError; + + + friend class wxInputFTPStream; + friend class wxOutputFTPStream; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxFTP) + DECLARE_PROTOCOL(wxFTP) +}; + +// the trace mask used by assorted wxLogTrace() in ftp code, do +// wxLog::AddTraceMask(FTP_TRACE_MASK) to see them in output +#define FTP_TRACE_MASK wxT("ftp") + +#endif // wxUSE_PROTOCOL_FTP + +#endif // __WX_FTP_H__ diff --git a/wxmsw/include/wx-3.0/wx/protocol/http.h b/wxmsw/include/wx-3.0/wx/protocol/http.h new file mode 100644 index 00000000..cfa2e6f9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/protocol/http.h @@ -0,0 +1,96 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/protocol/http.h +// Purpose: HTTP protocol +// Author: Guilhem Lavaux +// Modified by: Simo Virokannas (authentication, Dec 2005) +// Created: August 1997 +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// +#ifndef _WX_HTTP_H +#define _WX_HTTP_H + +#include "wx/defs.h" + +#if wxUSE_PROTOCOL_HTTP + +#include "wx/hashmap.h" +#include "wx/protocol/protocol.h" +#include "wx/buffer.h" + +class WXDLLIMPEXP_NET wxHTTP : public wxProtocol +{ +public: + wxHTTP(); + virtual ~wxHTTP(); + + virtual bool Connect(const wxString& host, unsigned short port); + virtual bool Connect(const wxString& host) { return Connect(host, 0); } + virtual bool Connect(const wxSockAddress& addr, bool wait); + bool Abort(); + + wxInputStream *GetInputStream(const wxString& path); + + wxString GetContentType() const; + wxString GetHeader(const wxString& header) const; + int GetResponse() const { return m_http_response; } + + void SetMethod(const wxString& method) { m_method = method; } + void SetHeader(const wxString& header, const wxString& h_data); + bool SetPostText(const wxString& contentType, + const wxString& data, + const wxMBConv& conv = wxConvUTF8); + bool SetPostBuffer(const wxString& contentType, const wxMemoryBuffer& data); + void SetProxyMode(bool on); + + /* Cookies */ + wxString GetCookie(const wxString& cookie) const; + bool HasCookies() const { return m_cookies.size() > 0; } + + // Use the other SetPostBuffer() overload or SetPostText() instead. + wxDEPRECATED(void SetPostBuffer(const wxString& post_buf)); + +protected: + typedef wxStringToStringHashMap::iterator wxHeaderIterator; + typedef wxStringToStringHashMap::const_iterator wxHeaderConstIterator; + typedef wxStringToStringHashMap::iterator wxCookieIterator; + typedef wxStringToStringHashMap::const_iterator wxCookieConstIterator; + + bool BuildRequest(const wxString& path, const wxString& method); + void SendHeaders(); + bool ParseHeaders(); + + wxString GenerateAuthString(const wxString& user, const wxString& pass) const; + + // find the header in m_headers + wxHeaderIterator FindHeader(const wxString& header); + wxHeaderConstIterator FindHeader(const wxString& header) const; + wxCookieIterator FindCookie(const wxString& cookie); + wxCookieConstIterator FindCookie(const wxString& cookie) const; + + // deletes the header value strings + void ClearHeaders(); + void ClearCookies(); + + // internal variables: + + wxString m_method; + wxStringToStringHashMap m_cookies; + + wxStringToStringHashMap m_headers; + bool m_read, + m_proxy_mode; + wxSockAddress *m_addr; + wxMemoryBuffer m_postBuffer; + wxString m_contentType; + int m_http_response; + + DECLARE_DYNAMIC_CLASS(wxHTTP) + DECLARE_PROTOCOL(wxHTTP) + wxDECLARE_NO_COPY_CLASS(wxHTTP); +}; + +#endif // wxUSE_PROTOCOL_HTTP + +#endif // _WX_HTTP_H + diff --git a/wxmsw/include/wx-3.0/wx/protocol/log.h b/wxmsw/include/wx-3.0/wx/protocol/log.h new file mode 100644 index 00000000..df373b92 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/protocol/log.h @@ -0,0 +1,54 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/protocol/log.h +// Purpose: wxProtocolLog class for logging network exchanges +// Author: Troelsk, Vadim Zeitlin +// Created: 2009-03-06 +// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROTOCOL_LOG_H_ +#define _WX_PROTOCOL_LOG_H_ + +#include "wx/string.h" + +// ---------------------------------------------------------------------------- +// wxProtocolLog: simple class for logging network requests and responses +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_NET wxProtocolLog +{ +public: + // Create object doing the logging using wxLogTrace() with the specified + // trace mask. + wxProtocolLog(const wxString& traceMask) + : m_traceMask(traceMask) + { + } + + // Virtual dtor for the base class + virtual ~wxProtocolLog() { } + + // Called by wxProtocol-derived classes to actually log something + virtual void LogRequest(const wxString& str) + { + DoLogString("==> " + str); + } + + virtual void LogResponse(const wxString& str) + { + DoLogString("<== " + str); + } + +protected: + // Can be overridden by the derived classes. + virtual void DoLogString(const wxString& str); + +private: + const wxString m_traceMask; + + wxDECLARE_NO_COPY_CLASS(wxProtocolLog); +}; + +#endif // _WX_PROTOCOL_LOG_H_ + diff --git a/wxmsw/include/wx-3.0/wx/protocol/protocol.h b/wxmsw/include/wx-3.0/wx/protocol/protocol.h new file mode 100644 index 00000000..e6a32ef5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/protocol/protocol.h @@ -0,0 +1,177 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/protocol/protocol.h +// Purpose: Protocol base class +// Author: Guilhem Lavaux +// Modified by: +// Created: 10/07/1997 +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROTOCOL_PROTOCOL_H +#define _WX_PROTOCOL_PROTOCOL_H + +#include "wx/defs.h" + +#if wxUSE_PROTOCOL + +#include "wx/object.h" +#include "wx/string.h" +#include "wx/stream.h" + +#if wxUSE_SOCKETS + #include "wx/socket.h" +#endif + +class WXDLLIMPEXP_FWD_NET wxProtocolLog; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +typedef enum +{ + wxPROTO_NOERR = 0, + wxPROTO_NETERR, + wxPROTO_PROTERR, + wxPROTO_CONNERR, + wxPROTO_INVVAL, + wxPROTO_NOHNDLR, + wxPROTO_NOFILE, + wxPROTO_ABRT, + wxPROTO_RCNCT, + wxPROTO_STREAMING +} wxProtocolError; + +// ---------------------------------------------------------------------------- +// wxProtocol: abstract base class for all protocols +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_NET wxProtocol +#if wxUSE_SOCKETS + : public wxSocketClient +#else + : public wxObject +#endif +{ +public: + wxProtocol(); + virtual ~wxProtocol(); + +#if wxUSE_SOCKETS + bool Reconnect(); + virtual bool Connect( const wxString& WXUNUSED(host) ) { return false; } + virtual bool Connect( const wxSockAddress& addr, bool WXUNUSED(wait) = true) + { return wxSocketClient::Connect(addr); } + + // read a '\r\n' terminated line from the given socket and put it in + // result (without the terminators) + static wxProtocolError ReadLine(wxSocketBase *socket, wxString& result); + + // read a line from this socket - this one can be overridden in the + // derived classes if different line termination convention is to be used + virtual wxProtocolError ReadLine(wxString& result); +#endif // wxUSE_SOCKETS + + virtual bool Abort() = 0; + virtual wxInputStream *GetInputStream(const wxString& path) = 0; + virtual wxString GetContentType() const = 0; + + // the error code + virtual wxProtocolError GetError() const { return m_lastError; } + + void SetUser(const wxString& user) { m_username = user; } + void SetPassword(const wxString& passwd) { m_password = passwd; } + + virtual void SetDefaultTimeout(wxUint32 Value); + + // override wxSocketBase::SetTimeout function to avoid that the internal + // m_uiDefaultTimeout goes out-of-sync: + virtual void SetTimeout(long seconds) + { SetDefaultTimeout(seconds); } + + + // logging support: each wxProtocol object may have the associated logger + // (by default there is none) which is used to log network requests and + // responses + + // set the logger, deleting the old one and taking ownership of this one + void SetLog(wxProtocolLog *log); + + // return the current logger, may be NULL + wxProtocolLog *GetLog() const { return m_log; } + + // detach the existing logger without deleting it, the caller is + // responsible for deleting the returned pointer if it's non-NULL + wxProtocolLog *DetachLog() + { + wxProtocolLog * const log = m_log; + m_log = NULL; + return log; + } + + // these functions forward to the same functions with the same names in + // wxProtocolLog if we have a valid logger and do nothing otherwise + void LogRequest(const wxString& str); + void LogResponse(const wxString& str); + +protected: + // the timeout associated with the protocol: + wxUint32 m_uiDefaultTimeout; + + wxString m_username; + wxString m_password; + + // this must be always updated by the derived classes! + wxProtocolError m_lastError; + +private: + wxProtocolLog *m_log; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxProtocol) +}; + +// ---------------------------------------------------------------------------- +// macros for protocol classes +// ---------------------------------------------------------------------------- + +#define DECLARE_PROTOCOL(class) \ +public: \ + static wxProtoInfo g_proto_##class; + +#define IMPLEMENT_PROTOCOL(class, name, serv, host) \ +wxProtoInfo class::g_proto_##class(name, serv, host, wxCLASSINFO(class)); \ +bool wxProtocolUse##class = true; + +#define USE_PROTOCOL(class) \ + extern bool wxProtocolUse##class ; \ + static struct wxProtocolUserFor##class \ + { \ + wxProtocolUserFor##class() { wxProtocolUse##class = true; } \ + } wxProtocolDoUse##class; + +class WXDLLIMPEXP_NET wxProtoInfo : public wxObject +{ +public: + wxProtoInfo(const wxChar *name, + const wxChar *serv_name, + const bool need_host1, + wxClassInfo *info); + +protected: + wxProtoInfo *next; + wxString m_protoname; + wxString prefix; + wxString m_servname; + wxClassInfo *m_cinfo; + bool m_needhost; + + friend class wxURL; + + DECLARE_DYNAMIC_CLASS(wxProtoInfo) + wxDECLARE_NO_COPY_CLASS(wxProtoInfo); +}; + +#endif // wxUSE_PROTOCOL + +#endif // _WX_PROTOCOL_PROTOCOL_H diff --git a/wxmsw/include/wx-3.0/wx/ptr_scpd.h b/wxmsw/include/wx-3.0/wx/ptr_scpd.h new file mode 100644 index 00000000..76d8e421 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ptr_scpd.h @@ -0,0 +1,13 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ptr_scpd.h +// Purpose: compatibility wrapper for wxScoped{Ptr,Array} +// Author: Vadim Zeitlin +// Created: 2009-02-03 +// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// do not include this file in any new code, include either wx/scopedptr.h or +// wx/scopedarray.h (or both) instead +#include "wx/scopedarray.h" +#include "wx/scopedptr.h" diff --git a/wxmsw/include/wx-3.0/wx/ptr_shrd.h b/wxmsw/include/wx-3.0/wx/ptr_shrd.h new file mode 100644 index 00000000..635cfe36 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ptr_shrd.h @@ -0,0 +1,11 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ptr_shrd.h +// Purpose: compatibility wrapper for wx/sharedptr.h +// Author: Vadim Zeitlin +// Created: 2009-02-03 +// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// do not include this file in any new code, include wx/sharedptr.h instead +#include "wx/sharedptr.h" diff --git a/wxmsw/include/wx-3.0/wx/quantize.h b/wxmsw/include/wx-3.0/wx/quantize.h new file mode 100644 index 00000000..d323a350 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/quantize.h @@ -0,0 +1,75 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/quantize.h +// Purpose: wxQuantizer class +// Author: Julian Smart +// Modified by: +// Created: 22/6/2000 +// Copyright: (c) Julian Smart +// Licence: +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_QUANTIZE_H_ +#define _WX_QUANTIZE_H_ + +#include "wx/object.h" + +/* + * From jquant2.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + */ + +class WXDLLIMPEXP_FWD_CORE wxImage; +class WXDLLIMPEXP_FWD_CORE wxPalette; + +/* + * wxQuantize + * Based on the JPEG quantization code. Reduces the number of colours in a wxImage. + */ + +#define wxQUANTIZE_INCLUDE_WINDOWS_COLOURS 0x01 +#define wxQUANTIZE_RETURN_8BIT_DATA 0x02 +#define wxQUANTIZE_FILL_DESTINATION_IMAGE 0x04 + +class WXDLLIMPEXP_CORE wxQuantize: public wxObject +{ +public: +DECLARE_DYNAMIC_CLASS(wxQuantize) + +//// Constructor + + wxQuantize() {} + virtual ~wxQuantize() {} + +//// Operations + + // Reduce the colours in the source image and put the result into the + // destination image. Both images may be the same, to overwrite the source image. + // Specify an optional palette pointer to receive the resulting palette. + // This palette may be passed to ConvertImageToBitmap, for example. + // If you pass a palette pointer, you must free the palette yourself. + + static bool Quantize(const wxImage& src, wxImage& dest, wxPalette** pPalette, int desiredNoColours = 236, + unsigned char** eightBitData = 0, int flags = wxQUANTIZE_INCLUDE_WINDOWS_COLOURS|wxQUANTIZE_FILL_DESTINATION_IMAGE|wxQUANTIZE_RETURN_8BIT_DATA); + + // This version sets a palette in the destination image so you don't + // have to manage it yourself. + + static bool Quantize(const wxImage& src, wxImage& dest, int desiredNoColours = 236, + unsigned char** eightBitData = 0, int flags = wxQUANTIZE_INCLUDE_WINDOWS_COLOURS|wxQUANTIZE_FILL_DESTINATION_IMAGE|wxQUANTIZE_RETURN_8BIT_DATA); + +//// Helpers + + // Converts input bitmap(s) into 8bit representation with custom palette + + // in_rows and out_rows are arrays [0..h-1] of pointer to rows + // (in_rows contains w * 3 bytes per row, out_rows w bytes per row) + // fills out_rows with indexes into palette (which is also stored into palette variable) + static void DoQuantize(unsigned w, unsigned h, unsigned char **in_rows, unsigned char **out_rows, unsigned char *palette, int desiredNoColours); + +}; + +#endif + // _WX_QUANTIZE_H_ diff --git a/wxmsw/include/wx-3.0/wx/radiobox.h b/wxmsw/include/wx-3.0/wx/radiobox.h new file mode 100644 index 00000000..acfa9e8f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/radiobox.h @@ -0,0 +1,174 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/radiobox.h +// Purpose: wxRadioBox declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 10.09.00 +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RADIOBOX_H_BASE_ +#define _WX_RADIOBOX_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_RADIOBOX + +#include "wx/ctrlsub.h" + +#if wxUSE_TOOLTIPS + +#include "wx/dynarray.h" + +class WXDLLIMPEXP_FWD_CORE wxToolTip; + +WX_DEFINE_EXPORTED_ARRAY_PTR(wxToolTip *, wxToolTipArray); + +#endif // wxUSE_TOOLTIPS + +extern WXDLLIMPEXP_DATA_CORE(const char) wxRadioBoxNameStr[]; + +// ---------------------------------------------------------------------------- +// wxRadioBoxBase is not a normal base class, but rather a mix-in because the +// real wxRadioBox derives from different classes on different platforms: for +// example, it is a wxStaticBox in wxUniv and wxMSW but not in other ports +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxRadioBoxBase : public wxItemContainerImmutable +{ +public: + virtual ~wxRadioBoxBase(); + + // change/query the individual radio button state + virtual bool Enable(unsigned int n, bool enable = true) = 0; + virtual bool Show(unsigned int n, bool show = true) = 0; + virtual bool IsItemEnabled(unsigned int n) const = 0; + virtual bool IsItemShown(unsigned int n) const = 0; + + // return number of columns/rows in this radiobox + unsigned int GetColumnCount() const { return m_numCols; } + unsigned int GetRowCount() const { return m_numRows; } + + // return the next active (i.e. shown and not disabled) item above/below/to + // the left/right of the given one + int GetNextItem(int item, wxDirection dir, long style) const; + +#if wxUSE_TOOLTIPS + // set the tooltip text for a radio item, empty string unsets any tooltip + void SetItemToolTip(unsigned int item, const wxString& text); + + // get the individual items tooltip; returns NULL if none + wxToolTip *GetItemToolTip(unsigned int item) const + { return m_itemsTooltips ? (*m_itemsTooltips)[item] : NULL; } +#endif // wxUSE_TOOLTIPS + +#if wxUSE_HELP + // set helptext for a particular item, pass an empty string to erase it + void SetItemHelpText(unsigned int n, const wxString& helpText); + + // retrieve helptext for a particular item, empty string means no help text + wxString GetItemHelpText(unsigned int n) const; +#else // wxUSE_HELP + // just silently ignore the help text, it's better than requiring using + // conditional compilation in all code using this function + void SetItemHelpText(unsigned int WXUNUSED(n), + const wxString& WXUNUSED(helpText)) + { + } +#endif // wxUSE_HELP + + // returns the radio item at the given position or wxNOT_FOUND if none + // (currently implemented only under MSW and GTK) + virtual int GetItemFromPoint(const wxPoint& WXUNUSED(pt)) const + { + return wxNOT_FOUND; + } + + +protected: + wxRadioBoxBase() + { + m_numCols = + m_numRows = + m_majorDim = 0; + +#if wxUSE_TOOLTIPS + m_itemsTooltips = NULL; +#endif // wxUSE_TOOLTIPS + } + + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + // return the number of items in major direction (which depends on whether + // we have wxRA_SPECIFY_COLS or wxRA_SPECIFY_ROWS style) + unsigned int GetMajorDim() const { return m_majorDim; } + + // sets m_majorDim and also updates m_numCols/Rows + // + // the style parameter should be the style of the radiobox itself + void SetMajorDim(unsigned int majorDim, long style); + +#if wxUSE_TOOLTIPS + // called from SetItemToolTip() to really set the tooltip for the specified + // item in the box (or, if tooltip is NULL, to remove any existing one). + // + // NB: this function should really be pure virtual but to avoid breaking + // the build of the ports for which it's not implemented yet we provide + // an empty stub in the base class for now + virtual void DoSetItemToolTip(unsigned int item, wxToolTip *tooltip); + + // returns true if we have any item tooltips + bool HasItemToolTips() const { return m_itemsTooltips != NULL; } +#endif // wxUSE_TOOLTIPS + +#if wxUSE_HELP + // Retrieve help text for an item: this is a helper for the implementation + // of wxWindow::GetHelpTextAtPoint() in the real radiobox class + wxString DoGetHelpTextAtPoint(const wxWindow *derived, + const wxPoint& pt, + wxHelpEvent::Origin origin) const; +#endif // wxUSE_HELP + +private: + // the number of elements in major dimension (i.e. number of columns if + // wxRA_SPECIFY_COLS or the number of rows if wxRA_SPECIFY_ROWS) and also + // the number of rows/columns calculated from it + unsigned int m_majorDim, + m_numCols, + m_numRows; + +#if wxUSE_TOOLTIPS + // array of tooltips for the individual items + // + // this array is initially NULL and initialized on first use + wxToolTipArray *m_itemsTooltips; +#endif + +#if wxUSE_HELP + // help text associated with a particular item or empty string if none + wxArrayString m_itemsHelpTexts; +#endif // wxUSE_HELP +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/radiobox.h" +#elif defined(__WXMSW__) + #include "wx/msw/radiobox.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/radiobox.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/radiobox.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/radiobox.h" +#elif defined(__WXMAC__) + #include "wx/osx/radiobox.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/radiobox.h" +#elif defined(__WXPM__) + #include "wx/os2/radiobox.h" +#endif + +#endif // wxUSE_RADIOBOX + +#endif // _WX_RADIOBOX_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/radiobut.h b/wxmsw/include/wx-3.0/wx/radiobut.h new file mode 100644 index 00000000..42778734 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/radiobut.h @@ -0,0 +1,58 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/radiobut.h +// Purpose: wxRadioButton declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 07.09.00 +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RADIOBUT_H_BASE_ +#define _WX_RADIOBUT_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_RADIOBTN + +/* + There is no wxRadioButtonBase class as wxRadioButton interface is the same + as wxCheckBox(Base), but under some platforms wxRadioButton really + derives from wxCheckBox and on the others it doesn't. + + The pseudo-declaration of wxRadioButtonBase would look like this: + + class wxRadioButtonBase : public ... + { + public: + virtual void SetValue(bool value); + virtual bool GetValue() const; + }; + */ + +#include "wx/control.h" + +extern WXDLLIMPEXP_DATA_CORE(const char) wxRadioButtonNameStr[]; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/radiobut.h" +#elif defined(__WXMSW__) + #include "wx/msw/radiobut.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/radiobut.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/radiobut.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/radiobut.h" +#elif defined(__WXMAC__) + #include "wx/osx/radiobut.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/radiobut.h" +#elif defined(__WXPM__) + #include "wx/os2/radiobut.h" +#endif + +#endif // wxUSE_RADIOBTN + +#endif + // _WX_RADIOBUT_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/range.h b/wxmsw/include/wx-3.0/wx/range.h new file mode 100644 index 00000000..d59646e1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/range.h @@ -0,0 +1,28 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/range.h +// Purpose: Range Value Class +// Author: Stefan Csomor +// Modified by: +// Created: 2011-01-07 +// Copyright: (c) 2011 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RANGE_H_ +#define _WX_RANGE_H_ + +#include "wx/defs.h" + +class wxRange +{ +public : + wxRange(): m_minVal(0), m_maxVal(0) {} + wxRange( int minVal, int maxVal) : m_minVal(minVal), m_maxVal(maxVal) {} + int GetMin() const { return m_minVal; } + int GetMax() const { return m_maxVal; } +private : + int m_minVal; + int m_maxVal; +}; + +#endif // _WX_RANGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/rawbmp.h b/wxmsw/include/wx-3.0/wx/rawbmp.h new file mode 100644 index 00000000..adcf81f3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/rawbmp.h @@ -0,0 +1,758 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/rawbmp.h +// Purpose: macros for fast, raw bitmap data access +// Author: Eric Kidd, Vadim Zeitlin +// Modified by: +// Created: 10.03.03 +// Copyright: (c) 2002 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RAWBMP_H_ +#define _WX_RAWBMP_H_ + +#include "wx/defs.h" + +#ifdef wxHAS_RAW_BITMAP + +#include "wx/image.h" +#include "wx/bitmap.h" + +// ---------------------------------------------------------------------------- +// Abstract Pixel API +// +// We need to access our raw bitmap data (1) portably and (2) efficiently. +// We do this using a two-dimensional "iteration" interface. Performance +// is extremely important here: these functions will be called hundreds +// of thousands of times in a row, and even small inefficiencies will +// make applications seem slow. +// +// We can't always rely on inline functions, because not all compilers actually +// bother to inline them unless we crank the optimization levels way up. +// Therefore, we also provide macros to wring maximum speed out of compiler +// unconditionally (e.g. even in debug builds). Of course, if the performance +// isn't absolutely crucial for you you shouldn't be using them but the inline +// functions instead. +// ---------------------------------------------------------------------------- + +/* + Usage example: + + typedef wxPixelData<wxBitmap, wxNativePixelFormat> PixelData; + + wxBitmap bmp; + PixelData data(bmp); + if ( !data ) + { + ... raw access to bitmap data unavailable, do something else ... + return; + } + + if ( data.GetWidth() < 20 || data.GetHeight() < 20 ) + { + ... complain: the bitmap it too small ... + return; + } + + PixelData::Iterator p(data); + + // we draw a (10, 10)-(20, 20) rect manually using the given r, g, b + p.Offset(data, 10, 10); + + for ( int y = 0; y < 10; ++y ) + { + PixelData::Iterator rowStart = p; + + for ( int x = 0; x < 10; ++x, ++p ) + { + p.Red() = r; + p.Green() = g; + p.Blue() = b; + } + + p = rowStart; + p.OffsetY(data, 1); + } + */ + +/* + Note: we do not use WXDLLIMPEXP_CORE with classes in this file because VC++ has + problems with exporting inner class defined inside a specialization of a + template class from a DLL. Besides, as all the methods are inline it's not + really necessary to put them in DLL at all. + */ + +// ---------------------------------------------------------------------------- +// wxPixelFormat +// ---------------------------------------------------------------------------- + +/* + wxPixelFormat is a template class describing the bitmap data format. It + contains the constants describing the format of pixel data, but does not + describe how the entire bitmap is stored (i.e. top-to-bottom, + bottom-to-top, ...). It is also a "traits"-like class, i.e. it only + contains some constants and maybe static methods but nothing more, so it + can be safely used without incurring any overhead as all accesses to it are + done at compile-time. + + Current limitations: we don't support RAGABA and ARAGAB formats supported + by Mac OS X. If there is sufficient interest, these classes could be + extended to deal with them. Neither do we support alpha channel having + different representation from the RGB ones (happens under QNX/Photon I + think), but again this could be achieved with some small extra effort. + + Template parameters are: + - type of a single pixel component + - size of the single pixel in bits + - indices of red, green and blue pixel components inside the pixel + - index of the alpha component or -1 if none + - type which can contain the full pixel value (all channels) + */ + +template <class Channel, + size_t Bpp, int R, int G, int B, int A = -1, + class Pixel = wxUint32> + +struct wxPixelFormat +{ + // iterator over pixels is usually of type "ChannelType *" + typedef Channel ChannelType; + + // the type which may hold the entire pixel value + typedef Pixel PixelType; + + // NB: using static ints initialized inside the class declaration is not + // portable as it doesn't work with VC++ 6, so we must use enums + + // size of one pixel in bits + enum { BitsPerPixel = Bpp }; + + // size of one pixel in ChannelType units (usually bytes) + enum { SizePixel = Bpp / (8 * sizeof(Channel)) }; + + // the channels indices inside the pixel + enum + { + RED = R, + GREEN = G, + BLUE = B, + ALPHA = A + }; + + // true if we have an alpha channel (together with the other channels, this + // doesn't cover the case of wxImage which stores alpha separately) + enum { HasAlpha = A != -1 }; +}; + +// some "predefined" pixel formats +// ------------------------------- + +// wxImage format is common to all platforms +typedef wxPixelFormat<unsigned char, 24, 0, 1, 2> wxImagePixelFormat; + +// the (most common) native bitmap format without alpha support +#if defined(__WXMSW__) + // under MSW the RGB components are reversed, they're in BGR order + typedef wxPixelFormat<unsigned char, 24, 2, 1, 0> wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 3 +#elif defined(__WXMAC__) + // under Mac, first component is unused but still present, hence we use + // 32bpp, not 24 + typedef wxPixelFormat<unsigned char, 32, 1, 2, 3> wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 0 +#elif defined(__WXCOCOA__) + // Cocoa is standard RGB or RGBA (normally it is RGBA) + typedef wxPixelFormat<unsigned char, 24, 0, 1, 2> wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 3 +#elif defined(__WXGTK__) + // Under GTK+ 2.X we use GdkPixbuf, which is standard RGB or RGBA + typedef wxPixelFormat<unsigned char, 24, 0, 1, 2> wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 3 +#elif defined(__WXPM__) + // Under PM, we can use standard RGB or RGBA + typedef wxPixelFormat<unsigned char, 24, 0, 1, 2> wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 3 +#elif defined(__WXDFB__) + // Under DirectFB, RGB components are reversed, they're in BGR order + typedef wxPixelFormat<unsigned char, 24, 2, 1, 0> wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 3 +#endif + +// the (most common) native format for bitmaps with alpha channel +#ifdef wxPIXEL_FORMAT_ALPHA + typedef wxPixelFormat<unsigned char, 32, + wxNativePixelFormat::RED, + wxNativePixelFormat::GREEN, + wxNativePixelFormat::BLUE, + wxPIXEL_FORMAT_ALPHA> wxAlphaPixelFormat; +#endif // wxPIXEL_FORMAT_ALPHA + +// we also define the (default/best) pixel format for the given class: this is +// used as default value for the pixel format in wxPixelIterator template +template <class T> struct wxPixelFormatFor; + +#if wxUSE_IMAGE +// wxPixelFormatFor is only defined for wxImage, attempt to use it with other +// classes (wxBitmap...) will result in compile errors which is exactly what we +// want +template <> +struct wxPixelFormatFor<wxImage> +{ + typedef wxImagePixelFormat Format; +}; +#endif //wxUSE_IMAGE + +// ---------------------------------------------------------------------------- +// wxPixelData +// ---------------------------------------------------------------------------- + +/* + wxPixelDataBase is just a helper for wxPixelData: it contains things common + to both wxImage and wxBitmap specializations. + */ +class wxPixelDataBase +{ +public: + // origin of the rectangular region we represent + wxPoint GetOrigin() const { return m_ptOrigin; } + + // width and height of the region we represent + int GetWidth() const { return m_width; } + int GetHeight() const { return m_height; } + + wxSize GetSize() const { return wxSize(m_width, m_height); } + + // the distance between two rows + int GetRowStride() const { return m_stride; } + +// private: -- see comment in the beginning of the file + + // the origin of this image inside the bigger bitmap (usually (0, 0)) + wxPoint m_ptOrigin; + + // the size of the image we address, in pixels + int m_width, + m_height; + + // this parameter is the offset of the start of the (N+1)st row from the + // Nth one and can be different from m_bypp*width in some cases: + // a) the most usual one is to force 32/64 bit alignment of rows + // b) another one is for bottom-to-top images where it's negative + // c) finally, it could conceivably be 0 for the images with all + // lines being identical + int m_stride; + +protected: + // ctor is protected because this class is only meant to be used as the + // base class by wxPixelData + wxPixelDataBase() + { + m_width = + m_height = + m_stride = 0; + } +}; + +/* + wxPixelData represents the entire bitmap data, i.e. unlike + wxPixelFormat (which it uses) it also stores the global bitmap + characteristics such as its size, inter-row separation and so on. + + Because of this it can be used to move the pixel iterators (which don't + have enough information about the bitmap themselves). This may seem a bit + unnatural but must be done in this way to keep the iterator objects as + small as possible for maximum efficiency as otherwise they wouldn't be put + into the CPU registers by the compiler any more. + + Implementation note: we use the standard workaround for lack of partial + template specialization support in VC (both 6 and 7): instead of partly + specializing the class Foo<T, U> for some T we introduce FooOut<T> and + FooIn<U> nested in it, make Foo<T, U> equivalent to FooOut<T>::FooIn<U> and + fully specialize FooOut. + + Also note that this class doesn't have any default definition because we + can't really do anything without knowing the exact image class. We do + provide wxPixelDataBase to make it simpler to write new wxPixelData + specializations. + */ + +// we need to define this skeleton template to mollify VC++ +template <class Image> +struct wxPixelDataOut +{ + template <class PixelFormat> + class wxPixelDataIn + { + public: + class Iterator { }; + }; +}; + +#if wxUSE_IMAGE +// wxPixelData specialization for wxImage: this is the simplest case as we +// don't have to care about different pixel formats here +template <> +struct wxPixelDataOut<wxImage> +{ + // NB: this is a template class even though it doesn't use its template + // parameter because otherwise wxPixelData couldn't compile + template <class dummyPixelFormat> + class wxPixelDataIn : public wxPixelDataBase + { + public: + // the type of the class we're working with + typedef wxImage ImageType; + + // the iterator which should be used for working with data in this + // format + class Iterator + { + public: + // the pixel format we use + typedef wxImagePixelFormat PixelFormat; + + // the pixel data we're working with + typedef + wxPixelDataOut<wxImage>::wxPixelDataIn<PixelFormat> PixelData; + + // go back to (0, 0) + void Reset(const PixelData& data) + { + *this = data.GetPixels(); + } + + // creates the iterator pointing to the beginning of data + Iterator(PixelData& data) + { + Reset(data); + } + + // creates the iterator initially pointing to the image origin + Iterator(const wxImage& image) + { + m_pRGB = image.GetData(); + + if ( image.HasAlpha() ) + { + m_pAlpha = image.GetAlpha(); + } + else // alpha is not used at all + { + m_pAlpha = NULL; + } + } + + // true if the iterator is valid + bool IsOk() const { return m_pRGB != NULL; } + + + // navigation + // ---------- + + // advance the iterator to the next pixel, prefix version + Iterator& operator++() + { + m_pRGB += PixelFormat::SizePixel; + if ( m_pAlpha ) + ++m_pAlpha; + + return *this; + } + + // postfix (hence less efficient -- don't use it unless you + // absolutely must) version + Iterator operator++(int) + { + Iterator p(*this); + ++*this; + return p; + } + + // move x pixels to the right and y down + // + // note that the rows don't wrap! + void Offset(const PixelData& data, int x, int y) + { + m_pRGB += data.GetRowStride()*y + PixelFormat::SizePixel*x; + if ( m_pAlpha ) + m_pAlpha += data.GetWidth() + x; + } + + // move x pixels to the right (again, no row wrapping) + void OffsetX(const PixelData& WXUNUSED(data), int x) + { + m_pRGB += PixelFormat::SizePixel*x; + if ( m_pAlpha ) + m_pAlpha += x; + } + + // move y rows to the bottom + void OffsetY(const PixelData& data, int y) + { + m_pRGB += data.GetRowStride()*y; + if ( m_pAlpha ) + m_pAlpha += data.GetWidth(); + } + + // go to the given position + void MoveTo(const PixelData& data, int x, int y) + { + Reset(data); + Offset(data, x, y); + } + + + // data access + // ----------- + + // access to individual colour components + PixelFormat::ChannelType& Red() { return m_pRGB[PixelFormat::RED]; } + PixelFormat::ChannelType& Green() { return m_pRGB[PixelFormat::GREEN]; } + PixelFormat::ChannelType& Blue() { return m_pRGB[PixelFormat::BLUE]; } + PixelFormat::ChannelType& Alpha() { return *m_pAlpha; } + + // address the pixel contents directly (always RGB, without alpha) + // + // this can't be used to modify the image as assigning a 32bpp + // value to 24bpp pixel would overwrite an extra byte in the next + // pixel or beyond the end of image + const typename PixelFormat::PixelType& Data() + { return *(typename PixelFormat::PixelType *)m_pRGB; } + + // private: -- see comment in the beginning of the file + + // pointer into RGB buffer + unsigned char *m_pRGB; + + // pointer into alpha buffer or NULL if alpha isn't used + unsigned char *m_pAlpha; + }; + + // initializes us with the data of the given image + wxPixelDataIn(ImageType& image) : m_image(image), m_pixels(image) + { + m_width = image.GetWidth(); + m_height = image.GetHeight(); + m_stride = Iterator::PixelFormat::SizePixel * m_width; + } + + // initializes us with the given region of the specified image + wxPixelDataIn(ImageType& image, + const wxPoint& pt, + const wxSize& sz) : m_image(image), m_pixels(image) + { + m_stride = Iterator::PixelFormat::SizePixel * m_width; + + InitRect(pt, sz); + } + + // initializes us with the given region of the specified image + wxPixelDataIn(ImageType& image, + const wxRect& rect) : m_image(image), m_pixels(image) + { + m_stride = Iterator::PixelFormat::SizePixel * m_width; + + InitRect(rect.GetPosition(), rect.GetSize()); + } + + // we evaluate to true only if we could get access to bitmap data + // successfully + operator bool() const { return m_pixels.IsOk(); } + + // get the iterator pointing to the origin + Iterator GetPixels() const { return m_pixels; } + + private: + void InitRect(const wxPoint& pt, const wxSize& sz) + { + m_width = sz.x; + m_height = sz.y; + + m_ptOrigin = pt; + m_pixels.Offset(*this, pt.x, pt.y); + } + + // the image we're working with + ImageType& m_image; + + // the iterator pointing to the image origin + Iterator m_pixels; + }; +}; +#endif //wxUSE_IMAGE + +#if wxUSE_GUI +// wxPixelData specialization for wxBitmap: here things are more interesting as +// we also have to support different pixel formats +template <> +struct wxPixelDataOut<wxBitmap> +{ + template <class Format> + class wxPixelDataIn : public wxPixelDataBase + { + public: + // the type of the class we're working with + typedef wxBitmap ImageType; + + class Iterator + { + public: + // the pixel format we use + typedef Format PixelFormat; + + // the type of the pixel components + typedef typename PixelFormat::ChannelType ChannelType; + + // the pixel data we're working with + typedef wxPixelDataOut<wxBitmap>::wxPixelDataIn<Format> PixelData; + + + // go back to (0, 0) + void Reset(const PixelData& data) + { + *this = data.GetPixels(); + } + + // initializes the iterator to point to the origin of the given + // pixel data + Iterator(PixelData& data) + { + Reset(data); + } + + // initializes the iterator to point to the origin of the given + // bitmap + Iterator(wxBitmap& bmp, PixelData& data) + { + // using cast here is ugly but it should be safe as + // GetRawData() real return type should be consistent with + // BitsPerPixel (which is in turn defined by ChannelType) and + // this is the only thing we can do without making GetRawData() + // a template function which is undesirable + m_ptr = (ChannelType *) + bmp.GetRawData(data, PixelFormat::BitsPerPixel); + } + + // default constructor + Iterator() + { + m_ptr = NULL; + } + + // return true if this iterator is valid + bool IsOk() const { return m_ptr != NULL; } + + + // navigation + // ---------- + + // advance the iterator to the next pixel, prefix version + Iterator& operator++() + { + m_ptr += PixelFormat::SizePixel; + + return *this; + } + + // postfix (hence less efficient -- don't use it unless you + // absolutely must) version + Iterator operator++(int) + { + Iterator p(*this); + ++*this; + return p; + } + + // move x pixels to the right and y down + // + // note that the rows don't wrap! + void Offset(const PixelData& data, int x, int y) + { + m_ptr += data.GetRowStride()*y + PixelFormat::SizePixel*x; + } + + // move x pixels to the right (again, no row wrapping) + void OffsetX(const PixelData& WXUNUSED(data), int x) + { + m_ptr += PixelFormat::SizePixel*x; + } + + // move y rows to the bottom + void OffsetY(const PixelData& data, int y) + { + m_ptr += data.GetRowStride()*y; + } + + // go to the given position + void MoveTo(const PixelData& data, int x, int y) + { + Reset(data); + Offset(data, x, y); + } + + + // data access + // ----------- + + // access to individual colour components + ChannelType& Red() { return m_ptr[PixelFormat::RED]; } + ChannelType& Green() { return m_ptr[PixelFormat::GREEN]; } + ChannelType& Blue() { return m_ptr[PixelFormat::BLUE]; } + ChannelType& Alpha() { return m_ptr[PixelFormat::ALPHA]; } + + // address the pixel contents directly + // + // warning: the format is platform dependent + // + // warning 2: assigning to Data() only works correctly for 16bpp or + // 32bpp formats but using it for 24bpp ones overwrites + // one extra byte and so can't be done + typename PixelFormat::PixelType& Data() + { return *(typename PixelFormat::PixelType *)m_ptr; } + + // private: -- see comment in the beginning of the file + + // for efficiency reasons this class should not have any other + // fields, otherwise it won't be put into a CPU register (as it + // should inside the inner loops) by some compilers, notably gcc + ChannelType *m_ptr; + }; + + // ctor associates this pointer with a bitmap and locks the bitmap for + // raw access, it will be unlocked only by our dtor and so these + // objects should normally be only created on the stack, i.e. have + // limited life-time + wxPixelDataIn(wxBitmap& bmp) : m_bmp(bmp), m_pixels(bmp, *this) + { + } + + wxPixelDataIn(wxBitmap& bmp, const wxRect& rect) + : m_bmp(bmp), m_pixels(bmp, *this) + { + InitRect(rect.GetPosition(), rect.GetSize()); + } + + wxPixelDataIn(wxBitmap& bmp, const wxPoint& pt, const wxSize& sz) + : m_bmp(bmp), m_pixels(bmp, *this) + { + InitRect(pt, sz); + } + + // we evaluate to true only if we could get access to bitmap data + // successfully + operator bool() const { return m_pixels.IsOk(); } + + // get the iterator pointing to the origin + Iterator GetPixels() const { return m_pixels; } + + // dtor unlocks the bitmap + ~wxPixelDataIn() + { + if ( m_pixels.IsOk() ) + { +#if defined(__WXMSW__) || defined(__WXMAC__) + // this is a hack to mark wxBitmap as using alpha channel + if ( Format::HasAlpha ) + m_bmp.UseAlpha(); +#endif + m_bmp.UngetRawData(*this); + } + // else: don't call UngetRawData() if GetRawData() failed + } + +#if WXWIN_COMPATIBILITY_2_8 + // not needed anymore, calls to it should be simply removed + wxDEPRECATED_INLINE( void UseAlpha(), wxEMPTY_PARAMETER_VALUE ) +#endif + + // private: -- see comment in the beginning of the file + + // the bitmap we're associated with + wxBitmap m_bmp; + + // the iterator pointing to the image origin + Iterator m_pixels; + + private: + void InitRect(const wxPoint& pt, const wxSize& sz) + { + m_pixels.Offset(*this, pt.x, pt.y); + + m_ptOrigin = pt; + m_width = sz.x; + m_height = sz.y; + } + }; +}; + +#endif //wxUSE_GUI + +// FIXME-VC6: VC6 doesn't like typename in default template parameters while +// it is necessary with standard-conforming compilers, remove this +// #define and just use typename when we drop VC6 support +#if defined(__VISUALC__) && !wxCHECK_VISUALC_VERSION(7) + #define wxTYPENAME_IN_TEMPLATE_DEFAULT_PARAM +#else + #define wxTYPENAME_IN_TEMPLATE_DEFAULT_PARAM typename +#endif + +template <class Image, + class PixelFormat = wxTYPENAME_IN_TEMPLATE_DEFAULT_PARAM + wxPixelFormatFor<Image>::Format > +class wxPixelData : + public wxPixelDataOut<Image>::template wxPixelDataIn<PixelFormat> +{ +public: + typedef + typename wxPixelDataOut<Image>::template wxPixelDataIn<PixelFormat> + Base; + + wxPixelData(Image& image) : Base(image) { } + + wxPixelData(Image& i, const wxRect& rect) : Base(i, rect) { } + + wxPixelData(Image& i, const wxPoint& pt, const wxSize& sz) + : Base(i, pt, sz) + { + } +}; + +// some "predefined" pixel data classes +#if wxUSE_IMAGE +typedef wxPixelData<wxImage> wxImagePixelData; +#endif //wxUSE_IMAGE +#if wxUSE_GUI +typedef wxPixelData<wxBitmap, wxNativePixelFormat> wxNativePixelData; +typedef wxPixelData<wxBitmap, wxAlphaPixelFormat> wxAlphaPixelData; + +#endif //wxUSE_GUI + +// ---------------------------------------------------------------------------- +// wxPixelIterator +// ---------------------------------------------------------------------------- + +/* + wxPixel::Iterator represents something which points to the pixel data and + allows us to iterate over it. In the simplest case of wxBitmap it is, + indeed, just a pointer, but it can be something more complicated and, + moreover, you are free to specialize it for other image classes and bitmap + formats. + + Note that although it would have been much more intuitive to have a real + class here instead of what we have now, this class would need two template + parameters, and this can't be done because we'd need compiler support for + partial template specialization then and neither VC6 nor VC7 provide it. + */ +template < class Image, class PixelFormat = wxPixelFormatFor<Image> > +struct wxPixelIterator : public wxPixelData<Image, PixelFormat>::Iterator +{ +}; + +#endif // wxHAS_RAW_BITMAP +#endif // _WX_RAWBMP_H_ diff --git a/wxmsw/include/wx-3.0/wx/rearrangectrl.h b/wxmsw/include/wx-3.0/wx/rearrangectrl.h new file mode 100644 index 00000000..b54b04fa --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/rearrangectrl.h @@ -0,0 +1,232 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/rearrangectrl.h +// Purpose: various controls for rearranging the items interactively +// Author: Vadim Zeitlin +// Created: 2008-12-15 +// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_REARRANGECTRL_H_ +#define _WX_REARRANGECTRL_H_ + +#include "wx/checklst.h" + +#if wxUSE_REARRANGECTRL + +#include "wx/panel.h" +#include "wx/dialog.h" + +#include "wx/arrstr.h" + +extern WXDLLIMPEXP_DATA_CORE(const char) wxRearrangeListNameStr[]; +extern WXDLLIMPEXP_DATA_CORE(const char) wxRearrangeDialogNameStr[]; + +// ---------------------------------------------------------------------------- +// wxRearrangeList: a (check) list box allowing to move items around +// ---------------------------------------------------------------------------- + +// This class works allows to change the order of the items shown in it as well +// as to check or uncheck them individually. The data structure used to allow +// this is the order array which contains the items indices indexed by their +// position with an added twist that the unchecked items are represented by the +// bitwise complement of the corresponding index (for any architecture using +// two's complement for negative numbers representation (i.e. just about any at +// all) this means that a checked item N is represented by -N-1 in unchecked +// state). +// +// So, for example, the array order [1 -3 0] used in conjunction with the items +// array ["first", "second", "third"] means that the items are displayed in the +// order "second", "third", "first" and the "third" item is unchecked while the +// other two are checked. +class WXDLLIMPEXP_CORE wxRearrangeList : public wxCheckListBox +{ +public: + // ctors and such + // -------------- + + // default ctor, call Create() later + wxRearrangeList() { } + + // ctor creating the control, the arguments are the same as for + // wxCheckListBox except for the extra order array which defines the + // (initial) display order of the items as well as their statuses, see the + // description above + wxRearrangeList(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayInt& order, + const wxArrayString& items, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRearrangeListNameStr) + { + Create(parent, id, pos, size, order, items, style, validator, name); + } + + // Create() function takes the same parameters as the base class one and + // the order array determining the initial display order + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayInt& order, + const wxArrayString& items, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRearrangeListNameStr); + + + // items order + // ----------- + + // get the current items order; the returned array uses the same convention + // as the one passed to the ctor + const wxArrayInt& GetCurrentOrder() const { return m_order; } + + // return true if the current item can be moved up or down (i.e. just that + // it's not the first or the last one) + bool CanMoveCurrentUp() const; + bool CanMoveCurrentDown() const; + + // move the current item one position up or down, return true if it was moved + // or false if the current item was the first/last one and so nothing was done + bool MoveCurrentUp(); + bool MoveCurrentDown(); + +private: + // swap two items at the given positions in the listbox + void Swap(int pos1, int pos2); + + // event handler for item checking/unchecking + void OnCheck(wxCommandEvent& event); + + + // the current order array + wxArrayInt m_order; + + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxRearrangeList); +}; + +// ---------------------------------------------------------------------------- +// wxRearrangeCtrl: composite control containing a wxRearrangeList and buttons +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxRearrangeCtrl : public wxPanel +{ +public: + // ctors/Create function are the same as for wxRearrangeList + wxRearrangeCtrl() + { + Init(); + } + + wxRearrangeCtrl(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayInt& order, + const wxArrayString& items, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRearrangeListNameStr) + { + Init(); + + Create(parent, id, pos, size, order, items, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayInt& order, + const wxArrayString& items, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRearrangeListNameStr); + + // get the underlying listbox + wxRearrangeList *GetList() const { return m_list; } + +private: + // common part of all ctors + void Init(); + + // event handlers for the buttons + void OnUpdateButtonUI(wxUpdateUIEvent& event); + void OnButton(wxCommandEvent& event); + + + wxRearrangeList *m_list; + + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxRearrangeCtrl); +}; + +// ---------------------------------------------------------------------------- +// wxRearrangeDialog: dialog containing a wxRearrangeCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxRearrangeDialog : public wxDialog +{ +public: + // default ctor, use Create() later + wxRearrangeDialog() { Init(); } + + // ctor for the dialog: message is shown inside the dialog itself, order + // and items are passed to wxRearrangeList used internally + wxRearrangeDialog(wxWindow *parent, + const wxString& message, + const wxString& title, + const wxArrayInt& order, + const wxArrayString& items, + const wxPoint& pos = wxDefaultPosition, + const wxString& name = wxRearrangeDialogNameStr) + { + Init(); + + Create(parent, message, title, order, items, pos, name); + } + + bool Create(wxWindow *parent, + const wxString& message, + const wxString& title, + const wxArrayInt& order, + const wxArrayString& items, + const wxPoint& pos = wxDefaultPosition, + const wxString& name = wxRearrangeDialogNameStr); + + + // methods for the dialog customization + + // add extra contents to the dialog below the wxRearrangeCtrl part: the + // given window (usually a wxPanel containing more control inside it) must + // have the dialog as its parent and will be inserted into it at the right + // place by this method + void AddExtraControls(wxWindow *win); + + // return the wxRearrangeList control used by the dialog + wxRearrangeList *GetList() const; + + + // get the order of items after it was modified by the user + wxArrayInt GetOrder() const; + +private: + // common part of all ctors + void Init() { m_ctrl = NULL; } + + wxRearrangeCtrl *m_ctrl; + + wxDECLARE_NO_COPY_CLASS(wxRearrangeDialog); +}; + +#endif // wxUSE_REARRANGECTRL + +#endif // _WX_REARRANGECTRL_H_ + diff --git a/wxmsw/include/wx-3.0/wx/recguard.h b/wxmsw/include/wx-3.0/wx/recguard.h new file mode 100644 index 00000000..d7775b99 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/recguard.h @@ -0,0 +1,52 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/recguard.h +// Purpose: declaration and implementation of wxRecursionGuard class +// Author: Vadim Zeitlin +// Modified by: +// Created: 14.08.2003 +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RECGUARD_H_ +#define _WX_RECGUARD_H_ + +#include "wx/defs.h" + +// ---------------------------------------------------------------------------- +// wxRecursionGuardFlag is used with wxRecursionGuard +// ---------------------------------------------------------------------------- + +typedef int wxRecursionGuardFlag; + +// ---------------------------------------------------------------------------- +// wxRecursionGuard is the simplest way to protect a function from reentrancy +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxRecursionGuard +{ +public: + wxRecursionGuard(wxRecursionGuardFlag& flag) + : m_flag(flag) + { + m_isInside = flag++ != 0; + } + + ~wxRecursionGuard() + { + wxASSERT_MSG( m_flag > 0, wxT("unbalanced wxRecursionGuards!?") ); + + m_flag--; + } + + bool IsInside() const { return m_isInside; } + +private: + wxRecursionGuardFlag& m_flag; + + // true if the flag had been already set when we were created + bool m_isInside; +}; + +#endif // _WX_RECGUARD_H_ + diff --git a/wxmsw/include/wx-3.0/wx/regex.h b/wxmsw/include/wx-3.0/wx/regex.h new file mode 100644 index 00000000..0b1836e3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/regex.h @@ -0,0 +1,164 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/regex.h +// Purpose: regular expression matching +// Author: Karsten Ballueder +// Modified by: VZ at 13.07.01 (integrated to wxWin) +// Created: 05.02.2000 +// Copyright: (c) 2000 Karsten Ballueder <ballueder@gmx.net> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_REGEX_H_ +#define _WX_REGEX_H_ + +#include "wx/defs.h" + +#if wxUSE_REGEX + +#include "wx/string.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// flags for regex compilation: these can be used with Compile() +enum +{ + // use extended regex syntax + wxRE_EXTENDED = 0, + + // use advanced RE syntax (built-in regex only) +#ifdef wxHAS_REGEX_ADVANCED + wxRE_ADVANCED = 1, +#endif + + // use basic RE syntax + wxRE_BASIC = 2, + + // ignore case in match + wxRE_ICASE = 4, + + // only check match, don't set back references + wxRE_NOSUB = 8, + + // if not set, treat '\n' as an ordinary character, otherwise it is + // special: it is not matched by '.' and '^' and '$' always match + // after/before it regardless of the setting of wxRE_NOT[BE]OL + wxRE_NEWLINE = 16, + + // default flags + wxRE_DEFAULT = wxRE_EXTENDED +}; + +// flags for regex matching: these can be used with Matches() +// +// these flags are mainly useful when doing several matches in a long string, +// they can be used to prevent erroneous matches for '^' and '$' +enum +{ + // '^' doesn't match at the start of line + wxRE_NOTBOL = 32, + + // '$' doesn't match at the end of line + wxRE_NOTEOL = 64 +}; + +// ---------------------------------------------------------------------------- +// wxRegEx: a regular expression +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxRegExImpl; + +class WXDLLIMPEXP_BASE wxRegEx +{ +public: + // default ctor: use Compile() later + wxRegEx() { Init(); } + + // create and compile + wxRegEx(const wxString& expr, int flags = wxRE_DEFAULT) + { + Init(); + (void)Compile(expr, flags); + } + + // return true if this is a valid compiled regular expression + bool IsValid() const { return m_impl != NULL; } + + // compile the string into regular expression, return true if ok or false + // if string has a syntax error + bool Compile(const wxString& pattern, int flags = wxRE_DEFAULT); + + // matches the precompiled regular expression against a string, return + // true if matches and false otherwise + // + // flags may be combination of wxRE_NOTBOL and wxRE_NOTEOL + // len may be the length of text (ignored by most system regex libs) + // + // may only be called after successful call to Compile() + bool Matches(const wxString& text, int flags = 0) const; + bool Matches(const wxChar *text, int flags, size_t len) const + { return Matches(wxString(text, len), flags); } + + // get the start index and the length of the match of the expression + // (index 0) or a bracketed subexpression (index != 0) + // + // may only be called after successful call to Matches() + // + // return false if no match or on error + bool GetMatch(size_t *start, size_t *len, size_t index = 0) const; + + // return the part of string corresponding to the match, empty string is + // returned if match failed + // + // may only be called after successful call to Matches() + wxString GetMatch(const wxString& text, size_t index = 0) const; + + // return the size of the array of matches, i.e. the number of bracketed + // subexpressions plus one for the expression itself, or 0 on error. + // + // may only be called after successful call to Compile() + size_t GetMatchCount() const; + + // replaces the current regular expression in the string pointed to by + // pattern, with the text in replacement and return number of matches + // replaced (maybe 0 if none found) or -1 on error + // + // the replacement text may contain backreferences (\number) which will be + // replaced with the value of the corresponding subexpression in the + // pattern match + // + // maxMatches may be used to limit the number of replacements made, setting + // it to 1, for example, will only replace first occurrence (if any) of the + // pattern in the text while default value of 0 means replace all + int Replace(wxString *text, const wxString& replacement, + size_t maxMatches = 0) const; + + // replace the first occurrence + int ReplaceFirst(wxString *text, const wxString& replacement) const + { return Replace(text, replacement, 1); } + + // replace all occurrences: this is actually a synonym for Replace() + int ReplaceAll(wxString *text, const wxString& replacement) const + { return Replace(text, replacement, 0); } + + // dtor not virtual, don't derive from this class + ~wxRegEx(); + +private: + // common part of all ctors + void Init(); + + // the real guts of this class + wxRegExImpl *m_impl; + + // as long as the class wxRegExImpl is not ref-counted, + // instances of the handle wxRegEx must not be copied. + wxRegEx(const wxRegEx&); + wxRegEx &operator=(const wxRegEx&); +}; + +#endif // wxUSE_REGEX + +#endif // _WX_REGEX_H_ + diff --git a/wxmsw/include/wx-3.0/wx/region.h b/wxmsw/include/wx-3.0/wx/region.h new file mode 100644 index 00000000..64a8e055 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/region.h @@ -0,0 +1,291 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/region.h +// Purpose: Base header for wxRegion +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_REGION_H_BASE_ +#define _WX_REGION_H_BASE_ + +#include "wx/gdiobj.h" +#include "wx/gdicmn.h" + +class WXDLLIMPEXP_FWD_CORE wxBitmap; +class WXDLLIMPEXP_FWD_CORE wxColour; +class WXDLLIMPEXP_FWD_CORE wxRegion; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// result of wxRegion::Contains() call +enum wxRegionContain +{ + wxOutRegion = 0, + wxPartRegion = 1, + wxInRegion = 2 +}; + +// these constants are used with wxRegion::Combine() in the ports which have +// this method +enum wxRegionOp +{ + // Creates the intersection of the two combined regions. + wxRGN_AND, + + // Creates a copy of the region + wxRGN_COPY, + + // Combines the parts of first region that are not in the second one + wxRGN_DIFF, + + // Creates the union of two combined regions. + wxRGN_OR, + + // Creates the union of two regions except for any overlapping areas. + wxRGN_XOR +}; + +// ---------------------------------------------------------------------------- +// wxRegionBase defines wxRegion API +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxRegionBase : public wxGDIObject +{ +public: + // ctors + // ----- + + // none are defined here but the following should be available: +#if 0 + wxRegion(); + wxRegion(wxCoord x, wxCoord y, wxCoord w, wxCoord h); + wxRegion(const wxPoint& topLeft, const wxPoint& bottomRight); + wxRegion(const wxRect& rect); + wxRegion(size_t n, const wxPoint *points, wxPolygonFillMode fillStyle = wxODDEVEN_RULE); + wxRegion(const wxBitmap& bmp); + wxRegion(const wxBitmap& bmp, const wxColour& transp, int tolerance = 0); +#endif // 0 + + // operators + // --------- + + bool operator==(const wxRegion& region) const { return IsEqual(region); } + bool operator!=(const wxRegion& region) const { return !(*this == region); } + + + // accessors + // --------- + + // Is region empty? + virtual bool IsEmpty() const = 0; + bool Empty() const { return IsEmpty(); } + + // Is region equal (i.e. covers the same area as another one)? + bool IsEqual(const wxRegion& region) const; + + // Get the bounding box + bool GetBox(wxCoord& x, wxCoord& y, wxCoord& w, wxCoord& h) const + { return DoGetBox(x, y, w, h); } + wxRect GetBox() const + { + wxCoord x, y, w, h; + return DoGetBox(x, y, w, h) ? wxRect(x, y, w, h) : wxRect(); + } + + // Test if the given point or rectangle is inside this region + wxRegionContain Contains(wxCoord x, wxCoord y) const + { return DoContainsPoint(x, y); } + wxRegionContain Contains(const wxPoint& pt) const + { return DoContainsPoint(pt.x, pt.y); } + wxRegionContain Contains(wxCoord x, wxCoord y, wxCoord w, wxCoord h) const + { return DoContainsRect(wxRect(x, y, w, h)); } + wxRegionContain Contains(const wxRect& rect) const + { return DoContainsRect(rect); } + + + // operations + // ---------- + + virtual void Clear() = 0; + + // Move the region + bool Offset(wxCoord x, wxCoord y) + { return DoOffset(x, y); } + bool Offset(const wxPoint& pt) + { return DoOffset(pt.x, pt.y); } + + // Union rectangle or region with this region. + bool Union(wxCoord x, wxCoord y, wxCoord w, wxCoord h) + { return DoUnionWithRect(wxRect(x, y, w, h)); } + bool Union(const wxRect& rect) + { return DoUnionWithRect(rect); } + bool Union(const wxRegion& region) + { return DoUnionWithRegion(region); } + +#if wxUSE_IMAGE + // Use the non-transparent pixels of a wxBitmap for the region to combine + // with this region. First version takes transparency from bitmap's mask, + // second lets the user specify the colour to be treated as transparent + // along with an optional tolerance value. + // NOTE: implemented in common/rgncmn.cpp + bool Union(const wxBitmap& bmp); + bool Union(const wxBitmap& bmp, const wxColour& transp, int tolerance = 0); +#endif // wxUSE_IMAGE + + // Intersect rectangle or region with this one. + bool Intersect(wxCoord x, wxCoord y, wxCoord w, wxCoord h); + bool Intersect(const wxRect& rect); + bool Intersect(const wxRegion& region) + { return DoIntersect(region); } + + // Subtract rectangle or region from this: + // Combines the parts of 'this' that are not part of the second region. + bool Subtract(wxCoord x, wxCoord y, wxCoord w, wxCoord h); + bool Subtract(const wxRect& rect); + bool Subtract(const wxRegion& region) + { return DoSubtract(region); } + + // XOR: the union of two combined regions except for any overlapping areas. + bool Xor(wxCoord x, wxCoord y, wxCoord w, wxCoord h); + bool Xor(const wxRect& rect); + bool Xor(const wxRegion& region) + { return DoXor(region); } + + + // Convert the region to a B&W bitmap with the white pixels being inside + // the region. + wxBitmap ConvertToBitmap() const; + +protected: + virtual bool DoIsEqual(const wxRegion& region) const = 0; + virtual bool DoGetBox(wxCoord& x, wxCoord& y, wxCoord& w, wxCoord& h) const = 0; + virtual wxRegionContain DoContainsPoint(wxCoord x, wxCoord y) const = 0; + virtual wxRegionContain DoContainsRect(const wxRect& rect) const = 0; + + virtual bool DoOffset(wxCoord x, wxCoord y) = 0; + + virtual bool DoUnionWithRect(const wxRect& rect) = 0; + virtual bool DoUnionWithRegion(const wxRegion& region) = 0; + + virtual bool DoIntersect(const wxRegion& region) = 0; + virtual bool DoSubtract(const wxRegion& region) = 0; + virtual bool DoXor(const wxRegion& region) = 0; +}; + +// some ports implement a generic Combine() function while others only +// implement individual wxRegion operations, factor out the common code for the +// ports with Combine() in this class +#if defined(__WXMSW__) || \ + ( defined(__WXMAC__) && wxOSX_USE_COCOA_OR_CARBON ) || \ + defined(__WXPM__) + +#define wxHAS_REGION_COMBINE + +class WXDLLIMPEXP_CORE wxRegionWithCombine : public wxRegionBase +{ +public: + // these methods are not part of public API as they're not implemented on + // all ports + bool Combine(wxCoord x, wxCoord y, wxCoord w, wxCoord h, wxRegionOp op); + bool Combine(const wxRect& rect, wxRegionOp op); + bool Combine(const wxRegion& region, wxRegionOp op) + { return DoCombine(region, op); } + + +protected: + // the real Combine() method, to be defined in the derived class + virtual bool DoCombine(const wxRegion& region, wxRegionOp op) = 0; + + // implement some wxRegionBase pure virtuals in terms of Combine() + virtual bool DoUnionWithRect(const wxRect& rect); + virtual bool DoUnionWithRegion(const wxRegion& region); + virtual bool DoIntersect(const wxRegion& region); + virtual bool DoSubtract(const wxRegion& region); + virtual bool DoXor(const wxRegion& region); +}; + +#endif // ports with wxRegion::Combine() + +#if defined(__WXMSW__) + #include "wx/msw/region.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/region.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/region.h" +#elif defined(__WXMOTIF__) || defined(__WXX11__) + #include "wx/x11/region.h" +#elif defined(__WXDFB__) + #include "wx/dfb/region.h" +#elif defined(__WXMAC__) + #include "wx/osx/region.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/region.h" +#elif defined(__WXPM__) + #include "wx/os2/region.h" +#endif + +// ---------------------------------------------------------------------------- +// inline functions implementation +// ---------------------------------------------------------------------------- + +// NB: these functions couldn't be defined in the class declaration as they use +// wxRegion and so can be only defined after including the header declaring +// the real class + +inline bool wxRegionBase::Intersect(const wxRect& rect) +{ + return DoIntersect(wxRegion(rect)); +} + +inline bool wxRegionBase::Subtract(const wxRect& rect) +{ + return DoSubtract(wxRegion(rect)); +} + +inline bool wxRegionBase::Xor(const wxRect& rect) +{ + return DoXor(wxRegion(rect)); +} + +// ...and these functions are here because they call the ones above, and its +// not really proper to call an inline function before its defined inline. + +inline bool wxRegionBase::Intersect(wxCoord x, wxCoord y, wxCoord w, wxCoord h) +{ + return Intersect(wxRect(x, y, w, h)); +} + +inline bool wxRegionBase::Subtract(wxCoord x, wxCoord y, wxCoord w, wxCoord h) +{ + return Subtract(wxRect(x, y, w, h)); +} + +inline bool wxRegionBase::Xor(wxCoord x, wxCoord y, wxCoord w, wxCoord h) +{ + return Xor(wxRect(x, y, w, h)); +} + +#ifdef wxHAS_REGION_COMBINE + +inline bool wxRegionWithCombine::Combine(wxCoord x, + wxCoord y, + wxCoord w, + wxCoord h, + wxRegionOp op) +{ + return DoCombine(wxRegion(x, y, w, h), op); +} + +inline bool wxRegionWithCombine::Combine(const wxRect& rect, wxRegionOp op) +{ + return DoCombine(wxRegion(rect), op); +} + +#endif // wxHAS_REGION_COMBINE + +#endif // _WX_REGION_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/renderer.h b/wxmsw/include/wx-3.0/wx/renderer.h new file mode 100644 index 00000000..97152e32 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/renderer.h @@ -0,0 +1,529 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/renderer.h +// Purpose: wxRendererNative class declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.07.2003 +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/* + Renderers are used in wxWidgets for two similar but different things: + (a) wxUniversal uses them to draw everything, i.e. all the control + (b) all the native ports use them to draw generic controls only + + wxUniversal needs more functionality than what is included in the base class + as it needs to draw stuff like scrollbars which are never going to be + generic. So we put the bare minimum needed by the native ports here and the + full wxRenderer class is declared in wx/univ/renderer.h and is only used by + wxUniveral (although note that native ports can load wxRenderer objects from + theme DLLs and use them as wxRendererNative ones, of course). + */ + +#ifndef _WX_RENDERER_H_ +#define _WX_RENDERER_H_ + +class WXDLLIMPEXP_FWD_CORE wxDC; +class WXDLLIMPEXP_FWD_CORE wxWindow; + +#include "wx/gdicmn.h" // for wxPoint, wxSize +#include "wx/colour.h" +#include "wx/font.h" +#include "wx/bitmap.h" +#include "wx/string.h" + +// some platforms have their own renderers, others use the generic one +#if defined(__WXMSW__) || ( defined(__WXMAC__) && wxOSX_USE_COCOA_OR_CARBON ) || defined(__WXGTK__) + #define wxHAS_NATIVE_RENDERER +#else + #undef wxHAS_NATIVE_RENDERER +#endif + +// only MSW and OS X currently provides DrawTitleBarBitmap() method +#if defined(__WXMSW__) || (defined(__WXMAC__) && wxUSE_LIBPNG && wxUSE_IMAGE) + #define wxHAS_DRAW_TITLE_BAR_BITMAP +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// control state flags used in wxRenderer and wxColourScheme +enum +{ + wxCONTROL_DISABLED = 0x00000001, // control is disabled + wxCONTROL_FOCUSED = 0x00000002, // currently has keyboard focus + wxCONTROL_PRESSED = 0x00000004, // (button) is pressed + wxCONTROL_SPECIAL = 0x00000008, // control-specific bit: + wxCONTROL_ISDEFAULT = wxCONTROL_SPECIAL, // only for the buttons + wxCONTROL_ISSUBMENU = wxCONTROL_SPECIAL, // only for the menu items + wxCONTROL_EXPANDED = wxCONTROL_SPECIAL, // only for the tree items + wxCONTROL_SIZEGRIP = wxCONTROL_SPECIAL, // only for the status bar panes + wxCONTROL_FLAT = wxCONTROL_SPECIAL, // checkboxes only: flat border + wxCONTROL_CURRENT = 0x00000010, // mouse is currently over the control + wxCONTROL_SELECTED = 0x00000020, // selected item in e.g. listbox + wxCONTROL_CHECKED = 0x00000040, // (check/radio button) is checked + wxCONTROL_CHECKABLE = 0x00000080, // (menu) item can be checked + wxCONTROL_UNDETERMINED = wxCONTROL_CHECKABLE, // (check) undetermined state + + wxCONTROL_FLAGS_MASK = 0x000000ff, + + // this is a pseudo flag not used directly by wxRenderer but rather by some + // controls internally + wxCONTROL_DIRTY = 0x80000000 +}; + +// title bar buttons supported by DrawTitleBarBitmap() +// +// NB: they have the same values as wxTOPLEVEL_BUTTON_XXX constants in +// wx/univ/toplevel.h as they really represent the same things +enum wxTitleBarButton +{ + wxTITLEBAR_BUTTON_CLOSE = 0x01000000, + wxTITLEBAR_BUTTON_MAXIMIZE = 0x02000000, + wxTITLEBAR_BUTTON_ICONIZE = 0x04000000, + wxTITLEBAR_BUTTON_RESTORE = 0x08000000, + wxTITLEBAR_BUTTON_HELP = 0x10000000 +}; + +// ---------------------------------------------------------------------------- +// helper structs +// ---------------------------------------------------------------------------- + +// wxSplitterWindow parameters +struct WXDLLIMPEXP_CORE wxSplitterRenderParams +{ + // the only way to initialize this struct is by using this ctor + wxSplitterRenderParams(wxCoord widthSash_, wxCoord border_, bool isSens_) + : widthSash(widthSash_), border(border_), isHotSensitive(isSens_) + { + } + + // the width of the splitter sash + const wxCoord widthSash; + + // the width of the border of the splitter window + const wxCoord border; + + // true if the splitter changes its appearance when the mouse is over it + const bool isHotSensitive; +}; + + +// extra optional parameters for DrawHeaderButton +struct WXDLLIMPEXP_CORE wxHeaderButtonParams +{ + wxHeaderButtonParams() + : m_labelAlignment(wxALIGN_LEFT) + { } + + wxColour m_arrowColour; + wxColour m_selectionColour; + wxString m_labelText; + wxFont m_labelFont; + wxColour m_labelColour; + wxBitmap m_labelBitmap; + int m_labelAlignment; +}; + +enum wxHeaderSortIconType +{ + wxHDR_SORT_ICON_NONE, // Header button has no sort arrow + wxHDR_SORT_ICON_UP, // Header button an up sort arrow icon + wxHDR_SORT_ICON_DOWN // Header button a down sort arrow icon +}; + + +// wxRendererNative interface version +struct WXDLLIMPEXP_CORE wxRendererVersion +{ + wxRendererVersion(int version_, int age_) : version(version_), age(age_) { } + + // default copy ctor, assignment operator and dtor are ok + + // the current version and age of wxRendererNative interface: different + // versions are incompatible (in both ways) while the ages inside the same + // version are upwards compatible, i.e. the version of the renderer must + // match the version of the main program exactly while the age may be + // highergreater or equal to it + // + // NB: don't forget to increment age after adding any new virtual function! + enum + { + Current_Version = 1, + Current_Age = 5 + }; + + + // check if the given version is compatible with the current one + static bool IsCompatible(const wxRendererVersion& ver) + { + return ver.version == Current_Version && ver.age >= Current_Age; + } + + const int version; + const int age; +}; + +// ---------------------------------------------------------------------------- +// wxRendererNative: abstracts drawing methods needed by the native controls +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxRendererNative +{ +public: + // drawing functions + // ----------------- + + // draw the header control button (used by wxListCtrl) Returns optimal + // width for the label contents. + virtual int DrawHeaderButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0, + wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE, + wxHeaderButtonParams* params=NULL) = 0; + + + // Draw the contents of a header control button (label, sort arrows, etc.) + // Normally only called by DrawHeaderButton. + virtual int DrawHeaderButtonContents(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0, + wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE, + wxHeaderButtonParams* params=NULL) = 0; + + // Returns the default height of a header button, either a fixed platform + // height if available, or a generic height based on the window's font. + virtual int GetHeaderButtonHeight(wxWindow *win) = 0; + + // Returns the margin on left and right sides of header button's label + virtual int GetHeaderButtonMargin(wxWindow *win) = 0; + + + // draw the expanded/collapsed icon for a tree control item + virtual void DrawTreeItemButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // draw the border for sash window: this border must be such that the sash + // drawn by DrawSash() blends into it well + virtual void DrawSplitterBorder(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // draw a (vertical) sash + virtual void DrawSplitterSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position, + wxOrientation orient, + int flags = 0) = 0; + + // draw a combobox dropdown button + // + // flags may use wxCONTROL_PRESSED and wxCONTROL_CURRENT + virtual void DrawComboBoxDropButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // draw a dropdown arrow + // + // flags may use wxCONTROL_PRESSED and wxCONTROL_CURRENT + virtual void DrawDropArrow(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // draw check button + // + // flags may use wxCONTROL_CHECKED, wxCONTROL_UNDETERMINED and wxCONTROL_CURRENT + virtual void DrawCheckBox(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // Returns the default size of a check box. + virtual wxSize GetCheckBoxSize(wxWindow *win) = 0; + + // draw blank button + // + // flags may use wxCONTROL_PRESSED, wxCONTROL_CURRENT and wxCONTROL_ISDEFAULT + virtual void DrawPushButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // draw rectangle indicating that an item in e.g. a list control + // has been selected or focused + // + // flags may use + // wxCONTROL_SELECTED (item is selected, e.g. draw background) + // wxCONTROL_CURRENT (item is the current item, e.g. dotted border) + // wxCONTROL_FOCUSED (the whole control has focus, e.g. blue background vs. grey otherwise) + virtual void DrawItemSelectionRect(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // draw the focus rectangle around the label contained in the given rect + // + // only wxCONTROL_SELECTED makes sense in flags here + virtual void DrawFocusRect(wxWindow* win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // Draw a native wxChoice + virtual void DrawChoice(wxWindow* win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // Draw a native wxComboBox + virtual void DrawComboBox(wxWindow* win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // Draw a native wxTextCtrl frame + virtual void DrawTextCtrl(wxWindow* win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // Draw a native wxRadioButton bitmap + virtual void DrawRadioBitmap(wxWindow* win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + +#ifdef wxHAS_DRAW_TITLE_BAR_BITMAP + // Draw one of the standard title bar buttons + // + // This is currently implemented only for MSW and OS X (for the close + // button only) because there is no way to render standard title bar + // buttons under the other platforms, the best can be done is to use normal + // (only) images which wxArtProvider provides for wxART_HELP and + // wxART_CLOSE (but not any other title bar buttons) + // + // NB: make sure PNG handler is enabled if using this function under OS X + virtual void DrawTitleBarBitmap(wxWindow *win, + wxDC& dc, + const wxRect& rect, + wxTitleBarButton button, + int flags = 0) = 0; +#endif // wxHAS_DRAW_TITLE_BAR_BITMAP + + + // geometry functions + // ------------------ + + // get the splitter parameters: the x field of the returned point is the + // sash width and the y field is the border width + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win) = 0; + + + // pseudo constructors + // ------------------- + + // return the currently used renderer + static wxRendererNative& Get(); + + // return the generic implementation of the renderer + static wxRendererNative& GetGeneric(); + + // return the default (native) implementation for this platform + static wxRendererNative& GetDefault(); + + + // changing the global renderer + // ---------------------------- + +#if wxUSE_DYNLIB_CLASS + // load the renderer from the specified DLL, the returned pointer must be + // deleted by caller if not NULL when it is not used any more + static wxRendererNative *Load(const wxString& name); +#endif // wxUSE_DYNLIB_CLASS + + // set the renderer to use, passing NULL reverts to using the default + // renderer + // + // return the previous renderer used with Set() or NULL if none + static wxRendererNative *Set(wxRendererNative *renderer); + + + // miscellaneous stuff + // ------------------- + + // this function is used for version checking: Load() refuses to load any + // DLLs implementing an older or incompatible version; it should be + // implemented simply by returning wxRendererVersion::Current_XXX values + virtual wxRendererVersion GetVersion() const = 0; + + // virtual dtor for any base class + virtual ~wxRendererNative(); +}; + +// ---------------------------------------------------------------------------- +// wxDelegateRendererNative: allows reuse of renderers code +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDelegateRendererNative : public wxRendererNative +{ +public: + wxDelegateRendererNative() + : m_rendererNative(GetGeneric()) { } + + wxDelegateRendererNative(wxRendererNative& rendererNative) + : m_rendererNative(rendererNative) { } + + + virtual int DrawHeaderButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0, + wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE, + wxHeaderButtonParams* params = NULL) + { return m_rendererNative.DrawHeaderButton(win, dc, rect, flags, sortArrow, params); } + + virtual int DrawHeaderButtonContents(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0, + wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE, + wxHeaderButtonParams* params = NULL) + { return m_rendererNative.DrawHeaderButtonContents(win, dc, rect, flags, sortArrow, params); } + + virtual int GetHeaderButtonHeight(wxWindow *win) + { return m_rendererNative.GetHeaderButtonHeight(win); } + + virtual int GetHeaderButtonMargin(wxWindow *win) + { return m_rendererNative.GetHeaderButtonMargin(win); } + + virtual void DrawTreeItemButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawTreeItemButton(win, dc, rect, flags); } + + virtual void DrawSplitterBorder(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawSplitterBorder(win, dc, rect, flags); } + + virtual void DrawSplitterSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position, + wxOrientation orient, + int flags = 0) + { m_rendererNative.DrawSplitterSash(win, dc, size, + position, orient, flags); } + + virtual void DrawComboBoxDropButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawComboBoxDropButton(win, dc, rect, flags); } + + virtual void DrawDropArrow(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawDropArrow(win, dc, rect, flags); } + + virtual void DrawCheckBox(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawCheckBox( win, dc, rect, flags ); } + + virtual wxSize GetCheckBoxSize(wxWindow *win) + { return m_rendererNative.GetCheckBoxSize(win); } + + virtual void DrawPushButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawPushButton( win, dc, rect, flags ); } + + virtual void DrawItemSelectionRect(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawItemSelectionRect( win, dc, rect, flags ); } + + virtual void DrawFocusRect(wxWindow* win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawFocusRect( win, dc, rect, flags ); } + + virtual void DrawChoice(wxWindow* win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawChoice( win, dc, rect, flags); } + + virtual void DrawComboBox(wxWindow* win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawComboBox( win, dc, rect, flags); } + + virtual void DrawTextCtrl(wxWindow* win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawTextCtrl( win, dc, rect, flags); } + + virtual void DrawRadioBitmap(wxWindow* win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawRadioBitmap(win, dc, rect, flags); } + +#ifdef wxHAS_DRAW_TITLE_BAR_BITMAP + virtual void DrawTitleBarBitmap(wxWindow *win, + wxDC& dc, + const wxRect& rect, + wxTitleBarButton button, + int flags = 0) + { m_rendererNative.DrawTitleBarBitmap(win, dc, rect, button, flags); } +#endif // wxHAS_DRAW_TITLE_BAR_BITMAP + + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win) + { return m_rendererNative.GetSplitterParams(win); } + + virtual wxRendererVersion GetVersion() const + { return m_rendererNative.GetVersion(); } + +protected: + wxRendererNative& m_rendererNative; + + wxDECLARE_NO_COPY_CLASS(wxDelegateRendererNative); +}; + +// ---------------------------------------------------------------------------- +// inline functions implementation +// ---------------------------------------------------------------------------- + +#ifndef wxHAS_NATIVE_RENDERER + +// default native renderer is the generic one then +/* static */ inline +wxRendererNative& wxRendererNative::GetDefault() +{ + return GetGeneric(); +} + +#endif // !wxHAS_NATIVE_RENDERER + +#endif // _WX_RENDERER_H_ diff --git a/wxmsw/include/wx-3.0/wx/ribbon/art.h b/wxmsw/include/wx-3.0/wx/ribbon/art.h new file mode 100644 index 00000000..b9514129 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ribbon/art.h @@ -0,0 +1,943 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ribbon/art.h +// Purpose: Art providers for ribbon-bar-style interface +// Author: Peter Cawley +// Modified by: +// Created: 2009-05-25 +// Copyright: (C) Peter Cawley +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RIBBON_ART_H_ +#define _WX_RIBBON_ART_H_ + +#include "wx/defs.h" + +#if wxUSE_RIBBON + +#include "wx/brush.h" +#include "wx/colour.h" +#include "wx/font.h" +#include "wx/pen.h" +#include "wx/bitmap.h" +#include "wx/ribbon/bar.h" + +class WXDLLIMPEXP_FWD_CORE wxDC; +class WXDLLIMPEXP_FWD_CORE wxWindow; + +enum wxRibbonArtSetting +{ + wxRIBBON_ART_TAB_SEPARATION_SIZE, + wxRIBBON_ART_PAGE_BORDER_LEFT_SIZE, + wxRIBBON_ART_PAGE_BORDER_TOP_SIZE, + wxRIBBON_ART_PAGE_BORDER_RIGHT_SIZE, + wxRIBBON_ART_PAGE_BORDER_BOTTOM_SIZE, + wxRIBBON_ART_PANEL_X_SEPARATION_SIZE, + wxRIBBON_ART_PANEL_Y_SEPARATION_SIZE, + wxRIBBON_ART_TOOL_GROUP_SEPARATION_SIZE, + wxRIBBON_ART_GALLERY_BITMAP_PADDING_LEFT_SIZE, + wxRIBBON_ART_GALLERY_BITMAP_PADDING_RIGHT_SIZE, + wxRIBBON_ART_GALLERY_BITMAP_PADDING_TOP_SIZE, + wxRIBBON_ART_GALLERY_BITMAP_PADDING_BOTTOM_SIZE, + wxRIBBON_ART_PANEL_LABEL_FONT, + wxRIBBON_ART_BUTTON_BAR_LABEL_FONT, + wxRIBBON_ART_TAB_LABEL_FONT, + wxRIBBON_ART_BUTTON_BAR_LABEL_COLOUR, + wxRIBBON_ART_BUTTON_BAR_HOVER_BORDER_COLOUR, + wxRIBBON_ART_BUTTON_BAR_HOVER_BACKGROUND_TOP_COLOUR, + wxRIBBON_ART_BUTTON_BAR_HOVER_BACKGROUND_TOP_GRADIENT_COLOUR, + wxRIBBON_ART_BUTTON_BAR_HOVER_BACKGROUND_COLOUR, + wxRIBBON_ART_BUTTON_BAR_HOVER_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_BUTTON_BAR_ACTIVE_BORDER_COLOUR, + wxRIBBON_ART_BUTTON_BAR_ACTIVE_BACKGROUND_TOP_COLOUR, + wxRIBBON_ART_BUTTON_BAR_ACTIVE_BACKGROUND_TOP_GRADIENT_COLOUR, + wxRIBBON_ART_BUTTON_BAR_ACTIVE_BACKGROUND_COLOUR, + wxRIBBON_ART_BUTTON_BAR_ACTIVE_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_GALLERY_BORDER_COLOUR, + wxRIBBON_ART_GALLERY_HOVER_BACKGROUND_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_BACKGROUND_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_BACKGROUND_TOP_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_FACE_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_HOVER_BACKGROUND_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_HOVER_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_HOVER_BACKGROUND_TOP_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_HOVER_FACE_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_ACTIVE_BACKGROUND_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_ACTIVE_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_ACTIVE_BACKGROUND_TOP_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_ACTIVE_FACE_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_DISABLED_BACKGROUND_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_DISABLED_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_DISABLED_BACKGROUND_TOP_COLOUR, + wxRIBBON_ART_GALLERY_BUTTON_DISABLED_FACE_COLOUR, + wxRIBBON_ART_GALLERY_ITEM_BORDER_COLOUR, + wxRIBBON_ART_TAB_LABEL_COLOUR, + wxRIBBON_ART_TAB_SEPARATOR_COLOUR, + wxRIBBON_ART_TAB_SEPARATOR_GRADIENT_COLOUR, + wxRIBBON_ART_TAB_CTRL_BACKGROUND_COLOUR, + wxRIBBON_ART_TAB_CTRL_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_TAB_HOVER_BACKGROUND_TOP_COLOUR, + wxRIBBON_ART_TAB_HOVER_BACKGROUND_TOP_GRADIENT_COLOUR, + wxRIBBON_ART_TAB_HOVER_BACKGROUND_COLOUR, + wxRIBBON_ART_TAB_HOVER_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_TAB_ACTIVE_BACKGROUND_TOP_COLOUR, + wxRIBBON_ART_TAB_ACTIVE_BACKGROUND_TOP_GRADIENT_COLOUR, + wxRIBBON_ART_TAB_ACTIVE_BACKGROUND_COLOUR, + wxRIBBON_ART_TAB_ACTIVE_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_TAB_BORDER_COLOUR, + wxRIBBON_ART_PANEL_BORDER_COLOUR, + wxRIBBON_ART_PANEL_BORDER_GRADIENT_COLOUR, + wxRIBBON_ART_PANEL_MINIMISED_BORDER_COLOUR, + wxRIBBON_ART_PANEL_MINIMISED_BORDER_GRADIENT_COLOUR, + wxRIBBON_ART_PANEL_LABEL_BACKGROUND_COLOUR, + wxRIBBON_ART_PANEL_LABEL_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_PANEL_LABEL_COLOUR, + wxRIBBON_ART_PANEL_HOVER_LABEL_BACKGROUND_COLOUR, + wxRIBBON_ART_PANEL_HOVER_LABEL_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_PANEL_HOVER_LABEL_COLOUR, + wxRIBBON_ART_PANEL_MINIMISED_LABEL_COLOUR, + wxRIBBON_ART_PANEL_ACTIVE_BACKGROUND_TOP_COLOUR, + wxRIBBON_ART_PANEL_ACTIVE_BACKGROUND_TOP_GRADIENT_COLOUR, + wxRIBBON_ART_PANEL_ACTIVE_BACKGROUND_COLOUR, + wxRIBBON_ART_PANEL_ACTIVE_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_PANEL_BUTTON_FACE_COLOUR, + wxRIBBON_ART_PANEL_BUTTON_HOVER_FACE_COLOUR, + + wxRIBBON_ART_PAGE_TOGGLE_FACE_COLOUR, + wxRIBBON_ART_PAGE_TOGGLE_HOVER_FACE_COLOUR, + + wxRIBBON_ART_PAGE_BORDER_COLOUR, + wxRIBBON_ART_PAGE_BACKGROUND_TOP_COLOUR, + wxRIBBON_ART_PAGE_BACKGROUND_TOP_GRADIENT_COLOUR, + wxRIBBON_ART_PAGE_BACKGROUND_COLOUR, + wxRIBBON_ART_PAGE_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_PAGE_HOVER_BACKGROUND_TOP_COLOUR, + wxRIBBON_ART_PAGE_HOVER_BACKGROUND_TOP_GRADIENT_COLOUR, + wxRIBBON_ART_PAGE_HOVER_BACKGROUND_COLOUR, + wxRIBBON_ART_PAGE_HOVER_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_TOOLBAR_BORDER_COLOUR, + wxRIBBON_ART_TOOLBAR_HOVER_BORDER_COLOUR, + wxRIBBON_ART_TOOLBAR_FACE_COLOUR, + wxRIBBON_ART_TOOL_BACKGROUND_TOP_COLOUR, + wxRIBBON_ART_TOOL_BACKGROUND_TOP_GRADIENT_COLOUR, + wxRIBBON_ART_TOOL_BACKGROUND_COLOUR, + wxRIBBON_ART_TOOL_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_TOOL_HOVER_BACKGROUND_TOP_COLOUR, + wxRIBBON_ART_TOOL_HOVER_BACKGROUND_TOP_GRADIENT_COLOUR, + wxRIBBON_ART_TOOL_HOVER_BACKGROUND_COLOUR, + wxRIBBON_ART_TOOL_HOVER_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_TOOL_ACTIVE_BACKGROUND_TOP_COLOUR, + wxRIBBON_ART_TOOL_ACTIVE_BACKGROUND_TOP_GRADIENT_COLOUR, + wxRIBBON_ART_TOOL_ACTIVE_BACKGROUND_COLOUR, + wxRIBBON_ART_TOOL_ACTIVE_BACKGROUND_GRADIENT_COLOUR, + wxRIBBON_ART_BUTTON_BAR_LABEL_DISABLED_COLOUR +}; + +enum wxRibbonScrollButtonStyle +{ + wxRIBBON_SCROLL_BTN_LEFT = 0, + wxRIBBON_SCROLL_BTN_RIGHT = 1, + wxRIBBON_SCROLL_BTN_UP = 2, + wxRIBBON_SCROLL_BTN_DOWN = 3, + + wxRIBBON_SCROLL_BTN_DIRECTION_MASK = 3, + + wxRIBBON_SCROLL_BTN_NORMAL = 0, + wxRIBBON_SCROLL_BTN_HOVERED = 4, + wxRIBBON_SCROLL_BTN_ACTIVE = 8, + + wxRIBBON_SCROLL_BTN_STATE_MASK = 12, + + wxRIBBON_SCROLL_BTN_FOR_OTHER = 0, + wxRIBBON_SCROLL_BTN_FOR_TABS = 16, + wxRIBBON_SCROLL_BTN_FOR_PAGE = 32, + + wxRIBBON_SCROLL_BTN_FOR_MASK = 48 +}; + +enum wxRibbonButtonKind +{ + wxRIBBON_BUTTON_NORMAL = 1 << 0, + wxRIBBON_BUTTON_DROPDOWN = 1 << 1, + wxRIBBON_BUTTON_HYBRID = wxRIBBON_BUTTON_NORMAL | wxRIBBON_BUTTON_DROPDOWN, + wxRIBBON_BUTTON_TOGGLE = 1 << 2 +}; + +enum wxRibbonButtonBarButtonState +{ + wxRIBBON_BUTTONBAR_BUTTON_SMALL = 0 << 0, + wxRIBBON_BUTTONBAR_BUTTON_MEDIUM = 1 << 0, + wxRIBBON_BUTTONBAR_BUTTON_LARGE = 2 << 0, + wxRIBBON_BUTTONBAR_BUTTON_SIZE_MASK = 3 << 0, + + wxRIBBON_BUTTONBAR_BUTTON_NORMAL_HOVERED = 1 << 3, + wxRIBBON_BUTTONBAR_BUTTON_DROPDOWN_HOVERED = 1 << 4, + wxRIBBON_BUTTONBAR_BUTTON_HOVER_MASK = wxRIBBON_BUTTONBAR_BUTTON_NORMAL_HOVERED | wxRIBBON_BUTTONBAR_BUTTON_DROPDOWN_HOVERED, + wxRIBBON_BUTTONBAR_BUTTON_NORMAL_ACTIVE = 1 << 5, + wxRIBBON_BUTTONBAR_BUTTON_DROPDOWN_ACTIVE = 1 << 6, + wxRIBBON_BUTTONBAR_BUTTON_ACTIVE_MASK = wxRIBBON_BUTTONBAR_BUTTON_NORMAL_ACTIVE | wxRIBBON_BUTTONBAR_BUTTON_DROPDOWN_ACTIVE, + wxRIBBON_BUTTONBAR_BUTTON_DISABLED = 1 << 7, + wxRIBBON_BUTTONBAR_BUTTON_TOGGLED = 1 << 8, + wxRIBBON_BUTTONBAR_BUTTON_STATE_MASK = 0x1F8 +}; + +enum wxRibbonGalleryButtonState +{ + wxRIBBON_GALLERY_BUTTON_NORMAL, + wxRIBBON_GALLERY_BUTTON_HOVERED, + wxRIBBON_GALLERY_BUTTON_ACTIVE, + wxRIBBON_GALLERY_BUTTON_DISABLED +}; + +class wxRibbonBar; +class wxRibbonPage; +class wxRibbonPanel; +class wxRibbonGallery; +class wxRibbonGalleryItem; +class wxRibbonPageTabInfo; +class wxRibbonPageTabInfoArray; + +class WXDLLIMPEXP_RIBBON wxRibbonArtProvider +{ +public: + wxRibbonArtProvider(); + virtual ~wxRibbonArtProvider(); + + virtual wxRibbonArtProvider* Clone() const = 0; + virtual void SetFlags(long flags) = 0; + virtual long GetFlags() const = 0; + + virtual int GetMetric(int id) const = 0; + virtual void SetMetric(int id, int new_val) = 0; + virtual void SetFont(int id, const wxFont& font) = 0; + virtual wxFont GetFont(int id) const = 0; + virtual wxColour GetColour(int id) const = 0; + virtual void SetColour(int id, const wxColor& colour) = 0; + wxColour GetColor(int id) const { return GetColour(id); } + void SetColor(int id, const wxColour& color) { SetColour(id, color); } + virtual void GetColourScheme(wxColour* primary, + wxColour* secondary, + wxColour* tertiary) const = 0; + virtual void SetColourScheme(const wxColour& primary, + const wxColour& secondary, + const wxColour& tertiary) = 0; + + virtual void DrawTabCtrlBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + + virtual void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxRibbonPageTabInfo& tab) = 0; + + virtual void DrawTabSeparator(wxDC& dc, + wxWindow* wnd, + const wxRect& rect, + double visibility) = 0; + + virtual void DrawPageBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + + virtual void DrawScrollButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect, + long style) = 0; + + virtual void DrawPanelBackground( + wxDC& dc, + wxRibbonPanel* wnd, + const wxRect& rect) = 0; + + virtual void DrawGalleryBackground( + wxDC& dc, + wxRibbonGallery* wnd, + const wxRect& rect) = 0; + + virtual void DrawGalleryItemBackground( + wxDC& dc, + wxRibbonGallery* wnd, + const wxRect& rect, + wxRibbonGalleryItem* item) = 0; + + virtual void DrawMinimisedPanel( + wxDC& dc, + wxRibbonPanel* wnd, + const wxRect& rect, + wxBitmap& bitmap) = 0; + + virtual void DrawButtonBarBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + + virtual void DrawButtonBarButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect, + wxRibbonButtonKind kind, + long state, + const wxString& label, + const wxBitmap& bitmap_large, + const wxBitmap& bitmap_small) = 0; + + virtual void DrawToolBarBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + + virtual void DrawToolGroupBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + + virtual void DrawTool( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect, + const wxBitmap& bitmap, + wxRibbonButtonKind kind, + long state) = 0; + + virtual void DrawToggleButton( + wxDC& dc, + wxRibbonBar* wnd, + const wxRect& rect, + wxRibbonDisplayMode mode) = 0; + + virtual void DrawHelpButton( + wxDC& dc, + wxRibbonBar* wnd, + const wxRect& rect) = 0; + + virtual void GetBarTabWidth( + wxDC& dc, + wxWindow* wnd, + const wxString& label, + const wxBitmap& bitmap, + int* ideal, + int* small_begin_need_separator, + int* small_must_have_separator, + int* minimum) = 0; + + virtual int GetTabCtrlHeight( + wxDC& dc, + wxWindow* wnd, + const wxRibbonPageTabInfoArray& pages) = 0; + + virtual wxSize GetScrollButtonMinimumSize( + wxDC& dc, + wxWindow* wnd, + long style) = 0; + + virtual wxSize GetPanelSize( + wxDC& dc, + const wxRibbonPanel* wnd, + wxSize client_size, + wxPoint* client_offset) = 0; + + virtual wxSize GetPanelClientSize( + wxDC& dc, + const wxRibbonPanel* wnd, + wxSize size, + wxPoint* client_offset) = 0; + + virtual wxRect GetPanelExtButtonArea( + wxDC& dc, + const wxRibbonPanel* wnd, + wxRect rect) = 0; + + virtual wxSize GetGallerySize( + wxDC& dc, + const wxRibbonGallery* wnd, + wxSize client_size) = 0; + + virtual wxSize GetGalleryClientSize( + wxDC& dc, + const wxRibbonGallery* wnd, + wxSize size, + wxPoint* client_offset, + wxRect* scroll_up_button, + wxRect* scroll_down_button, + wxRect* extension_button) = 0; + + virtual wxRect GetPageBackgroundRedrawArea( + wxDC& dc, + const wxRibbonPage* wnd, + wxSize page_old_size, + wxSize page_new_size) = 0; + + virtual bool GetButtonBarButtonSize( + wxDC& dc, + wxWindow* wnd, + wxRibbonButtonKind kind, + wxRibbonButtonBarButtonState size, + const wxString& label, + wxSize bitmap_size_large, + wxSize bitmap_size_small, + wxSize* button_size, + wxRect* normal_region, + wxRect* dropdown_region) = 0; + + virtual wxSize GetMinimisedPanelMinimumSize( + wxDC& dc, + const wxRibbonPanel* wnd, + wxSize* desired_bitmap_size, + wxDirection* expanded_panel_direction) = 0; + + virtual wxSize GetToolSize( + wxDC& dc, + wxWindow* wnd, + wxSize bitmap_size, + wxRibbonButtonKind kind, + bool is_first, + bool is_last, + wxRect* dropdown_region) = 0; + + virtual wxRect GetBarToggleButtonArea(const wxRect& rect)= 0; + + virtual wxRect GetRibbonHelpButtonArea(const wxRect& rect) = 0; +}; + +class WXDLLIMPEXP_RIBBON wxRibbonMSWArtProvider : public wxRibbonArtProvider +{ +public: + wxRibbonMSWArtProvider(bool set_colour_scheme = true); + virtual ~wxRibbonMSWArtProvider(); + + wxRibbonArtProvider* Clone() const; + void SetFlags(long flags); + long GetFlags() const; + + int GetMetric(int id) const; + void SetMetric(int id, int new_val); + void SetFont(int id, const wxFont& font); + wxFont GetFont(int id) const; + wxColour GetColour(int id) const; + void SetColour(int id, const wxColor& colour); + void GetColourScheme(wxColour* primary, + wxColour* secondary, + wxColour* tertiary) const; + void SetColourScheme(const wxColour& primary, + const wxColour& secondary, + const wxColour& tertiary); + + int GetTabCtrlHeight( + wxDC& dc, + wxWindow* wnd, + const wxRibbonPageTabInfoArray& pages); + + void DrawTabCtrlBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxRibbonPageTabInfo& tab); + + void DrawTabSeparator( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect, + double visibility); + + void DrawPageBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawScrollButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect, + long style); + + void DrawPanelBackground( + wxDC& dc, + wxRibbonPanel* wnd, + const wxRect& rect); + + void DrawGalleryBackground( + wxDC& dc, + wxRibbonGallery* wnd, + const wxRect& rect); + + void DrawGalleryItemBackground( + wxDC& dc, + wxRibbonGallery* wnd, + const wxRect& rect, + wxRibbonGalleryItem* item); + + void DrawMinimisedPanel( + wxDC& dc, + wxRibbonPanel* wnd, + const wxRect& rect, + wxBitmap& bitmap); + + void DrawButtonBarBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawButtonBarButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect, + wxRibbonButtonKind kind, + long state, + const wxString& label, + const wxBitmap& bitmap_large, + const wxBitmap& bitmap_small); + + void DrawToolBarBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawToolGroupBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawTool( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect, + const wxBitmap& bitmap, + wxRibbonButtonKind kind, + long state); + + void DrawToggleButton( + wxDC& dc, + wxRibbonBar* wnd, + const wxRect& rect, + wxRibbonDisplayMode mode); + + void DrawHelpButton(wxDC& dc, + wxRibbonBar* wnd, + const wxRect& rect); + + void GetBarTabWidth( + wxDC& dc, + wxWindow* wnd, + const wxString& label, + const wxBitmap& bitmap, + int* ideal, + int* small_begin_need_separator, + int* small_must_have_separator, + int* minimum); + + wxSize GetScrollButtonMinimumSize( + wxDC& dc, + wxWindow* wnd, + long style); + + wxSize GetPanelSize( + wxDC& dc, + const wxRibbonPanel* wnd, + wxSize client_size, + wxPoint* client_offset); + + wxSize GetPanelClientSize( + wxDC& dc, + const wxRibbonPanel* wnd, + wxSize size, + wxPoint* client_offset); + + wxRect GetPanelExtButtonArea( + wxDC& dc, + const wxRibbonPanel* wnd, + wxRect rect); + + wxSize GetGallerySize( + wxDC& dc, + const wxRibbonGallery* wnd, + wxSize client_size); + + wxSize GetGalleryClientSize( + wxDC& dc, + const wxRibbonGallery* wnd, + wxSize size, + wxPoint* client_offset, + wxRect* scroll_up_button, + wxRect* scroll_down_button, + wxRect* extension_button); + + wxRect GetPageBackgroundRedrawArea( + wxDC& dc, + const wxRibbonPage* wnd, + wxSize page_old_size, + wxSize page_new_size); + + bool GetButtonBarButtonSize( + wxDC& dc, + wxWindow* wnd, + wxRibbonButtonKind kind, + wxRibbonButtonBarButtonState size, + const wxString& label, + wxSize bitmap_size_large, + wxSize bitmap_size_small, + wxSize* button_size, + wxRect* normal_region, + wxRect* dropdown_region); + + wxSize GetMinimisedPanelMinimumSize( + wxDC& dc, + const wxRibbonPanel* wnd, + wxSize* desired_bitmap_size, + wxDirection* expanded_panel_direction); + + wxSize GetToolSize( + wxDC& dc, + wxWindow* wnd, + wxSize bitmap_size, + wxRibbonButtonKind kind, + bool is_first, + bool is_last, + wxRect* dropdown_region); + + wxRect GetBarToggleButtonArea(const wxRect& rect); + + wxRect GetRibbonHelpButtonArea(const wxRect& rect); + +protected: + void ReallyDrawTabSeparator(wxWindow* wnd, const wxRect& rect, double visibility); + void DrawPartialPageBackground(wxDC& dc, wxWindow* wnd, const wxRect& rect, + bool allow_hovered = true); + void DrawPartialPageBackground(wxDC& dc, wxWindow* wnd, const wxRect& rect, + wxRibbonPage* page, wxPoint offset, bool hovered = false); + void DrawPanelBorder(wxDC& dc, const wxRect& rect, wxPen& primary_colour, + wxPen& secondary_colour); + void RemovePanelPadding(wxRect* rect); + void DrawDropdownArrow(wxDC& dc, int x, int y, const wxColour& colour); + void DrawGalleryBackgroundCommon(wxDC& dc, wxRibbonGallery* wnd, + const wxRect& rect); + virtual void DrawGalleryButton(wxDC& dc, wxRect rect, + wxRibbonGalleryButtonState state, wxBitmap* bitmaps); + void DrawButtonBarButtonForeground( + wxDC& dc, + const wxRect& rect, + wxRibbonButtonKind kind, + long state, + const wxString& label, + const wxBitmap& bitmap_large, + const wxBitmap& bitmap_small); + void DrawMinimisedPanelCommon( + wxDC& dc, + wxRibbonPanel* wnd, + const wxRect& rect, + wxRect* preview_rect); + void CloneTo(wxRibbonMSWArtProvider* copy) const; + + wxBitmap m_cached_tab_separator; + wxBitmap m_gallery_up_bitmap[4]; + wxBitmap m_gallery_down_bitmap[4]; + wxBitmap m_gallery_extension_bitmap[4]; + wxBitmap m_toolbar_drop_bitmap; + wxBitmap m_panel_extension_bitmap[2]; + wxBitmap m_ribbon_toggle_up_bitmap[2]; + wxBitmap m_ribbon_toggle_down_bitmap[2]; + wxBitmap m_ribbon_toggle_pin_bitmap[2]; + wxBitmap m_ribbon_bar_help_button_bitmap[2]; + + wxColour m_primary_scheme_colour; + wxColour m_secondary_scheme_colour; + wxColour m_tertiary_scheme_colour; + + wxColour m_button_bar_label_colour; + wxColour m_button_bar_label_disabled_colour; + wxColour m_tab_label_colour; + wxColour m_tab_separator_colour; + wxColour m_tab_separator_gradient_colour; + wxColour m_tab_active_background_colour; + wxColour m_tab_active_background_gradient_colour; + wxColour m_tab_hover_background_colour; + wxColour m_tab_hover_background_gradient_colour; + wxColour m_tab_hover_background_top_colour; + wxColour m_tab_hover_background_top_gradient_colour; + wxColour m_panel_label_colour; + wxColour m_panel_minimised_label_colour; + wxColour m_panel_hover_label_colour; + wxColour m_panel_active_background_colour; + wxColour m_panel_active_background_gradient_colour; + wxColour m_panel_active_background_top_colour; + wxColour m_panel_active_background_top_gradient_colour; + wxColour m_panel_button_face_colour; + wxColour m_panel_button_hover_face_colour; + wxColour m_page_toggle_face_colour; + wxColour m_page_toggle_hover_face_colour; + wxColour m_page_background_colour; + wxColour m_page_background_gradient_colour; + wxColour m_page_background_top_colour; + wxColour m_page_background_top_gradient_colour; + wxColour m_page_hover_background_colour; + wxColour m_page_hover_background_gradient_colour; + wxColour m_page_hover_background_top_colour; + wxColour m_page_hover_background_top_gradient_colour; + wxColour m_button_bar_hover_background_colour; + wxColour m_button_bar_hover_background_gradient_colour; + wxColour m_button_bar_hover_background_top_colour; + wxColour m_button_bar_hover_background_top_gradient_colour; + wxColour m_button_bar_active_background_colour; + wxColour m_button_bar_active_background_gradient_colour; + wxColour m_button_bar_active_background_top_colour; + wxColour m_button_bar_active_background_top_gradient_colour; + wxColour m_gallery_button_background_colour; + wxColour m_gallery_button_background_gradient_colour; + wxColour m_gallery_button_hover_background_colour; + wxColour m_gallery_button_hover_background_gradient_colour; + wxColour m_gallery_button_active_background_colour; + wxColour m_gallery_button_active_background_gradient_colour; + wxColour m_gallery_button_disabled_background_colour; + wxColour m_gallery_button_disabled_background_gradient_colour; + wxColour m_gallery_button_face_colour; + wxColour m_gallery_button_hover_face_colour; + wxColour m_gallery_button_active_face_colour; + wxColour m_gallery_button_disabled_face_colour; + + wxColour m_tool_face_colour; + wxColour m_tool_background_top_colour; + wxColour m_tool_background_top_gradient_colour; + wxColour m_tool_background_colour; + wxColour m_tool_background_gradient_colour; + wxColour m_tool_hover_background_top_colour; + wxColour m_tool_hover_background_top_gradient_colour; + wxColour m_tool_hover_background_colour; + wxColour m_tool_hover_background_gradient_colour; + wxColour m_tool_active_background_top_colour; + wxColour m_tool_active_background_top_gradient_colour; + wxColour m_tool_active_background_colour; + wxColour m_tool_active_background_gradient_colour; + + wxBrush m_tab_ctrl_background_brush; + wxBrush m_panel_label_background_brush; + wxBrush m_panel_hover_label_background_brush; + wxBrush m_panel_hover_button_background_brush; + wxBrush m_gallery_hover_background_brush; + wxBrush m_gallery_button_background_top_brush; + wxBrush m_gallery_button_hover_background_top_brush; + wxBrush m_gallery_button_active_background_top_brush; + wxBrush m_gallery_button_disabled_background_top_brush; + wxBrush m_ribbon_toggle_brush; + + wxFont m_tab_label_font; + wxFont m_panel_label_font; + wxFont m_button_bar_label_font; + + wxPen m_page_border_pen; + wxPen m_panel_border_pen; + wxPen m_panel_border_gradient_pen; + wxPen m_panel_minimised_border_pen; + wxPen m_panel_minimised_border_gradient_pen; + wxPen m_panel_hover_button_border_pen; + wxPen m_tab_border_pen; + wxPen m_button_bar_hover_border_pen; + wxPen m_button_bar_active_border_pen; + wxPen m_gallery_border_pen; + wxPen m_gallery_item_border_pen; + wxPen m_toolbar_border_pen; + wxPen m_ribbon_toggle_pen; + + double m_cached_tab_separator_visibility; + long m_flags; + + int m_tab_separation_size; + int m_page_border_left; + int m_page_border_top; + int m_page_border_right; + int m_page_border_bottom; + int m_panel_x_separation_size; + int m_panel_y_separation_size; + int m_tool_group_separation_size; + int m_gallery_bitmap_padding_left_size; + int m_gallery_bitmap_padding_right_size; + int m_gallery_bitmap_padding_top_size; + int m_gallery_bitmap_padding_bottom_size; + int m_toggle_button_offset; + int m_help_button_offset; +}; + +class WXDLLIMPEXP_RIBBON wxRibbonAUIArtProvider : public wxRibbonMSWArtProvider +{ +public: + wxRibbonAUIArtProvider(); + virtual ~wxRibbonAUIArtProvider(); + + wxRibbonArtProvider* Clone() const; + + wxColour GetColour(int id) const; + void SetColour(int id, const wxColor& colour); + void SetColourScheme(const wxColour& primary, + const wxColour& secondary, + const wxColour& tertiary); + void SetFont(int id, const wxFont& font); + + wxSize GetScrollButtonMinimumSize( + wxDC& dc, + wxWindow* wnd, + long style); + + void DrawScrollButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect, + long style); + + wxSize GetPanelSize( + wxDC& dc, + const wxRibbonPanel* wnd, + wxSize client_size, + wxPoint* client_offset); + + wxSize GetPanelClientSize( + wxDC& dc, + const wxRibbonPanel* wnd, + wxSize size, + wxPoint* client_offset); + + wxRect GetPanelExtButtonArea( + wxDC& dc, + const wxRibbonPanel* wnd, + wxRect rect); + + void DrawTabCtrlBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + int GetTabCtrlHeight( + wxDC& dc, + wxWindow* wnd, + const wxRibbonPageTabInfoArray& pages); + + void GetBarTabWidth( + wxDC& dc, + wxWindow* wnd, + const wxString& label, + const wxBitmap& bitmap, + int* ideal, + int* small_begin_need_separator, + int* small_must_have_separator, + int* minimum); + + void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxRibbonPageTabInfo& tab); + + void DrawTabSeparator( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect, + double visibility); + + void DrawPageBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawPanelBackground( + wxDC& dc, + wxRibbonPanel* wnd, + const wxRect& rect); + + void DrawMinimisedPanel( + wxDC& dc, + wxRibbonPanel* wnd, + const wxRect& rect, + wxBitmap& bitmap); + + void DrawGalleryBackground( + wxDC& dc, + wxRibbonGallery* wnd, + const wxRect& rect); + + void DrawGalleryItemBackground( + wxDC& dc, + wxRibbonGallery* wnd, + const wxRect& rect, + wxRibbonGalleryItem* item); + + void DrawButtonBarBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawButtonBarButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect, + wxRibbonButtonKind kind, + long state, + const wxString& label, + const wxBitmap& bitmap_large, + const wxBitmap& bitmap_small); + + void DrawToolBarBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawToolGroupBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawTool( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect, + const wxBitmap& bitmap, + wxRibbonButtonKind kind, + long state); + +protected: + void DrawPartialPanelBackground(wxDC& dc, wxWindow* wnd, + const wxRect& rect); + void DrawGalleryButton(wxDC& dc, wxRect rect, + wxRibbonGalleryButtonState state, wxBitmap* bitmaps); + + wxColour m_tab_ctrl_background_colour; + wxColour m_tab_ctrl_background_gradient_colour; + wxColour m_panel_label_background_colour; + wxColour m_panel_label_background_gradient_colour; + wxColour m_panel_hover_label_background_colour; + wxColour m_panel_hover_label_background_gradient_colour; + + wxBrush m_background_brush; + wxBrush m_tab_active_top_background_brush; + wxBrush m_tab_hover_background_brush; + wxBrush m_button_bar_hover_background_brush; + wxBrush m_button_bar_active_background_brush; + wxBrush m_gallery_button_active_background_brush; + wxBrush m_gallery_button_hover_background_brush; + wxBrush m_gallery_button_disabled_background_brush; + wxBrush m_tool_hover_background_brush; + wxBrush m_tool_active_background_brush; + + wxPen m_toolbar_hover_borden_pen; + + wxFont m_tab_active_label_font; +}; + +#if defined(__WXMSW__) +typedef wxRibbonMSWArtProvider wxRibbonDefaultArtProvider; +#elif defined(__WXOSX_CARBON__) || \ + defined(__WXOSX_COCOA__) || \ + defined(__WXOSX_IPHONE__) || \ + defined(__WXCOCOA__) +// TODO: Once implemented, change typedef to OSX +// typedef wxRibbonOSXArtProvider wxRibbonDefaultArtProvider; +typedef wxRibbonAUIArtProvider wxRibbonDefaultArtProvider; +#else +// TODO: Once implemented, change typedef to AUI +typedef wxRibbonAUIArtProvider wxRibbonDefaultArtProvider; +#endif + +#endif // wxUSE_RIBBON + +#endif // _WX_RIBBON_ART_H_ diff --git a/wxmsw/include/wx-3.0/wx/ribbon/art_internal.h b/wxmsw/include/wx-3.0/wx/ribbon/art_internal.h new file mode 100644 index 00000000..879b22d8 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ribbon/art_internal.h @@ -0,0 +1,81 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ribbon/art_internal.h +// Purpose: Helper functions & classes used by ribbon art providers +// Author: Peter Cawley +// Modified by: +// Created: 2009-08-04 +// Copyright: (C) Peter Cawley +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RIBBON_ART_INTERNAL_H_ +#define _WX_RIBBON_ART_INTERNAL_H_ + +#include "wx/defs.h" + +#if wxUSE_RIBBON + +WXDLLIMPEXP_RIBBON wxColour wxRibbonInterpolateColour( + const wxColour& start_colour, + const wxColour& end_colour, + int position, + int start_position, + int end_position); + +WXDLLIMPEXP_RIBBON bool wxRibbonCanLabelBreakAtPosition( + const wxString& label, + size_t pos); + +WXDLLIMPEXP_RIBBON void wxRibbonDrawParallelGradientLines( + wxDC& dc, + int nlines, + const wxPoint* line_origins, + int stepx, + int stepy, + int numsteps, + int offset_x, + int offset_y, + const wxColour& start_colour, + const wxColour& end_colour); + +WXDLLIMPEXP_RIBBON wxBitmap wxRibbonLoadPixmap( + const char* const* bits, + wxColour fore); + +/* + HSL colour class, using interface as discussed in wx-dev. Provided mainly + for art providers to perform colour scheme calculations in the HSL colour + space. If such a class makes it into base / core, then this class should be + removed and users switched over to the one in base / core. + + 0.0 <= Hue < 360.0 + 0.0 <= Saturation <= 1.0 + 0.0 <= Luminance <= 1.0 +*/ +class WXDLLIMPEXP_RIBBON wxRibbonHSLColour +{ +public: + wxRibbonHSLColour() + : hue(0.0), saturation(0.0), luminance(0.0) {} + wxRibbonHSLColour(float H, float S, float L) + : hue(H), saturation(S), luminance(L) { } + wxRibbonHSLColour(const wxColour& C); + + wxColour ToRGB() const; + + wxRibbonHSLColour& MakeDarker(float delta); + wxRibbonHSLColour Darker(float delta) const; + wxRibbonHSLColour Lighter(float delta) const; + wxRibbonHSLColour Saturated(float delta) const; + wxRibbonHSLColour Desaturated(float delta) const; + wxRibbonHSLColour ShiftHue(float delta) const; + + float hue, saturation, luminance; +}; + +WXDLLIMPEXP_RIBBON wxRibbonHSLColour wxRibbonShiftLuminance( + wxRibbonHSLColour colour, float amount); + +#endif // wxUSE_RIBBON + +#endif // _WX_RIBBON_ART_INTERNAL_H_ diff --git a/wxmsw/include/wx-3.0/wx/ribbon/bar.h b/wxmsw/include/wx-3.0/wx/ribbon/bar.h new file mode 100644 index 00000000..2b454543 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ribbon/bar.h @@ -0,0 +1,296 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ribbon/bar.h +// Purpose: Top-level component of the ribbon-bar-style interface +// Author: Peter Cawley +// Modified by: +// Created: 2009-05-23 +// Copyright: (C) Peter Cawley +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RIBBON_BAR_H_ +#define _WX_RIBBON_BAR_H_ + +#include "wx/defs.h" + +#if wxUSE_RIBBON + +#include "wx/ribbon/control.h" +#include "wx/ribbon/page.h" + +enum wxRibbonBarOption +{ + wxRIBBON_BAR_SHOW_PAGE_LABELS = 1 << 0, + wxRIBBON_BAR_SHOW_PAGE_ICONS = 1 << 1, + wxRIBBON_BAR_FLOW_HORIZONTAL = 0, + wxRIBBON_BAR_FLOW_VERTICAL = 1 << 2, + wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS = 1 << 3, + wxRIBBON_BAR_SHOW_PANEL_MINIMISE_BUTTONS = 1 << 4, + wxRIBBON_BAR_ALWAYS_SHOW_TABS = 1 << 5, + wxRIBBON_BAR_SHOW_TOGGLE_BUTTON = 1 << 6, + wxRIBBON_BAR_SHOW_HELP_BUTTON = 1 << 7, + + wxRIBBON_BAR_DEFAULT_STYLE = wxRIBBON_BAR_FLOW_HORIZONTAL + | wxRIBBON_BAR_SHOW_PAGE_LABELS + | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS + | wxRIBBON_BAR_SHOW_TOGGLE_BUTTON + | wxRIBBON_BAR_SHOW_HELP_BUTTON, + + wxRIBBON_BAR_FOLDBAR_STYLE = wxRIBBON_BAR_FLOW_VERTICAL + | wxRIBBON_BAR_SHOW_PAGE_ICONS + | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS + | wxRIBBON_BAR_SHOW_PANEL_MINIMISE_BUTTONS +}; + +enum wxRibbonDisplayMode +{ + wxRIBBON_BAR_PINNED, + wxRIBBON_BAR_MINIMIZED, + wxRIBBON_BAR_EXPANDED +}; + +class WXDLLIMPEXP_RIBBON wxRibbonBarEvent : public wxNotifyEvent +{ +public: + wxRibbonBarEvent(wxEventType command_type = wxEVT_NULL, + int win_id = 0, + wxRibbonPage* page = NULL) + : wxNotifyEvent(command_type, win_id) + , m_page(page) + { + } +#ifndef SWIG + wxRibbonBarEvent(const wxRibbonBarEvent& c) : wxNotifyEvent(c) + { + m_page = c.m_page; + } +#endif + wxEvent *Clone() const { return new wxRibbonBarEvent(*this); } + + wxRibbonPage* GetPage() {return m_page;} + void SetPage(wxRibbonPage* page) {m_page = page;} + +protected: + wxRibbonPage* m_page; + +#ifndef SWIG +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxRibbonBarEvent) +#endif +}; + +class WXDLLIMPEXP_RIBBON wxRibbonPageTabInfo +{ +public: + wxRect rect; + wxRibbonPage *page; + int ideal_width; + int small_begin_need_separator_width; + int small_must_have_separator_width; + int minimum_width; + bool active; + bool hovered; + bool highlight; + bool shown; +}; + +#ifndef SWIG +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxRibbonPageTabInfo, wxRibbonPageTabInfoArray, WXDLLIMPEXP_RIBBON); +#endif + +class WXDLLIMPEXP_RIBBON wxRibbonBar : public wxRibbonControl +{ +public: + wxRibbonBar(); + + wxRibbonBar(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxRIBBON_BAR_DEFAULT_STYLE); + + virtual ~wxRibbonBar(); + + bool Create(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxRIBBON_BAR_DEFAULT_STYLE); + + void SetTabCtrlMargins(int left, int right); + + void SetArtProvider(wxRibbonArtProvider* art); + + bool SetActivePage(size_t page); + bool SetActivePage(wxRibbonPage* page); + int GetActivePage() const; + wxRibbonPage* GetPage(int n); + size_t GetPageCount() const; + bool DismissExpandedPanel(); + int GetPageNumber(wxRibbonPage* page) const; + + void DeletePage(size_t n); + void ClearPages(); + + bool IsPageShown(size_t page) const; + void ShowPage(size_t page, bool show = true); + void HidePage(size_t page) { ShowPage(page, false); } + + bool IsPageHighlighted(size_t page) const; + void AddPageHighlight(size_t page, bool highlight = true); + void RemovePageHighlight(size_t page) { AddPageHighlight(page, false); } + + void ShowPanels(bool show = true); + void HidePanels() { ShowPanels(false); } + bool ArePanelsShown() const { return m_arePanelsShown; } + + virtual bool HasMultiplePages() const { return true; } + + void SetWindowStyleFlag(long style); + long GetWindowStyleFlag() const; + virtual bool Realize(); + + // Implementation only. + bool IsToggleButtonHovered() const { return m_toggle_button_hovered; } + bool IsHelpButtonHovered() const { return m_help_button_hovered; } + + void HideIfExpanded(); + +protected: + friend class wxRibbonPage; + + virtual wxSize DoGetBestSize() const; + wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + wxRibbonPageTabInfo* HitTestTabs(wxPoint position, int* index = NULL); + void HitTestRibbonButton(const wxRect& rect, const wxPoint& position, bool &hover_flag); + + void CommonInit(long style); + void AddPage(wxRibbonPage *page); + void RecalculateTabSizes(); + void RecalculateMinSize(); + void ScrollTabBar(int npixels); + void RefreshTabBar(); + void RepositionPage(wxRibbonPage *page); + + void OnPaint(wxPaintEvent& evt); + void OnEraseBackground(wxEraseEvent& evt); + void DoEraseBackground(wxDC& dc); + void OnSize(wxSizeEvent& evt); + void OnMouseLeftDown(wxMouseEvent& evt); + void OnMouseLeftUp(wxMouseEvent& evt); + void OnMouseMiddleDown(wxMouseEvent& evt); + void OnMouseMiddleUp(wxMouseEvent& evt); + void OnMouseRightDown(wxMouseEvent& evt); + void OnMouseRightUp(wxMouseEvent& evt); + void OnMouseMove(wxMouseEvent& evt); + void OnMouseLeave(wxMouseEvent& evt); + void OnMouseDoubleClick(wxMouseEvent& evt); + void DoMouseButtonCommon(wxMouseEvent& evt, wxEventType tab_event_type); + void OnKillFocus(wxFocusEvent& evt); + + wxRibbonPageTabInfoArray m_pages; + wxRect m_tab_scroll_left_button_rect; + wxRect m_tab_scroll_right_button_rect; + wxRect m_toggle_button_rect; + wxRect m_help_button_rect; + long m_flags; + int m_tabs_total_width_ideal; + int m_tabs_total_width_minimum; + int m_tab_margin_left; + int m_tab_margin_right; + int m_tab_height; + int m_tab_scroll_amount; + int m_current_page; + int m_current_hovered_page; + int m_tab_scroll_left_button_state; + int m_tab_scroll_right_button_state; + bool m_tab_scroll_buttons_shown; + bool m_arePanelsShown; + bool m_bar_hovered; + bool m_toggle_button_hovered; + bool m_help_button_hovered; + + wxRibbonDisplayMode m_ribbon_state; + +#ifndef SWIG + DECLARE_CLASS(wxRibbonBar) + DECLARE_EVENT_TABLE() +#endif +}; + +#ifndef SWIG + +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONBAR_PAGE_CHANGED, wxRibbonBarEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONBAR_PAGE_CHANGING, wxRibbonBarEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONBAR_TAB_MIDDLE_DOWN, wxRibbonBarEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONBAR_TAB_MIDDLE_UP, wxRibbonBarEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONBAR_TAB_RIGHT_DOWN, wxRibbonBarEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONBAR_TAB_RIGHT_UP, wxRibbonBarEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONBAR_TAB_LEFT_DCLICK, wxRibbonBarEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONBAR_TOGGLED, wxRibbonBarEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONBAR_HELP_CLICK, wxRibbonBarEvent); + +typedef void (wxEvtHandler::*wxRibbonBarEventFunction)(wxRibbonBarEvent&); + +#define wxRibbonBarEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxRibbonBarEventFunction, func) + +#define EVT_RIBBONBAR_PAGE_CHANGED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONBAR_PAGE_CHANGED, winid, wxRibbonBarEventHandler(fn)) +#define EVT_RIBBONBAR_PAGE_CHANGING(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONBAR_PAGE_CHANGING, winid, wxRibbonBarEventHandler(fn)) +#define EVT_RIBBONBAR_TAB_MIDDLE_DOWN(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONBAR_TAB_MIDDLE_DOWN, winid, wxRibbonBarEventHandler(fn)) +#define EVT_RIBBONBAR_TAB_MIDDLE_UP(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONBAR_TAB_MIDDLE_UP, winid, wxRibbonBarEventHandler(fn)) +#define EVT_RIBBONBAR_TAB_RIGHT_DOWN(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONBAR_TAB_RIGHT_DOWN, winid, wxRibbonBarEventHandler(fn)) +#define EVT_RIBBONBAR_TAB_RIGHT_UP(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONBAR_TAB_RIGHT_UP, winid, wxRibbonBarEventHandler(fn)) +#define EVT_RIBBONBAR_TAB_LEFT_DCLICK(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONBAR_TAB_LEFT_DCLICK, winid, wxRibbonBarEventHandler(fn)) +#define EVT_RIBBONBAR_TOGGLED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONBAR_TOGGLED, winid, wxRibbonBarEventHandler(fn)) +#define EVT_RIBBONBAR_HELP_CLICK(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONBAR_HELP_CLICK, winid, wxRibbonBarEventHandler(fn)) +#else + +// wxpython/swig event work +%constant wxEventType wxEVT_RIBBONBAR_PAGE_CHANGED; +%constant wxEventType wxEVT_RIBBONBAR_PAGE_CHANGING; +%constant wxEventType wxEVT_RIBBONBAR_TAB_MIDDLE_DOWN; +%constant wxEventType wxEVT_RIBBONBAR_TAB_MIDDLE_UP; +%constant wxEventType wxEVT_RIBBONBAR_TAB_RIGHT_DOWN; +%constant wxEventType wxEVT_RIBBONBAR_TAB_RIGHT_UP; +%constant wxEventType wxEVT_RIBBONBAR_TAB_LEFT_DCLICK; +%constant wxEventType wxEVT_RIBBONBAR_TOGGLED; +%constant wxEventType wxEVT_RIBBONBAR_HELP_CLICK; + +%pythoncode { + EVT_RIBBONBAR_PAGE_CHANGED = wx.PyEventBinder( wxEVT_RIBBONBAR_PAGE_CHANGED, 1 ) + EVT_RIBBONBAR_PAGE_CHANGING = wx.PyEventBinder( wxEVT_RIBBONBAR_PAGE_CHANGING, 1 ) + EVT_RIBBONBAR_TAB_MIDDLE_DOWN = wx.PyEventBinder( wxEVT_RIBBONBAR_TAB_MIDDLE_DOWN, 1 ) + EVT_RIBBONBAR_TAB_MIDDLE_UP = wx.PyEventBinder( wxEVT_RIBBONBAR_TAB_MIDDLE_UP, 1 ) + EVT_RIBBONBAR_TAB_RIGHT_DOWN = wx.PyEventBinder( wxEVT_RIBBONBAR_TAB_RIGHT_DOWN, 1 ) + EVT_RIBBONBAR_TAB_RIGHT_UP = wx.PyEventBinder( wxEVT_RIBBONBAR_TAB_RIGHT_UP, 1 ) + EVT_RIBBONBAR_TAB_LEFT_DCLICK = wx.PyEventBinder( wxEVT_RIBBONBAR_TAB_LEFT_DCLICK, 1 ) + EVT_RIBBONBAR_TOGGLED = wx.PyEventBinder( wxEVT_RIBBONBAR_TOGGLED, 1 ) + EVT_RIBBONBAR_HELP_CLICK = wx.PyEventBinder( wxEVT_RIBBONBAR_HELP_CLICK, 1 ) +} +#endif + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_RIBBONBAR_PAGE_CHANGED wxEVT_RIBBONBAR_PAGE_CHANGED +#define wxEVT_COMMAND_RIBBONBAR_PAGE_CHANGING wxEVT_RIBBONBAR_PAGE_CHANGING +#define wxEVT_COMMAND_RIBBONBAR_TAB_MIDDLE_DOWN wxEVT_RIBBONBAR_TAB_MIDDLE_DOWN +#define wxEVT_COMMAND_RIBBONBAR_TAB_MIDDLE_UP wxEVT_RIBBONBAR_TAB_MIDDLE_UP +#define wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_DOWN wxEVT_RIBBONBAR_TAB_RIGHT_DOWN +#define wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP wxEVT_RIBBONBAR_TAB_RIGHT_UP +#define wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK wxEVT_RIBBONBAR_TAB_LEFT_DCLICK +#define wxEVT_COMMAND_RIBBONBAR_TOGGLED wxEVT_RIBBONBAR_TOGGLED +#define wxEVT_COMMAND_RIBBONBAR_HELP_CLICKED wxEVT_RIBBONBAR_HELP_CLICK + +#endif // wxUSE_RIBBON + +#endif // _WX_RIBBON_BAR_H_ + diff --git a/wxmsw/include/wx-3.0/wx/ribbon/buttonbar.h b/wxmsw/include/wx-3.0/wx/ribbon/buttonbar.h new file mode 100644 index 00000000..ab637a10 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ribbon/buttonbar.h @@ -0,0 +1,268 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ribbon/buttonbar.h +// Purpose: Ribbon control similar to a tool bar +// Author: Peter Cawley +// Modified by: +// Created: 2009-07-01 +// Copyright: (C) Peter Cawley +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// +#ifndef _WX_RIBBON_BUTTON_BAR_H_ +#define _WX_RIBBON_BUTTON_BAR_H_ + +#include "wx/defs.h" + +#if wxUSE_RIBBON + +#include "wx/ribbon/art.h" +#include "wx/ribbon/control.h" +#include "wx/dynarray.h" + +class wxRibbonButtonBarButtonBase; +class wxRibbonButtonBarLayout; +class wxRibbonButtonBarButtonInstance; + +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxRibbonButtonBarLayout*, wxArrayRibbonButtonBarLayout, class WXDLLIMPEXP_RIBBON); +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxRibbonButtonBarButtonBase*, wxArrayRibbonButtonBarButtonBase, class WXDLLIMPEXP_RIBBON); + +class WXDLLIMPEXP_RIBBON wxRibbonButtonBar : public wxRibbonControl +{ +public: + wxRibbonButtonBar(); + + wxRibbonButtonBar(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0); + + virtual ~wxRibbonButtonBar(); + + bool Create(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0); + + virtual wxRibbonButtonBarButtonBase* AddButton( + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxString& help_string, + wxRibbonButtonKind kind = wxRIBBON_BUTTON_NORMAL); + // NB: help_string cannot be optional as that would cause the signature + // to be identical to the full version of AddButton when 3 arguments are + // given. + + virtual wxRibbonButtonBarButtonBase* AddDropdownButton( + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxString& help_string = wxEmptyString); + + virtual wxRibbonButtonBarButtonBase* AddHybridButton( + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxString& help_string = wxEmptyString); + + virtual wxRibbonButtonBarButtonBase* AddToggleButton( + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxString& help_string = wxEmptyString); + + virtual wxRibbonButtonBarButtonBase* AddButton( + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& bitmap_small = wxNullBitmap, + const wxBitmap& bitmap_disabled = wxNullBitmap, + const wxBitmap& bitmap_small_disabled = wxNullBitmap, + wxRibbonButtonKind kind = wxRIBBON_BUTTON_NORMAL, + const wxString& help_string = wxEmptyString); + + virtual wxRibbonButtonBarButtonBase* InsertButton( + size_t pos, + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxString& help_string, + wxRibbonButtonKind kind = wxRIBBON_BUTTON_NORMAL); + + virtual wxRibbonButtonBarButtonBase* InsertDropdownButton( + size_t pos, + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxString& help_string = wxEmptyString); + + virtual wxRibbonButtonBarButtonBase* InsertHybridButton( + size_t pos, + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxString& help_string = wxEmptyString); + + virtual wxRibbonButtonBarButtonBase* InsertToggleButton( + size_t pos, + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxString& help_string = wxEmptyString); + + virtual wxRibbonButtonBarButtonBase* InsertButton( + size_t pos, + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& bitmap_small = wxNullBitmap, + const wxBitmap& bitmap_disabled = wxNullBitmap, + const wxBitmap& bitmap_small_disabled = wxNullBitmap, + wxRibbonButtonKind kind = wxRIBBON_BUTTON_NORMAL, + const wxString& help_string = wxEmptyString); + + void SetItemClientObject(wxRibbonButtonBarButtonBase* item, wxClientData* data); + wxClientData* GetItemClientObject(const wxRibbonButtonBarButtonBase* item) const; + void SetItemClientData(wxRibbonButtonBarButtonBase* item, void* data); + void* GetItemClientData(const wxRibbonButtonBarButtonBase* item) const; + + virtual size_t GetButtonCount() const; + virtual wxRibbonButtonBarButtonBase *GetItem(size_t n) const; + virtual wxRibbonButtonBarButtonBase *GetItemById(int id) const; + virtual int GetItemId(wxRibbonButtonBarButtonBase *button) const; + + + virtual bool Realize(); + virtual void ClearButtons(); + virtual bool DeleteButton(int button_id); + virtual void EnableButton(int button_id, bool enable = true); + virtual void ToggleButton(int button_id, bool checked); + + virtual wxRibbonButtonBarButtonBase *GetActiveItem() const; + virtual wxRibbonButtonBarButtonBase *GetHoveredItem() const; + + virtual void SetArtProvider(wxRibbonArtProvider* art); + virtual bool IsSizingContinuous() const; + + virtual wxSize GetMinSize() const; + + void SetShowToolTipsForDisabled(bool show); + bool GetShowToolTipsForDisabled() const; + +protected: + friend class wxRibbonButtonBarEvent; + virtual wxSize DoGetBestSize() const; + wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + void OnEraseBackground(wxEraseEvent& evt); + void OnPaint(wxPaintEvent& evt); + void OnSize(wxSizeEvent& evt); + void OnMouseMove(wxMouseEvent& evt); + void OnMouseEnter(wxMouseEvent& evt); + void OnMouseLeave(wxMouseEvent& evt); + void OnMouseDown(wxMouseEvent& evt); + void OnMouseUp(wxMouseEvent& evt); + + virtual wxSize DoGetNextSmallerSize(wxOrientation direction, + wxSize relative_to) const; + virtual wxSize DoGetNextLargerSize(wxOrientation direction, + wxSize relative_to) const; + + void CommonInit(long style); + void MakeLayouts(); + bool TryCollapseLayout(wxRibbonButtonBarLayout* original, size_t first_btn, size_t* last_button); + static wxBitmap MakeResizedBitmap(const wxBitmap& original, wxSize size); + static wxBitmap MakeDisabledBitmap(const wxBitmap& original); + void FetchButtonSizeInfo(wxRibbonButtonBarButtonBase* button, + wxRibbonButtonBarButtonState size, wxDC& dc); + virtual void UpdateWindowUI(long flags); + + wxArrayRibbonButtonBarLayout m_layouts; + wxArrayRibbonButtonBarButtonBase m_buttons; + wxRibbonButtonBarButtonInstance* m_hovered_button; + wxRibbonButtonBarButtonInstance* m_active_button; + + wxPoint m_layout_offset; + wxSize m_bitmap_size_large; + wxSize m_bitmap_size_small; + int m_current_layout; + bool m_layouts_valid; + bool m_lock_active_state; + bool m_show_tooltips_for_disabled; + +#ifndef SWIG + DECLARE_CLASS(wxRibbonButtonBar) + DECLARE_EVENT_TABLE() +#endif +}; + +class WXDLLIMPEXP_RIBBON wxRibbonButtonBarEvent : public wxCommandEvent +{ +public: + wxRibbonButtonBarEvent(wxEventType command_type = wxEVT_NULL, + int win_id = 0, + wxRibbonButtonBar* bar = NULL, + wxRibbonButtonBarButtonBase* button = NULL) + : wxCommandEvent(command_type, win_id) + , m_bar(bar), m_button(button) + { + } +#ifndef SWIG + wxRibbonButtonBarEvent(const wxRibbonButtonBarEvent& e) : wxCommandEvent(e) + { + m_bar = e.m_bar; + m_button = e.m_button; + } +#endif + wxEvent *Clone() const { return new wxRibbonButtonBarEvent(*this); } + + wxRibbonButtonBar* GetBar() {return m_bar;} + wxRibbonButtonBarButtonBase *GetButton() { return m_button; } + void SetBar(wxRibbonButtonBar* bar) {m_bar = bar;} + void SetButton(wxRibbonButtonBarButtonBase* button) { m_button = button; } + bool PopupMenu(wxMenu* menu); + +protected: + wxRibbonButtonBar* m_bar; + wxRibbonButtonBarButtonBase *m_button; + +#ifndef SWIG +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxRibbonButtonBarEvent) +#endif +}; + +#ifndef SWIG + +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONBUTTONBAR_CLICKED, wxRibbonButtonBarEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED, wxRibbonButtonBarEvent); + +typedef void (wxEvtHandler::*wxRibbonButtonBarEventFunction)(wxRibbonButtonBarEvent&); + +#define wxRibbonButtonBarEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxRibbonButtonBarEventFunction, func) + +#define EVT_RIBBONBUTTONBAR_CLICKED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONBUTTONBAR_CLICKED, winid, wxRibbonButtonBarEventHandler(fn)) +#define EVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED, winid, wxRibbonButtonBarEventHandler(fn)) +#else + +// wxpython/swig event work +%constant wxEventType wxEVT_RIBBONBUTTONBAR_CLICKED; +%constant wxEventType wxEVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED; + +%pythoncode { + EVT_RIBBONBUTTONBAR_CLICKED = wx.PyEventBinder( wxEVT_RIBBONBUTTONBAR_CLICKED, 1 ) + EVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED = wx.PyEventBinder( wxEVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED, 1 ) +} +#endif + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_RIBBONBUTTON_CLICKED wxEVT_RIBBONBUTTONBAR_CLICKED +#define wxEVT_COMMAND_RIBBONBUTTON_DROPDOWN_CLICKED wxEVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED + +#endif // wxUSE_RIBBON + +#endif // _WX_RIBBON_BUTTON_BAR_H_ diff --git a/wxmsw/include/wx-3.0/wx/ribbon/control.h b/wxmsw/include/wx-3.0/wx/ribbon/control.h new file mode 100644 index 00000000..cbd445b8 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ribbon/control.h @@ -0,0 +1,83 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ribbon/control.h +// Purpose: Extension of wxControl with common ribbon methods +// Author: Peter Cawley +// Modified by: +// Created: 2009-06-05 +// Copyright: (C) Peter Cawley +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RIBBON_CONTROL_H_ +#define _WX_RIBBON_CONTROL_H_ + +#include "wx/defs.h" + +#if wxUSE_RIBBON + +#include "wx/control.h" +#include "wx/dynarray.h" + +class wxRibbonBar; +class wxRibbonArtProvider; + +class WXDLLIMPEXP_RIBBON wxRibbonControl : public wxControl +{ +public: + wxRibbonControl() { Init(); } + + wxRibbonControl(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxControlNameStr) + { + Init(); + + Create(parent, id, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxControlNameStr); + + virtual void SetArtProvider(wxRibbonArtProvider* art); + wxRibbonArtProvider* GetArtProvider() const {return m_art;} + + virtual bool IsSizingContinuous() const {return true;} + wxSize GetNextSmallerSize(wxOrientation direction, wxSize relative_to) const; + wxSize GetNextLargerSize(wxOrientation direction, wxSize relative_to) const; + wxSize GetNextSmallerSize(wxOrientation direction) const; + wxSize GetNextLargerSize(wxOrientation direction) const; + + virtual bool Realize(); + bool Realise() {return Realize();} + + virtual wxRibbonBar* GetAncestorRibbonBar()const; + + // Finds the best width and height given the parent's width and height + virtual wxSize GetBestSizeForParentSize(const wxSize& WXUNUSED(parentSize)) const { return GetBestSize(); } + +protected: + wxRibbonArtProvider* m_art; + + virtual wxSize DoGetNextSmallerSize(wxOrientation direction, + wxSize relative_to) const; + virtual wxSize DoGetNextLargerSize(wxOrientation direction, + wxSize relative_to) const; + +private: + void Init() { m_art = NULL; } + +#ifndef SWIG + DECLARE_CLASS(wxRibbonControl) +#endif +}; + +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxRibbonControl*, wxArrayRibbonControl, class WXDLLIMPEXP_RIBBON); + +#endif // wxUSE_RIBBON + +#endif // _WX_RIBBON_CONTROL_H_ diff --git a/wxmsw/include/wx-3.0/wx/ribbon/gallery.h b/wxmsw/include/wx-3.0/wx/ribbon/gallery.h new file mode 100644 index 00000000..665c6942 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ribbon/gallery.h @@ -0,0 +1,196 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ribbon/gallery.h +// Purpose: Ribbon control which displays a gallery of items to choose from +// Author: Peter Cawley +// Modified by: +// Created: 2009-07-22 +// Copyright: (C) Peter Cawley +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// +#ifndef _WX_RIBBON_GALLERY_H_ +#define _WX_RIBBON_GALLERY_H_ + +#include "wx/defs.h" + +#if wxUSE_RIBBON + +#include "wx/ribbon/art.h" +#include "wx/ribbon/control.h" + +class wxRibbonGalleryItem; + +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxRibbonGalleryItem*, wxArrayRibbonGalleryItem, class WXDLLIMPEXP_RIBBON); + +class WXDLLIMPEXP_RIBBON wxRibbonGallery : public wxRibbonControl +{ +public: + wxRibbonGallery(); + + wxRibbonGallery(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0); + + virtual ~wxRibbonGallery(); + + bool Create(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0); + + void Clear(); + + bool IsEmpty() const; + unsigned int GetCount() const; + wxRibbonGalleryItem* GetItem(unsigned int n); + wxRibbonGalleryItem* Append(const wxBitmap& bitmap, int id); + wxRibbonGalleryItem* Append(const wxBitmap& bitmap, int id, void* clientData); + wxRibbonGalleryItem* Append(const wxBitmap& bitmap, int id, wxClientData* clientData); + + void SetItemClientObject(wxRibbonGalleryItem* item, wxClientData* data); + wxClientData* GetItemClientObject(const wxRibbonGalleryItem* item) const; + void SetItemClientData(wxRibbonGalleryItem* item, void* data); + void* GetItemClientData(const wxRibbonGalleryItem* item) const; + + void SetSelection(wxRibbonGalleryItem* item); + wxRibbonGalleryItem* GetSelection() const; + wxRibbonGalleryItem* GetHoveredItem() const; + wxRibbonGalleryItem* GetActiveItem() const; + wxRibbonGalleryButtonState GetUpButtonState() const; + wxRibbonGalleryButtonState GetDownButtonState() const; + wxRibbonGalleryButtonState GetExtensionButtonState() const; + + bool IsHovered() const; + virtual bool IsSizingContinuous() const; + virtual bool Realize(); + virtual bool Layout(); + + virtual bool ScrollLines(int lines); + bool ScrollPixels(int pixels); + void EnsureVisible(const wxRibbonGalleryItem* item); + +protected: + wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + void CommonInit(long style); + void CalculateMinSize(); + bool TestButtonHover(const wxRect& rect, wxPoint pos, + wxRibbonGalleryButtonState* state); + + void OnEraseBackground(wxEraseEvent& evt); + void OnMouseEnter(wxMouseEvent& evt); + void OnMouseMove(wxMouseEvent& evt); + void OnMouseLeave(wxMouseEvent& evt); + void OnMouseDown(wxMouseEvent& evt); + void OnMouseUp(wxMouseEvent& evt); + void OnMouseDClick(wxMouseEvent& evt); + void OnPaint(wxPaintEvent& evt); + void OnSize(wxSizeEvent& evt); + int GetScrollLineSize() const; + + virtual wxSize DoGetBestSize() const; + virtual wxSize DoGetNextSmallerSize(wxOrientation direction, + wxSize relative_to) const; + virtual wxSize DoGetNextLargerSize(wxOrientation direction, + wxSize relative_to) const; + + wxArrayRibbonGalleryItem m_items; + wxRibbonGalleryItem* m_selected_item; + wxRibbonGalleryItem* m_hovered_item; + wxRibbonGalleryItem* m_active_item; + wxSize m_bitmap_size; + wxSize m_bitmap_padded_size; + wxSize m_best_size; + wxRect m_client_rect; + wxRect m_scroll_up_button_rect; + wxRect m_scroll_down_button_rect; + wxRect m_extension_button_rect; + const wxRect* m_mouse_active_rect; + int m_item_separation_x; + int m_item_separation_y; + int m_scroll_amount; + int m_scroll_limit; + wxRibbonGalleryButtonState m_up_button_state; + wxRibbonGalleryButtonState m_down_button_state; + wxRibbonGalleryButtonState m_extension_button_state; + bool m_hovered; + +#ifndef SWIG + DECLARE_CLASS(wxRibbonGallery) + DECLARE_EVENT_TABLE() +#endif +}; + +class WXDLLIMPEXP_RIBBON wxRibbonGalleryEvent : public wxCommandEvent +{ +public: + wxRibbonGalleryEvent(wxEventType command_type = wxEVT_NULL, + int win_id = 0, + wxRibbonGallery* gallery = NULL, + wxRibbonGalleryItem* item = NULL) + : wxCommandEvent(command_type, win_id) + , m_gallery(gallery), m_item(item) + { + } +#ifndef SWIG + wxRibbonGalleryEvent(const wxRibbonGalleryEvent& e) : wxCommandEvent(e) + { + m_gallery = e.m_gallery; + m_item = e.m_item; + } +#endif + wxEvent *Clone() const { return new wxRibbonGalleryEvent(*this); } + + wxRibbonGallery* GetGallery() {return m_gallery;} + wxRibbonGalleryItem* GetGalleryItem() {return m_item;} + void SetGallery(wxRibbonGallery* gallery) {m_gallery = gallery;} + void SetGalleryItem(wxRibbonGalleryItem* item) {m_item = item;} + +protected: + wxRibbonGallery* m_gallery; + wxRibbonGalleryItem* m_item; + +#ifndef SWIG +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxRibbonGalleryEvent) +#endif +}; + +#ifndef SWIG + +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONGALLERY_HOVER_CHANGED, wxRibbonGalleryEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONGALLERY_SELECTED, wxRibbonGalleryEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONGALLERY_CLICKED, wxRibbonGalleryEvent); + +typedef void (wxEvtHandler::*wxRibbonGalleryEventFunction)(wxRibbonGalleryEvent&); + +#define wxRibbonGalleryEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxRibbonGalleryEventFunction, func) + +#define EVT_RIBBONGALLERY_HOVER_CHANGED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONGALLERY_HOVER_CHANGED, winid, wxRibbonGalleryEventHandler(fn)) +#define EVT_RIBBONGALLERY_SELECTED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONGALLERY_SELECTED, winid, wxRibbonGalleryEventHandler(fn)) +#define EVT_RIBBONGALLERY_CLICKED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONGALLERY_CLICKED, winid, wxRibbonGalleryEventHandler(fn)) +#else + +// wxpython/swig event work +%constant wxEventType wxEVT_RIBBONGALLERY_HOVER_CHANGED; +%constant wxEventType wxEVT_RIBBONGALLERY_SELECTED; + +%pythoncode { + EVT_RIBBONGALLERY_HOVER_CHANGED = wx.PyEventBinder( wxEVT_RIBBONGALLERY_HOVER_CHANGED, 1 ) + EVT_RIBBONGALLERY_SELECTED = wx.PyEventBinder( wxEVT_RIBBONGALLERY_SELECTED, 1 ) +} +#endif // SWIG + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_RIBBONGALLERY_HOVER_CHANGED wxEVT_RIBBONGALLERY_HOVER_CHANGED +#define wxEVT_COMMAND_RIBBONGALLERY_SELECTED wxEVT_RIBBONGALLERY_SELECTED +#define wxEVT_COMMAND_RIBBONGALLERY_CLICKED wxEVT_RIBBONGALLERY_CLICKED + +#endif // wxUSE_RIBBON + +#endif // _WX_RIBBON_GALLERY_H_ diff --git a/wxmsw/include/wx-3.0/wx/ribbon/page.h b/wxmsw/include/wx-3.0/wx/ribbon/page.h new file mode 100644 index 00000000..33a96141 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ribbon/page.h @@ -0,0 +1,105 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ribbon/page.h +// Purpose: Container for ribbon-bar-style interface panels +// Author: Peter Cawley +// Modified by: +// Created: 2009-05-25 +// Copyright: (C) Peter Cawley +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RIBBON_PAGE_H_ +#define _WX_RIBBON_PAGE_H_ + +#include "wx/defs.h" + +#if wxUSE_RIBBON + +#include "wx/ribbon/control.h" +#include "wx/ribbon/panel.h" +#include "wx/bitmap.h" + +class wxRibbonBar; +class wxRibbonPageScrollButton; + +class WXDLLIMPEXP_RIBBON wxRibbonPage : public wxRibbonControl +{ +public: + wxRibbonPage(); + + wxRibbonPage(wxRibbonBar* parent, + wxWindowID id = wxID_ANY, + const wxString& label = wxEmptyString, + const wxBitmap& icon = wxNullBitmap, + long style = 0); + + virtual ~wxRibbonPage(); + + bool Create(wxRibbonBar* parent, + wxWindowID id = wxID_ANY, + const wxString& label = wxEmptyString, + const wxBitmap& icon = wxNullBitmap, + long style = 0); + + void SetArtProvider(wxRibbonArtProvider* art); + + wxBitmap& GetIcon() {return m_icon;} + virtual wxSize GetMinSize() const; + void SetSizeWithScrollButtonAdjustment(int x, int y, int width, int height); + void AdjustRectToIncludeScrollButtons(wxRect* rect) const; + + bool DismissExpandedPanel(); + + virtual bool Realize(); + virtual bool Show(bool show = true); + virtual bool Layout(); + virtual bool ScrollLines(int lines); + bool ScrollPixels(int pixels); + bool ScrollSections(int sections); + + wxOrientation GetMajorAxis() const; + + virtual void RemoveChild(wxWindowBase *child); + + void HideIfExpanded(); + +protected: + virtual wxSize DoGetBestSize() const; + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); + bool DoActualLayout(); + void OnEraseBackground(wxEraseEvent& evt); + void OnPaint(wxPaintEvent& evt); + void OnSize(wxSizeEvent& evt); + + bool ExpandPanels(wxOrientation direction, int maximum_amount); + bool CollapsePanels(wxOrientation direction, int minimum_amount); + void ShowScrollButtons(); + void HideScrollButtons(); + + void CommonInit(const wxString& label, const wxBitmap& icon); + void PopulateSizeCalcArray(wxSize (wxWindow::*get_size)(void) const); + + wxArrayRibbonControl m_collapse_stack; + wxBitmap m_icon; + wxSize m_old_size; + // NB: Scroll button windows are siblings rather than children (to get correct clipping of children) + wxRibbonPageScrollButton* m_scroll_left_btn; + wxRibbonPageScrollButton* m_scroll_right_btn; + wxSize* m_size_calc_array; + size_t m_size_calc_array_size; + int m_scroll_amount; + int m_scroll_amount_limit; + int m_size_in_major_axis_for_children; + bool m_scroll_buttons_visible; + +#ifndef SWIG + DECLARE_CLASS(wxRibbonPage) + DECLARE_EVENT_TABLE() +#endif +}; + +#endif // wxUSE_RIBBON + +#endif // _WX_RIBBON_PAGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/ribbon/panel.h b/wxmsw/include/wx-3.0/wx/ribbon/panel.h new file mode 100644 index 00000000..fded272c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ribbon/panel.h @@ -0,0 +1,199 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ribbon/panel.h +// Purpose: Ribbon-style container for a group of related tools / controls +// Author: Peter Cawley +// Modified by: +// Created: 2009-05-25 +// Copyright: (C) Peter Cawley +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// +#ifndef _WX_RIBBON_PANEL_H_ +#define _WX_RIBBON_PANEL_H_ + +#include "wx/defs.h" + +#if wxUSE_RIBBON + +#include "wx/bitmap.h" +#include "wx/ribbon/control.h" + +enum wxRibbonPanelOption +{ + wxRIBBON_PANEL_NO_AUTO_MINIMISE = 1 << 0, + wxRIBBON_PANEL_EXT_BUTTON = 1 << 3, + wxRIBBON_PANEL_MINIMISE_BUTTON = 1 << 4, + wxRIBBON_PANEL_STRETCH = 1 << 5, + wxRIBBON_PANEL_FLEXIBLE = 1 << 6, + + wxRIBBON_PANEL_DEFAULT_STYLE = 0 +}; + +class WXDLLIMPEXP_RIBBON wxRibbonPanel : public wxRibbonControl +{ +public: + wxRibbonPanel(); + + wxRibbonPanel(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxString& label = wxEmptyString, + const wxBitmap& minimised_icon = wxNullBitmap, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxRIBBON_PANEL_DEFAULT_STYLE); + + virtual ~wxRibbonPanel(); + + bool Create(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxString& label = wxEmptyString, + const wxBitmap& icon = wxNullBitmap, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxRIBBON_PANEL_DEFAULT_STYLE); + + wxBitmap& GetMinimisedIcon() {return m_minimised_icon;} + const wxBitmap& GetMinimisedIcon() const {return m_minimised_icon;} + bool IsMinimised() const; + bool IsMinimised(wxSize at_size) const; + bool IsHovered() const; + bool IsExtButtonHovered() const; + bool CanAutoMinimise() const; + + bool ShowExpanded(); + bool HideExpanded(); + + void SetArtProvider(wxRibbonArtProvider* art); + + virtual bool Realize(); + virtual bool Layout(); + virtual wxSize GetMinSize() const; + + virtual bool IsSizingContinuous() const; + + virtual void AddChild(wxWindowBase *child); + virtual void RemoveChild(wxWindowBase *child); + + virtual bool HasExtButton() const; + + wxRibbonPanel* GetExpandedDummy(); + wxRibbonPanel* GetExpandedPanel(); + + // Finds the best width and height given the parent's width and height + virtual wxSize GetBestSizeForParentSize(const wxSize& parentSize) const; + + long GetFlags() { return m_flags; } + + void HideIfExpanded(); + +protected: + virtual wxSize DoGetBestSize() const; + virtual wxSize GetPanelSizerBestSize() const; + wxSize GetPanelSizerMinSize() const; + wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + wxSize GetMinNotMinimisedSize() const; + + virtual wxSize DoGetNextSmallerSize(wxOrientation direction, + wxSize relative_to) const; + virtual wxSize DoGetNextLargerSize(wxOrientation direction, + wxSize relative_to) const; + + void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); + void OnSize(wxSizeEvent& evt); + void OnEraseBackground(wxEraseEvent& evt); + void OnPaint(wxPaintEvent& evt); + void OnMouseEnter(wxMouseEvent& evt); + void OnMouseEnterChild(wxMouseEvent& evt); + void OnMouseLeave(wxMouseEvent& evt); + void OnMouseLeaveChild(wxMouseEvent& evt); + void OnMouseClick(wxMouseEvent& evt); + void OnMotion(wxMouseEvent& evt); + void OnKillFocus(wxFocusEvent& evt); + void OnChildKillFocus(wxFocusEvent& evt); + + void TestPositionForHover(const wxPoint& pos); + bool ShouldSendEventToDummy(wxEvent& evt); + virtual bool TryAfter(wxEvent& evt); + + void CommonInit(const wxString& label, const wxBitmap& icon, long style); + static wxRect GetExpandedPosition(wxRect panel, + wxSize expanded_size, + wxDirection direction); + + wxBitmap m_minimised_icon; + wxBitmap m_minimised_icon_resized; + wxSize m_smallest_unminimised_size; + wxSize m_minimised_size; + wxDirection m_preferred_expand_direction; + wxRibbonPanel* m_expanded_dummy; + wxRibbonPanel* m_expanded_panel; + wxWindow* m_child_with_focus; + long m_flags; + bool m_minimised; + bool m_hovered; + bool m_ext_button_hovered; + wxRect m_ext_button_rect; + +#ifndef SWIG + DECLARE_CLASS(wxRibbonPanel) + DECLARE_EVENT_TABLE() +#endif +}; + + +class WXDLLIMPEXP_RIBBON wxRibbonPanelEvent : public wxCommandEvent +{ +public: + wxRibbonPanelEvent(wxEventType command_type = wxEVT_NULL, + int win_id = 0, + wxRibbonPanel* panel = NULL) + : wxCommandEvent(command_type, win_id) + , m_panel(panel) + { + } +#ifndef SWIG + wxRibbonPanelEvent(const wxRibbonPanelEvent& e) : wxCommandEvent(e) + { + m_panel = e.m_panel; + } +#endif + wxEvent *Clone() const { return new wxRibbonPanelEvent(*this); } + + wxRibbonPanel* GetPanel() {return m_panel;} + void SetPanel(wxRibbonPanel* panel) {m_panel = panel;} + +protected: + wxRibbonPanel* m_panel; + +#ifndef SWIG +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxRibbonPanelEvent) +#endif +}; + +#ifndef SWIG + +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONPANEL_EXTBUTTON_ACTIVATED, wxRibbonPanelEvent); + +typedef void (wxEvtHandler::*wxRibbonPanelEventFunction)(wxRibbonPanelEvent&); + +#define wxRibbonPanelEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxRibbonPanelEventFunction, func) + +#define EVT_RIBBONPANEL_EXTBUTTON_ACTIVATED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONPANEL_EXTBUTTON_ACTIVATED, winid, wxRibbonPanelEventHandler(fn)) +#else + +// wxpython/swig event work +%constant wxEventType wxEVT_RIBBONPANEL_EXTBUTTON_ACTIVATED; + +%pythoncode { + EVT_RIBBONPANEL_EXTBUTTON_ACTIVATED = wx.PyEventBinder( wxEVT_RIBBONPANEL_EXTBUTTON_ACTIVATED, 1 ) +} +#endif + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_RIBBONPANEL_EXTBUTTON_ACTIVATED wxEVT_RIBBONPANEL_EXTBUTTON_ACTIVATED + +#endif // wxUSE_RIBBON + +#endif // _WX_RIBBON_PANEL_H_ diff --git a/wxmsw/include/wx-3.0/wx/ribbon/toolbar.h b/wxmsw/include/wx-3.0/wx/ribbon/toolbar.h new file mode 100644 index 00000000..467de944 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ribbon/toolbar.h @@ -0,0 +1,263 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ribbon/toolbar.h +// Purpose: Ribbon-style tool bar +// Author: Peter Cawley +// Modified by: +// Created: 2009-07-06 +// Copyright: (C) Peter Cawley +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// +#ifndef _WX_RIBBON_TOOLBAR_H_ +#define _WX_RIBBON_TOOLBAR_H_ + +#include "wx/defs.h" + +#if wxUSE_RIBBON + +#include "wx/ribbon/control.h" +#include "wx/ribbon/art.h" + +class wxRibbonToolBarToolBase; +class wxRibbonToolBarToolGroup; +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxRibbonToolBarToolGroup*, wxArrayRibbonToolBarToolGroup, class WXDLLIMPEXP_RIBBON); + +enum wxRibbonToolBarToolState +{ + wxRIBBON_TOOLBAR_TOOL_FIRST = 1 << 0, + wxRIBBON_TOOLBAR_TOOL_LAST = 1 << 1, + wxRIBBON_TOOLBAR_TOOL_POSITION_MASK = wxRIBBON_TOOLBAR_TOOL_FIRST | wxRIBBON_TOOLBAR_TOOL_LAST, + + wxRIBBON_TOOLBAR_TOOL_NORMAL_HOVERED = 1 << 3, + wxRIBBON_TOOLBAR_TOOL_DROPDOWN_HOVERED = 1 << 4, + wxRIBBON_TOOLBAR_TOOL_HOVER_MASK = wxRIBBON_TOOLBAR_TOOL_NORMAL_HOVERED | wxRIBBON_TOOLBAR_TOOL_DROPDOWN_HOVERED, + wxRIBBON_TOOLBAR_TOOL_NORMAL_ACTIVE = 1 << 5, + wxRIBBON_TOOLBAR_TOOL_DROPDOWN_ACTIVE = 1 << 6, + wxRIBBON_TOOLBAR_TOOL_ACTIVE_MASK = wxRIBBON_TOOLBAR_TOOL_NORMAL_ACTIVE | wxRIBBON_TOOLBAR_TOOL_DROPDOWN_ACTIVE, + wxRIBBON_TOOLBAR_TOOL_DISABLED = 1 << 7, + wxRIBBON_TOOLBAR_TOOL_TOGGLED = 1 << 8, + wxRIBBON_TOOLBAR_TOOL_STATE_MASK = 0x1F8 +}; + + +class WXDLLIMPEXP_RIBBON wxRibbonToolBar : public wxRibbonControl +{ +public: + wxRibbonToolBar(); + + wxRibbonToolBar(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0); + + virtual ~wxRibbonToolBar(); + + bool Create(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0); + + virtual wxRibbonToolBarToolBase* AddTool( + int tool_id, + const wxBitmap& bitmap, + const wxString& help_string, + wxRibbonButtonKind kind = wxRIBBON_BUTTON_NORMAL); + + virtual wxRibbonToolBarToolBase* AddDropdownTool( + int tool_id, + const wxBitmap& bitmap, + const wxString& help_string = wxEmptyString); + + virtual wxRibbonToolBarToolBase* AddHybridTool( + int tool_id, + const wxBitmap& bitmap, + const wxString& help_string = wxEmptyString); + + virtual wxRibbonToolBarToolBase* AddToggleTool( + int tool_id, + const wxBitmap& bitmap, + const wxString& help_string = wxEmptyString); + + virtual wxRibbonToolBarToolBase* AddTool( + int tool_id, + const wxBitmap& bitmap, + const wxBitmap& bitmap_disabled = wxNullBitmap, + const wxString& help_string = wxEmptyString, + wxRibbonButtonKind kind = wxRIBBON_BUTTON_NORMAL, + wxObject* client_data = NULL); + + virtual wxRibbonToolBarToolBase* AddSeparator(); + + virtual wxRibbonToolBarToolBase* InsertTool( + size_t pos, + int tool_id, + const wxBitmap& bitmap, + const wxString& help_string, + wxRibbonButtonKind kind = wxRIBBON_BUTTON_NORMAL); + + virtual wxRibbonToolBarToolBase* InsertDropdownTool( + size_t pos, + int tool_id, + const wxBitmap& bitmap, + const wxString& help_string = wxEmptyString); + + virtual wxRibbonToolBarToolBase* InsertHybridTool( + size_t pos, + int tool_id, + const wxBitmap& bitmap, + const wxString& help_string = wxEmptyString); + + virtual wxRibbonToolBarToolBase* InsertToggleTool( + size_t pos, + int tool_id, + const wxBitmap& bitmap, + const wxString& help_string = wxEmptyString); + + virtual wxRibbonToolBarToolBase* InsertTool( + size_t pos, + int tool_id, + const wxBitmap& bitmap, + const wxBitmap& bitmap_disabled = wxNullBitmap, + const wxString& help_string = wxEmptyString, + wxRibbonButtonKind kind = wxRIBBON_BUTTON_NORMAL, + wxObject* client_data = NULL); + + virtual wxRibbonToolBarToolBase* InsertSeparator(size_t pos); + + virtual void ClearTools(); + virtual bool DeleteTool(int tool_id); + virtual bool DeleteToolByPos(size_t pos); + + virtual wxRibbonToolBarToolBase* FindById(int tool_id)const; + virtual wxRibbonToolBarToolBase* GetToolByPos(size_t pos)const; + virtual size_t GetToolCount() const; + virtual int GetToolId(const wxRibbonToolBarToolBase* tool)const; + + virtual wxObject* GetToolClientData(int tool_id)const; + virtual bool GetToolEnabled(int tool_id)const; + virtual wxString GetToolHelpString(int tool_id)const; + virtual wxRibbonButtonKind GetToolKind(int tool_id)const; + virtual int GetToolPos(int tool_id)const; + virtual bool GetToolState(int tool_id)const; + + virtual bool Realize(); + virtual void SetRows(int nMin, int nMax = -1); + + virtual void SetToolClientData(int tool_id, wxObject* clientData); + virtual void SetToolDisabledBitmap(int tool_id, const wxBitmap &bitmap); + virtual void SetToolHelpString(int tool_id, const wxString& helpString); + virtual void SetToolNormalBitmap(int tool_id, const wxBitmap &bitmap); + + virtual bool IsSizingContinuous() const; + + virtual void EnableTool(int tool_id, bool enable = true); + virtual void ToggleTool(int tool_id, bool checked); + + // Finds the best width and height given the parent's width and height + virtual wxSize GetBestSizeForParentSize(const wxSize& parentSize) const; + +protected: + friend class wxRibbonToolBarEvent; + virtual wxSize DoGetBestSize() const; + wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + void OnEraseBackground(wxEraseEvent& evt); + void OnMouseDown(wxMouseEvent& evt); + void OnMouseEnter(wxMouseEvent& evt); + void OnMouseLeave(wxMouseEvent& evt); + void OnMouseMove(wxMouseEvent& evt); + void OnMouseUp(wxMouseEvent& evt); + void OnPaint(wxPaintEvent& evt); + void OnSize(wxSizeEvent& evt); + + virtual wxSize DoGetNextSmallerSize(wxOrientation direction, + wxSize relative_to) const; + virtual wxSize DoGetNextLargerSize(wxOrientation direction, + wxSize relative_to) const; + + void CommonInit(long style); + void AppendGroup(); + wxRibbonToolBarToolGroup* InsertGroup(size_t pos); + virtual void UpdateWindowUI(long flags); + + static wxBitmap MakeDisabledBitmap(const wxBitmap& original); + + wxArrayRibbonToolBarToolGroup m_groups; + wxRibbonToolBarToolBase* m_hover_tool; + wxRibbonToolBarToolBase* m_active_tool; + wxSize* m_sizes; + int m_nrows_min; + int m_nrows_max; + +#ifndef SWIG + DECLARE_CLASS(wxRibbonToolBar) + DECLARE_EVENT_TABLE() +#endif +}; + + +class WXDLLIMPEXP_RIBBON wxRibbonToolBarEvent : public wxCommandEvent +{ +public: + wxRibbonToolBarEvent(wxEventType command_type = wxEVT_NULL, + int win_id = 0, + wxRibbonToolBar* bar = NULL) + : wxCommandEvent(command_type, win_id) + , m_bar(bar) + { + } +#ifndef SWIG + wxRibbonToolBarEvent(const wxRibbonToolBarEvent& e) : wxCommandEvent(e) + { + m_bar = e.m_bar; + } +#endif + wxEvent *Clone() const { return new wxRibbonToolBarEvent(*this); } + + wxRibbonToolBar* GetBar() {return m_bar;} + void SetBar(wxRibbonToolBar* bar) {m_bar = bar;} + bool PopupMenu(wxMenu* menu); + +protected: + wxRibbonToolBar* m_bar; + +#ifndef SWIG +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxRibbonToolBarEvent) +#endif +}; + +#ifndef SWIG + +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONTOOLBAR_CLICKED, wxRibbonToolBarEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONTOOLBAR_DROPDOWN_CLICKED, wxRibbonToolBarEvent); + +typedef void (wxEvtHandler::*wxRibbonToolBarEventFunction)(wxRibbonToolBarEvent&); + +#define wxRibbonToolBarEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxRibbonToolBarEventFunction, func) + +#define EVT_RIBBONTOOLBAR_CLICKED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONTOOLBAR_CLICKED, winid, wxRibbonToolBarEventHandler(fn)) +#define EVT_RIBBONTOOLBAR_DROPDOWN_CLICKED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_RIBBONTOOLBAR_DROPDOWN_CLICKED, winid, wxRibbonToolBarEventHandler(fn)) +#else + +// wxpython/swig event work +%constant wxEventType wxEVT_RIBBONTOOLBAR_CLICKED; +%constant wxEventType wxEVT_RIBBONTOOLBAR_DROPDOWN_CLICKED; + +%pythoncode { + EVT_RIBBONTOOLBAR_CLICKED = wx.PyEventBinder( wxEVT_RIBBONTOOLBAR_CLICKED, 1 ) + EVT_RIBBONTOOLBAR_DROPDOWN_CLICKED = wx.PyEventBinder( wxEVT_RIBBONTOOLBAR_DROPDOWN_CLICKED, 1 ) +} +#endif + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_RIBBONTOOL_CLICKED wxEVT_RIBBONTOOLBAR_CLICKED +#define wxEVT_COMMAND_RIBBONTOOL_DROPDOWN_CLICKED wxEVT_RIBBONTOOLBAR_DROPDOWN_CLICKED + +#endif // wxUSE_RIBBON + +#endif // _WX_RIBBON_TOOLBAR_H_ diff --git a/wxmsw/include/wx-3.0/wx/richmsgdlg.h b/wxmsw/include/wx-3.0/wx/richmsgdlg.h new file mode 100644 index 00000000..1fbc9642 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richmsgdlg.h @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richmsgdlg.h +// Purpose: wxRichMessageDialogBase +// Author: Rickard Westerlund +// Created: 2010-07-03 +// Copyright: (c) 2010 wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHMSGDLG_H_BASE_ +#define _WX_RICHMSGDLG_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_RICHMSGDLG + +#include "wx/msgdlg.h" + +// Extends a message dialog with an optional checkbox and user-expandable +// detailed text. +class WXDLLIMPEXP_CORE wxRichMessageDialogBase : public wxGenericMessageDialog +{ +public: + wxRichMessageDialogBase( wxWindow *parent, + const wxString& message, + const wxString& caption, + long style ) + : wxGenericMessageDialog( parent, message, caption, style ), + m_detailsExpanderCollapsedLabel( wxGetTranslation("&See details") ), + m_detailsExpanderExpandedLabel( wxGetTranslation("&Hide details") ), + m_checkBoxValue( false ) + { } + + void ShowCheckBox(const wxString& checkBoxText, bool checked = false) + { + m_checkBoxText = checkBoxText; + m_checkBoxValue = checked; + } + + wxString GetCheckBoxText() const { return m_checkBoxText; } + + void ShowDetailedText(const wxString& detailedText) + { m_detailedText = detailedText; } + + wxString GetDetailedText() const { return m_detailedText; } + + virtual bool IsCheckBoxChecked() const { return m_checkBoxValue; } + +protected: + const wxString m_detailsExpanderCollapsedLabel; + const wxString m_detailsExpanderExpandedLabel; + + wxString m_checkBoxText; + bool m_checkBoxValue; + wxString m_detailedText; + +private: + void ShowDetails(bool shown); + + wxDECLARE_NO_COPY_CLASS(wxRichMessageDialogBase); +}; + +// Always include the generic version as it's currently used as the base class +// by the MSW native implementation too. +#include "wx/generic/richmsgdlgg.h" + +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + #include "wx/msw/richmsgdlg.h" +#else + class WXDLLIMPEXP_CORE wxRichMessageDialog + : public wxGenericRichMessageDialog + { + public: + wxRichMessageDialog( wxWindow *parent, + const wxString& message, + const wxString& caption, + long style ) + : wxGenericRichMessageDialog( parent, message, caption, style ) + { } + + private: + wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxRichMessageDialog); + }; +#endif + +#endif // wxUSE_RICHMSGDLG + +#endif // _WX_RICHMSGDLG_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextbackgroundpage.h b/wxmsw/include/wx-3.0/wx/richtext/richtextbackgroundpage.h new file mode 100644 index 00000000..e73b4278 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextbackgroundpage.h @@ -0,0 +1,110 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextbackgroundpage.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 13/11/2010 11:17:25 +// RCS-ID: +// Copyright: (c) Julian Smart +// Licence: +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTBACKGROUNDPAGE_H_ +#define _RICHTEXTBACKGROUNDPAGE_H_ + +/*! + * Includes + */ + +#include "wx/richtext/richtextdialogpage.h" + +////@begin includes +#include "wx/statline.h" +////@end includes + +/*! + * Forward declarations + */ + +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextColourSwatchCtrl; + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTBACKGROUNDPAGE_STYLE wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTBACKGROUNDPAGE_TITLE wxEmptyString +#define SYMBOL_WXRICHTEXTBACKGROUNDPAGE_IDNAME ID_RICHTEXTBACKGROUNDPAGE +#define SYMBOL_WXRICHTEXTBACKGROUNDPAGE_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTBACKGROUNDPAGE_POSITION wxDefaultPosition +////@end control identifiers + + +/*! + * wxRichTextBackgroundPage class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextBackgroundPage: public wxRichTextDialogPage +{ + DECLARE_DYNAMIC_CLASS( wxRichTextBackgroundPage ) + DECLARE_EVENT_TABLE() + DECLARE_HELP_PROVISION() + +public: + /// Constructors + wxRichTextBackgroundPage(); + wxRichTextBackgroundPage( wxWindow* parent, wxWindowID id = SYMBOL_WXRICHTEXTBACKGROUNDPAGE_IDNAME, const wxPoint& pos = SYMBOL_WXRICHTEXTBACKGROUNDPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTBACKGROUNDPAGE_SIZE, long style = SYMBOL_WXRICHTEXTBACKGROUNDPAGE_STYLE ); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = SYMBOL_WXRICHTEXTBACKGROUNDPAGE_IDNAME, const wxPoint& pos = SYMBOL_WXRICHTEXTBACKGROUNDPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTBACKGROUNDPAGE_SIZE, long style = SYMBOL_WXRICHTEXTBACKGROUNDPAGE_STYLE ); + + /// Destructor + ~wxRichTextBackgroundPage(); + + /// Initialises member variables + void Init(); + + /// Creates the controls and sizers + void CreateControls(); + + /// Gets the attributes from the formatting dialog + wxRichTextAttr* GetAttributes(); + + /// Data transfer + virtual bool TransferDataToWindow(); + virtual bool TransferDataFromWindow(); + + /// Respond to colour swatch click + void OnColourSwatch(wxCommandEvent& event); + +////@begin wxRichTextBackgroundPage event handler declarations + +////@end wxRichTextBackgroundPage event handler declarations + +////@begin wxRichTextBackgroundPage member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextBackgroundPage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextBackgroundPage member variables + wxCheckBox* m_backgroundColourCheckBox; + wxRichTextColourSwatchCtrl* m_backgroundColourSwatch; + /// Control identifiers + enum { + ID_RICHTEXTBACKGROUNDPAGE = 10845, + ID_RICHTEXT_BACKGROUND_COLOUR_CHECKBOX = 10846, + ID_RICHTEXT_BACKGROUND_COLOUR_SWATCH = 10847 + }; +////@end wxRichTextBackgroundPage member variables +}; + +#endif + // _RICHTEXTBACKGROUNDPAGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextborderspage.h b/wxmsw/include/wx-3.0/wx/richtext/richtextborderspage.h new file mode 100644 index 00000000..347f154f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextborderspage.h @@ -0,0 +1,293 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextborderspage.h +// Purpose: A border editing page for the wxRTC formatting dialog. +// Author: Julian Smart +// Modified by: +// Created: 21/10/2010 11:34:24 +// RCS-ID: +// Copyright: (c) Julian Smart +// Licence: +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTBORDERSPAGE_H_ +#define _RICHTEXTBORDERSPAGE_H_ + +/*! + * Includes + */ + +#include "wx/richtext/richtextdialogpage.h" + +////@begin includes +#include "wx/notebook.h" +#include "wx/statline.h" +////@end includes + +/*! + * Forward declarations + */ + +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextColourSwatchCtrl; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextBorderPreviewCtrl; + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTBORDERSPAGE_STYLE wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTBORDERSPAGE_TITLE wxEmptyString +#define SYMBOL_WXRICHTEXTBORDERSPAGE_IDNAME ID_RICHTEXTBORDERSPAGE +#define SYMBOL_WXRICHTEXTBORDERSPAGE_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTBORDERSPAGE_POSITION wxDefaultPosition +////@end control identifiers + + +/*! + * wxRichTextBordersPage class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextBordersPage: public wxRichTextDialogPage +{ + DECLARE_DYNAMIC_CLASS( wxRichTextBordersPage ) + DECLARE_EVENT_TABLE() + DECLARE_HELP_PROVISION() + +public: + /// Constructors + wxRichTextBordersPage(); + wxRichTextBordersPage( wxWindow* parent, wxWindowID id = SYMBOL_WXRICHTEXTBORDERSPAGE_IDNAME, const wxPoint& pos = SYMBOL_WXRICHTEXTBORDERSPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTBORDERSPAGE_SIZE, long style = SYMBOL_WXRICHTEXTBORDERSPAGE_STYLE ); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = SYMBOL_WXRICHTEXTBORDERSPAGE_IDNAME, const wxPoint& pos = SYMBOL_WXRICHTEXTBORDERSPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTBORDERSPAGE_SIZE, long style = SYMBOL_WXRICHTEXTBORDERSPAGE_STYLE ); + + /// Destructor + ~wxRichTextBordersPage(); + + /// Initialises member variables + void Init(); + + /// Creates the controls and sizers + void CreateControls(); + + /// Gets the attributes from the formatting dialog + wxRichTextAttr* GetAttributes(); + + /// Data transfer + virtual bool TransferDataToWindow(); + virtual bool TransferDataFromWindow(); + + /// Updates the synchronization checkboxes to reflect the state of the attributes + void UpdateSyncControls(); + + /// Updates the preview + void OnCommand(wxCommandEvent& event); + + /// Fill style combo + virtual void FillStyleComboBox(wxComboBox* styleComboBox); + + /// Set the border controls + static void SetBorderValue(wxTextAttrBorder& border, wxTextCtrl* widthValueCtrl, wxComboBox* widthUnitsCtrl, wxCheckBox* checkBox, + wxComboBox* styleCtrl, wxRichTextColourSwatchCtrl* colourCtrl, const wxArrayInt& borderStyles); + + /// Get data from the border controls + static void GetBorderValue(wxTextAttrBorder& border, wxTextCtrl* widthValueCtrl, wxComboBox* widthUnitsCtrl, wxCheckBox* checkBox, + wxComboBox* styleCtrl, wxRichTextColourSwatchCtrl* colourCtrl, const wxArrayInt& borderStyles); + +////@begin wxRichTextBordersPage event handler declarations + + /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXT_BORDER_LEFT_CHECKBOX + void OnRichtextBorderCheckboxClick( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXT_BORDER_LEFT + void OnRichtextBorderLeftValueTextUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_BORDER_LEFT + void OnRichtextBorderLeftUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXT_BORDER_LEFT_UNITS + void OnRichtextBorderLeftUnitsSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXT_BORDER_LEFT_STYLE + void OnRichtextBorderLeftStyleSelected( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_BORDER_RIGHT_CHECKBOX + void OnRichtextBorderOtherCheckboxUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_BORDER_RIGHT + void OnRichtextBorderRightUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_BORDER_TOP + void OnRichtextBorderTopUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_BORDER_BOTTOM + void OnRichtextBorderBottomUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXT_BORDER_SYNCHRONIZE + void OnRichtextBorderSynchronizeClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_BORDER_SYNCHRONIZE + void OnRichtextBorderSynchronizeUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXT_OUTLINE_LEFT + void OnRichtextOutlineLeftTextUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_OUTLINE_LEFT + void OnRichtextOutlineLeftUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXT_OUTLINE_LEFT_UNITS + void OnRichtextOutlineLeftUnitsSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXT_OUTLINE_LEFT_STYLE + void OnRichtextOutlineLeftStyleSelected( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_OUTLINE_RIGHT_CHECKBOX + void OnRichtextOutlineOtherCheckboxUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_OUTLINE_RIGHT + void OnRichtextOutlineRightUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_OUTLINE_TOP + void OnRichtextOutlineTopUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_OUTLINE_BOTTOM + void OnRichtextOutlineBottomUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXT_OUTLINE_SYNCHRONIZE + void OnRichtextOutlineSynchronizeClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_OUTLINE_SYNCHRONIZE + void OnRichtextOutlineSynchronizeUpdate( wxUpdateUIEvent& event ); + +////@end wxRichTextBordersPage event handler declarations + +////@begin wxRichTextBordersPage member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextBordersPage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextBordersPage member variables + wxCheckBox* m_leftBorderCheckbox; + wxTextCtrl* m_leftBorderWidth; + wxComboBox* m_leftBorderWidthUnits; + wxComboBox* m_leftBorderStyle; + wxRichTextColourSwatchCtrl* m_leftBorderColour; + wxCheckBox* m_rightBorderCheckbox; + wxTextCtrl* m_rightBorderWidth; + wxComboBox* m_rightBorderWidthUnits; + wxComboBox* m_rightBorderStyle; + wxRichTextColourSwatchCtrl* m_rightBorderColour; + wxCheckBox* m_topBorderCheckbox; + wxTextCtrl* m_topBorderWidth; + wxComboBox* m_topBorderWidthUnits; + wxComboBox* m_topBorderStyle; + wxRichTextColourSwatchCtrl* m_topBorderColour; + wxCheckBox* m_bottomBorderCheckbox; + wxTextCtrl* m_bottomBorderWidth; + wxComboBox* m_bottomBorderWidthUnits; + wxComboBox* m_bottomBorderStyle; + wxRichTextColourSwatchCtrl* m_bottomBorderColour; + wxCheckBox* m_borderSyncCtrl; + wxCheckBox* m_leftOutlineCheckbox; + wxTextCtrl* m_leftOutlineWidth; + wxComboBox* m_leftOutlineWidthUnits; + wxComboBox* m_leftOutlineStyle; + wxRichTextColourSwatchCtrl* m_leftOutlineColour; + wxCheckBox* m_rightOutlineCheckbox; + wxTextCtrl* m_rightOutlineWidth; + wxComboBox* m_rightOutlineWidthUnits; + wxComboBox* m_rightOutlineStyle; + wxRichTextColourSwatchCtrl* m_rightOutlineColour; + wxCheckBox* m_topOutlineCheckbox; + wxTextCtrl* m_topOutlineWidth; + wxComboBox* m_topOutlineWidthUnits; + wxComboBox* m_topOutlineStyle; + wxRichTextColourSwatchCtrl* m_topOutlineColour; + wxCheckBox* m_bottomOutlineCheckbox; + wxTextCtrl* m_bottomOutlineWidth; + wxComboBox* m_bottomOutlineWidthUnits; + wxComboBox* m_bottomOutlineStyle; + wxRichTextColourSwatchCtrl* m_bottomOutlineColour; + wxCheckBox* m_outlineSyncCtrl; + wxRichTextBorderPreviewCtrl* m_borderPreviewCtrl; + /// Control identifiers + enum { + ID_RICHTEXTBORDERSPAGE = 10800, + ID_RICHTEXTBORDERSPAGE_NOTEBOOK = 10801, + ID_RICHTEXTBORDERSPAGE_BORDERS = 10802, + ID_RICHTEXT_BORDER_LEFT_CHECKBOX = 10803, + ID_RICHTEXT_BORDER_LEFT = 10804, + ID_RICHTEXT_BORDER_LEFT_UNITS = 10805, + ID_RICHTEXT_BORDER_LEFT_STYLE = 10806, + ID_RICHTEXT_BORDER_LEFT_COLOUR = 10807, + ID_RICHTEXT_BORDER_RIGHT_CHECKBOX = 10808, + ID_RICHTEXT_BORDER_RIGHT = 10809, + ID_RICHTEXT_BORDER_RIGHT_UNITS = 10810, + ID_RICHTEXT_BORDER_RIGHT_STYLE = 10811, + ID_RICHTEXT_BORDER_RIGHT_COLOUR = 10812, + ID_RICHTEXT_BORDER_TOP_CHECKBOX = 10813, + ID_RICHTEXT_BORDER_TOP = 10814, + ID_RICHTEXT_BORDER_TOP_UNITS = 10815, + ID_RICHTEXT_BORDER_TOP_STYLE = 10816, + ID_RICHTEXT_BORDER_TOP_COLOUR = 10817, + ID_RICHTEXT_BORDER_BOTTOM_CHECKBOX = 10818, + ID_RICHTEXT_BORDER_BOTTOM = 10819, + ID_RICHTEXT_BORDER_BOTTOM_UNITS = 10820, + ID_RICHTEXT_BORDER_BOTTOM_STYLE = 10821, + ID_RICHTEXT_BORDER_BOTTOM_COLOUR = 10822, + ID_RICHTEXT_BORDER_SYNCHRONIZE = 10845, + ID_RICHTEXTBORDERSPAGE_OUTLINE = 10823, + ID_RICHTEXT_OUTLINE_LEFT_CHECKBOX = 10824, + ID_RICHTEXT_OUTLINE_LEFT = 10825, + ID_RICHTEXT_OUTLINE_LEFT_UNITS = 10826, + ID_RICHTEXT_OUTLINE_LEFT_STYLE = 10827, + ID_RICHTEXT_OUTLINE_LEFT_COLOUR = 10828, + ID_RICHTEXT_OUTLINE_RIGHT_CHECKBOX = 10829, + ID_RICHTEXT_OUTLINE_RIGHT = 10830, + ID_RICHTEXT_OUTLINE_RIGHT_UNITS = 10831, + ID_RICHTEXT_OUTLINE_RIGHT_STYLE = 10832, + ID_RICHTEXT_OUTLINE_RIGHT_COLOUR = 10833, + ID_RICHTEXT_OUTLINE_TOP_CHECKBOX = 10834, + ID_RICHTEXT_OUTLINE_TOP = 10835, + ID_RICHTEXT_OUTLINE_TOP_UNITS = 10836, + ID_RICHTEXT_OUTLINE_TOP_STYLE = 10837, + ID_RICHTEXT_OUTLINE_TOP_COLOUR = 10838, + ID_RICHTEXT_OUTLINE_BOTTOM_CHECKBOX = 10839, + ID_RICHTEXT_OUTLINE_BOTTOM = 10840, + ID_RICHTEXT_OUTLINE_BOTTOM_UNITS = 10841, + ID_RICHTEXT_OUTLINE_BOTTOM_STYLE = 10842, + ID_RICHTEXT_OUTLINE_BOTTOM_COLOUR = 10843, + ID_RICHTEXT_OUTLINE_SYNCHRONIZE = 10846, + ID_RICHTEXT_BORDER_PREVIEW = 10844 + }; +////@end wxRichTextBordersPage member variables + + wxArrayInt m_borderStyles; + wxArrayString m_borderStyleNames; + bool m_ignoreUpdates; +}; + +class WXDLLIMPEXP_RICHTEXT wxRichTextBorderPreviewCtrl : public wxWindow +{ +public: + wxRichTextBorderPreviewCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, long style = 0); + + void SetAttributes(wxRichTextAttr* attr) { m_attributes = attr; } + wxRichTextAttr* GetAttributes() const { return m_attributes; } + +private: + wxRichTextAttr* m_attributes; + + void OnPaint(wxPaintEvent& event); + DECLARE_EVENT_TABLE() +}; + +#endif + // _RICHTEXTBORDERSPAGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextbuffer.h b/wxmsw/include/wx-3.0/wx/richtext/richtextbuffer.h new file mode 100644 index 00000000..2cf636a4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextbuffer.h @@ -0,0 +1,6715 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextbuffer.h +// Purpose: Buffer for wxRichTextCtrl +// Author: Julian Smart +// Modified by: +// Created: 2005-09-30 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTBUFFER_H_ +#define _WX_RICHTEXTBUFFER_H_ + +/* + + Data structures + =============== + + Data is represented by a hierarchy of objects, all derived from + wxRichTextObject. + + The top of the hierarchy is the buffer, a kind of wxRichTextParagraphLayoutBox. + These boxes will allow flexible placement of text boxes on a page, but + for now there is a single box representing the document, and this box is + a wxRichTextParagraphLayoutBox which contains further wxRichTextParagraph + objects, each of which can include text and images. + + Each object maintains a range (start and end position) measured + from the start of the main parent box. + A paragraph object knows its range, and a text fragment knows its range + too. So, a character or image in a page has a position relative to the + start of the document, and a character in an embedded text box has + a position relative to that text box. For now, we will not be dealing with + embedded objects but it's something to bear in mind for later. + + Note that internally, a range (5,5) represents a range of one character. + In the public wx[Rich]TextCtrl API, this would be passed to e.g. SetSelection + as (5,6). A paragraph with one character might have an internal range of (0, 1) + since the end of the paragraph takes up one position. + + Layout + ====== + + When Layout is called on an object, it is given a size which the object + must limit itself to, or one or more flexible directions (vertical + or horizontal). So for example a centered paragraph is given the page + width to play with (minus any margins), but can extend indefinitely + in the vertical direction. The implementation of Layout can then + cache the calculated size and position within the parent. + + */ + +/*! + * Includes + */ + +#include "wx/defs.h" + +#if wxUSE_RICHTEXT + +#include "wx/list.h" +#include "wx/textctrl.h" +#include "wx/bitmap.h" +#include "wx/image.h" +#include "wx/cmdproc.h" +#include "wx/txtstrm.h" +#include "wx/variant.h" +#include "wx/position.h" + +#if wxUSE_DATAOBJ +#include "wx/dataobj.h" +#endif + +// Compatibility +//#define wxRichTextAttr wxTextAttr +#define wxTextAttrEx wxTextAttr + +// Setting wxRICHTEXT_USE_OWN_CARET to 1 implements a +// caret reliably without using wxClientDC in case there +// are platform-specific problems with the generic caret. +#if defined(__WXGTK__) || defined(__WXMAC__) +#define wxRICHTEXT_USE_OWN_CARET 1 +#else +#define wxRICHTEXT_USE_OWN_CARET 0 +#endif + +// Switch off for binary compatibility, on for faster drawing +// Note: this seems to be buggy (overzealous use of extents) so +// don't use for now +#define wxRICHTEXT_USE_OPTIMIZED_LINE_DRAWING 0 + +// The following two symbols determine whether an output implementation +// is present. To switch the relevant one on, set wxRICHTEXT_USE_XMLDOCUMENT_OUTPUT in +// richtextxml.cpp. By default, the faster direct output implementation is used. + +// Include the wxXmlDocument implementation for output +#define wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT 1 + +// Include the faster, direct implementation for output +#define wxRICHTEXT_HAVE_DIRECT_OUTPUT 1 + +/** + The line break character that can be embedded in content. + */ + +extern WXDLLIMPEXP_RICHTEXT const wxChar wxRichTextLineBreakChar; + +/** + File types in wxRichText context. + */ +enum wxRichTextFileType +{ + wxRICHTEXT_TYPE_ANY = 0, + wxRICHTEXT_TYPE_TEXT, + wxRICHTEXT_TYPE_XML, + wxRICHTEXT_TYPE_HTML, + wxRICHTEXT_TYPE_RTF, + wxRICHTEXT_TYPE_PDF +}; + +/* + * Forward declarations + */ + +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextCtrl; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextObject; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextImage; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextPlainText; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextCacheObject; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextObjectList; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextLine; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextParagraph; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextFileHandler; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextDrawingHandler; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextField; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextFieldType; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextStyleSheet; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextListStyleDefinition; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextEvent; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextRenderer; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextBuffer; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextXMLHandler; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextParagraphLayoutBox; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextImageBlock; +class WXDLLIMPEXP_FWD_XML wxXmlNode; +class wxRichTextFloatCollector; +class WXDLLIMPEXP_FWD_BASE wxDataInputStream; +class WXDLLIMPEXP_FWD_BASE wxDataOutputStream; + +/** + Flags determining the available space, passed to Layout. + */ + +#define wxRICHTEXT_FIXED_WIDTH 0x01 +#define wxRICHTEXT_FIXED_HEIGHT 0x02 +#define wxRICHTEXT_VARIABLE_WIDTH 0x04 +#define wxRICHTEXT_VARIABLE_HEIGHT 0x08 + +// Only lay out the part of the buffer that lies within +// the rect passed to Layout. +#define wxRICHTEXT_LAYOUT_SPECIFIED_RECT 0x10 + +/** + Flags to pass to Draw + */ + +// Ignore paragraph cache optimization, e.g. for printing purposes +// where one line may be drawn higher (on the next page) compared +// with the previous line +#define wxRICHTEXT_DRAW_IGNORE_CACHE 0x01 +#define wxRICHTEXT_DRAW_SELECTED 0x02 +#define wxRICHTEXT_DRAW_PRINT 0x04 +#define wxRICHTEXT_DRAW_GUIDELINES 0x08 + +/** + Flags returned from hit-testing, or passed to hit-test function. + */ +enum wxRichTextHitTestFlags +{ + // The point was not on this object + wxRICHTEXT_HITTEST_NONE = 0x01, + + // The point was before the position returned from HitTest + wxRICHTEXT_HITTEST_BEFORE = 0x02, + + // The point was after the position returned from HitTest + wxRICHTEXT_HITTEST_AFTER = 0x04, + + // The point was on the position returned from HitTest + wxRICHTEXT_HITTEST_ON = 0x08, + + // The point was on space outside content + wxRICHTEXT_HITTEST_OUTSIDE = 0x10, + + // Only do hit-testing at the current level (don't traverse into top-level objects) + wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS = 0x20, + + // Ignore floating objects + wxRICHTEXT_HITTEST_NO_FLOATING_OBJECTS = 0x40, + + // Don't recurse into objects marked as atomic + wxRICHTEXT_HITTEST_HONOUR_ATOMIC = 0x80 +}; + +/** + Flags for GetRangeSize. + */ + +#define wxRICHTEXT_FORMATTED 0x01 +#define wxRICHTEXT_UNFORMATTED 0x02 +#define wxRICHTEXT_CACHE_SIZE 0x04 +#define wxRICHTEXT_HEIGHT_ONLY 0x08 + +/** + Flags for SetStyle/SetListStyle. + */ + +#define wxRICHTEXT_SETSTYLE_NONE 0x00 + +// Specifies that this operation should be undoable +#define wxRICHTEXT_SETSTYLE_WITH_UNDO 0x01 + +// Specifies that the style should not be applied if the +// combined style at this point is already the style in question. +#define wxRICHTEXT_SETSTYLE_OPTIMIZE 0x02 + +// Specifies that the style should only be applied to paragraphs, +// and not the content. This allows content styling to be +// preserved independently from that of e.g. a named paragraph style. +#define wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY 0x04 + +// Specifies that the style should only be applied to characters, +// and not the paragraph. This allows content styling to be +// preserved independently from that of e.g. a named paragraph style. +#define wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY 0x08 + +// For SetListStyle only: specifies starting from the given number, otherwise +// deduces number from existing attributes +#define wxRICHTEXT_SETSTYLE_RENUMBER 0x10 + +// For SetListStyle only: specifies the list level for all paragraphs, otherwise +// the current indentation will be used +#define wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL 0x20 + +// Resets the existing style before applying the new style +#define wxRICHTEXT_SETSTYLE_RESET 0x40 + +// Removes the given style instead of applying it +#define wxRICHTEXT_SETSTYLE_REMOVE 0x80 + +/** + Flags for SetProperties. + */ + +#define wxRICHTEXT_SETPROPERTIES_NONE 0x00 + +// Specifies that this operation should be undoable +#define wxRICHTEXT_SETPROPERTIES_WITH_UNDO 0x01 + +// Specifies that the properties should only be applied to paragraphs, +// and not the content. +#define wxRICHTEXT_SETPROPERTIES_PARAGRAPHS_ONLY 0x02 + +// Specifies that the properties should only be applied to characters, +// and not the paragraph. +#define wxRICHTEXT_SETPROPERTIES_CHARACTERS_ONLY 0x04 + +// Resets the existing properties before applying the new properties. +#define wxRICHTEXT_SETPROPERTIES_RESET 0x08 + +// Removes the given properties instead of applying them. +#define wxRICHTEXT_SETPROPERTIES_REMOVE 0x10 + +/** + Flags for object insertion. + */ + +#define wxRICHTEXT_INSERT_NONE 0x00 +#define wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE 0x01 +#define wxRICHTEXT_INSERT_INTERACTIVE 0x02 + +// A special flag telling the buffer to keep the first paragraph style +// as-is, when deleting a paragraph marker. In future we might pass a +// flag to InsertFragment and DeleteRange to indicate the appropriate mode. +#define wxTEXT_ATTR_KEEP_FIRST_PARA_STYLE 0x20000000 + +/** + Default superscript/subscript font multiplication factor. + */ + +#define wxSCRIPT_MUL_FACTOR 1.5 + +/** + The type for wxTextAttrDimension flags. + */ +typedef unsigned short wxTextAttrDimensionFlags; + +/** + Miscellaneous text box flags + */ +enum wxTextBoxAttrFlags +{ + wxTEXT_BOX_ATTR_FLOAT = 0x00000001, + wxTEXT_BOX_ATTR_CLEAR = 0x00000002, + wxTEXT_BOX_ATTR_COLLAPSE_BORDERS = 0x00000004, + wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT = 0x00000008, + wxTEXT_BOX_ATTR_BOX_STYLE_NAME = 0x00000010 +}; + +/** + Whether a value is present, used in dimension flags. + */ +enum wxTextAttrValueFlags +{ + wxTEXT_ATTR_VALUE_VALID = 0x1000, + wxTEXT_ATTR_VALUE_VALID_MASK = 0x1000 +}; + +/** + Units, included in the dimension value. + */ +enum wxTextAttrUnits +{ + wxTEXT_ATTR_UNITS_TENTHS_MM = 0x0001, + wxTEXT_ATTR_UNITS_PIXELS = 0x0002, + wxTEXT_ATTR_UNITS_PERCENTAGE = 0x0004, + wxTEXT_ATTR_UNITS_POINTS = 0x0008, + wxTEXT_ATTR_UNITS_HUNDREDTHS_POINT = 0x0100, + + wxTEXT_ATTR_UNITS_MASK = 0x010F +}; + +/** + Position alternatives, included in the dimension flags. + */ +enum wxTextBoxAttrPosition +{ + wxTEXT_BOX_ATTR_POSITION_STATIC = 0x0000, // Default is static, i.e. as per normal layout + wxTEXT_BOX_ATTR_POSITION_RELATIVE = 0x0010, // Relative to the relevant edge + wxTEXT_BOX_ATTR_POSITION_ABSOLUTE = 0x0020, // Relative to the parent + wxTEXT_BOX_ATTR_POSITION_FIXED = 0x0040, // Relative to the top-level window + + wxTEXT_BOX_ATTR_POSITION_MASK = 0x00F0 +}; + +/** + @class wxTextAttrDimension + + A class representing a rich text dimension, including units and position. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimensions +*/ + +class WXDLLIMPEXP_RICHTEXT wxTextAttrDimension +{ +public: + /** + Default constructor. + */ + wxTextAttrDimension() { Reset(); } + /** + Constructor taking value and units flag. + */ + wxTextAttrDimension(int value, wxTextAttrUnits units = wxTEXT_ATTR_UNITS_TENTHS_MM) { m_value = value; m_flags = units|wxTEXT_ATTR_VALUE_VALID; } + + /** + Resets the dimension value and flags. + */ + void Reset() { m_value = 0; m_flags = 0; } + + /** + Partial equality test. If @a weakTest is @true, attributes of this object do not + have to be present if those attributes of @a dim are present. If @a weakTest is + @false, the function will fail if an attribute is present in @a dim but not + in this object. + */ + bool EqPartial(const wxTextAttrDimension& dim, bool weakTest = true) const; + + /** Apply the dimension, but not those identical to @a compareWith if present. + */ + bool Apply(const wxTextAttrDimension& dim, const wxTextAttrDimension* compareWith = NULL); + + /** Collects the attributes that are common to a range of content, building up a note of + which attributes are absent in some objects and which clash in some objects. + */ + void CollectCommonAttributes(const wxTextAttrDimension& attr, wxTextAttrDimension& clashingAttr, wxTextAttrDimension& absentAttr); + + /** + Equality operator. + */ + bool operator==(const wxTextAttrDimension& dim) const { return m_value == dim.m_value && m_flags == dim.m_flags; } + + /** + Returns the integer value of the dimension. + */ + int GetValue() const { return m_value; } + + /** + Returns the floating-pointing value of the dimension in mm. + + */ + float GetValueMM() const { return float(m_value) / 10.0; } + + /** + Sets the value of the dimension in mm. + */ + void SetValueMM(float value) { m_value = (int) ((value * 10.0) + 0.5); m_flags |= wxTEXT_ATTR_VALUE_VALID; } + + /** + Sets the integer value of the dimension. + */ + void SetValue(int value) { m_value = value; m_flags |= wxTEXT_ATTR_VALUE_VALID; } + + /** + Sets the integer value of the dimension, passing dimension flags. + */ + void SetValue(int value, wxTextAttrDimensionFlags flags) { SetValue(value); m_flags = flags; } + + /** + Sets the integer value and units. + */ + void SetValue(int value, wxTextAttrUnits units) { m_value = value; m_flags = units | wxTEXT_ATTR_VALUE_VALID; } + + /** + Sets the dimension. + */ + void SetValue(const wxTextAttrDimension& dim) { (*this) = dim; } + + /** + Gets the units of the dimension. + */ + wxTextAttrUnits GetUnits() const { return (wxTextAttrUnits) (m_flags & wxTEXT_ATTR_UNITS_MASK); } + + /** + Sets the units of the dimension. + */ + void SetUnits(wxTextAttrUnits units) { m_flags &= ~wxTEXT_ATTR_UNITS_MASK; m_flags |= units; } + + /** + Gets the position flags. + */ + wxTextBoxAttrPosition GetPosition() const { return (wxTextBoxAttrPosition) (m_flags & wxTEXT_BOX_ATTR_POSITION_MASK); } + + /** + Sets the position flags. + */ + void SetPosition(wxTextBoxAttrPosition pos) { m_flags &= ~wxTEXT_BOX_ATTR_POSITION_MASK; m_flags |= pos; } + + /** + Returns @true if the dimension is valid. + */ + bool IsValid() const { return (m_flags & wxTEXT_ATTR_VALUE_VALID) != 0; } + + /** + Sets the valid flag. + */ + void SetValid(bool b) { m_flags &= ~wxTEXT_ATTR_VALUE_VALID_MASK; m_flags |= (b ? wxTEXT_ATTR_VALUE_VALID : 0); } + + /** + Gets the dimension flags. + */ + wxTextAttrDimensionFlags GetFlags() const { return m_flags; } + + /** + Sets the dimension flags. + */ + void SetFlags(wxTextAttrDimensionFlags flags) { m_flags = flags; } + + int m_value; + wxTextAttrDimensionFlags m_flags; +}; + +/** + @class wxTextAttrDimensions + A class for left, right, top and bottom dimensions. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimension +*/ + +class WXDLLIMPEXP_RICHTEXT wxTextAttrDimensions +{ +public: + /** + Default constructor. + */ + wxTextAttrDimensions() {} + + /** + Resets the value and flags for all dimensions. + */ + void Reset() { m_left.Reset(); m_top.Reset(); m_right.Reset(); m_bottom.Reset(); } + + /** + Equality operator. + */ + bool operator==(const wxTextAttrDimensions& dims) const { return m_left == dims.m_left && m_top == dims.m_top && m_right == dims.m_right && m_bottom == dims.m_bottom; } + + /** + Partial equality test. If @a weakTest is @true, attributes of this object do not + have to be present if those attributes of @a dim sare present. If @a weakTest is + @false, the function will fail if an attribute is present in @a dims but not + in this object. + + */ + bool EqPartial(const wxTextAttrDimensions& dims, bool weakTest = true) const; + + /** + Apply to 'this', but not if the same as @a compareWith. + + */ + bool Apply(const wxTextAttrDimensions& dims, const wxTextAttrDimensions* compareWith = NULL); + + /** + Collects the attributes that are common to a range of content, building up a note of + which attributes are absent in some objects and which clash in some objects. + + */ + void CollectCommonAttributes(const wxTextAttrDimensions& attr, wxTextAttrDimensions& clashingAttr, wxTextAttrDimensions& absentAttr); + + /** + Remove specified attributes from this object. + */ + bool RemoveStyle(const wxTextAttrDimensions& attr); + + /** + Gets the left dimension. + */ + const wxTextAttrDimension& GetLeft() const { return m_left; } + wxTextAttrDimension& GetLeft() { return m_left; } + + /** + Gets the right dimension. + + */ + const wxTextAttrDimension& GetRight() const { return m_right; } + wxTextAttrDimension& GetRight() { return m_right; } + + /** + Gets the top dimension. + + */ + const wxTextAttrDimension& GetTop() const { return m_top; } + wxTextAttrDimension& GetTop() { return m_top; } + + /** + Gets the bottom dimension. + + */ + const wxTextAttrDimension& GetBottom() const { return m_bottom; } + wxTextAttrDimension& GetBottom() { return m_bottom; } + + /** + Are all dimensions valid? + + */ + bool IsValid() const { return m_left.IsValid() && m_top.IsValid() && m_right.IsValid() && m_bottom.IsValid(); } + + wxTextAttrDimension m_left; + wxTextAttrDimension m_top; + wxTextAttrDimension m_right; + wxTextAttrDimension m_bottom; +}; + +/** + @class wxTextAttrSize + A class for representing width and height. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimension +*/ + +class WXDLLIMPEXP_RICHTEXT wxTextAttrSize +{ +public: + /** + Default constructor. + */ + wxTextAttrSize() {} + + /** + Resets the width and height dimensions. + */ + void Reset() { m_width.Reset(); m_height.Reset(); } + + /** + Equality operator. + */ + bool operator==(const wxTextAttrSize& size) const { return m_width == size.m_width && m_height == size.m_height ; } + + /** + Partial equality test. If @a weakTest is @true, attributes of this object do not + have to be present if those attributes of @a size are present. If @a weakTest is + @false, the function will fail if an attribute is present in @a size but not + in this object. + */ + bool EqPartial(const wxTextAttrSize& size, bool weakTest = true) const; + + /** + Apply to this object, but not if the same as @a compareWith. + */ + bool Apply(const wxTextAttrSize& dims, const wxTextAttrSize* compareWith = NULL); + + /** + Collects the attributes that are common to a range of content, building up a note of + which attributes are absent in some objects and which clash in some objects. + */ + void CollectCommonAttributes(const wxTextAttrSize& attr, wxTextAttrSize& clashingAttr, wxTextAttrSize& absentAttr); + + /** + Removes the specified attributes from this object. + */ + bool RemoveStyle(const wxTextAttrSize& attr); + + /** + Returns the width. + */ + wxTextAttrDimension& GetWidth() { return m_width; } + const wxTextAttrDimension& GetWidth() const { return m_width; } + + /** + Sets the width. + */ + void SetWidth(int value, wxTextAttrDimensionFlags flags) { m_width.SetValue(value, flags); } + + /** + Sets the width. + */ + void SetWidth(int value, wxTextAttrUnits units) { m_width.SetValue(value, units); } + + /** + Sets the width. + */ + void SetWidth(const wxTextAttrDimension& dim) { m_width.SetValue(dim); } + + /** + Gets the height. + */ + wxTextAttrDimension& GetHeight() { return m_height; } + const wxTextAttrDimension& GetHeight() const { return m_height; } + + /** + Sets the height. + */ + void SetHeight(int value, wxTextAttrDimensionFlags flags) { m_height.SetValue(value, flags); } + + /** + Sets the height. + */ + void SetHeight(int value, wxTextAttrUnits units) { m_height.SetValue(value, units); } + + /** + Sets the height. + */ + void SetHeight(const wxTextAttrDimension& dim) { m_height.SetValue(dim); } + + /** + Is the size valid? + */ + bool IsValid() const { return m_width.IsValid() && m_height.IsValid(); } + + wxTextAttrDimension m_width; + wxTextAttrDimension m_height; +}; + +/** + @class wxTextAttrDimensionConverter + A class to make it easier to convert dimensions. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimension +*/ + +class WXDLLIMPEXP_RICHTEXT wxTextAttrDimensionConverter +{ +public: + /** + Constructor. + */ + wxTextAttrDimensionConverter(wxDC& dc, double scale = 1.0, const wxSize& parentSize = wxDefaultSize); + /** + Constructor. + */ + wxTextAttrDimensionConverter(int ppi, double scale = 1.0, const wxSize& parentSize = wxDefaultSize); + + /** + Gets the pixel size for the given dimension. + */ + int GetPixels(const wxTextAttrDimension& dim, int direction = wxHORIZONTAL) const; + /** + Gets the mm size for the given dimension. + */ + int GetTenthsMM(const wxTextAttrDimension& dim) const; + + /** + Converts tenths of a mm to pixels. + */ + int ConvertTenthsMMToPixels(int units) const; + /** + Converts pixels to tenths of a mm. + */ + int ConvertPixelsToTenthsMM(int pixels) const; + + /** + Sets the scale factor. + */ + void SetScale(double scale) { m_scale = scale; } + /** + Returns the scale factor. + */ + double GetScale() const { return m_scale; } + + /** + Sets the ppi. + */ + void SetPPI(int ppi) { m_ppi = ppi; } + /** + Returns the ppi. + */ + int GetPPI() const { return m_ppi; } + + /** + Sets the parent size. + */ + void SetParentSize(const wxSize& parentSize) { m_parentSize = parentSize; } + /** + Returns the parent size. + */ + const wxSize& GetParentSize() const { return m_parentSize; } + + int m_ppi; + double m_scale; + wxSize m_parentSize; +}; + +/** + Border styles, used with wxTextAttrBorder. + */ +enum wxTextAttrBorderStyle +{ + wxTEXT_BOX_ATTR_BORDER_NONE = 0, + wxTEXT_BOX_ATTR_BORDER_SOLID = 1, + wxTEXT_BOX_ATTR_BORDER_DOTTED = 2, + wxTEXT_BOX_ATTR_BORDER_DASHED = 3, + wxTEXT_BOX_ATTR_BORDER_DOUBLE = 4, + wxTEXT_BOX_ATTR_BORDER_GROOVE = 5, + wxTEXT_BOX_ATTR_BORDER_RIDGE = 6, + wxTEXT_BOX_ATTR_BORDER_INSET = 7, + wxTEXT_BOX_ATTR_BORDER_OUTSET = 8 +}; + +/** + Border style presence flags, used with wxTextAttrBorder. + */ +enum wxTextAttrBorderFlags +{ + wxTEXT_BOX_ATTR_BORDER_STYLE = 0x0001, + wxTEXT_BOX_ATTR_BORDER_COLOUR = 0x0002 +}; + +/** + Border width symbols for qualitative widths, used with wxTextAttrBorder. + */ +enum wxTextAttrBorderWidth +{ + wxTEXT_BOX_ATTR_BORDER_THIN = -1, + wxTEXT_BOX_ATTR_BORDER_MEDIUM = -2, + wxTEXT_BOX_ATTR_BORDER_THICK = -3 +}; + +/** + Float styles. + */ +enum wxTextBoxAttrFloatStyle +{ + wxTEXT_BOX_ATTR_FLOAT_NONE = 0, + wxTEXT_BOX_ATTR_FLOAT_LEFT = 1, + wxTEXT_BOX_ATTR_FLOAT_RIGHT = 2 +}; + +/** + Clear styles. + */ +enum wxTextBoxAttrClearStyle +{ + wxTEXT_BOX_ATTR_CLEAR_NONE = 0, + wxTEXT_BOX_ATTR_CLEAR_LEFT = 1, + wxTEXT_BOX_ATTR_CLEAR_RIGHT = 2, + wxTEXT_BOX_ATTR_CLEAR_BOTH = 3 +}; + +/** + Collapse mode styles. TODO: can they be switched on per side? + */ +enum wxTextBoxAttrCollapseMode +{ + wxTEXT_BOX_ATTR_COLLAPSE_NONE = 0, + wxTEXT_BOX_ATTR_COLLAPSE_FULL = 1 +}; + +/** + Vertical alignment values. + */ +enum wxTextBoxAttrVerticalAlignment +{ + wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_NONE = 0, + wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_TOP = 1, + wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_CENTRE = 2, + wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_BOTTOM = 3 +}; + +/** + @class wxTextAttrBorder + A class representing a rich text object border. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextAttr, wxRichTextCtrl, wxRichTextAttrBorders +*/ + +class WXDLLIMPEXP_RICHTEXT wxTextAttrBorder +{ +public: + /** + Default constructor. + */ + wxTextAttrBorder() { Reset(); } + + /** + Equality operator. + */ + bool operator==(const wxTextAttrBorder& border) const + { + return m_flags == border.m_flags && m_borderStyle == border.m_borderStyle && + m_borderColour == border.m_borderColour && m_borderWidth == border.m_borderWidth; + } + + /** + Resets the border style, colour, width and flags. + */ + void Reset() { m_borderStyle = 0; m_borderColour = 0; m_flags = 0; m_borderWidth.Reset(); } + + /** + Partial equality test. If @a weakTest is @true, attributes of this object do not + have to be present if those attributes of @a border are present. If @a weakTest is + @false, the function will fail if an attribute is present in @a border but not + in this object. + */ + bool EqPartial(const wxTextAttrBorder& border, bool weakTest = true) const; + + /** + Applies the border to this object, but not if the same as @a compareWith. + + */ + bool Apply(const wxTextAttrBorder& border, const wxTextAttrBorder* compareWith = NULL); + + /** + Removes the specified attributes from this object. + */ + bool RemoveStyle(const wxTextAttrBorder& attr); + + /** + Collects the attributes that are common to a range of content, building up a note of + which attributes are absent in some objects and which clash in some objects. + */ + void CollectCommonAttributes(const wxTextAttrBorder& attr, wxTextAttrBorder& clashingAttr, wxTextAttrBorder& absentAttr); + + /** + Sets the border style. + */ + void SetStyle(int style) { m_borderStyle = style; m_flags |= wxTEXT_BOX_ATTR_BORDER_STYLE; } + + /** + Gets the border style. + + */ + int GetStyle() const { return m_borderStyle; } + + /** + Sets the border colour. + */ + void SetColour(unsigned long colour) { m_borderColour = colour; m_flags |= wxTEXT_BOX_ATTR_BORDER_COLOUR; } + + /** + Sets the border colour. + */ + void SetColour(const wxColour& colour) { m_borderColour = colour.GetRGB(); m_flags |= wxTEXT_BOX_ATTR_BORDER_COLOUR; } + + /** + Gets the colour as a long. + */ + unsigned long GetColourLong() const { return m_borderColour; } + + /** + Gets the colour. + */ + wxColour GetColour() const { return wxColour(m_borderColour); } + + /** + Gets the border width. + */ + wxTextAttrDimension& GetWidth() { return m_borderWidth; } + const wxTextAttrDimension& GetWidth() const { return m_borderWidth; } + + /** + Sets the border width. + */ + void SetWidth(const wxTextAttrDimension& width) { m_borderWidth = width; } + /** + Sets the border width. + */ + void SetWidth(int value, wxTextAttrUnits units = wxTEXT_ATTR_UNITS_TENTHS_MM) { SetWidth(wxTextAttrDimension(value, units)); } + + /** + True if the border has a valid style. + */ + bool HasStyle() const { return (m_flags & wxTEXT_BOX_ATTR_BORDER_STYLE) != 0; } + + /** + True if the border has a valid colour. + */ + bool HasColour() const { return (m_flags & wxTEXT_BOX_ATTR_BORDER_COLOUR) != 0; } + + /** + True if the border has a valid width. + */ + bool HasWidth() const { return m_borderWidth.IsValid(); } + + /** + True if the border is valid. + */ + bool IsValid() const { return HasWidth(); } + + /** + Set the valid flag for this border. + */ + void MakeValid() { m_borderWidth.SetValid(true); } + + /** + True if the border has no attributes set. + */ + bool IsDefault() const { return (m_flags == 0); } + + /** + Returns the border flags. + */ + int GetFlags() const { return m_flags; } + + /** + Sets the border flags. + */ + void SetFlags(int flags) { m_flags = flags; } + + /** + Adds a border flag. + */ + void AddFlag(int flag) { m_flags |= flag; } + + /** + Removes a border flag. + */ + void RemoveFlag(int flag) { m_flags &= ~flag; } + + int m_borderStyle; + unsigned long m_borderColour; + wxTextAttrDimension m_borderWidth; + int m_flags; +}; + +/** + @class wxTextAttrBorders + A class representing a rich text object's borders. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextAttr, wxRichTextCtrl, wxRichTextAttrBorder +*/ + +class WXDLLIMPEXP_RICHTEXT wxTextAttrBorders +{ +public: + /** + Default constructor. + */ + wxTextAttrBorders() { } + + /** + Equality operator. + */ + bool operator==(const wxTextAttrBorders& borders) const + { + return m_left == borders.m_left && m_right == borders.m_right && + m_top == borders.m_top && m_bottom == borders.m_bottom; + } + + /** + Sets the style of all borders. + */ + void SetStyle(int style); + + /** + Sets colour of all borders. + */ + void SetColour(unsigned long colour); + + /** + Sets the colour for all borders. + */ + void SetColour(const wxColour& colour); + + /** + Sets the width of all borders. + */ + void SetWidth(const wxTextAttrDimension& width); + + /** + Sets the width of all borders. + */ + void SetWidth(int value, wxTextAttrUnits units = wxTEXT_ATTR_UNITS_TENTHS_MM) { SetWidth(wxTextAttrDimension(value, units)); } + + /** + Resets all borders. + */ + void Reset() { m_left.Reset(); m_right.Reset(); m_top.Reset(); m_bottom.Reset(); } + + /** + Partial equality test. If @a weakTest is @true, attributes of this object do not + have to be present if those attributes of @a borders are present. If @a weakTest is + @false, the function will fail if an attribute is present in @a borders but not + in this object. + */ + bool EqPartial(const wxTextAttrBorders& borders, bool weakTest = true) const; + + /** + Applies border to this object, but not if the same as @a compareWith. + */ + bool Apply(const wxTextAttrBorders& borders, const wxTextAttrBorders* compareWith = NULL); + + /** + Removes the specified attributes from this object. + */ + bool RemoveStyle(const wxTextAttrBorders& attr); + + /** + Collects the attributes that are common to a range of content, building up a note of + which attributes are absent in some objects and which clash in some objects. + */ + void CollectCommonAttributes(const wxTextAttrBorders& attr, wxTextAttrBorders& clashingAttr, wxTextAttrBorders& absentAttr); + + /** + Returns @true if at least one border is valid. + */ + bool IsValid() const { return m_left.IsValid() || m_right.IsValid() || m_top.IsValid() || m_bottom.IsValid(); } + + /** + Returns @true if no border attributes were set. + */ + bool IsDefault() const { return m_left.IsDefault() && m_right.IsDefault() && m_top.IsDefault() && m_bottom.IsDefault(); } + + /** + Returns the left border. + */ + const wxTextAttrBorder& GetLeft() const { return m_left; } + wxTextAttrBorder& GetLeft() { return m_left; } + + /** + Returns the right border. + */ + const wxTextAttrBorder& GetRight() const { return m_right; } + wxTextAttrBorder& GetRight() { return m_right; } + + /** + Returns the top border. + */ + const wxTextAttrBorder& GetTop() const { return m_top; } + wxTextAttrBorder& GetTop() { return m_top; } + + /** + Returns the bottom border. + */ + const wxTextAttrBorder& GetBottom() const { return m_bottom; } + wxTextAttrBorder& GetBottom() { return m_bottom; } + + wxTextAttrBorder m_left, m_right, m_top, m_bottom; + +}; + +/** + @class wxTextBoxAttr + A class representing the box attributes of a rich text object. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextAttr, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxTextBoxAttr +{ +public: + /** + Default constructor. + */ + wxTextBoxAttr() { Init(); } + + /** + Copy constructor. + */ + wxTextBoxAttr(const wxTextBoxAttr& attr) { Init(); (*this) = attr; } + + /** + Initialises this object. + */ + void Init() { Reset(); } + + /** + Resets this object. + */ + void Reset(); + + // Copy. Unnecessary since we let it do a binary copy + //void Copy(const wxTextBoxAttr& attr); + + // Assignment + //void operator= (const wxTextBoxAttr& attr); + + /** + Equality test. + */ + bool operator== (const wxTextBoxAttr& attr) const; + + /** + Partial equality test, ignoring unset attributes. If @a weakTest is @true, attributes of this object do not + have to be present if those attributes of @a attr are present. If @a weakTest is + @false, the function will fail if an attribute is present in @a attr but not + in this object. + + */ + bool EqPartial(const wxTextBoxAttr& attr, bool weakTest = true) const; + + /** + Merges the given attributes. If @a compareWith is non-NULL, then it will be used + to mask out those attributes that are the same in style and @a compareWith, for + situations where we don't want to explicitly set inherited attributes. + */ + bool Apply(const wxTextBoxAttr& style, const wxTextBoxAttr* compareWith = NULL); + + /** + Collects the attributes that are common to a range of content, building up a note of + which attributes are absent in some objects and which clash in some objects. + */ + void CollectCommonAttributes(const wxTextBoxAttr& attr, wxTextBoxAttr& clashingAttr, wxTextBoxAttr& absentAttr); + + /** + Removes the specified attributes from this object. + */ + bool RemoveStyle(const wxTextBoxAttr& attr); + + /** + Sets the flags. + */ + void SetFlags(int flags) { m_flags = flags; } + + /** + Returns the flags. + */ + int GetFlags() const { return m_flags; } + + /** + Is this flag present? + */ + bool HasFlag(wxTextBoxAttrFlags flag) const { return (m_flags & flag) != 0; } + + /** + Removes this flag. + */ + void RemoveFlag(wxTextBoxAttrFlags flag) { m_flags &= ~flag; } + + /** + Adds this flag. + */ + void AddFlag(wxTextBoxAttrFlags flag) { m_flags |= flag; } + + /** + Returns @true if no attributes are set. + */ + bool IsDefault() const; + + /** + Returns the float mode. + */ + wxTextBoxAttrFloatStyle GetFloatMode() const { return m_floatMode; } + + /** + Sets the float mode. + */ + void SetFloatMode(wxTextBoxAttrFloatStyle mode) { m_floatMode = mode; m_flags |= wxTEXT_BOX_ATTR_FLOAT; } + + /** + Returns @true if float mode is active. + */ + bool HasFloatMode() const { return HasFlag(wxTEXT_BOX_ATTR_FLOAT); } + + /** + Returns @true if this object is floating. + */ + bool IsFloating() const { return HasFloatMode() && GetFloatMode() != wxTEXT_BOX_ATTR_FLOAT_NONE; } + + /** + Returns the clear mode - whether to wrap text after object. Currently unimplemented. + */ + wxTextBoxAttrClearStyle GetClearMode() const { return m_clearMode; } + + /** + Set the clear mode. Currently unimplemented. + */ + void SetClearMode(wxTextBoxAttrClearStyle mode) { m_clearMode = mode; m_flags |= wxTEXT_BOX_ATTR_CLEAR; } + + /** + Returns @true if we have a clear flag. + */ + bool HasClearMode() const { return HasFlag(wxTEXT_BOX_ATTR_CLEAR); } + + /** + Returns the collapse mode - whether to collapse borders. + */ + wxTextBoxAttrCollapseMode GetCollapseBorders() const { return m_collapseMode; } + + /** + Sets the collapse mode - whether to collapse borders. + */ + void SetCollapseBorders(wxTextBoxAttrCollapseMode collapse) { m_collapseMode = collapse; m_flags |= wxTEXT_BOX_ATTR_COLLAPSE_BORDERS; } + + /** + Returns @true if the collapse borders flag is present. + */ + bool HasCollapseBorders() const { return HasFlag(wxTEXT_BOX_ATTR_COLLAPSE_BORDERS); } + + /** + Returns the vertical alignment. + */ + wxTextBoxAttrVerticalAlignment GetVerticalAlignment() const { return m_verticalAlignment; } + + /** + Sets the vertical alignment. + */ + void SetVerticalAlignment(wxTextBoxAttrVerticalAlignment verticalAlignment) { m_verticalAlignment = verticalAlignment; m_flags |= wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT; } + + /** + Returns @true if a vertical alignment flag is present. + */ + bool HasVerticalAlignment() const { return HasFlag(wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT); } + + /** + Returns the margin values. + */ + wxTextAttrDimensions& GetMargins() { return m_margins; } + const wxTextAttrDimensions& GetMargins() const { return m_margins; } + + /** + Returns the left margin. + */ + wxTextAttrDimension& GetLeftMargin() { return m_margins.m_left; } + const wxTextAttrDimension& GetLeftMargin() const { return m_margins.m_left; } + + /** + Returns the right margin. + */ + wxTextAttrDimension& GetRightMargin() { return m_margins.m_right; } + const wxTextAttrDimension& GetRightMargin() const { return m_margins.m_right; } + + /** + Returns the top margin. + */ + wxTextAttrDimension& GetTopMargin() { return m_margins.m_top; } + const wxTextAttrDimension& GetTopMargin() const { return m_margins.m_top; } + + /** + Returns the bottom margin. + */ + wxTextAttrDimension& GetBottomMargin() { return m_margins.m_bottom; } + const wxTextAttrDimension& GetBottomMargin() const { return m_margins.m_bottom; } + + /** + Returns the position. + */ + wxTextAttrDimensions& GetPosition() { return m_position; } + const wxTextAttrDimensions& GetPosition() const { return m_position; } + + /** + Returns the left position. + */ + wxTextAttrDimension& GetLeft() { return m_position.m_left; } + const wxTextAttrDimension& GetLeft() const { return m_position.m_left; } + + /** + Returns the right position. + */ + wxTextAttrDimension& GetRight() { return m_position.m_right; } + const wxTextAttrDimension& GetRight() const { return m_position.m_right; } + + /** + Returns the top position. + */ + wxTextAttrDimension& GetTop() { return m_position.m_top; } + const wxTextAttrDimension& GetTop() const { return m_position.m_top; } + + /** + Returns the bottom position. + */ + wxTextAttrDimension& GetBottom() { return m_position.m_bottom; } + const wxTextAttrDimension& GetBottom() const { return m_position.m_bottom; } + + /** + Returns the padding values. + */ + wxTextAttrDimensions& GetPadding() { return m_padding; } + const wxTextAttrDimensions& GetPadding() const { return m_padding; } + + /** + Returns the left padding value. + */ + wxTextAttrDimension& GetLeftPadding() { return m_padding.m_left; } + const wxTextAttrDimension& GetLeftPadding() const { return m_padding.m_left; } + + /** + Returns the right padding value. + */ + wxTextAttrDimension& GetRightPadding() { return m_padding.m_right; } + const wxTextAttrDimension& GetRightPadding() const { return m_padding.m_right; } + + /** + Returns the top padding value. + */ + wxTextAttrDimension& GetTopPadding() { return m_padding.m_top; } + const wxTextAttrDimension& GetTopPadding() const { return m_padding.m_top; } + + /** + Returns the bottom padding value. + */ + wxTextAttrDimension& GetBottomPadding() { return m_padding.m_bottom; } + const wxTextAttrDimension& GetBottomPadding() const { return m_padding.m_bottom; } + + /** + Returns the borders. + */ + wxTextAttrBorders& GetBorder() { return m_border; } + const wxTextAttrBorders& GetBorder() const { return m_border; } + + /** + Returns the left border. + */ + wxTextAttrBorder& GetLeftBorder() { return m_border.m_left; } + const wxTextAttrBorder& GetLeftBorder() const { return m_border.m_left; } + + /** + Returns the top border. + */ + wxTextAttrBorder& GetTopBorder() { return m_border.m_top; } + const wxTextAttrBorder& GetTopBorder() const { return m_border.m_top; } + + /** + Returns the right border. + */ + wxTextAttrBorder& GetRightBorder() { return m_border.m_right; } + const wxTextAttrBorder& GetRightBorder() const { return m_border.m_right; } + + /** + Returns the bottom border. + */ + wxTextAttrBorder& GetBottomBorder() { return m_border.m_bottom; } + const wxTextAttrBorder& GetBottomBorder() const { return m_border.m_bottom; } + + /** + Returns the outline. + */ + wxTextAttrBorders& GetOutline() { return m_outline; } + const wxTextAttrBorders& GetOutline() const { return m_outline; } + + /** + Returns the left outline. + */ + wxTextAttrBorder& GetLeftOutline() { return m_outline.m_left; } + const wxTextAttrBorder& GetLeftOutline() const { return m_outline.m_left; } + + /** + Returns the top outline. + */ + wxTextAttrBorder& GetTopOutline() { return m_outline.m_top; } + const wxTextAttrBorder& GetTopOutline() const { return m_outline.m_top; } + + /** + Returns the right outline. + */ + wxTextAttrBorder& GetRightOutline() { return m_outline.m_right; } + const wxTextAttrBorder& GetRightOutline() const { return m_outline.m_right; } + + /** + Returns the bottom outline. + */ + wxTextAttrBorder& GetBottomOutline() { return m_outline.m_bottom; } + const wxTextAttrBorder& GetBottomOutline() const { return m_outline.m_bottom; } + + /** + Returns the object size. + */ + wxTextAttrSize& GetSize() { return m_size; } + const wxTextAttrSize& GetSize() const { return m_size; } + + /** + Returns the object minimum size. + */ + + wxTextAttrSize& GetMinSize() { return m_minSize; } + const wxTextAttrSize& GetMinSize() const { return m_minSize; } + + /** + Returns the object maximum size. + */ + + wxTextAttrSize& GetMaxSize() { return m_maxSize; } + const wxTextAttrSize& GetMaxSize() const { return m_maxSize; } + + /** + Sets the object size. + */ + void SetSize(const wxTextAttrSize& sz) { m_size = sz; } + + /** + Sets the object minimum size. + */ + void SetMinSize(const wxTextAttrSize& sz) { m_minSize = sz; } + + /** + Sets the object maximum size. + */ + void SetMaxSize(const wxTextAttrSize& sz) { m_maxSize = sz; } + + /** + Returns the object width. + */ + wxTextAttrDimension& GetWidth() { return m_size.m_width; } + const wxTextAttrDimension& GetWidth() const { return m_size.m_width; } + + /** + Returns the object height. + */ + wxTextAttrDimension& GetHeight() { return m_size.m_height; } + const wxTextAttrDimension& GetHeight() const { return m_size.m_height; } + + /** + Returns the box style name. + */ + const wxString& GetBoxStyleName() const { return m_boxStyleName; } + + /** + Sets the box style name. + */ + void SetBoxStyleName(const wxString& name) { m_boxStyleName = name; AddFlag(wxTEXT_BOX_ATTR_BOX_STYLE_NAME); } + + /** + Returns @true if the box style name is present. + */ + bool HasBoxStyleName() const { return HasFlag(wxTEXT_BOX_ATTR_BOX_STYLE_NAME); } + +public: + + int m_flags; + + wxTextAttrDimensions m_margins; + wxTextAttrDimensions m_padding; + wxTextAttrDimensions m_position; + + wxTextAttrSize m_size; + wxTextAttrSize m_minSize; + wxTextAttrSize m_maxSize; + + wxTextAttrBorders m_border; + wxTextAttrBorders m_outline; + + wxTextBoxAttrFloatStyle m_floatMode; + wxTextBoxAttrClearStyle m_clearMode; + wxTextBoxAttrCollapseMode m_collapseMode; + wxTextBoxAttrVerticalAlignment m_verticalAlignment; + wxString m_boxStyleName; +}; + +/** + @class wxRichTextAttr + A class representing enhanced attributes for rich text objects. + This adds a wxTextBoxAttr member to the basic wxTextAttr class. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextAttr, wxTextBoxAttr, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextAttr: public wxTextAttr +{ +public: + /** + Constructor taking a wxTextAttr. + */ + wxRichTextAttr(const wxTextAttr& attr) { wxTextAttr::Copy(attr); } + + /** + Copy constructor. + */ + wxRichTextAttr(const wxRichTextAttr& attr): wxTextAttr() { Copy(attr); } + + /** + Default constructor. + */ + wxRichTextAttr() {} + + /** + Copy function. + */ + void Copy(const wxRichTextAttr& attr); + + /** + Assignment operator. + */ + void operator=(const wxRichTextAttr& attr) { Copy(attr); } + + /** + Assignment operator. + */ + void operator=(const wxTextAttr& attr) { wxTextAttr::Copy(attr); } + + /** + Equality test. + */ + bool operator==(const wxRichTextAttr& attr) const; + + /** + Partial equality test. If @a weakTest is @true, attributes of this object do not + have to be present if those attributes of @a attr are present. If @a weakTest is + @false, the function will fail if an attribute is present in @a attr but not + in this object. + */ + bool EqPartial(const wxRichTextAttr& attr, bool weakTest = true) const; + + /** + Merges the given attributes. If @a compareWith + is non-NULL, then it will be used to mask out those attributes that are the same in style + and @a compareWith, for situations where we don't want to explicitly set inherited attributes. + */ + bool Apply(const wxRichTextAttr& style, const wxRichTextAttr* compareWith = NULL); + + /** + Collects the attributes that are common to a range of content, building up a note of + which attributes are absent in some objects and which clash in some objects. + */ + void CollectCommonAttributes(const wxRichTextAttr& attr, wxRichTextAttr& clashingAttr, wxRichTextAttr& absentAttr); + + /** + Removes the specified attributes from this object. + */ + bool RemoveStyle(const wxRichTextAttr& attr); + + /** + Returns the text box attributes. + */ + wxTextBoxAttr& GetTextBoxAttr() { return m_textBoxAttr; } + const wxTextBoxAttr& GetTextBoxAttr() const { return m_textBoxAttr; } + + /** + Set the text box attributes. + */ + void SetTextBoxAttr(const wxTextBoxAttr& attr) { m_textBoxAttr = attr; } + + /** + Returns @true if no attributes are set. + */ + bool IsDefault() const { return (GetFlags() == 0) && m_textBoxAttr.IsDefault(); } + + wxTextBoxAttr m_textBoxAttr; +}; + +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxRichTextAttr, wxRichTextAttrArray, WXDLLIMPEXP_RICHTEXT); + +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxVariant, wxRichTextVariantArray, WXDLLIMPEXP_RICHTEXT); + +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxRect, wxRichTextRectArray, WXDLLIMPEXP_RICHTEXT); + +/** + @class wxRichTextProperties + A simple property class using wxVariants. This is used to give each rich text object the + ability to store custom properties that can be used by the application. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextBuffer, wxRichTextObject, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextProperties: public wxObject +{ +DECLARE_DYNAMIC_CLASS(wxRichTextProperties) +public: + + /** + Default constructor. + */ + wxRichTextProperties() {} + + /** + Copy constructor. + */ + wxRichTextProperties(const wxRichTextProperties& props): wxObject() { Copy(props); } + + /** + Assignment operator. + */ + void operator=(const wxRichTextProperties& props) { Copy(props); } + + /** + Equality operator. + */ + bool operator==(const wxRichTextProperties& props) const; + + /** + Copies from @a props. + */ + void Copy(const wxRichTextProperties& props) { m_properties = props.m_properties; } + + /** + Returns the variant at the given index. + */ + const wxVariant& operator[](size_t idx) const { return m_properties[idx]; } + + /** + Returns the variant at the given index. + */ + wxVariant& operator[](size_t idx) { return m_properties[idx]; } + + /** + Clears the properties. + */ + void Clear() { m_properties.Clear(); } + + /** + Returns the array of variants implementing the properties. + */ + const wxRichTextVariantArray& GetProperties() const { return m_properties; } + + /** + Returns the array of variants implementing the properties. + */ + wxRichTextVariantArray& GetProperties() { return m_properties; } + + /** + Sets the array of variants. + */ + void SetProperties(const wxRichTextVariantArray& props) { m_properties = props; } + + /** + Returns all the property names. + */ + wxArrayString GetPropertyNames() const; + + /** + Returns a count of the properties. + */ + size_t GetCount() const { return m_properties.GetCount(); } + + /** + Returns @true if the given property is found. + */ + bool HasProperty(const wxString& name) const { return Find(name) != -1; } + + /** + Finds the given property. + */ + int Find(const wxString& name) const; + + /** + Removes the given property. + */ + bool Remove(const wxString& name); + + /** + Gets the property variant by name. + */ + const wxVariant& GetProperty(const wxString& name) const; + + /** + Finds or creates a property with the given name, returning a pointer to the variant. + */ + wxVariant* FindOrCreateProperty(const wxString& name); + + /** + Gets the value of the named property as a string. + */ + wxString GetPropertyString(const wxString& name) const; + + /** + Gets the value of the named property as a long integer. + */ + long GetPropertyLong(const wxString& name) const; + + /** + Gets the value of the named property as a boolean. + */ + bool GetPropertyBool(const wxString& name) const; + + /** + Gets the value of the named property as a double. + */ + double GetPropertyDouble(const wxString& name) const; + + /** + Sets the property by passing a variant which contains a name and value. + */ + void SetProperty(const wxVariant& variant); + + /** + Sets a property by name and variant. + */ + void SetProperty(const wxString& name, const wxVariant& variant); + + /** + Sets a property by name and string value. + */ + void SetProperty(const wxString& name, const wxString& value); + + /** + Sets a property by name and wxChar* value. + */ + void SetProperty(const wxString& name, const wxChar* value) { SetProperty(name, wxString(value)); } + + /** + Sets property by name and long integer value. + */ + void SetProperty(const wxString& name, long value); + + /** + Sets property by name and double value. + */ + void SetProperty(const wxString& name, double value); + + /** + Sets property by name and boolean value. + */ + void SetProperty(const wxString& name, bool value); + + /** + Removes the given properties from these properties. + */ + void RemoveProperties(const wxRichTextProperties& properties); + + /** + Merges the given properties with these properties. + */ + void MergeProperties(const wxRichTextProperties& properties); + +protected: + wxRichTextVariantArray m_properties; +}; + + +/** + @class wxRichTextFontTable + Manages quick access to a pool of fonts for rendering rich text. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextFontTable: public wxObject +{ +public: + /** + Default constructor. + */ + wxRichTextFontTable(); + + /** + Copy constructor. + */ + wxRichTextFontTable(const wxRichTextFontTable& table); + virtual ~wxRichTextFontTable(); + + /** + Returns @true if the font table is valid. + */ + bool IsOk() const { return m_refData != NULL; } + + /** + Finds a font for the given attribute object. + */ + wxFont FindFont(const wxRichTextAttr& fontSpec); + + /** + Clears the font table. + */ + void Clear(); + + /** + Assignment operator. + */ + void operator= (const wxRichTextFontTable& table); + + /** + Equality operator. + */ + bool operator == (const wxRichTextFontTable& table) const; + + /** + Inequality operator. + */ + bool operator != (const wxRichTextFontTable& table) const { return !(*this == table); } + + /** + Set the font scale factor. + */ + void SetFontScale(double fontScale); + +protected: + + double m_fontScale; + + DECLARE_DYNAMIC_CLASS(wxRichTextFontTable) +}; + +/** + @class wxRichTextRange + + This stores beginning and end positions for a range of data. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextRange +{ +public: +// Constructors + + /** + Default constructor. + */ + wxRichTextRange() { m_start = 0; m_end = 0; } + + /** + Constructor taking start and end positions. + */ + wxRichTextRange(long start, long end) { m_start = start; m_end = end; } + + /** + Copy constructor. + */ + wxRichTextRange(const wxRichTextRange& range) { m_start = range.m_start; m_end = range.m_end; } + ~wxRichTextRange() {} + + /** + Assigns @a range to this range. + */ + void operator =(const wxRichTextRange& range) { m_start = range.m_start; m_end = range.m_end; } + + /** + Equality operator. Returns @true if @a range is the same as this range. + */ + bool operator ==(const wxRichTextRange& range) const { return (m_start == range.m_start && m_end == range.m_end); } + + /** + Inequality operator. + */ + bool operator !=(const wxRichTextRange& range) const { return (m_start != range.m_start || m_end != range.m_end); } + + /** + Subtracts a range from this range. + */ + wxRichTextRange operator -(const wxRichTextRange& range) const { return wxRichTextRange(m_start - range.m_start, m_end - range.m_end); } + + /** + Adds a range to this range. + */ + wxRichTextRange operator +(const wxRichTextRange& range) const { return wxRichTextRange(m_start + range.m_start, m_end + range.m_end); } + + /** + Sets the range start and end positions. + */ + void SetRange(long start, long end) { m_start = start; m_end = end; } + + /** + Sets the start position. + */ + void SetStart(long start) { m_start = start; } + + /** + Returns the start position. + */ + long GetStart() const { return m_start; } + + /** + Sets the end position. + */ + void SetEnd(long end) { m_end = end; } + + /** + Gets the end position. + */ + long GetEnd() const { return m_end; } + + /** + Returns true if this range is completely outside @a range. + */ + bool IsOutside(const wxRichTextRange& range) const { return range.m_start > m_end || range.m_end < m_start; } + + /** + Returns true if this range is completely within @a range. + */ + bool IsWithin(const wxRichTextRange& range) const { return m_start >= range.m_start && m_end <= range.m_end; } + + /** + Returns true if @a pos was within the range. Does not match if the range is empty. + */ + bool Contains(long pos) const { return pos >= m_start && pos <= m_end ; } + + /** + Limit this range to be within @a range. + */ + bool LimitTo(const wxRichTextRange& range) ; + + /** + Gets the length of the range. + */ + long GetLength() const { return m_end - m_start + 1; } + + /** + Swaps the start and end. + */ + void Swap() { long tmp = m_start; m_start = m_end; m_end = tmp; } + + /** + Converts the API-standard range, whose end is one past the last character in + the range, to the internal form, which uses the first and last character + positions of the range. In other words, one is subtracted from the end position. + (n, n) is the range of a single character. + */ + wxRichTextRange ToInternal() const { return wxRichTextRange(m_start, m_end-1); } + + /** + Converts the internal range, which uses the first and last character positions + of the range, to the API-standard range, whose end is one past the last + character in the range. In other words, one is added to the end position. + (n, n+1) is the range of a single character. + */ + wxRichTextRange FromInternal() const { return wxRichTextRange(m_start, m_end+1); } + +protected: + long m_start; + long m_end; +}; + +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxRichTextRange, wxRichTextRangeArray, WXDLLIMPEXP_RICHTEXT); + +#define wxRICHTEXT_ALL wxRichTextRange(-2, -2) +#define wxRICHTEXT_NONE wxRichTextRange(-1, -1) + +#define wxRICHTEXT_NO_SELECTION wxRichTextRange(-2, -2) + +/** + @class wxRichTextSelection + + Stores selection information. The selection does not have to be contiguous, though currently non-contiguous + selections are only supported for a range of table cells (a geometric block of cells can consist + of a set of non-contiguous positions). + + The selection consists of an array of ranges, and the container that is the context for the selection. It + follows that a single selection object can only represent ranges with the same parent container. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextSelection +{ +public: + /** + Copy constructor. + */ + wxRichTextSelection(const wxRichTextSelection& sel) { Copy(sel); } + + /** + Creates a selection from a range and a container. + */ + wxRichTextSelection(const wxRichTextRange& range, wxRichTextParagraphLayoutBox* container) { m_ranges.Add(range); m_container = container; } + + /** + Default constructor. + */ + wxRichTextSelection() { Reset(); } + + /** + Resets the selection. + */ + void Reset() { m_ranges.Clear(); m_container = NULL; } + + /** + Sets the selection. + */ + + void Set(const wxRichTextRange& range, wxRichTextParagraphLayoutBox* container) + { m_ranges.Clear(); m_ranges.Add(range); m_container = container; } + + /** + Adds a range to the selection. + */ + void Add(const wxRichTextRange& range) + { m_ranges.Add(range); } + + /** + Sets the selections from an array of ranges and a container object. + */ + void Set(const wxRichTextRangeArray& ranges, wxRichTextParagraphLayoutBox* container) + { m_ranges = ranges; m_container = container; } + + /** + Copies from @a sel. + */ + void Copy(const wxRichTextSelection& sel) + { m_ranges = sel.m_ranges; m_container = sel.m_container; } + + /** + Assignment operator. + */ + void operator=(const wxRichTextSelection& sel) { Copy(sel); } + + /** + Equality operator. + */ + bool operator==(const wxRichTextSelection& sel) const; + + /** + Index operator. + */ + wxRichTextRange operator[](size_t i) const { return GetRange(i); } + + /** + Returns the selection ranges. + */ + wxRichTextRangeArray& GetRanges() { return m_ranges; } + + /** + Returns the selection ranges. + */ + const wxRichTextRangeArray& GetRanges() const { return m_ranges; } + + /** + Sets the selection ranges. + */ + void SetRanges(const wxRichTextRangeArray& ranges) { m_ranges = ranges; } + + /** + Returns the number of ranges in the selection. + */ + size_t GetCount() const { return m_ranges.GetCount(); } + + /** + Returns the range at the given index. + + */ + wxRichTextRange GetRange(size_t i) const { return m_ranges[i]; } + + /** + Returns the first range if there is one, otherwise wxRICHTEXT_NO_SELECTION. + */ + wxRichTextRange GetRange() const { return (m_ranges.GetCount() > 0) ? (m_ranges[0]) : wxRICHTEXT_NO_SELECTION; } + + /** + Sets a single range. + */ + void SetRange(const wxRichTextRange& range) { m_ranges.Clear(); m_ranges.Add(range); } + + /** + Returns the container for which the selection is valid. + */ + wxRichTextParagraphLayoutBox* GetContainer() const { return m_container; } + + /** + Sets the container for which the selection is valid. + */ + void SetContainer(wxRichTextParagraphLayoutBox* container) { m_container = container; } + + /** + Returns @true if the selection is valid. + */ + bool IsValid() const { return m_ranges.GetCount() > 0 && GetContainer(); } + + /** + Returns the selection appropriate to the specified object, if any; returns an empty array if none + at the level of the object's container. + */ + wxRichTextRangeArray GetSelectionForObject(wxRichTextObject* obj) const; + + /** + Returns @true if the given position is within the selection. + */ + bool WithinSelection(long pos, wxRichTextObject* obj) const; + + /** + Returns @true if the given position is within the selection. + + */ + bool WithinSelection(long pos) const { return WithinSelection(pos, m_ranges); } + + /** + Returns @true if the given position is within the selection range. + */ + static bool WithinSelection(long pos, const wxRichTextRangeArray& ranges); + + /** + Returns @true if the given range is within the selection range. + */ + static bool WithinSelection(const wxRichTextRange& range, const wxRichTextRangeArray& ranges); + + wxRichTextRangeArray m_ranges; + wxRichTextParagraphLayoutBox* m_container; +}; + +/** + @class wxRichTextDrawingContext + + A class for passing information to drawing and measuring functions. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextDrawingContext: public wxObject +{ + DECLARE_CLASS(wxRichTextDrawingContext) +public: + + /** + Pass the buffer to the context so the context can retrieve information + such as virtual attributes. + */ + wxRichTextDrawingContext(wxRichTextBuffer* buffer); + + void Init() { m_buffer = NULL; m_enableVirtualAttributes = true; } + + /** + Does this object have virtual attributes? + Virtual attributes can be provided for visual cues without + affecting the actual styling. + */ + bool HasVirtualAttributes(wxRichTextObject* obj) const; + + /** + Returns the virtual attributes for this object. + Virtual attributes can be provided for visual cues without + affecting the actual styling. + */ + wxRichTextAttr GetVirtualAttributes(wxRichTextObject* obj) const; + + /** + Applies any virtual attributes relevant to this object. + */ + bool ApplyVirtualAttributes(wxRichTextAttr& attr, wxRichTextObject* obj) const; + + /** + Gets the count for mixed virtual attributes for individual positions within the object. + For example, individual characters within a text object may require special highlighting. + */ + int GetVirtualSubobjectAttributesCount(wxRichTextObject* obj) const; + + /** + Gets the mixed virtual attributes for individual positions within the object. + For example, individual characters within a text object may require special highlighting. + The function is passed the count returned by GetVirtualSubobjectAttributesCount. + */ + int GetVirtualSubobjectAttributes(wxRichTextObject* obj, wxArrayInt& positions, wxRichTextAttrArray& attributes) const; + + /** + Do we have virtual text for this object? Virtual text allows an application + to replace characters in an object for editing and display purposes, for example + for highlighting special characters. + */ + bool HasVirtualText(const wxRichTextPlainText* obj) const; + + /** + Gets the virtual text for this object. + */ + bool GetVirtualText(const wxRichTextPlainText* obj, wxString& text) const; + + /** + Enables virtual attribute processing. + */ + + void EnableVirtualAttributes(bool b) { m_enableVirtualAttributes = b; } + + /** + Returns @true if virtual attribute processing is enabled. + */ + + bool GetVirtualAttributesEnabled() const { return m_enableVirtualAttributes; } + + wxRichTextBuffer* m_buffer; + bool m_enableVirtualAttributes; +}; + +/** + @class wxRichTextObject + + This is the base for drawable rich text objects. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextObject: public wxObject +{ + DECLARE_CLASS(wxRichTextObject) +public: + /** + Constructor, taking an optional parent pointer. + */ + wxRichTextObject(wxRichTextObject* parent = NULL); + + virtual ~wxRichTextObject(); + +// Overridables + + /** + Draw the item, within the given range. Some objects may ignore the range (for + example paragraphs) while others must obey it (lines, to implement wrapping) + */ + virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style) = 0; + + /** + Lay the item out at the specified position with the given size constraint. + Layout must set the cached size. @rect is the available space for the object, + and @a parentRect is the container that is used to determine a relative size + or position (for example if a text box must be 50% of the parent text box). + */ + virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style) = 0; + + /** + Hit-testing: returns a flag indicating hit test details, plus + information about position. @a contextObj is returned to specify what object + position is relevant to, since otherwise there's an ambiguity. + @ obj might not be a child of @a contextObj, since we may be referring to the container itself + if we have no hit on a child - for example if we click outside an object. + + The function puts the position in @a textPosition if one is found. + @a pt is in logical units (a zero y position is at the beginning of the buffer). + + Pass wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS if you only want to consider objects + directly under the object you are calling HitTest on. Otherwise, it will recurse + and potentially find a nested object. + + @return One of the ::wxRichTextHitTestFlags values. + */ + + virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0); + + /** + Finds the absolute position and row height for the given character position. + */ + virtual bool FindPosition(wxDC& WXUNUSED(dc), wxRichTextDrawingContext& WXUNUSED(context), long WXUNUSED(index), wxPoint& WXUNUSED(pt), int* WXUNUSED(height), bool WXUNUSED(forceLineStart)) { return false; } + + /** + Returns the best size, i.e. the ideal starting size for this object irrespective + of available space. For a short text string, it will be the size that exactly encloses + the text. For a longer string, it might use the parent width for example. + */ + virtual wxSize GetBestSize() const { return m_size; } + + /** + Returns the object size for the given range. Returns @false if the range + is invalid for this object. + */ + + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const = 0; + + /** + Do a split from @a pos, returning an object containing the second part, and setting + the first part in 'this'. + */ + virtual wxRichTextObject* DoSplit(long WXUNUSED(pos)) { return NULL; } + + /** + Calculates the range of the object. By default, guess that the object is 1 unit long. + */ + virtual void CalculateRange(long start, long& end) { end = start ; m_range.SetRange(start, end); } + + /** + Deletes the given range. + */ + virtual bool DeleteRange(const wxRichTextRange& WXUNUSED(range)) { return false; } + + /** + Returns @true if the object is empty. + */ + virtual bool IsEmpty() const { return false; } + + /** + Returns @true if this class of object is floatable. + */ + virtual bool IsFloatable() const { return false; } + + /** + Returns @true if this object is currently floating. + */ + virtual bool IsFloating() const { return GetAttributes().GetTextBoxAttr().IsFloating(); } + + /** + Returns the floating direction. + */ + virtual int GetFloatDirection() const { return GetAttributes().GetTextBoxAttr().GetFloatMode(); } + + /** + Returns any text in this object for the given range. + */ + virtual wxString GetTextForRange(const wxRichTextRange& WXUNUSED(range)) const { return wxEmptyString; } + + /** + Returns @true if this object can merge itself with the given one. + */ + virtual bool CanMerge(wxRichTextObject* WXUNUSED(object), wxRichTextDrawingContext& WXUNUSED(context)) const { return false; } + + /** + Returns @true if this object merged itself with the given one. + The calling code will then delete the given object. + */ + virtual bool Merge(wxRichTextObject* WXUNUSED(object), wxRichTextDrawingContext& WXUNUSED(context)) { return false; } + + /** + JACS + Returns @true if this object can potentially be split, by virtue of having + different virtual attributes for individual sub-objects. + */ + virtual bool CanSplit(wxRichTextDrawingContext& WXUNUSED(context)) const { return false; } + + /** + Returns the final object in the split objects if this object was split due to differences between sub-object virtual attributes. + Returns itself if it was not split. + */ + virtual wxRichTextObject* Split(wxRichTextDrawingContext& WXUNUSED(context)) { return this; } + + /** + Dump object data to the given output stream for debugging. + */ + virtual void Dump(wxTextOutputStream& stream); + + /** + Returns @true if we can edit the object's properties via a GUI. + */ + virtual bool CanEditProperties() const { return false; } + + /** + Edits the object's properties via a GUI. + */ + virtual bool EditProperties(wxWindow* WXUNUSED(parent), wxRichTextBuffer* WXUNUSED(buffer)) { return false; } + + /** + Returns the label to be used for the properties context menu item. + */ + virtual wxString GetPropertiesMenuLabel() const { return wxEmptyString; } + + /** + Returns @true if objects of this class can accept the focus, i.e. a call to SetFocusObject + is possible. For example, containers supporting text, such as a text box object, can accept the focus, + but a table can't (set the focus to individual cells instead). + */ + virtual bool AcceptsFocus() const { return false; } + +#if wxUSE_XML + /** + Imports this object from XML. + */ + virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse); +#endif + +#if wxRICHTEXT_HAVE_DIRECT_OUTPUT + /** + Exports this object directly to the given stream, bypassing the creation of a wxXmlNode hierarchy. + This method is considerably faster than creating a tree first. However, both versions of ExportXML must be + implemented so that if the tree method is made efficient in the future, we can deprecate the + more verbose direct output method. Compiled only if wxRICHTEXT_HAVE_DIRECT_OUTPUT is defined (on by default). + */ + virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler); +#endif + +#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT + /** + Exports this object to the given parent node, usually creating at least one child node. + This method is less efficient than the direct-to-stream method but is retained to allow for + switching to this method if we make it more efficient. Compiled only if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT is defined + (on by default). + */ + virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler); +#endif + + /** + Returns @true if this object takes note of paragraph attributes (text and image objects don't). + */ + virtual bool UsesParagraphAttributes() const { return true; } + + /** + Returns the XML node name of this object. This must be overridden for wxXmlNode-base XML export to work. + */ + virtual wxString GetXMLNodeName() const { return wxT("unknown"); } + + /** + Invalidates the object at the given range. With no argument, invalidates the whole object. + */ + virtual void Invalidate(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL); + + /** + Returns @true if this object can handle the selections of its children, fOr example a table. + Required for composite selection handling to work. + */ + virtual bool HandlesChildSelections() const { return false; } + + /** + Returns a selection object specifying the selections between start and end character positions. + For example, a table would deduce what cells (of range length 1) are selected when dragging across the table. + */ + virtual wxRichTextSelection GetSelection(long WXUNUSED(start), long WXUNUSED(end)) const { return wxRichTextSelection(); } + +// Accessors + + /** + Gets the cached object size as calculated by Layout. + */ + virtual wxSize GetCachedSize() const { return m_size; } + + /** + Sets the cached object size as calculated by Layout. + */ + virtual void SetCachedSize(const wxSize& sz) { m_size = sz; } + + /** + Gets the maximum object size as calculated by Layout. This allows + us to fit an object to its contents or allocate extra space if required. + */ + virtual wxSize GetMaxSize() const { return m_maxSize; } + + /** + Sets the maximum object size as calculated by Layout. This allows + us to fit an object to its contents or allocate extra space if required. + */ + virtual void SetMaxSize(const wxSize& sz) { m_maxSize = sz; } + + /** + Gets the minimum object size as calculated by Layout. This allows + us to constrain an object to its absolute minimum size if necessary. + */ + virtual wxSize GetMinSize() const { return m_minSize; } + + /** + Sets the minimum object size as calculated by Layout. This allows + us to constrain an object to its absolute minimum size if necessary. + */ + virtual void SetMinSize(const wxSize& sz) { m_minSize = sz; } + + /** + Gets the 'natural' size for an object. For an image, it would be the + image size. + */ + virtual wxTextAttrSize GetNaturalSize() const { return wxTextAttrSize(); } + + /** + Returns the object position in pixels. + */ + virtual wxPoint GetPosition() const { return m_pos; } + + /** + Sets the object position in pixels. + */ + virtual void SetPosition(const wxPoint& pos) { m_pos = pos; } + + /** + Returns the absolute object position, by traversing up the child/parent hierarchy. + TODO: may not be needed, if all object positions are in fact relative to the + top of the coordinate space. + */ + virtual wxPoint GetAbsolutePosition() const; + + /** + Returns the rectangle enclosing the object. + */ + virtual wxRect GetRect() const { return wxRect(GetPosition(), GetCachedSize()); } + + /** + Sets the object's range within its container. + */ + void SetRange(const wxRichTextRange& range) { m_range = range; } + + /** + Returns the object's range. + */ + const wxRichTextRange& GetRange() const { return m_range; } + + /** + Returns the object's range. + */ + wxRichTextRange& GetRange() { return m_range; } + + /** + Set the object's own range, for a top-level object with its own position space. + */ + void SetOwnRange(const wxRichTextRange& range) { m_ownRange = range; } + + /** + Returns the object's own range (valid if top-level). + */ + const wxRichTextRange& GetOwnRange() const { return m_ownRange; } + + /** + Returns the object's own range (valid if top-level). + */ + wxRichTextRange& GetOwnRange() { return m_ownRange; } + + /** + Returns the object's own range only if a top-level object. + */ + wxRichTextRange GetOwnRangeIfTopLevel() const { return IsTopLevel() ? m_ownRange : m_range; } + + /** + Returns @true if this object is composite. + */ + virtual bool IsComposite() const { return false; } + + /** + Returns @true if no user editing can be done inside the object. This returns @true for simple objects, + @false for most composite objects, but @true for fields, which if composite, should not be user-edited. + */ + virtual bool IsAtomic() const { return true; } + + /** + Returns a pointer to the parent object. + */ + virtual wxRichTextObject* GetParent() const { return m_parent; } + + /** + Sets the pointer to the parent object. + */ + virtual void SetParent(wxRichTextObject* parent) { m_parent = parent; } + + /** + Returns the top-level container of this object. + May return itself if it's a container; use GetParentContainer to return + a different container. + */ + virtual wxRichTextParagraphLayoutBox* GetContainer() const; + + /** + Returns the top-level container of this object. + Returns a different container than itself, unless there's no parent, in which case it will return NULL. + */ + virtual wxRichTextParagraphLayoutBox* GetParentContainer() const { return GetParent() ? GetParent()->GetContainer() : GetContainer(); } + + /** + Set the margin around the object, in pixels. + */ + virtual void SetMargins(int margin); + + /** + Set the margin around the object, in pixels. + */ + virtual void SetMargins(int leftMargin, int rightMargin, int topMargin, int bottomMargin); + + /** + Returns the left margin of the object, in pixels. + */ + virtual int GetLeftMargin() const; + + /** + Returns the right margin of the object, in pixels. + */ + virtual int GetRightMargin() const; + + /** + Returns the top margin of the object, in pixels. + */ + virtual int GetTopMargin() const; + + /** + Returns the bottom margin of the object, in pixels. + */ + virtual int GetBottomMargin() const; + + /** + Calculates the available content space in the given rectangle, given the + margins, border and padding specified in the object's attributes. + */ + virtual wxRect GetAvailableContentArea(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& outerRect) const; + + /** + Lays out the object first with a given amount of space, and then if no width was specified in attr, + lays out the object again using the minimum size. @a availableParentSpace is the maximum space + for the object, whereas @a availableContainerSpace is the container with which relative positions and + sizes should be computed. For example, a text box whose space has already been constrained + in a previous layout pass to @a availableParentSpace, but should have a width of 50% of @a availableContainerSpace. + (If these two rects were the same, a 2nd pass could see the object getting too small.) + */ + virtual bool LayoutToBestSize(wxDC& dc, wxRichTextDrawingContext& context, wxRichTextBuffer* buffer, + const wxRichTextAttr& parentAttr, const wxRichTextAttr& attr, + const wxRect& availableParentSpace, const wxRect& availableContainerSpace, int style); + + /** + Adjusts the attributes for virtual attribute provision, collapsed borders, etc. + */ + virtual bool AdjustAttributes(wxRichTextAttr& attr, wxRichTextDrawingContext& context); + + /** + Sets the object's attributes. + */ + void SetAttributes(const wxRichTextAttr& attr) { m_attributes = attr; } + + /** + Returns the object's attributes. + */ + const wxRichTextAttr& GetAttributes() const { return m_attributes; } + + /** + Returns the object's attributes. + */ + wxRichTextAttr& GetAttributes() { return m_attributes; } + + /** + Returns the object's properties. + */ + wxRichTextProperties& GetProperties() { return m_properties; } + + /** + Returns the object's properties. + */ + const wxRichTextProperties& GetProperties() const { return m_properties; } + + /** + Sets the object's properties. + */ + void SetProperties(const wxRichTextProperties& props) { m_properties = props; } + + /** + Sets the stored descent value. + */ + void SetDescent(int descent) { m_descent = descent; } + + /** + Returns the stored descent value. + */ + int GetDescent() const { return m_descent; } + + /** + Returns the containing buffer. + */ + wxRichTextBuffer* GetBuffer() const; + + /** + Sets the identifying name for this object as a property using the "name" key. + */ + void SetName(const wxString& name) { m_properties.SetProperty(wxT("name"), name); } + + /** + Returns the identifying name for this object from the properties, using the "name" key. + */ + wxString GetName() const { return m_properties.GetPropertyString(wxT("name")); } + + /** + Returns @true if this object is top-level, i.e. contains its own paragraphs, such as a text box. + */ + virtual bool IsTopLevel() const { return false; } + + /** + Returns @true if the object will be shown, @false otherwise. + */ + bool IsShown() const { return m_show; } + +// Operations + + /** + Call to show or hide this object. This function does not cause the content to be + laid out or redrawn. + */ + virtual void Show(bool show) { m_show = show; } + + /** + Clones the object. + */ + virtual wxRichTextObject* Clone() const { return NULL; } + + /** + Copies the object. + */ + void Copy(const wxRichTextObject& obj); + + /** + Reference-counting allows us to use the same object in multiple + lists (not yet used). + */ + + void Reference() { m_refCount ++; } + + /** + Reference-counting allows us to use the same object in multiple + lists (not yet used). + */ + void Dereference(); + + /** + Moves the object recursively, by adding the offset from old to new. + */ + virtual void Move(const wxPoint& pt); + + /** + Converts units in tenths of a millimetre to device units. + */ + int ConvertTenthsMMToPixels(wxDC& dc, int units) const; + + /** + Converts units in tenths of a millimetre to device units. + */ + static int ConvertTenthsMMToPixels(int ppi, int units, double scale = 1.0); + + /** + Convert units in pixels to tenths of a millimetre. + */ + int ConvertPixelsToTenthsMM(wxDC& dc, int pixels) const; + + /** + Convert units in pixels to tenths of a millimetre. + */ + static int ConvertPixelsToTenthsMM(int ppi, int pixels, double scale = 1.0); + + /** + Draws the borders and background for the given rectangle and attributes. + @a boxRect is taken to be the outer margin box, not the box around the content. + */ + static bool DrawBoxAttributes(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, const wxRect& boxRect, int flags = 0, wxRichTextObject* obj = NULL); + + /** + Draws a border. + */ + static bool DrawBorder(wxDC& dc, wxRichTextBuffer* buffer, const wxTextAttrBorders& attr, const wxRect& rect, int flags = 0); + + /** + Returns the various rectangles of the box model in pixels. You can either specify @a contentRect (inner) + or @a marginRect (outer), and the other must be the default rectangle (no width or height). + Note that the outline doesn't affect the position of the rectangle, it's drawn in whatever space + is available. + */ + static bool GetBoxRects(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, wxRect& marginRect, wxRect& borderRect, wxRect& contentRect, wxRect& paddingRect, wxRect& outlineRect); + + /** + Returns the total margin for the object in pixels, taking into account margin, padding and border size. + */ + static bool GetTotalMargin(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, int& leftMargin, int& rightMargin, + int& topMargin, int& bottomMargin); + + /** + Returns the rectangle which the child has available to it given restrictions specified in the + child attribute, e.g. 50% width of the parent, 400 pixels, x position 20% of the parent, etc. + availableContainerSpace might be a parent that the cell has to compute its width relative to. + E.g. a cell that's 50% of its parent. + */ + static wxRect AdjustAvailableSpace(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& parentAttr, const wxRichTextAttr& childAttr, + const wxRect& availableParentSpace, const wxRect& availableContainerSpace); + +protected: + wxSize m_size; + wxSize m_maxSize; + wxSize m_minSize; + wxPoint m_pos; + int m_descent; // Descent for this object (if any) + int m_refCount; + bool m_show; + wxRichTextObject* m_parent; + + // The range of this object (start position to end position) + wxRichTextRange m_range; + + // The internal range of this object, if it's a top-level object with its own range space + wxRichTextRange m_ownRange; + + // Attributes + wxRichTextAttr m_attributes; + + // Properties + wxRichTextProperties m_properties; +}; + +WX_DECLARE_LIST_WITH_DECL( wxRichTextObject, wxRichTextObjectList, class WXDLLIMPEXP_RICHTEXT ); + +/** + @class wxRichTextCompositeObject + + Objects of this class can contain other objects. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextObject, wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextCompositeObject: public wxRichTextObject +{ + DECLARE_CLASS(wxRichTextCompositeObject) +public: +// Constructors + + wxRichTextCompositeObject(wxRichTextObject* parent = NULL); + virtual ~wxRichTextCompositeObject(); + +// Overridables + + virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0); + + virtual bool FindPosition(wxDC& dc, wxRichTextDrawingContext& context, long index, wxPoint& pt, int* height, bool forceLineStart); + + virtual void CalculateRange(long start, long& end); + + virtual bool DeleteRange(const wxRichTextRange& range); + + virtual wxString GetTextForRange(const wxRichTextRange& range) const; + + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const; + + virtual void Dump(wxTextOutputStream& stream); + + virtual void Invalidate(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL); + +// Accessors + + /** + Returns the children. + */ + wxRichTextObjectList& GetChildren() { return m_children; } + /** + Returns the children. + */ + const wxRichTextObjectList& GetChildren() const { return m_children; } + + /** + Returns the number of children. + */ + size_t GetChildCount() const ; + + /** + Returns the nth child. + */ + wxRichTextObject* GetChild(size_t n) const ; + + /** + Returns @true if this object is composite. + */ + virtual bool IsComposite() const { return true; } + + /** + Returns @true if no user editing can be done inside the object. This returns @true for simple objects, + @false for most composite objects, but @true for fields, which if composite, should not be user-edited. + */ + virtual bool IsAtomic() const { return false; } + + /** + Returns true if the buffer is empty. + */ + virtual bool IsEmpty() const { return GetChildCount() == 0; } + + /** + Returns the child object at the given character position. + */ + virtual wxRichTextObject* GetChildAtPosition(long pos) const; + +// Operations + + void Copy(const wxRichTextCompositeObject& obj); + + void operator= (const wxRichTextCompositeObject& obj) { Copy(obj); } + + /** + Appends a child, returning the position. + */ + size_t AppendChild(wxRichTextObject* child) ; + + /** + Inserts the child in front of the given object, or at the beginning. + */ + bool InsertChild(wxRichTextObject* child, wxRichTextObject* inFrontOf) ; + + /** + Removes and optionally deletes the specified child. + */ + bool RemoveChild(wxRichTextObject* child, bool deleteChild = false) ; + + /** + Deletes all the children. + */ + bool DeleteChildren() ; + + /** + Recursively merges all pieces that can be merged. + */ + bool Defragment(wxRichTextDrawingContext& context, const wxRichTextRange& range = wxRICHTEXT_ALL); + + /** + Moves the object recursively, by adding the offset from old to new. + */ + virtual void Move(const wxPoint& pt); + +protected: + wxRichTextObjectList m_children; +}; + +/** + @class wxRichTextParagraphLayoutBox + + This class knows how to lay out paragraphs. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextCompositeObject, wxRichTextObject, wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextParagraphLayoutBox: public wxRichTextCompositeObject +{ + DECLARE_DYNAMIC_CLASS(wxRichTextParagraphLayoutBox) +public: +// Constructors + + wxRichTextParagraphLayoutBox(wxRichTextObject* parent = NULL); + wxRichTextParagraphLayoutBox(const wxRichTextParagraphLayoutBox& obj): wxRichTextCompositeObject() { Init(); Copy(obj); } + ~wxRichTextParagraphLayoutBox(); + +// Overridables + + virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0); + + virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style); + + virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style); + + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const; + + virtual bool DeleteRange(const wxRichTextRange& range); + + virtual wxString GetTextForRange(const wxRichTextRange& range) const; + +#if wxUSE_XML + virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse); +#endif + +#if wxRICHTEXT_HAVE_DIRECT_OUTPUT + virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler); +#endif + +#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT + virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler); +#endif + + virtual wxString GetXMLNodeName() const { return wxT("paragraphlayout"); } + + virtual bool AcceptsFocus() const { return true; } + +// Accessors + + /** + Associates a control with the buffer, for operations that for example require refreshing the window. + */ + void SetRichTextCtrl(wxRichTextCtrl* ctrl) { m_ctrl = ctrl; } + + /** + Returns the associated control. + */ + wxRichTextCtrl* GetRichTextCtrl() const { return m_ctrl; } + + /** + Sets a flag indicating whether the last paragraph is partial or complete. + */ + void SetPartialParagraph(bool partialPara) { m_partialParagraph = partialPara; } + + /** + Returns a flag indicating whether the last paragraph is partial or complete. + */ + bool GetPartialParagraph() const { return m_partialParagraph; } + + /** + Returns the style sheet associated with the overall buffer. + */ + virtual wxRichTextStyleSheet* GetStyleSheet() const; + + virtual bool IsTopLevel() const { return true; } + +// Operations + + /** + Submits a command to insert paragraphs. + */ + bool InsertParagraphsWithUndo(wxRichTextBuffer* buffer, long pos, const wxRichTextParagraphLayoutBox& paragraphs, wxRichTextCtrl* ctrl, int flags = 0); + + /** + Submits a command to insert the given text. + */ + bool InsertTextWithUndo(wxRichTextBuffer* buffer, long pos, const wxString& text, wxRichTextCtrl* ctrl, int flags = 0); + + /** + Submits a command to insert the given text. + */ + bool InsertNewlineWithUndo(wxRichTextBuffer* buffer, long pos, wxRichTextCtrl* ctrl, int flags = 0); + + /** + Submits a command to insert the given image. + */ + bool InsertImageWithUndo(wxRichTextBuffer* buffer, long pos, const wxRichTextImageBlock& imageBlock, + wxRichTextCtrl* ctrl, int flags, const wxRichTextAttr& textAttr); + + /** + Submits a command to insert the given field. Field data can be included in properties. + + @see wxRichTextField, wxRichTextFieldType, wxRichTextFieldTypeStandard + */ + wxRichTextField* InsertFieldWithUndo(wxRichTextBuffer* buffer, long pos, const wxString& fieldType, + const wxRichTextProperties& properties, + wxRichTextCtrl* ctrl, int flags, + const wxRichTextAttr& textAttr); + + /** + Returns the style that is appropriate for a new paragraph at this position. + If the previous paragraph has a paragraph style name, looks up the next-paragraph + style. + */ + wxRichTextAttr GetStyleForNewParagraph(wxRichTextBuffer* buffer, long pos, bool caretPosition = false, bool lookUpNewParaStyle=false) const; + + /** + Inserts an object. + */ + wxRichTextObject* InsertObjectWithUndo(wxRichTextBuffer* buffer, long pos, wxRichTextObject *object, wxRichTextCtrl* ctrl, int flags = 0); + + /** + Submits a command to delete this range. + */ + bool DeleteRangeWithUndo(const wxRichTextRange& range, wxRichTextCtrl* ctrl, wxRichTextBuffer* buffer); + + /** + Draws the floating objects in this buffer. + */ + void DrawFloats(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style); + + /** + Moves an anchored object to another paragraph. + */ + void MoveAnchoredObjectToParagraph(wxRichTextParagraph* from, wxRichTextParagraph* to, wxRichTextObject* obj); + + /** + Initializes the object. + */ + void Init(); + + /** + Clears all the children. + */ + virtual void Clear(); + + /** + Clears and initializes with one blank paragraph. + */ + virtual void Reset(); + + /** + Convenience function to add a paragraph of text. + */ + virtual wxRichTextRange AddParagraph(const wxString& text, wxRichTextAttr* paraStyle = NULL); + + /** + Convenience function to add an image. + */ + virtual wxRichTextRange AddImage(const wxImage& image, wxRichTextAttr* paraStyle = NULL); + + /** + Adds multiple paragraphs, based on newlines. + */ + virtual wxRichTextRange AddParagraphs(const wxString& text, wxRichTextAttr* paraStyle = NULL); + + /** + Returns the line at the given position. If @a caretPosition is true, the position is + a caret position, which is normally a smaller number. + */ + virtual wxRichTextLine* GetLineAtPosition(long pos, bool caretPosition = false) const; + + /** + Returns the line at the given y pixel position, or the last line. + */ + virtual wxRichTextLine* GetLineAtYPosition(int y) const; + + /** + Returns the paragraph at the given character or caret position. + */ + virtual wxRichTextParagraph* GetParagraphAtPosition(long pos, bool caretPosition = false) const; + + /** + Returns the line size at the given position. + */ + virtual wxSize GetLineSizeAtPosition(long pos, bool caretPosition = false) const; + + /** + Given a position, returns the number of the visible line (potentially many to a paragraph), + starting from zero at the start of the buffer. We also have to pass a bool (@a startOfLine) + that indicates whether the caret is being shown at the end of the previous line or at the start + of the next, since the caret can be shown at two visible positions for the same underlying + position. + */ + virtual long GetVisibleLineNumber(long pos, bool caretPosition = false, bool startOfLine = false) const; + + /** + Given a line number, returns the corresponding wxRichTextLine object. + */ + virtual wxRichTextLine* GetLineForVisibleLineNumber(long lineNumber) const; + + /** + Returns the leaf object in a paragraph at this position. + */ + virtual wxRichTextObject* GetLeafObjectAtPosition(long position) const; + + /** + Returns the paragraph by number. + */ + virtual wxRichTextParagraph* GetParagraphAtLine(long paragraphNumber) const; + + /** + Returns the paragraph for a given line. + */ + virtual wxRichTextParagraph* GetParagraphForLine(wxRichTextLine* line) const; + + /** + Returns the length of the paragraph. + */ + virtual int GetParagraphLength(long paragraphNumber) const; + + /** + Returns the number of paragraphs. + */ + virtual int GetParagraphCount() const { return static_cast<int>(GetChildCount()); } + + /** + Returns the number of visible lines. + */ + virtual int GetLineCount() const; + + /** + Returns the text of the paragraph. + */ + virtual wxString GetParagraphText(long paragraphNumber) const; + + /** + Converts zero-based line column and paragraph number to a position. + */ + virtual long XYToPosition(long x, long y) const; + + /** + Converts a zero-based position to line column and paragraph number. + */ + virtual bool PositionToXY(long pos, long* x, long* y) const; + + /** + Sets the attributes for the given range. Pass flags to determine how the + attributes are set. + + The end point of range is specified as the last character position of the span + of text. So, for example, to set the style for a character at position 5, + use the range (5,5). + This differs from the wxRichTextCtrl API, where you would specify (5,6). + + @a flags may contain a bit list of the following values: + - wxRICHTEXT_SETSTYLE_NONE: no style flag. + - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this operation should be + undoable. + - wxRICHTEXT_SETSTYLE_OPTIMIZE: specifies that the style should not be applied + if the combined style at this point is already the style in question. + - wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY: specifies that the style should only be + applied to paragraphs, and not the content. + This allows content styling to be preserved independently from that + of e.g. a named paragraph style. + - wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY: specifies that the style should only be + applied to characters, and not the paragraph. + This allows content styling to be preserved independently from that + of e.g. a named paragraph style. + - wxRICHTEXT_SETSTYLE_RESET: resets (clears) the existing style before applying + the new style. + - wxRICHTEXT_SETSTYLE_REMOVE: removes the specified style. + Only the style flags are used in this operation. + */ + virtual bool SetStyle(const wxRichTextRange& range, const wxRichTextAttr& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + + /** + Sets the attributes for the given object only, for example the box attributes for a text box. + */ + virtual void SetStyle(wxRichTextObject *obj, const wxRichTextAttr& textAttr, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + + /** + Returns the combined text attributes for this position. + + This function gets the @e uncombined style - that is, the attributes associated + with the paragraph or character content, and not necessarily the combined + attributes you see on the screen. To get the combined attributes, use GetStyle(). + If you specify (any) paragraph attribute in @e style's flags, this function + will fetch the paragraph attributes. + Otherwise, it will return the character attributes. + */ + virtual bool GetStyle(long position, wxRichTextAttr& style); + + /** + Returns the content (uncombined) attributes for this position. + */ + virtual bool GetUncombinedStyle(long position, wxRichTextAttr& style); + + /** + Implementation helper for GetStyle. If combineStyles is true, combine base, paragraph and + context attributes. + */ + virtual bool DoGetStyle(long position, wxRichTextAttr& style, bool combineStyles = true); + + /** + This function gets a style representing the common, combined attributes in the + given range. + Attributes which have different values within the specified range will not be + included the style flags. + + The function is used to get the attributes to display in the formatting dialog: + the user can edit the attributes common to the selection, and optionally specify the + values of further attributes to be applied uniformly. + + To apply the edited attributes, you can use SetStyle() specifying + the wxRICHTEXT_SETSTYLE_OPTIMIZE flag, which will only apply attributes that + are different from the @e combined attributes within the range. + So, the user edits the effective, displayed attributes for the range, + but his choice won't be applied unnecessarily to content. As an example, + say the style for a paragraph specifies bold, but the paragraph text doesn't + specify a weight. + The combined style is bold, and this is what the user will see on-screen and + in the formatting dialog. The user now specifies red text, in addition to bold. + When applying with SetStyle(), the content font weight attributes won't be + changed to bold because this is already specified by the paragraph. + However the text colour attributes @e will be changed to show red. + */ + virtual bool GetStyleForRange(const wxRichTextRange& range, wxRichTextAttr& style); + + /** + Combines @a style with @a currentStyle for the purpose of summarising the attributes of a range of + content. + */ + bool CollectStyle(wxRichTextAttr& currentStyle, const wxRichTextAttr& style, wxRichTextAttr& clashingAttr, wxRichTextAttr& absentAttr); + + //@{ + /** + Sets the list attributes for the given range, passing flags to determine how + the attributes are set. + Either the style definition or the name of the style definition (in the current + sheet) can be passed. + + @a flags is a bit list of the following: + - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable. + - wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from + @a startFrom, otherwise existing attributes are used. + - wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used + as the level for all paragraphs, otherwise the current indentation will be used. + + @see NumberList(), PromoteList(), ClearListStyle(). + */ + virtual bool SetListStyle(const wxRichTextRange& range, wxRichTextListStyleDefinition* def, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + virtual bool SetListStyle(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + //@} + + /** + Clears the list style from the given range, clearing list-related attributes + and applying any named paragraph style associated with each paragraph. + + @a flags is a bit list of the following: + - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable. + + @see SetListStyle(), PromoteList(), NumberList() + */ + virtual bool ClearListStyle(const wxRichTextRange& range, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + + //@{ + /** + Numbers the paragraphs in the given range. + + Pass flags to determine how the attributes are set. + Either the style definition or the name of the style definition (in the current + sheet) can be passed. + + @a flags is a bit list of the following: + - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable. + - wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from + @a startFrom, otherwise existing attributes are used. + - wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used + as the level for all paragraphs, otherwise the current indentation will be used. + + @a def can be NULL to indicate that the existing list style should be used. + + @see SetListStyle(), PromoteList(), ClearListStyle() + */ + virtual bool NumberList(const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + virtual bool NumberList(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + //@} + + //@{ + /** + Promotes the list items within the given range. + A positive @a promoteBy produces a smaller indent, and a negative number + produces a larger indent. Pass flags to determine how the attributes are set. + Either the style definition or the name of the style definition (in the current + sheet) can be passed. + + @a flags is a bit list of the following: + - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable. + - wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from + @a startFrom, otherwise existing attributes are used. + - wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used + as the level for all paragraphs, otherwise the current indentation will be used. + + @see SetListStyle(), SetListStyle(), ClearListStyle() + */ + virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1); + virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1); + //@} + + /** + Helper for NumberList and PromoteList, that does renumbering and promotion simultaneously + @a def can be NULL/empty to indicate that the existing list style should be used. + */ + virtual bool DoNumberList(const wxRichTextRange& range, const wxRichTextRange& promotionRange, int promoteBy, wxRichTextListStyleDefinition* def, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + + /** + Fills in the attributes for numbering a paragraph after previousParagraph. + */ + virtual bool FindNextParagraphNumber(wxRichTextParagraph* previousParagraph, wxRichTextAttr& attr) const; + + /** + Sets the properties for the given range, passing flags to determine how the + attributes are set. You can merge properties or replace them. + + The end point of range is specified as the last character position of the span + of text, plus one. So, for example, to set the properties for a character at + position 5, use the range (5,6). + + @a flags may contain a bit list of the following values: + - wxRICHTEXT_SETPROPERTIES_NONE: no flag. + - wxRICHTEXT_SETPROPERTIES_WITH_UNDO: specifies that this operation should be + undoable. + - wxRICHTEXT_SETPROPERTIES_PARAGRAPHS_ONLY: specifies that the properties should only be + applied to paragraphs, and not the content. + - wxRICHTEXT_SETPROPERTIES_CHARACTERS_ONLY: specifies that the properties should only be + applied to characters, and not the paragraph. + - wxRICHTEXT_SETPROPERTIES_RESET: resets (clears) the existing properties before applying + the new properties. + - wxRICHTEXT_SETPROPERTIES_REMOVE: removes the specified properties. + */ + virtual bool SetProperties(const wxRichTextRange& range, const wxRichTextProperties& properties, int flags = wxRICHTEXT_SETPROPERTIES_WITH_UNDO); + + /** + Sets with undo the properties for the given object. + */ + virtual bool SetObjectPropertiesWithUndo(wxRichTextObject& obj, const wxRichTextProperties& properties, wxRichTextObject* objToSet = NULL); + + /** + Test if this whole range has character attributes of the specified kind. If any + of the attributes are different within the range, the test fails. You + can use this to implement, for example, bold button updating. style must have + flags indicating which attributes are of interest. + */ + virtual bool HasCharacterAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const; + + /** + Test if this whole range has paragraph attributes of the specified kind. If any + of the attributes are different within the range, the test fails. You + can use this to implement, for example, centering button updating. style must have + flags indicating which attributes are of interest. + */ + virtual bool HasParagraphAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const; + + virtual wxRichTextObject* Clone() const { return new wxRichTextParagraphLayoutBox(*this); } + + /** + Prepares the content just before insertion (or after buffer reset). + Currently is only called if undo mode is on. + */ + virtual void PrepareContent(wxRichTextParagraphLayoutBox& container); + + /** + Insert fragment into this box at the given position. If partialParagraph is true, + it is assumed that the last (or only) paragraph is just a piece of data with no paragraph + marker. + */ + virtual bool InsertFragment(long position, wxRichTextParagraphLayoutBox& fragment); + + /** + Make a copy of the fragment corresponding to the given range, putting it in @a fragment. + */ + virtual bool CopyFragment(const wxRichTextRange& range, wxRichTextParagraphLayoutBox& fragment); + + /** + Apply the style sheet to the buffer, for example if the styles have changed. + */ + virtual bool ApplyStyleSheet(wxRichTextStyleSheet* styleSheet); + + void Copy(const wxRichTextParagraphLayoutBox& obj); + + void operator= (const wxRichTextParagraphLayoutBox& obj) { Copy(obj); } + + /** + Calculate ranges. + */ + virtual void UpdateRanges(); + + /** + Get all the text. + */ + virtual wxString GetText() const; + + /** + Sets the default style, affecting the style currently being applied + (for example, setting the default style to bold will cause subsequently + inserted text to be bold). + + This is not cumulative - setting the default style will replace the previous + default style. + + Setting it to a default attribute object makes new content take on the 'basic' style. + */ + virtual bool SetDefaultStyle(const wxRichTextAttr& style); + + /** + Returns the current default style, affecting the style currently being applied + (for example, setting the default style to bold will cause subsequently + inserted text to be bold). + */ + virtual const wxRichTextAttr& GetDefaultStyle() const { return m_defaultAttributes; } + + /** + Sets the basic (overall) style. This is the style of the whole + buffer before further styles are applied, unlike the default style, which + only affects the style currently being applied (for example, setting the default + style to bold will cause subsequently inserted text to be bold). + */ + virtual void SetBasicStyle(const wxRichTextAttr& style) { m_attributes = style; } + + /** + Returns the basic (overall) style. + + This is the style of the whole buffer before further styles are applied, + unlike the default style, which only affects the style currently being + applied (for example, setting the default style to bold will cause + subsequently inserted text to be bold). + */ + virtual const wxRichTextAttr& GetBasicStyle() const { return m_attributes; } + + /** + Invalidates the buffer. With no argument, invalidates whole buffer. + */ + virtual void Invalidate(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL); + + /** + Do the (in)validation for this object only. + */ + virtual void DoInvalidate(const wxRichTextRange& invalidRange); + + /** + Do the (in)validation both up and down the hierarchy. + */ + virtual void InvalidateHierarchy(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL); + + /** + Gather information about floating objects. If untilObj is non-NULL, + will stop getting information if the current object is this, since we + will collect the rest later. + */ + virtual bool UpdateFloatingObjects(const wxRect& availableRect, wxRichTextObject* untilObj = NULL); + + /** + Get invalid range, rounding to entire paragraphs if argument is true. + */ + wxRichTextRange GetInvalidRange(bool wholeParagraphs = false) const; + + /** + Returns @true if this object needs layout. + */ + bool IsDirty() const { return m_invalidRange != wxRICHTEXT_NONE; } + + /** + Returns the wxRichTextFloatCollector of this object. + */ + wxRichTextFloatCollector* GetFloatCollector() { return m_floatCollector; } + + /** + Returns the number of floating objects at this level. + */ + int GetFloatingObjectCount() const; + + /** + Returns a list of floating objects. + */ + bool GetFloatingObjects(wxRichTextObjectList& objects) const; + +protected: + wxRichTextCtrl* m_ctrl; + wxRichTextAttr m_defaultAttributes; + + // The invalidated range that will need full layout + wxRichTextRange m_invalidRange; + + // Is the last paragraph partial or complete? + bool m_partialParagraph; + + // The floating layout state + wxRichTextFloatCollector* m_floatCollector; +}; + +/** + @class wxRichTextBox + + This class implements a floating or inline text box, containing paragraphs. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextParagraphLayoutBox, wxRichTextObject, wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextBox: public wxRichTextParagraphLayoutBox +{ + DECLARE_DYNAMIC_CLASS(wxRichTextBox) +public: +// Constructors + + /** + Default constructor; optionally pass the parent object. + */ + + wxRichTextBox(wxRichTextObject* parent = NULL); + + /** + Copy constructor. + */ + + wxRichTextBox(const wxRichTextBox& obj): wxRichTextParagraphLayoutBox() { Copy(obj); } + +// Overridables + + virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style); + + virtual wxString GetXMLNodeName() const { return wxT("textbox"); } + + virtual bool CanEditProperties() const { return true; } + + virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer); + + virtual wxString GetPropertiesMenuLabel() const { return wxGetTranslation("&Box"); } + +// Accessors + +// Operations + + virtual wxRichTextObject* Clone() const { return new wxRichTextBox(*this); } + + void Copy(const wxRichTextBox& obj); + +protected: +}; + +/** + @class wxRichTextField + + This class implements the general concept of a field, an object that represents + additional functionality such as a footnote, a bookmark, a page number, a table + of contents, and so on. Extra information (such as a bookmark name) can be stored + in the object properties. + + Drawing, layout, and property editing is delegated to classes derived + from wxRichTextFieldType, such as instances of wxRichTextFieldTypeStandard; this makes + the use of fields an efficient method of introducing extra functionality, since + most of the information required to draw a field (such as a bitmap) is kept centrally + in a single field type definition. + + The FieldType property, accessed by SetFieldType/GetFieldType, is used to retrieve + the field type definition. So be careful not to overwrite this property. + + wxRichTextField is derived from wxRichTextParagraphLayoutBox, which means that it + can contain its own read-only content, refreshed when the application calls the UpdateField + function. Whether a field is treated as a composite or a single graphic is determined + by the field type definition. If using wxRichTextFieldTypeStandard, passing the display + type wxRICHTEXT_FIELD_STYLE_COMPOSITE to the field type definition causes the field + to behave like a composite; the other display styles display a simple graphic. + When implementing a composite field, you will still need to derive from wxRichTextFieldTypeStandard + or wxRichTextFieldType, if only to implement UpdateField to refresh the field content + appropriately. wxRichTextFieldTypeStandard is only one possible implementation, but + covers common needs especially for simple, static fields using text or a bitmap. + + Register field types on application initialisation with the static function + wxRichTextBuffer::AddFieldType. They will be deleted automatically on + application exit. + + An application can write a field to a control with wxRichTextCtrl::WriteField, + taking a field type, the properties for the field, and optional attributes. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextFieldTypeStandard, wxRichTextFieldType, wxRichTextParagraphLayoutBox, wxRichTextProperties, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextField: public wxRichTextParagraphLayoutBox +{ + DECLARE_DYNAMIC_CLASS(wxRichTextField) +public: +// Constructors + + /** + Default constructor; optionally pass the parent object. + */ + + wxRichTextField(const wxString& fieldType = wxEmptyString, wxRichTextObject* parent = NULL); + + /** + Copy constructor. + */ + + wxRichTextField(const wxRichTextField& obj): wxRichTextParagraphLayoutBox() { Copy(obj); } + +// Overridables + + virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style); + + virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style); + + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const; + + virtual wxString GetXMLNodeName() const { return wxT("field"); } + + virtual bool CanEditProperties() const; + + virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer); + + virtual wxString GetPropertiesMenuLabel() const; + + virtual bool AcceptsFocus() const { return false; } + + virtual void CalculateRange(long start, long& end); + + /** + If a field has children, we don't want the user to be able to edit it. + */ + virtual bool IsAtomic() const { return true; } + + virtual bool IsEmpty() const { return false; } + + virtual bool IsTopLevel() const; + +// Accessors + + void SetFieldType(const wxString& fieldType) { GetProperties().SetProperty(wxT("FieldType"), fieldType); } + wxString GetFieldType() const { return GetProperties().GetPropertyString(wxT("FieldType")); } + +// Operations + + /** + Update the field; delegated to the associated field type. This would typically expand the field to its value, + if this is a dynamically changing and/or composite field. + */ + virtual bool UpdateField(wxRichTextBuffer* buffer); + + virtual wxRichTextObject* Clone() const { return new wxRichTextField(*this); } + + void Copy(const wxRichTextField& obj); + +protected: +}; + +/** + @class wxRichTextFieldType + + The base class for custom field types. Each type definition handles one + field type. Override functions to provide drawing, layout, updating and + property editing functionality for a field. + + Register field types on application initialisation with the static function + wxRichTextBuffer::AddFieldType. They will be deleted automatically on + application exit. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextFieldTypeStandard, wxRichTextField, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextFieldType: public wxObject +{ + DECLARE_CLASS(wxRichTextFieldType) +public: + /** + Creates a field type definition. + */ + wxRichTextFieldType(const wxString& name = wxEmptyString) + : m_name(name) + { } + + /** + Copy constructor. + */ + wxRichTextFieldType(const wxRichTextFieldType& fieldType) + : wxObject(fieldType) + { Copy(fieldType); } + + void Copy(const wxRichTextFieldType& fieldType) { m_name = fieldType.m_name; } + + /** + Draw the item, within the given range. Some objects may ignore the range (for + example paragraphs) while others must obey it (lines, to implement wrapping) + */ + virtual bool Draw(wxRichTextField* obj, wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style) = 0; + + /** + Lay the item out at the specified position with the given size constraint. + Layout must set the cached size. @rect is the available space for the object, + and @a parentRect is the container that is used to determine a relative size + or position (for example if a text box must be 50% of the parent text box). + */ + virtual bool Layout(wxRichTextField* obj, wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style) = 0; + + /** + Returns the object size for the given range. Returns @false if the range + is invalid for this object. + */ + virtual bool GetRangeSize(wxRichTextField* obj, const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const = 0; + + /** + Returns @true if we can edit the object's properties via a GUI. + */ + virtual bool CanEditProperties(wxRichTextField* WXUNUSED(obj)) const { return false; } + + /** + Edits the object's properties via a GUI. + */ + virtual bool EditProperties(wxRichTextField* WXUNUSED(obj), wxWindow* WXUNUSED(parent), wxRichTextBuffer* WXUNUSED(buffer)) { return false; } + + /** + Returns the label to be used for the properties context menu item. + */ + virtual wxString GetPropertiesMenuLabel(wxRichTextField* WXUNUSED(obj)) const { return wxEmptyString; } + + /** + Update the field. This would typically expand the field to its value, + if this is a dynamically changing and/or composite field. + */ + virtual bool UpdateField(wxRichTextBuffer* WXUNUSED(buffer), wxRichTextField* WXUNUSED(obj)) { return false; } + + /** + Returns @true if this object is top-level, i.e. contains its own paragraphs, such as a text box. + */ + virtual bool IsTopLevel(wxRichTextField* WXUNUSED(obj)) const { return true; } + + /** + Sets the field type name. There should be a unique name per field type object. + */ + void SetName(const wxString& name) { m_name = name; } + + /** + Returns the field type name. There should be a unique name per field type object. + */ + wxString GetName() const { return m_name; } + +protected: + + wxString m_name; +}; + +WX_DECLARE_STRING_HASH_MAP(wxRichTextFieldType*, wxRichTextFieldTypeHashMap); + +/** + @class wxRichTextFieldTypeStandard + + A field type that can handle fields with text or bitmap labels, with a small range + of styles for implementing rectangular fields and fields that can be used for start + and end tags. + + The border, text and background colours can be customised; the default is + white text on a black background. + + The following display styles can be used. + + @beginStyleTable + @style{wxRICHTEXT_FIELD_STYLE_COMPOSITE} + Creates a composite field; you will probably need to derive a new class to implement UpdateField. + @style{wxRICHTEXT_FIELD_STYLE_RECTANGLE} + Shows a rounded rectangle background. + @style{wxRICHTEXT_FIELD_STYLE_NO_BORDER} + Suppresses the background and border; mostly used with a bitmap label. + @style{wxRICHTEXT_FIELD_STYLE_START_TAG} + Shows a start tag background, with the pointy end facing right. + @style{wxRICHTEXT_FIELD_STYLE_END_TAG} + Shows an end tag background, with the pointy end facing left. + @endStyleTable + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextFieldType, wxRichTextField, wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextFieldTypeStandard: public wxRichTextFieldType +{ + DECLARE_CLASS(wxRichTextFieldTypeStandard) +public: + + // Display style types + enum { wxRICHTEXT_FIELD_STYLE_COMPOSITE = 0x01, + wxRICHTEXT_FIELD_STYLE_RECTANGLE = 0x02, + wxRICHTEXT_FIELD_STYLE_NO_BORDER = 0x04, + wxRICHTEXT_FIELD_STYLE_START_TAG = 0x08, + wxRICHTEXT_FIELD_STYLE_END_TAG = 0x10 + }; + + /** + Constructor, creating a field type definition with a text label. + + @param parent + The name of the type definition. This must be unique, and is the type + name used when adding a field to a control. + @param label + The text label to be shown on the field. + @param displayStyle + The display style: one of wxRICHTEXT_FIELD_STYLE_RECTANGLE, + wxRICHTEXT_FIELD_STYLE_NO_BORDER, wxRICHTEXT_FIELD_STYLE_START_TAG, + wxRICHTEXT_FIELD_STYLE_END_TAG. + + */ + wxRichTextFieldTypeStandard(const wxString& name, const wxString& label, int displayStyle = wxRICHTEXT_FIELD_STYLE_RECTANGLE); + + /** + Constructor, creating a field type definition with a bitmap label. + + @param parent + The name of the type definition. This must be unique, and is the type + name used when adding a field to a control. + @param label + The bitmap label to be shown on the field. + @param displayStyle + The display style: one of wxRICHTEXT_FIELD_STYLE_RECTANGLE, + wxRICHTEXT_FIELD_STYLE_NO_BORDER, wxRICHTEXT_FIELD_STYLE_START_TAG, + wxRICHTEXT_FIELD_STYLE_END_TAG. + + */ + wxRichTextFieldTypeStandard(const wxString& name, const wxBitmap& bitmap, int displayStyle = wxRICHTEXT_FIELD_STYLE_NO_BORDER); + + /** + The default constructor. + + */ + wxRichTextFieldTypeStandard() { Init(); } + + /** + The copy constructor. + + */ + wxRichTextFieldTypeStandard(const wxRichTextFieldTypeStandard& field) + : wxRichTextFieldType(field) + { Copy(field); } + + /** + Initialises the object. + */ + void Init(); + + /** + Copies the object. + */ + void Copy(const wxRichTextFieldTypeStandard& field); + + /** + The assignment operator. + */ + void operator=(const wxRichTextFieldTypeStandard& field) { Copy(field); } + + /** + Draw the item, within the given range. Some objects may ignore the range (for + example paragraphs) while others must obey it (lines, to implement wrapping) + */ + virtual bool Draw(wxRichTextField* obj, wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style); + + /** + Lay the item out at the specified position with the given size constraint. + Layout must set the cached size. @rect is the available space for the object, + and @a parentRect is the container that is used to determine a relative size + or position (for example if a text box must be 50% of the parent text box). + */ + virtual bool Layout(wxRichTextField* obj, wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style); + + /** + Returns the object size for the given range. Returns @false if the range + is invalid for this object. + */ + virtual bool GetRangeSize(wxRichTextField* obj, const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const; + + /** + Get the size of the field, given the label, font size, and so on. + */ + wxSize GetSize(wxRichTextField* obj, wxDC& dc, wxRichTextDrawingContext& context, int style) const; + + /** + Returns @true if the display type is wxRICHTEXT_FIELD_STYLE_COMPOSITE, @false otherwise. + */ + virtual bool IsTopLevel(wxRichTextField* WXUNUSED(obj)) const { return (GetDisplayStyle() & wxRICHTEXT_FIELD_STYLE_COMPOSITE) != 0; } + + /** + Sets the text label for fields of this type. + */ + void SetLabel(const wxString& label) { m_label = label; } + + /** + Returns the text label for fields of this type. + */ + const wxString& GetLabel() const { return m_label; } + + /** + Sets the bitmap label for fields of this type. + */ + void SetBitmap(const wxBitmap& bitmap) { m_bitmap = bitmap; } + + /** + Gets the bitmap label for fields of this type. + */ + const wxBitmap& GetBitmap() const { return m_bitmap; } + + /** + Gets the display style for fields of this type. + */ + int GetDisplayStyle() const { return m_displayStyle; } + + /** + Sets the display style for fields of this type. + */ + void SetDisplayStyle(int displayStyle) { m_displayStyle = displayStyle; } + + /** + Gets the font used for drawing the text label. + */ + const wxFont& GetFont() const { return m_font; } + + /** + Sets the font used for drawing the text label. + */ + void SetFont(const wxFont& font) { m_font = font; } + + /** + Gets the colour used for drawing the text label. + */ + const wxColour& GetTextColour() const { return m_textColour; } + + /** + Sets the colour used for drawing the text label. + */ + void SetTextColour(const wxColour& colour) { m_textColour = colour; } + + /** + Gets the colour used for drawing the field border. + */ + const wxColour& GetBorderColour() const { return m_borderColour; } + + /** + Sets the colour used for drawing the field border. + */ + void SetBorderColour(const wxColour& colour) { m_borderColour = colour; } + + /** + Gets the colour used for drawing the field background. + */ + const wxColour& GetBackgroundColour() const { return m_backgroundColour; } + + /** + Sets the colour used for drawing the field background. + */ + void SetBackgroundColour(const wxColour& colour) { m_backgroundColour = colour; } + + /** + Sets the vertical padding (the distance between the border and the text). + */ + void SetVerticalPadding(int padding) { m_verticalPadding = padding; } + + /** + Gets the vertical padding (the distance between the border and the text). + */ + int GetVerticalPadding() const { return m_verticalPadding; } + + /** + Sets the horizontal padding (the distance between the border and the text). + */ + void SetHorizontalPadding(int padding) { m_horizontalPadding = padding; } + + /** + Sets the horizontal padding (the distance between the border and the text). + */ + int GetHorizontalPadding() const { return m_horizontalPadding; } + + /** + Sets the horizontal margin surrounding the field object. + */ + void SetHorizontalMargin(int margin) { m_horizontalMargin = margin; } + + /** + Gets the horizontal margin surrounding the field object. + */ + int GetHorizontalMargin() const { return m_horizontalMargin; } + + /** + Sets the vertical margin surrounding the field object. + */ + void SetVerticalMargin(int margin) { m_verticalMargin = margin; } + + /** + Gets the vertical margin surrounding the field object. + */ + int GetVerticalMargin() const { return m_verticalMargin; } + +protected: + + wxString m_label; + int m_displayStyle; + wxFont m_font; + wxColour m_textColour; + wxColour m_borderColour; + wxColour m_backgroundColour; + int m_verticalPadding; + int m_horizontalPadding; + int m_horizontalMargin; + int m_verticalMargin; + wxBitmap m_bitmap; +}; + +/** + @class wxRichTextLine + + This object represents a line in a paragraph, and stores + offsets from the start of the paragraph representing the + start and end positions of the line. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextLine +{ +public: +// Constructors + + wxRichTextLine(wxRichTextParagraph* parent); + wxRichTextLine(const wxRichTextLine& obj) { Init( NULL); Copy(obj); } + virtual ~wxRichTextLine() {} + +// Overridables + +// Accessors + + /** + Sets the range associated with this line. + */ + void SetRange(const wxRichTextRange& range) { m_range = range; } + /** + Sets the range associated with this line. + */ + void SetRange(long from, long to) { m_range = wxRichTextRange(from, to); } + + /** + Returns the parent paragraph. + */ + wxRichTextParagraph* GetParent() { return m_parent; } + + /** + Returns the range. + */ + const wxRichTextRange& GetRange() const { return m_range; } + /** + Returns the range. + */ + wxRichTextRange& GetRange() { return m_range; } + + /** + Returns the absolute range. + */ + wxRichTextRange GetAbsoluteRange() const; + + /** + Returns the line size as calculated by Layout. + */ + virtual wxSize GetSize() const { return m_size; } + + /** + Sets the line size as calculated by Layout. + */ + virtual void SetSize(const wxSize& sz) { m_size = sz; } + + /** + Returns the object position relative to the parent. + */ + virtual wxPoint GetPosition() const { return m_pos; } + + /** + Sets the object position relative to the parent. + */ + virtual void SetPosition(const wxPoint& pos) { m_pos = pos; } + + /** + Returns the absolute object position. + */ + virtual wxPoint GetAbsolutePosition() const; + + /** + Returns the rectangle enclosing the line. + */ + virtual wxRect GetRect() const { return wxRect(GetAbsolutePosition(), GetSize()); } + + /** + Sets the stored descent. + */ + void SetDescent(int descent) { m_descent = descent; } + + /** + Returns the stored descent. + */ + int GetDescent() const { return m_descent; } + +#if wxRICHTEXT_USE_OPTIMIZED_LINE_DRAWING + wxArrayInt& GetObjectSizes() { return m_objectSizes; } + const wxArrayInt& GetObjectSizes() const { return m_objectSizes; } +#endif + +// Operations + + /** + Initialises the object. + */ + void Init(wxRichTextParagraph* parent); + + /** + Copies from @a obj. + */ + void Copy(const wxRichTextLine& obj); + + virtual wxRichTextLine* Clone() const { return new wxRichTextLine(*this); } + +protected: + + // The range of the line (start position to end position) + // This is relative to the parent paragraph. + wxRichTextRange m_range; + + // Size and position measured relative to top of paragraph + wxPoint m_pos; + wxSize m_size; + + // Maximum descent for this line (location of text baseline) + int m_descent; + + // The parent object + wxRichTextParagraph* m_parent; + +#if wxRICHTEXT_USE_OPTIMIZED_LINE_DRAWING + wxArrayInt m_objectSizes; +#endif +}; + +WX_DECLARE_LIST_WITH_DECL( wxRichTextLine, wxRichTextLineList , class WXDLLIMPEXP_RICHTEXT ); + +/** + @class wxRichTextParagraph + + This object represents a single paragraph containing various objects such as text content, images, and further paragraph layout objects. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextParagraph: public wxRichTextCompositeObject +{ + DECLARE_DYNAMIC_CLASS(wxRichTextParagraph) +public: +// Constructors + + /** + Constructor taking a parent and style. + */ + wxRichTextParagraph(wxRichTextObject* parent = NULL, wxRichTextAttr* style = NULL); + /** + Constructor taking a text string, a parent and paragraph and character attributes. + */ + wxRichTextParagraph(const wxString& text, wxRichTextObject* parent = NULL, wxRichTextAttr* paraStyle = NULL, wxRichTextAttr* charStyle = NULL); + virtual ~wxRichTextParagraph(); + wxRichTextParagraph(const wxRichTextParagraph& obj): wxRichTextCompositeObject() { Copy(obj); } + +// Overridables + + virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style); + + virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style); + + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const; + + virtual bool FindPosition(wxDC& dc, wxRichTextDrawingContext& context, long index, wxPoint& pt, int* height, bool forceLineStart); + + virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0); + + virtual void CalculateRange(long start, long& end); + + virtual wxString GetXMLNodeName() const { return wxT("paragraph"); } + +// Accessors + + /** + Returns the cached lines. + */ + wxRichTextLineList& GetLines() { return m_cachedLines; } + +// Operations + + /** + Copies the object. + */ + void Copy(const wxRichTextParagraph& obj); + + virtual wxRichTextObject* Clone() const { return new wxRichTextParagraph(*this); } + + /** + Clears the cached lines. + */ + void ClearLines(); + +// Implementation + + /** + Applies paragraph styles such as centering to the wrapped lines. + */ + virtual void ApplyParagraphStyle(wxRichTextLine* line, const wxRichTextAttr& attr, const wxRect& rect, wxDC& dc); + + /** + Inserts text at the given position. + */ + virtual bool InsertText(long pos, const wxString& text); + + /** + Splits an object at this position if necessary, and returns + the previous object, or NULL if inserting at the beginning. + */ + virtual wxRichTextObject* SplitAt(long pos, wxRichTextObject** previousObject = NULL); + + /** + Moves content to a list from this point. + */ + virtual void MoveToList(wxRichTextObject* obj, wxList& list); + + /** + Adds content back from a list. + */ + virtual void MoveFromList(wxList& list); + + /** + Returns the plain text searching from the start or end of the range. + The resulting string may be shorter than the range given. + */ + bool GetContiguousPlainText(wxString& text, const wxRichTextRange& range, bool fromStart = true); + + /** + Finds a suitable wrap position. @a wrapPosition is the last position in the line to the left + of the split. + */ + bool FindWrapPosition(const wxRichTextRange& range, wxDC& dc, wxRichTextDrawingContext& context, int availableSpace, long& wrapPosition, wxArrayInt* partialExtents); + + /** + Finds the object at the given position. + */ + wxRichTextObject* FindObjectAtPosition(long position); + + /** + Returns the bullet text for this paragraph. + */ + wxString GetBulletText(); + + /** + Allocates or reuses a line object. + */ + wxRichTextLine* AllocateLine(int pos); + + /** + Clears remaining unused line objects, if any. + */ + bool ClearUnusedLines(int lineCount); + + /** + Returns combined attributes of the base style, paragraph style and character style. We use this to dynamically + retrieve the actual style. + */ + wxRichTextAttr GetCombinedAttributes(const wxRichTextAttr& contentStyle, bool includingBoxAttr = false) const; + + /** + Returns the combined attributes of the base style and paragraph style. + */ + wxRichTextAttr GetCombinedAttributes(bool includingBoxAttr = false) const; + + /** + Returns the first position from pos that has a line break character. + */ + long GetFirstLineBreakPosition(long pos); + + /** + Creates a default tabstop array. + */ + static void InitDefaultTabs(); + + /** + Clears the default tabstop array. + */ + static void ClearDefaultTabs(); + + /** + Returns the default tabstop array. + */ + static const wxArrayInt& GetDefaultTabs() { return sm_defaultTabs; } + + /** + Lays out the floating objects. + */ + void LayoutFloat(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style, wxRichTextFloatCollector* floatCollector); + +protected: + + // The lines that make up the wrapped paragraph + wxRichTextLineList m_cachedLines; + + // Default tabstops + static wxArrayInt sm_defaultTabs; + +friend class wxRichTextFloatCollector; +}; + +/** + @class wxRichTextPlainText + + This object represents a single piece of text. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextPlainText: public wxRichTextObject +{ + DECLARE_DYNAMIC_CLASS(wxRichTextPlainText) +public: +// Constructors + + /** + Constructor. + */ + wxRichTextPlainText(const wxString& text = wxEmptyString, wxRichTextObject* parent = NULL, wxRichTextAttr* style = NULL); + + /** + Copy constructor. + */ + wxRichTextPlainText(const wxRichTextPlainText& obj): wxRichTextObject() { Copy(obj); } + +// Overridables + + virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style); + + virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style); + + virtual bool AdjustAttributes(wxRichTextAttr& attr, wxRichTextDrawingContext& context); + + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const; + + virtual wxString GetTextForRange(const wxRichTextRange& range) const; + + virtual wxRichTextObject* DoSplit(long pos); + + virtual void CalculateRange(long start, long& end); + + virtual bool DeleteRange(const wxRichTextRange& range); + + virtual bool IsEmpty() const { return m_text.empty(); } + + virtual bool CanMerge(wxRichTextObject* object, wxRichTextDrawingContext& context) const; + + virtual bool Merge(wxRichTextObject* object, wxRichTextDrawingContext& context); + + virtual void Dump(wxTextOutputStream& stream); + + virtual bool CanSplit(wxRichTextDrawingContext& context) const; + + virtual wxRichTextObject* Split(wxRichTextDrawingContext& context); + + /** + Get the first position from pos that has a line break character. + */ + long GetFirstLineBreakPosition(long pos); + + /// Does this object take note of paragraph attributes? Text and image objects don't. + virtual bool UsesParagraphAttributes() const { return false; } + +#if wxUSE_XML + virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse); +#endif + +#if wxRICHTEXT_HAVE_DIRECT_OUTPUT + virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler); +#endif + +#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT + virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler); +#endif + + virtual wxString GetXMLNodeName() const { return wxT("text"); } + +// Accessors + + /** + Returns the text. + */ + const wxString& GetText() const { return m_text; } + + /** + Sets the text. + */ + void SetText(const wxString& text) { m_text = text; } + +// Operations + + // Copies the text object, + void Copy(const wxRichTextPlainText& obj); + + // Clones the text object. + virtual wxRichTextObject* Clone() const { return new wxRichTextPlainText(*this); } + +private: + bool DrawTabbedString(wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect, wxString& str, wxCoord& x, wxCoord& y, bool selected); + +protected: + wxString m_text; +}; + +/** + @class wxRichTextImageBlock + + This class stores information about an image, in binary in-memory form. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextImageBlock: public wxObject +{ +public: + /** + Constructor. + */ + wxRichTextImageBlock(); + + /** + Copy constructor. + */ + wxRichTextImageBlock(const wxRichTextImageBlock& block); + virtual ~wxRichTextImageBlock(); + + /** + Initialises the block. + */ + void Init(); + + /** + Clears the block. + */ + + void Clear(); + + /** + Load the original image into a memory block. + If the image is not a JPEG, we must convert it into a JPEG + to conserve space. + If it's not a JPEG we can make use of @a image, already scaled, so we don't have to + load the image a second time. + */ + virtual bool MakeImageBlock(const wxString& filename, wxBitmapType imageType, + wxImage& image, bool convertToJPEG = true); + + /** + Make an image block from the wxImage in the given + format. + */ + virtual bool MakeImageBlock(wxImage& image, wxBitmapType imageType, int quality = 80); + + /** + Uses a const wxImage for efficiency, but can't set quality (only relevant for JPEG) + */ + virtual bool MakeImageBlockDefaultQuality(const wxImage& image, wxBitmapType imageType); + + /** + Makes the image block. + */ + virtual bool DoMakeImageBlock(const wxImage& image, wxBitmapType imageType); + + /** + Writes the block to a file. + */ + bool Write(const wxString& filename); + + /** + Writes the data in hex to a stream. + */ + bool WriteHex(wxOutputStream& stream); + + /** + Reads the data in hex from a stream. + */ + bool ReadHex(wxInputStream& stream, int length, wxBitmapType imageType); + + /** + Copy from @a block. + */ + void Copy(const wxRichTextImageBlock& block); + + // Load a wxImage from the block + /** + */ + bool Load(wxImage& image); + +// Operators + + /** + Assignment operation. + */ + void operator=(const wxRichTextImageBlock& block); + +// Accessors + + /** + Returns the raw data. + */ + unsigned char* GetData() const { return m_data; } + + /** + Returns the data size in bytes. + */ + size_t GetDataSize() const { return m_dataSize; } + + /** + Returns the image type. + */ + wxBitmapType GetImageType() const { return m_imageType; } + + /** + */ + void SetData(unsigned char* image) { m_data = image; } + + /** + Sets the data size. + */ + void SetDataSize(size_t size) { m_dataSize = size; } + + /** + Sets the image type. + */ + void SetImageType(wxBitmapType imageType) { m_imageType = imageType; } + + /** + Returns @true if the data is non-NULL. + */ + bool IsOk() const { return GetData() != NULL; } + bool Ok() const { return IsOk(); } + + /** + Gets the extension for the block's type. + */ + wxString GetExtension() const; + +/// Implementation + + /** + Allocates and reads from a stream as a block of memory. + */ + static unsigned char* ReadBlock(wxInputStream& stream, size_t size); + + /** + Allocates and reads from a file as a block of memory. + */ + static unsigned char* ReadBlock(const wxString& filename, size_t size); + + /** + Writes a memory block to stream. + */ + static bool WriteBlock(wxOutputStream& stream, unsigned char* block, size_t size); + + /** + Writes a memory block to a file. + */ + static bool WriteBlock(const wxString& filename, unsigned char* block, size_t size); + +protected: + // Size in bytes of the image stored. + // This is in the raw, original form such as a JPEG file. + unsigned char* m_data; + size_t m_dataSize; + wxBitmapType m_imageType; +}; + +/** + @class wxRichTextImage + + This class implements a graphic object. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextBuffer, wxRichTextCtrl, wxRichTextImageBlock +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextImage: public wxRichTextObject +{ + DECLARE_DYNAMIC_CLASS(wxRichTextImage) +public: +// Constructors + + /** + Default constructor. + */ + wxRichTextImage(wxRichTextObject* parent = NULL): wxRichTextObject(parent) { Init(); } + + /** + Creates a wxRichTextImage from a wxImage. + */ + wxRichTextImage(const wxImage& image, wxRichTextObject* parent = NULL, wxRichTextAttr* charStyle = NULL); + + /** + Creates a wxRichTextImage from an image block. + */ + wxRichTextImage(const wxRichTextImageBlock& imageBlock, wxRichTextObject* parent = NULL, wxRichTextAttr* charStyle = NULL); + + /** + Copy constructor. + */ + wxRichTextImage(const wxRichTextImage& obj): wxRichTextObject(obj) { Copy(obj); } + + /** + Destructor. + */ + ~wxRichTextImage(); + + /** + Initialisation. + */ + void Init(); + +// Overridables + + virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style); + + virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style); + + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const; + + /** + Returns the 'natural' size for this object - the image size. + */ + virtual wxTextAttrSize GetNaturalSize() const; + + virtual bool IsEmpty() const { return false; /* !m_imageBlock.IsOk(); */ } + + virtual bool CanEditProperties() const { return true; } + + virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer); + + virtual wxString GetPropertiesMenuLabel() const { return wxGetTranslation("&Picture"); } + + virtual bool UsesParagraphAttributes() const { return false; } + +#if wxUSE_XML + virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse); +#endif + +#if wxRICHTEXT_HAVE_DIRECT_OUTPUT + virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler); +#endif + +#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT + virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler); +#endif + + // Images can be floatable (optionally). + virtual bool IsFloatable() const { return true; } + + virtual wxString GetXMLNodeName() const { return wxT("image"); } + +// Accessors + + /** + Returns the image cache (a scaled bitmap). + */ + const wxBitmap& GetImageCache() const { return m_imageCache; } + + /** + Sets the image cache. + */ + void SetImageCache(const wxBitmap& bitmap) { m_imageCache = bitmap; m_originalImageSize = wxSize(bitmap.GetWidth(), bitmap.GetHeight()); } + + /** + Resets the image cache. + */ + void ResetImageCache() { m_imageCache = wxNullBitmap; m_originalImageSize = wxSize(-1, -1); } + + /** + Returns the image block containing the raw data. + */ + wxRichTextImageBlock& GetImageBlock() { return m_imageBlock; } + +// Operations + + /** + Copies the image object. + */ + void Copy(const wxRichTextImage& obj); + + /** + Clones the image object. + */ + virtual wxRichTextObject* Clone() const { return new wxRichTextImage(*this); } + + /** + Creates a cached image at the required size. + */ + virtual bool LoadImageCache(wxDC& dc, bool resetCache = false, const wxSize& parentSize = wxDefaultSize); + + /** + Gets the original image size. + */ + wxSize GetOriginalImageSize() const { return m_originalImageSize; } + + /** + Sets the original image size. + */ + void SetOriginalImageSize(const wxSize& sz) { m_originalImageSize = sz; } + +protected: + wxRichTextImageBlock m_imageBlock; + wxBitmap m_imageCache; + wxSize m_originalImageSize; +}; + +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextCommand; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextAction; + +/** + @class wxRichTextBuffer + + This is a kind of paragraph layout box, used to represent the whole buffer. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextParagraphLayoutBox, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextBuffer: public wxRichTextParagraphLayoutBox +{ + DECLARE_DYNAMIC_CLASS(wxRichTextBuffer) +public: +// Constructors + + /** + Default constructor. + */ + wxRichTextBuffer() { Init(); } + + /** + Copy constructor. + */ + wxRichTextBuffer(const wxRichTextBuffer& obj): wxRichTextParagraphLayoutBox() { Init(); Copy(obj); } + + virtual ~wxRichTextBuffer() ; + +// Accessors + + /** + Returns the command processor. + A text buffer always creates its own command processor when it is initialized. + */ + wxCommandProcessor* GetCommandProcessor() const { return m_commandProcessor; } + + /** + Sets style sheet, if any. This will allow the application to use named character and paragraph + styles found in the style sheet. + + Neither the buffer nor the control owns the style sheet so must be deleted by the application. + */ + void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { m_styleSheet = styleSheet; } + + /** + Returns the style sheet. + */ + virtual wxRichTextStyleSheet* GetStyleSheet() const { return m_styleSheet; } + + /** + Sets the style sheet and sends a notification of the change. + */ + bool SetStyleSheetAndNotify(wxRichTextStyleSheet* sheet); + + /** + Pushes the style sheet to the top of the style sheet stack. + */ + bool PushStyleSheet(wxRichTextStyleSheet* styleSheet); + + /** + Pops the style sheet from the top of the style sheet stack. + */ + wxRichTextStyleSheet* PopStyleSheet(); + + /** + Returns the table storing fonts, for quick access and font reuse. + */ + wxRichTextFontTable& GetFontTable() { return m_fontTable; } + + /** + Returns the table storing fonts, for quick access and font reuse. + */ + const wxRichTextFontTable& GetFontTable() const { return m_fontTable; } + + /** + Sets table storing fonts, for quick access and font reuse. + */ + void SetFontTable(const wxRichTextFontTable& table) { m_fontTable = table; } + + /** + Sets the scale factor for displaying fonts, for example for more comfortable + editing. + */ + void SetFontScale(double fontScale); + + /** + Returns the scale factor for displaying fonts, for example for more comfortable + editing. + */ + double GetFontScale() const { return m_fontScale; } + + /** + Sets the scale factor for displaying certain dimensions such as indentation and + inter-paragraph spacing. This can be useful when editing in a small control + where you still want legible text, but a minimum of wasted white space. + */ + void SetDimensionScale(double dimScale); + + /** + Returns the scale factor for displaying certain dimensions such as indentation + and inter-paragraph spacing. + */ + double GetDimensionScale() const { return m_dimensionScale; } + +// Operations + + /** + Initialisation. + */ + void Init(); + + /** + Clears the buffer, adds an empty paragraph, and clears the command processor. + */ + virtual void ResetAndClearCommands(); + +#if wxUSE_FFILE && wxUSE_STREAMS + //@{ + /** + Loads content from a file. + Not all handlers will implement file loading. + */ + virtual bool LoadFile(const wxString& filename, wxRichTextFileType type = wxRICHTEXT_TYPE_ANY); + //@} + + //@{ + /** + Saves content to a file. + Not all handlers will implement file saving. + */ + virtual bool SaveFile(const wxString& filename, wxRichTextFileType type = wxRICHTEXT_TYPE_ANY); + //@} +#endif // wxUSE_FFILE + +#if wxUSE_STREAMS + //@{ + /** + Loads content from a stream. + Not all handlers will implement loading from a stream. + */ + virtual bool LoadFile(wxInputStream& stream, wxRichTextFileType type = wxRICHTEXT_TYPE_ANY); + //@} + + //@{ + /** + Saves content to a stream. + Not all handlers will implement saving to a stream. + */ + virtual bool SaveFile(wxOutputStream& stream, wxRichTextFileType type = wxRICHTEXT_TYPE_ANY); + //@} +#endif // wxUSE_STREAMS + + /** + Sets the handler flags, controlling loading and saving. + */ + void SetHandlerFlags(int flags) { m_handlerFlags = flags; } + + /** + Gets the handler flags, controlling loading and saving. + */ + int GetHandlerFlags() const { return m_handlerFlags; } + + /** + Convenience function to add a paragraph of text. + */ + virtual wxRichTextRange AddParagraph(const wxString& text, wxRichTextAttr* paraStyle = NULL) { Modify(); return wxRichTextParagraphLayoutBox::AddParagraph(text, paraStyle); } + + /** + Begin collapsing undo/redo commands. Note that this may not work properly + if combining commands that delete or insert content, changing ranges for + subsequent actions. + + @a cmdName should be the name of the combined command that will appear + next to Undo and Redo in the edit menu. + */ + virtual bool BeginBatchUndo(const wxString& cmdName); + + /** + End collapsing undo/redo commands. + */ + virtual bool EndBatchUndo(); + + /** + Returns @true if we are collapsing commands. + */ + virtual bool BatchingUndo() const { return m_batchedCommandDepth > 0; } + + /** + Submit the action immediately, or delay according to whether collapsing is on. + */ + virtual bool SubmitAction(wxRichTextAction* action); + + /** + Returns the collapsed command. + */ + virtual wxRichTextCommand* GetBatchedCommand() const { return m_batchedCommand; } + + /** + Begin suppressing undo/redo commands. The way undo is suppressed may be implemented + differently by each command. If not dealt with by a command implementation, then + it will be implemented automatically by not storing the command in the undo history + when the action is submitted to the command processor. + */ + virtual bool BeginSuppressUndo(); + + /** + End suppressing undo/redo commands. + */ + virtual bool EndSuppressUndo(); + + /** + Are we suppressing undo?? + */ + virtual bool SuppressingUndo() const { return m_suppressUndo > 0; } + + /** + Copy the range to the clipboard. + */ + virtual bool CopyToClipboard(const wxRichTextRange& range); + + /** + Paste the clipboard content to the buffer. + */ + virtual bool PasteFromClipboard(long position); + + /** + Returns @true if we can paste from the clipboard. + */ + virtual bool CanPasteFromClipboard() const; + + /** + Begin using a style. + */ + virtual bool BeginStyle(const wxRichTextAttr& style); + + /** + End the style. + */ + virtual bool EndStyle(); + + /** + End all styles. + */ + virtual bool EndAllStyles(); + + /** + Clears the style stack. + */ + virtual void ClearStyleStack(); + + /** + Returns the size of the style stack, for example to check correct nesting. + */ + virtual size_t GetStyleStackSize() const { return m_attributeStack.GetCount(); } + + /** + Begins using bold. + */ + bool BeginBold(); + + /** + Ends using bold. + */ + bool EndBold() { return EndStyle(); } + + /** + Begins using italic. + */ + bool BeginItalic(); + + /** + Ends using italic. + */ + bool EndItalic() { return EndStyle(); } + + /** + Begins using underline. + */ + bool BeginUnderline(); + + /** + Ends using underline. + */ + bool EndUnderline() { return EndStyle(); } + + /** + Begins using point size. + */ + bool BeginFontSize(int pointSize); + + /** + Ends using point size. + */ + bool EndFontSize() { return EndStyle(); } + + /** + Begins using this font. + */ + bool BeginFont(const wxFont& font); + + /** + Ends using a font. + */ + bool EndFont() { return EndStyle(); } + + /** + Begins using this colour. + */ + bool BeginTextColour(const wxColour& colour); + + /** + Ends using a colour. + */ + bool EndTextColour() { return EndStyle(); } + + /** + Begins using alignment. + */ + bool BeginAlignment(wxTextAttrAlignment alignment); + + /** + Ends alignment. + */ + bool EndAlignment() { return EndStyle(); } + + /** + Begins using @a leftIndent for the left indent, and optionally @a leftSubIndent for + the sub-indent. Both are expressed in tenths of a millimetre. + + The sub-indent is an offset from the left of the paragraph, and is used for all + but the first line in a paragraph. A positive value will cause the first line to appear + to the left of the subsequent lines, and a negative value will cause the first line to be + indented relative to the subsequent lines. + */ + bool BeginLeftIndent(int leftIndent, int leftSubIndent = 0); + + /** + Ends left indent. + */ + bool EndLeftIndent() { return EndStyle(); } + + /** + Begins a right indent, specified in tenths of a millimetre. + */ + bool BeginRightIndent(int rightIndent); + + /** + Ends right indent. + */ + bool EndRightIndent() { return EndStyle(); } + + /** + Begins paragraph spacing; pass the before-paragraph and after-paragraph spacing + in tenths of a millimetre. + */ + bool BeginParagraphSpacing(int before, int after); + + /** + Ends paragraph spacing. + */ + bool EndParagraphSpacing() { return EndStyle(); } + + /** + Begins line spacing using the specified value. @e spacing is a multiple, where + 10 means single-spacing, 15 means 1.5 spacing, and 20 means double spacing. + + The ::wxTextAttrLineSpacing enumeration values are defined for convenience. + */ + bool BeginLineSpacing(int lineSpacing); + + /** + Ends line spacing. + */ + bool EndLineSpacing() { return EndStyle(); } + + /** + Begins numbered bullet. + + This call will be needed for each item in the list, and the + application should take care of incrementing the numbering. + + @a bulletNumber is a number, usually starting with 1. + @a leftIndent and @a leftSubIndent are values in tenths of a millimetre. + @a bulletStyle is a bitlist of the following values: + + wxRichTextBuffer uses indentation to render a bulleted item. + The left indent is the distance between the margin and the bullet. + The content of the paragraph, including the first line, starts + at leftMargin + leftSubIndent. + So the distance between the left edge of the bullet and the + left of the actual paragraph is leftSubIndent. + */ + bool BeginNumberedBullet(int bulletNumber, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD); + + /** + Ends numbered bullet. + */ + bool EndNumberedBullet() { return EndStyle(); } + + /** + Begins applying a symbol bullet, using a character from the current font. + + See BeginNumberedBullet() for an explanation of how indentation is used + to render the bulleted paragraph. + */ + bool BeginSymbolBullet(const wxString& symbol, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_SYMBOL); + + /** + Ends symbol bullet. + */ + bool EndSymbolBullet() { return EndStyle(); } + + /** + Begins applying a standard bullet, using one of the standard bullet names + (currently @c standard/circle or @c standard/square. + + See BeginNumberedBullet() for an explanation of how indentation is used to + render the bulleted paragraph. + */ + bool BeginStandardBullet(const wxString& bulletName, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_STANDARD); + + /** + Ends standard bullet. + */ + bool EndStandardBullet() { return EndStyle(); } + + /** + Begins named character style. + */ + bool BeginCharacterStyle(const wxString& characterStyle); + + /** + Ends named character style. + */ + bool EndCharacterStyle() { return EndStyle(); } + + /** + Begins named paragraph style. + */ + bool BeginParagraphStyle(const wxString& paragraphStyle); + + /** + Ends named character style. + */ + bool EndParagraphStyle() { return EndStyle(); } + + /** + Begins named list style. + + Optionally, you can also pass a level and a number. + */ + bool BeginListStyle(const wxString& listStyle, int level = 1, int number = 1); + + /** + Ends named character style. + */ + bool EndListStyle() { return EndStyle(); } + + /** + Begins applying wxTEXT_ATTR_URL to the content. + + Pass a URL and optionally, a character style to apply, since it is common + to mark a URL with a familiar style such as blue text with underlining. + */ + bool BeginURL(const wxString& url, const wxString& characterStyle = wxEmptyString); + + /** + Ends URL. + */ + bool EndURL() { return EndStyle(); } + +// Event handling + + /** + Adds an event handler. + + A buffer associated with a control has the control as the only event handler, + but the application is free to add more if further notification is required. + All handlers are notified of an event originating from the buffer, such as + the replacement of a style sheet during loading. + + The buffer never deletes any of the event handlers, unless RemoveEventHandler() + is called with @true as the second argument. + */ + bool AddEventHandler(wxEvtHandler* handler); + + /** + Removes an event handler from the buffer's list of handlers, deleting the + object if @a deleteHandler is @true. + */ + bool RemoveEventHandler(wxEvtHandler* handler, bool deleteHandler = false); + + /** + Clear event handlers. + */ + void ClearEventHandlers(); + + /** + Send event to event handlers. If sendToAll is true, will send to all event handlers, + otherwise will stop at the first successful one. + */ + bool SendEvent(wxEvent& event, bool sendToAll = true); + +// Implementation + + virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0); + + /** + Copies the buffer. + */ + void Copy(const wxRichTextBuffer& obj); + + /** + Assignment operator. + */ + void operator= (const wxRichTextBuffer& obj) { Copy(obj); } + + /** + Clones the buffer. + */ + virtual wxRichTextObject* Clone() const { return new wxRichTextBuffer(*this); } + + /** + Submits a command to insert paragraphs. + */ + bool InsertParagraphsWithUndo(long pos, const wxRichTextParagraphLayoutBox& paragraphs, wxRichTextCtrl* ctrl, int flags = 0); + + /** + Submits a command to insert the given text. + */ + bool InsertTextWithUndo(long pos, const wxString& text, wxRichTextCtrl* ctrl, int flags = 0); + + /** + Submits a command to insert a newline. + */ + bool InsertNewlineWithUndo(long pos, wxRichTextCtrl* ctrl, int flags = 0); + + /** + Submits a command to insert the given image. + */ + bool InsertImageWithUndo(long pos, const wxRichTextImageBlock& imageBlock, wxRichTextCtrl* ctrl, int flags = 0, + const wxRichTextAttr& textAttr = wxRichTextAttr()); + + /** + Submits a command to insert an object. + */ + wxRichTextObject* InsertObjectWithUndo(long pos, wxRichTextObject *object, wxRichTextCtrl* ctrl, int flags); + + /** + Submits a command to delete this range. + */ + bool DeleteRangeWithUndo(const wxRichTextRange& range, wxRichTextCtrl* ctrl); + + /** + Mark modified. + */ + void Modify(bool modify = true) { m_modified = modify; } + + /** + Returns @true if the buffer was modified. + */ + bool IsModified() const { return m_modified; } + + //@{ + /** + Dumps contents of buffer for debugging purposes. + */ + virtual void Dump(); + virtual void Dump(wxTextOutputStream& stream) { wxRichTextParagraphLayoutBox::Dump(stream); } + //@} + + /** + Returns the file handlers. + */ + static wxList& GetHandlers() { return sm_handlers; } + + /** + Adds a file handler to the end. + */ + static void AddHandler(wxRichTextFileHandler *handler); + + /** + Inserts a file handler at the front. + */ + static void InsertHandler(wxRichTextFileHandler *handler); + + /** + Removes a file handler. + */ + static bool RemoveHandler(const wxString& name); + + /** + Finds a file handler by name. + */ + static wxRichTextFileHandler *FindHandler(const wxString& name); + + /** + Finds a file handler by extension and type. + */ + static wxRichTextFileHandler *FindHandler(const wxString& extension, wxRichTextFileType imageType); + + /** + Finds a handler by filename or, if supplied, type. + */ + static wxRichTextFileHandler *FindHandlerFilenameOrType(const wxString& filename, + wxRichTextFileType imageType); + + /** + Finds a handler by type. + */ + static wxRichTextFileHandler *FindHandler(wxRichTextFileType imageType); + + /** + Gets a wildcard incorporating all visible handlers. If @a types is present, + it will be filled with the file type corresponding to each filter. This can be + used to determine the type to pass to LoadFile given a selected filter. + */ + static wxString GetExtWildcard(bool combine = false, bool save = false, wxArrayInt* types = NULL); + + /** + Clean up file handlers. + */ + static void CleanUpHandlers(); + + /** + Initialise the standard file handlers. + Currently, only the plain text loading/saving handler is initialised by default. + */ + static void InitStandardHandlers(); + + /** + Returns the drawing handlers. + */ + static wxList& GetDrawingHandlers() { return sm_drawingHandlers; } + + /** + Adds a drawing handler to the end. + */ + static void AddDrawingHandler(wxRichTextDrawingHandler *handler); + + /** + Inserts a drawing handler at the front. + */ + static void InsertDrawingHandler(wxRichTextDrawingHandler *handler); + + /** + Removes a drawing handler. + */ + static bool RemoveDrawingHandler(const wxString& name); + + /** + Finds a drawing handler by name. + */ + static wxRichTextDrawingHandler *FindDrawingHandler(const wxString& name); + + /** + Clean up drawing handlers. + */ + static void CleanUpDrawingHandlers(); + + /** + Returns the field types. + */ + static wxRichTextFieldTypeHashMap& GetFieldTypes() { return sm_fieldTypes; } + + /** + Adds a field type. + + @see RemoveFieldType(), FindFieldType(), wxRichTextField, wxRichTextFieldType, wxRichTextFieldTypeStandard + + */ + static void AddFieldType(wxRichTextFieldType *fieldType); + + /** + Removes a field type by name. + + @see AddFieldType(), FindFieldType(), wxRichTextField, wxRichTextFieldType, wxRichTextFieldTypeStandard + */ + static bool RemoveFieldType(const wxString& name); + + /** + Finds a field type by name. + + @see RemoveFieldType(), AddFieldType(), wxRichTextField, wxRichTextFieldType, wxRichTextFieldTypeStandard + */ + static wxRichTextFieldType *FindFieldType(const wxString& name); + + /** + Cleans up field types. + */ + static void CleanUpFieldTypes(); + + /** + Returns the renderer object. + */ + static wxRichTextRenderer* GetRenderer() { return sm_renderer; } + + /** + Sets @a renderer as the object to be used to render certain aspects of the + content, such as bullets. + + You can override default rendering by deriving a new class from + wxRichTextRenderer or wxRichTextStdRenderer, overriding one or more + virtual functions, and setting an instance of the class using this function. + */ + static void SetRenderer(wxRichTextRenderer* renderer); + + /** + Returns the minimum margin between bullet and paragraph in 10ths of a mm. + */ + static int GetBulletRightMargin() { return sm_bulletRightMargin; } + + /** + Sets the minimum margin between bullet and paragraph in 10ths of a mm. + */ + static void SetBulletRightMargin(int margin) { sm_bulletRightMargin = margin; } + + /** + Returns the factor to multiply by character height to get a reasonable bullet size. + */ + static float GetBulletProportion() { return sm_bulletProportion; } + + /** + Sets the factor to multiply by character height to get a reasonable bullet size. + */ + static void SetBulletProportion(float prop) { sm_bulletProportion = prop; } + + /** + Returns the scale factor for calculating dimensions. + */ + double GetScale() const { return m_scale; } + + /** + Sets the scale factor for calculating dimensions. + */ + void SetScale(double scale) { m_scale = scale; } + + /** + Sets the floating layout mode. Pass @false to speed up editing by not performing + floating layout. This setting affects all buffers. + + */ + static void SetFloatingLayoutMode(bool mode) { sm_floatingLayoutMode = mode; } + + /** + Returns the floating layout mode. The default is @true, where objects + are laid out according to their floating status. + */ + static bool GetFloatingLayoutMode() { return sm_floatingLayoutMode; } + +protected: + + /// Command processor + wxCommandProcessor* m_commandProcessor; + + /// Table storing fonts + wxRichTextFontTable m_fontTable; + + /// Has been modified? + bool m_modified; + + /// Collapsed command stack + int m_batchedCommandDepth; + + /// Name for collapsed command + wxString m_batchedCommandsName; + + /// Current collapsed command accumulating actions + wxRichTextCommand* m_batchedCommand; + + /// Whether to suppress undo + int m_suppressUndo; + + /// Style sheet, if any + wxRichTextStyleSheet* m_styleSheet; + + /// List of event handlers that will be notified of events + wxList m_eventHandlers; + + /// Stack of attributes for convenience functions + wxList m_attributeStack; + + /// Flags to be passed to handlers + int m_handlerFlags; + + /// File handlers + static wxList sm_handlers; + + /// Drawing handlers + static wxList sm_drawingHandlers; + + /// Field types + static wxRichTextFieldTypeHashMap sm_fieldTypes; + + /// Renderer + static wxRichTextRenderer* sm_renderer; + + /// Minimum margin between bullet and paragraph in 10ths of a mm + static int sm_bulletRightMargin; + + /// Factor to multiply by character height to get a reasonable bullet size + static float sm_bulletProportion; + + /// Floating layout mode, @true by default + static bool sm_floatingLayoutMode; + + /// Scaling factor in use: needed to calculate correct dimensions when printing + double m_scale; + + /// Font scale for adjusting the text size when editing + double m_fontScale; + + /// Dimension scale for reducing redundant whitespace when editing + double m_dimensionScale; +}; + +/** + @class wxRichTextCell + + wxRichTextCell is the cell in a table. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextCell: public wxRichTextBox +{ + DECLARE_DYNAMIC_CLASS(wxRichTextCell) +public: +// Constructors + + /** + Default constructor; optionally pass the parent object. + */ + + wxRichTextCell(wxRichTextObject* parent = NULL); + + /** + Copy constructor. + */ + + wxRichTextCell(const wxRichTextCell& obj): wxRichTextBox() { Copy(obj); } + +// Overridables + + virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style); + + virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0); + + virtual bool AdjustAttributes(wxRichTextAttr& attr, wxRichTextDrawingContext& context); + + virtual wxString GetXMLNodeName() const { return wxT("cell"); } + + virtual bool CanEditProperties() const { return true; } + + virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer); + + virtual wxString GetPropertiesMenuLabel() const { return wxGetTranslation("&Cell"); } + +// Accessors + + int GetColSpan() const; + + void SetColSpan(long span) { GetProperties().SetProperty(wxT("colspan"), span); } + + int GetRowSpan() const; + + void SetRowSpan(long span) { GetProperties().SetProperty(wxT("rowspan"), span); } + +// Operations + + virtual wxRichTextObject* Clone() const { return new wxRichTextCell(*this); } + + void Copy(const wxRichTextCell& obj); + +protected: +}; + +/** + @class wxRichTextTable + + wxRichTextTable represents a table with arbitrary columns and rows. + */ + +WX_DEFINE_ARRAY_PTR(wxRichTextObject*, wxRichTextObjectPtrArray); +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxRichTextObjectPtrArray, wxRichTextObjectPtrArrayArray, WXDLLIMPEXP_RICHTEXT); + +class WXDLLIMPEXP_RICHTEXT wxRichTextTable: public wxRichTextBox +{ + DECLARE_DYNAMIC_CLASS(wxRichTextTable) +public: + +// Constructors + + /** + Default constructor; optionally pass the parent object. + */ + + wxRichTextTable(wxRichTextObject* parent = NULL); + + /** + Copy constructor. + */ + + wxRichTextTable(const wxRichTextTable& obj): wxRichTextBox() { Copy(obj); } + +// Overridables + + virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style); + + virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0); + + virtual bool AdjustAttributes(wxRichTextAttr& attr, wxRichTextDrawingContext& context); + + virtual wxString GetXMLNodeName() const { return wxT("table"); } + + virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style); + + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const; + + virtual bool DeleteRange(const wxRichTextRange& range); + + virtual wxString GetTextForRange(const wxRichTextRange& range) const; + +#if wxUSE_XML + virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse); +#endif + +#if wxRICHTEXT_HAVE_DIRECT_OUTPUT + virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler); +#endif + +#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT + virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler); +#endif + + virtual bool FindPosition(wxDC& dc, wxRichTextDrawingContext& context, long index, wxPoint& pt, int* height, bool forceLineStart); + + virtual void CalculateRange(long start, long& end); + + // Can this object handle the selections of its children? FOr example, a table. + virtual bool HandlesChildSelections() const { return true; } + + /// Returns a selection object specifying the selections between start and end character positions. + /// For example, a table would deduce what cells (of range length 1) are selected when dragging across the table. + virtual wxRichTextSelection GetSelection(long start, long end) const; + + virtual bool CanEditProperties() const { return true; } + + virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer); + + virtual wxString GetPropertiesMenuLabel() const { return wxGetTranslation("&Table"); } + + // Returns true if objects of this class can accept the focus, i.e. a call to SetFocusObject + // is possible. For example, containers supporting text, such as a text box object, can accept the focus, + // but a table can't (set the focus to individual cells instead). + virtual bool AcceptsFocus() const { return false; } + +// Accessors + + /** + Returns the cells array. + */ + const wxRichTextObjectPtrArrayArray& GetCells() const { return m_cells; } + + /** + Returns the cells array. + */ + wxRichTextObjectPtrArrayArray& GetCells() { return m_cells; } + + /** + Returns the row count. + */ + int GetRowCount() const { return m_rowCount; } + + /** + Sets the row count. + */ + void SetRowCount(int count) { m_rowCount = count; } + + /** + Returns the column count. + */ + int GetColumnCount() const { return m_colCount; } + + /** + Sets the column count. + */ + void SetColumnCount(int count) { m_colCount = count; } + + /** + Returns the cell at the given row/column position. + */ + virtual wxRichTextCell* GetCell(int row, int col) const; + + /** + Returns the cell at the given character position (in the range of the table). + */ + virtual wxRichTextCell* GetCell(long pos) const; + + /** + Returns the row/column for a given character position. + */ + virtual bool GetCellRowColumnPosition(long pos, int& row, int& col) const; + + /** + Returns the coordinates of the cell with keyboard focus, or (-1,-1) if none. + */ + virtual wxPosition GetFocusedCell() const; + +// Operations + + /** + Clears the table. + */ + + virtual void ClearTable(); + + /** + Creates a table of the given dimensions. + */ + + virtual bool CreateTable(int rows, int cols); + + /** + Sets the attributes for the cells specified by the selection. + */ + + virtual bool SetCellStyle(const wxRichTextSelection& selection, const wxRichTextAttr& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + + /** + Deletes rows from the given row position. + */ + + virtual bool DeleteRows(int startRow, int noRows = 1); + + /** + Deletes columns from the given column position. + */ + + virtual bool DeleteColumns(int startCol, int noCols = 1); + + /** + Adds rows from the given row position. + */ + + virtual bool AddRows(int startRow, int noRows = 1, const wxRichTextAttr& attr = wxRichTextAttr()); + + /** + Adds columns from the given column position. + */ + + virtual bool AddColumns(int startCol, int noCols = 1, const wxRichTextAttr& attr = wxRichTextAttr()); + + // Makes a clone of this object. + virtual wxRichTextObject* Clone() const { return new wxRichTextTable(*this); } + + // Copies this object. + void Copy(const wxRichTextTable& obj); + +protected: + + int m_rowCount; + int m_colCount; + + // An array of rows, each of which is a wxRichTextObjectPtrArray containing + // the cell objects. The cell objects are also children of this object. + // Problem: if boxes are immediate children of a box, this will cause problems + // with wxRichTextParagraphLayoutBox functions (and functions elsewhere) that + // expect to find just paragraphs. May have to adjust the way we handle the + // hierarchy to accept non-paragraph objects in a paragraph layout box. + // We'll be overriding much wxRichTextParagraphLayoutBox functionality so this + // may not be such a problem. Perhaps the table should derive from a different + // class? + wxRichTextObjectPtrArrayArray m_cells; +}; + +/** @class wxRichTextTableBlock + + Stores the coordinates for a block of cells. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextTableBlock +{ +public: + wxRichTextTableBlock() { Init(); } + wxRichTextTableBlock(int colStart, int colEnd, int rowStart, int rowEnd) + { Init(); m_colStart = colStart; m_colEnd = colEnd; m_rowStart = rowStart; m_rowEnd = rowEnd; } + wxRichTextTableBlock(const wxRichTextTableBlock& block) { Copy(block); } + + void Init() { m_colStart = 0; m_colEnd = 0; m_rowStart = 0; m_rowEnd = 0; } + + void Copy(const wxRichTextTableBlock& block) + { + m_colStart = block.m_colStart; m_colEnd = block.m_colEnd; m_rowStart = block.m_rowStart; m_rowEnd = block.m_rowEnd; + } + void operator=(const wxRichTextTableBlock& block) { Copy(block); } + bool operator==(const wxRichTextTableBlock& block) + { return m_colStart == block.m_colStart && m_colEnd == block.m_colEnd && m_rowStart == block.m_rowStart && m_rowEnd == block.m_rowEnd; } + + /// Computes the block given a table (perhaps about to be edited) and a rich text control + /// that may have a selection. If no selection, the whole table is used. If just the whole content + /// of one cell is selected, this cell only is used. If the cell contents is not selected and + /// requireCellSelection is @false, the focused cell will count as a selected cell. + bool ComputeBlockForSelection(wxRichTextTable* table, wxRichTextCtrl* ctrl, bool requireCellSelection = true); + + /// Does this block represent the whole table? + bool IsWholeTable(wxRichTextTable* table) const; + + /// Returns the cell focused in the table, if any + static wxRichTextCell* GetFocusedCell(wxRichTextCtrl* ctrl); + + int& ColStart() { return m_colStart; } + int ColStart() const { return m_colStart; } + + int& ColEnd() { return m_colEnd; } + int ColEnd() const { return m_colEnd; } + + int& RowStart() { return m_rowStart; } + int RowStart() const { return m_rowStart; } + + int& RowEnd() { return m_rowEnd; } + int RowEnd() const { return m_rowEnd; } + + int m_colStart, m_colEnd, m_rowStart, m_rowEnd; +}; + +/** + The command identifiers for Do/Undo. +*/ + +enum wxRichTextCommandId +{ + wxRICHTEXT_INSERT, + wxRICHTEXT_DELETE, + wxRICHTEXT_CHANGE_ATTRIBUTES, + wxRICHTEXT_CHANGE_STYLE, + wxRICHTEXT_CHANGE_PROPERTIES, + wxRICHTEXT_CHANGE_OBJECT +}; + +/** + @class wxRichTextObjectAddress + + A class for specifying an object anywhere in an object hierarchy, + without using a pointer, necessary since wxRTC commands may delete + and recreate sub-objects so physical object addresses change. An array + of positions (one per hierarchy level) is used. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextCommand +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextObjectAddress +{ +public: + /** + Creates the address given a container and an object. + */ + wxRichTextObjectAddress(wxRichTextParagraphLayoutBox* topLevelContainer, wxRichTextObject* obj) { Create(topLevelContainer, obj); } + /** + */ + wxRichTextObjectAddress() { Init(); } + /** + */ + wxRichTextObjectAddress(const wxRichTextObjectAddress& address) { Copy(address); } + + void Init() {} + + /** + Copies the address. + */ + void Copy(const wxRichTextObjectAddress& address) { m_address = address.m_address; } + + /** + Assignment operator. + */ + void operator=(const wxRichTextObjectAddress& address) { Copy(address); } + + /** + Returns the object specified by the address, given a top level container. + */ + wxRichTextObject* GetObject(wxRichTextParagraphLayoutBox* topLevelContainer) const; + + /** + Creates the address given a container and an object. + */ + bool Create(wxRichTextParagraphLayoutBox* topLevelContainer, wxRichTextObject* obj); + + /** + Returns the array of integers representing the object address. + */ + wxArrayInt& GetAddress() { return m_address; } + + /** + Returns the array of integers representing the object address. + */ + const wxArrayInt& GetAddress() const { return m_address; } + + /** + Sets the address from an array of integers. + */ + void SetAddress(const wxArrayInt& address) { m_address = address; } + +protected: + + wxArrayInt m_address; +}; + +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextAction; + +/** + @class wxRichTextCommand + + Implements a command on the undo/redo stack. A wxRichTextCommand object contains one or more wxRichTextAction + objects, allowing aggregation of a number of operations into one command. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextAction +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextCommand: public wxCommand +{ +public: + /** + Constructor for one action. + */ + wxRichTextCommand(const wxString& name, wxRichTextCommandId id, wxRichTextBuffer* buffer, + wxRichTextParagraphLayoutBox* container, wxRichTextCtrl* ctrl, bool ignoreFirstTime = false); + + /** + Constructor for multiple actions. + */ + wxRichTextCommand(const wxString& name); + + virtual ~wxRichTextCommand(); + + /** + Performs the command. + */ + bool Do(); + + /** + Undoes the command. + */ + bool Undo(); + + /** + Adds an action to the action list. + */ + void AddAction(wxRichTextAction* action); + + /** + Clears the action list. + */ + void ClearActions(); + + /** + Returns the action list. + */ + wxList& GetActions() { return m_actions; } + +protected: + + wxList m_actions; +}; + +/** + @class wxRichTextAction + + Implements a part of a command. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextCommand +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextAction: public wxObject +{ +public: + /** + Constructor. @a buffer is the top-level buffer, while @a container is the object within + which the action is taking place. In the simplest case, they are the same. + */ + wxRichTextAction(wxRichTextCommand* cmd, const wxString& name, wxRichTextCommandId id, + wxRichTextBuffer* buffer, wxRichTextParagraphLayoutBox* container, + wxRichTextCtrl* ctrl, bool ignoreFirstTime = false); + + virtual ~wxRichTextAction(); + + /** + Performs the action. + */ + bool Do(); + + /** + Undoes the action. + */ + bool Undo(); + + /** + Updates the control appearance, optimizing if possible given information from the call to Layout. + */ + void UpdateAppearance(long caretPosition, bool sendUpdateEvent = false, + wxArrayInt* optimizationLineCharPositions = NULL, wxArrayInt* optimizationLineYPositions = NULL, bool isDoCmd = true); + + /** + Replaces the buffer paragraphs with the given fragment. + */ + void ApplyParagraphs(const wxRichTextParagraphLayoutBox& fragment); + + /** + Returns the new fragments. + */ + wxRichTextParagraphLayoutBox& GetNewParagraphs() { return m_newParagraphs; } + + /** + Returns the old fragments. + */ + wxRichTextParagraphLayoutBox& GetOldParagraphs() { return m_oldParagraphs; } + + /** + Returns the attributes, for single-object commands. + */ + wxRichTextAttr& GetAttributes() { return m_attributes; } + + /** + Returns the object to replace the one at the position defined by the container address + and the action's range start position. + */ + wxRichTextObject* GetObject() const { return m_object; } + + /** + Stores the object to replace the one at the position defined by the container address + without making an address for it (cf SetObject() and MakeObject()). + */ + void StoreObject(wxRichTextObject* obj) { m_object = obj; } + + /** + Sets the object to replace the one at the position defined by the container address + and the action's range start position. + */ + void SetObject(wxRichTextObject* obj) { m_object = obj; m_objectAddress.Create(m_buffer, m_object); } + + /** + Makes an address from the given object. + */ + void MakeObject(wxRichTextObject* obj) { m_objectAddress.Create(m_buffer, obj); } + + /** + Sets the existing and new objects, for use with wxRICHTEXT_CHANGE_OBJECT. + */ + void SetOldAndNewObjects(wxRichTextObject* oldObj, wxRichTextObject* newObj) { SetObject(oldObj); StoreObject(newObj); } + + /** + Calculate arrays for refresh optimization. + */ + void CalculateRefreshOptimizations(wxArrayInt& optimizationLineCharPositions, wxArrayInt& optimizationLineYPositions); + + /** + Sets the position used for e.g. insertion. + */ + void SetPosition(long pos) { m_position = pos; } + + /** + Returns the position used for e.g. insertion. + */ + long GetPosition() const { return m_position; } + + /** + Sets the range for e.g. deletion. + */ + void SetRange(const wxRichTextRange& range) { m_range = range; } + + /** + Returns the range for e.g. deletion. + */ + const wxRichTextRange& GetRange() const { return m_range; } + + /** + Returns the address (nested position) of the container within the buffer being manipulated. + */ + wxRichTextObjectAddress& GetContainerAddress() { return m_containerAddress; } + + /** + Returns the address (nested position) of the container within the buffer being manipulated. + */ + const wxRichTextObjectAddress& GetContainerAddress() const { return m_containerAddress; } + + /** + Sets the address (nested position) of the container within the buffer being manipulated. + */ + void SetContainerAddress(const wxRichTextObjectAddress& address) { m_containerAddress = address; } + + /** + Sets the address (nested position) of the container within the buffer being manipulated. + */ + void SetContainerAddress(wxRichTextParagraphLayoutBox* container, wxRichTextObject* obj) { m_containerAddress.Create(container, obj); } + + /** + Returns the container that this action refers to, using the container address and top-level buffer. + */ + wxRichTextParagraphLayoutBox* GetContainer() const; + + /** + Returns the action name. + */ + const wxString& GetName() const { return m_name; } + + /** + Instructs the first Do() command should be skipped as it's already been applied. + */ + void SetIgnoreFirstTime(bool b) { m_ignoreThis = b; } + + /** + Returns true if the first Do() command should be skipped as it's already been applied. + */ + bool GetIgnoreFirstTime() const { return m_ignoreThis; } + +protected: + // Action name + wxString m_name; + + // Buffer + wxRichTextBuffer* m_buffer; + + // The address (nested position) of the container being manipulated. + // This is necessary because objects are deleted, and we can't + // therefore store actual pointers. + wxRichTextObjectAddress m_containerAddress; + + // Control + wxRichTextCtrl* m_ctrl; + + // Stores the new paragraphs + wxRichTextParagraphLayoutBox m_newParagraphs; + + // Stores the old paragraphs + wxRichTextParagraphLayoutBox m_oldParagraphs; + + // Stores an object to replace the one at the position + // defined by the container address and the action's range start position. + wxRichTextObject* m_object; + + // Stores the attributes + wxRichTextAttr m_attributes; + + // The address of the object being manipulated (used for changing an individual object or its attributes) + wxRichTextObjectAddress m_objectAddress; + + // Stores the old attributes + // wxRichTextAttr m_oldAttributes; + + // The affected range + wxRichTextRange m_range; + + // The insertion point for this command + long m_position; + + // Ignore 1st 'Do' operation because we already did it + bool m_ignoreThis; + + // The command identifier + wxRichTextCommandId m_cmdId; +}; + +/*! + * Handler flags + */ + +// Include style sheet when loading and saving +#define wxRICHTEXT_HANDLER_INCLUDE_STYLESHEET 0x0001 + +// Save images to memory file system in HTML handler +#define wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_MEMORY 0x0010 + +// Save images to files in HTML handler +#define wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_FILES 0x0020 + +// Save images as inline base64 data in HTML handler +#define wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_BASE64 0x0040 + +// Don't write header and footer (or BODY), so we can include the fragment +// in a larger document +#define wxRICHTEXT_HANDLER_NO_HEADER_FOOTER 0x0080 + +// Convert the more common face names to names that will work on the current platform +// in a larger document +#define wxRICHTEXT_HANDLER_CONVERT_FACENAMES 0x0100 + +/** + @class wxRichTextFileHandler + + The base class for file handlers. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextFileHandler: public wxObject +{ + DECLARE_CLASS(wxRichTextFileHandler) +public: + /** + Creates a file handler object. + */ + wxRichTextFileHandler(const wxString& name = wxEmptyString, const wxString& ext = wxEmptyString, int type = 0) + : m_name(name), m_extension(ext), m_type(type), m_flags(0), m_visible(true) + { } + +#if wxUSE_STREAMS + /** + Loads the buffer from a stream. + Not all handlers will implement file loading. + */ + bool LoadFile(wxRichTextBuffer *buffer, wxInputStream& stream) + { return DoLoadFile(buffer, stream); } + + /** + Saves the buffer to a stream. + Not all handlers will implement file saving. + */ + bool SaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream) + { return DoSaveFile(buffer, stream); } +#endif + +#if wxUSE_FFILE && wxUSE_STREAMS + /** + Loads the buffer from a file. + */ + virtual bool LoadFile(wxRichTextBuffer *buffer, const wxString& filename); + + /** + Saves the buffer to a file. + */ + virtual bool SaveFile(wxRichTextBuffer *buffer, const wxString& filename); +#endif // wxUSE_STREAMS && wxUSE_STREAMS + + /** + Returns @true if we handle this filename (if using files). By default, checks the extension. + */ + virtual bool CanHandle(const wxString& filename) const; + + /** + Returns @true if we can save using this handler. + */ + virtual bool CanSave() const { return false; } + + /** + Returns @true if we can load using this handler. + */ + virtual bool CanLoad() const { return false; } + + /** + Returns @true if this handler should be visible to the user. + */ + virtual bool IsVisible() const { return m_visible; } + + /** + Sets whether the handler should be visible to the user (via the application's + load and save dialogs). + */ + virtual void SetVisible(bool visible) { m_visible = visible; } + + /** + Sets the name of the handler. + */ + void SetName(const wxString& name) { m_name = name; } + + /** + Returns the name of the handler. + */ + wxString GetName() const { return m_name; } + + /** + Sets the default extension to recognise. + */ + void SetExtension(const wxString& ext) { m_extension = ext; } + + /** + Returns the default extension to recognise. + */ + wxString GetExtension() const { return m_extension; } + + /** + Sets the handler type. + */ + void SetType(int type) { m_type = type; } + + /** + Returns the handler type. + */ + int GetType() const { return m_type; } + + /** + Sets flags that change the behaviour of loading or saving. + See the documentation for each handler class to see what flags are relevant + for each handler. + + You call this function directly if you are using a file handler explicitly + (without going through the text control or buffer LoadFile/SaveFile API). + Or, you can call the control or buffer's SetHandlerFlags function to set + the flags that will be used for subsequent load and save operations. + */ + void SetFlags(int flags) { m_flags = flags; } + + /** + Returns flags controlling how loading and saving is done. + */ + int GetFlags() const { return m_flags; } + + /** + Sets the encoding to use when saving a file. If empty, a suitable encoding is chosen. + */ + void SetEncoding(const wxString& encoding) { m_encoding = encoding; } + + /** + Returns the encoding to use when saving a file. If empty, a suitable encoding is chosen. + */ + const wxString& GetEncoding() const { return m_encoding; } + +protected: + +#if wxUSE_STREAMS + /** + Override to load content from @a stream into @a buffer. + */ + virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream) = 0; + + /** + Override to save content to @a stream from @a buffer. + */ + virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream) = 0; +#endif + + wxString m_name; + wxString m_encoding; + wxString m_extension; + int m_type; + int m_flags; + bool m_visible; +}; + +/** + @class wxRichTextPlainTextHandler + + Implements saving a buffer to plain text. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextFileHandler, wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextPlainTextHandler: public wxRichTextFileHandler +{ + DECLARE_CLASS(wxRichTextPlainTextHandler) +public: + wxRichTextPlainTextHandler(const wxString& name = wxT("Text"), + const wxString& ext = wxT("txt"), + wxRichTextFileType type = wxRICHTEXT_TYPE_TEXT) + : wxRichTextFileHandler(name, ext, type) + { } + + // Can we save using this handler? + virtual bool CanSave() const { return true; } + + // Can we load using this handler? + virtual bool CanLoad() const { return true; } + +protected: + +#if wxUSE_STREAMS + virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream); + virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream); +#endif + +}; + +/** + @class wxRichTextDrawingHandler + + The base class for custom drawing handlers. + Currently, drawing handlers can provide virtual attributes. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextDrawingHandler: public wxObject +{ + DECLARE_CLASS(wxRichTextDrawingHandler) +public: + /** + Creates a drawing handler object. + */ + wxRichTextDrawingHandler(const wxString& name = wxEmptyString) + : m_name(name) + { } + + /** + Returns @true if this object has virtual attributes that we can provide. + */ + virtual bool HasVirtualAttributes(wxRichTextObject* obj) const = 0; + + /** + Provides virtual attributes that we can provide. + */ + virtual bool GetVirtualAttributes(wxRichTextAttr& attr, wxRichTextObject* obj) const = 0; + + /** + Gets the count for mixed virtual attributes for individual positions within the object. + For example, individual characters within a text object may require special highlighting. + */ + virtual int GetVirtualSubobjectAttributesCount(wxRichTextObject* obj) const = 0; + + /** + Gets the mixed virtual attributes for individual positions within the object. + For example, individual characters within a text object may require special highlighting. + Returns the number of virtual attributes found. + */ + virtual int GetVirtualSubobjectAttributes(wxRichTextObject* obj, wxArrayInt& positions, wxRichTextAttrArray& attributes) const = 0; + + /** + Do we have virtual text for this object? Virtual text allows an application + to replace characters in an object for editing and display purposes, for example + for highlighting special characters. + */ + virtual bool HasVirtualText(const wxRichTextPlainText* obj) const = 0; + + /** + Gets the virtual text for this object. + */ + virtual bool GetVirtualText(const wxRichTextPlainText* obj, wxString& text) const = 0; + + /** + Sets the name of the handler. + */ + void SetName(const wxString& name) { m_name = name; } + + /** + Returns the name of the handler. + */ + wxString GetName() const { return m_name; } + +protected: + + wxString m_name; +}; + +#if wxUSE_DATAOBJ + +/** + @class wxRichTextBufferDataObject + + Implements a rich text data object for clipboard transfer. + + @library{wxrichtext} + @category{richtext} + + @see wxDataObjectSimple, wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextBufferDataObject: public wxDataObjectSimple +{ +public: + /** + The constructor doesn't copy the pointer, so it shouldn't go away while this object + is alive. + */ + wxRichTextBufferDataObject(wxRichTextBuffer* richTextBuffer = NULL); + virtual ~wxRichTextBufferDataObject(); + + /** + After a call to this function, the buffer is owned by the caller and it + is responsible for deleting it. + */ + wxRichTextBuffer* GetRichTextBuffer(); + + /** + Returns the id for the new data format. + */ + static const wxChar* GetRichTextBufferFormatId() { return ms_richTextBufferFormatId; } + + // base class pure virtuals + + virtual wxDataFormat GetPreferredFormat(Direction dir) const; + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *pBuf) const; + virtual bool SetData(size_t len, const void *buf); + + // prevent warnings + + virtual size_t GetDataSize(const wxDataFormat&) const { return GetDataSize(); } + virtual bool GetDataHere(const wxDataFormat&, void *buf) const { return GetDataHere(buf); } + virtual bool SetData(const wxDataFormat&, size_t len, const void *buf) { return SetData(len, buf); } + +private: + wxDataFormat m_formatRichTextBuffer; // our custom format + wxRichTextBuffer* m_richTextBuffer; // our data + static const wxChar* ms_richTextBufferFormatId; // our format id +}; + +#endif + +/** + @class wxRichTextRenderer + + This class isolates some common drawing functionality. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextRenderer: public wxObject +{ +public: + /** + Constructor. + */ + wxRichTextRenderer() {} + virtual ~wxRichTextRenderer() {} + + /** + Draws a standard bullet, as specified by the value of GetBulletName. This function should be overridden. + */ + virtual bool DrawStandardBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect) = 0; + + /** + Draws a bullet that can be described by text, such as numbered or symbol bullets. This function should be overridden. + */ + virtual bool DrawTextBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect, const wxString& text) = 0; + + /** + Draws a bitmap bullet, where the bullet bitmap is specified by the value of GetBulletName. This function should be overridden. + */ + virtual bool DrawBitmapBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect) = 0; + + /** + Enumerate the standard bullet names currently supported. This function should be overridden. + */ + virtual bool EnumerateStandardBulletNames(wxArrayString& bulletNames) = 0; +}; + +/** + @class wxRichTextStdRenderer + + The standard renderer for drawing bullets. + + @library{wxrichtext} + @category{richtext} + + @see wxRichTextRenderer, wxRichTextBuffer, wxRichTextCtrl +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextStdRenderer: public wxRichTextRenderer +{ +public: + /** + Constructor. + */ + wxRichTextStdRenderer() {} + + // Draw a standard bullet, as specified by the value of GetBulletName + virtual bool DrawStandardBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect); + + // Draw a bullet that can be described by text, such as numbered or symbol bullets + virtual bool DrawTextBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect, const wxString& text); + + // Draw a bitmap bullet, where the bullet bitmap is specified by the value of GetBulletName + virtual bool DrawBitmapBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect); + + // Enumerate the standard bullet names currently supported + virtual bool EnumerateStandardBulletNames(wxArrayString& bulletNames); +}; + +/*! + * Utilities + * + */ + +inline bool wxRichTextHasStyle(int flags, int style) +{ + return ((flags & style) == style); +} + +/// Compare two attribute objects +WXDLLIMPEXP_RICHTEXT bool wxTextAttrEq(const wxRichTextAttr& attr1, const wxRichTextAttr& attr2); +WXDLLIMPEXP_RICHTEXT bool wxTextAttrEq(const wxRichTextAttr& attr1, const wxRichTextAttr& attr2); + +/// Apply one style to another +WXDLLIMPEXP_RICHTEXT bool wxRichTextApplyStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style, wxRichTextAttr* compareWith = NULL); + +// Remove attributes +WXDLLIMPEXP_RICHTEXT bool wxRichTextRemoveStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style); + +/// Combine two bitlists +WXDLLIMPEXP_RICHTEXT bool wxRichTextCombineBitlists(int& valueA, int valueB, int& flagsA, int flagsB); + +/// Compare two bitlists +WXDLLIMPEXP_RICHTEXT bool wxRichTextBitlistsEqPartial(int valueA, int valueB, int flags); + +/// Split into paragraph and character styles +WXDLLIMPEXP_RICHTEXT bool wxRichTextSplitParaCharStyles(const wxRichTextAttr& style, wxRichTextAttr& parStyle, wxRichTextAttr& charStyle); + +/// Compare tabs +WXDLLIMPEXP_RICHTEXT bool wxRichTextTabsEq(const wxArrayInt& tabs1, const wxArrayInt& tabs2); + +/// Convert a decimal to Roman numerals +WXDLLIMPEXP_RICHTEXT wxString wxRichTextDecimalToRoman(long n); + +// Collects the attributes that are common to a range of content, building up a note of +// which attributes are absent in some objects and which clash in some objects. +WXDLLIMPEXP_RICHTEXT void wxTextAttrCollectCommonAttributes(wxTextAttr& currentStyle, const wxTextAttr& attr, wxTextAttr& clashingAttr, wxTextAttr& absentAttr); + +WXDLLIMPEXP_RICHTEXT void wxRichTextModuleInit(); + +#endif + // wxUSE_RICHTEXT + +#endif + // _WX_RICHTEXTBUFFER_H_ + diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextbulletspage.h b/wxmsw/include/wx-3.0/wx/richtext/richtextbulletspage.h new file mode 100644 index 00000000..4cf6b774 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextbulletspage.h @@ -0,0 +1,220 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextbulletspage.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 10/4/2006 10:32:31 AM +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTBULLETSPAGE_H_ +#define _RICHTEXTBULLETSPAGE_H_ + +/*! + * Includes + */ + +#include "wx/richtext/richtextdialogpage.h" +#include "wx/spinbutt.h" // for wxSpinEvent + +/*! + * Forward declarations + */ + +////@begin forward declarations +class wxSpinCtrl; +class wxRichTextCtrl; +////@end forward declarations + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTBULLETSPAGE_STYLE wxRESIZE_BORDER|wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTBULLETSPAGE_TITLE wxEmptyString +#define SYMBOL_WXRICHTEXTBULLETSPAGE_IDNAME ID_RICHTEXTBULLETSPAGE +#define SYMBOL_WXRICHTEXTBULLETSPAGE_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTBULLETSPAGE_POSITION wxDefaultPosition +////@end control identifiers + +/*! + * wxRichTextBulletsPage class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextBulletsPage: public wxRichTextDialogPage +{ + DECLARE_DYNAMIC_CLASS( wxRichTextBulletsPage ) + DECLARE_EVENT_TABLE() + DECLARE_HELP_PROVISION() + +public: + /// Constructors + wxRichTextBulletsPage( ); + wxRichTextBulletsPage( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTBULLETSPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTBULLETSPAGE_SIZE, long style = SYMBOL_WXRICHTEXTBULLETSPAGE_STYLE ); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTBULLETSPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTBULLETSPAGE_SIZE, long style = SYMBOL_WXRICHTEXTBULLETSPAGE_STYLE ); + + /// Initialise members + void Init(); + + /// Creates the controls and sizers + void CreateControls(); + + /// Updates the bullets preview + void UpdatePreview(); + + /// Transfer data from/to window + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + /// Gets the attributes associated with the main formatting dialog + wxRichTextAttr* GetAttributes(); + + /// Update for symbol-related controls + void OnSymbolUpdate( wxUpdateUIEvent& event ); + + /// Update for number-related controls + void OnNumberUpdate( wxUpdateUIEvent& event ); + + /// Update for standard bullet-related controls + void OnStandardBulletUpdate( wxUpdateUIEvent& event ); + +////@begin wxRichTextBulletsPage event handler declarations + + /// wxEVT_LISTBOX event handler for ID_RICHTEXTBULLETSPAGE_STYLELISTBOX + void OnStylelistboxSelected( wxCommandEvent& event ); + + /// wxEVT_CHECKBOX event handler for ID_RICHTEXTBULLETSPAGE_PERIODCTRL + void OnPeriodctrlClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_PERIODCTRL + void OnPeriodctrlUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_CHECKBOX event handler for ID_RICHTEXTBULLETSPAGE_PARENTHESESCTRL + void OnParenthesesctrlClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_PARENTHESESCTRL + void OnParenthesesctrlUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_CHECKBOX event handler for ID_RICHTEXTBULLETSPAGE_RIGHTPARENTHESISCTRL + void OnRightParenthesisCtrlClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_RIGHTPARENTHESISCTRL + void OnRightParenthesisCtrlUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMBOBOX event handler for ID_RICHTEXTBULLETSPAGE_BULLETALIGNMENTCTRL + void OnBulletAlignmentCtrlSelected( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLSTATIC + void OnSymbolstaticUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMBOBOX event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLCTRL + void OnSymbolctrlSelected( wxCommandEvent& event ); + + /// wxEVT_TEXT event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLCTRL + void OnSymbolctrlUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLCTRL + void OnSymbolctrlUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_BUTTON event handler for ID_RICHTEXTBULLETSPAGE_CHOOSE_SYMBOL + void OnChooseSymbolClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_CHOOSE_SYMBOL + void OnChooseSymbolUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMBOBOX event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLFONTCTRL + void OnSymbolfontctrlSelected( wxCommandEvent& event ); + + /// wxEVT_TEXT event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLFONTCTRL + void OnSymbolfontctrlUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLFONTCTRL + void OnSymbolfontctrlUIUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_NAMESTATIC + void OnNamestaticUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMBOBOX event handler for ID_RICHTEXTBULLETSPAGE_NAMECTRL + void OnNamectrlSelected( wxCommandEvent& event ); + + /// wxEVT_TEXT event handler for ID_RICHTEXTBULLETSPAGE_NAMECTRL + void OnNamectrlUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_NAMECTRL + void OnNamectrlUIUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_NUMBERSTATIC + void OnNumberstaticUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_SPINCTRL event handler for ID_RICHTEXTBULLETSPAGE_NUMBERCTRL + void OnNumberctrlUpdated( wxSpinEvent& event ); + + /// wxEVT_SCROLL_LINEUP event handler for ID_RICHTEXTBULLETSPAGE_NUMBERCTRL + void OnNumberctrlUp( wxSpinEvent& event ); + + /// wxEVT_SCROLL_LINEDOWN event handler for ID_RICHTEXTBULLETSPAGE_NUMBERCTRL + void OnNumberctrlDown( wxSpinEvent& event ); + + /// wxEVT_TEXT event handler for ID_RICHTEXTBULLETSPAGE_NUMBERCTRL + void OnNumberctrlTextUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_NUMBERCTRL + void OnNumberctrlUpdate( wxUpdateUIEvent& event ); + +////@end wxRichTextBulletsPage event handler declarations + +////@begin wxRichTextBulletsPage member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextBulletsPage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextBulletsPage member variables + wxListBox* m_styleListBox; + wxCheckBox* m_periodCtrl; + wxCheckBox* m_parenthesesCtrl; + wxCheckBox* m_rightParenthesisCtrl; + wxComboBox* m_bulletAlignmentCtrl; + wxComboBox* m_symbolCtrl; + wxComboBox* m_symbolFontCtrl; + wxComboBox* m_bulletNameCtrl; + wxSpinCtrl* m_numberCtrl; + wxRichTextCtrl* m_previewCtrl; + /// Control identifiers + enum { + ID_RICHTEXTBULLETSPAGE = 10300, + ID_RICHTEXTBULLETSPAGE_STYLELISTBOX = 10305, + ID_RICHTEXTBULLETSPAGE_PERIODCTRL = 10313, + ID_RICHTEXTBULLETSPAGE_PARENTHESESCTRL = 10311, + ID_RICHTEXTBULLETSPAGE_RIGHTPARENTHESISCTRL = 10306, + ID_RICHTEXTBULLETSPAGE_BULLETALIGNMENTCTRL = 10315, + ID_RICHTEXTBULLETSPAGE_SYMBOLSTATIC = 10301, + ID_RICHTEXTBULLETSPAGE_SYMBOLCTRL = 10307, + ID_RICHTEXTBULLETSPAGE_CHOOSE_SYMBOL = 10308, + ID_RICHTEXTBULLETSPAGE_SYMBOLFONTCTRL = 10309, + ID_RICHTEXTBULLETSPAGE_NAMESTATIC = 10303, + ID_RICHTEXTBULLETSPAGE_NAMECTRL = 10304, + ID_RICHTEXTBULLETSPAGE_NUMBERSTATIC = 10302, + ID_RICHTEXTBULLETSPAGE_NUMBERCTRL = 10310, + ID_RICHTEXTBULLETSPAGE_PREVIEW_CTRL = 10314 + }; +////@end wxRichTextBulletsPage member variables + + bool m_hasBulletStyle; + bool m_hasBulletNumber; + bool m_hasBulletSymbol; + bool m_dontUpdate; +}; + +#endif + // _RICHTEXTBULLETSPAGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextctrl.h b/wxmsw/include/wx-3.0/wx/richtext/richtextctrl.h new file mode 100644 index 00000000..93e26d6b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextctrl.h @@ -0,0 +1,2638 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextctrl.h +// Purpose: A rich edit control +// Author: Julian Smart +// Modified by: +// Created: 2005-09-30 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTCTRL_H_ +#define _WX_RICHTEXTCTRL_H_ + +#include "wx/richtext/richtextbuffer.h" + +#if wxUSE_RICHTEXT + +#include "wx/scrolwin.h" +#include "wx/caret.h" + +#include "wx/textctrl.h" + +#if wxUSE_DRAG_AND_DROP +#include "wx/dnd.h" +#endif + +#if !defined(__WXGTK__) && !defined(__WXMAC__) +#define wxRICHTEXT_BUFFERED_PAINTING 1 +#else +#define wxRICHTEXT_BUFFERED_PAINTING 0 +#endif + +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextStyleDefinition; + +/* + * Styles and flags + */ + +/** + Styles +*/ + +#define wxRE_READONLY 0x0010 +#define wxRE_MULTILINE 0x0020 +#define wxRE_CENTRE_CARET 0x8000 +#define wxRE_CENTER_CARET wxRE_CENTRE_CARET + +/** + Flags +*/ + +#define wxRICHTEXT_SHIFT_DOWN 0x01 +#define wxRICHTEXT_CTRL_DOWN 0x02 +#define wxRICHTEXT_ALT_DOWN 0x04 + +/** + Extra flags +*/ + +// Don't draw guide lines around boxes and tables +#define wxRICHTEXT_EX_NO_GUIDELINES 0x00000100 + + +/* + Defaults +*/ + +#define wxRICHTEXT_DEFAULT_OVERALL_SIZE wxSize(-1, -1) +#define wxRICHTEXT_DEFAULT_IMAGE_SIZE wxSize(80, 80) +#define wxRICHTEXT_DEFAULT_SPACING 3 +#define wxRICHTEXT_DEFAULT_MARGIN 3 +#define wxRICHTEXT_DEFAULT_UNFOCUSSED_BACKGROUND wxColour(175, 175, 175) +#define wxRICHTEXT_DEFAULT_FOCUSSED_BACKGROUND wxColour(140, 140, 140) +#define wxRICHTEXT_DEFAULT_UNSELECTED_BACKGROUND wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE) +#define wxRICHTEXT_DEFAULT_TYPE_COLOUR wxColour(0, 0, 200) +#define wxRICHTEXT_DEFAULT_FOCUS_RECT_COLOUR wxColour(100, 80, 80) +#define wxRICHTEXT_DEFAULT_CARET_WIDTH 2 +// Minimum buffer size before delayed layout kicks in +#define wxRICHTEXT_DEFAULT_DELAYED_LAYOUT_THRESHOLD 20000 +// Milliseconds before layout occurs after resize +#define wxRICHTEXT_DEFAULT_LAYOUT_INTERVAL 50 + +/* Identifiers + */ +#define wxID_RICHTEXT_PROPERTIES1 (wxID_HIGHEST + 1) +#define wxID_RICHTEXT_PROPERTIES2 (wxID_HIGHEST + 2) +#define wxID_RICHTEXT_PROPERTIES3 (wxID_HIGHEST + 3) + +/* + Normal selection occurs initially and as user drags within one container. + Common ancestor selection occurs when the user starts dragging across containers + that have a common ancestor, for example the cells in a table. + */ + +enum wxRichTextCtrlSelectionState +{ + wxRichTextCtrlSelectionState_Normal, + wxRichTextCtrlSelectionState_CommonAncestor +}; + +/** + @class wxRichTextContextMenuPropertiesInfo + + wxRichTextContextMenuPropertiesInfo keeps track of objects that appear in the context menu, + whose properties are available to be edited. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextContextMenuPropertiesInfo +{ +public: + /** + Constructor. + */ + wxRichTextContextMenuPropertiesInfo() { Init(); } + +// Operations + + /** + Initialisation. + */ + void Init() {} + + /** + Adds an item. + */ + bool AddItem(const wxString& label, wxRichTextObject* obj); + + /** + Returns the number of menu items that were added. + */ + int AddMenuItems(wxMenu* menu, int startCmd = wxID_RICHTEXT_PROPERTIES1) const; + + /** + Adds appropriate menu items for the current container and clicked on object + (and container's parent, if appropriate). + */ + int AddItems(wxRichTextCtrl* ctrl, wxRichTextObject* container, wxRichTextObject* obj); + + /** + Clears the items. + */ + void Clear() { m_objects.Clear(); m_labels.Clear(); } + +// Accessors + + /** + Returns the nth label. + */ + wxString GetLabel(int n) const { return m_labels[n]; } + + /** + Returns the nth object. + */ + wxRichTextObject* GetObject(int n) const { return m_objects[n]; } + + /** + Returns the array of objects. + */ + wxRichTextObjectPtrArray& GetObjects() { return m_objects; } + + /** + Returns the array of objects. + */ + const wxRichTextObjectPtrArray& GetObjects() const { return m_objects; } + + /** + Returns the array of labels. + */ + wxArrayString& GetLabels() { return m_labels; } + + /** + Returns the array of labels. + */ + const wxArrayString& GetLabels() const { return m_labels; } + + /** + Returns the number of items. + */ + int GetCount() const { return m_objects.GetCount(); } + + wxRichTextObjectPtrArray m_objects; + wxArrayString m_labels; +}; + +/** + @class wxRichTextCtrl + + wxRichTextCtrl provides a generic, ground-up implementation of a text control + capable of showing multiple styles and images. + + wxRichTextCtrl sends notification events: see wxRichTextEvent. + + It also sends the standard wxTextCtrl events @c wxEVT_TEXT_ENTER and + @c wxEVT_TEXT, and wxTextUrlEvent when URL content is clicked. + + For more information, see the @ref overview_richtextctrl. + + @beginStyleTable + @style{wxRE_CENTRE_CARET} + The control will try to keep the caret line centred vertically while editing. + wxRE_CENTER_CARET is a synonym for this style. + @style{wxRE_MULTILINE} + The control will be multiline (mandatory). + @style{wxRE_READONLY} + The control will not be editable. + @endStyleTable + + @library{wxrichtext} + @category{richtext} + @appearance{richtextctrl.png} + + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextCtrl : public wxControl, + public wxTextCtrlIface, + public wxScrollHelper +{ + DECLARE_DYNAMIC_CLASS( wxRichTextCtrl ) + DECLARE_EVENT_TABLE() + +public: +// Constructors + + /** + Default constructor. + */ + wxRichTextCtrl( ); + + /** + Constructor, creating and showing a rich text control. + + @param parent + Parent window. Must not be @NULL. + @param id + Window identifier. The value @c wxID_ANY indicates a default value. + @param value + Default string. + @param pos + Window position. + @param size + Window size. + @param style + Window style. + @param validator + Window validator. + @param name + Window name. + + @see Create(), wxValidator + */ + wxRichTextCtrl( wxWindow* parent, wxWindowID id = -1, const wxString& value = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, + long style = wxRE_MULTILINE, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxTextCtrlNameStr); + + /** + Destructor. + */ + virtual ~wxRichTextCtrl( ); + +// Operations + + /** + Creates the underlying window. + */ + bool Create( wxWindow* parent, wxWindowID id = -1, const wxString& value = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, + long style = wxRE_MULTILINE, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxTextCtrlNameStr ); + + /** + Initialises the members of the control. + */ + void Init(); + +// Accessors + + /** + Gets the text for the given range. + The end point of range is specified as the last character position of + the span of text, plus one. + */ + virtual wxString GetRange(long from, long to) const; + + /** + Returns the length of the specified line in characters. + */ + virtual int GetLineLength(long lineNo) const ; + + /** + Returns the text for the given line. + */ + virtual wxString GetLineText(long lineNo) const ; + + /** + Returns the number of lines in the buffer. + */ + virtual int GetNumberOfLines() const ; + + /** + Returns @true if the buffer has been modified. + */ + virtual bool IsModified() const ; + + /** + Returns @true if the control is editable. + */ + virtual bool IsEditable() const ; + + /** + Returns @true if the control is single-line. + Currently wxRichTextCtrl does not support single-line editing. + */ + bool IsSingleLine() const { return !HasFlag(wxRE_MULTILINE); } + + /** + Returns @true if the control is multiline. + */ + bool IsMultiLine() const { return !IsSingleLine(); } + + //@{ + /** + Returns the range of the current selection. + The end point of range is specified as the last character position of the span + of text, plus one. + If the return values @a from and @a to are the same, there is no selection. + */ + virtual void GetSelection(long* from, long* to) const; + const wxRichTextSelection& GetSelection() const { return m_selection; } + wxRichTextSelection& GetSelection() { return m_selection; } + //@} + + /** + Returns the text within the current selection range, if any. + */ + virtual wxString GetStringSelection() const; + + /** + Gets the current filename associated with the control. + */ + wxString GetFilename() const { return m_filename; } + + /** + Sets the current filename. + */ + void SetFilename(const wxString& filename) { m_filename = filename; } + + /** + Sets the size of the buffer beyond which layout is delayed during resizing. + This optimizes sizing for large buffers. The default is 20000. + */ + void SetDelayedLayoutThreshold(long threshold) { m_delayedLayoutThreshold = threshold; } + + /** + Gets the size of the buffer beyond which layout is delayed during resizing. + This optimizes sizing for large buffers. The default is 20000. + */ + long GetDelayedLayoutThreshold() const { return m_delayedLayoutThreshold; } + + /** + Gets the flag indicating that full layout is required. + */ + bool GetFullLayoutRequired() const { return m_fullLayoutRequired; } + + /** + Sets the flag indicating that full layout is required. + */ + void SetFullLayoutRequired(bool b) { m_fullLayoutRequired = b; } + + /** + Returns the last time full layout was performed. + */ + wxLongLong GetFullLayoutTime() const { return m_fullLayoutTime; } + + /** + Sets the last time full layout was performed. + */ + void SetFullLayoutTime(wxLongLong t) { m_fullLayoutTime = t; } + + /** + Returns the position that should be shown when full (delayed) layout is performed. + */ + long GetFullLayoutSavedPosition() const { return m_fullLayoutSavedPosition; } + + /** + Sets the position that should be shown when full (delayed) layout is performed. + */ + void SetFullLayoutSavedPosition(long p) { m_fullLayoutSavedPosition = p; } + + /** + Forces any pending layout due to delayed, partial layout when the control + was resized. + */ + void ForceDelayedLayout(); + + /** + Sets the text (normal) cursor. + */ + void SetTextCursor(const wxCursor& cursor ) { m_textCursor = cursor; } + + /** + Returns the text (normal) cursor. + */ + wxCursor GetTextCursor() const { return m_textCursor; } + + /** + Sets the cursor to be used over URLs. + */ + void SetURLCursor(const wxCursor& cursor ) { m_urlCursor = cursor; } + + /** + Returns the cursor to be used over URLs. + */ + wxCursor GetURLCursor() const { return m_urlCursor; } + + /** + Returns @true if we are showing the caret position at the start of a line + instead of at the end of the previous one. + */ + bool GetCaretAtLineStart() const { return m_caretAtLineStart; } + + /** + Sets a flag to remember that we are showing the caret position at the start of a line + instead of at the end of the previous one. + */ + void SetCaretAtLineStart(bool atStart) { m_caretAtLineStart = atStart; } + + /** + Returns @true if we are dragging a selection. + */ + bool GetDragging() const { return m_dragging; } + + /** + Sets a flag to remember if we are dragging a selection. + */ + void SetDragging(bool dragging) { m_dragging = dragging; } + +#if wxUSE_DRAG_AND_DROP + /** + Are we trying to start Drag'n'Drop? + */ + bool GetPreDrag() const { return m_preDrag; } + + /** + Set if we're trying to start Drag'n'Drop + */ + void SetPreDrag(bool pd) { m_preDrag = pd; } + + /** + Get the possible Drag'n'Drop start point + */ + const wxPoint GetDragStartPoint() const { return m_dragStartPoint; } + + /** + Set the possible Drag'n'Drop start point + */ + void SetDragStartPoint(wxPoint sp) { m_dragStartPoint = sp; } + +#if wxUSE_DATETIME + /** + Get the possible Drag'n'Drop start time + */ + const wxDateTime GetDragStartTime() const { return m_dragStartTime; } + + /** + Set the possible Drag'n'Drop start time + */ + void SetDragStartTime(wxDateTime st) { m_dragStartTime = st; } +#endif // wxUSE_DATETIME + +#endif // wxUSE_DRAG_AND_DROP + +#if wxRICHTEXT_BUFFERED_PAINTING + //@{ + /** + Returns the buffer bitmap if using buffered painting. + */ + const wxBitmap& GetBufferBitmap() const { return m_bufferBitmap; } + wxBitmap& GetBufferBitmap() { return m_bufferBitmap; } + //@} +#endif + + /** + Returns the current context menu. + */ + wxMenu* GetContextMenu() const { return m_contextMenu; } + + /** + Sets the current context menu. + */ + void SetContextMenu(wxMenu* menu); + + /** + Returns an anchor so we know how to extend the selection. + It's a caret position since it's between two characters. + */ + long GetSelectionAnchor() const { return m_selectionAnchor; } + + /** + Sets an anchor so we know how to extend the selection. + It's a caret position since it's between two characters. + */ + void SetSelectionAnchor(long anchor) { m_selectionAnchor = anchor; } + + /** + Returns the anchor object if selecting multiple containers. + */ + wxRichTextObject* GetSelectionAnchorObject() const { return m_selectionAnchorObject; } + + /** + Sets the anchor object if selecting multiple containers. + */ + void SetSelectionAnchorObject(wxRichTextObject* anchor) { m_selectionAnchorObject = anchor; } + + //@{ + /** + Returns an object that stores information about context menu property item(s), + in order to communicate between the context menu event handler and the code + that responds to it. The wxRichTextContextMenuPropertiesInfo stores one + item for each object that could respond to a property-editing event. If + objects are nested, several might be editable. + */ + wxRichTextContextMenuPropertiesInfo& GetContextMenuPropertiesInfo() { return m_contextMenuPropertiesInfo; } + const wxRichTextContextMenuPropertiesInfo& GetContextMenuPropertiesInfo() const { return m_contextMenuPropertiesInfo; } + //@} + + /** + Returns the wxRichTextObject object that currently has the editing focus. + If there are no composite objects, this will be the top-level buffer. + */ + wxRichTextParagraphLayoutBox* GetFocusObject() const { return m_focusObject; } + + /** + Sets m_focusObject without making any alterations. + */ + void StoreFocusObject(wxRichTextParagraphLayoutBox* obj) { m_focusObject = obj; } + + /** + Sets the wxRichTextObject object that currently has the editing focus. + */ + bool SetFocusObject(wxRichTextParagraphLayoutBox* obj, bool setCaretPosition = true); + +// Operations + + /** + Invalidates the whole buffer to trigger painting later. + */ + void Invalidate() { GetBuffer().Invalidate(wxRICHTEXT_ALL); } + + /** + Clears the buffer content, leaving a single empty paragraph. Cannot be undone. + */ + virtual void Clear(); + + /** + Replaces the content in the specified range with the string specified by + @a value. + */ + virtual void Replace(long from, long to, const wxString& value); + + /** + Removes the content in the specified range. + */ + virtual void Remove(long from, long to); + +#ifdef DOXYGEN + /** + Loads content into the control's buffer using the given type. + + If the specified type is wxRICHTEXT_TYPE_ANY, the type is deduced from + the filename extension. + + This function looks for a suitable wxRichTextFileHandler object. + */ + bool LoadFile(const wxString& file, + int type = wxRICHTEXT_TYPE_ANY); +#endif + +#if wxUSE_FFILE && wxUSE_STREAMS + /** + Helper function for LoadFile(). Loads content into the control's buffer using the given type. + + If the specified type is wxRICHTEXT_TYPE_ANY, the type is deduced from + the filename extension. + + This function looks for a suitable wxRichTextFileHandler object. + */ + virtual bool DoLoadFile(const wxString& file, int fileType); +#endif // wxUSE_FFILE && wxUSE_STREAMS + +#ifdef DOXYGEN + /** + Saves the buffer content using the given type. + + If the specified type is wxRICHTEXT_TYPE_ANY, the type is deduced from + the filename extension. + + This function looks for a suitable wxRichTextFileHandler object. + */ + bool SaveFile(const wxString& file = wxEmptyString, + int type = wxRICHTEXT_TYPE_ANY); +#endif + +#if wxUSE_FFILE && wxUSE_STREAMS + /** + Helper function for SaveFile(). Saves the buffer content using the given type. + + If the specified type is wxRICHTEXT_TYPE_ANY, the type is deduced from + the filename extension. + + This function looks for a suitable wxRichTextFileHandler object. + */ + virtual bool DoSaveFile(const wxString& file = wxEmptyString, + int fileType = wxRICHTEXT_TYPE_ANY); +#endif // wxUSE_FFILE && wxUSE_STREAMS + + /** + Sets flags that change the behaviour of loading or saving. + + See the documentation for each handler class to see what flags are + relevant for each handler. + */ + void SetHandlerFlags(int flags) { GetBuffer().SetHandlerFlags(flags); } + + /** + Returns flags that change the behaviour of loading or saving. + See the documentation for each handler class to see what flags are + relevant for each handler. + */ + int GetHandlerFlags() const { return GetBuffer().GetHandlerFlags(); } + + /** + Marks the buffer as modified. + */ + virtual void MarkDirty(); + + /** + Sets the buffer's modified status to @false, and clears the buffer's command + history. + */ + virtual void DiscardEdits(); + + /** + Sets the maximum number of characters that may be entered in a single line + text control. For compatibility only; currently does nothing. + */ + virtual void SetMaxLength(unsigned long WXUNUSED(len)) { } + + /** + Writes text at the current position. + */ + virtual void WriteText(const wxString& text); + + /** + Sets the insertion point to the end of the buffer and writes the text. + */ + virtual void AppendText(const wxString& text); + + //@{ + /** + Gets the attributes at the given position. + This function gets the combined style - that is, the style you see on the + screen as a result of combining base style, paragraph style and character + style attributes. + + To get the character or paragraph style alone, use GetUncombinedStyle(). + + @beginWxPerlOnly + In wxPerl this method is implemented as GetStyle(@a position) + returning a 2-element list (ok, attr). + @endWxPerlOnly + */ + virtual bool GetStyle(long position, wxTextAttr& style); + virtual bool GetStyle(long position, wxRichTextAttr& style); + virtual bool GetStyle(long position, wxRichTextAttr& style, wxRichTextParagraphLayoutBox* container); + //@} + + //@{ + /** + Sets the attributes for the given range. + The end point of range is specified as the last character position of the span + of text, plus one. + + So, for example, to set the style for a character at position 5, use the range + (5,6). + */ + virtual bool SetStyle(long start, long end, const wxTextAttr& style); + virtual bool SetStyle(long start, long end, const wxRichTextAttr& style); + virtual bool SetStyle(const wxRichTextRange& range, const wxTextAttr& style); + virtual bool SetStyle(const wxRichTextRange& range, const wxRichTextAttr& style); + //@} + + /** + Sets the attributes for a single object + */ + virtual void SetStyle(wxRichTextObject *obj, const wxRichTextAttr& textAttr, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + + //@{ + /** + Gets the attributes common to the specified range. + Attributes that differ in value within the range will not be included + in @a style flags. + + @beginWxPerlOnly + In wxPerl this method is implemented as GetStyleForRange(@a position) + returning a 2-element list (ok, attr). + @endWxPerlOnly + */ + virtual bool GetStyleForRange(const wxRichTextRange& range, wxTextAttr& style); + virtual bool GetStyleForRange(const wxRichTextRange& range, wxRichTextAttr& style); + virtual bool GetStyleForRange(const wxRichTextRange& range, wxRichTextAttr& style, wxRichTextParagraphLayoutBox* container); + //@} + + /** + Sets the attributes for the given range, passing flags to determine how the + attributes are set. + + The end point of range is specified as the last character position of the span + of text, plus one. So, for example, to set the style for a character at + position 5, use the range (5,6). + + @a flags may contain a bit list of the following values: + - wxRICHTEXT_SETSTYLE_NONE: no style flag. + - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this operation should be + undoable. + - wxRICHTEXT_SETSTYLE_OPTIMIZE: specifies that the style should not be applied + if the combined style at this point is already the style in question. + - wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY: specifies that the style should only be + applied to paragraphs, and not the content. + This allows content styling to be preserved independently from that + of e.g. a named paragraph style. + - wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY: specifies that the style should only be + applied to characters, and not the paragraph. + This allows content styling to be preserved independently from that + of e.g. a named paragraph style. + - wxRICHTEXT_SETSTYLE_RESET: resets (clears) the existing style before applying + the new style. + - wxRICHTEXT_SETSTYLE_REMOVE: removes the specified style. Only the style flags + are used in this operation. + */ + virtual bool SetStyleEx(const wxRichTextRange& range, const wxRichTextAttr& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + + //@{ + /** + Gets the attributes at the given position. + This function gets the @e uncombined style - that is, the attributes associated + with the paragraph or character content, and not necessarily the combined + attributes you see on the screen. + To get the combined attributes, use GetStyle(). + + If you specify (any) paragraph attribute in @e style's flags, this function + will fetch the paragraph attributes. + Otherwise, it will return the character attributes. + + @beginWxPerlOnly + In wxPerl this method is implemented as GetUncombinedStyle(@a position) + returning a 2-element list (ok, attr). + @endWxPerlOnly + */ + virtual bool GetUncombinedStyle(long position, wxRichTextAttr& style); + virtual bool GetUncombinedStyle(long position, wxRichTextAttr& style, wxRichTextParagraphLayoutBox* container); + //@} + + //@{ + /** + Sets the current default style, which can be used to change how subsequently + inserted text is displayed. + */ + virtual bool SetDefaultStyle(const wxTextAttr& style); + virtual bool SetDefaultStyle(const wxRichTextAttr& style); + //@} + + /** + Returns the current default style, which can be used to change how subsequently + inserted text is displayed. + */ + virtual const wxRichTextAttr& GetDefaultStyleEx() const; + + //virtual const wxTextAttr& GetDefaultStyle() const; + + //@{ + /** + Sets the list attributes for the given range, passing flags to determine how + the attributes are set. + + Either the style definition or the name of the style definition (in the current + sheet) can be passed. + @a flags is a bit list of the following: + - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable. + - wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from + @a startFrom, otherwise existing attributes are used. + - wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used + as the level for all paragraphs, otherwise the current indentation will be used. + + @see NumberList(), PromoteList(), ClearListStyle(). + */ + virtual bool SetListStyle(const wxRichTextRange& range, wxRichTextListStyleDefinition* def, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + virtual bool SetListStyle(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + //@} + + /** + Clears the list style from the given range, clearing list-related attributes + and applying any named paragraph style associated with each paragraph. + + @a flags is a bit list of the following: + - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable. + + @see SetListStyle(), PromoteList(), NumberList(). + */ + virtual bool ClearListStyle(const wxRichTextRange& range, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + + //@{ + /** + Numbers the paragraphs in the given range. + Pass flags to determine how the attributes are set. + + Either the style definition or the name of the style definition (in the current + sheet) can be passed. + + @a flags is a bit list of the following: + - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable. + - wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from + @a startFrom, otherwise existing attributes are used. + - wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used + as the level for all paragraphs, otherwise the current indentation will be used. + + @see SetListStyle(), PromoteList(), ClearListStyle(). + */ + virtual bool NumberList(const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + virtual bool NumberList(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + //@} + + //@{ + /** + Promotes or demotes the paragraphs in the given range. + A positive @a promoteBy produces a smaller indent, and a negative number + produces a larger indent. Pass flags to determine how the attributes are set. + Either the style definition or the name of the style definition (in the current + sheet) can be passed. + + @a flags is a bit list of the following: + - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable. + - wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from + @a startFrom, otherwise existing attributes are used. + - wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used + as the level for all paragraphs, otherwise the current indentation will be used. + + @see SetListStyle(), @see SetListStyle(), ClearListStyle(). + */ + virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1); + virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1); + //@} + + /** + Sets the properties for the given range, passing flags to determine how the + attributes are set. You can merge properties or replace them. + + The end point of range is specified as the last character position of the span + of text, plus one. So, for example, to set the properties for a character at + position 5, use the range (5,6). + + @a flags may contain a bit list of the following values: + - wxRICHTEXT_SETSPROPERTIES_NONE: no flag. + - wxRICHTEXT_SETPROPERTIES_WITH_UNDO: specifies that this operation should be + undoable. + - wxRICHTEXT_SETPROPERTIES_PARAGRAPHS_ONLY: specifies that the properties should only be + applied to paragraphs, and not the content. + - wxRICHTEXT_SETPROPERTIES_CHARACTERS_ONLY: specifies that the properties should only be + applied to characters, and not the paragraph. + - wxRICHTEXT_SETPROPERTIES_RESET: resets (clears) the existing properties before applying + the new properties. + - wxRICHTEXT_SETPROPERTIES_REMOVE: removes the specified properties. + */ + virtual bool SetProperties(const wxRichTextRange& range, const wxRichTextProperties& properties, int flags = wxRICHTEXT_SETPROPERTIES_WITH_UNDO); + + /** + Deletes the content within the given range. + */ + virtual bool Delete(const wxRichTextRange& range); + + /** + Translates from column and line number to position. + */ + virtual long XYToPosition(long x, long y) const; + + /** + Converts a text position to zero-based column and line numbers. + */ + virtual bool PositionToXY(long pos, long *x, long *y) const; + + /** + Scrolls the buffer so that the given position is in view. + */ + virtual void ShowPosition(long pos); + + //@{ + /** + Finds the character at the given position in pixels. + @a pt is in device coords (not adjusted for the client area origin nor for + scrolling). + */ + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const; + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, + wxTextCoord *col, + wxTextCoord *row) const; + + /** + Finds the container at the given point, which is in screen coordinates. + */ + wxRichTextParagraphLayoutBox* FindContainerAtPoint(const wxPoint pt, long& position, int& hit, wxRichTextObject* hitObj, int flags = 0); + //@} + +#if wxUSE_DRAG_AND_DROP + /** + Does the 'drop' of Drag'n'Drop. + */ + void OnDrop(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), wxDragResult def, wxDataObject* DataObj); +#endif + +// Clipboard operations + + /** + Copies the selected content (if any) to the clipboard. + */ + virtual void Copy(); + + /** + Copies the selected content (if any) to the clipboard and deletes the selection. + This is undoable. + */ + virtual void Cut(); + + /** + Pastes content from the clipboard to the buffer. + */ + virtual void Paste(); + + /** + Deletes the content in the selection, if any. This is undoable. + */ + virtual void DeleteSelection(); + + /** + Returns @true if selected content can be copied to the clipboard. + */ + virtual bool CanCopy() const; + + /** + Returns @true if selected content can be copied to the clipboard and deleted. + */ + virtual bool CanCut() const; + + /** + Returns @true if the clipboard content can be pasted to the buffer. + */ + virtual bool CanPaste() const; + + /** + Returns @true if selected content can be deleted. + */ + virtual bool CanDeleteSelection() const; + + /** + Undoes the command at the top of the command history, if there is one. + */ + virtual void Undo(); + + /** + Redoes the current command. + */ + virtual void Redo(); + + /** + Returns @true if there is a command in the command history that can be undone. + */ + virtual bool CanUndo() const; + + /** + Returns @true if there is a command in the command history that can be redone. + */ + virtual bool CanRedo() const; + + /** + Sets the insertion point and causes the current editing style to be taken from + the new position (unlike wxRichTextCtrl::SetCaretPosition). + */ + virtual void SetInsertionPoint(long pos); + + /** + Sets the insertion point to the end of the text control. + */ + virtual void SetInsertionPointEnd(); + + /** + Returns the current insertion point. + */ + virtual long GetInsertionPoint() const; + + /** + Returns the last position in the buffer. + */ + virtual wxTextPos GetLastPosition() const; + + //@{ + /** + Sets the selection to the given range. + The end point of range is specified as the last character position of the span + of text, plus one. + + So, for example, to set the selection for a character at position 5, use the + range (5,6). + */ + virtual void SetSelection(long from, long to); + void SetSelection(const wxRichTextSelection& sel) { m_selection = sel; } + //@} + + /** + Makes the control editable, or not. + */ + virtual void SetEditable(bool editable); + + /** + Returns @true if there is a selection and the object containing the selection + was the same as the current focus object. + */ + virtual bool HasSelection() const; + + /** + Returns @true if there was a selection, whether or not the current focus object + is the same as the selection's container object. + */ + virtual bool HasUnfocusedSelection() const; + + //@{ + /** + Write a bitmap or image at the current insertion point. + Supply an optional type to use for internal and file storage of the raw data. + */ + virtual bool WriteImage(const wxImage& image, wxBitmapType bitmapType = wxBITMAP_TYPE_PNG, + const wxRichTextAttr& textAttr = wxRichTextAttr()); + + virtual bool WriteImage(const wxBitmap& bitmap, wxBitmapType bitmapType = wxBITMAP_TYPE_PNG, + const wxRichTextAttr& textAttr = wxRichTextAttr()); + //@} + + /** + Loads an image from a file and writes it at the current insertion point. + */ + virtual bool WriteImage(const wxString& filename, wxBitmapType bitmapType, + const wxRichTextAttr& textAttr = wxRichTextAttr()); + + /** + Writes an image block at the current insertion point. + */ + virtual bool WriteImage(const wxRichTextImageBlock& imageBlock, + const wxRichTextAttr& textAttr = wxRichTextAttr()); + + /** + Write a text box at the current insertion point, returning the text box. + You can then call SetFocusObject() to set the focus to the new object. + */ + virtual wxRichTextBox* WriteTextBox(const wxRichTextAttr& textAttr = wxRichTextAttr()); + + /** + Writes a field at the current insertion point. + + @param fieldType + The field type, matching an existing field type definition. + @param properties + Extra data for the field. + @param textAttr + Optional attributes. + + @see wxRichTextField, wxRichTextFieldType, wxRichTextFieldTypeStandard + */ + virtual wxRichTextField* WriteField(const wxString& fieldType, const wxRichTextProperties& properties, + const wxRichTextAttr& textAttr = wxRichTextAttr()); + + /** + Write a table at the current insertion point, returning the table. + You can then call SetFocusObject() to set the focus to the new object. + */ + virtual wxRichTextTable* WriteTable(int rows, int cols, const wxRichTextAttr& tableAttr = wxRichTextAttr(), const wxRichTextAttr& cellAttr = wxRichTextAttr()); + + /** + Inserts a new paragraph at the current insertion point. @see LineBreak(). + */ + virtual bool Newline(); + + /** + Inserts a line break at the current insertion point. + + A line break forces wrapping within a paragraph, and can be introduced by + using this function, by appending the wxChar value @b wxRichTextLineBreakChar + to text content, or by typing Shift-Return. + */ + virtual bool LineBreak(); + + /** + Sets the basic (overall) style. + + This is the style of the whole buffer before further styles are applied, + unlike the default style, which only affects the style currently being + applied (for example, setting the default style to bold will cause + subsequently inserted text to be bold). + */ + virtual void SetBasicStyle(const wxRichTextAttr& style) { GetBuffer().SetBasicStyle(style); } + + /** + Gets the basic (overall) style. + + This is the style of the whole buffer before further styles are applied, + unlike the default style, which only affects the style currently being + applied (for example, setting the default style to bold will cause + subsequently inserted text to be bold). + */ + virtual const wxRichTextAttr& GetBasicStyle() const { return GetBuffer().GetBasicStyle(); } + + /** + Begins applying a style. + */ + virtual bool BeginStyle(const wxRichTextAttr& style) { return GetBuffer().BeginStyle(style); } + + /** + Ends the current style. + */ + virtual bool EndStyle() { return GetBuffer().EndStyle(); } + + /** + Ends application of all styles in the current style stack. + */ + virtual bool EndAllStyles() { return GetBuffer().EndAllStyles(); } + + /** + Begins using bold. + */ + bool BeginBold() { return GetBuffer().BeginBold(); } + + /** + Ends using bold. + */ + bool EndBold() { return GetBuffer().EndBold(); } + + /** + Begins using italic. + */ + bool BeginItalic() { return GetBuffer().BeginItalic(); } + + /** + Ends using italic. + */ + bool EndItalic() { return GetBuffer().EndItalic(); } + + /** + Begins using underlining. + */ + bool BeginUnderline() { return GetBuffer().BeginUnderline(); } + + /** + End applying underlining. + */ + bool EndUnderline() { return GetBuffer().EndUnderline(); } + + /** + Begins using the given point size. + */ + bool BeginFontSize(int pointSize) { return GetBuffer().BeginFontSize(pointSize); } + + /** + Ends using a point size. + */ + bool EndFontSize() { return GetBuffer().EndFontSize(); } + + /** + Begins using this font. + */ + bool BeginFont(const wxFont& font) { return GetBuffer().BeginFont(font); } + + /** + Ends using a font. + */ + bool EndFont() { return GetBuffer().EndFont(); } + + /** + Begins using this colour. + */ + bool BeginTextColour(const wxColour& colour) { return GetBuffer().BeginTextColour(colour); } + + /** + Ends applying a text colour. + */ + bool EndTextColour() { return GetBuffer().EndTextColour(); } + + /** + Begins using alignment. + For alignment values, see wxTextAttr. + */ + bool BeginAlignment(wxTextAttrAlignment alignment) { return GetBuffer().BeginAlignment(alignment); } + + /** + Ends alignment. + */ + bool EndAlignment() { return GetBuffer().EndAlignment(); } + + /** + Begins applying a left indent and subindent in tenths of a millimetre. + The subindent is an offset from the left edge of the paragraph, and is + used for all but the first line in a paragraph. A positive value will + cause the first line to appear to the left of the subsequent lines, and + a negative value will cause the first line to be indented to the right + of the subsequent lines. + + wxRichTextBuffer uses indentation to render a bulleted item. The + content of the paragraph, including the first line, starts at the + @a leftIndent plus the @a leftSubIndent. + + @param leftIndent + The distance between the margin and the bullet. + @param leftSubIndent + The distance between the left edge of the bullet and the left edge + of the actual paragraph. + */ + bool BeginLeftIndent(int leftIndent, int leftSubIndent = 0) { return GetBuffer().BeginLeftIndent(leftIndent, leftSubIndent); } + + /** + Ends left indent. + */ + bool EndLeftIndent() { return GetBuffer().EndLeftIndent(); } + + /** + Begins a right indent, specified in tenths of a millimetre. + */ + bool BeginRightIndent(int rightIndent) { return GetBuffer().BeginRightIndent(rightIndent); } + + /** + Ends right indent. + */ + bool EndRightIndent() { return GetBuffer().EndRightIndent(); } + + /** + Begins paragraph spacing; pass the before-paragraph and after-paragraph spacing + in tenths of a millimetre. + */ + bool BeginParagraphSpacing(int before, int after) { return GetBuffer().BeginParagraphSpacing(before, after); } + + /** + Ends paragraph spacing. + */ + bool EndParagraphSpacing() { return GetBuffer().EndParagraphSpacing(); } + + /** + Begins appling line spacing. @e spacing is a multiple, where 10 means + single-spacing, 15 means 1.5 spacing, and 20 means double spacing. + + The ::wxTextAttrLineSpacing constants are defined for convenience. + */ + bool BeginLineSpacing(int lineSpacing) { return GetBuffer().BeginLineSpacing(lineSpacing); } + + /** + Ends line spacing. + */ + bool EndLineSpacing() { return GetBuffer().EndLineSpacing(); } + + /** + Begins a numbered bullet. + + This call will be needed for each item in the list, and the + application should take care of incrementing the numbering. + + @a bulletNumber is a number, usually starting with 1. + @a leftIndent and @a leftSubIndent are values in tenths of a millimetre. + @a bulletStyle is a bitlist of the ::wxTextAttrBulletStyle values. + + wxRichTextBuffer uses indentation to render a bulleted item. + The left indent is the distance between the margin and the bullet. + The content of the paragraph, including the first line, starts + at leftMargin + leftSubIndent. + So the distance between the left edge of the bullet and the + left of the actual paragraph is leftSubIndent. + */ + bool BeginNumberedBullet(int bulletNumber, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD) + { return GetBuffer().BeginNumberedBullet(bulletNumber, leftIndent, leftSubIndent, bulletStyle); } + + /** + Ends application of a numbered bullet. + */ + bool EndNumberedBullet() { return GetBuffer().EndNumberedBullet(); } + + /** + Begins applying a symbol bullet, using a character from the current font. + See BeginNumberedBullet() for an explanation of how indentation is used + to render the bulleted paragraph. + */ + bool BeginSymbolBullet(const wxString& symbol, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_SYMBOL) + { return GetBuffer().BeginSymbolBullet(symbol, leftIndent, leftSubIndent, bulletStyle); } + + /** + Ends applying a symbol bullet. + */ + bool EndSymbolBullet() { return GetBuffer().EndSymbolBullet(); } + + /** + Begins applying a symbol bullet. + */ + bool BeginStandardBullet(const wxString& bulletName, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_STANDARD) + { return GetBuffer().BeginStandardBullet(bulletName, leftIndent, leftSubIndent, bulletStyle); } + + /** + Begins applying a standard bullet. + */ + bool EndStandardBullet() { return GetBuffer().EndStandardBullet(); } + + /** + Begins using the named character style. + */ + bool BeginCharacterStyle(const wxString& characterStyle) { return GetBuffer().BeginCharacterStyle(characterStyle); } + + /** + Ends application of a named character style. + */ + bool EndCharacterStyle() { return GetBuffer().EndCharacterStyle(); } + + /** + Begins applying the named paragraph style. + */ + bool BeginParagraphStyle(const wxString& paragraphStyle) { return GetBuffer().BeginParagraphStyle(paragraphStyle); } + + /** + Ends application of a named paragraph style. + */ + bool EndParagraphStyle() { return GetBuffer().EndParagraphStyle(); } + + /** + Begins using a specified list style. + Optionally, you can also pass a level and a number. + */ + bool BeginListStyle(const wxString& listStyle, int level = 1, int number = 1) { return GetBuffer().BeginListStyle(listStyle, level, number); } + + /** + Ends using a specified list style. + */ + bool EndListStyle() { return GetBuffer().EndListStyle(); } + + /** + Begins applying wxTEXT_ATTR_URL to the content. + + Pass a URL and optionally, a character style to apply, since it is common + to mark a URL with a familiar style such as blue text with underlining. + */ + bool BeginURL(const wxString& url, const wxString& characterStyle = wxEmptyString) { return GetBuffer().BeginURL(url, characterStyle); } + + /** + Ends applying a URL. + */ + bool EndURL() { return GetBuffer().EndURL(); } + + /** + Sets the default style to the style under the cursor. + */ + bool SetDefaultStyleToCursorStyle(); + + /** + Cancels any selection. + */ + virtual void SelectNone(); + + /** + Selects the word at the given character position. + */ + virtual bool SelectWord(long position); + + /** + Returns the selection range in character positions. -1, -1 means no selection. + + The range is in API convention, i.e. a single character selection is denoted + by (n, n+1) + */ + wxRichTextRange GetSelectionRange() const; + + /** + Sets the selection to the given range. + The end point of range is specified as the last character position of the span + of text, plus one. + + So, for example, to set the selection for a character at position 5, use the + range (5,6). + */ + void SetSelectionRange(const wxRichTextRange& range); + + /** + Returns the selection range in character positions. -2, -2 means no selection + -1, -1 means select everything. + The range is in internal format, i.e. a single character selection is denoted + by (n, n) + */ + wxRichTextRange GetInternalSelectionRange() const { return m_selection.GetRange(); } + + /** + Sets the selection range in character positions. -2, -2 means no selection + -1, -1 means select everything. + The range is in internal format, i.e. a single character selection is denoted + by (n, n) + */ + void SetInternalSelectionRange(const wxRichTextRange& range) { m_selection.Set(range, GetFocusObject()); } + + /** + Adds a new paragraph of text to the end of the buffer. + */ + virtual wxRichTextRange AddParagraph(const wxString& text); + + /** + Adds an image to the control's buffer. + */ + virtual wxRichTextRange AddImage(const wxImage& image); + + /** + Lays out the buffer, which must be done before certain operations, such as + setting the caret position. + This function should not normally be required by the application. + */ + virtual bool LayoutContent(bool onlyVisibleRect = false); + + /** + Move the caret to the given character position. + + Please note that this does not update the current editing style + from the new position; to do that, call wxRichTextCtrl::SetInsertionPoint instead. + */ + virtual bool MoveCaret(long pos, bool showAtLineStart = false, wxRichTextParagraphLayoutBox* container = NULL); + + /** + Moves right. + */ + virtual bool MoveRight(int noPositions = 1, int flags = 0); + + /** + Moves left. + */ + virtual bool MoveLeft(int noPositions = 1, int flags = 0); + + /** + Moves to the start of the paragraph. + */ + virtual bool MoveUp(int noLines = 1, int flags = 0); + + /** + Moves the caret down. + */ + virtual bool MoveDown(int noLines = 1, int flags = 0); + + /** + Moves to the end of the line. + */ + virtual bool MoveToLineEnd(int flags = 0); + + /** + Moves to the start of the line. + */ + virtual bool MoveToLineStart(int flags = 0); + + /** + Moves to the end of the paragraph. + */ + virtual bool MoveToParagraphEnd(int flags = 0); + + /** + Moves to the start of the paragraph. + */ + virtual bool MoveToParagraphStart(int flags = 0); + + /** + Moves to the start of the buffer. + */ + virtual bool MoveHome(int flags = 0); + + /** + Moves to the end of the buffer. + */ + virtual bool MoveEnd(int flags = 0); + + /** + Moves one or more pages up. + */ + virtual bool PageUp(int noPages = 1, int flags = 0); + + /** + Moves one or more pages down. + */ + virtual bool PageDown(int noPages = 1, int flags = 0); + + /** + Moves a number of words to the left. + */ + virtual bool WordLeft(int noPages = 1, int flags = 0); + + /** + Move a nuber of words to the right. + */ + virtual bool WordRight(int noPages = 1, int flags = 0); + + //@{ + /** + Returns the buffer associated with the control. + */ + wxRichTextBuffer& GetBuffer() { return m_buffer; } + const wxRichTextBuffer& GetBuffer() const { return m_buffer; } + //@} + + /** + Starts batching undo history for commands. + */ + virtual bool BeginBatchUndo(const wxString& cmdName) { return m_buffer.BeginBatchUndo(cmdName); } + + /** + Ends batching undo command history. + */ + virtual bool EndBatchUndo() { return m_buffer.EndBatchUndo(); } + + /** + Returns @true if undo commands are being batched. + */ + virtual bool BatchingUndo() const { return m_buffer.BatchingUndo(); } + + /** + Starts suppressing undo history for commands. + */ + virtual bool BeginSuppressUndo() { return m_buffer.BeginSuppressUndo(); } + + /** + Ends suppressing undo command history. + */ + virtual bool EndSuppressUndo() { return m_buffer.EndSuppressUndo(); } + + /** + Returns @true if undo history suppression is on. + */ + virtual bool SuppressingUndo() const { return m_buffer.SuppressingUndo(); } + + /** + Test if this whole range has character attributes of the specified kind. + If any of the attributes are different within the range, the test fails. + + You can use this to implement, for example, bold button updating. + @a style must have flags indicating which attributes are of interest. + */ + virtual bool HasCharacterAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const + { + return GetFocusObject()->HasCharacterAttributes(range.ToInternal(), style); + } + + /** + Test if this whole range has paragraph attributes of the specified kind. + If any of the attributes are different within the range, the test fails. + You can use this to implement, for example, centering button updating. + @a style must have flags indicating which attributes are of interest. + */ + virtual bool HasParagraphAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const + { + return GetFocusObject()->HasParagraphAttributes(range.ToInternal(), style); + } + + /** + Returns @true if all of the selection, or the content at the caret position, is bold. + */ + virtual bool IsSelectionBold(); + + /** + Returns @true if all of the selection, or the content at the caret position, is italic. + */ + virtual bool IsSelectionItalics(); + + /** + Returns @true if all of the selection, or the content at the caret position, is underlined. + */ + virtual bool IsSelectionUnderlined(); + + /** + Returns @true if all of the selection, or the content at the current caret position, has the supplied wxTextAttrEffects flag(s). + */ + virtual bool DoesSelectionHaveTextEffectFlag(int flag); + + /** + Returns @true if all of the selection, or the content at the caret position, is aligned according to the specified flag. + */ + virtual bool IsSelectionAligned(wxTextAttrAlignment alignment); + + /** + Apples bold to the selection or default style (undoable). + */ + virtual bool ApplyBoldToSelection(); + + /** + Applies italic to the selection or default style (undoable). + */ + virtual bool ApplyItalicToSelection(); + + /** + Applies underline to the selection or default style (undoable). + */ + virtual bool ApplyUnderlineToSelection(); + + /** + Applies one or more wxTextAttrEffects flags to the selection (undoable). + If there is no selection, it is applied to the default style. + */ + virtual bool ApplyTextEffectToSelection(int flags); + + /** + Applies the given alignment to the selection or the default style (undoable). + For alignment values, see wxTextAttr. + */ + virtual bool ApplyAlignmentToSelection(wxTextAttrAlignment alignment); + + /** + Applies the style sheet to the buffer, matching paragraph styles in the sheet + against named styles in the buffer. + + This might be useful if the styles have changed. + If @a sheet is @NULL, the sheet set with SetStyleSheet() is used. + Currently this applies paragraph styles only. + */ + virtual bool ApplyStyle(wxRichTextStyleDefinition* def); + + /** + Sets the style sheet associated with the control. + A style sheet allows named character and paragraph styles to be applied. + */ + void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { GetBuffer().SetStyleSheet(styleSheet); } + + /** + Returns the style sheet associated with the control, if any. + A style sheet allows named character and paragraph styles to be applied. + */ + wxRichTextStyleSheet* GetStyleSheet() const { return GetBuffer().GetStyleSheet(); } + + /** + Push the style sheet to top of stack. + */ + bool PushStyleSheet(wxRichTextStyleSheet* styleSheet) { return GetBuffer().PushStyleSheet(styleSheet); } + + /** + Pops the style sheet from top of stack. + */ + wxRichTextStyleSheet* PopStyleSheet() { return GetBuffer().PopStyleSheet(); } + + /** + Applies the style sheet to the buffer, for example if the styles have changed. + */ + bool ApplyStyleSheet(wxRichTextStyleSheet* styleSheet = NULL); + + /** + Shows the given context menu, optionally adding appropriate property-editing commands for the current position in the object hierarchy. + */ + virtual bool ShowContextMenu(wxMenu* menu, const wxPoint& pt, bool addPropertyCommands = true); + + /** + Prepares the context menu, optionally adding appropriate property-editing commands. + Returns the number of property commands added. + */ + virtual int PrepareContextMenu(wxMenu* menu, const wxPoint& pt, bool addPropertyCommands = true); + + /** + Returns @true if we can edit the object's properties via a GUI. + */ + virtual bool CanEditProperties(wxRichTextObject* obj) const { return obj->CanEditProperties(); } + + /** + Edits the object's properties via a GUI. + */ + virtual bool EditProperties(wxRichTextObject* obj, wxWindow* parent) { return obj->EditProperties(parent, & GetBuffer()); } + + /** + Gets the object's properties menu label. + */ + virtual wxString GetPropertiesMenuLabel(wxRichTextObject* obj) { return obj->GetPropertiesMenuLabel(); } + + /** + Prepares the content just before insertion (or after buffer reset). Called by the same function in wxRichTextBuffer. + Currently is only called if undo mode is on. + */ + virtual void PrepareContent(wxRichTextParagraphLayoutBox& WXUNUSED(container)) {} + + /** + Can we delete this range? + Sends an event to the control. + */ + virtual bool CanDeleteRange(wxRichTextParagraphLayoutBox& container, const wxRichTextRange& range) const; + + /** + Can we insert content at this position? + Sends an event to the control. + */ + virtual bool CanInsertContent(wxRichTextParagraphLayoutBox& container, long pos) const; + + /** + Enable or disable the vertical scrollbar. + */ + virtual void EnableVerticalScrollbar(bool enable); + + /** + Returns @true if the vertical scrollbar is enabled. + */ + virtual bool GetVerticalScrollbarEnabled() const { return m_verticalScrollbarEnabled; } + + /** + Sets the scale factor for displaying fonts, for example for more comfortable + editing. + */ + void SetFontScale(double fontScale, bool refresh = false); + + /** + Returns the scale factor for displaying fonts, for example for more comfortable + editing. + */ + double GetFontScale() const { return GetBuffer().GetFontScale(); } + + /** + Sets the scale factor for displaying certain dimensions such as indentation and + inter-paragraph spacing. This can be useful when editing in a small control + where you still want legible text, but a minimum of wasted white space. + */ + void SetDimensionScale(double dimScale, bool refresh = false); + + /** + Returns the scale factor for displaying certain dimensions such as indentation + and inter-paragraph spacing. + */ + double GetDimensionScale() const { return GetBuffer().GetDimensionScale(); } + + /** + Sets an overall scale factor for displaying and editing the content. + */ + void SetScale(double scale, bool refresh = false); + + /** + Returns an overall scale factor for displaying and editing the content. + */ + double GetScale() const { return m_scale; } + + /** + Returns an unscaled point. + */ + wxPoint GetUnscaledPoint(const wxPoint& pt) const; + + /** + Returns a scaled point. + */ + wxPoint GetScaledPoint(const wxPoint& pt) const; + + /** + Returns an unscaled size. + */ + wxSize GetUnscaledSize(const wxSize& sz) const; + + /** + Returns a scaled size. + */ + wxSize GetScaledSize(const wxSize& sz) const; + + /** + Returns an unscaled rectangle. + */ + wxRect GetUnscaledRect(const wxRect& rect) const; + + /** + Returns a scaled rectangle. + */ + wxRect GetScaledRect(const wxRect& rect) const; + + /** + Returns @true if this control can use virtual attributes and virtual text. + The default is @false. + */ + bool GetVirtualAttributesEnabled() const { return m_useVirtualAttributes; } + + /** + Pass @true to let the control use virtual attributes. + The default is @false. + */ + void EnableVirtualAttributes(bool b) { m_useVirtualAttributes = b; } + +// Command handlers + + /** + Sends the event to the control. + */ + void Command(wxCommandEvent& event); + + /** + Loads the first dropped file. + */ + void OnDropFiles(wxDropFilesEvent& event); + + void OnCaptureLost(wxMouseCaptureLostEvent& event); + void OnSysColourChanged(wxSysColourChangedEvent& event); + + /** + Standard handler for the wxID_CUT command. + */ + void OnCut(wxCommandEvent& event); + + /** + Standard handler for the wxID_COPY command. + */ + void OnCopy(wxCommandEvent& event); + + /** + Standard handler for the wxID_PASTE command. + */ + void OnPaste(wxCommandEvent& event); + + /** + Standard handler for the wxID_UNDO command. + */ + void OnUndo(wxCommandEvent& event); + + /** + Standard handler for the wxID_REDO command. + */ + void OnRedo(wxCommandEvent& event); + + /** + Standard handler for the wxID_SELECTALL command. + */ + void OnSelectAll(wxCommandEvent& event); + + /** + Standard handler for property commands. + */ + void OnProperties(wxCommandEvent& event); + + /** + Standard handler for the wxID_CLEAR command. + */ + void OnClear(wxCommandEvent& event); + + /** + Standard update handler for the wxID_CUT command. + */ + void OnUpdateCut(wxUpdateUIEvent& event); + + /** + Standard update handler for the wxID_COPY command. + */ + void OnUpdateCopy(wxUpdateUIEvent& event); + + /** + Standard update handler for the wxID_PASTE command. + */ + void OnUpdatePaste(wxUpdateUIEvent& event); + + /** + Standard update handler for the wxID_UNDO command. + */ + void OnUpdateUndo(wxUpdateUIEvent& event); + + /** + Standard update handler for the wxID_REDO command. + */ + void OnUpdateRedo(wxUpdateUIEvent& event); + + /** + Standard update handler for the wxID_SELECTALL command. + */ + void OnUpdateSelectAll(wxUpdateUIEvent& event); + + /** + Standard update handler for property commands. + */ + + void OnUpdateProperties(wxUpdateUIEvent& event); + + /** + Standard update handler for the wxID_CLEAR command. + */ + void OnUpdateClear(wxUpdateUIEvent& event); + + /** + Shows a standard context menu with undo, redo, cut, copy, paste, clear, and + select all commands. + */ + void OnContextMenu(wxContextMenuEvent& event); + +// Event handlers + + // Painting + void OnPaint(wxPaintEvent& event); + void OnEraseBackground(wxEraseEvent& event); + + // Left-click + void OnLeftClick(wxMouseEvent& event); + + // Left-up + void OnLeftUp(wxMouseEvent& event); + + // Motion + void OnMoveMouse(wxMouseEvent& event); + + // Left-double-click + void OnLeftDClick(wxMouseEvent& event); + + // Middle-click + void OnMiddleClick(wxMouseEvent& event); + + // Right-click + void OnRightClick(wxMouseEvent& event); + + // Key press + void OnChar(wxKeyEvent& event); + + // Sizing + void OnSize(wxSizeEvent& event); + + // Setting/losing focus + void OnSetFocus(wxFocusEvent& event); + void OnKillFocus(wxFocusEvent& event); + + // Idle-time processing + void OnIdle(wxIdleEvent& event); + + // Scrolling + void OnScroll(wxScrollWinEvent& event); + + /** + Sets the font, and also the basic and default attributes + (see wxRichTextCtrl::SetDefaultStyle). + */ + virtual bool SetFont(const wxFont& font); + + /** + A helper function setting up scrollbars, for example after a resize. + */ + virtual void SetupScrollbars(bool atTop = false); + + /** + Helper function implementing keyboard navigation. + */ + virtual bool KeyboardNavigate(int keyCode, int flags); + + /** + Paints the background. + */ + virtual void PaintBackground(wxDC& dc); + + /** + Other user defined painting after everything else (i.e. all text) is painted. + + @since 2.9.1 + */ + virtual void PaintAboveContent(wxDC& WXUNUSED(dc)) {} + +#if wxRICHTEXT_BUFFERED_PAINTING + /** + Recreates the buffer bitmap if necessary. + */ + virtual bool RecreateBuffer(const wxSize& size = wxDefaultSize); +#endif + + // Write text + virtual void DoWriteText(const wxString& value, int flags = 0); + + // Should we inherit colours? + virtual bool ShouldInheritColours() const { return false; } + + /** + Internal function to position the visible caret according to the current caret + position. + */ + virtual void PositionCaret(wxRichTextParagraphLayoutBox* container = NULL); + + /** + Helper function for extending the selection, returning @true if the selection + was changed. Selections are in caret positions. + */ + virtual bool ExtendSelection(long oldPosition, long newPosition, int flags); + + /** + Scrolls @a position into view. This function takes a caret position. + */ + virtual bool ScrollIntoView(long position, int keyCode); + + /** + Refreshes the area affected by a selection change. + */ + bool RefreshForSelectionChange(const wxRichTextSelection& oldSelection, const wxRichTextSelection& newSelection); + + /** + Sets the caret position. + + The caret position is the character position just before the caret. + A value of -1 means the caret is at the start of the buffer. + Please note that this does not update the current editing style + from the new position or cause the actual caret to be refreshed; to do that, + call wxRichTextCtrl::SetInsertionPoint instead. + */ + void SetCaretPosition(long position, bool showAtLineStart = false) ; + + /** + Returns the current caret position. + */ + long GetCaretPosition() const { return m_caretPosition; } + + /** + The adjusted caret position is the character position adjusted to take + into account whether we're at the start of a paragraph, in which case + style information should be taken from the next position, not current one. + */ + long GetAdjustedCaretPosition(long caretPos) const; + + /** + Move the caret one visual step forward: this may mean setting a flag + and keeping the same position if we're going from the end of one line + to the start of the next, which may be the exact same caret position. + */ + void MoveCaretForward(long oldPosition) ; + + /** + Move the caret one visual step forward: this may mean setting a flag + and keeping the same position if we're going from the end of one line + to the start of the next, which may be the exact same caret position. + */ + void MoveCaretBack(long oldPosition) ; + + /** + Returns the caret height and position for the given character position. + If container is null, the current focus object will be used. + + @beginWxPerlOnly + In wxPerl this method is implemented as + GetCaretPositionForIndex(@a position) returning a + 2-element list (ok, rect). + @endWxPerlOnly + */ + bool GetCaretPositionForIndex(long position, wxRect& rect, wxRichTextParagraphLayoutBox* container = NULL); + + /** + Internal helper function returning the line for the visible caret position. + If the caret is shown at the very end of the line, it means the next character + is actually on the following line. + So this function gets the line we're expecting to find if this is the case. + */ + wxRichTextLine* GetVisibleLineForCaretPosition(long caretPosition) const; + + /** + Gets the command processor associated with the control's buffer. + */ + wxCommandProcessor* GetCommandProcessor() const { return GetBuffer().GetCommandProcessor(); } + + /** + Deletes content if there is a selection, e.g. when pressing a key. + Returns the new caret position in @e newPos, or leaves it if there + was no action. This is undoable. + + @beginWxPerlOnly + In wxPerl this method takes no arguments and returns a 2-element + list (ok, newPos). + @endWxPerlOnly + */ + bool DeleteSelectedContent(long* newPos= NULL); + + /** + Transforms logical (unscrolled) position to physical window position. + */ + wxPoint GetPhysicalPoint(const wxPoint& ptLogical) const; + + /** + Transforms physical window position to logical (unscrolled) position. + */ + wxPoint GetLogicalPoint(const wxPoint& ptPhysical) const; + + /** + Helper function for finding the caret position for the next word. + Direction is 1 (forward) or -1 (backwards). + */ + virtual long FindNextWordPosition(int direction = 1) const; + + /** + Returns @true if the given position is visible on the screen. + */ + bool IsPositionVisible(long pos) const; + + /** + Returns the first visible position in the current view. + */ + long GetFirstVisiblePosition() const; + + /** + Returns the caret position since the default formatting was changed. As + soon as this position changes, we no longer reflect the default style + in the UI. A value of -2 means that we should only reflect the style of the + content under the caret. + */ + long GetCaretPositionForDefaultStyle() const { return m_caretPositionForDefaultStyle; } + + /** + Set the caret position for the default style that the user is selecting. + */ + void SetCaretPositionForDefaultStyle(long pos) { m_caretPositionForDefaultStyle = pos; } + + /** + Returns @true if the user has recently set the default style without moving + the caret, and therefore the UI needs to reflect the default style and not + the style at the caret. + + Below is an example of code that uses this function to determine whether the UI + should show that the current style is bold. + + @see SetAndShowDefaultStyle(). + */ + bool IsDefaultStyleShowing() const { return m_caretPositionForDefaultStyle != -2; } + + /** + Sets @a attr as the default style and tells the control that the UI should + reflect this attribute until the user moves the caret. + + @see IsDefaultStyleShowing(). + */ + void SetAndShowDefaultStyle(const wxRichTextAttr& attr) + { + SetDefaultStyle(attr); + SetCaretPositionForDefaultStyle(GetCaretPosition()); + } + + /** + Returns the first visible point in the window. + */ + wxPoint GetFirstVisiblePoint() const; + +#ifdef DOXYGEN + /** + Returns the content of the entire control as a string. + */ + virtual wxString GetValue() const; + + /** + Replaces existing content with the given text. + */ + virtual void SetValue(const wxString& value); + + /** + Call this function to prevent refresh and allow fast updates, and then Thaw() to + refresh the control. + */ + void Freeze(); + + /** + Call this function to end a Freeze and refresh the display. + */ + void Thaw(); + + /** + Returns @true if Freeze has been called without a Thaw. + */ + bool IsFrozen() const; + +#endif + +// Implementation + + /** + Processes the back key. + */ + virtual bool ProcessBackKey(wxKeyEvent& event, int flags); + + /** + Given a character position at which there is a list style, find the range + encompassing the same list style by looking backwards and forwards. + */ + virtual wxRichTextRange FindRangeForList(long pos, bool& isNumberedList); + + /** + Sets up the caret for the given position and container, after a mouse click. + */ + bool SetCaretPositionAfterClick(wxRichTextParagraphLayoutBox* container, long position, int hitTestFlags, bool extendSelection = false); + + /** + Find the caret position for the combination of hit-test flags and character position. + Returns the caret position and also an indication of where to place the caret (caretLineStart) + since this is ambiguous (same position used for end of line and start of next). + */ + long FindCaretPositionForCharacterPosition(long position, int hitTestFlags, wxRichTextParagraphLayoutBox* container, + bool& caretLineStart); + + /** + Processes mouse movement in order to change the cursor + */ + virtual bool ProcessMouseMovement(wxRichTextParagraphLayoutBox* container, wxRichTextObject* obj, long position, const wxPoint& pos); + + /** + Font names take a long time to retrieve, so cache them (on demand). + */ + static const wxArrayString& GetAvailableFontNames(); + + /** + Clears the cache of available font names. + */ + static void ClearAvailableFontNames(); + + WX_FORWARD_TO_SCROLL_HELPER() + + // implement wxTextEntry methods + virtual wxString DoGetValue() const; + +protected: + // implement the wxTextEntry pure virtual method + virtual wxWindow *GetEditableWindow() { return this; } + + // margins functions + virtual bool DoSetMargins(const wxPoint& pt); + virtual wxPoint DoGetMargins() const; + + // FIXME: this does not work, it allows this code to compile but will fail + // during run-time +#ifndef __WXUNIVERSAL__ +#ifdef __WXMSW__ + virtual WXHWND GetEditHWND() const { return GetHWND(); } +#endif +#ifdef __WXMOTIF__ + virtual WXWidget GetTextWidget() const { return NULL; } +#endif +#ifdef __WXGTK20__ + virtual GtkEditable *GetEditable() const { return NULL; } + virtual GtkEntry *GetEntry() const { return NULL; } +#endif +#endif // !__WXUNIVERSAL__ + +// Overrides +protected: + + /** + Currently this simply returns @c wxSize(10, 10). + */ + virtual wxSize DoGetBestSize() const ; + + virtual void DoSetValue(const wxString& value, int flags = 0); + + virtual void DoThaw(); + + +// Data members +protected: +#if wxRICHTEXT_BUFFERED_PAINTING + /// Buffer bitmap + wxBitmap m_bufferBitmap; +#endif + + /// Text buffer + wxRichTextBuffer m_buffer; + + wxMenu* m_contextMenu; + + /// Caret position (1 less than the character position, so -1 is the + /// first caret position). + long m_caretPosition; + + /// Caret position when the default formatting has been changed. As + /// soon as this position changes, we no longer reflect the default style + /// in the UI. + long m_caretPositionForDefaultStyle; + + /// Selection range in character positions. -2, -2 means no selection. + wxRichTextSelection m_selection; + + wxRichTextCtrlSelectionState m_selectionState; + + /// Anchor so we know how to extend the selection + /// It's a caret position since it's between two characters. + long m_selectionAnchor; + + /// Anchor object if selecting multiple container objects, such as grid cells. + wxRichTextObject* m_selectionAnchorObject; + + /// Are we editable? + bool m_editable; + + /// Can we use virtual attributes and virtual text? + bool m_useVirtualAttributes; + + /// Is the vertical scrollbar enabled? + bool m_verticalScrollbarEnabled; + + /// Are we showing the caret position at the start of a line + /// instead of at the end of the previous one? + bool m_caretAtLineStart; + + /// Are we dragging (i.e. extending) a selection? + bool m_dragging; + +#if wxUSE_DRAG_AND_DROP + /// Are we trying to start Drag'n'Drop? + bool m_preDrag; + + /// Initial position when starting Drag'n'Drop + wxPoint m_dragStartPoint; + +#if wxUSE_DATETIME + /// Initial time when starting Drag'n'Drop + wxDateTime m_dragStartTime; +#endif // wxUSE_DATETIME +#endif // wxUSE_DRAG_AND_DROP + + /// Do we need full layout in idle? + bool m_fullLayoutRequired; + wxLongLong m_fullLayoutTime; + long m_fullLayoutSavedPosition; + + /// Threshold for doing delayed layout + long m_delayedLayoutThreshold; + + /// Cursors + wxCursor m_textCursor; + wxCursor m_urlCursor; + + static wxArrayString sm_availableFontNames; + + wxRichTextContextMenuPropertiesInfo m_contextMenuPropertiesInfo; + + /// The object that currently has the editing focus + wxRichTextParagraphLayoutBox* m_focusObject; + + /// An overall scale factor + double m_scale; +}; + +#if wxUSE_DRAG_AND_DROP +class WXDLLIMPEXP_RICHTEXT wxRichTextDropSource : public wxDropSource +{ +public: + wxRichTextDropSource(wxDataObject& data, wxRichTextCtrl* tc) + : wxDropSource(data, tc), m_rtc(tc) {} + +protected: + bool GiveFeedback(wxDragResult effect); + + wxRichTextCtrl* m_rtc; +}; + +class WXDLLIMPEXP_RICHTEXT wxRichTextDropTarget : public wxDropTarget +{ +public: + wxRichTextDropTarget(wxRichTextCtrl* tc) + : wxDropTarget(new wxRichTextBufferDataObject(new wxRichTextBuffer)), m_rtc(tc) {} + + virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def) + { + if ( !GetData() ) + return wxDragNone; + m_rtc->OnDrop(x, y, def, m_dataObject); + return def; + } + +protected: + wxRichTextCtrl* m_rtc; +}; +#endif // wxUSE_DRAG_AND_DROP + +/** + @class wxRichTextEvent + + This is the event class for wxRichTextCtrl notifications. + + @beginEventTable{wxRichTextEvent} + @event{EVT_RICHTEXT_LEFT_CLICK(id, func)} + Process a @c wxEVT_RICHTEXT_LEFT_CLICK event, generated when the user + releases the left mouse button over an object. + @event{EVT_RICHTEXT_RIGHT_CLICK(id, func)} + Process a @c wxEVT_RICHTEXT_RIGHT_CLICK event, generated when the user + releases the right mouse button over an object. + @event{EVT_RICHTEXT_MIDDLE_CLICK(id, func)} + Process a @c wxEVT_RICHTEXT_MIDDLE_CLICK event, generated when the user + releases the middle mouse button over an object. + @event{EVT_RICHTEXT_LEFT_DCLICK(id, func)} + Process a @c wxEVT_RICHTEXT_LEFT_DCLICK event, generated when the user + double-clicks an object. + @event{EVT_RICHTEXT_RETURN(id, func)} + Process a @c wxEVT_RICHTEXT_RETURN event, generated when the user + presses the return key. Valid event functions: GetFlags, GetPosition. + @event{EVT_RICHTEXT_CHARACTER(id, func)} + Process a @c wxEVT_RICHTEXT_CHARACTER event, generated when the user + presses a character key. Valid event functions: GetFlags, GetPosition, GetCharacter. + @event{EVT_RICHTEXT_CONSUMING_CHARACTER(id, func)} + Process a @c wxEVT_RICHTEXT_CONSUMING_CHARACTER event, generated when the user + presses a character key but before it is processed and inserted into the control. + Call Veto to prevent normal processing. Valid event functions: GetFlags, GetPosition, + GetCharacter, Veto. + @event{EVT_RICHTEXT_DELETE(id, func)} + Process a @c wxEVT_RICHTEXT_DELETE event, generated when the user + presses the backspace or delete key. Valid event functions: GetFlags, GetPosition. + @event{EVT_RICHTEXT_STYLE_CHANGED(id, func)} + Process a @c wxEVT_RICHTEXT_STYLE_CHANGED event, generated when + styling has been applied to the control. Valid event functions: GetPosition, GetRange. + @event{EVT_RICHTEXT_STYLESHEET_CHANGED(id, func)} + Process a @c wxEVT_RICHTEXT_STYLESHEET_CHANGING event, generated + when the control's stylesheet has changed, for example the user added, + edited or deleted a style. Valid event functions: GetRange, GetPosition. + @event{EVT_RICHTEXT_STYLESHEET_REPLACING(id, func)} + Process a @c wxEVT_RICHTEXT_STYLESHEET_REPLACING event, generated + when the control's stylesheet is about to be replaced, for example when + a file is loaded into the control. + Valid event functions: Veto, GetOldStyleSheet, GetNewStyleSheet. + @event{EVT_RICHTEXT_STYLESHEET_REPLACED(id, func)} + Process a @c wxEVT_RICHTEXT_STYLESHEET_REPLACED event, generated + when the control's stylesheet has been replaced, for example when a file + is loaded into the control. + Valid event functions: GetOldStyleSheet, GetNewStyleSheet. + @event{EVT_RICHTEXT_PROPERTIES_CHANGED(id, func)} + Process a @c wxEVT_RICHTEXT_PROPERTIES_CHANGED event, generated when + properties have been applied to the control. Valid event functions: GetPosition, GetRange. + @event{EVT_RICHTEXT_CONTENT_INSERTED(id, func)} + Process a @c wxEVT_RICHTEXT_CONTENT_INSERTED event, generated when + content has been inserted into the control. + Valid event functions: GetPosition, GetRange. + @event{EVT_RICHTEXT_CONTENT_DELETED(id, func)} + Process a @c wxEVT_RICHTEXT_CONTENT_DELETED event, generated when + content has been deleted from the control. + Valid event functions: GetPosition, GetRange. + @event{EVT_RICHTEXT_BUFFER_RESET(id, func)} + Process a @c wxEVT_RICHTEXT_BUFFER_RESET event, generated when the + buffer has been reset by deleting all content. + You can use this to set a default style for the first new paragraph. + @event{EVT_RICHTEXT_SELECTION_CHANGED(id, func)} + Process a @c wxEVT_RICHTEXT_SELECTION_CHANGED event, generated when the + selection range has changed. + @event{EVT_RICHTEXT_FOCUS_OBJECT_CHANGED(id, func)} + Process a @c wxEVT_RICHTEXT_FOCUS_OBJECT_CHANGED event, generated when the + current focus object has changed. + @endEventTable + + @library{wxrichtext} + @category{events,richtext} +*/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextEvent : public wxNotifyEvent +{ +public: + /** + Constructor. + + @param commandType + The type of the event. + @param id + Window identifier. The value @c wxID_ANY indicates a default value. + */ + wxRichTextEvent(wxEventType commandType = wxEVT_NULL, int winid = 0) + : wxNotifyEvent(commandType, winid), + m_flags(0), m_position(-1), m_oldStyleSheet(NULL), m_newStyleSheet(NULL), + m_char((wxChar) 0), m_container(NULL), m_oldContainer(NULL) + { } + + /** + Copy constructor. + */ + wxRichTextEvent(const wxRichTextEvent& event) + : wxNotifyEvent(event), + m_flags(event.m_flags), m_position(-1), + m_oldStyleSheet(event.m_oldStyleSheet), m_newStyleSheet(event.m_newStyleSheet), + m_char((wxChar) 0), m_container(event.m_container), m_oldContainer(event.m_oldContainer) + { } + + /** + Returns the buffer position at which the event occured. + */ + long GetPosition() const { return m_position; } + + /** + Sets the buffer position variable. + */ + void SetPosition(long pos) { m_position = pos; } + + /** + Returns flags indicating modifier keys pressed. + + Possible values are @c wxRICHTEXT_CTRL_DOWN, @c wxRICHTEXT_SHIFT_DOWN, and @c wxRICHTEXT_ALT_DOWN. + */ + int GetFlags() const { return m_flags; } + + /** + Sets flags indicating modifier keys pressed. + + Possible values are @c wxRICHTEXT_CTRL_DOWN, @c wxRICHTEXT_SHIFT_DOWN, and @c wxRICHTEXT_ALT_DOWN. + */ + void SetFlags(int flags) { m_flags = flags; } + + /** + Returns the old style sheet. + + Can be used in a @c wxEVT_RICHTEXT_STYLESHEET_CHANGING or + @c wxEVT_RICHTEXT_STYLESHEET_CHANGED event handler. + */ + wxRichTextStyleSheet* GetOldStyleSheet() const { return m_oldStyleSheet; } + + /** + Sets the old style sheet variable. + */ + void SetOldStyleSheet(wxRichTextStyleSheet* sheet) { m_oldStyleSheet = sheet; } + + /** + Returns the new style sheet. + + Can be used in a @c wxEVT_RICHTEXT_STYLESHEET_CHANGING or + @c wxEVT_RICHTEXT_STYLESHEET_CHANGED event handler. + */ + wxRichTextStyleSheet* GetNewStyleSheet() const { return m_newStyleSheet; } + + /** + Sets the new style sheet variable. + */ + void SetNewStyleSheet(wxRichTextStyleSheet* sheet) { m_newStyleSheet = sheet; } + + /** + Gets the range for the current operation. + */ + const wxRichTextRange& GetRange() const { return m_range; } + + /** + Sets the range variable. + */ + void SetRange(const wxRichTextRange& range) { m_range = range; } + + /** + Returns the character pressed, within a @c wxEVT_RICHTEXT_CHARACTER event. + */ + wxChar GetCharacter() const { return m_char; } + + /** + Sets the character variable. + */ + void SetCharacter(wxChar ch) { m_char = ch; } + + /** + Returns the container for which the event is relevant. + */ + wxRichTextParagraphLayoutBox* GetContainer() const { return m_container; } + + /** + Sets the container for which the event is relevant. + */ + void SetContainer(wxRichTextParagraphLayoutBox* container) { m_container = container; } + + /** + Returns the old container, for a focus change event. + */ + wxRichTextParagraphLayoutBox* GetOldContainer() const { return m_oldContainer; } + + /** + Sets the old container, for a focus change event. + */ + void SetOldContainer(wxRichTextParagraphLayoutBox* container) { m_oldContainer = container; } + + virtual wxEvent *Clone() const { return new wxRichTextEvent(*this); } + +protected: + int m_flags; + long m_position; + wxRichTextStyleSheet* m_oldStyleSheet; + wxRichTextStyleSheet* m_newStyleSheet; + wxRichTextRange m_range; + wxChar m_char; + wxRichTextParagraphLayoutBox* m_container; + wxRichTextParagraphLayoutBox* m_oldContainer; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxRichTextEvent) +}; + +/*! + * wxRichTextCtrl events + */ +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_LEFT_CLICK, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_RIGHT_CLICK, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_MIDDLE_CLICK, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_LEFT_DCLICK, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_RETURN, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_CHARACTER, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_CONSUMING_CHARACTER, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_DELETE, wxRichTextEvent ); + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_STYLESHEET_CHANGING, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_STYLESHEET_CHANGED, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_STYLESHEET_REPLACING, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_STYLESHEET_REPLACED, wxRichTextEvent ); + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_CONTENT_INSERTED, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_CONTENT_DELETED, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_STYLE_CHANGED, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_PROPERTIES_CHANGED, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_SELECTION_CHANGED, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_BUFFER_RESET, wxRichTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_RICHTEXT_FOCUS_OBJECT_CHANGED, wxRichTextEvent ); + +typedef void (wxEvtHandler::*wxRichTextEventFunction)(wxRichTextEvent&); + +#define wxRichTextEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxRichTextEventFunction, func) + +#define EVT_RICHTEXT_LEFT_CLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_LEFT_CLICK, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_RIGHT_CLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_RIGHT_CLICK, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_MIDDLE_CLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_MIDDLE_CLICK, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_LEFT_DCLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_LEFT_DCLICK, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_RETURN(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_RETURN, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_CHARACTER(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_CHARACTER, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_CONSUMING_CHARACTER(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_CONSUMING_CHARACTER, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_DELETE(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_DELETE, id, -1, wxRichTextEventHandler( fn ), NULL ), + +#define EVT_RICHTEXT_STYLESHEET_CHANGING(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_STYLESHEET_CHANGING, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_STYLESHEET_CHANGED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_STYLESHEET_CHANGED, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_STYLESHEET_REPLACING(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_STYLESHEET_REPLACING, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_STYLESHEET_REPLACED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_STYLESHEET_REPLACED, id, -1, wxRichTextEventHandler( fn ), NULL ), + +#define EVT_RICHTEXT_CONTENT_INSERTED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_CONTENT_INSERTED, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_CONTENT_DELETED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_CONTENT_DELETED, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_STYLE_CHANGED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_STYLE_CHANGED, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_PROPERTIES_CHANGED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_PROPERTIES_CHANGED, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_SELECTION_CHANGED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_SELECTION_CHANGED, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_BUFFER_RESET(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_BUFFER_RESET, id, -1, wxRichTextEventHandler( fn ), NULL ), +#define EVT_RICHTEXT_FOCUS_OBJECT_CHANGED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_RICHTEXT_FOCUS_OBJECT_CHANGED, id, -1, wxRichTextEventHandler( fn ), NULL ), + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_RICHTEXT_LEFT_CLICK wxEVT_RICHTEXT_LEFT_CLICK +#define wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK wxEVT_RICHTEXT_RIGHT_CLICK +#define wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK wxEVT_RICHTEXT_MIDDLE_CLICK +#define wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK wxEVT_RICHTEXT_LEFT_DCLICK +#define wxEVT_COMMAND_RICHTEXT_RETURN wxEVT_RICHTEXT_RETURN +#define wxEVT_COMMAND_RICHTEXT_CHARACTER wxEVT_RICHTEXT_CHARACTER +#define wxEVT_COMMAND_RICHTEXT_DELETE wxEVT_RICHTEXT_DELETE +#define wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING wxEVT_RICHTEXT_STYLESHEET_CHANGING +#define wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED wxEVT_RICHTEXT_STYLESHEET_CHANGED +#define wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACING wxEVT_RICHTEXT_STYLESHEET_REPLACING +#define wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACED wxEVT_RICHTEXT_STYLESHEET_REPLACED +#define wxEVT_COMMAND_RICHTEXT_CONTENT_INSERTED wxEVT_RICHTEXT_CONTENT_INSERTED +#define wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED wxEVT_RICHTEXT_CONTENT_DELETED +#define wxEVT_COMMAND_RICHTEXT_STYLE_CHANGED wxEVT_RICHTEXT_STYLE_CHANGED +#define wxEVT_COMMAND_RICHTEXT_PROPERTIES_CHANGED wxEVT_RICHTEXT_PROPERTIES_CHANGED +#define wxEVT_COMMAND_RICHTEXT_SELECTION_CHANGED wxEVT_RICHTEXT_SELECTION_CHANGED +#define wxEVT_COMMAND_RICHTEXT_BUFFER_RESET wxEVT_RICHTEXT_BUFFER_RESET +#define wxEVT_COMMAND_RICHTEXT_FOCUS_OBJECT_CHANGED wxEVT_RICHTEXT_FOCUS_OBJECT_CHANGED + +#endif + // wxUSE_RICHTEXT + +#endif + // _WX_RICHTEXTCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextdialogpage.h b/wxmsw/include/wx-3.0/wx/richtext/richtextdialogpage.h new file mode 100644 index 00000000..206fd3e9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextdialogpage.h @@ -0,0 +1,41 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextdialogpage.h +// Purpose: Formatting dialog page base class for wxRTC +// Author: Julian Smart +// Modified by: +// Created: 2010-11-14 +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTDIALOGPAGE_H_ +#define _WX_RICHTEXTDIALOGPAGE_H_ + +#if wxUSE_RICHTEXT + +#include "wx/panel.h" +#include "wx/richtext/richtextuicustomization.h" + +/** + @class wxRichTextDialogPage + The base class for formatting dialog pages. + **/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextDialogPage: public wxPanel +{ +public: + DECLARE_CLASS(wxRichTextDialogPage) + wxRichTextDialogPage() {} + wxRichTextDialogPage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0) + { + Create(parent, id, pos, size, style); + } + + DECLARE_BASE_CLASS_HELP_PROVISION() +}; + +#endif + // wxUSE_RICHTEXT + +#endif + // _WX_RICHTEXTDIALOGPAGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextfontpage.h b/wxmsw/include/wx-3.0/wx/richtext/richtextfontpage.h new file mode 100644 index 00000000..25e8e5e9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextfontpage.h @@ -0,0 +1,195 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextfontpage.h +// Purpose: Font page for wxRichTextFormattingDialog +// Author: Julian Smart +// Modified by: +// Created: 2006-10-02 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTFONTPAGE_H_ +#define _RICHTEXTFONTPAGE_H_ + +/*! + * Includes + */ + +#include "wx/richtext/richtextdialogpage.h" + +////@begin includes +#include "wx/spinbutt.h" +////@end includes + +/*! + * Forward declarations + */ + +////@begin forward declarations +class wxSpinButton; +class wxBoxSizer; +class wxRichTextFontListBox; +class wxRichTextColourSwatchCtrl; +class wxRichTextFontPreviewCtrl; +////@end forward declarations + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTFONTPAGE_STYLE wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTFONTPAGE_TITLE wxEmptyString +#define SYMBOL_WXRICHTEXTFONTPAGE_IDNAME ID_RICHTEXTFONTPAGE +#define SYMBOL_WXRICHTEXTFONTPAGE_SIZE wxSize(200, 100) +#define SYMBOL_WXRICHTEXTFONTPAGE_POSITION wxDefaultPosition +////@end control identifiers + +/*! + * wxRichTextFontPage class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextFontPage: public wxRichTextDialogPage +{ + DECLARE_DYNAMIC_CLASS( wxRichTextFontPage ) + DECLARE_EVENT_TABLE() + DECLARE_HELP_PROVISION() + +public: + /// Constructors + wxRichTextFontPage( ); + wxRichTextFontPage( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTFONTPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTFONTPAGE_SIZE, long style = SYMBOL_WXRICHTEXTFONTPAGE_STYLE ); + + /// Initialise members + void Init(); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTFONTPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTFONTPAGE_SIZE, long style = SYMBOL_WXRICHTEXTFONTPAGE_STYLE ); + + /// Creates the controls and sizers + void CreateControls(); + + /// Transfer data from/to window + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + /// Updates the font preview + void UpdatePreview(); + + void OnFaceListBoxSelected( wxCommandEvent& event ); + void OnColourClicked( wxCommandEvent& event ); + + /// Gets the attributes associated with the main formatting dialog + wxRichTextAttr* GetAttributes(); + +////@begin wxRichTextFontPage event handler declarations + + /// wxEVT_IDLE event handler for ID_RICHTEXTFONTPAGE + void OnIdle( wxIdleEvent& event ); + + /// wxEVT_TEXT event handler for ID_RICHTEXTFONTPAGE_FACETEXTCTRL + void OnFaceTextCtrlUpdated( wxCommandEvent& event ); + + /// wxEVT_TEXT event handler for ID_RICHTEXTFONTPAGE_SIZETEXTCTRL + void OnSizeTextCtrlUpdated( wxCommandEvent& event ); + + /// wxEVT_SCROLL_LINEUP event handler for ID_RICHTEXTFONTPAGE_SPINBUTTONS + void OnRichtextfontpageSpinbuttonsUp( wxSpinEvent& event ); + + /// wxEVT_SCROLL_LINEDOWN event handler for ID_RICHTEXTFONTPAGE_SPINBUTTONS + void OnRichtextfontpageSpinbuttonsDown( wxSpinEvent& event ); + + /// wxEVT_CHOICE event handler for ID_RICHTEXTFONTPAGE_SIZE_UNITS + void OnRichtextfontpageSizeUnitsSelected( wxCommandEvent& event ); + + /// wxEVT_LISTBOX event handler for ID_RICHTEXTFONTPAGE_SIZELISTBOX + void OnSizeListBoxSelected( wxCommandEvent& event ); + + /// wxEVT_COMBOBOX event handler for ID_RICHTEXTFONTPAGE_STYLECTRL + void OnStyleCtrlSelected( wxCommandEvent& event ); + + /// wxEVT_COMBOBOX event handler for ID_RICHTEXTFONTPAGE_WEIGHTCTRL + void OnWeightCtrlSelected( wxCommandEvent& event ); + + /// wxEVT_COMBOBOX event handler for ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL + void OnUnderliningCtrlSelected( wxCommandEvent& event ); + + /// wxEVT_CHECKBOX event handler for ID_RICHTEXTFONTPAGE_STRIKETHROUGHCTRL + void OnStrikethroughctrlClick( wxCommandEvent& event ); + + /// wxEVT_CHECKBOX event handler for ID_RICHTEXTFONTPAGE_CAPSCTRL + void OnCapsctrlClick( wxCommandEvent& event ); + + /// wxEVT_CHECKBOX event handler for ID_RICHTEXTFONTPAGE_SUPERSCRIPT + void OnRichtextfontpageSuperscriptClick( wxCommandEvent& event ); + + /// wxEVT_CHECKBOX event handler for ID_RICHTEXTFONTPAGE_SUBSCRIPT + void OnRichtextfontpageSubscriptClick( wxCommandEvent& event ); + +////@end wxRichTextFontPage event handler declarations + +////@begin wxRichTextFontPage member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextFontPage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextFontPage member variables + wxTextCtrl* m_faceTextCtrl; + wxTextCtrl* m_sizeTextCtrl; + wxSpinButton* m_fontSizeSpinButtons; + wxChoice* m_sizeUnitsCtrl; + wxBoxSizer* m_fontListBoxParent; + wxRichTextFontListBox* m_faceListBox; + wxListBox* m_sizeListBox; + wxComboBox* m_styleCtrl; + wxComboBox* m_weightCtrl; + wxComboBox* m_underliningCtrl; + wxCheckBox* m_textColourLabel; + wxRichTextColourSwatchCtrl* m_colourCtrl; + wxCheckBox* m_bgColourLabel; + wxRichTextColourSwatchCtrl* m_bgColourCtrl; + wxCheckBox* m_strikethroughCtrl; + wxCheckBox* m_capitalsCtrl; + wxCheckBox* m_smallCapitalsCtrl; + wxCheckBox* m_superscriptCtrl; + wxCheckBox* m_subscriptCtrl; + wxRichTextFontPreviewCtrl* m_previewCtrl; + /// Control identifiers + enum { + ID_RICHTEXTFONTPAGE = 10000, + ID_RICHTEXTFONTPAGE_FACETEXTCTRL = 10001, + ID_RICHTEXTFONTPAGE_SIZETEXTCTRL = 10002, + ID_RICHTEXTFONTPAGE_SPINBUTTONS = 10003, + ID_RICHTEXTFONTPAGE_SIZE_UNITS = 10004, + ID_RICHTEXTFONTPAGE_FACELISTBOX = 10005, + ID_RICHTEXTFONTPAGE_SIZELISTBOX = 10006, + ID_RICHTEXTFONTPAGE_STYLECTRL = 10007, + ID_RICHTEXTFONTPAGE_WEIGHTCTRL = 10008, + ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL = 10009, + ID_RICHTEXTFONTPAGE_COLOURCTRL_LABEL = 10010, + ID_RICHTEXTFONTPAGE_COLOURCTRL = 10011, + ID_RICHTEXTFONTPAGE_BGCOLOURCTRL_LABEL = 10012, + ID_RICHTEXTFONTPAGE_BGCOLOURCTRL = 10013, + ID_RICHTEXTFONTPAGE_STRIKETHROUGHCTRL = 10014, + ID_RICHTEXTFONTPAGE_CAPSCTRL = 10015, + ID_RICHTEXTFONTPAGE_SMALLCAPSCTRL = 10016, + ID_RICHTEXTFONTPAGE_SUPERSCRIPT = 10017, + ID_RICHTEXTFONTPAGE_SUBSCRIPT = 10018, + ID_RICHTEXTFONTPAGE_PREVIEWCTRL = 10019 + }; +////@end wxRichTextFontPage member variables + + bool m_dontUpdate; + bool m_colourPresent; + bool m_bgColourPresent; +}; + +#endif + // _RICHTEXTFONTPAGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextformatdlg.h b/wxmsw/include/wx-3.0/wx/richtext/richtextformatdlg.h new file mode 100644 index 00000000..18a91bbc --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextformatdlg.h @@ -0,0 +1,360 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextformatdlg.h +// Purpose: Formatting dialog for wxRichTextCtrl +// Author: Julian Smart +// Modified by: +// Created: 2006-10-01 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTFORMATDLG_H_ +#define _WX_RICHTEXTFORMATDLG_H_ + +/*! + * Includes + */ + +#include "wx/defs.h" + +#if wxUSE_RICHTEXT + +#include "wx/propdlg.h" +#include "wx/bookctrl.h" +#include "wx/withimages.h" + +#if wxUSE_HTML +#include "wx/htmllbox.h" +#endif + +#include "wx/richtext/richtextbuffer.h" +#include "wx/richtext/richtextstyles.h" +#include "wx/richtext/richtextuicustomization.h" + +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextFormattingDialog; +class WXDLLIMPEXP_FWD_CORE wxComboBox; +class WXDLLIMPEXP_FWD_CORE wxCheckBox; + +/*! + * Flags determining the pages and buttons to be created in the dialog + */ + +#define wxRICHTEXT_FORMAT_STYLE_EDITOR 0x0001 +#define wxRICHTEXT_FORMAT_FONT 0x0002 +#define wxRICHTEXT_FORMAT_TABS 0x0004 +#define wxRICHTEXT_FORMAT_BULLETS 0x0008 +#define wxRICHTEXT_FORMAT_INDENTS_SPACING 0x0010 +#define wxRICHTEXT_FORMAT_LIST_STYLE 0x0020 +#define wxRICHTEXT_FORMAT_MARGINS 0x0040 +#define wxRICHTEXT_FORMAT_SIZE 0x0080 +#define wxRICHTEXT_FORMAT_BORDERS 0x0100 +#define wxRICHTEXT_FORMAT_BACKGROUND 0x0200 + +#define wxRICHTEXT_FORMAT_HELP_BUTTON 0x1000 + +/*! + * Indices for bullet styles in list control + */ + +enum { + wxRICHTEXT_BULLETINDEX_NONE = 0, + wxRICHTEXT_BULLETINDEX_ARABIC, + wxRICHTEXT_BULLETINDEX_UPPER_CASE, + wxRICHTEXT_BULLETINDEX_LOWER_CASE, + wxRICHTEXT_BULLETINDEX_UPPER_CASE_ROMAN, + wxRICHTEXT_BULLETINDEX_LOWER_CASE_ROMAN, + wxRICHTEXT_BULLETINDEX_OUTLINE, + wxRICHTEXT_BULLETINDEX_SYMBOL, + wxRICHTEXT_BULLETINDEX_BITMAP, + wxRICHTEXT_BULLETINDEX_STANDARD +}; + +/*! + * Shorthand for common combinations of pages + */ + +#define wxRICHTEXT_FORMAT_PARAGRAPH (wxRICHTEXT_FORMAT_INDENTS_SPACING | wxRICHTEXT_FORMAT_BULLETS | wxRICHTEXT_FORMAT_TABS | wxRICHTEXT_FORMAT_FONT) +#define wxRICHTEXT_FORMAT_CHARACTER (wxRICHTEXT_FORMAT_FONT) +#define wxRICHTEXT_FORMAT_STYLE (wxRICHTEXT_FORMAT_PARAGRAPH | wxRICHTEXT_FORMAT_STYLE_EDITOR) + +/*! + * Factory for formatting dialog + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextFormattingDialogFactory: public wxObject +{ +public: + wxRichTextFormattingDialogFactory() {} + virtual ~wxRichTextFormattingDialogFactory() {} + +// Overridables + + /// Create all pages, under the dialog's book control, also calling AddPage + virtual bool CreatePages(long pages, wxRichTextFormattingDialog* dialog); + + /// Create a page, given a page identifier + virtual wxPanel* CreatePage(int page, wxString& title, wxRichTextFormattingDialog* dialog); + + /// Enumerate all available page identifiers + virtual int GetPageId(int i) const; + + /// Get the number of available page identifiers + virtual int GetPageIdCount() const; + + /// Get the image index for the given page identifier + virtual int GetPageImage(int WXUNUSED(id)) const { return -1; } + + /// Invoke help for the dialog + virtual bool ShowHelp(int page, wxRichTextFormattingDialog* dialog); + + /// Set the sheet style, called at the start of wxRichTextFormattingDialog::Create + virtual bool SetSheetStyle(wxRichTextFormattingDialog* dialog); + + /// Create the main dialog buttons + virtual bool CreateButtons(wxRichTextFormattingDialog* dialog); +}; + +/*! + * Formatting dialog for a wxRichTextCtrl + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextFormattingDialog: public wxPropertySheetDialog, + public wxWithImages +{ +DECLARE_CLASS(wxRichTextFormattingDialog) +DECLARE_HELP_PROVISION() + +public: + enum { Option_AllowPixelFontSize = 0x0001 }; + + wxRichTextFormattingDialog() { Init(); } + + wxRichTextFormattingDialog(long flags, wxWindow* parent, const wxString& title = wxGetTranslation(wxT("Formatting")), wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE) + { + Init(); + Create(flags, parent, title, id, pos, sz, style); + } + + ~wxRichTextFormattingDialog(); + + void Init(); + + bool Create(long flags, wxWindow* parent, const wxString& title = wxGetTranslation(wxT("Formatting")), wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE); + + /// Get attributes from the given range + virtual bool GetStyle(wxRichTextCtrl* ctrl, const wxRichTextRange& range); + + /// Set the attributes and optionally update the display + virtual bool SetStyle(const wxRichTextAttr& style, bool update = true); + + /// Set the style definition and optionally update the display + virtual bool SetStyleDefinition(const wxRichTextStyleDefinition& styleDef, wxRichTextStyleSheet* sheet, bool update = true); + + /// Get the style definition, if any + virtual wxRichTextStyleDefinition* GetStyleDefinition() const { return m_styleDefinition; } + + /// Get the style sheet, if any + virtual wxRichTextStyleSheet* GetStyleSheet() const { return m_styleSheet; } + + /// Update the display + virtual bool UpdateDisplay(); + + /// Apply attributes to the given range + virtual bool ApplyStyle(wxRichTextCtrl* ctrl, const wxRichTextRange& range, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO|wxRICHTEXT_SETSTYLE_OPTIMIZE); + + /// Apply attributes to the object being edited, if any + virtual bool ApplyStyle(wxRichTextCtrl* ctrl, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + + /// Gets and sets the attributes + const wxRichTextAttr& GetAttributes() const { return m_attributes; } + wxRichTextAttr& GetAttributes() { return m_attributes; } + void SetAttributes(const wxRichTextAttr& attr) { m_attributes = attr; } + + /// Sets the dialog options, determining what the interface presents to the user. + /// Currently the only option is Option_AllowPixelFontSize. + void SetOptions(int options) { m_options = options; } + + /// Gets the dialog options, determining what the interface presents to the user. + /// Currently the only option is Option_AllowPixelFontSize. + int GetOptions() const { return m_options; } + + /// Returns @true if the given option is present. + bool HasOption(int option) const { return (m_options & option) != 0; } + + /// If editing the attributes for a particular object, such as an image, + /// set the object so the code can initialize attributes such as size correctly. + wxRichTextObject* GetObject() const { return m_object; } + void SetObject(wxRichTextObject* obj) { m_object = obj; } + + /// Transfers the data and from to the window + virtual bool TransferDataToWindow(); + virtual bool TransferDataFromWindow(); + + /// Apply the styles when a different tab is selected, so the previews are + /// up to date + void OnTabChanged(wxBookCtrlEvent& event); + + /// Respond to help command + void OnHelp(wxCommandEvent& event); + void OnUpdateHelp(wxUpdateUIEvent& event); + + /// Get/set formatting factory object + static void SetFormattingDialogFactory(wxRichTextFormattingDialogFactory* factory); + static wxRichTextFormattingDialogFactory* GetFormattingDialogFactory() { return ms_FormattingDialogFactory; } + + /// Helper for pages to get the top-level dialog + static wxRichTextFormattingDialog* GetDialog(wxWindow* win); + + /// Helper for pages to get the attributes + static wxRichTextAttr* GetDialogAttributes(wxWindow* win); + + /// Helper for pages to get the reset attributes + static wxRichTextAttr* GetDialogResetAttributes(wxWindow* win); + + /// Helper for pages to get the style + static wxRichTextStyleDefinition* GetDialogStyleDefinition(wxWindow* win); + + /// Should we show tooltips? + static bool ShowToolTips() { return sm_showToolTips; } + + /// Determines whether tooltips will be shown + static void SetShowToolTips(bool show) { sm_showToolTips = show; } + + /// Set the dimension into the value and units controls. Optionally pass units to + /// specify the ordering of units in the combobox. + static void SetDimensionValue(wxTextAttrDimension& dim, wxTextCtrl* valueCtrl, wxComboBox* unitsCtrl, wxCheckBox* checkBox, wxArrayInt* units = NULL); + + /// Get the dimension from the value and units controls Optionally pass units to + /// specify the ordering of units in the combobox. + static void GetDimensionValue(wxTextAttrDimension& dim, wxTextCtrl* valueCtrl, wxComboBox* unitsCtrl, wxCheckBox* checkBox, wxArrayInt* units = NULL); + + /// Convert from a string to a dimension integer. + static bool ConvertFromString(const wxString& str, int& ret, int unit); + + /// Map book control page index to our page id + void AddPageId(int id) { m_pageIds.Add(id); } + + /// Find a page by class + wxWindow* FindPage(wxClassInfo* info) const; + +protected: + + wxRichTextAttr m_attributes; + wxRichTextStyleDefinition* m_styleDefinition; + wxRichTextStyleSheet* m_styleSheet; + wxRichTextObject* m_object; + wxArrayInt m_pageIds; // mapping of book control indexes to page ids + int m_options; // UI options + + static wxRichTextFormattingDialogFactory* ms_FormattingDialogFactory; + static bool sm_showToolTips; + +DECLARE_EVENT_TABLE() +}; + +//----------------------------------------------------------------------------- +// helper class - wxRichTextFontPreviewCtrl +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_RICHTEXT wxRichTextFontPreviewCtrl : public wxWindow +{ +public: + wxRichTextFontPreviewCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, long style = 0); + + void SetTextEffects(int effects) { m_textEffects = effects; } + int GetTextEffects() const { return m_textEffects; } + +private: + int m_textEffects; + + void OnPaint(wxPaintEvent& event); + DECLARE_EVENT_TABLE() +}; + +/* + * A control for displaying a small preview of a colour or bitmap + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextColourSwatchCtrl: public wxControl +{ + DECLARE_CLASS(wxRichTextColourSwatchCtrl) +public: + wxRichTextColourSwatchCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0); + ~wxRichTextColourSwatchCtrl(); + + void OnMouseEvent(wxMouseEvent& event); + + void SetColour(const wxColour& colour) { m_colour = colour; SetBackgroundColour(m_colour); } + + wxColour& GetColour() { return m_colour; } + + virtual wxSize DoGetBestSize() const { return GetSize(); } + +protected: + wxColour m_colour; + +DECLARE_EVENT_TABLE() +}; + +/*! + * wxRichTextFontListBox class declaration + * A listbox to display fonts. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextFontListBox: public wxHtmlListBox +{ + DECLARE_CLASS(wxRichTextFontListBox) + DECLARE_EVENT_TABLE() + +public: + wxRichTextFontListBox() + { + Init(); + } + wxRichTextFontListBox(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0); + virtual ~wxRichTextFontListBox(); + + void Init() + { + } + + bool Create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0); + + /// Creates a suitable HTML fragment for a font + wxString CreateHTML(const wxString& facename) const; + + /// Get font name for index + wxString GetFaceName(size_t i) const ; + + /// Set selection for string, returning the index. + int SetFaceNameSelection(const wxString& name); + + /// Updates the font list + void UpdateFonts(); + + /// Does this face name exist? + bool HasFaceName(const wxString& faceName) const { return m_faceNames.Index(faceName) != wxNOT_FOUND; } + + /// Returns the array of face names + const wxArrayString& GetFaceNames() const { return m_faceNames; } + +protected: + /// Returns the HTML for this item + virtual wxString OnGetItem(size_t n) const; + +private: + + wxArrayString m_faceNames; +}; + +#endif + // wxUSE_RICHTEXT + +#endif + // _WX_RICHTEXTFORMATDLG_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtexthtml.h b/wxmsw/include/wx-3.0/wx/richtext/richtexthtml.h new file mode 100644 index 00000000..9761384f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtexthtml.h @@ -0,0 +1,147 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtexthtml.h +// Purpose: HTML I/O for wxRichTextCtrl +// Author: Julian Smart +// Modified by: +// Created: 2005-09-30 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTHTML_H_ +#define _WX_RICHTEXTHTML_H_ + +/*! + * Includes + */ + +#include "wx/richtext/richtextbuffer.h" + +// Use CSS styles where applicable, otherwise use non-CSS workarounds +#define wxRICHTEXT_HANDLER_USE_CSS 0x1000 + +/*! + * wxRichTextHTMLHandler + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextHTMLHandler: public wxRichTextFileHandler +{ + DECLARE_DYNAMIC_CLASS(wxRichTextHTMLHandler) +public: + wxRichTextHTMLHandler(const wxString& name = wxT("HTML"), const wxString& ext = wxT("html"), int type = wxRICHTEXT_TYPE_HTML); + + /// Can we save using this handler? + virtual bool CanSave() const { return true; } + + /// Can we load using this handler? + virtual bool CanLoad() const { return false; } + + /// Can we handle this filename (if using files)? By default, checks the extension. + virtual bool CanHandle(const wxString& filename) const; + +// Accessors and operations unique to this handler + + /// Set and get the list of image locations generated by the last operation + void SetTemporaryImageLocations(const wxArrayString& locations) { m_imageLocations = locations; } + const wxArrayString& GetTemporaryImageLocations() const { return m_imageLocations; } + + /// Clear the image locations generated by the last operation + void ClearTemporaryImageLocations() { m_imageLocations.Clear(); } + + /// Delete the in-memory or temporary files generated by the last operation + bool DeleteTemporaryImages(); + + /// Delete the in-memory or temporary files generated by the last operation. This is a static + /// function that can be used to delete the saved locations from an earlier operation, + /// for example after the user has viewed the HTML file. + static bool DeleteTemporaryImages(int flags, const wxArrayString& imageLocations); + + /// Reset the file counter, in case, for example, the same names are required each time + static void SetFileCounter(int counter) { sm_fileCounter = counter; } + + /// Set and get the directory for storing temporary files. If empty, the system + /// temporary directory will be used. + void SetTempDir(const wxString& tempDir) { m_tempDir = tempDir; } + const wxString& GetTempDir() const { return m_tempDir; } + + /// Set and get mapping from point size to HTML font size. There should be 7 elements, + /// one for each HTML font size, each element specifying the maximum point size for that + /// HTML font size. E.g. 8, 10, 13, 17, 22, 29, 100 + void SetFontSizeMapping(const wxArrayInt& fontSizeMapping) { m_fontSizeMapping = fontSizeMapping; } + wxArrayInt GetFontSizeMapping() const { return m_fontSizeMapping; } + +protected: + +// Implementation + +#if wxUSE_STREAMS + virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream); + virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream); + + /// Output character formatting + void BeginCharacterFormatting(const wxRichTextAttr& currentStyle, const wxRichTextAttr& thisStyle, const wxRichTextAttr& paraStyle, wxTextOutputStream& stream ); + void EndCharacterFormatting(const wxRichTextAttr& currentStyle, const wxRichTextAttr& thisStyle, const wxRichTextAttr& paraStyle, wxTextOutputStream& stream ); + + /// Output paragraph formatting + void BeginParagraphFormatting(const wxRichTextAttr& currentStyle, const wxRichTextAttr& thisStyle, wxTextOutputStream& stream); + void EndParagraphFormatting(const wxRichTextAttr& currentStyle, const wxRichTextAttr& thisStyle, wxTextOutputStream& stream); + + /// Output font tag + void OutputFont(const wxRichTextAttr& style, wxTextOutputStream& stream); + + /// Closes lists to level (-1 means close all) + void CloseLists(int level, wxTextOutputStream& str); + + /// Writes an image to its base64 equivalent, or to the memory filesystem, or to a file + void WriteImage(wxRichTextImage* image, wxOutputStream& stream); + + /// Converts from pt to size property compatible height + long PtToSize(long size); + + /// Typical base64 encoder + wxChar* b64enc(unsigned char* input, size_t in_len); + + /// Gets the mime type of the given wxBITMAP_TYPE + const wxChar* GetMimeType(int imageType); + + /// Gets the html equivalent of the specified value + wxString GetAlignment(const wxRichTextAttr& thisStyle); + + /// Generates   array for indentations + wxString SymbolicIndent(long indent); + + /// Finds the html equivalent of the specified bullet + int TypeOfList(const wxRichTextAttr& thisStyle, wxString& tag); +#endif + +// Data members + + wxRichTextBuffer* m_buffer; + + /// Indentation values of the table tags + wxArrayInt m_indents; + + /// Stack of list types: 0 = ol, 1 = ul + wxArrayInt m_listTypes; + + /// Is there any opened font tag? + bool m_font; + + /// Are we in a table? + bool m_inTable; + + /// A list of the image files or in-memory images created by the last operation. + wxArrayString m_imageLocations; + + /// A location for the temporary files + wxString m_tempDir; + + /// A mapping from point size to HTML font size + wxArrayInt m_fontSizeMapping; + + /// A counter for generating filenames + static int sm_fileCounter; +}; + +#endif + // _WX_RICHTEXTXML_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextimagedlg.h b/wxmsw/include/wx-3.0/wx/richtext/richtextimagedlg.h new file mode 100644 index 00000000..96d67aec --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextimagedlg.h @@ -0,0 +1,94 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextimagedlg.h +// Purpose: +// Author: Mingquan Yang +// Modified by: Julian Smart +// Created: Wed 02 Jun 2010 11:27:23 CST +// RCS-ID: +// Copyright: (c) Mingquan Yang, Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/dialog.h" + +#ifndef _RICHTEXTIMAGEDLG_H_ +#define _RICHTEXTIMAGEDLG_H_ + +/*! + * Forward declarations + */ + +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxComboBox; +class WXDLLIMPEXP_FWD_CORE wxCheckBox; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; + +/*! + * Includes + */ + +#include "wx/richtext/richtextbuffer.h" +#include "wx/richtext/richtextformatdlg.h" + +/*! + * Control identifiers + */ + +#define SYMBOL_WXRICHTEXTOBJECTPROPERTIESDIALOG_STYLE wxDEFAULT_DIALOG_STYLE|wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTOBJECTPROPERTIESDIALOG_TITLE wxGetTranslation("Object Properties") +#define SYMBOL_WXRICHTEXTOBJECTPROPERTIESDIALOG_IDNAME ID_RICHTEXTOBJECTPROPERTIESDIALOG +#define SYMBOL_WXRICHTEXTOBJECTPROPERTIESDIALOG_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTOBJECTPROPERTIESDIALOG_POSITION wxDefaultPosition + +/*! + * wxRichTextObjectPropertiesDialog class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextObjectPropertiesDialog: public wxRichTextFormattingDialog +{ + DECLARE_DYNAMIC_CLASS( wxRichTextObjectPropertiesDialog ) + DECLARE_EVENT_TABLE() + +public: + /// Constructors + wxRichTextObjectPropertiesDialog(); + wxRichTextObjectPropertiesDialog( wxRichTextObject* obj, wxWindow* parent, wxWindowID id = SYMBOL_WXRICHTEXTOBJECTPROPERTIESDIALOG_IDNAME, const wxString& caption = SYMBOL_WXRICHTEXTOBJECTPROPERTIESDIALOG_TITLE, const wxPoint& pos = SYMBOL_WXRICHTEXTOBJECTPROPERTIESDIALOG_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTOBJECTPROPERTIESDIALOG_SIZE, long style = SYMBOL_WXRICHTEXTOBJECTPROPERTIESDIALOG_STYLE ); + + /// Creation + bool Create( wxRichTextObject* obj, wxWindow* parent, wxWindowID id = SYMBOL_WXRICHTEXTOBJECTPROPERTIESDIALOG_IDNAME, const wxString& caption = SYMBOL_WXRICHTEXTOBJECTPROPERTIESDIALOG_TITLE, const wxPoint& pos = SYMBOL_WXRICHTEXTOBJECTPROPERTIESDIALOG_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTOBJECTPROPERTIESDIALOG_SIZE, long style = SYMBOL_WXRICHTEXTOBJECTPROPERTIESDIALOG_STYLE ); + + /// Destructor + ~wxRichTextObjectPropertiesDialog(); + + /// Initialises member variables + void Init(); + + /// Creates the controls and sizers + void CreateControls(); + +////@begin wxRichTextObjectPropertiesDialog event handler declarations + +////@end wxRichTextObjectPropertiesDialog event handler declarations + +////@begin wxRichTextObjectPropertiesDialog member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextObjectPropertiesDialog member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextObjectPropertiesDialog member variables + /// Control identifiers + enum { + ID_RICHTEXTOBJECTPROPERTIESDIALOG = 10650 + }; +////@end wxRichTextObjectPropertiesDialog member variables +}; + +#endif + // _RICHTEXTIMAGEDLG_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextindentspage.h b/wxmsw/include/wx-3.0/wx/richtext/richtextindentspage.h new file mode 100644 index 00000000..8a5f3cb3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextindentspage.h @@ -0,0 +1,169 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextindentspage.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 10/3/2006 2:28:21 PM +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTINDENTSPAGE_H_ +#define _RICHTEXTINDENTSPAGE_H_ + +/*! + * Includes + */ + +#include "wx/richtext/richtextdialogpage.h" + +////@begin includes +#include "wx/statline.h" +////@end includes + +/*! + * Forward declarations + */ + +////@begin forward declarations +class wxRichTextCtrl; +////@end forward declarations + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_STYLE wxRESIZE_BORDER|wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_TITLE wxEmptyString +#define SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_IDNAME ID_RICHTEXTINDENTSSPACINGPAGE +#define SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_POSITION wxDefaultPosition +////@end control identifiers + +/*! + * wxRichTextIndentsSpacingPage class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextIndentsSpacingPage: public wxRichTextDialogPage +{ + DECLARE_DYNAMIC_CLASS( wxRichTextIndentsSpacingPage ) + DECLARE_EVENT_TABLE() + DECLARE_HELP_PROVISION() + +public: + /// Constructors + wxRichTextIndentsSpacingPage( ); + wxRichTextIndentsSpacingPage( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_SIZE, long style = SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_STYLE ); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_SIZE, long style = SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_STYLE ); + + /// Initialise members + void Init(); + + /// Creates the controls and sizers + void CreateControls(); + + /// Transfer data from/to window + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + /// Updates the paragraph preview + void UpdatePreview(); + + /// Gets the attributes associated with the main formatting dialog + wxRichTextAttr* GetAttributes(); + +////@begin wxRichTextIndentsSpacingPage event handler declarations + + /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_LEFT + void OnAlignmentLeftSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_RIGHT + void OnAlignmentRightSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_JUSTIFIED + void OnAlignmentJustifiedSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_CENTRED + void OnAlignmentCentredSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_INDETERMINATE + void OnAlignmentIndeterminateSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_INDENT_LEFT + void OnIndentLeftUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_INDENT_LEFT_FIRST + void OnIndentLeftFirstUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_INDENT_RIGHT + void OnIndentRightUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_OUTLINELEVEL + void OnRichtextOutlinelevelSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_SPACING_BEFORE + void OnSpacingBeforeUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_SPACING_AFTER + void OnSpacingAfterUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_SPACING_LINE + void OnSpacingLineSelected( wxCommandEvent& event ); + +////@end wxRichTextIndentsSpacingPage event handler declarations + +////@begin wxRichTextIndentsSpacingPage member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextIndentsSpacingPage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextIndentsSpacingPage member variables + wxRadioButton* m_alignmentLeft; + wxRadioButton* m_alignmentRight; + wxRadioButton* m_alignmentJustified; + wxRadioButton* m_alignmentCentred; + wxRadioButton* m_alignmentIndeterminate; + wxTextCtrl* m_indentLeft; + wxTextCtrl* m_indentLeftFirst; + wxTextCtrl* m_indentRight; + wxComboBox* m_outlineLevelCtrl; + wxTextCtrl* m_spacingBefore; + wxTextCtrl* m_spacingAfter; + wxComboBox* m_spacingLine; + wxCheckBox* m_pageBreakCtrl; + wxRichTextCtrl* m_previewCtrl; + /// Control identifiers + enum { + ID_RICHTEXTINDENTSSPACINGPAGE = 10100, + ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_LEFT = 10102, + ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_RIGHT = 10110, + ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_JUSTIFIED = 10111, + ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_CENTRED = 10112, + ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_INDETERMINATE = 10101, + ID_RICHTEXTINDENTSSPACINGPAGE_INDENT_LEFT = 10103, + ID_RICHTEXTINDENTSSPACINGPAGE_INDENT_LEFT_FIRST = 10104, + ID_RICHTEXTINDENTSSPACINGPAGE_INDENT_RIGHT = 10113, + ID_RICHTEXTINDENTSSPACINGPAGE_OUTLINELEVEL = 10105, + ID_RICHTEXTINDENTSSPACINGPAGE_SPACING_BEFORE = 10114, + ID_RICHTEXTINDENTSSPACINGPAGE_SPACING_AFTER = 10116, + ID_RICHTEXTINDENTSSPACINGPAGE_SPACING_LINE = 10115, + ID_RICHTEXTINDENTSSPACINGPAGE_PAGEBREAK = 10106, + ID_RICHTEXTINDENTSSPACINGPAGE_PREVIEW_CTRL = 10109 + }; +////@end wxRichTextIndentsSpacingPage member variables + + bool m_dontUpdate; +}; + +#endif + // _RICHTEXTINDENTSPAGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextliststylepage.h b/wxmsw/include/wx-3.0/wx/richtext/richtextliststylepage.h new file mode 100644 index 00000000..c63b7f6d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextliststylepage.h @@ -0,0 +1,278 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextliststylepage.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 10/18/2006 11:36:37 AM +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTLISTSTYLEPAGE_H_ +#define _RICHTEXTLISTSTYLEPAGE_H_ + +/*! + * Includes + */ + +#include "wx/richtext/richtextdialogpage.h" + +////@begin includes +#include "wx/spinctrl.h" +#include "wx/notebook.h" +#include "wx/statline.h" +////@end includes + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTLISTSTYLEPAGE_STYLE wxRESIZE_BORDER|wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTLISTSTYLEPAGE_TITLE wxEmptyString +#define SYMBOL_WXRICHTEXTLISTSTYLEPAGE_IDNAME ID_RICHTEXTLISTSTYLEPAGE +#define SYMBOL_WXRICHTEXTLISTSTYLEPAGE_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTLISTSTYLEPAGE_POSITION wxDefaultPosition +////@end control identifiers + +/*! + * wxRichTextListStylePage class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextListStylePage: public wxRichTextDialogPage +{ + DECLARE_DYNAMIC_CLASS( wxRichTextListStylePage ) + DECLARE_EVENT_TABLE() + DECLARE_HELP_PROVISION() + +public: + /// Constructors + wxRichTextListStylePage( ); + wxRichTextListStylePage( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTLISTSTYLEPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTLISTSTYLEPAGE_SIZE, long style = SYMBOL_WXRICHTEXTLISTSTYLEPAGE_STYLE ); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTLISTSTYLEPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTLISTSTYLEPAGE_SIZE, long style = SYMBOL_WXRICHTEXTLISTSTYLEPAGE_STYLE ); + + /// Initialises member variables + void Init(); + + /// Creates the controls and sizers + void CreateControls(); + + /// Updates the bullets preview + void UpdatePreview(); + + /// Transfer data from/to window + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + /// Get attributes for selected level + wxRichTextAttr* GetAttributesForSelection(); + + /// Update for symbol-related controls + void OnSymbolUpdate( wxUpdateUIEvent& event ); + + /// Update for number-related controls + void OnNumberUpdate( wxUpdateUIEvent& event ); + + /// Update for standard bullet-related controls + void OnStandardBulletUpdate( wxUpdateUIEvent& event ); + + /// Just transfer to the window + void DoTransferDataToWindow(); + + /// Transfer from the window and preview + void TransferAndPreview(); + +////@begin wxRichTextListStylePage event handler declarations + + /// wxEVT_SPINCTRL event handler for ID_RICHTEXTLISTSTYLEPAGE_LEVEL + void OnLevelUpdated( wxSpinEvent& event ); + + /// wxEVT_SCROLL_LINEUP event handler for ID_RICHTEXTLISTSTYLEPAGE_LEVEL + void OnLevelUp( wxSpinEvent& event ); + + /// wxEVT_SCROLL_LINEDOWN event handler for ID_RICHTEXTLISTSTYLEPAGE_LEVEL + void OnLevelDown( wxSpinEvent& event ); + + /// wxEVT_TEXT event handler for ID_RICHTEXTLISTSTYLEPAGE_LEVEL + void OnLevelTextUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_LEVEL + void OnLevelUIUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_BUTTON event handler for ID_RICHTEXTLISTSTYLEPAGE_CHOOSE_FONT + void OnChooseFontClick( wxCommandEvent& event ); + + /// wxEVT_LISTBOX event handler for ID_RICHTEXTLISTSTYLEPAGE_STYLELISTBOX + void OnStylelistboxSelected( wxCommandEvent& event ); + + /// wxEVT_CHECKBOX event handler for ID_RICHTEXTLISTSTYLEPAGE_PERIODCTRL + void OnPeriodctrlClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_PERIODCTRL + void OnPeriodctrlUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_CHECKBOX event handler for ID_RICHTEXTLISTSTYLEPAGE_PARENTHESESCTRL + void OnParenthesesctrlClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_PARENTHESESCTRL + void OnParenthesesctrlUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_CHECKBOX event handler for ID_RICHTEXTLISTSTYLEPAGE_RIGHTPARENTHESISCTRL + void OnRightParenthesisCtrlClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_RIGHTPARENTHESISCTRL + void OnRightParenthesisCtrlUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMBOBOX event handler for ID_RICHTEXTLISTSTYLEPAGE_BULLETALIGNMENTCTRL + void OnBulletAlignmentCtrlSelected( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_SYMBOLSTATIC + void OnSymbolstaticUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMBOBOX event handler for ID_RICHTEXTLISTSTYLEPAGE_SYMBOLCTRL + void OnSymbolctrlSelected( wxCommandEvent& event ); + + /// wxEVT_TEXT event handler for ID_RICHTEXTLISTSTYLEPAGE_SYMBOLCTRL + void OnSymbolctrlUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_SYMBOLCTRL + void OnSymbolctrlUIUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_BUTTON event handler for ID_RICHTEXTLISTSTYLEPAGE_CHOOSE_SYMBOL + void OnChooseSymbolClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_CHOOSE_SYMBOL + void OnChooseSymbolUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMBOBOX event handler for ID_RICHTEXTLISTSTYLEPAGE_SYMBOLFONTCTRL + void OnSymbolfontctrlSelected( wxCommandEvent& event ); + + /// wxEVT_TEXT event handler for ID_RICHTEXTLISTSTYLEPAGE_SYMBOLFONTCTRL + void OnSymbolfontctrlUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_SYMBOLFONTCTRL + void OnSymbolfontctrlUIUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_NAMESTATIC + void OnNamestaticUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMBOBOX event handler for ID_RICHTEXTLISTSTYLEPAGE_NAMECTRL + void OnNamectrlSelected( wxCommandEvent& event ); + + /// wxEVT_TEXT event handler for ID_RICHTEXTLISTSTYLEPAGE_NAMECTRL + void OnNamectrlUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_NAMECTRL + void OnNamectrlUIUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_RADIOBUTTON event handler for ID_RICHTEXTLISTSTYLEPAGE_ALIGNLEFT + void OnRichtextliststylepageAlignleftSelected( wxCommandEvent& event ); + + /// wxEVT_RADIOBUTTON event handler for ID_RICHTEXTLISTSTYLEPAGE_ALIGNRIGHT + void OnRichtextliststylepageAlignrightSelected( wxCommandEvent& event ); + + /// wxEVT_RADIOBUTTON event handler for ID_RICHTEXTLISTSTYLEPAGE_JUSTIFIED + void OnRichtextliststylepageJustifiedSelected( wxCommandEvent& event ); + + /// wxEVT_RADIOBUTTON event handler for ID_RICHTEXTLISTSTYLEPAGE_CENTERED + void OnRichtextliststylepageCenteredSelected( wxCommandEvent& event ); + + /// wxEVT_RADIOBUTTON event handler for ID_RICHTEXTLISTSTYLEPAGE_ALIGNINDETERMINATE + void OnRichtextliststylepageAlignindeterminateSelected( wxCommandEvent& event ); + + /// wxEVT_TEXT event handler for ID_RICHTEXTLISTSTYLEPAGE_INDENTLEFT + void OnIndentLeftUpdated( wxCommandEvent& event ); + + /// wxEVT_TEXT event handler for ID_RICHTEXTLISTSTYLEPAGE_INDENTFIRSTLINE + void OnIndentFirstLineUpdated( wxCommandEvent& event ); + + /// wxEVT_TEXT event handler for ID_RICHTEXTLISTSTYLEPAGE_INDENTRIGHT + void OnIndentRightUpdated( wxCommandEvent& event ); + + /// wxEVT_TEXT event handler for ID_RICHTEXTLISTSTYLEPAGE_SPACINGBEFORE + void OnSpacingBeforeUpdated( wxCommandEvent& event ); + + /// wxEVT_TEXT event handler for ID_RICHTEXTLISTSTYLEPAGE_SPACINGAFTER + void OnSpacingAfterUpdated( wxCommandEvent& event ); + + /// wxEVT_COMBOBOX event handler for ID_RICHTEXTLISTSTYLEPAGE_LINESPACING + void OnLineSpacingSelected( wxCommandEvent& event ); + +////@end wxRichTextListStylePage event handler declarations + +////@begin wxRichTextListStylePage member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextListStylePage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextListStylePage member variables + wxSpinCtrl* m_levelCtrl; + wxListBox* m_styleListBox; + wxCheckBox* m_periodCtrl; + wxCheckBox* m_parenthesesCtrl; + wxCheckBox* m_rightParenthesisCtrl; + wxComboBox* m_bulletAlignmentCtrl; + wxComboBox* m_symbolCtrl; + wxComboBox* m_symbolFontCtrl; + wxComboBox* m_bulletNameCtrl; + wxRadioButton* m_alignmentLeft; + wxRadioButton* m_alignmentRight; + wxRadioButton* m_alignmentJustified; + wxRadioButton* m_alignmentCentred; + wxRadioButton* m_alignmentIndeterminate; + wxTextCtrl* m_indentLeft; + wxTextCtrl* m_indentLeftFirst; + wxTextCtrl* m_indentRight; + wxTextCtrl* m_spacingBefore; + wxTextCtrl* m_spacingAfter; + wxComboBox* m_spacingLine; + wxRichTextCtrl* m_previewCtrl; + /// Control identifiers + enum { + ID_RICHTEXTLISTSTYLEPAGE = 10616, + ID_RICHTEXTLISTSTYLEPAGE_LEVEL = 10617, + ID_RICHTEXTLISTSTYLEPAGE_CHOOSE_FONT = 10604, + ID_RICHTEXTLISTSTYLEPAGE_NOTEBOOK = 10618, + ID_RICHTEXTLISTSTYLEPAGE_BULLETS = 10619, + ID_RICHTEXTLISTSTYLEPAGE_STYLELISTBOX = 10620, + ID_RICHTEXTLISTSTYLEPAGE_PERIODCTRL = 10627, + ID_RICHTEXTLISTSTYLEPAGE_PARENTHESESCTRL = 10626, + ID_RICHTEXTLISTSTYLEPAGE_RIGHTPARENTHESISCTRL = 10602, + ID_RICHTEXTLISTSTYLEPAGE_BULLETALIGNMENTCTRL = 10603, + ID_RICHTEXTLISTSTYLEPAGE_SYMBOLSTATIC = 10621, + ID_RICHTEXTLISTSTYLEPAGE_SYMBOLCTRL = 10622, + ID_RICHTEXTLISTSTYLEPAGE_CHOOSE_SYMBOL = 10623, + ID_RICHTEXTLISTSTYLEPAGE_SYMBOLFONTCTRL = 10625, + ID_RICHTEXTLISTSTYLEPAGE_NAMESTATIC = 10600, + ID_RICHTEXTLISTSTYLEPAGE_NAMECTRL = 10601, + ID_RICHTEXTLISTSTYLEPAGE_SPACING = 10628, + ID_RICHTEXTLISTSTYLEPAGE_ALIGNLEFT = 10629, + ID_RICHTEXTLISTSTYLEPAGE_ALIGNRIGHT = 10630, + ID_RICHTEXTLISTSTYLEPAGE_JUSTIFIED = 10631, + ID_RICHTEXTLISTSTYLEPAGE_CENTERED = 10632, + ID_RICHTEXTLISTSTYLEPAGE_ALIGNINDETERMINATE = 10633, + ID_RICHTEXTLISTSTYLEPAGE_INDENTLEFT = 10634, + ID_RICHTEXTLISTSTYLEPAGE_INDENTFIRSTLINE = 10635, + ID_RICHTEXTLISTSTYLEPAGE_INDENTRIGHT = 10636, + ID_RICHTEXTLISTSTYLEPAGE_SPACINGBEFORE = 10637, + ID_RICHTEXTLISTSTYLEPAGE_SPACINGAFTER = 10638, + ID_RICHTEXTLISTSTYLEPAGE_LINESPACING = 10639, + ID_RICHTEXTLISTSTYLEPAGE_RICHTEXTCTRL = 10640 + }; +////@end wxRichTextListStylePage member variables + + bool m_dontUpdate; + int m_currentLevel; +}; + +#endif + // _RICHTEXTLISTSTYLEPAGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextmarginspage.h b/wxmsw/include/wx-3.0/wx/richtext/richtextmarginspage.h new file mode 100644 index 00000000..336316c2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextmarginspage.h @@ -0,0 +1,179 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextmarginspage.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 20/10/2010 10:27:34 +// RCS-ID: +// Copyright: (c) Julian Smart +// Licence: +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTMARGINSPAGE_H_ +#define _RICHTEXTMARGINSPAGE_H_ + + +/*! + * Includes + */ + +#include "wx/richtext/richtextdialogpage.h" + +////@begin includes +#include "wx/statline.h" +////@end includes + +/*! + * Forward declarations + */ + +////@begin forward declarations +////@end forward declarations + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTMARGINSPAGE_STYLE wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTMARGINSPAGE_TITLE wxEmptyString +#define SYMBOL_WXRICHTEXTMARGINSPAGE_IDNAME ID_WXRICHTEXTMARGINSPAGE +#define SYMBOL_WXRICHTEXTMARGINSPAGE_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTMARGINSPAGE_POSITION wxDefaultPosition +////@end control identifiers + + +/*! + * wxRichTextMarginsPage class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextMarginsPage: public wxRichTextDialogPage +{ + DECLARE_DYNAMIC_CLASS( wxRichTextMarginsPage ) + DECLARE_EVENT_TABLE() + DECLARE_HELP_PROVISION() + +public: + /// Constructors + wxRichTextMarginsPage(); + wxRichTextMarginsPage( wxWindow* parent, wxWindowID id = SYMBOL_WXRICHTEXTMARGINSPAGE_IDNAME, const wxPoint& pos = SYMBOL_WXRICHTEXTMARGINSPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTMARGINSPAGE_SIZE, long style = SYMBOL_WXRICHTEXTMARGINSPAGE_STYLE ); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = SYMBOL_WXRICHTEXTMARGINSPAGE_IDNAME, const wxPoint& pos = SYMBOL_WXRICHTEXTMARGINSPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTMARGINSPAGE_SIZE, long style = SYMBOL_WXRICHTEXTMARGINSPAGE_STYLE ); + + /// Destructor + ~wxRichTextMarginsPage(); + + /// Initialises member variables + void Init(); + + /// Creates the controls and sizers + void CreateControls(); + + /// Gets the attributes from the formatting dialog + wxRichTextAttr* GetAttributes(); + + /// Data transfer + virtual bool TransferDataToWindow(); + virtual bool TransferDataFromWindow(); + +////@begin wxRichTextMarginsPage event handler declarations + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_LEFT_MARGIN + void OnRichtextLeftMarginUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_RIGHT_MARGIN + void OnRichtextRightMarginUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_TOP_MARGIN + void OnRichtextTopMarginUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_BOTTOM_MARGIN + void OnRichtextBottomMarginUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_LEFT_PADDING + void OnRichtextLeftPaddingUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_RIGHT_PADDING + void OnRichtextRightPaddingUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_TOP_PADDING + void OnRichtextTopPaddingUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_BOTTOM_PADDING + void OnRichtextBottomPaddingUpdate( wxUpdateUIEvent& event ); + +////@end wxRichTextMarginsPage event handler declarations + +////@begin wxRichTextMarginsPage member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextMarginsPage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextMarginsPage member variables + wxCheckBox* m_leftMarginCheckbox; + wxTextCtrl* m_marginLeft; + wxComboBox* m_unitsMarginLeft; + wxCheckBox* m_rightMarginCheckbox; + wxTextCtrl* m_marginRight; + wxComboBox* m_unitsMarginRight; + wxCheckBox* m_topMarginCheckbox; + wxTextCtrl* m_marginTop; + wxComboBox* m_unitsMarginTop; + wxCheckBox* m_bottomMarginCheckbox; + wxTextCtrl* m_marginBottom; + wxComboBox* m_unitsMarginBottom; + wxCheckBox* m_leftPaddingCheckbox; + wxTextCtrl* m_paddingLeft; + wxComboBox* m_unitsPaddingLeft; + wxCheckBox* m_rightPaddingCheckbox; + wxTextCtrl* m_paddingRight; + wxComboBox* m_unitsPaddingRight; + wxCheckBox* m_topPaddingCheckbox; + wxTextCtrl* m_paddingTop; + wxComboBox* m_unitsPaddingTop; + wxCheckBox* m_bottomPaddingCheckbox; + wxTextCtrl* m_paddingBottom; + wxComboBox* m_unitsPaddingBottom; + /// Control identifiers + enum { + ID_WXRICHTEXTMARGINSPAGE = 10750, + ID_RICHTEXT_LEFT_MARGIN_CHECKBOX = 10751, + ID_RICHTEXT_LEFT_MARGIN = 10752, + ID_RICHTEXT_LEFT_MARGIN_UNITS = 10753, + ID_RICHTEXT_RIGHT_MARGIN_CHECKBOX = 10754, + ID_RICHTEXT_RIGHT_MARGIN = 10755, + ID_RICHTEXT_RIGHT_MARGIN_UNITS = 10756, + ID_RICHTEXT_TOP_MARGIN_CHECKBOX = 10757, + ID_RICHTEXT_TOP_MARGIN = 10758, + ID_RICHTEXT_TOP_MARGIN_UNITS = 10759, + ID_RICHTEXT_BOTTOM_MARGIN_CHECKBOX = 10760, + ID_RICHTEXT_BOTTOM_MARGIN = 10761, + ID_RICHTEXT_BOTTOM_MARGIN_UNITS = 10762, + ID_RICHTEXT_LEFT_PADDING_CHECKBOX = 10763, + ID_RICHTEXT_LEFT_PADDING = 10764, + ID_RICHTEXT_LEFT_PADDING_UNITS = 10765, + ID_RICHTEXT_RIGHT_PADDING_CHECKBOX = 10766, + ID_RICHTEXT_RIGHT_PADDING = 10767, + ID_RICHTEXT_RIGHT_PADDING_UNITS = 10768, + ID_RICHTEXT_TOP_PADDING_CHECKBOX = 10769, + ID_RICHTEXT_TOP_PADDING = 10770, + ID_RICHTEXT_TOP_PADDING_UNITS = 10771, + ID_RICHTEXT_BOTTOM_PADDING_CHECKBOX = 10772, + ID_RICHTEXT_BOTTOM_PADDING = 10773, + ID_RICHTEXT_BOTTOM_PADDING_UNITS = 10774 + }; +////@end wxRichTextMarginsPage member variables + + bool m_ignoreUpdates; +}; + +#endif + // _RICHTEXTMARGINSPAGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextprint.h b/wxmsw/include/wx-3.0/wx/richtext/richtextprint.h new file mode 100644 index 00000000..5dceccf3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextprint.h @@ -0,0 +1,251 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextprint.h +// Purpose: Rich text printing classes +// Author: Julian Smart +// Created: 2006-10-23 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTPRINT_H_ +#define _WX_RICHTEXTPRINT_H_ + +#include "wx/defs.h" + +#if wxUSE_RICHTEXT & wxUSE_PRINTING_ARCHITECTURE + +#include "wx/richtext/richtextbuffer.h" + +#include "wx/print.h" +#include "wx/printdlg.h" + +#define wxRICHTEXT_PRINT_MAX_PAGES 99999 + +// Header/footer page identifiers +enum wxRichTextOddEvenPage { + wxRICHTEXT_PAGE_ODD, + wxRICHTEXT_PAGE_EVEN, + wxRICHTEXT_PAGE_ALL +}; + +// Header/footer text locations +enum wxRichTextPageLocation { + wxRICHTEXT_PAGE_LEFT, + wxRICHTEXT_PAGE_CENTRE, + wxRICHTEXT_PAGE_RIGHT +}; + +/*! + * Header/footer data + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextHeaderFooterData: public wxObject +{ +public: + wxRichTextHeaderFooterData() { Init(); } + wxRichTextHeaderFooterData(const wxRichTextHeaderFooterData& data): wxObject() { Copy(data); } + + /// Initialise + void Init() { m_headerMargin = 20; m_footerMargin = 20; m_showOnFirstPage = true; } + + /// Copy + void Copy(const wxRichTextHeaderFooterData& data); + + /// Assignment + void operator= (const wxRichTextHeaderFooterData& data) { Copy(data); } + + /// Set/get header text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT + void SetHeaderText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE); + wxString GetHeaderText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const; + + /// Set/get footer text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT + void SetFooterText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE); + wxString GetFooterText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const; + + /// Set/get text + void SetText(const wxString& text, int headerFooter, wxRichTextOddEvenPage page, wxRichTextPageLocation location); + wxString GetText(int headerFooter, wxRichTextOddEvenPage page, wxRichTextPageLocation location) const; + + /// Set/get margins between text and header or footer, in tenths of a millimeter + void SetMargins(int headerMargin, int footerMargin) { m_headerMargin = headerMargin; m_footerMargin = footerMargin; } + int GetHeaderMargin() const { return m_headerMargin; } + int GetFooterMargin() const { return m_footerMargin; } + + /// Set/get whether to show header or footer on first page + void SetShowOnFirstPage(bool showOnFirstPage) { m_showOnFirstPage = showOnFirstPage; } + bool GetShowOnFirstPage() const { return m_showOnFirstPage; } + + /// Clear all text + void Clear(); + + /// Set/get font + void SetFont(const wxFont& font) { m_font = font; } + const wxFont& GetFont() const { return m_font; } + + /// Set/get colour + void SetTextColour(const wxColour& col) { m_colour = col; } + const wxColour& GetTextColour() const { return m_colour; } + + DECLARE_CLASS(wxRichTextHeaderFooterData) + +private: + + // Strings for left, centre, right, top, bottom, odd, even + wxString m_text[12]; + wxFont m_font; + wxColour m_colour; + int m_headerMargin; + int m_footerMargin; + bool m_showOnFirstPage; +}; + +/*! + * wxRichTextPrintout + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextPrintout : public wxPrintout +{ +public: + wxRichTextPrintout(const wxString& title = wxGetTranslation("Printout")); + virtual ~wxRichTextPrintout(); + + /// The buffer to print + void SetRichTextBuffer(wxRichTextBuffer* buffer) { m_richTextBuffer = buffer; } + wxRichTextBuffer* GetRichTextBuffer() const { return m_richTextBuffer; } + + /// Set/get header/footer data + void SetHeaderFooterData(const wxRichTextHeaderFooterData& data) { m_headerFooterData = data; } + const wxRichTextHeaderFooterData& GetHeaderFooterData() const { return m_headerFooterData; } + + /// Sets margins in 10ths of millimetre. Defaults to 1 inch for margins. + void SetMargins(int top = 254, int bottom = 254, int left = 254, int right = 254); + + /// Calculate scaling and rectangles, setting the device context scaling + void CalculateScaling(wxDC* dc, wxRect& textRect, wxRect& headerRect, wxRect& footerRect); + + // wxPrintout virtual functions + virtual bool OnPrintPage(int page); + virtual bool HasPage(int page); + virtual void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo); + virtual bool OnBeginDocument(int startPage, int endPage); + virtual void OnPreparePrinting(); + +private: + + /// Renders one page into dc + void RenderPage(wxDC *dc, int page); + + /// Substitute keywords + static bool SubstituteKeywords(wxString& str, const wxString& title, int pageNum, int pageCount); + +private: + + wxRichTextBuffer* m_richTextBuffer; + int m_numPages; + wxArrayInt m_pageBreaksStart; + wxArrayInt m_pageBreaksEnd; + wxArrayInt m_pageYOffsets; + int m_marginLeft, m_marginTop, m_marginRight, m_marginBottom; + + wxRichTextHeaderFooterData m_headerFooterData; + + wxDECLARE_NO_COPY_CLASS(wxRichTextPrintout); +}; + +/* + *! wxRichTextPrinting + * A simple interface to perform wxRichTextBuffer printing. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextPrinting : public wxObject +{ +public: + wxRichTextPrinting(const wxString& name = wxGetTranslation("Printing"), wxWindow *parentWindow = NULL); + virtual ~wxRichTextPrinting(); + + /// Preview the file or buffer +#if wxUSE_FFILE && wxUSE_STREAMS + bool PreviewFile(const wxString& richTextFile); +#endif + bool PreviewBuffer(const wxRichTextBuffer& buffer); + + /// Print the file or buffer +#if wxUSE_FFILE && wxUSE_STREAMS + bool PrintFile(const wxString& richTextFile, bool showPrintDialog = true); +#endif + bool PrintBuffer(const wxRichTextBuffer& buffer, bool showPrintDialog = true); + + /// Shows page setup dialog + void PageSetup(); + + /// Set/get header/footer data + void SetHeaderFooterData(const wxRichTextHeaderFooterData& data) { m_headerFooterData = data; } + const wxRichTextHeaderFooterData& GetHeaderFooterData() const { return m_headerFooterData; } + + /// Set/get header text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT + void SetHeaderText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE); + wxString GetHeaderText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const; + + /// Set/get footer text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT + void SetFooterText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE); + wxString GetFooterText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const; + + /// Show header/footer on first page, or not + void SetShowOnFirstPage(bool show) { m_headerFooterData.SetShowOnFirstPage(show); } + + /// Set the font + void SetHeaderFooterFont(const wxFont& font) { m_headerFooterData.SetFont(font); } + + /// Set the colour + void SetHeaderFooterTextColour(const wxColour& font) { m_headerFooterData.SetTextColour(font); } + + /// Get print and page setup data + wxPrintData *GetPrintData(); + wxPageSetupDialogData *GetPageSetupData() { return m_pageSetupData; } + + /// Set print and page setup data + void SetPrintData(const wxPrintData& printData); + void SetPageSetupData(const wxPageSetupDialogData& pageSetupData); + + /// Set the rich text buffer pointer, deleting the existing object if present + void SetRichTextBufferPreview(wxRichTextBuffer* buf); + wxRichTextBuffer* GetRichTextBufferPreview() const { return m_richTextBufferPreview; } + + void SetRichTextBufferPrinting(wxRichTextBuffer* buf); + wxRichTextBuffer* GetRichTextBufferPrinting() const { return m_richTextBufferPrinting; } + + /// Set/get the parent window + void SetParentWindow(wxWindow* parent) { m_parentWindow = parent; } + wxWindow* GetParentWindow() const { return m_parentWindow; } + + /// Set/get the title + void SetTitle(const wxString& title) { m_title = title; } + const wxString& GetTitle() const { return m_title; } + + /// Set/get the preview rect + void SetPreviewRect(const wxRect& rect) { m_previewRect = rect; } + const wxRect& GetPreviewRect() const { return m_previewRect; } + +protected: + virtual wxRichTextPrintout *CreatePrintout(); + virtual bool DoPreview(wxRichTextPrintout *printout1, wxRichTextPrintout *printout2); + virtual bool DoPrint(wxRichTextPrintout *printout, bool showPrintDialog); + +private: + wxPrintData* m_printData; + wxPageSetupDialogData* m_pageSetupData; + + wxRichTextHeaderFooterData m_headerFooterData; + wxString m_title; + wxWindow* m_parentWindow; + wxRichTextBuffer* m_richTextBufferPreview; + wxRichTextBuffer* m_richTextBufferPrinting; + wxRect m_previewRect; + + wxDECLARE_NO_COPY_CLASS(wxRichTextPrinting); +}; + +#endif // wxUSE_RICHTEXT & wxUSE_PRINTING_ARCHITECTURE + +#endif // _WX_RICHTEXTPRINT_H_ + diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextsizepage.h b/wxmsw/include/wx-3.0/wx/richtext/richtextsizepage.h new file mode 100644 index 00000000..dfba99fd --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextsizepage.h @@ -0,0 +1,301 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextsizepage.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 20/10/2010 10:23:24 +// RCS-ID: +// Copyright: (c) Julian Smart +// Licence: +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTSIZEPAGE_H_ +#define _RICHTEXTSIZEPAGE_H_ + +/*! + * Includes + */ + +#include "wx/richtext/richtextdialogpage.h" +#include "wx/sizer.h" + +////@begin includes +#include "wx/statline.h" +#include "wx/valgen.h" +////@end includes +#include "wx/stattext.h" + +/*! + * Forward declarations + */ + + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTSIZEPAGE_STYLE wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTSIZEPAGE_TITLE wxEmptyString +#define SYMBOL_WXRICHTEXTSIZEPAGE_IDNAME ID_WXRICHTEXTSIZEPAGE +#define SYMBOL_WXRICHTEXTSIZEPAGE_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTSIZEPAGE_POSITION wxDefaultPosition +////@end control identifiers + + +/*! + * wxRichTextSizePage class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextSizePage: public wxRichTextDialogPage +{ + DECLARE_DYNAMIC_CLASS( wxRichTextSizePage ) + DECLARE_EVENT_TABLE() + DECLARE_HELP_PROVISION() + +public: + /// Constructors + wxRichTextSizePage(); + wxRichTextSizePage( wxWindow* parent, wxWindowID id = SYMBOL_WXRICHTEXTSIZEPAGE_IDNAME, const wxPoint& pos = SYMBOL_WXRICHTEXTSIZEPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTSIZEPAGE_SIZE, long style = SYMBOL_WXRICHTEXTSIZEPAGE_STYLE ); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = SYMBOL_WXRICHTEXTSIZEPAGE_IDNAME, const wxPoint& pos = SYMBOL_WXRICHTEXTSIZEPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTSIZEPAGE_SIZE, long style = SYMBOL_WXRICHTEXTSIZEPAGE_STYLE ); + + /// Destructor + ~wxRichTextSizePage(); + + /// Initialises member variables + void Init(); + + /// Creates the controls and sizers + void CreateControls(); + + /// Gets the attributes from the formatting dialog + wxRichTextAttr* GetAttributes(); + + /// Data transfer + virtual bool TransferDataToWindow(); + virtual bool TransferDataFromWindow(); + + /// Show/hide position controls + static void ShowPositionControls(bool show) { sm_showPositionControls = show; } + + /// Show/hide minimum and maximum size controls + static void ShowMinMaxSizeControls(bool show) { sm_showMinMaxSizeControls = show; } + + /// Show/hide position mode controls + static void ShowPositionModeControls(bool show) { sm_showPositionModeControls = show; } + + /// Show/hide right/bottom position controls + static void ShowRightBottomPositionControls(bool show) { sm_showRightBottomPositionControls = show; } + + /// Show/hide floating and alignment controls + static void ShowFloatingAndAlignmentControls(bool show) { sm_showFloatingAndAlignmentControls = show; } + + /// Show/hide floating controls + static void ShowFloatingControls(bool show) { sm_showFloatingControls = show; } + + /// Show/hide alignment controls + static void ShowAlignmentControls(bool show) { sm_showAlignmentControls = show; } + + /// Enable the position and size units + static void EnablePositionAndSizeUnits(bool enable) { sm_enablePositionAndSizeUnits = enable; } + + /// Enable the checkboxes for position and size + static void EnablePositionAndSizeCheckboxes(bool enable) { sm_enablePositionAndSizeCheckboxes = enable; } + +////@begin wxRichTextSizePage event handler declarations + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_VERTICAL_ALIGNMENT_COMBOBOX + void OnRichtextVerticalAlignmentComboboxUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_WIDTH + void OnRichtextWidthUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_UNITS_W + void OnRichtextWidthUnitsUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_HEIGHT + void OnRichtextHeightUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_UNITS_H + void OnRichtextHeightUnitsUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_MIN_WIDTH + void OnRichtextMinWidthUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_MIN_HEIGHT + void OnRichtextMinHeightUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_MAX_WIDTH + void OnRichtextMaxWidthUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_MAX_HEIGHT + void OnRichtextMaxHeightUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_LEFT + void OnRichtextLeftUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_LEFT_UNITS + void OnRichtextLeftUnitsUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_TOP + void OnRichtextTopUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_TOP_UNITS + void OnRichtextTopUnitsUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_RIGHT + void OnRichtextRightUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_RIGHT_UNITS + void OnRichtextRightUnitsUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_BOTTOM + void OnRichtextBottomUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXT_BOTTOM_UNITS + void OnRichtextBottomUnitsUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXT_PARA_UP + void OnRichtextParaUpClick( wxCommandEvent& event ); + + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXT_PARA_DOWN + void OnRichtextParaDownClick( wxCommandEvent& event ); + +////@end wxRichTextSizePage event handler declarations + +////@begin wxRichTextSizePage member function declarations + + int GetPositionMode() const { return m_positionMode ; } + void SetPositionMode(int value) { m_positionMode = value ; } + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextSizePage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextSizePage member variables + wxBoxSizer* m_parentSizer; + wxBoxSizer* m_floatingAlignmentSizer; + wxBoxSizer* m_floatingSizer; + wxChoice* m_float; + wxBoxSizer* m_alignmentSizer; + wxCheckBox* m_verticalAlignmentCheckbox; + wxChoice* m_verticalAlignmentComboBox; + wxFlexGridSizer* m_sizeSizer; + wxBoxSizer* m_widthSizer; + wxCheckBox* m_widthCheckbox; + wxStaticText* m_widthLabel; + wxTextCtrl* m_width; + wxComboBox* m_unitsW; + wxBoxSizer* m_heightSizer; + wxCheckBox* m_heightCheckbox; + wxStaticText* m_heightLabel; + wxTextCtrl* m_height; + wxComboBox* m_unitsH; + wxCheckBox* m_minWidthCheckbox; + wxBoxSizer* m_minWidthSizer; + wxTextCtrl* m_minWidth; + wxComboBox* m_unitsMinW; + wxCheckBox* m_minHeightCheckbox; + wxBoxSizer* m_minHeightSizer; + wxTextCtrl* m_minHeight; + wxComboBox* m_unitsMinH; + wxCheckBox* m_maxWidthCheckbox; + wxBoxSizer* m_maxWidthSizer; + wxTextCtrl* m_maxWidth; + wxComboBox* m_unitsMaxW; + wxCheckBox* m_maxHeightCheckbox; + wxBoxSizer* m_maxHeightSizer; + wxTextCtrl* m_maxHeight; + wxComboBox* m_unitsMaxH; + wxBoxSizer* m_positionControls; + wxBoxSizer* m_moveObjectParentSizer; + wxBoxSizer* m_positionModeSizer; + wxChoice* m_positionModeCtrl; + wxFlexGridSizer* m_positionGridSizer; + wxBoxSizer* m_leftSizer; + wxCheckBox* m_positionLeftCheckbox; + wxStaticText* m_leftLabel; + wxTextCtrl* m_left; + wxComboBox* m_unitsLeft; + wxBoxSizer* m_topSizer; + wxCheckBox* m_positionTopCheckbox; + wxStaticText* m_topLabel; + wxTextCtrl* m_top; + wxComboBox* m_unitsTop; + wxBoxSizer* m_rightSizer; + wxCheckBox* m_positionRightCheckbox; + wxStaticText* m_rightLabel; + wxBoxSizer* m_rightPositionSizer; + wxTextCtrl* m_right; + wxComboBox* m_unitsRight; + wxBoxSizer* m_bottomSizer; + wxCheckBox* m_positionBottomCheckbox; + wxStaticText* m_bottomLabel; + wxBoxSizer* m_bottomPositionSizer; + wxTextCtrl* m_bottom; + wxComboBox* m_unitsBottom; + wxBoxSizer* m_moveObjectSizer; + int m_positionMode; + /// Control identifiers + enum { + ID_WXRICHTEXTSIZEPAGE = 10700, + ID_RICHTEXT_FLOATING_MODE = 10701, + ID_RICHTEXT_VERTICAL_ALIGNMENT_CHECKBOX = 10708, + ID_RICHTEXT_VERTICAL_ALIGNMENT_COMBOBOX = 10709, + ID_RICHTEXT_WIDTH_CHECKBOX = 10702, + ID_RICHTEXT_WIDTH = 10703, + ID_RICHTEXT_UNITS_W = 10704, + ID_RICHTEXT_HEIGHT_CHECKBOX = 10705, + ID_RICHTEXT_HEIGHT = 10706, + ID_RICHTEXT_UNITS_H = 10707, + ID_RICHTEXT_MIN_WIDTH_CHECKBOX = 10715, + ID_RICHTEXT_MIN_WIDTH = 10716, + ID_RICHTEXT_UNITS_MIN_W = 10717, + ID_RICHTEXT_MIN_HEIGHT_CHECKBOX = 10718, + ID_RICHTEXT_MIN_HEIGHT = 10719, + ID_RICHTEXT_UNITS_MIN_H = 10720, + ID_RICHTEXT_MAX_WIDTH_CHECKBOX = 10721, + ID_RICHTEXT_MAX_WIDTH = 10722, + ID_RICHTEXT_UNITS_MAX_W = 10723, + ID_RICHTEXT_MAX_HEIGHT_CHECKBOX = 10724, + ID_RICHTEXT_MAX_HEIGHT = 10725, + ID_RICHTEXT_UNITS_MAX_H = 10726, + ID_RICHTEXT_POSITION_MODE = 10735, + ID_RICHTEXT_LEFT_CHECKBOX = 10710, + ID_RICHTEXT_LEFT = 10711, + ID_RICHTEXT_LEFT_UNITS = 10712, + ID_RICHTEXT_TOP_CHECKBOX = 10710, + ID_RICHTEXT_TOP = 10728, + ID_RICHTEXT_TOP_UNITS = 10729, + ID_RICHTEXT_RIGHT_CHECKBOX = 10727, + ID_RICHTEXT_RIGHT = 10730, + ID_RICHTEXT_RIGHT_UNITS = 10731, + ID_RICHTEXT_BOTTOM_CHECKBOX = 10732, + ID_RICHTEXT_BOTTOM = 10733, + ID_RICHTEXT_BOTTOM_UNITS = 10734, + ID_RICHTEXT_PARA_UP = 10713, + ID_RICHTEXT_PARA_DOWN = 10714 + }; +////@end wxRichTextSizePage member variables + + static bool sm_showFloatingControls; + static bool sm_showPositionControls; + static bool sm_showMinMaxSizeControls; + static bool sm_showPositionModeControls; + static bool sm_showRightBottomPositionControls; + static bool sm_showAlignmentControls; + static bool sm_showFloatingAndAlignmentControls; + static bool sm_enablePositionAndSizeUnits; + static bool sm_enablePositionAndSizeCheckboxes; +}; + +#endif + // _RICHTEXTSIZEPAGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextstyledlg.h b/wxmsw/include/wx-3.0/wx/richtext/richtextstyledlg.h new file mode 100644 index 00000000..f3d002ba --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextstyledlg.h @@ -0,0 +1,255 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextstyledlg.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 10/5/2006 12:05:31 PM +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTSTYLEDLG_H_ +#define _RICHTEXTSTYLEDLG_H_ + +/*! + * Includes + */ + +#include "wx/richtext/richtextuicustomization.h" + +////@begin includes +////@end includes + +#include "wx/richtext/richtextbuffer.h" +#include "wx/richtext/richtextstyles.h" +#include "wx/richtext/richtextctrl.h" + +/*! + * Forward declarations + */ + +////@begin forward declarations +class wxBoxSizer; +class wxRichTextStyleListCtrl; +class wxRichTextCtrl; +class wxStdDialogButtonSizer; +////@end forward declarations + +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxCheckBox; + +/*! + * Control identifiers + */ + +#define SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_STYLE wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxSYSTEM_MENU|wxCLOSE_BOX +#define SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_TITLE wxGetTranslation("Style Organiser") +#define SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_IDNAME ID_RICHTEXTSTYLEORGANISERDIALOG +#define SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_POSITION wxDefaultPosition + +/*! + * Flags for specifying permitted operations + */ + +#define wxRICHTEXT_ORGANISER_DELETE_STYLES 0x0001 +#define wxRICHTEXT_ORGANISER_CREATE_STYLES 0x0002 +#define wxRICHTEXT_ORGANISER_APPLY_STYLES 0x0004 +#define wxRICHTEXT_ORGANISER_EDIT_STYLES 0x0008 +#define wxRICHTEXT_ORGANISER_RENAME_STYLES 0x0010 +#define wxRICHTEXT_ORGANISER_OK_CANCEL 0x0020 +#define wxRICHTEXT_ORGANISER_RENUMBER 0x0040 + +// The permitted style types to show +#define wxRICHTEXT_ORGANISER_SHOW_CHARACTER 0x0100 +#define wxRICHTEXT_ORGANISER_SHOW_PARAGRAPH 0x0200 +#define wxRICHTEXT_ORGANISER_SHOW_LIST 0x0400 +#define wxRICHTEXT_ORGANISER_SHOW_BOX 0x0800 +#define wxRICHTEXT_ORGANISER_SHOW_ALL 0x1000 + +// Common combinations +#define wxRICHTEXT_ORGANISER_ORGANISE (wxRICHTEXT_ORGANISER_SHOW_ALL|wxRICHTEXT_ORGANISER_DELETE_STYLES|wxRICHTEXT_ORGANISER_CREATE_STYLES|wxRICHTEXT_ORGANISER_APPLY_STYLES|wxRICHTEXT_ORGANISER_EDIT_STYLES|wxRICHTEXT_ORGANISER_RENAME_STYLES) +#define wxRICHTEXT_ORGANISER_BROWSE (wxRICHTEXT_ORGANISER_SHOW_ALL|wxRICHTEXT_ORGANISER_OK_CANCEL) +#define wxRICHTEXT_ORGANISER_BROWSE_NUMBERING (wxRICHTEXT_ORGANISER_SHOW_LIST|wxRICHTEXT_ORGANISER_OK_CANCEL|wxRICHTEXT_ORGANISER_RENUMBER) + +/*! + * wxRichTextStyleOrganiserDialog class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextStyleOrganiserDialog: public wxDialog +{ + DECLARE_DYNAMIC_CLASS( wxRichTextStyleOrganiserDialog ) + DECLARE_EVENT_TABLE() + DECLARE_HELP_PROVISION() + +public: + /// Constructors + wxRichTextStyleOrganiserDialog( ); + wxRichTextStyleOrganiserDialog( int flags, wxRichTextStyleSheet* sheet, wxRichTextCtrl* ctrl, wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& caption = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_TITLE, const wxPoint& pos = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_SIZE, long style = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_STYLE ); + + /// Creation + bool Create( int flags, wxRichTextStyleSheet* sheet, wxRichTextCtrl* ctrl, wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& caption = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_TITLE, const wxPoint& pos = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_SIZE, long style = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_STYLE ); + + /// Creates the controls and sizers + void CreateControls(); + + /// Initialise member variables + void Init(); + + /// Transfer data from/to window + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + /// Set/get style sheet + void SetStyleSheet(wxRichTextStyleSheet* sheet) { m_richTextStyleSheet = sheet; } + wxRichTextStyleSheet* GetStyleSheet() const { return m_richTextStyleSheet; } + + /// Set/get control + void SetRichTextCtrl(wxRichTextCtrl* ctrl) { m_richTextCtrl = ctrl; } + wxRichTextCtrl* GetRichTextCtrl() const { return m_richTextCtrl; } + + /// Set/get flags + void SetFlags(int flags) { m_flags = flags; } + int GetFlags() const { return m_flags; } + + /// Show preview for given or selected preview + void ShowPreview(int sel = -1); + + /// Clears the preview + void ClearPreview(); + + /// List selection + void OnListSelection(wxCommandEvent& event); + + /// Get/set restart numbering boolean + bool GetRestartNumbering() const { return m_restartNumbering; } + void SetRestartNumbering(bool restartNumbering) { m_restartNumbering = restartNumbering; } + + /// Get selected style name or definition + wxString GetSelectedStyle() const; + wxRichTextStyleDefinition* GetSelectedStyleDefinition() const; + + /// Apply the style + bool ApplyStyle(wxRichTextCtrl* ctrl = NULL); + + /// Should we show tooltips? + static bool ShowToolTips() { return sm_showToolTips; } + + /// Determines whether tooltips will be shown + static void SetShowToolTips(bool show) { sm_showToolTips = show; } + +////@begin wxRichTextStyleOrganiserDialog event handler declarations + + /// wxEVT_BUTTON event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_CHAR + void OnNewCharClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_CHAR + void OnNewCharUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_BUTTON event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_PARA + void OnNewParaClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_PARA + void OnNewParaUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_BUTTON event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_LIST + void OnNewListClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_LIST + void OnNewListUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_BUTTON event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_BOX + void OnNewBoxClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_BOX + void OnNewBoxUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_BUTTON event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_APPLY + void OnApplyClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_APPLY + void OnApplyUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_BUTTON event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_RENAME + void OnRenameClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_RENAME + void OnRenameUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_BUTTON event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_EDIT + void OnEditClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_EDIT + void OnEditUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_BUTTON event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_DELETE + void OnDeleteClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_DELETE + void OnDeleteUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_BUTTON event handler for wxID_HELP + void OnHelpClick( wxCommandEvent& event ); + +////@end wxRichTextStyleOrganiserDialog event handler declarations + +////@begin wxRichTextStyleOrganiserDialog member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextStyleOrganiserDialog member function declarations + +////@begin wxRichTextStyleOrganiserDialog member variables + wxBoxSizer* m_innerSizer; + wxBoxSizer* m_buttonSizerParent; + wxRichTextStyleListCtrl* m_stylesListBox; + wxRichTextCtrl* m_previewCtrl; + wxBoxSizer* m_buttonSizer; + wxButton* m_newCharacter; + wxButton* m_newParagraph; + wxButton* m_newList; + wxButton* m_newBox; + wxButton* m_applyStyle; + wxButton* m_renameStyle; + wxButton* m_editStyle; + wxButton* m_deleteStyle; + wxButton* m_closeButton; + wxBoxSizer* m_bottomButtonSizer; + wxCheckBox* m_restartNumberingCtrl; + wxStdDialogButtonSizer* m_stdButtonSizer; + wxButton* m_okButton; + wxButton* m_cancelButton; + /// Control identifiers + enum { + ID_RICHTEXTSTYLEORGANISERDIALOG = 10500, + ID_RICHTEXTSTYLEORGANISERDIALOG_STYLES = 10501, + ID_RICHTEXTSTYLEORGANISERDIALOG_CURRENT_STYLE = 10510, + ID_RICHTEXTSTYLEORGANISERDIALOG_PREVIEW = 10509, + ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_CHAR = 10504, + ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_PARA = 10505, + ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_LIST = 10508, + ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_BOX = 10512, + ID_RICHTEXTSTYLEORGANISERDIALOG_APPLY = 10503, + ID_RICHTEXTSTYLEORGANISERDIALOG_RENAME = 10502, + ID_RICHTEXTSTYLEORGANISERDIALOG_EDIT = 10506, + ID_RICHTEXTSTYLEORGANISERDIALOG_DELETE = 10507, + ID_RICHTEXTSTYLEORGANISERDIALOG_RESTART_NUMBERING = 10511 + }; +////@end wxRichTextStyleOrganiserDialog member variables + +private: + + wxRichTextCtrl* m_richTextCtrl; + wxRichTextStyleSheet* m_richTextStyleSheet; + + bool m_dontUpdate; + int m_flags; + static bool sm_showToolTips; + bool m_restartNumbering; +}; + +#endif + // _RICHTEXTSTYLEDLG_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextstylepage.h b/wxmsw/include/wx-3.0/wx/richtext/richtextstylepage.h new file mode 100644 index 00000000..fe45ba04 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextstylepage.h @@ -0,0 +1,93 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextstylepage.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 10/5/2006 11:34:55 AM +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTSTYLEPAGE_H_ +#define _RICHTEXTSTYLEPAGE_H_ + +#include "wx/richtext/richtextdialogpage.h" + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTSTYLEPAGE_STYLE wxRESIZE_BORDER|wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTSTYLEPAGE_TITLE wxEmptyString +#define SYMBOL_WXRICHTEXTSTYLEPAGE_IDNAME ID_RICHTEXTSTYLEPAGE +#define SYMBOL_WXRICHTEXTSTYLEPAGE_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTSTYLEPAGE_POSITION wxDefaultPosition +////@end control identifiers + +/*! + * wxRichTextStylePage class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextStylePage: public wxRichTextDialogPage +{ + DECLARE_DYNAMIC_CLASS( wxRichTextStylePage ) + DECLARE_EVENT_TABLE() + DECLARE_HELP_PROVISION() + +public: + /// Constructors + wxRichTextStylePage( ); + wxRichTextStylePage( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTSTYLEPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTSTYLEPAGE_SIZE, long style = SYMBOL_WXRICHTEXTSTYLEPAGE_STYLE ); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTSTYLEPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTSTYLEPAGE_SIZE, long style = SYMBOL_WXRICHTEXTSTYLEPAGE_STYLE ); + + /// Initialise members + void Init(); + + /// Creates the controls and sizers + void CreateControls(); + + /// Transfer data from/to window + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + /// Gets the attributes associated with the main formatting dialog + wxRichTextAttr* GetAttributes(); + +////@begin wxRichTextStylePage event handler declarations + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEPAGE_NEXT_STYLE + void OnNextStyleUpdate( wxUpdateUIEvent& event ); + +////@end wxRichTextStylePage event handler declarations + +////@begin wxRichTextStylePage member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextStylePage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextStylePage member variables + wxTextCtrl* m_styleName; + wxComboBox* m_basedOn; + wxComboBox* m_nextStyle; + /// Control identifiers + enum { + ID_RICHTEXTSTYLEPAGE = 10403, + ID_RICHTEXTSTYLEPAGE_STYLE_NAME = 10404, + ID_RICHTEXTSTYLEPAGE_BASED_ON = 10405, + ID_RICHTEXTSTYLEPAGE_NEXT_STYLE = 10406 + }; +////@end wxRichTextStylePage member variables +}; + +#endif + // _RICHTEXTSTYLEPAGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextstyles.h b/wxmsw/include/wx-3.0/wx/richtext/richtextstyles.h new file mode 100644 index 00000000..4293ccf7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextstyles.h @@ -0,0 +1,760 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextstyles.h +// Purpose: Style management for wxRichTextCtrl +// Author: Julian Smart +// Modified by: +// Created: 2005-09-30 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTSTYLES_H_ +#define _WX_RICHTEXTSTYLES_H_ + +/*! + * Includes + */ + +#include "wx/defs.h" + +#if wxUSE_RICHTEXT + +#include "wx/richtext/richtextbuffer.h" + +#if wxUSE_HTML +#include "wx/htmllbox.h" +#endif + +#if wxUSE_COMBOCTRL +#include "wx/combo.h" +#endif + +#include "wx/choice.h" + +/*! + * Forward declarations + */ + +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextCtrl; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextBuffer; + +/*! + * wxRichTextStyleDefinition class declaration + * A base class for paragraph and character styles. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextStyleDefinition: public wxObject +{ + DECLARE_CLASS(wxRichTextStyleDefinition) +public: + + /// Copy constructors + wxRichTextStyleDefinition(const wxRichTextStyleDefinition& def) + : wxObject() + { + Init(); + Copy(def); + } + + /// Default constructor + wxRichTextStyleDefinition(const wxString& name = wxEmptyString) { Init(); m_name = name; } + + /// Destructor + virtual ~wxRichTextStyleDefinition() {} + + /// Initialises members + void Init() {} + + /// Copies from def + void Copy(const wxRichTextStyleDefinition& def); + + /// Equality test + bool Eq(const wxRichTextStyleDefinition& def) const; + + /// Assignment operator + void operator =(const wxRichTextStyleDefinition& def) { Copy(def); } + + /// Equality operator + bool operator ==(const wxRichTextStyleDefinition& def) const { return Eq(def); } + + /// Override to clone the object + virtual wxRichTextStyleDefinition* Clone() const = 0; + + /// Sets and gets the name of the style + void SetName(const wxString& name) { m_name = name; } + const wxString& GetName() const { return m_name; } + + /// Sets and gets the style description + void SetDescription(const wxString& descr) { m_description = descr; } + const wxString& GetDescription() const { return m_description; } + + /// Sets and gets the name of the style that this style is based on + void SetBaseStyle(const wxString& name) { m_baseStyle = name; } + const wxString& GetBaseStyle() const { return m_baseStyle; } + + /// Sets and gets the style + void SetStyle(const wxRichTextAttr& style) { m_style = style; } + const wxRichTextAttr& GetStyle() const { return m_style; } + wxRichTextAttr& GetStyle() { return m_style; } + + /// Gets the style combined with the base style + virtual wxRichTextAttr GetStyleMergedWithBase(const wxRichTextStyleSheet* sheet) const; + + /** + Returns the definition's properties. + */ + wxRichTextProperties& GetProperties() { return m_properties; } + + /** + Returns the definition's properties. + */ + const wxRichTextProperties& GetProperties() const { return m_properties; } + + /** + Sets the definition's properties. + */ + void SetProperties(const wxRichTextProperties& props) { m_properties = props; } + +protected: + wxString m_name; + wxString m_baseStyle; + wxString m_description; + wxRichTextAttr m_style; + wxRichTextProperties m_properties; +}; + +/*! + * wxRichTextCharacterStyleDefinition class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextCharacterStyleDefinition: public wxRichTextStyleDefinition +{ + DECLARE_DYNAMIC_CLASS(wxRichTextCharacterStyleDefinition) +public: + + /// Copy constructor + wxRichTextCharacterStyleDefinition(const wxRichTextCharacterStyleDefinition& def): wxRichTextStyleDefinition(def) {} + + /// Default constructor + wxRichTextCharacterStyleDefinition(const wxString& name = wxEmptyString): + wxRichTextStyleDefinition(name) {} + + /// Destructor + virtual ~wxRichTextCharacterStyleDefinition() {} + + /// Clones the object + virtual wxRichTextStyleDefinition* Clone() const { return new wxRichTextCharacterStyleDefinition(*this); } + +protected: +}; + +/*! + * wxRichTextParagraphStyleDefinition class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextParagraphStyleDefinition: public wxRichTextStyleDefinition +{ + DECLARE_DYNAMIC_CLASS(wxRichTextParagraphStyleDefinition) +public: + + /// Copy constructor + wxRichTextParagraphStyleDefinition(const wxRichTextParagraphStyleDefinition& def): wxRichTextStyleDefinition(def) { m_nextStyle = def.m_nextStyle; } + + /// Default constructor + wxRichTextParagraphStyleDefinition(const wxString& name = wxEmptyString): + wxRichTextStyleDefinition(name) {} + + // Destructor + virtual ~wxRichTextParagraphStyleDefinition() {} + + /// Sets and gets the next style + void SetNextStyle(const wxString& name) { m_nextStyle = name; } + const wxString& GetNextStyle() const { return m_nextStyle; } + + /// Copies from def + void Copy(const wxRichTextParagraphStyleDefinition& def); + + /// Assignment operator + void operator =(const wxRichTextParagraphStyleDefinition& def) { Copy(def); } + + /// Equality operator + bool operator ==(const wxRichTextParagraphStyleDefinition& def) const; + + /// Clones the object + virtual wxRichTextStyleDefinition* Clone() const { return new wxRichTextParagraphStyleDefinition(*this); } + +protected: + + /// The next style to use when adding a paragraph after this style. + wxString m_nextStyle; +}; + +/*! + * wxRichTextListStyleDefinition class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextListStyleDefinition: public wxRichTextParagraphStyleDefinition +{ + DECLARE_DYNAMIC_CLASS(wxRichTextListStyleDefinition) +public: + + /// Copy constructor + wxRichTextListStyleDefinition(const wxRichTextListStyleDefinition& def): wxRichTextParagraphStyleDefinition(def) { Init(); Copy(def); } + + /// Default constructor + wxRichTextListStyleDefinition(const wxString& name = wxEmptyString): + wxRichTextParagraphStyleDefinition(name) { Init(); } + + /// Destructor + virtual ~wxRichTextListStyleDefinition() {} + + /// Copies from def + void Copy(const wxRichTextListStyleDefinition& def); + + /// Assignment operator + void operator =(const wxRichTextListStyleDefinition& def) { Copy(def); } + + /// Equality operator + bool operator ==(const wxRichTextListStyleDefinition& def) const; + + /// Clones the object + virtual wxRichTextStyleDefinition* Clone() const { return new wxRichTextListStyleDefinition(*this); } + + /// Sets/gets the attributes for the given level + void SetLevelAttributes(int i, const wxRichTextAttr& attr); + wxRichTextAttr* GetLevelAttributes(int i); + const wxRichTextAttr* GetLevelAttributes(int i) const; + + /// Convenience function for setting the major attributes for a list level specification + void SetAttributes(int i, int leftIndent, int leftSubIndent, int bulletStyle, const wxString& bulletSymbol = wxEmptyString); + + /// Finds the level corresponding to the given indentation + int FindLevelForIndent(int indent) const; + + /// Combine the base and list style with a paragraph style, using the given indent (from which + /// an appropriate level is found) + wxRichTextAttr CombineWithParagraphStyle(int indent, const wxRichTextAttr& paraStyle, wxRichTextStyleSheet* styleSheet = NULL); + + /// Combine the base and list style, using the given indent (from which + /// an appropriate level is found) + wxRichTextAttr GetCombinedStyle(int indent, wxRichTextStyleSheet* styleSheet = NULL); + + /// Combine the base and list style, using the given level from which + /// an appropriate level is found) + wxRichTextAttr GetCombinedStyleForLevel(int level, wxRichTextStyleSheet* styleSheet = NULL); + + /// Gets the number of available levels + int GetLevelCount() const { return 10; } + + /// Is this a numbered list? + bool IsNumbered(int i) const; + +protected: + + /// The styles for each level (up to 10) + wxRichTextAttr m_levelStyles[10]; +}; + +/*! + * wxRichTextBoxStyleDefinition class declaration, for box attributes in objects such as wxRichTextBox. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextBoxStyleDefinition: public wxRichTextStyleDefinition +{ + DECLARE_DYNAMIC_CLASS(wxRichTextBoxStyleDefinition) +public: + + /// Copy constructor + wxRichTextBoxStyleDefinition(const wxRichTextBoxStyleDefinition& def): wxRichTextStyleDefinition(def) { Copy(def); } + + /// Default constructor + wxRichTextBoxStyleDefinition(const wxString& name = wxEmptyString): + wxRichTextStyleDefinition(name) {} + + // Destructor + virtual ~wxRichTextBoxStyleDefinition() {} + + /// Copies from def + void Copy(const wxRichTextBoxStyleDefinition& def); + + /// Assignment operator + void operator =(const wxRichTextBoxStyleDefinition& def) { Copy(def); } + + /// Equality operator + bool operator ==(const wxRichTextBoxStyleDefinition& def) const; + + /// Clones the object + virtual wxRichTextStyleDefinition* Clone() const { return new wxRichTextBoxStyleDefinition(*this); } + +protected: +}; + +/*! + * The style sheet + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextStyleSheet: public wxObject +{ + DECLARE_CLASS( wxRichTextStyleSheet ) + +public: + /// Constructors + wxRichTextStyleSheet(const wxRichTextStyleSheet& sheet) + : wxObject() + { + Init(); + Copy(sheet); + } + wxRichTextStyleSheet() { Init(); } + virtual ~wxRichTextStyleSheet(); + + /// Initialisation + void Init(); + + /// Copy + void Copy(const wxRichTextStyleSheet& sheet); + + /// Assignment + void operator=(const wxRichTextStyleSheet& sheet) { Copy(sheet); } + + /// Equality + bool operator==(const wxRichTextStyleSheet& sheet) const; + + /// Add a definition to the character style list + bool AddCharacterStyle(wxRichTextCharacterStyleDefinition* def); + + /// Add a definition to the paragraph style list + bool AddParagraphStyle(wxRichTextParagraphStyleDefinition* def); + + /// Add a definition to the list style list + bool AddListStyle(wxRichTextListStyleDefinition* def); + + /// Add a definition to the box style list + bool AddBoxStyle(wxRichTextBoxStyleDefinition* def); + + /// Add a definition to the appropriate style list + bool AddStyle(wxRichTextStyleDefinition* def); + + /// Remove a character style + bool RemoveCharacterStyle(wxRichTextStyleDefinition* def, bool deleteStyle = false) { return RemoveStyle(m_characterStyleDefinitions, def, deleteStyle); } + + /// Remove a paragraph style + bool RemoveParagraphStyle(wxRichTextStyleDefinition* def, bool deleteStyle = false) { return RemoveStyle(m_paragraphStyleDefinitions, def, deleteStyle); } + + /// Remove a list style + bool RemoveListStyle(wxRichTextStyleDefinition* def, bool deleteStyle = false) { return RemoveStyle(m_listStyleDefinitions, def, deleteStyle); } + + /// Remove a box style + bool RemoveBoxStyle(wxRichTextStyleDefinition* def, bool deleteStyle = false) { return RemoveStyle(m_boxStyleDefinitions, def, deleteStyle); } + + /// Remove a style + bool RemoveStyle(wxRichTextStyleDefinition* def, bool deleteStyle = false); + + /// Find a character definition by name + wxRichTextCharacterStyleDefinition* FindCharacterStyle(const wxString& name, bool recurse = true) const { return (wxRichTextCharacterStyleDefinition*) FindStyle(m_characterStyleDefinitions, name, recurse); } + + /// Find a paragraph definition by name + wxRichTextParagraphStyleDefinition* FindParagraphStyle(const wxString& name, bool recurse = true) const { return (wxRichTextParagraphStyleDefinition*) FindStyle(m_paragraphStyleDefinitions, name, recurse); } + + /// Find a list definition by name + wxRichTextListStyleDefinition* FindListStyle(const wxString& name, bool recurse = true) const { return (wxRichTextListStyleDefinition*) FindStyle(m_listStyleDefinitions, name, recurse); } + + /// Find a box definition by name + wxRichTextBoxStyleDefinition* FindBoxStyle(const wxString& name, bool recurse = true) const { return (wxRichTextBoxStyleDefinition*) FindStyle(m_boxStyleDefinitions, name, recurse); } + + /// Find any definition by name + wxRichTextStyleDefinition* FindStyle(const wxString& name, bool recurse = true) const; + + /// Return the number of character styles + size_t GetCharacterStyleCount() const { return m_characterStyleDefinitions.GetCount(); } + + /// Return the number of paragraph styles + size_t GetParagraphStyleCount() const { return m_paragraphStyleDefinitions.GetCount(); } + + /// Return the number of list styles + size_t GetListStyleCount() const { return m_listStyleDefinitions.GetCount(); } + + /// Return the number of box styles + size_t GetBoxStyleCount() const { return m_boxStyleDefinitions.GetCount(); } + + /// Return the nth character style + wxRichTextCharacterStyleDefinition* GetCharacterStyle(size_t n) const { return (wxRichTextCharacterStyleDefinition*) m_characterStyleDefinitions.Item(n)->GetData(); } + + /// Return the nth paragraph style + wxRichTextParagraphStyleDefinition* GetParagraphStyle(size_t n) const { return (wxRichTextParagraphStyleDefinition*) m_paragraphStyleDefinitions.Item(n)->GetData(); } + + /// Return the nth list style + wxRichTextListStyleDefinition* GetListStyle(size_t n) const { return (wxRichTextListStyleDefinition*) m_listStyleDefinitions.Item(n)->GetData(); } + + /// Return the nth box style + wxRichTextBoxStyleDefinition* GetBoxStyle(size_t n) const { return (wxRichTextBoxStyleDefinition*) m_boxStyleDefinitions.Item(n)->GetData(); } + + /// Delete all styles + void DeleteStyles(); + + /// Insert into list of style sheets + bool InsertSheet(wxRichTextStyleSheet* before); + + /// Append to list of style sheets + bool AppendSheet(wxRichTextStyleSheet* after); + + /// Unlink from the list of style sheets + void Unlink(); + + /// Get/set next sheet + wxRichTextStyleSheet* GetNextSheet() const { return m_nextSheet; } + void SetNextSheet(wxRichTextStyleSheet* sheet) { m_nextSheet = sheet; } + + /// Get/set previous sheet + wxRichTextStyleSheet* GetPreviousSheet() const { return m_previousSheet; } + void SetPreviousSheet(wxRichTextStyleSheet* sheet) { m_previousSheet = sheet; } + + /// Sets and gets the name of the style sheet + void SetName(const wxString& name) { m_name = name; } + const wxString& GetName() const { return m_name; } + + /// Sets and gets the style description + void SetDescription(const wxString& descr) { m_description = descr; } + const wxString& GetDescription() const { return m_description; } + + /** + Returns the sheet's properties. + */ + wxRichTextProperties& GetProperties() { return m_properties; } + + /** + Returns the sheet's properties. + */ + const wxRichTextProperties& GetProperties() const { return m_properties; } + + /** + Sets the sheet's properties. + */ + void SetProperties(const wxRichTextProperties& props) { m_properties = props; } + +/// Implementation + + /// Add a definition to one of the style lists + bool AddStyle(wxList& list, wxRichTextStyleDefinition* def); + + /// Remove a style + bool RemoveStyle(wxList& list, wxRichTextStyleDefinition* def, bool deleteStyle); + + /// Find a definition by name + wxRichTextStyleDefinition* FindStyle(const wxList& list, const wxString& name, bool recurse = true) const; + +protected: + + wxString m_description; + wxString m_name; + + wxList m_characterStyleDefinitions; + wxList m_paragraphStyleDefinitions; + wxList m_listStyleDefinitions; + wxList m_boxStyleDefinitions; + + wxRichTextStyleSheet* m_previousSheet; + wxRichTextStyleSheet* m_nextSheet; + wxRichTextProperties m_properties; +}; + +#if wxUSE_HTML +/*! + * wxRichTextStyleListBox class declaration + * A listbox to display styles. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextStyleListBox: public wxHtmlListBox +{ + DECLARE_CLASS(wxRichTextStyleListBox) + DECLARE_EVENT_TABLE() + +public: + /// Which type of style definition is currently showing? + enum wxRichTextStyleType + { + wxRICHTEXT_STYLE_ALL, + wxRICHTEXT_STYLE_PARAGRAPH, + wxRICHTEXT_STYLE_CHARACTER, + wxRICHTEXT_STYLE_LIST, + wxRICHTEXT_STYLE_BOX + }; + + wxRichTextStyleListBox() + { + Init(); + } + wxRichTextStyleListBox(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0); + virtual ~wxRichTextStyleListBox(); + + void Init() + { + m_styleSheet = NULL; + m_richTextCtrl = NULL; + m_applyOnSelection = false; + m_styleType = wxRICHTEXT_STYLE_PARAGRAPH; + m_autoSetSelection = true; + } + + bool Create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0); + + /// Creates a suitable HTML fragment for a definition + wxString CreateHTML(wxRichTextStyleDefinition* def) const; + + /// Associates the control with a style sheet + void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { m_styleSheet = styleSheet; } + wxRichTextStyleSheet* GetStyleSheet() const { return m_styleSheet; } + + /// Associates the control with a wxRichTextCtrl + void SetRichTextCtrl(wxRichTextCtrl* ctrl) { m_richTextCtrl = ctrl; } + wxRichTextCtrl* GetRichTextCtrl() const { return m_richTextCtrl; } + + /// Get style for index + wxRichTextStyleDefinition* GetStyle(size_t i) const ; + + /// Get index for style name + int GetIndexForStyle(const wxString& name) const ; + + /// Set selection for string, returning the index. + int SetStyleSelection(const wxString& name); + + /// Updates the list + void UpdateStyles(); + + /// Apply the style + void ApplyStyle(int i); + + /// Left click + void OnLeftDown(wxMouseEvent& event); + + /// Left double-click + void OnLeftDoubleClick(wxMouseEvent& event); + + /// Auto-select from style under caret in idle time + void OnIdle(wxIdleEvent& event); + + /// Convert units in tends of a millimetre to device units + int ConvertTenthsMMToPixels(wxDC& dc, int units) const; + + /// Can we set the selection based on the editor caret position? + /// Need to override this if being used in a combobox popup + virtual bool CanAutoSetSelection() { return m_autoSetSelection; } + virtual void SetAutoSetSelection(bool autoSet) { m_autoSetSelection = autoSet; } + + /// Set whether the style should be applied as soon as the item is selected (the default) + void SetApplyOnSelection(bool applyOnSel) { m_applyOnSelection = applyOnSel; } + bool GetApplyOnSelection() const { return m_applyOnSelection; } + + /// Set the style type to display + void SetStyleType(wxRichTextStyleType styleType) { m_styleType = styleType; UpdateStyles(); } + wxRichTextStyleType GetStyleType() const { return m_styleType; } + + /// Helper for listbox and combo control + static wxString GetStyleToShowInIdleTime(wxRichTextCtrl* ctrl, wxRichTextStyleType styleType); + +protected: + /// Returns the HTML for this item + virtual wxString OnGetItem(size_t n) const; + +private: + + wxRichTextStyleSheet* m_styleSheet; + wxRichTextCtrl* m_richTextCtrl; + bool m_applyOnSelection; // if true, applies style on selection + wxRichTextStyleType m_styleType; // style type to display + bool m_autoSetSelection; + wxArrayString m_styleNames; +}; + +/*! + * wxRichTextStyleListCtrl class declaration + * This is a container for the list control plus a combobox to switch between + * style types. + */ + +#define wxRICHTEXTSTYLELIST_HIDE_TYPE_SELECTOR 0x1000 + +class WXDLLIMPEXP_RICHTEXT wxRichTextStyleListCtrl: public wxControl +{ + DECLARE_CLASS(wxRichTextStyleListCtrl) + DECLARE_EVENT_TABLE() + +public: + + /// Constructors + wxRichTextStyleListCtrl() + { + Init(); + } + + wxRichTextStyleListCtrl(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0); + + /// Constructors + virtual ~wxRichTextStyleListCtrl(); + + /// Member initialisation + void Init() + { + m_styleListBox = NULL; + m_styleChoice = NULL; + m_dontUpdate = false; + } + + /// Creates the windows + bool Create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0); + + /// Updates the style list box + void UpdateStyles(); + + /// Associates the control with a style sheet + void SetStyleSheet(wxRichTextStyleSheet* styleSheet); + wxRichTextStyleSheet* GetStyleSheet() const; + + /// Associates the control with a wxRichTextCtrl + void SetRichTextCtrl(wxRichTextCtrl* ctrl); + wxRichTextCtrl* GetRichTextCtrl() const; + + /// Set/get the style type to display + void SetStyleType(wxRichTextStyleListBox::wxRichTextStyleType styleType); + wxRichTextStyleListBox::wxRichTextStyleType GetStyleType() const; + + /// Get the choice index for style type + int StyleTypeToIndex(wxRichTextStyleListBox::wxRichTextStyleType styleType); + + /// Get the style type for choice index + wxRichTextStyleListBox::wxRichTextStyleType StyleIndexToType(int i); + + /// Get the listbox + wxRichTextStyleListBox* GetStyleListBox() const { return m_styleListBox; } + + /// Get the choice + wxChoice* GetStyleChoice() const { return m_styleChoice; } + + /// React to style type choice + void OnChooseType(wxCommandEvent& event); + + /// Lay out the controls + void OnSize(wxSizeEvent& event); + +private: + + wxRichTextStyleListBox* m_styleListBox; + wxChoice* m_styleChoice; + bool m_dontUpdate; +}; + +#if wxUSE_COMBOCTRL + +/*! + * Style drop-down for a wxComboCtrl + */ + +class wxRichTextStyleComboPopup : public wxRichTextStyleListBox, public wxComboPopup +{ +public: + virtual void Init() + { + m_itemHere = -1; // hot item in list + m_value = -1; + } + + virtual bool Create( wxWindow* parent ); + + virtual wxWindow *GetControl() { return this; } + + virtual void SetStringValue( const wxString& s ); + + virtual wxString GetStringValue() const; + + /// Can we set the selection based on the editor caret position? + // virtual bool CanAutoSetSelection() { return ((m_combo == NULL) || !m_combo->IsPopupShown()); } + virtual bool CanAutoSetSelection() { return false; } + + // + // Popup event handlers + // + + // Mouse hot-tracking + void OnMouseMove(wxMouseEvent& event); + + // On mouse left, set the value and close the popup + void OnMouseClick(wxMouseEvent& WXUNUSED(event)); + +protected: + + int m_itemHere; // hot item in popup + int m_value; + +private: + DECLARE_EVENT_TABLE() +}; + +/*! + * wxRichTextStyleComboCtrl + * A combo for applying styles. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextStyleComboCtrl: public wxComboCtrl +{ + DECLARE_CLASS(wxRichTextStyleComboCtrl) + DECLARE_EVENT_TABLE() + +public: + wxRichTextStyleComboCtrl() + { + Init(); + } + + wxRichTextStyleComboCtrl(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxCB_READONLY) + { + Init(); + Create(parent, id, pos, size, style); + } + + virtual ~wxRichTextStyleComboCtrl() {} + + void Init() + { + m_stylePopup = NULL; + } + + bool Create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0); + + /// Updates the list + void UpdateStyles() { m_stylePopup->UpdateStyles(); } + + /// Associates the control with a style sheet + void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { m_stylePopup->SetStyleSheet(styleSheet); } + wxRichTextStyleSheet* GetStyleSheet() const { return m_stylePopup->GetStyleSheet(); } + + /// Associates the control with a wxRichTextCtrl + void SetRichTextCtrl(wxRichTextCtrl* ctrl) { m_stylePopup->SetRichTextCtrl(ctrl); } + wxRichTextCtrl* GetRichTextCtrl() const { return m_stylePopup->GetRichTextCtrl(); } + + /// Gets the style popup + wxRichTextStyleComboPopup* GetStylePopup() const { return m_stylePopup; } + + /// Auto-select from style under caret in idle time + void OnIdle(wxIdleEvent& event); + +protected: + wxRichTextStyleComboPopup* m_stylePopup; +}; + +#endif + // wxUSE_COMBOCTRL + +#endif + // wxUSE_HTML + +#endif + // wxUSE_RICHTEXT + +#endif + // _WX_RICHTEXTSTYLES_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextsymboldlg.h b/wxmsw/include/wx-3.0/wx/richtext/richtextsymboldlg.h new file mode 100644 index 00000000..1dedf659 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextsymboldlg.h @@ -0,0 +1,375 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextsymboldlg.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 10/5/2006 3:11:58 PM +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTSYMBOLDLG_H_ +#define _RICHTEXTSYMBOLDLG_H_ + +/*! + * Includes + */ + +#include "wx/richtext/richtextuicustomization.h" +#include "wx/dialog.h" +#include "wx/vscroll.h" + +/*! + * Forward declarations + */ + +class WXDLLIMPEXP_FWD_CORE wxStaticText; +class WXDLLIMPEXP_FWD_CORE wxComboBox; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; + +////@begin forward declarations +class wxSymbolListCtrl; +class wxStdDialogButtonSizer; +////@end forward declarations + +// __UNICODE__ is a symbol used by DialogBlocks-generated code. +#ifndef __UNICODE__ +#if wxUSE_UNICODE +#define __UNICODE__ +#endif +#endif + +/*! + * Symbols + */ + +#define SYMBOL_WXSYMBOLPICKERDIALOG_STYLE (wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxCLOSE_BOX) +#define SYMBOL_WXSYMBOLPICKERDIALOG_TITLE wxGetTranslation("Symbols") +#define SYMBOL_WXSYMBOLPICKERDIALOG_IDNAME ID_SYMBOLPICKERDIALOG +#define SYMBOL_WXSYMBOLPICKERDIALOG_SIZE wxSize(400, 300) +#define SYMBOL_WXSYMBOLPICKERDIALOG_POSITION wxDefaultPosition + +/*! + * wxSymbolPickerDialog class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxSymbolPickerDialog: public wxDialog +{ + DECLARE_DYNAMIC_CLASS( wxSymbolPickerDialog ) + DECLARE_EVENT_TABLE() + DECLARE_HELP_PROVISION() + +public: + /// Constructors + wxSymbolPickerDialog( ); + wxSymbolPickerDialog( const wxString& symbol, const wxString& fontName, const wxString& normalTextFont, + wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& caption = SYMBOL_WXSYMBOLPICKERDIALOG_TITLE, const wxPoint& pos = SYMBOL_WXSYMBOLPICKERDIALOG_POSITION, const wxSize& size = SYMBOL_WXSYMBOLPICKERDIALOG_SIZE, long style = SYMBOL_WXSYMBOLPICKERDIALOG_STYLE ); + + /// Creation + bool Create( const wxString& symbol, const wxString& fontName, const wxString& normalTextFont, + wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& caption = SYMBOL_WXSYMBOLPICKERDIALOG_TITLE, const wxPoint& pos = SYMBOL_WXSYMBOLPICKERDIALOG_POSITION, const wxSize& size = SYMBOL_WXSYMBOLPICKERDIALOG_SIZE, long style = SYMBOL_WXSYMBOLPICKERDIALOG_STYLE ); + + /// Initialises members variables + void Init(); + + /// Creates the controls and sizers + void CreateControls(); + + /// Update the display + void UpdateSymbolDisplay(bool updateSymbolList = true, bool showAtSubset = true); + + /// Respond to symbol selection + void OnSymbolSelected( wxCommandEvent& event ); + + /// Set Unicode mode + void SetUnicodeMode(bool unicodeMode); + + /// Show at the current subset selection + void ShowAtSubset(); + + /// Get the selected symbol character + int GetSymbolChar() const; + + /// Is there a selection? + bool HasSelection() const { return !m_symbol.IsEmpty(); } + + /// Specifying normal text? + bool UseNormalFont() const { return m_fontName.IsEmpty(); } + + /// Should we show tooltips? + static bool ShowToolTips() { return sm_showToolTips; } + + /// Determines whether tooltips will be shown + static void SetShowToolTips(bool show) { sm_showToolTips = show; } + + /// Data transfer + virtual bool TransferDataToWindow(); + +////@begin wxSymbolPickerDialog event handler declarations + + /// wxEVT_COMBOBOX event handler for ID_SYMBOLPICKERDIALOG_FONT + void OnFontCtrlSelected( wxCommandEvent& event ); + +#if defined(__UNICODE__) + /// wxEVT_COMBOBOX event handler for ID_SYMBOLPICKERDIALOG_SUBSET + void OnSubsetSelected( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_SYMBOLPICKERDIALOG_SUBSET + void OnSymbolpickerdialogSubsetUpdate( wxUpdateUIEvent& event ); + +#endif +#if defined(__UNICODE__) + /// wxEVT_COMBOBOX event handler for ID_SYMBOLPICKERDIALOG_FROM + void OnFromUnicodeSelected( wxCommandEvent& event ); + +#endif + /// wxEVT_UPDATE_UI event handler for wxID_OK + void OnOkUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_BUTTON event handler for wxID_HELP + void OnHelpClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for wxID_HELP + void OnHelpUpdate( wxUpdateUIEvent& event ); + +////@end wxSymbolPickerDialog event handler declarations + +////@begin wxSymbolPickerDialog member function declarations + + wxString GetFontName() const { return m_fontName ; } + void SetFontName(wxString value) { m_fontName = value ; } + + bool GetFromUnicode() const { return m_fromUnicode ; } + void SetFromUnicode(bool value) { m_fromUnicode = value ; } + + wxString GetNormalTextFontName() const { return m_normalTextFontName ; } + void SetNormalTextFontName(wxString value) { m_normalTextFontName = value ; } + + wxString GetSymbol() const { return m_symbol ; } + void SetSymbol(wxString value) { m_symbol = value ; } + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxSymbolPickerDialog member function declarations + +////@begin wxSymbolPickerDialog member variables + wxComboBox* m_fontCtrl; +#if defined(__UNICODE__) + wxComboBox* m_subsetCtrl; +#endif + wxSymbolListCtrl* m_symbolsCtrl; + wxStaticText* m_symbolStaticCtrl; + wxTextCtrl* m_characterCodeCtrl; +#if defined(__UNICODE__) + wxComboBox* m_fromUnicodeCtrl; +#endif + wxStdDialogButtonSizer* m_stdButtonSizer; + wxString m_fontName; + bool m_fromUnicode; + wxString m_normalTextFontName; + wxString m_symbol; + /// Control identifiers + enum { + ID_SYMBOLPICKERDIALOG = 10600, + ID_SYMBOLPICKERDIALOG_FONT = 10602, + ID_SYMBOLPICKERDIALOG_SUBSET = 10605, + ID_SYMBOLPICKERDIALOG_LISTCTRL = 10608, + ID_SYMBOLPICKERDIALOG_CHARACTERCODE = 10601, + ID_SYMBOLPICKERDIALOG_FROM = 10603 + }; +////@end wxSymbolPickerDialog member variables + + bool m_dontUpdate; + static bool sm_showToolTips; +}; + +/*! + * The scrolling symbol list. + */ + +class WXDLLIMPEXP_RICHTEXT wxSymbolListCtrl : public wxVScrolledWindow +{ +public: + // constructors and such + // --------------------- + + // default constructor, you must call Create() later + wxSymbolListCtrl() { Init(); } + + // normal constructor which calls Create() internally + wxSymbolListCtrl(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr) + { + Init(); + + (void)Create(parent, id, pos, size, style, name); + } + + // really creates the control and sets the initial number of items in it + // (which may be changed later with SetItemCount()) + // + // returns true on success or false if the control couldn't be created + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr); + + // dtor does some internal cleanup + virtual ~wxSymbolListCtrl(); + + + // accessors + // --------- + + // set the current font + virtual bool SetFont(const wxFont& font); + + // set Unicode/ASCII mode + void SetUnicodeMode(bool unicodeMode); + + // get the index of the currently selected item or wxNOT_FOUND if there is no selection + int GetSelection() const; + + // is this item selected? + bool IsSelected(int item) const; + + // is this item the current one? + bool IsCurrentItem(int item) const { return item == m_current; } + + // get the margins around each cell + wxPoint GetMargins() const { return m_ptMargins; } + + // get the background colour of selected cells + const wxColour& GetSelectionBackground() const { return m_colBgSel; } + + // operations + // ---------- + + // set the selection to the specified item, if it is wxNOT_FOUND the + // selection is unset + void SetSelection(int selection); + + // make this item visible + void EnsureVisible(int item); + + // set the margins: horizontal margin is the distance between the window + // border and the item contents while vertical margin is half of the + // distance between items + // + // by default both margins are 0 + void SetMargins(const wxPoint& pt); + void SetMargins(wxCoord x, wxCoord y) { SetMargins(wxPoint(x, y)); } + + // set the cell size + void SetCellSize(const wxSize& sz) { m_cellSize = sz; } + const wxSize& GetCellSize() const { return m_cellSize; } + + // change the background colour of the selected cells + void SetSelectionBackground(const wxColour& col); + + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // Get min/max symbol values + int GetMinSymbolValue() const { return m_minSymbolValue; } + int GetMaxSymbolValue() const { return m_maxSymbolValue; } + + // Respond to size change + void OnSize(wxSizeEvent& event); + +protected: + + // draws a line of symbols + virtual void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const; + + // gets the line height + virtual wxCoord OnGetRowHeight(size_t line) const; + + // event handlers + void OnPaint(wxPaintEvent& event); + void OnKeyDown(wxKeyEvent& event); + void OnLeftDown(wxMouseEvent& event); + void OnLeftDClick(wxMouseEvent& event); + + // common part of all ctors + void Init(); + + // send the wxEVT_LISTBOX event + void SendSelectedEvent(); + + // change the current item (in single selection listbox it also implicitly + // changes the selection); current may be wxNOT_FOUND in which case there + // will be no current item any more + // + // return true if the current item changed, false otherwise + bool DoSetCurrent(int current); + + // flags for DoHandleItemClick + enum + { + ItemClick_Shift = 1, // item shift-clicked + ItemClick_Ctrl = 2, // ctrl + ItemClick_Kbd = 4 // item selected from keyboard + }; + + // common part of keyboard and mouse handling processing code + void DoHandleItemClick(int item, int flags); + + // calculate line number from symbol value + int SymbolValueToLineNumber(int item); + + // initialise control from current min/max values + void SetupCtrl(bool scrollToSelection = true); + + // hit testing + int HitTest(const wxPoint& pt); + +private: + // the current item or wxNOT_FOUND + int m_current; + + // margins + wxPoint m_ptMargins; + + // the selection bg colour + wxColour m_colBgSel; + + // double buffer + wxBitmap* m_doubleBuffer; + + // cell size + wxSize m_cellSize; + + // minimum and maximum symbol value + int m_minSymbolValue; + + // minimum and maximum symbol value + int m_maxSymbolValue; + + // number of items per line + int m_symbolsPerLine; + + // Unicode/ASCII mode + bool m_unicodeMode; + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxSymbolListCtrl); + DECLARE_ABSTRACT_CLASS(wxSymbolListCtrl) +}; + +#endif + // _RICHTEXTSYMBOLDLG_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtexttabspage.h b/wxmsw/include/wx-3.0/wx/richtext/richtexttabspage.h new file mode 100644 index 00000000..e1beb426 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtexttabspage.h @@ -0,0 +1,131 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtexttabspage.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 10/4/2006 8:03:20 AM +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTTABSPAGE_H_ +#define _RICHTEXTTABSPAGE_H_ + +/*! + * Includes + */ + +#include "wx/richtext/richtextdialogpage.h" + +////@begin includes +////@end includes + +/*! + * Forward declarations + */ + +////@begin forward declarations +////@end forward declarations + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTTABSPAGE_STYLE wxRESIZE_BORDER|wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTTABSPAGE_TITLE wxEmptyString +#define SYMBOL_WXRICHTEXTTABSPAGE_IDNAME ID_RICHTEXTTABSPAGE +#define SYMBOL_WXRICHTEXTTABSPAGE_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTTABSPAGE_POSITION wxDefaultPosition +////@end control identifiers + +/*! + * wxRichTextTabsPage class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextTabsPage: public wxRichTextDialogPage +{ + DECLARE_DYNAMIC_CLASS( wxRichTextTabsPage ) + DECLARE_EVENT_TABLE() + DECLARE_HELP_PROVISION() + +public: + /// Constructors + wxRichTextTabsPage( ); + wxRichTextTabsPage( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTTABSPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTTABSPAGE_SIZE, long style = SYMBOL_WXRICHTEXTTABSPAGE_STYLE ); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTTABSPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTTABSPAGE_SIZE, long style = SYMBOL_WXRICHTEXTTABSPAGE_STYLE ); + + /// Creates the controls and sizers + void CreateControls(); + + /// Initialise members + void Init(); + + /// Transfer data from/to window + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + /// Sorts the tab array + virtual void SortTabs(); + + /// Gets the attributes associated with the main formatting dialog + wxRichTextAttr* GetAttributes(); + +////@begin wxRichTextTabsPage event handler declarations + + /// wxEVT_LISTBOX event handler for ID_RICHTEXTTABSPAGE_TABLIST + void OnTablistSelected( wxCommandEvent& event ); + + /// wxEVT_BUTTON event handler for ID_RICHTEXTTABSPAGE_NEW_TAB + void OnNewTabClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTTABSPAGE_NEW_TAB + void OnNewTabUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_BUTTON event handler for ID_RICHTEXTTABSPAGE_DELETE_TAB + void OnDeleteTabClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTTABSPAGE_DELETE_TAB + void OnDeleteTabUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_BUTTON event handler for ID_RICHTEXTTABSPAGE_DELETE_ALL_TABS + void OnDeleteAllTabsClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTTABSPAGE_DELETE_ALL_TABS + void OnDeleteAllTabsUpdate( wxUpdateUIEvent& event ); + +////@end wxRichTextTabsPage event handler declarations + +////@begin wxRichTextTabsPage member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextTabsPage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextTabsPage member variables + wxTextCtrl* m_tabEditCtrl; + wxListBox* m_tabListCtrl; + /// Control identifiers + enum { + ID_RICHTEXTTABSPAGE = 10200, + ID_RICHTEXTTABSPAGE_TABEDIT = 10213, + ID_RICHTEXTTABSPAGE_TABLIST = 10214, + ID_RICHTEXTTABSPAGE_NEW_TAB = 10201, + ID_RICHTEXTTABSPAGE_DELETE_TAB = 10202, + ID_RICHTEXTTABSPAGE_DELETE_ALL_TABS = 10203 + }; +////@end wxRichTextTabsPage member variables + + bool m_tabsPresent; +}; + +#endif + // _RICHTEXTTABSPAGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextuicustomization.h b/wxmsw/include/wx-3.0/wx/richtext/richtextuicustomization.h new file mode 100644 index 00000000..92c42d7b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextuicustomization.h @@ -0,0 +1,126 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextuicustomization.h +// Purpose: UI customization base class for wxRTC +// Author: Julian Smart +// Modified by: +// Created: 2010-11-14 +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTUICUSTOMIZATION_H_ +#define _WX_RICHTEXTUICUSTOMIZATION_H_ + +#if wxUSE_RICHTEXT + +#include "wx/window.h" + +/** + @class wxRichTextUICustomization + The base class for functionality to plug in to various rich text control dialogs, + currently allowing the application to respond to Help button clicks without the + need to derive new dialog classes. + + The application will typically have calls like this in its initialisation: + + wxRichTextFormattingDialog::GetHelpInfo().SetHelpId(ID_HELP_FORMATTINGDIALOG); + wxRichTextFormattingDialog::GetHelpInfo().SetUICustomization(& wxGetApp().GetRichTextUICustomization()); + wxRichTextBordersPage::GetHelpInfo().SetHelpId(ID_HELP_BORDERSPAGE); + + Only the wxRichTextFormattingDialog class needs to have its customization object and help id set, + though the application set them for individual pages if it wants. + **/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextUICustomization +{ +public: + wxRichTextUICustomization() {} + virtual ~wxRichTextUICustomization() {} + + /// Show the help given the current active window, and a help topic id. + virtual bool ShowHelp(wxWindow* win, long id) = 0; +}; + +/** + @class wxRichTextHelpInfo + This class is used as a static member of dialogs, to store the help topic for the dialog + and also the customization object that will allow help to be shown appropriately for the application. + **/ + +class WXDLLIMPEXP_RICHTEXT wxRichTextHelpInfo +{ +public: + wxRichTextHelpInfo() + { + m_helpTopic = -1; + m_uiCustomization = NULL; + } + virtual ~wxRichTextHelpInfo() {} + + virtual bool ShowHelp(wxWindow* win) + { + if ( !m_uiCustomization || m_helpTopic == -1 ) + return false; + + return m_uiCustomization->ShowHelp(win, m_helpTopic); + } + + /// Get the help topic identifier. + long GetHelpId() const { return m_helpTopic; } + + /// Set the help topic identifier. + void SetHelpId(long id) { m_helpTopic = id; } + + /// Get the UI customization object. + wxRichTextUICustomization* GetUICustomization() const { return m_uiCustomization; } + + /// Set the UI customization object. + void SetUICustomization(wxRichTextUICustomization* customization) { m_uiCustomization = customization; } + + /// Is there a valid help topic id? + bool HasHelpId() const { return m_helpTopic != -1; } + + /// Is there a valid customization object? + bool HasUICustomization() const { return m_uiCustomization != NULL; } + +protected: + wxRichTextUICustomization* m_uiCustomization; + long m_helpTopic; +}; + +/// Add this to the base class of dialogs + +#define DECLARE_BASE_CLASS_HELP_PROVISION() \ + virtual long GetHelpId() const = 0; \ + virtual wxRichTextUICustomization* GetUICustomization() const = 0; \ + virtual bool ShowHelp(wxWindow* win) = 0; + +/// A macro to make it easy to add help topic provision and UI customization +/// to a class. Optionally, add virtual functions to a base class +/// using DECLARE_BASE_CLASS_HELP_PROVISION. This means that the formatting dialog +/// can obtain help topics from its individual pages without needing +/// to know in advance what page classes are being used, allowing for extension +/// of the formatting dialog. + +#define DECLARE_HELP_PROVISION() \ + virtual long GetHelpId() const { return sm_helpInfo.GetHelpId(); } \ + virtual void SetHelpId(long id) { sm_helpInfo.SetHelpId(id); } \ + virtual wxRichTextUICustomization* GetUICustomization() const { return sm_helpInfo.GetUICustomization(); } \ + virtual void SetUICustomization(wxRichTextUICustomization* customization) { sm_helpInfo.SetUICustomization(customization); } \ + virtual bool ShowHelp(wxWindow* win) { return sm_helpInfo.ShowHelp(win); } \ +public: \ + static wxRichTextHelpInfo& GetHelpInfo() { return sm_helpInfo; }\ +protected: \ + static wxRichTextHelpInfo sm_helpInfo; \ +public: + +/// Add this to the implementation file for each dialog that needs help provision. + +#define IMPLEMENT_HELP_PROVISION(theClass) \ + wxRichTextHelpInfo theClass::sm_helpInfo; + +#endif + // wxUSE_RICHTEXT + +#endif + // _WX_RICHTEXTUICUSTOMIZATION_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtext/richtextxml.h b/wxmsw/include/wx-3.0/wx/richtext/richtextxml.h new file mode 100644 index 00000000..013aa976 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtext/richtextxml.h @@ -0,0 +1,237 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextxml.h +// Purpose: XML and HTML I/O for wxRichTextCtrl +// Author: Julian Smart +// Modified by: +// Created: 2005-09-30 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTXML_H_ +#define _WX_RICHTEXTXML_H_ + +/*! + * Includes + */ + +#include "wx/hashmap.h" +#include "wx/richtext/richtextbuffer.h" +#include "wx/richtext/richtextstyles.h" + +#if wxUSE_RICHTEXT && wxUSE_XML + +/*! + @class wxRichTextXMLHelper + A utility class to help with XML import/export, that can be used outside + saving a buffer if needed. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextXMLHelper: public wxObject +{ +public: + wxRichTextXMLHelper() { Init(); } + wxRichTextXMLHelper(const wxString& enc) { Init(); SetupForSaving(enc); } + ~wxRichTextXMLHelper(); + + void Init(); + + void SetupForSaving(const wxString& enc); + + void Clear(); + + void SetFileEncoding(const wxString& encoding) { m_fileEncoding = encoding; } + const wxString& GetFileEncoding() const { return m_fileEncoding; } + + // Convert a colour to a 6-digit hex string + static wxString ColourToHexString(const wxColour& col); + + // Convert 6-digit hex string to a colour + static wxColour HexStringToColour(const wxString& hex); + + static wxString MakeString(const int& v) { return wxString::Format(wxT("%d"), v); } + static wxString MakeString(const long& v) { return wxString::Format(wxT("%ld"), v); } + static wxString MakeString(const double& v) { return wxString::Format(wxT("%.2f"), (float) v); } + static wxString MakeString(const wxString& s) { return s; } + static wxString MakeString(const wxColour& col) { return wxT("#") + ColourToHexString(col); } + + static bool HasParam(wxXmlNode* node, const wxString& param); + static wxXmlNode *GetParamNode(wxXmlNode* node, const wxString& param); + static wxString GetNodeContent(wxXmlNode *node); + static wxString GetParamValue(wxXmlNode *node, const wxString& param); + static wxString GetText(wxXmlNode *node, const wxString& param = wxEmptyString); + static wxXmlNode* FindNode(wxXmlNode* node, const wxString& name); + + static wxString AttributeToXML(const wxString& str); + + static bool RichTextFixFaceName(wxString& facename); + static long ColourStringToLong(const wxString& colStr); + static wxTextAttrDimension ParseDimension(const wxString& dimStr); + + // Make a string from the given property. This can be overridden for custom variants. + virtual wxString MakeStringFromProperty(const wxVariant& var); + + // Create a proprty from the string read from the XML file. + virtual wxVariant MakePropertyFromString(const wxString& name, const wxString& value, const wxString& type); + + // Import properties + virtual bool ImportProperties(wxRichTextProperties& properties, wxXmlNode* node); + + virtual bool ImportStyle(wxRichTextAttr& attr, wxXmlNode* node, bool isPara = false); + virtual bool ImportStyleDefinition(wxRichTextStyleSheet* sheet, wxXmlNode* node); + + // Get flags, as per handler flags + int GetFlags() const { return m_flags; } + void SetFlags(int flags) { m_flags = flags; } + +#if wxRICHTEXT_HAVE_DIRECT_OUTPUT + // write string to output + static void OutputString(wxOutputStream& stream, const wxString& str, + wxMBConv *convMem, wxMBConv *convFile); + + static void OutputIndentation(wxOutputStream& stream, int indent); + + // Same as above, but create entities first. + // Translates '<' to "<", '>' to ">" and '&' to "&" + static void OutputStringEnt(wxOutputStream& stream, const wxString& str, + wxMBConv *convMem, wxMBConv *convFile); + + void OutputString(wxOutputStream& stream, const wxString& str); + void OutputStringEnt(wxOutputStream& stream, const wxString& str); + + static void AddString(wxString& str, const int& v) { str << wxString::Format(wxT("%d"), v); } + static void AddString(wxString& str, const long& v) { str << wxString::Format(wxT("%ld"), v); } + static void AddString(wxString& str, const double& v) { str << wxString::Format(wxT("%.2f"), (float) v); } + static void AddString(wxString& str, const wxChar* s) { str << s; } + static void AddString(wxString& str, const wxString& s) { str << s; } + static void AddString(wxString& str, const wxColour& col) { str << wxT("#") << ColourToHexString(col); } + + static void AddAttribute(wxString& str, const wxString& name, const int& v); + static void AddAttribute(wxString& str, const wxString& name, const long& v); + static void AddAttribute(wxString& str, const wxString& name, const double& v); + static void AddAttribute(wxString& str, const wxString& name, const wxChar* s); + static void AddAttribute(wxString& str, const wxString& name, const wxString& s); + static void AddAttribute(wxString& str, const wxString& name, const wxColour& col); + static void AddAttribute(wxString& str, const wxString& name, const wxTextAttrDimension& dim); + static void AddAttribute(wxString& str, const wxString& rootName, const wxTextAttrDimensions& dims); + static void AddAttribute(wxString& str, const wxString& rootName, const wxTextAttrBorder& border); + static void AddAttribute(wxString& str, const wxString& rootName, const wxTextAttrBorders& borders); + + /// Create a string containing style attributes + static wxString AddAttributes(const wxRichTextAttr& attr, bool isPara = false); + virtual bool ExportStyleDefinition(wxOutputStream& stream, wxRichTextStyleDefinition* def, int level); + + virtual bool WriteProperties(wxOutputStream& stream, const wxRichTextProperties& properties, int level); +#endif + +#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT + static void AddAttribute(wxXmlNode* node, const wxString& name, const int& v); + static void AddAttribute(wxXmlNode* node, const wxString& name, const long& v); + static void AddAttribute(wxXmlNode* node, const wxString& name, const double& v); + static void AddAttribute(wxXmlNode* node, const wxString& name, const wxString& s); + static void AddAttribute(wxXmlNode* node, const wxString& name, const wxColour& col); + static void AddAttribute(wxXmlNode* node, const wxString& name, const wxTextAttrDimension& dim); + static void AddAttribute(wxXmlNode* node, const wxString& rootName, const wxTextAttrDimensions& dims); + static void AddAttribute(wxXmlNode* node, const wxString& rootName, const wxTextAttrBorder& border); + static void AddAttribute(wxXmlNode* node, const wxString& rootName, const wxTextAttrBorders& borders); + + static bool AddAttributes(wxXmlNode* node, wxRichTextAttr& attr, bool isPara = false); + + virtual bool ExportStyleDefinition(wxXmlNode* parent, wxRichTextStyleDefinition* def); + + // Write the properties + virtual bool WriteProperties(wxXmlNode* node, const wxRichTextProperties& properties); +#endif + +public: + +#if wxRICHTEXT_HAVE_DIRECT_OUTPUT + // Used during saving + wxMBConv* m_convMem; + wxMBConv* m_convFile; + bool m_deleteConvFile; +#endif + + wxString m_fileEncoding; + int m_flags; +}; + +/*! + @class wxRichTextXMLHandler + + Implements XML loading and saving. Two methods of saving are included: + writing directly to a text stream, and populating an wxXmlDocument + before writing it. The former method is considerably faster, so we favour + that one, even though the code is a little less elegant. + */ + +class WXDLLIMPEXP_FWD_XML wxXmlNode; +class WXDLLIMPEXP_FWD_XML wxXmlDocument; + +class WXDLLIMPEXP_RICHTEXT wxRichTextXMLHandler: public wxRichTextFileHandler +{ + DECLARE_DYNAMIC_CLASS(wxRichTextXMLHandler) +public: + wxRichTextXMLHandler(const wxString& name = wxT("XML"), const wxString& ext = wxT("xml"), int type = wxRICHTEXT_TYPE_XML) + : wxRichTextFileHandler(name, ext, type) + { Init(); } + + void Init(); + +#if wxUSE_STREAMS + +#if wxRICHTEXT_HAVE_DIRECT_OUTPUT + /// Recursively export an object + bool ExportXML(wxOutputStream& stream, wxRichTextObject& obj, int level); +#endif + +#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT + bool ExportXML(wxXmlNode* parent, wxRichTextObject& obj); +#endif + + /// Recursively import an object + bool ImportXML(wxRichTextBuffer* buffer, wxRichTextObject* obj, wxXmlNode* node); +#endif + + /// Creates an object given an XML element name + virtual wxRichTextObject* CreateObjectForXMLName(wxRichTextObject* parent, const wxString& name) const; + + /// Can we save using this handler? + virtual bool CanSave() const { return true; } + + /// Can we load using this handler? + virtual bool CanLoad() const { return true; } + + /// Returns the XML helper object, implementing functionality + /// that can be reused elsewhere. + wxRichTextXMLHelper& GetHelper() { return m_helper; } + +// Implementation + + /** + Call with XML node name, C++ class name so that wxRTC can read in the node. + If you add a custom object, call this. + */ + static void RegisterNodeName(const wxString& nodeName, const wxString& className) { sm_nodeNameToClassMap[nodeName] = className; } + + /** + Cleans up the mapping between node name and C++ class. + */ + static void ClearNodeToClassMap() { sm_nodeNameToClassMap.clear(); } + +protected: +#if wxUSE_STREAMS + virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream); + virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream); +#endif + + wxRichTextXMLHelper m_helper; + + static wxStringToStringHashMap sm_nodeNameToClassMap; +}; + +#endif + // wxUSE_RICHTEXT && wxUSE_XML + +#endif + // _WX_RICHTEXTXML_H_ diff --git a/wxmsw/include/wx-3.0/wx/richtooltip.h b/wxmsw/include/wx-3.0/wx/richtooltip.h new file mode 100644 index 00000000..1187e67e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/richtooltip.h @@ -0,0 +1,103 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/richtooltip.h +// Purpose: Declaration of wxRichToolTip class. +// Author: Vadim Zeitlin +// Created: 2011-10-07 +// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTOOLTIP_H_ +#define _WX_RICHTOOLTIP_H_ + +#include "wx/defs.h" + +#if wxUSE_RICHTOOLTIP + +#include "wx/colour.h" + +class WXDLLIMPEXP_FWD_CORE wxFont; +class WXDLLIMPEXP_FWD_CORE wxIcon; +class WXDLLIMPEXP_FWD_CORE wxWindow; + +class wxRichToolTipImpl; + +// This enum describes the kind of the tip shown which combines both the tip +// position and appearance because the two are related (when the tip is +// positioned asymmetrically, a right handed triangle is used but an +// equilateral one when it's in the middle of a side). +// +// Automatic selects the tip appearance best suited for the current platform +// and the position best suited for the window the tooltip is shown for, i.e. +// chosen in such a way that the tooltip is always fully on screen. +// +// Other values describe the position of the tooltip itself, not the window it +// relates to. E.g. wxTipKind_Top places the tip on the top of the tooltip and +// so the tooltip itself is located beneath its associated window. +enum wxTipKind +{ + wxTipKind_None, + wxTipKind_TopLeft, + wxTipKind_Top, + wxTipKind_TopRight, + wxTipKind_BottomLeft, + wxTipKind_Bottom, + wxTipKind_BottomRight, + wxTipKind_Auto +}; + +// ---------------------------------------------------------------------------- +// wxRichToolTip: a customizable but not necessarily native tooltip. +// ---------------------------------------------------------------------------- + +// Notice that this class does not inherit from wxWindow. +class WXDLLIMPEXP_ADV wxRichToolTip +{ +public: + // Ctor must specify the tooltip title and main message, additional + // attributes can be set later. + wxRichToolTip(const wxString& title, const wxString& message); + + // Set the background colour: if two colours are specified, the background + // is drawn using a gradient from top to bottom, otherwise a single solid + // colour is used. + void SetBackgroundColour(const wxColour& col, + const wxColour& colEnd = wxColour()); + + // Set the small icon to show: either one of the standard information/ + // warning/error ones (the question icon doesn't make sense for a tooltip) + // or a custom icon. + void SetIcon(int icon = wxICON_INFORMATION); + void SetIcon(const wxIcon& icon); + + // Set timeout after which the tooltip should disappear, in milliseconds. + // By default the tooltip is hidden after system-dependent interval of time + // elapses but this method can be used to change this or also disable + // hiding the tooltip automatically entirely by passing 0 in this parameter + // (but doing this can result in native version not being used). + // Optionally specify a show delay. + void SetTimeout(unsigned milliseconds, unsigned millisecondsShowdelay = 0); + + // Choose the tip kind, possibly none. By default the tip is positioned + // automatically, as if wxTipKind_Auto was used. + void SetTipKind(wxTipKind tipKind); + + // Set the title text font. By default it's emphasized using the font style + // or colour appropriate for the current platform. + void SetTitleFont(const wxFont& font); + + // Show the tooltip for the given window and optionally a specified area. + void ShowFor(wxWindow* win, const wxRect* rect = NULL); + + // Non-virtual dtor as this class is not supposed to be derived from. + ~wxRichToolTip(); + +private: + wxRichToolTipImpl* const m_impl; + + wxDECLARE_NO_COPY_CLASS(wxRichToolTip); +}; + +#endif // wxUSE_RICHTOOLTIP + +#endif // _WX_RICHTOOLTIP_H_ diff --git a/wxmsw/include/wx-3.0/wx/rtti.h b/wxmsw/include/wx-3.0/wx/rtti.h new file mode 100644 index 00000000..51017baa --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/rtti.h @@ -0,0 +1,319 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/rtti.h +// Purpose: old RTTI macros (use XTI when possible instead) +// Author: Julian Smart +// Modified by: Ron Lee +// Created: 01/02/97 +// Copyright: (c) 1997 Julian Smart +// (c) 2001 Ron Lee <ron@debian.org> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RTTIH__ +#define _WX_RTTIH__ + +#if !wxUSE_EXTENDED_RTTI // XTI system is meant to replace these macros + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/memory.h" + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxObject; +class WXDLLIMPEXP_FWD_BASE wxString; +class WXDLLIMPEXP_FWD_BASE wxClassInfo; +class WXDLLIMPEXP_FWD_BASE wxHashTable; +class WXDLLIMPEXP_FWD_BASE wxObject; +class WXDLLIMPEXP_FWD_BASE wxPluginLibrary; +class WXDLLIMPEXP_FWD_BASE wxHashTable_Node; + +// ---------------------------------------------------------------------------- +// wxClassInfo +// ---------------------------------------------------------------------------- + +typedef wxObject *(*wxObjectConstructorFn)(void); + +class WXDLLIMPEXP_BASE wxClassInfo +{ + friend class WXDLLIMPEXP_FWD_BASE wxObject; + friend WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxString& name); +public: + wxClassInfo( const wxChar *className, + const wxClassInfo *baseInfo1, + const wxClassInfo *baseInfo2, + int size, + wxObjectConstructorFn ctor ) + : m_className(className) + , m_objectSize(size) + , m_objectConstructor(ctor) + , m_baseInfo1(baseInfo1) + , m_baseInfo2(baseInfo2) + , m_next(sm_first) + { + sm_first = this; + Register(); + } + + ~wxClassInfo(); + + wxObject *CreateObject() const + { return m_objectConstructor ? (*m_objectConstructor)() : 0; } + bool IsDynamic() const { return (NULL != m_objectConstructor); } + + const wxChar *GetClassName() const { return m_className; } + const wxChar *GetBaseClassName1() const + { return m_baseInfo1 ? m_baseInfo1->GetClassName() : NULL; } + const wxChar *GetBaseClassName2() const + { return m_baseInfo2 ? m_baseInfo2->GetClassName() : NULL; } + const wxClassInfo *GetBaseClass1() const { return m_baseInfo1; } + const wxClassInfo *GetBaseClass2() const { return m_baseInfo2; } + int GetSize() const { return m_objectSize; } + + wxObjectConstructorFn GetConstructor() const + { return m_objectConstructor; } + static const wxClassInfo *GetFirst() { return sm_first; } + const wxClassInfo *GetNext() const { return m_next; } + static wxClassInfo *FindClass(const wxString& className); + + // Climb upwards through inheritance hierarchy. + // Dual inheritance is catered for. + + bool IsKindOf(const wxClassInfo *info) const + { + return info != 0 && + ( info == this || + ( m_baseInfo1 && m_baseInfo1->IsKindOf(info) ) || + ( m_baseInfo2 && m_baseInfo2->IsKindOf(info) ) ); + } + + wxDECLARE_CLASS_INFO_ITERATORS(); + +private: + const wxChar *m_className; + int m_objectSize; + wxObjectConstructorFn m_objectConstructor; + + // Pointers to base wxClassInfos + + const wxClassInfo *m_baseInfo1; + const wxClassInfo *m_baseInfo2; + + // class info object live in a linked list: + // pointers to its head and the next element in it + + static wxClassInfo *sm_first; + wxClassInfo *m_next; + + static wxHashTable *sm_classTable; + +protected: + // registers the class + void Register(); + void Unregister(); + + wxDECLARE_NO_COPY_CLASS(wxClassInfo); +}; + +WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxString& name); + +// ---------------------------------------------------------------------------- +// Dynamic class macros +// ---------------------------------------------------------------------------- + +#define wxDECLARE_ABSTRACT_CLASS(name) \ + public: \ + static wxClassInfo ms_classInfo; \ + virtual wxClassInfo *GetClassInfo() const + +#define wxDECLARE_DYNAMIC_CLASS_NO_ASSIGN(name) \ + wxDECLARE_NO_ASSIGN_CLASS(name); \ + wxDECLARE_DYNAMIC_CLASS(name) + +#define wxDECLARE_DYNAMIC_CLASS_NO_COPY(name) \ + wxDECLARE_NO_COPY_CLASS(name); \ + wxDECLARE_DYNAMIC_CLASS(name) + +#define wxDECLARE_DYNAMIC_CLASS(name) \ + wxDECLARE_ABSTRACT_CLASS(name); \ + static wxObject* wxCreateObject() + +#define wxDECLARE_CLASS(name) \ + wxDECLARE_ABSTRACT_CLASS(name) + + +// common part of the macros below +#define wxIMPLEMENT_CLASS_COMMON(name, basename, baseclsinfo2, func) \ + wxClassInfo name::ms_classInfo(wxT(#name), \ + &basename::ms_classInfo, \ + baseclsinfo2, \ + (int) sizeof(name), \ + func); \ + \ + wxClassInfo *name::GetClassInfo() const \ + { return &name::ms_classInfo; } + +#define wxIMPLEMENT_CLASS_COMMON1(name, basename, func) \ + wxIMPLEMENT_CLASS_COMMON(name, basename, NULL, func) + +#define wxIMPLEMENT_CLASS_COMMON2(name, basename1, basename2, func) \ + wxIMPLEMENT_CLASS_COMMON(name, basename1, &basename2::ms_classInfo, func) + +// ----------------------------------- +// for concrete classes +// ----------------------------------- + + // Single inheritance with one base class +#define wxIMPLEMENT_DYNAMIC_CLASS(name, basename) \ + wxIMPLEMENT_CLASS_COMMON1(name, basename, name::wxCreateObject) \ + wxObject* name::wxCreateObject() \ + { return new name; } + + // Multiple inheritance with two base classes +#define wxIMPLEMENT_DYNAMIC_CLASS2(name, basename1, basename2) \ + wxIMPLEMENT_CLASS_COMMON2(name, basename1, basename2, \ + name::wxCreateObject) \ + wxObject* name::wxCreateObject() \ + { return new name; } + +// ----------------------------------- +// for abstract classes +// ----------------------------------- + + // Single inheritance with one base class +#define wxIMPLEMENT_ABSTRACT_CLASS(name, basename) \ + wxIMPLEMENT_CLASS_COMMON1(name, basename, NULL) + + // Multiple inheritance with two base classes +#define wxIMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \ + wxIMPLEMENT_CLASS_COMMON2(name, basename1, basename2, NULL) + +// ----------------------------------- +// XTI-compatible macros +// ----------------------------------- + +#include "wx/flags.h" + +// these macros only do something when wxUSE_EXTENDED_RTTI=1 +// (and in that case they are defined by xti.h); however to avoid +// to be forced to wrap these macros (in user's source files) with +// +// #if wxUSE_EXTENDED_RTTI +// ... +// #endif +// +// blocks, we define them here as empty. + +#define wxEMPTY_PARAMETER_VALUE /**/ + +#define wxBEGIN_ENUM( e ) wxEMPTY_PARAMETER_VALUE +#define wxENUM_MEMBER( v ) wxEMPTY_PARAMETER_VALUE +#define wxEND_ENUM( e ) wxEMPTY_PARAMETER_VALUE + +#define wxIMPLEMENT_SET_STREAMING(SetName,e) wxEMPTY_PARAMETER_VALUE + +#define wxBEGIN_FLAGS( e ) wxEMPTY_PARAMETER_VALUE +#define wxFLAGS_MEMBER( v ) wxEMPTY_PARAMETER_VALUE +#define wxEND_FLAGS( e ) wxEMPTY_PARAMETER_VALUE + +#define wxCOLLECTION_TYPE_INFO( element, collection ) wxEMPTY_PARAMETER_VALUE + +#define wxHANDLER(name,eventClassType) wxEMPTY_PARAMETER_VALUE +#define wxBEGIN_HANDLERS_TABLE(theClass) wxEMPTY_PARAMETER_VALUE +#define wxEND_HANDLERS_TABLE() wxEMPTY_PARAMETER_VALUE + +#define wxIMPLEMENT_DYNAMIC_CLASS_XTI( name, basename, unit ) \ + wxIMPLEMENT_DYNAMIC_CLASS( name, basename ) +#define wxIMPLEMENT_DYNAMIC_CLASS_XTI_CALLBACK( name, basename, unit, callback ) \ + wxIMPLEMENT_DYNAMIC_CLASS( name, basename ) + +#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY_XTI( name, basename, unit ) \ + wxIMPLEMENT_DYNAMIC_CLASS( name, basename) + +#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY_AND_STREAMERS_XTI( name, basename, \ + unit, toString, \ + fromString ) wxEMPTY_PARAMETER_VALUE +#define wxIMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_NO_BASE_XTI( name, unit ) wxEMPTY_PARAMETER_VALUE +#define wxIMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_XTI( name, basename, unit ) wxEMPTY_PARAMETER_VALUE + +#define wxIMPLEMENT_DYNAMIC_CLASS2_XTI( name, basename, basename2, unit) wxIMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2 ) + +#define wxCONSTRUCTOR_0(klass) \ + wxEMPTY_PARAMETER_VALUE +#define wxCONSTRUCTOR_DUMMY(klass) \ + wxEMPTY_PARAMETER_VALUE +#define wxDIRECT_CONSTRUCTOR_0(klass) \ + wxEMPTY_PARAMETER_VALUE +#define wxCONSTRUCTOR_1(klass,t0,v0) \ + wxEMPTY_PARAMETER_VALUE +#define wxDIRECT_CONSTRUCTOR_1(klass,t0,v0) \ + wxEMPTY_PARAMETER_VALUE +#define wxCONSTRUCTOR_2(klass,t0,v0,t1,v1) \ + wxEMPTY_PARAMETER_VALUE +#define wxDIRECT_CONSTRUCTOR_2(klass,t0,v0,t1,v1) \ + wxEMPTY_PARAMETER_VALUE +#define wxCONSTRUCTOR_3(klass,t0,v0,t1,v1,t2,v2) \ + wxEMPTY_PARAMETER_VALUE +#define wxDIRECT_CONSTRUCTOR_3(klass,t0,v0,t1,v1,t2,v2) \ + wxEMPTY_PARAMETER_VALUE +#define wxCONSTRUCTOR_4(klass,t0,v0,t1,v1,t2,v2,t3,v3) \ + wxEMPTY_PARAMETER_VALUE +#define wxDIRECT_CONSTRUCTOR_4(klass,t0,v0,t1,v1,t2,v2,t3,v3) \ + wxEMPTY_PARAMETER_VALUE +#define wxCONSTRUCTOR_5(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4) \ + wxEMPTY_PARAMETER_VALUE +#define wxDIRECT_CONSTRUCTOR_5(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4) \ + wxEMPTY_PARAMETER_VALUE +#define wxCONSTRUCTOR_6(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5) \ + wxEMPTY_PARAMETER_VALUE +#define wxDIRECT_CONSTRUCTOR_6(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5) \ + wxEMPTY_PARAMETER_VALUE +#define wxCONSTRUCTOR_7(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6) \ + wxEMPTY_PARAMETER_VALUE +#define wxDIRECT_CONSTRUCTOR_7(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6) \ + wxEMPTY_PARAMETER_VALUE +#define wxCONSTRUCTOR_8(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6,t7,v7) \ + wxEMPTY_PARAMETER_VALUE +#define wxDIRECT_CONSTRUCTOR_8(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6,t7,v7) \ + wxEMPTY_PARAMETER_VALUE + +#define wxSETTER( property, Klass, valueType, setterMethod ) wxEMPTY_PARAMETER_VALUE +#define wxGETTER( property, Klass, valueType, gettermethod ) wxEMPTY_PARAMETER_VALUE +#define wxADDER( property, Klass, valueType, addermethod ) wxEMPTY_PARAMETER_VALUE +#define wxCOLLECTION_GETTER( property, Klass, valueType, gettermethod ) wxEMPTY_PARAMETER_VALUE + +#define wxBEGIN_PROPERTIES_TABLE(theClass) wxEMPTY_PARAMETER_VALUE +#define wxEND_PROPERTIES_TABLE() wxEMPTY_PARAMETER_VALUE +#define wxHIDE_PROPERTY( pname ) wxEMPTY_PARAMETER_VALUE + +#define wxPROPERTY( pname, type, setter, getter, defaultValue, flags, help, group) \ + wxEMPTY_PARAMETER_VALUE + +#define wxPROPERTY_FLAGS( pname, flags, type, setter, getter,defaultValue, \ + pflags, help, group) wxEMPTY_PARAMETER_VALUE + +#define wxREADONLY_PROPERTY( pname, type, getter,defaultValue, flags, help, group) \ + wxGETTER( pname, class_t, type, getter ) wxEMPTY_PARAMETER_VALUE + +#define wxREADONLY_PROPERTY_FLAGS( pname, flags, type, getter,defaultValue, \ + pflags, help, group) wxEMPTY_PARAMETER_VALUE + +#define wxPROPERTY_COLLECTION( pname, colltype, addelemtype, adder, getter, \ + flags, help, group ) wxEMPTY_PARAMETER_VALUE + +#define wxREADONLY_PROPERTY_COLLECTION( pname, colltype, addelemtype, getter, \ + flags, help, group) wxEMPTY_PARAMETER_VALUE +#define wxEVENT_PROPERTY( name, eventType, eventClass ) wxEMPTY_PARAMETER_VALUE + +#define wxEVENT_RANGE_PROPERTY( name, eventType, lastEventType, eventClass ) wxEMPTY_PARAMETER_VALUE + +#define wxIMPLEMENT_PROPERTY(name, type) wxEMPTY_PARAMETER_VALUE + +#define wxEMPTY_HANDLERS_TABLE(name) wxEMPTY_PARAMETER_VALUE + +#endif // !wxUSE_EXTENDED_RTTI +#endif // _WX_RTTIH__ diff --git a/wxmsw/include/wx-3.0/wx/sashwin.h b/wxmsw/include/wx-3.0/wx/sashwin.h new file mode 100644 index 00000000..21967a5c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/sashwin.h @@ -0,0 +1,17 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/sashwin.h +// Purpose: Base header for wxSashWindow +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SASHWIN_H_BASE_ +#define _WX_SASHWIN_H_BASE_ + +#include "wx/generic/sashwin.h" + +#endif + // _WX_SASHWIN_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/sckaddr.h b/wxmsw/include/wx-3.0/wx/sckaddr.h new file mode 100644 index 00000000..4ceefdf3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/sckaddr.h @@ -0,0 +1,222 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/sckaddr.h +// Purpose: Network address classes +// Author: Guilhem Lavaux +// Modified by: Vadim Zeitlin to switch to wxSockAddressImpl implementation +// Created: 26/04/1997 +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// (c) 2008, 2009 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SCKADDR_H_ +#define _WX_SCKADDR_H_ + +#include "wx/defs.h" + +#if wxUSE_SOCKETS + +#include "wx/string.h" + +class wxSockAddressImpl; + +// forward declare it instead of including the system headers defining it which +// can bring in <windows.h> under Windows which we don't want to include from +// public wx headers +struct sockaddr; + +// Any socket address kind +class WXDLLIMPEXP_NET wxSockAddress : public wxObject +{ +public: + enum Family + { + NONE, + IPV4, + IPV6, + UNIX + }; + + wxSockAddress(); + wxSockAddress(const wxSockAddress& other); + virtual ~wxSockAddress(); + + wxSockAddress& operator=(const wxSockAddress& other); + + virtual void Clear(); + virtual Family Type() = 0; + + // accessors for the low level address represented by this object + const sockaddr *GetAddressData() const; + int GetAddressDataLen() const; + + // we need to be able to create copies of the addresses polymorphically + // (i.e. without knowing the exact address class) + virtual wxSockAddress *Clone() const = 0; + + + // implementation only, don't use + const wxSockAddressImpl& GetAddress() const { return *m_impl; } + void SetAddress(const wxSockAddressImpl& address); + +protected: + wxSockAddressImpl *m_impl; + +private: + void Init(); + DECLARE_ABSTRACT_CLASS(wxSockAddress) +}; + +// An IP address (either IPv4 or IPv6) +class WXDLLIMPEXP_NET wxIPaddress : public wxSockAddress +{ +public: + wxIPaddress() : wxSockAddress() { } + wxIPaddress(const wxIPaddress& other) + : wxSockAddress(other), + m_origHostname(other.m_origHostname) + { + } + + bool operator==(const wxIPaddress& addr) const; + + bool Hostname(const wxString& name); + bool Service(const wxString& name); + bool Service(unsigned short port); + + bool LocalHost(); + virtual bool IsLocalHost() const = 0; + + bool AnyAddress(); + + virtual wxString IPAddress() const = 0; + + wxString Hostname() const; + unsigned short Service() const; + + wxString OrigHostname() const { return m_origHostname; } + +protected: + // get m_impl initialized to the right family if it hadn't been done yet + wxSockAddressImpl& GetImpl(); + const wxSockAddressImpl& GetImpl() const + { + return const_cast<wxIPaddress *>(this)->GetImpl(); + } + + // host name originally passed to Hostname() + wxString m_origHostname; + +private: + // create the wxSockAddressImpl object of the correct family if it's + // currently uninitialized + virtual void DoInitImpl() = 0; + + + DECLARE_ABSTRACT_CLASS(wxIPaddress) +}; + +// An IPv4 address +class WXDLLIMPEXP_NET wxIPV4address : public wxIPaddress +{ +public: + wxIPV4address() : wxIPaddress() { } + wxIPV4address(const wxIPV4address& other) : wxIPaddress(other) { } + + // implement wxSockAddress pure virtuals: + virtual Family Type() { return IPV4; } + virtual wxSockAddress *Clone() const { return new wxIPV4address(*this); } + + + // implement wxIPaddress pure virtuals: + virtual bool IsLocalHost() const; + + virtual wxString IPAddress() const; + + + // IPv4-specific methods: + bool Hostname(unsigned long addr); + + // make base class methods hidden by our overload visible + // + // FIXME-VC6: replace this with "using IPAddress::Hostname" (not supported + // by VC6) when support for it is dropped + wxString Hostname() const { return wxIPaddress::Hostname(); } + bool Hostname(const wxString& name) { return wxIPaddress::Hostname(name); } + + bool BroadcastAddress(); + +private: + virtual void DoInitImpl(); + + DECLARE_DYNAMIC_CLASS(wxIPV4address) +}; + + +#if wxUSE_IPV6 + +// An IPv6 address +class WXDLLIMPEXP_NET wxIPV6address : public wxIPaddress +{ +public: + wxIPV6address() : wxIPaddress() { } + wxIPV6address(const wxIPV6address& other) : wxIPaddress(other) { } + + // implement wxSockAddress pure virtuals: + virtual Family Type() { return IPV6; } + virtual wxSockAddress *Clone() const { return new wxIPV6address(*this); } + + + // implement wxIPaddress pure virtuals: + virtual bool IsLocalHost() const; + + virtual wxString IPAddress() const; + + // IPv6-specific methods: + bool Hostname(unsigned char addr[16]); + + using wxIPaddress::Hostname; + +private: + virtual void DoInitImpl(); + + DECLARE_DYNAMIC_CLASS(wxIPV6address) +}; + +#endif // wxUSE_IPV6 + +// Unix domain sockets are only available under, well, Unix +#if defined(__UNIX__) && !defined(__WINDOWS__) && !defined(__WINE__) + #define wxHAS_UNIX_DOMAIN_SOCKETS +#endif + +#ifdef wxHAS_UNIX_DOMAIN_SOCKETS + +// A Unix domain socket address +class WXDLLIMPEXP_NET wxUNIXaddress : public wxSockAddress +{ +public: + wxUNIXaddress() : wxSockAddress() { } + wxUNIXaddress(const wxUNIXaddress& other) : wxSockAddress(other) { } + + void Filename(const wxString& name); + wxString Filename() const; + + virtual Family Type() { return UNIX; } + virtual wxSockAddress *Clone() const { return new wxUNIXaddress(*this); } + +private: + wxSockAddressImpl& GetUNIX(); + const wxSockAddressImpl& GetUNIX() const + { + return const_cast<wxUNIXaddress *>(this)->GetUNIX(); + } + + DECLARE_DYNAMIC_CLASS(wxUNIXaddress) +}; + +#endif // wxHAS_UNIX_DOMAIN_SOCKETS + +#endif // wxUSE_SOCKETS + +#endif // _WX_SCKADDR_H_ diff --git a/wxmsw/include/wx-3.0/wx/sckipc.h b/wxmsw/include/wx-3.0/wx/sckipc.h new file mode 100644 index 00000000..3801da8c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/sckipc.h @@ -0,0 +1,159 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/sckipc.h +// Purpose: Interprocess communication implementation (wxSocket version) +// Author: Julian Smart +// Modified by: Guilhem Lavaux (big rewrite) May 1997, 1998 +// Guillermo Rodriguez (updated for wxSocket v2) Jan 2000 +// (callbacks deprecated) Mar 2000 +// Created: 1993 +// Copyright: (c) Julian Smart 1993 +// (c) Guilhem Lavaux 1997, 1998 +// (c) 2000 Guillermo Rodriguez <guille@iies.es> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SCKIPC_H +#define _WX_SCKIPC_H + +#include "wx/defs.h" + +#if wxUSE_SOCKETS && wxUSE_IPC + +#include "wx/ipcbase.h" +#include "wx/socket.h" +#include "wx/sckstrm.h" +#include "wx/datstrm.h" + +/* + * Mini-DDE implementation + + Most transactions involve a topic name and an item name (choose these + as befits your application). + + A client can: + + - ask the server to execute commands (data) associated with a topic + - request data from server by topic and item + - poke data into the server + - ask the server to start an advice loop on topic/item + - ask the server to stop an advice loop + + A server can: + + - respond to execute, request, poke and advice start/stop + - send advise data to client + + Note that this limits the server in the ways it can send data to the + client, i.e. it can't send unsolicited information. + * + */ + +class WXDLLIMPEXP_FWD_NET wxTCPServer; +class WXDLLIMPEXP_FWD_NET wxTCPClient; + +class wxIPCSocketStreams; + +class WXDLLIMPEXP_NET wxTCPConnection : public wxConnectionBase +{ +public: + wxTCPConnection() { Init(); } + wxTCPConnection(void *buffer, size_t size) + : wxConnectionBase(buffer, size) + { + Init(); + } + + virtual ~wxTCPConnection(); + + // implement base class pure virtual methods + virtual const void *Request(const wxString& item, + size_t *size = NULL, + wxIPCFormat format = wxIPC_TEXT); + virtual bool StartAdvise(const wxString& item); + virtual bool StopAdvise(const wxString& item); + virtual bool Disconnect(void); + + // Will be used in the future to enable the compression but does nothing + // for now. + void Compress(bool on); + + +protected: + virtual bool DoExecute(const void *data, size_t size, wxIPCFormat format); + virtual bool DoPoke(const wxString& item, const void *data, size_t size, + wxIPCFormat format); + virtual bool DoAdvise(const wxString& item, const void *data, size_t size, + wxIPCFormat format); + + + // notice that all the members below are only initialized once the + // connection is made, i.e. in MakeConnection() for the client objects and + // after OnAcceptConnection() in the server ones + + // the underlying socket (wxSocketClient for IPC client and wxSocketServer + // for IPC server) + wxSocketBase *m_sock; + + // various streams that we use + wxIPCSocketStreams *m_streams; + + // the topic of this connection + wxString m_topic; + +private: + // common part of both ctors + void Init(); + + friend class wxTCPServer; + friend class wxTCPClient; + friend class wxTCPEventHandler; + + wxDECLARE_NO_COPY_CLASS(wxTCPConnection); + DECLARE_DYNAMIC_CLASS(wxTCPConnection) +}; + +class WXDLLIMPEXP_NET wxTCPServer : public wxServerBase +{ +public: + wxTCPServer(); + virtual ~wxTCPServer(); + + // Returns false on error (e.g. port number is already in use) + virtual bool Create(const wxString& serverName); + + virtual wxConnectionBase *OnAcceptConnection(const wxString& topic); + +protected: + wxSocketServer *m_server; + +#ifdef __UNIX_LIKE__ + // the name of the file associated to the Unix domain socket, may be empty + wxString m_filename; +#endif // __UNIX_LIKE__ + + wxDECLARE_NO_COPY_CLASS(wxTCPServer); + DECLARE_DYNAMIC_CLASS(wxTCPServer) +}; + +class WXDLLIMPEXP_NET wxTCPClient : public wxClientBase +{ +public: + wxTCPClient(); + + virtual bool ValidHost(const wxString& host); + + // Call this to make a connection. Returns NULL if cannot. + virtual wxConnectionBase *MakeConnection(const wxString& host, + const wxString& server, + const wxString& topic); + + // Callbacks to CLIENT - override at will + virtual wxConnectionBase *OnMakeConnection(); + +private: + DECLARE_DYNAMIC_CLASS(wxTCPClient) +}; + +#endif // wxUSE_SOCKETS && wxUSE_IPC + +#endif // _WX_SCKIPC_H diff --git a/wxmsw/include/wx-3.0/wx/sckstrm.h b/wxmsw/include/wx-3.0/wx/sckstrm.h new file mode 100644 index 00000000..31f32706 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/sckstrm.h @@ -0,0 +1,74 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/sckstrm.h +// Purpose: wxSocket*Stream +// Author: Guilhem Lavaux +// Modified by: +// Created: 17/07/97 +// Copyright: (c) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// +#ifndef __SCK_STREAM_H__ +#define __SCK_STREAM_H__ + +#include "wx/stream.h" + +#if wxUSE_SOCKETS && wxUSE_STREAMS + +#include "wx/socket.h" + +class WXDLLIMPEXP_NET wxSocketOutputStream : public wxOutputStream +{ +public: + wxSocketOutputStream(wxSocketBase& s); + virtual ~wxSocketOutputStream(); + +protected: + wxSocketBase *m_o_socket; + + size_t OnSysWrite(const void *buffer, size_t bufsize); + + // socket streams are both un-seekable and size-less streams: + wxFileOffset OnSysTell() const + { return wxInvalidOffset; } + wxFileOffset OnSysSeek(wxFileOffset WXUNUSED(pos), wxSeekMode WXUNUSED(mode)) + { return wxInvalidOffset; } + + wxDECLARE_NO_COPY_CLASS(wxSocketOutputStream); +}; + +class WXDLLIMPEXP_NET wxSocketInputStream : public wxInputStream +{ +public: + wxSocketInputStream(wxSocketBase& s); + virtual ~wxSocketInputStream(); + +protected: + wxSocketBase *m_i_socket; + + size_t OnSysRead(void *buffer, size_t bufsize); + + // socket streams are both un-seekable and size-less streams: + + wxFileOffset OnSysTell() const + { return wxInvalidOffset; } + wxFileOffset OnSysSeek(wxFileOffset WXUNUSED(pos), wxSeekMode WXUNUSED(mode)) + { return wxInvalidOffset; } + + wxDECLARE_NO_COPY_CLASS(wxSocketInputStream); +}; + +class WXDLLIMPEXP_NET wxSocketStream : public wxSocketInputStream, + public wxSocketOutputStream +{ +public: + wxSocketStream(wxSocketBase& s); + virtual ~wxSocketStream(); + + wxDECLARE_NO_COPY_CLASS(wxSocketStream); +}; + +#endif + // wxUSE_SOCKETS && wxUSE_STREAMS + +#endif + // __SCK_STREAM_H__ diff --git a/wxmsw/include/wx-3.0/wx/scopedarray.h b/wxmsw/include/wx-3.0/wx/scopedarray.h new file mode 100644 index 00000000..e6246a23 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/scopedarray.h @@ -0,0 +1,119 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/scopedarray.h +// Purpose: scoped smart pointer class +// Author: Vadim Zeitlin +// Created: 2009-02-03 +// Copyright: (c) Jesse Lovelace and original Boost authors (see below) +// (c) 2009 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SCOPED_ARRAY_H_ +#define _WX_SCOPED_ARRAY_H_ + +#include "wx/defs.h" +#include "wx/checkeddelete.h" + +// ---------------------------------------------------------------------------- +// wxScopedArray: A scoped array +// ---------------------------------------------------------------------------- + +template <class T> +class wxScopedArray +{ +public: + typedef T element_type; + + wxEXPLICIT wxScopedArray(T * array = NULL) : m_array(array) { } + + ~wxScopedArray() { delete [] m_array; } + + // test for pointer validity: defining conversion to unspecified_bool_type + // and not more obvious bool to avoid implicit conversions to integer types + typedef T *(wxScopedArray<T>::*unspecified_bool_type)() const; + operator unspecified_bool_type() const + { + return m_array ? &wxScopedArray<T>::get : NULL; + } + + void reset(T *array = NULL) + { + if ( array != m_array ) + { + delete [] m_array; + m_array = array; + } + } + + T& operator[](size_t n) const { return m_array[n]; } + + T *get() const { return m_array; } + + void swap(wxScopedArray &other) + { + T * const tmp = other.m_array; + other.m_array = m_array; + m_array = tmp; + } + +private: + T *m_array; + + DECLARE_NO_COPY_TEMPLATE_CLASS(wxScopedArray, T) +}; + +// ---------------------------------------------------------------------------- +// old macro based implementation +// ---------------------------------------------------------------------------- + +// the same but for arrays instead of simple pointers +#define wxDECLARE_SCOPED_ARRAY(T, name)\ +class name \ +{ \ +private: \ + T * m_ptr; \ + name(name const &); \ + name & operator=(name const &); \ + \ +public: \ + wxEXPLICIT name(T * p = NULL) : m_ptr(p) \ + {} \ + \ + ~name(); \ + void reset(T * p = NULL); \ + \ + T & operator[](long int i) const\ + { \ + wxASSERT(m_ptr != NULL); \ + wxASSERT(i >= 0); \ + return m_ptr[i]; \ + } \ + \ + T * get() const \ + { \ + return m_ptr; \ + } \ + \ + void swap(name & ot) \ + { \ + T * tmp = ot.m_ptr; \ + ot.m_ptr = m_ptr; \ + m_ptr = tmp; \ + } \ +}; + +#define wxDEFINE_SCOPED_ARRAY(T, name) \ +name::~name() \ +{ \ + wxCHECKED_DELETE_ARRAY(m_ptr); \ +} \ +void name::reset(T * p){ \ + if (m_ptr != p) \ + { \ + wxCHECKED_DELETE_ARRAY(m_ptr); \ + m_ptr = p; \ + } \ +} + +#endif // _WX_SCOPED_ARRAY_H_ + diff --git a/wxmsw/include/wx-3.0/wx/scopedptr.h b/wxmsw/include/wx-3.0/wx/scopedptr.h new file mode 100644 index 00000000..5cc0c077 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/scopedptr.h @@ -0,0 +1,214 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/scopedptr.h +// Purpose: scoped smart pointer class +// Author: Jesse Lovelace <jllovela@eos.ncsu.edu> +// Created: 06/01/02 +// Copyright: (c) Jesse Lovelace and original Boost authors (see below) +// (c) 2009 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// This class closely follows the implementation of the boost +// library scoped_ptr and is an adaption for c++ macro's in +// the wxWidgets project. The original authors of the boost +// scoped_ptr are given below with their respective copyrights. + +// (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. +// Copyright (c) 2001, 2002 Peter Dimov +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +// See http://www.boost.org/libs/smart_ptr/scoped_ptr.htm for documentation. +// + +#ifndef _WX_SCOPED_PTR_H_ +#define _WX_SCOPED_PTR_H_ + +#include "wx/defs.h" +#include "wx/checkeddelete.h" + +// ---------------------------------------------------------------------------- +// wxScopedPtr: A scoped pointer +// ---------------------------------------------------------------------------- + +template <class T> +class wxScopedPtr +{ +public: + typedef T element_type; + + wxEXPLICIT wxScopedPtr(T * ptr = NULL) : m_ptr(ptr) { } + + ~wxScopedPtr() { wxCHECKED_DELETE(m_ptr); } + + // test for pointer validity: defining conversion to unspecified_bool_type + // and not more obvious bool to avoid implicit conversions to integer types +#ifdef __BORLANDC__ + // this compiler is too dumb to use unspecified_bool_type operator in tests + // of the form "if ( !ptr )" + typedef bool unspecified_bool_type; +#else + typedef T *(wxScopedPtr<T>::*unspecified_bool_type)() const; +#endif // __BORLANDC__ + operator unspecified_bool_type() const + { + return m_ptr ? &wxScopedPtr<T>::get : NULL; + } + + void reset(T * ptr = NULL) + { + if ( ptr != m_ptr ) + { + wxCHECKED_DELETE(m_ptr); + m_ptr = ptr; + } + } + + T *release() + { + T *ptr = m_ptr; + m_ptr = NULL; + return ptr; + } + + T & operator*() const + { + wxASSERT(m_ptr != NULL); + return *m_ptr; + } + + T * operator->() const + { + wxASSERT(m_ptr != NULL); + return m_ptr; + } + + T * get() const + { + return m_ptr; + } + + void swap(wxScopedPtr& other) + { + T * const tmp = other.m_ptr; + other.m_ptr = m_ptr; + m_ptr = tmp; + } + +private: + T * m_ptr; + + DECLARE_NO_COPY_TEMPLATE_CLASS(wxScopedPtr, T) +}; + +// ---------------------------------------------------------------------------- +// old macro based implementation +// ---------------------------------------------------------------------------- + +/* The type being used *must* be complete at the time + that wxDEFINE_SCOPED_* is called or a compiler error will result. + This is because the class checks for the completeness of the type + being used. */ + +#define wxDECLARE_SCOPED_PTR(T, name) \ +class name \ +{ \ +private: \ + T * m_ptr; \ + \ + name(name const &); \ + name & operator=(name const &); \ + \ +public: \ + wxEXPLICIT name(T * ptr = NULL) \ + : m_ptr(ptr) { } \ + \ + ~name(); \ + \ + void reset(T * ptr = NULL); \ + \ + T *release() \ + { \ + T *ptr = m_ptr; \ + m_ptr = NULL; \ + return ptr; \ + } \ + \ + T & operator*() const \ + { \ + wxASSERT(m_ptr != NULL); \ + return *m_ptr; \ + } \ + \ + T * operator->() const \ + { \ + wxASSERT(m_ptr != NULL); \ + return m_ptr; \ + } \ + \ + T * get() const \ + { \ + return m_ptr; \ + } \ + \ + void swap(name & ot) \ + { \ + T * tmp = ot.m_ptr; \ + ot.m_ptr = m_ptr; \ + m_ptr = tmp; \ + } \ +}; + +#define wxDEFINE_SCOPED_PTR(T, name)\ +void name::reset(T * ptr) \ +{ \ + if (m_ptr != ptr) \ + { \ + wxCHECKED_DELETE(m_ptr); \ + m_ptr = ptr; \ + } \ +} \ +name::~name() \ +{ \ + wxCHECKED_DELETE(m_ptr); \ +} + +// this macro can be used for the most common case when you want to declare and +// define the scoped pointer at the same time and want to use the standard +// naming convention: auto pointer to Foo is called FooPtr +#define wxDEFINE_SCOPED_PTR_TYPE(T) \ + wxDECLARE_SCOPED_PTR(T, T ## Ptr) \ + wxDEFINE_SCOPED_PTR(T, T ## Ptr) + +// ---------------------------------------------------------------------------- +// "Tied" scoped pointer: same as normal one but also sets the value of +// some other variable to the pointer value +// ---------------------------------------------------------------------------- + +#define wxDEFINE_TIED_SCOPED_PTR_TYPE(T) \ + wxDEFINE_SCOPED_PTR_TYPE(T) \ + class T ## TiedPtr : public T ## Ptr \ + { \ + public: \ + T ## TiedPtr(T **pp, T *p) \ + : T ## Ptr(p), m_pp(pp) \ + { \ + m_pOld = *pp; \ + *pp = p; \ + } \ + \ + ~ T ## TiedPtr() \ + { \ + *m_pp = m_pOld; \ + } \ + \ + private: \ + T **m_pp; \ + T *m_pOld; \ + }; + +#endif // _WX_SCOPED_PTR_H_ + diff --git a/wxmsw/include/wx-3.0/wx/scopeguard.h b/wxmsw/include/wx-3.0/wx/scopeguard.h new file mode 100644 index 00000000..83bc1b51 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/scopeguard.h @@ -0,0 +1,550 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/scopeguard.h +// Purpose: declares wxwxScopeGuard and related macros +// Author: Vadim Zeitlin +// Modified by: +// Created: 03.07.2003 +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/* + Acknowledgements: this header is heavily based on (well, almost the exact + copy of) ScopeGuard.h by Andrei Alexandrescu and Petru Marginean published + in December 2000 issue of C/C++ Users Journal. + http://www.cuj.com/documents/cujcexp1812alexandr/ + */ + +#ifndef _WX_SCOPEGUARD_H_ +#define _WX_SCOPEGUARD_H_ + +#include "wx/defs.h" + +#include "wx/except.h" + +// ---------------------------------------------------------------------------- +// helpers +// ---------------------------------------------------------------------------- + +#ifdef __WATCOMC__ + +// WATCOM-FIXME: C++ of Open Watcom 1.3 doesn't like OnScopeExit() created +// through template so it must be workarounded with dedicated inlined macro. +// For compatibility with Watcom compilers wxPrivate::OnScopeExit must be +// replaced with wxPrivateOnScopeExit but in user code (for everyone who +// doesn't care about OW compatibility) wxPrivate::OnScopeExit still works. + +#define wxPrivateOnScopeExit(guard) \ + { \ + if ( !(guard).WasDismissed() ) \ + { \ + wxTRY \ + { \ + (guard).Execute(); \ + } \ + wxCATCH_ALL(;) \ + } \ + } + +#define wxPrivateUse(n) wxUnusedVar(n) + +#else + +namespace wxPrivate +{ + // in the original implementation this was a member template function of + // ScopeGuardImplBase but gcc 2.8 which is still used for OS/2 doesn't + // support member templates and so we must make it global + template <class ScopeGuardImpl> + void OnScopeExit(ScopeGuardImpl& guard) + { + if ( !guard.WasDismissed() ) + { + // we're called from ScopeGuardImpl dtor and so we must not throw + wxTRY + { + guard.Execute(); + } + wxCATCH_ALL(;) // do nothing, just eat the exception + } + } + + // just to avoid the warning about unused variables + template <class T> + void Use(const T& WXUNUSED(t)) + { + } +} // namespace wxPrivate + +#define wxPrivateOnScopeExit(n) wxPrivate::OnScopeExit(n) +#define wxPrivateUse(n) wxPrivate::Use(n) + +#endif + +// ============================================================================ +// wxScopeGuard for functions and functors +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxScopeGuardImplBase: used by wxScopeGuardImpl[0..N] below +// ---------------------------------------------------------------------------- + +class wxScopeGuardImplBase +{ +public: + wxScopeGuardImplBase() : m_wasDismissed(false) { } + + wxScopeGuardImplBase(const wxScopeGuardImplBase& other) + : m_wasDismissed(other.m_wasDismissed) + { + other.Dismiss(); + } + + void Dismiss() const { m_wasDismissed = true; } + + // for OnScopeExit() only (we can't make it friend, unfortunately)! + bool WasDismissed() const { return m_wasDismissed; } + +protected: + ~wxScopeGuardImplBase() { } + + // must be mutable for copy ctor to work + mutable bool m_wasDismissed; + +private: + wxScopeGuardImplBase& operator=(const wxScopeGuardImplBase&); +}; + +// wxScopeGuard is just a reference, see the explanation in CUJ article +typedef const wxScopeGuardImplBase& wxScopeGuard; + +// ---------------------------------------------------------------------------- +// wxScopeGuardImpl0: scope guard for actions without parameters +// ---------------------------------------------------------------------------- + +template <class F> +class wxScopeGuardImpl0 : public wxScopeGuardImplBase +{ +public: + static wxScopeGuardImpl0<F> MakeGuard(F fun) + { + return wxScopeGuardImpl0<F>(fun); + } + + ~wxScopeGuardImpl0() { wxPrivateOnScopeExit(*this); } + + void Execute() { m_fun(); } + +protected: + wxScopeGuardImpl0(F fun) : m_fun(fun) { } + + F m_fun; + + wxScopeGuardImpl0& operator=(const wxScopeGuardImpl0&); +}; + +template <class F> +inline wxScopeGuardImpl0<F> wxMakeGuard(F fun) +{ + return wxScopeGuardImpl0<F>::MakeGuard(fun); +} + +// ---------------------------------------------------------------------------- +// wxScopeGuardImpl1: scope guard for actions with 1 parameter +// ---------------------------------------------------------------------------- + +template <class F, class P1> +class wxScopeGuardImpl1 : public wxScopeGuardImplBase +{ +public: + static wxScopeGuardImpl1<F, P1> MakeGuard(F fun, P1 p1) + { + return wxScopeGuardImpl1<F, P1>(fun, p1); + } + + ~wxScopeGuardImpl1() { wxPrivateOnScopeExit(* this); } + + void Execute() { m_fun(m_p1); } + +protected: + wxScopeGuardImpl1(F fun, P1 p1) : m_fun(fun), m_p1(p1) { } + + F m_fun; + const P1 m_p1; + + wxScopeGuardImpl1& operator=(const wxScopeGuardImpl1&); +}; + +template <class F, class P1> +inline wxScopeGuardImpl1<F, P1> wxMakeGuard(F fun, P1 p1) +{ + return wxScopeGuardImpl1<F, P1>::MakeGuard(fun, p1); +} + +// ---------------------------------------------------------------------------- +// wxScopeGuardImpl2: scope guard for actions with 2 parameters +// ---------------------------------------------------------------------------- + +template <class F, class P1, class P2> +class wxScopeGuardImpl2 : public wxScopeGuardImplBase +{ +public: + static wxScopeGuardImpl2<F, P1, P2> MakeGuard(F fun, P1 p1, P2 p2) + { + return wxScopeGuardImpl2<F, P1, P2>(fun, p1, p2); + } + + ~wxScopeGuardImpl2() { wxPrivateOnScopeExit(*this); } + + void Execute() { m_fun(m_p1, m_p2); } + +protected: + wxScopeGuardImpl2(F fun, P1 p1, P2 p2) : m_fun(fun), m_p1(p1), m_p2(p2) { } + + F m_fun; + const P1 m_p1; + const P2 m_p2; + + wxScopeGuardImpl2& operator=(const wxScopeGuardImpl2&); +}; + +template <class F, class P1, class P2> +inline wxScopeGuardImpl2<F, P1, P2> wxMakeGuard(F fun, P1 p1, P2 p2) +{ + return wxScopeGuardImpl2<F, P1, P2>::MakeGuard(fun, p1, p2); +} + +// ---------------------------------------------------------------------------- +// wxScopeGuardImpl3: scope guard for actions with 3 parameters +// ---------------------------------------------------------------------------- + +template <class F, class P1, class P2, class P3> +class wxScopeGuardImpl3 : public wxScopeGuardImplBase +{ +public: + static wxScopeGuardImpl3<F, P1, P2, P3> MakeGuard(F fun, P1 p1, P2 p2, P3 p3) + { + return wxScopeGuardImpl3<F, P1, P2, P3>(fun, p1, p2, p3); + } + + ~wxScopeGuardImpl3() { wxPrivateOnScopeExit(*this); } + + void Execute() { m_fun(m_p1, m_p2, m_p3); } + +protected: + wxScopeGuardImpl3(F fun, P1 p1, P2 p2, P3 p3) + : m_fun(fun), m_p1(p1), m_p2(p2), m_p3(p3) { } + + F m_fun; + const P1 m_p1; + const P2 m_p2; + const P3 m_p3; + + wxScopeGuardImpl3& operator=(const wxScopeGuardImpl3&); +}; + +template <class F, class P1, class P2, class P3> +inline wxScopeGuardImpl3<F, P1, P2, P3> wxMakeGuard(F fun, P1 p1, P2 p2, P3 p3) +{ + return wxScopeGuardImpl3<F, P1, P2, P3>::MakeGuard(fun, p1, p2, p3); +} + +// ============================================================================ +// wxScopeGuards for object methods +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxObjScopeGuardImpl0 +// ---------------------------------------------------------------------------- + +template <class Obj, class MemFun> +class wxObjScopeGuardImpl0 : public wxScopeGuardImplBase +{ +public: + static wxObjScopeGuardImpl0<Obj, MemFun> + MakeObjGuard(Obj& obj, MemFun memFun) + { + return wxObjScopeGuardImpl0<Obj, MemFun>(obj, memFun); + } + + ~wxObjScopeGuardImpl0() { wxPrivateOnScopeExit(*this); } + + void Execute() { (m_obj.*m_memfun)(); } + +protected: + wxObjScopeGuardImpl0(Obj& obj, MemFun memFun) + : m_obj(obj), m_memfun(memFun) { } + + Obj& m_obj; + MemFun m_memfun; +}; + +template <class Obj, class MemFun> +inline wxObjScopeGuardImpl0<Obj, MemFun> wxMakeObjGuard(Obj& obj, MemFun memFun) +{ + return wxObjScopeGuardImpl0<Obj, MemFun>::MakeObjGuard(obj, memFun); +} + +template <class Obj, class MemFun, class P1> +class wxObjScopeGuardImpl1 : public wxScopeGuardImplBase +{ +public: + static wxObjScopeGuardImpl1<Obj, MemFun, P1> + MakeObjGuard(Obj& obj, MemFun memFun, P1 p1) + { + return wxObjScopeGuardImpl1<Obj, MemFun, P1>(obj, memFun, p1); + } + + ~wxObjScopeGuardImpl1() { wxPrivateOnScopeExit(*this); } + + void Execute() { (m_obj.*m_memfun)(m_p1); } + +protected: + wxObjScopeGuardImpl1(Obj& obj, MemFun memFun, P1 p1) + : m_obj(obj), m_memfun(memFun), m_p1(p1) { } + + Obj& m_obj; + MemFun m_memfun; + const P1 m_p1; +}; + +template <class Obj, class MemFun, class P1> +inline wxObjScopeGuardImpl1<Obj, MemFun, P1> +wxMakeObjGuard(Obj& obj, MemFun memFun, P1 p1) +{ + return wxObjScopeGuardImpl1<Obj, MemFun, P1>::MakeObjGuard(obj, memFun, p1); +} + +template <class Obj, class MemFun, class P1, class P2> +class wxObjScopeGuardImpl2 : public wxScopeGuardImplBase +{ +public: + static wxObjScopeGuardImpl2<Obj, MemFun, P1, P2> + MakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2) + { + return wxObjScopeGuardImpl2<Obj, MemFun, P1, P2>(obj, memFun, p1, p2); + } + + ~wxObjScopeGuardImpl2() { wxPrivateOnScopeExit(*this); } + + void Execute() { (m_obj.*m_memfun)(m_p1, m_p2); } + +protected: + wxObjScopeGuardImpl2(Obj& obj, MemFun memFun, P1 p1, P2 p2) + : m_obj(obj), m_memfun(memFun), m_p1(p1), m_p2(p2) { } + + Obj& m_obj; + MemFun m_memfun; + const P1 m_p1; + const P2 m_p2; +}; + +template <class Obj, class MemFun, class P1, class P2> +inline wxObjScopeGuardImpl2<Obj, MemFun, P1, P2> +wxMakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2) +{ + return wxObjScopeGuardImpl2<Obj, MemFun, P1, P2>:: + MakeObjGuard(obj, memFun, p1, p2); +} + +template <class Obj, class MemFun, class P1, class P2, class P3> +class wxObjScopeGuardImpl3 : public wxScopeGuardImplBase +{ +public: + static wxObjScopeGuardImpl3<Obj, MemFun, P1, P2, P3> + MakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2, P3 p3) + { + return wxObjScopeGuardImpl3<Obj, MemFun, P1, P2, P3>(obj, memFun, p1, p2, p3); + } + + ~wxObjScopeGuardImpl3() { wxPrivateOnScopeExit(*this); } + + void Execute() { (m_obj.*m_memfun)(m_p1, m_p2, m_p3); } + +protected: + wxObjScopeGuardImpl3(Obj& obj, MemFun memFun, P1 p1, P2 p2, P3 p3) + : m_obj(obj), m_memfun(memFun), m_p1(p1), m_p2(p2), m_p3(p3) { } + + Obj& m_obj; + MemFun m_memfun; + const P1 m_p1; + const P2 m_p2; + const P3 m_p3; +}; + +template <class Obj, class MemFun, class P1, class P2, class P3> +inline wxObjScopeGuardImpl3<Obj, MemFun, P1, P2, P3> +wxMakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2, P3 p3) +{ + return wxObjScopeGuardImpl3<Obj, MemFun, P1, P2, P3>:: + MakeObjGuard(obj, memFun, p1, p2, p3); +} + +// ---------------------------------------------------------------------------- +// wxVariableSetter: use the same technique as for wxScopeGuard to allow +// setting a variable to some value on block exit +// ---------------------------------------------------------------------------- + +namespace wxPrivate +{ + +// empty class just to be able to define a reference to it +class VariableSetterBase : public wxScopeGuardImplBase { }; + +typedef const VariableSetterBase& VariableSetter; + +template <typename T, typename U> +class VariableSetterImpl : public VariableSetterBase +{ +public: + VariableSetterImpl(T& var, U value) + : m_var(var), + m_value(value) + { + } + + ~VariableSetterImpl() { wxPrivateOnScopeExit(*this); } + + void Execute() { m_var = m_value; } + +private: + T& m_var; + const U m_value; + + // suppress the warning about assignment operator not being generated + VariableSetterImpl<T, U>& operator=(const VariableSetterImpl<T, U>&); +}; + +template <typename T> +class VariableNullerImpl : public VariableSetterBase +{ +public: + VariableNullerImpl(T& var) + : m_var(var) + { + } + + ~VariableNullerImpl() { wxPrivateOnScopeExit(*this); } + + void Execute() { m_var = NULL; } + +private: + T& m_var; + + VariableNullerImpl<T>& operator=(const VariableNullerImpl<T>&); +}; + +} // namespace wxPrivate + +template <typename T, typename U> +inline +wxPrivate::VariableSetterImpl<T, U> wxMakeVarSetter(T& var, U value) +{ + return wxPrivate::VariableSetterImpl<T, U>(var, value); +} + +// calling wxMakeVarSetter(ptr, NULL) doesn't work because U is deduced to be +// "int" and subsequent assignment of "U" to "T *" fails, so provide a special +// function for this special case +template <typename T> +inline +wxPrivate::VariableNullerImpl<T> wxMakeVarNuller(T& var) +{ + return wxPrivate::VariableNullerImpl<T>(var); +} + +// ============================================================================ +// macros for declaring unnamed scoped guards (which can't be dismissed) +// ============================================================================ + +// NB: the original code has a single (and much nicer) ON_BLOCK_EXIT macro +// but this results in compiler warnings about unused variables and I +// didn't find a way to work around this other than by having different +// macros with different names or using a less natural syntax for passing +// the arguments (e.g. as Boost preprocessor sequences, which would mean +// having to write wxON_BLOCK_EXIT(fwrite, (buf)(size)(n)(fp)) instead of +// wxON_BLOCK_EXIT4(fwrite, buf, size, n, fp)). + +#define wxGuardName wxMAKE_UNIQUE_NAME(wxScopeGuard) + +#define wxON_BLOCK_EXIT0_IMPL(n, f) \ + wxScopeGuard n = wxMakeGuard(f); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT0(f) \ + wxON_BLOCK_EXIT0_IMPL(wxGuardName, f) + +#define wxON_BLOCK_EXIT_OBJ0_IMPL(n, o, m) \ + wxScopeGuard n = wxMakeObjGuard(o, m); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT_OBJ0(o, m) \ + wxON_BLOCK_EXIT_OBJ0_IMPL(wxGuardName, o, &m) + +#define wxON_BLOCK_EXIT_THIS0(m) \ + wxON_BLOCK_EXIT_OBJ0(*this, m) + + +#define wxON_BLOCK_EXIT1_IMPL(n, f, p1) \ + wxScopeGuard n = wxMakeGuard(f, p1); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT1(f, p1) \ + wxON_BLOCK_EXIT1_IMPL(wxGuardName, f, p1) + +#define wxON_BLOCK_EXIT_OBJ1_IMPL(n, o, m, p1) \ + wxScopeGuard n = wxMakeObjGuard(o, m, p1); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT_OBJ1(o, m, p1) \ + wxON_BLOCK_EXIT_OBJ1_IMPL(wxGuardName, o, &m, p1) + +#define wxON_BLOCK_EXIT_THIS1(m, p1) \ + wxON_BLOCK_EXIT_OBJ1(*this, m, p1) + + +#define wxON_BLOCK_EXIT2_IMPL(n, f, p1, p2) \ + wxScopeGuard n = wxMakeGuard(f, p1, p2); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT2(f, p1, p2) \ + wxON_BLOCK_EXIT2_IMPL(wxGuardName, f, p1, p2) + +#define wxON_BLOCK_EXIT_OBJ2_IMPL(n, o, m, p1, p2) \ + wxScopeGuard n = wxMakeObjGuard(o, m, p1, p2); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT_OBJ2(o, m, p1, p2) \ + wxON_BLOCK_EXIT_OBJ2_IMPL(wxGuardName, o, &m, p1, p2) + +#define wxON_BLOCK_EXIT_THIS2(m, p1, p2) \ + wxON_BLOCK_EXIT_OBJ2(*this, m, p1, p2) + + +#define wxON_BLOCK_EXIT3_IMPL(n, f, p1, p2, p3) \ + wxScopeGuard n = wxMakeGuard(f, p1, p2, p3); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT3(f, p1, p2, p3) \ + wxON_BLOCK_EXIT3_IMPL(wxGuardName, f, p1, p2, p3) + +#define wxON_BLOCK_EXIT_OBJ3_IMPL(n, o, m, p1, p2, p3) \ + wxScopeGuard n = wxMakeObjGuard(o, m, p1, p2, p3); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT_OBJ3(o, m, p1, p2, p3) \ + wxON_BLOCK_EXIT_OBJ3_IMPL(wxGuardName, o, &m, p1, p2, p3) + +#define wxON_BLOCK_EXIT_THIS3(m, p1, p2, p3) \ + wxON_BLOCK_EXIT_OBJ3(*this, m, p1, p2, p3) + + +#define wxSetterName wxMAKE_UNIQUE_NAME(wxVarSetter) + +#define wxON_BLOCK_EXIT_SET_IMPL(n, var, value) \ + wxPrivate::VariableSetter n = wxMakeVarSetter(var, value); \ + wxPrivateUse(n) + +#define wxON_BLOCK_EXIT_SET(var, value) \ + wxON_BLOCK_EXIT_SET_IMPL(wxSetterName, var, value) + +#define wxON_BLOCK_EXIT_NULL_IMPL(n, var) \ + wxPrivate::VariableSetter n = wxMakeVarNuller(var); \ + wxPrivateUse(n) + +#define wxON_BLOCK_EXIT_NULL(ptr) \ + wxON_BLOCK_EXIT_NULL_IMPL(wxSetterName, ptr) + +#endif // _WX_SCOPEGUARD_H_ diff --git a/wxmsw/include/wx-3.0/wx/scrolbar.h b/wxmsw/include/wx-3.0/wx/scrolbar.h new file mode 100644 index 00000000..21f2d75a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/scrolbar.h @@ -0,0 +1,86 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/scrolbar.h +// Purpose: wxScrollBar base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SCROLBAR_H_BASE_ +#define _WX_SCROLBAR_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_SCROLLBAR + +#include "wx/control.h" + +extern WXDLLIMPEXP_DATA_CORE(const char) wxScrollBarNameStr[]; + +// ---------------------------------------------------------------------------- +// wxScrollBar: a scroll bar control +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxScrollBarBase : public wxControl +{ +public: + wxScrollBarBase() { } + + /* + Derived classes should provide the following method and ctor with the + same parameters: + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSB_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxScrollBarNameStr); + */ + + // accessors + virtual int GetThumbPosition() const = 0; + virtual int GetThumbSize() const = 0; + virtual int GetPageSize() const = 0; + virtual int GetRange() const = 0; + + bool IsVertical() const { return (m_windowStyle & wxVERTICAL) != 0; } + + // operations + virtual void SetThumbPosition(int viewStart) = 0; + virtual void SetScrollbar(int position, int thumbSize, + int range, int pageSize, + bool refresh = true) = 0; + + // implementation-only + bool IsNeeded() const { return GetRange() > GetThumbSize(); } + +private: + wxDECLARE_NO_COPY_CLASS(wxScrollBarBase); +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/scrolbar.h" +#elif defined(__WXMSW__) + #include "wx/msw/scrolbar.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/scrolbar.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/scrolbar.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/scrolbar.h" +#elif defined(__WXMAC__) + #include "wx/osx/scrolbar.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/scrolbar.h" +#elif defined(__WXPM__) + #include "wx/os2/scrolbar.h" +#endif + +#endif // wxUSE_SCROLLBAR + +#endif + // _WX_SCROLBAR_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/scrolwin.h b/wxmsw/include/wx-3.0/wx/scrolwin.h new file mode 100644 index 00000000..37096992 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/scrolwin.h @@ -0,0 +1,494 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/scrolwin.h +// Purpose: wxScrolledWindow, wxScrolledControl and wxScrollHelper +// Author: Vadim Zeitlin +// Modified by: +// Created: 30.08.00 +// Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SCROLWIN_H_BASE_ +#define _WX_SCROLWIN_H_BASE_ + +#include "wx/panel.h" + +class WXDLLIMPEXP_FWD_CORE wxScrollHelperEvtHandler; +class WXDLLIMPEXP_FWD_BASE wxTimer; + +// default scrolled window style: scroll in both directions +#define wxScrolledWindowStyle (wxHSCROLL | wxVSCROLL) + +// values for the second argument of wxScrollHelper::ShowScrollbars() +enum wxScrollbarVisibility +{ + wxSHOW_SB_NEVER = -1, // never show the scrollbar at all + wxSHOW_SB_DEFAULT, // show scrollbar only if it is needed + wxSHOW_SB_ALWAYS // always show scrollbar, even if not needed +}; + +// ---------------------------------------------------------------------------- +// The hierarchy of scrolling classes is a bit complicated because we want to +// put as much functionality as possible in a mix-in class not deriving from +// wxWindow so that other classes could derive from the same base class on all +// platforms irrespectively of whether they are native controls (and hence +// don't use our scrolling) or not. +// +// So we have +// +// wxAnyScrollHelperBase +// | +// | +// \|/ +// wxScrollHelperBase +// | +// | +// \|/ +// wxWindow wxScrollHelper +// | \ / / +// | \ / / +// | _| |_ / +// | wxScrolledWindow / +// | / +// \|/ / +// wxControl / +// \ / +// \ / +// _| |_ +// wxScrolledControl +// +// ---------------------------------------------------------------------------- + +// This class allows reusing some of wxScrollHelperBase functionality in +// wxVarScrollHelperBase in wx/vscroll.h without duplicating its code. +class WXDLLIMPEXP_CORE wxAnyScrollHelperBase +{ +public: + wxEXPLICIT wxAnyScrollHelperBase(wxWindow* win); + virtual ~wxAnyScrollHelperBase() {} + + // Disable use of keyboard keys for scrolling. By default cursor movement + // keys (including Home, End, Page Up and Down) are used to scroll the + // window appropriately. If the derived class uses these keys for something + // else, e.g. changing the currently selected item, this function can be + // used to disable this behaviour as it's not only not necessary then but + // can actually be actively harmful if another object forwards a keyboard + // event corresponding to one of the above keys to us using + // ProcessWindowEvent() because the event will always be processed which + // can be undesirable. + void DisableKeyboardScrolling() { m_kbdScrollingEnabled = false; } + + // Override this function to draw the graphic (or just process EVT_PAINT) + virtual void OnDraw(wxDC& WXUNUSED(dc)) { } + + // change the DC origin according to the scroll position. + virtual void DoPrepareDC(wxDC& dc) = 0; + + // Simple accessor for the window that is really being scrolled. + wxWindow *GetTargetWindow() const { return m_targetWindow; } + + + // The methods called from the window event handlers. + void HandleOnChar(wxKeyEvent& event); + void HandleOnPaint(wxPaintEvent& event); + +protected: + // the window that receives the scroll events and the window to actually + // scroll, respectively + wxWindow *m_win, + *m_targetWindow; + + // whether cursor keys should scroll the window + bool m_kbdScrollingEnabled; +}; + +// This is the class containing the guts of (uniform) scrolling logic. +class WXDLLIMPEXP_CORE wxScrollHelperBase : public wxAnyScrollHelperBase +{ +public: + // ctor must be given the associated window + wxScrollHelperBase(wxWindow *winToScroll); + virtual ~wxScrollHelperBase(); + + // configure the scrolling + virtual void SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY, + int noUnitsX, int noUnitsY, + int xPos = 0, int yPos = 0, + bool noRefresh = false ); + + // scroll to the given (in logical coords) position + // + // notice that for backwards compatibility reasons Scroll() is virtual as + // the existing code could override it but new code should override + // DoScroll() instead + virtual void Scroll(int x, int y) { DoScroll(x, y); } + virtual void Scroll(const wxPoint& pt) { DoScroll(pt.x, pt.y); } + + // get/set the page size for this orientation (wxVERTICAL/wxHORIZONTAL) + int GetScrollPageSize(int orient) const; + void SetScrollPageSize(int orient, int pageSize); + + // get the number of lines the window can scroll, + // returns 0 if no scrollbars are there. + int GetScrollLines( int orient ) const; + + // Set the x, y scrolling increments. + void SetScrollRate( int xstep, int ystep ); + + // get the size of one logical unit in physical ones + void GetScrollPixelsPerUnit(int *pixelsPerUnitX, int *pixelsPerUnitY) const; + + // Set scrollbar visibility: it is possible to show scrollbar only if it is + // needed (i.e. if our virtual size is greater than the current size of the + // associated window), always (as wxALWAYS_SHOW_SB style does) or never (in + // which case you should provide some other way to scroll the window as the + // user wouldn't be able to do it at all) + void ShowScrollbars(wxScrollbarVisibility horz, wxScrollbarVisibility vert) + { + DoShowScrollbars(horz, vert); + } + + // Test whether the specified scrollbar is shown. + virtual bool IsScrollbarShown(int orient) const = 0; + + // Enable/disable Windows scrolling in either direction. If true, wxWidgets + // scrolls the canvas and only a bit of the canvas is invalidated; no + // Clear() is necessary. If false, the whole canvas is invalidated and a + // Clear() is necessary. Disable for when the scroll increment is used to + // actually scroll a non-constant distance + // + // Notice that calling this method with a false argument doesn't disable + // scrolling the window in this direction, it just changes the mechanism by + // which it is implemented to not use wxWindow::ScrollWindow(). + virtual void EnableScrolling(bool x_scrolling, bool y_scrolling); + + // Get the view start + void GetViewStart(int *x, int *y) const { DoGetViewStart(x, y); } + + wxPoint GetViewStart() const + { + wxPoint pt; + DoGetViewStart(&pt.x, &pt.y); + return pt; + } + + // Set the scale factor, used in PrepareDC + void SetScale(double xs, double ys) { m_scaleX = xs; m_scaleY = ys; } + double GetScaleX() const { return m_scaleX; } + double GetScaleY() const { return m_scaleY; } + + // translate between scrolled and unscrolled coordinates + void CalcScrolledPosition(int x, int y, int *xx, int *yy) const + { DoCalcScrolledPosition(x, y, xx, yy); } + wxPoint CalcScrolledPosition(const wxPoint& pt) const + { + wxPoint p2; + DoCalcScrolledPosition(pt.x, pt.y, &p2.x, &p2.y); + return p2; + } + + void CalcUnscrolledPosition(int x, int y, int *xx, int *yy) const + { DoCalcUnscrolledPosition(x, y, xx, yy); } + wxPoint CalcUnscrolledPosition(const wxPoint& pt) const + { + wxPoint p2; + DoCalcUnscrolledPosition(pt.x, pt.y, &p2.x, &p2.y); + return p2; + } + + void DoCalcScrolledPosition(int x, int y, int *xx, int *yy) const; + void DoCalcUnscrolledPosition(int x, int y, int *xx, int *yy) const; + + // Adjust the scrollbars + virtual void AdjustScrollbars() = 0; + + // Calculate scroll increment + int CalcScrollInc(wxScrollWinEvent& event); + + // Normally the wxScrolledWindow will scroll itself, but in some rare + // occasions you might want it to scroll [part of] another window (e.g. a + // child of it in order to scroll only a portion the area between the + // scrollbars (spreadsheet: only cell area will move). + void SetTargetWindow(wxWindow *target); + + void SetTargetRect(const wxRect& rect) { m_rectToScroll = rect; } + wxRect GetTargetRect() const { return m_rectToScroll; } + + virtual void DoPrepareDC(wxDC& dc); + + // are we generating the autoscroll events? + bool IsAutoScrolling() const { return m_timerAutoScroll != NULL; } + + // stop generating the scroll events when mouse is held outside the window + void StopAutoScrolling(); + + // this method can be overridden in a derived class to forbid sending the + // auto scroll events - note that unlike StopAutoScrolling() it doesn't + // stop the timer, so it will be called repeatedly and will typically + // return different values depending on the current mouse position + // + // the base class version just returns true + virtual bool SendAutoScrollEvents(wxScrollWinEvent& event) const; + + // the methods to be called from the window event handlers + void HandleOnScroll(wxScrollWinEvent& event); + void HandleOnSize(wxSizeEvent& event); + void HandleOnMouseEnter(wxMouseEvent& event); + void HandleOnMouseLeave(wxMouseEvent& event); +#if wxUSE_MOUSEWHEEL + void HandleOnMouseWheel(wxMouseEvent& event); +#endif // wxUSE_MOUSEWHEEL + void HandleOnChildFocus(wxChildFocusEvent& event); + +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED( + void OnScroll(wxScrollWinEvent& event) { HandleOnScroll(event); } + ) +#endif // WXWIN_COMPATIBILITY_2_8 + +protected: + // get pointer to our scroll rect if we use it or NULL + const wxRect *GetScrollRect() const + { + return m_rectToScroll.width != 0 ? &m_rectToScroll : NULL; + } + + // get the size of the target window + wxSize GetTargetSize() const + { + return m_rectToScroll.width != 0 ? m_rectToScroll.GetSize() + : m_targetWindow->GetClientSize(); + } + + void GetTargetSize(int *w, int *h) const + { + wxSize size = GetTargetSize(); + if ( w ) + *w = size.x; + if ( h ) + *h = size.y; + } + + // implementation of public methods with the same name + virtual void DoGetViewStart(int *x, int *y) const; + virtual void DoScroll(int x, int y) = 0; + virtual void DoShowScrollbars(wxScrollbarVisibility horz, + wxScrollbarVisibility vert) = 0; + + // implementations of various wxWindow virtual methods which should be + // forwarded to us (this can be done by WX_FORWARD_TO_SCROLL_HELPER()) + bool ScrollLayout(); + void ScrollDoSetVirtualSize(int x, int y); + wxSize ScrollGetBestVirtualSize() const; + + // change just the target window (unlike SetWindow which changes m_win as + // well) + void DoSetTargetWindow(wxWindow *target); + + // delete the event handler we installed + void DeleteEvtHandler(); + + // this function should be overridden to return the size available for + // m_targetWindow inside m_win of the given size + // + // the default implementation is only good for m_targetWindow == m_win + // case, if we're scrolling a subwindow you must override this method + virtual wxSize GetSizeAvailableForScrollTarget(const wxSize& size) + { + // returning just size from here is wrong but it was decided that it is + // not wrong enough to break the existing code (which doesn't override + // this recently added function at all) by adding this assert + // + // wxASSERT_MSG( m_targetWindow == m_win, "must be overridden" ); + + return size; + } + + + double m_scaleX; + double m_scaleY; + + wxRect m_rectToScroll; + + wxTimer *m_timerAutoScroll; + + // The number of pixels to scroll in horizontal and vertical directions + // respectively. + // + // If 0, means that the scrolling in the given direction is disabled. + int m_xScrollPixelsPerLine; + int m_yScrollPixelsPerLine; + int m_xScrollPosition; + int m_yScrollPosition; + int m_xScrollLines; + int m_yScrollLines; + int m_xScrollLinesPerPage; + int m_yScrollLinesPerPage; + + bool m_xScrollingEnabled; + bool m_yScrollingEnabled; + +#if wxUSE_MOUSEWHEEL + int m_wheelRotation; +#endif // wxUSE_MOUSEWHEEL + + wxScrollHelperEvtHandler *m_handler; + + wxDECLARE_NO_COPY_CLASS(wxScrollHelperBase); +}; + +// this macro can be used in a wxScrollHelper-derived class to forward wxWindow +// methods to corresponding wxScrollHelper methods +#define WX_FORWARD_TO_SCROLL_HELPER() \ +public: \ + virtual void PrepareDC(wxDC& dc) { DoPrepareDC(dc); } \ + virtual bool Layout() { return ScrollLayout(); } \ + virtual bool CanScroll(int orient) const \ + { return IsScrollbarShown(orient); } \ + virtual void DoSetVirtualSize(int x, int y) \ + { ScrollDoSetVirtualSize(x, y); } \ + virtual wxSize GetBestVirtualSize() const \ + { return ScrollGetBestVirtualSize(); } + +// include the declaration of the real wxScrollHelper +#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/scrolwin.h" +#elif defined(__WXGTK__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk1/scrolwin.h" +#else + #define wxHAS_GENERIC_SCROLLWIN + #include "wx/generic/scrolwin.h" +#endif + +// ---------------------------------------------------------------------------- +// wxScrolled<T>: a wxWindow which knows how to scroll +// ---------------------------------------------------------------------------- + +// helper class for wxScrolled<T> below +struct WXDLLIMPEXP_CORE wxScrolledT_Helper +{ + static wxSize FilterBestSize(const wxWindow *win, + const wxScrollHelper *helper, + const wxSize& origBest); +#ifdef __WXMSW__ + static WXLRESULT FilterMSWWindowProc(WXUINT nMsg, WXLRESULT origResult); +#endif +}; + +// Scrollable window base on window type T. This used to be wxScrolledWindow, +// but wxScrolledWindow includes wxControlContainer functionality and that's +// not always desirable. +template<class T> +class wxScrolled : public T, + public wxScrollHelper, + private wxScrolledT_Helper +{ +public: + wxScrolled() : wxScrollHelper(this) { } + wxScrolled(wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxScrolledWindowStyle, + const wxString& name = wxPanelNameStr) + : wxScrollHelper(this) + { + Create(parent, winid, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID winid, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxScrolledWindowStyle, + const wxString& name = wxPanelNameStr) + { + m_targetWindow = this; + +#ifdef __WXMAC__ + this->MacSetClipChildren(true); +#endif + + // by default, we're scrollable in both directions (but if one of the + // styles is specified explicitly, we shouldn't add the other one + // automatically) + if ( !(style & (wxHSCROLL | wxVSCROLL)) ) + style |= wxHSCROLL | wxVSCROLL; + +#ifdef __WXOSX__ + bool retval = T::Create(parent, winid, pos, size, style, name); + if ( retval && (style & wxALWAYS_SHOW_SB) ) + ShowScrollbars(wxSHOW_SB_ALWAYS, wxSHOW_SB_ALWAYS); + return retval; +#else + if ( style & wxALWAYS_SHOW_SB ) + ShowScrollbars(wxSHOW_SB_ALWAYS, wxSHOW_SB_ALWAYS); + + return T::Create(parent, winid, pos, size, style, name); +#endif + } + +#ifdef __WXMSW__ + // we need to return a special WM_GETDLGCODE value to process just the + // arrows but let the other navigation characters through + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) + { + return FilterMSWWindowProc(nMsg, T::MSWWindowProc(nMsg, wParam, lParam)); + } + + // Take into account the scroll origin. + virtual void MSWAdjustBrushOrg(int* xOrg, int* yOrg) const + { + CalcUnscrolledPosition(*xOrg, *yOrg, xOrg, yOrg); + } +#endif // __WXMSW__ + + WX_FORWARD_TO_SCROLL_HELPER() + +protected: + virtual wxSize DoGetBestSize() const + { + return FilterBestSize(this, this, T::DoGetBestSize()); + } + +private: + // VC++ 6 gives warning for the declaration of template member function + // without definition +#ifndef __VISUALC6__ + wxDECLARE_NO_COPY_CLASS(wxScrolled); +#endif +}; + +#ifdef __VISUALC6__ + // disable the warning about non dll-interface class used as base for + // dll-interface class: it's harmless in this case + #pragma warning(push) + #pragma warning(disable:4275) +#endif + +// for compatibility with existing code, we provide wxScrolledWindow +// "typedef" for wxScrolled<wxPanel>. It's not a real typedef because we +// want wxScrolledWindow to show in wxRTTI information (the class is widely +// used and likelihood of its wxRTTI information being used too is high): +class WXDLLIMPEXP_CORE wxScrolledWindow : public wxScrolled<wxPanel> +{ +public: + wxScrolledWindow() : wxScrolled<wxPanel>() {} + wxScrolledWindow(wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxScrolledWindowStyle, + const wxString& name = wxPanelNameStr) + : wxScrolled<wxPanel>(parent, winid, pos, size, style, name) {} + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxScrolledWindow) +}; + +typedef wxScrolled<wxWindow> wxScrolledCanvas; + +#ifdef __VISUALC6__ + #pragma warning(pop) +#endif + +#endif // _WX_SCROLWIN_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/selstore.h b/wxmsw/include/wx-3.0/wx/selstore.h new file mode 100644 index 00000000..62ff2298 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/selstore.h @@ -0,0 +1,100 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/selstore.h +// Purpose: wxSelectionStore stores selected items in a control +// Author: Vadim Zeitlin +// Modified by: +// Created: 08.06.03 (extracted from src/generic/listctrl.cpp) +// Copyright: (c) 2000-2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SELSTORE_H_ +#define _WX_SELSTORE_H_ + +#include "wx/dynarray.h" + +// ---------------------------------------------------------------------------- +// wxSelectedIndices is just a sorted array of indices +// ---------------------------------------------------------------------------- + +inline int CMPFUNC_CONV wxUIntCmp(unsigned n1, unsigned n2) +{ + return (int)(n1 - n2); +} + +WX_DEFINE_SORTED_EXPORTED_ARRAY_CMP_INT(unsigned, wxUIntCmp, wxSelectedIndices); + +// ---------------------------------------------------------------------------- +// wxSelectionStore is used to store the selected items in the virtual +// controls, i.e. it is well suited for storing even when the control contains +// a huge (practically infinite) number of items. +// +// Of course, internally it still has to store the selected items somehow (as +// an array currently) but the advantage is that it can handle the selection +// of all items (common operation) efficiently and that it could be made even +// smarter in the future (e.g. store the selections as an array of ranges + +// individual items) without changing its API. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSelectionStore +{ +public: + wxSelectionStore() : m_itemsSel(wxUIntCmp) { Init(); } + + // set the total number of items we handle + void SetItemCount(unsigned count); + + // special case of SetItemCount(0) + void Clear() { m_itemsSel.Clear(); m_count = 0; m_defaultState = false; } + + // must be called when a new item is inserted/added + void OnItemAdd(unsigned WXUNUSED(item)) { wxFAIL_MSG( wxT("TODO") ); } + + // must be called when an item is deleted + void OnItemDelete(unsigned item); + + // select one item, use SelectRange() insted if possible! + // + // returns true if the items selection really changed + bool SelectItem(unsigned item, bool select = true); + + // select the range of items (inclusive) + // + // return true and fill the itemsChanged array with the indices of items + // which have changed state if "few" of them did, otherwise return false + // (meaning that too many items changed state to bother counting them + // individually) + bool SelectRange(unsigned itemFrom, unsigned itemTo, + bool select = true, + wxArrayInt *itemsChanged = NULL); + + // return true if the given item is selected + bool IsSelected(unsigned item) const; + + // return the total number of selected items + unsigned GetSelectedCount() const + { + return m_defaultState ? m_count - m_itemsSel.GetCount() + : m_itemsSel.GetCount(); + } + +private: + // (re)init + void Init() { m_count = 0; m_defaultState = false; } + + // the total number of items we handle + unsigned m_count; + + // the default state: normally, false (i.e. off) but maybe set to true if + // there are more selected items than non selected ones - this allows to + // handle selection of all items efficiently + bool m_defaultState; + + // the array of items whose selection state is different from default + wxSelectedIndices m_itemsSel; + + wxDECLARE_NO_COPY_CLASS(wxSelectionStore); +}; + +#endif // _WX_SELSTORE_H_ + diff --git a/wxmsw/include/wx-3.0/wx/settings.h b/wxmsw/include/wx-3.0/wx/settings.h new file mode 100644 index 00000000..f90ae071 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/settings.h @@ -0,0 +1,221 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/settings.h +// Purpose: wxSystemSettings class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SETTINGS_H_BASE_ +#define _WX_SETTINGS_H_BASE_ + +#include "wx/colour.h" +#include "wx/font.h" + +class WXDLLIMPEXP_FWD_CORE wxWindow; + +// possible values for wxSystemSettings::GetFont() parameter +// +// NB: wxMSW assumes that they have the same values as the parameters of +// Windows GetStockObject() API, don't change the values! +enum wxSystemFont +{ + wxSYS_OEM_FIXED_FONT = 10, + wxSYS_ANSI_FIXED_FONT, + wxSYS_ANSI_VAR_FONT, + wxSYS_SYSTEM_FONT, + wxSYS_DEVICE_DEFAULT_FONT, + + // don't use: this is here just to make the values of enum elements + // coincide with the corresponding MSW constants + wxSYS_DEFAULT_PALETTE, + + // don't use: MSDN says that this is a stock object provided only + // for compatibility with 16-bit Windows versions earlier than 3.0! + wxSYS_SYSTEM_FIXED_FONT, + + wxSYS_DEFAULT_GUI_FONT, + + // this was just a temporary aberration, do not use it any more + wxSYS_ICONTITLE_FONT = wxSYS_DEFAULT_GUI_FONT +}; + +// possible values for wxSystemSettings::GetColour() parameter +// +// NB: wxMSW assumes that they have the same values as the parameters of +// Windows GetSysColor() API, don't change the values! +enum wxSystemColour +{ + wxSYS_COLOUR_SCROLLBAR, + wxSYS_COLOUR_DESKTOP, + wxSYS_COLOUR_ACTIVECAPTION, + wxSYS_COLOUR_INACTIVECAPTION, + wxSYS_COLOUR_MENU, + wxSYS_COLOUR_WINDOW, + wxSYS_COLOUR_WINDOWFRAME, + wxSYS_COLOUR_MENUTEXT, + wxSYS_COLOUR_WINDOWTEXT, + wxSYS_COLOUR_CAPTIONTEXT, + wxSYS_COLOUR_ACTIVEBORDER, + wxSYS_COLOUR_INACTIVEBORDER, + wxSYS_COLOUR_APPWORKSPACE, + wxSYS_COLOUR_HIGHLIGHT, + wxSYS_COLOUR_HIGHLIGHTTEXT, + wxSYS_COLOUR_BTNFACE, + wxSYS_COLOUR_BTNSHADOW, + wxSYS_COLOUR_GRAYTEXT, + wxSYS_COLOUR_BTNTEXT, + wxSYS_COLOUR_INACTIVECAPTIONTEXT, + wxSYS_COLOUR_BTNHIGHLIGHT, + wxSYS_COLOUR_3DDKSHADOW, + wxSYS_COLOUR_3DLIGHT, + wxSYS_COLOUR_INFOTEXT, + wxSYS_COLOUR_INFOBK, + wxSYS_COLOUR_LISTBOX, + wxSYS_COLOUR_HOTLIGHT, + wxSYS_COLOUR_GRADIENTACTIVECAPTION, + wxSYS_COLOUR_GRADIENTINACTIVECAPTION, + wxSYS_COLOUR_MENUHILIGHT, + wxSYS_COLOUR_MENUBAR, + wxSYS_COLOUR_LISTBOXTEXT, + wxSYS_COLOUR_LISTBOXHIGHLIGHTTEXT, + + wxSYS_COLOUR_MAX, + + // synonyms + wxSYS_COLOUR_BACKGROUND = wxSYS_COLOUR_DESKTOP, + wxSYS_COLOUR_3DFACE = wxSYS_COLOUR_BTNFACE, + wxSYS_COLOUR_3DSHADOW = wxSYS_COLOUR_BTNSHADOW, + wxSYS_COLOUR_BTNHILIGHT = wxSYS_COLOUR_BTNHIGHLIGHT, + wxSYS_COLOUR_3DHIGHLIGHT = wxSYS_COLOUR_BTNHIGHLIGHT, + wxSYS_COLOUR_3DHILIGHT = wxSYS_COLOUR_BTNHIGHLIGHT, + wxSYS_COLOUR_FRAMEBK = wxSYS_COLOUR_BTNFACE +}; + +// possible values for wxSystemSettings::GetMetric() index parameter +// +// NB: update the conversion table in msw/settings.cpp if you change the values +// of the elements of this enum +enum wxSystemMetric +{ + wxSYS_MOUSE_BUTTONS = 1, + wxSYS_BORDER_X, + wxSYS_BORDER_Y, + wxSYS_CURSOR_X, + wxSYS_CURSOR_Y, + wxSYS_DCLICK_X, + wxSYS_DCLICK_Y, + wxSYS_DRAG_X, + wxSYS_DRAG_Y, + wxSYS_EDGE_X, + wxSYS_EDGE_Y, + wxSYS_HSCROLL_ARROW_X, + wxSYS_HSCROLL_ARROW_Y, + wxSYS_HTHUMB_X, + wxSYS_ICON_X, + wxSYS_ICON_Y, + wxSYS_ICONSPACING_X, + wxSYS_ICONSPACING_Y, + wxSYS_WINDOWMIN_X, + wxSYS_WINDOWMIN_Y, + wxSYS_SCREEN_X, + wxSYS_SCREEN_Y, + wxSYS_FRAMESIZE_X, + wxSYS_FRAMESIZE_Y, + wxSYS_SMALLICON_X, + wxSYS_SMALLICON_Y, + wxSYS_HSCROLL_Y, + wxSYS_VSCROLL_X, + wxSYS_VSCROLL_ARROW_X, + wxSYS_VSCROLL_ARROW_Y, + wxSYS_VTHUMB_Y, + wxSYS_CAPTION_Y, + wxSYS_MENU_Y, + wxSYS_NETWORK_PRESENT, + wxSYS_PENWINDOWS_PRESENT, + wxSYS_SHOW_SOUNDS, + wxSYS_SWAP_BUTTONS, + wxSYS_DCLICK_MSEC +}; + +// possible values for wxSystemSettings::HasFeature() parameter +enum wxSystemFeature +{ + wxSYS_CAN_DRAW_FRAME_DECORATIONS = 1, + wxSYS_CAN_ICONIZE_FRAME, + wxSYS_TABLET_PRESENT +}; + +// values for different screen designs +enum wxSystemScreenType +{ + wxSYS_SCREEN_NONE = 0, // not yet defined + + wxSYS_SCREEN_TINY, // < + wxSYS_SCREEN_PDA, // >= 320x240 + wxSYS_SCREEN_SMALL, // >= 640x480 + wxSYS_SCREEN_DESKTOP // >= 800x600 +}; + +// ---------------------------------------------------------------------------- +// wxSystemSettingsNative: defines the API for wxSystemSettings class +// ---------------------------------------------------------------------------- + +// this is a namespace rather than a class: it has only non virtual static +// functions +// +// also note that the methods are implemented in the platform-specific source +// files (i.e. this is not a real base class as we can't override its virtual +// functions because it doesn't have any) + +class WXDLLIMPEXP_CORE wxSystemSettingsNative +{ +public: + // get a standard system colour + static wxColour GetColour(wxSystemColour index); + + // get a standard system font + static wxFont GetFont(wxSystemFont index); + + // get a system-dependent metric + static int GetMetric(wxSystemMetric index, wxWindow * win = NULL); + + // return true if the port has certain feature + static bool HasFeature(wxSystemFeature index); +}; + +// ---------------------------------------------------------------------------- +// include the declaration of the real platform-dependent class +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSystemSettings : public wxSystemSettingsNative +{ +public: +#ifdef __WXUNIVERSAL__ + // in wxUniversal we want to use the theme standard colours instead of the + // system ones, otherwise wxSystemSettings is just the same as + // wxSystemSettingsNative + static wxColour GetColour(wxSystemColour index); + + // some metrics are toolkit-dependent and provided by wxUniv, some are + // lowlevel + static int GetMetric(wxSystemMetric index, wxWindow *win = NULL); +#endif // __WXUNIVERSAL__ + + // Get system screen design (desktop, pda, ..) used for + // laying out various dialogs. + static wxSystemScreenType GetScreenType(); + + // Override default. + static void SetScreenType( wxSystemScreenType screen ); + + // Value + static wxSystemScreenType ms_screen; + +}; + +#endif + // _WX_SETTINGS_H_BASE_ + diff --git a/wxmsw/include/wx-3.0/wx/sharedptr.h b/wxmsw/include/wx-3.0/wx/sharedptr.h new file mode 100644 index 00000000..a9b6442c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/sharedptr.h @@ -0,0 +1,169 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/sharedptr.h +// Purpose: Shared pointer based on the counted_ptr<> template, which +// is in the public domain +// Author: Robert Roebling, Yonat Sharon +// Copyright: Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SHAREDPTR_H_ +#define _WX_SHAREDPTR_H_ + +#include "wx/defs.h" +#include "wx/atomic.h" + +// ---------------------------------------------------------------------------- +// wxSharedPtr: A smart pointer with non-intrusive reference counting. +// ---------------------------------------------------------------------------- + +template <class T> +class wxSharedPtr +{ +public: + typedef T element_type; + + wxEXPLICIT wxSharedPtr( T* ptr = NULL ) + : m_ref(NULL) + { + if (ptr) + m_ref = new reftype(ptr); + } + + template<typename Deleter> + wxEXPLICIT wxSharedPtr(T* ptr, Deleter d) + : m_ref(NULL) + { + if (ptr) + m_ref = new reftype_with_deleter<Deleter>(ptr, d); + } + + ~wxSharedPtr() { Release(); } + wxSharedPtr(const wxSharedPtr& tocopy) { Acquire(tocopy.m_ref); } + + wxSharedPtr& operator=( const wxSharedPtr& tocopy ) + { + if (this != &tocopy) + { + Release(); + Acquire(tocopy.m_ref); + } + return *this; + } + + wxSharedPtr& operator=( T* ptr ) + { + if (get() != ptr) + { + Release(); + if (ptr) + m_ref = new reftype(ptr); + } + return *this; + } + + // test for pointer validity: defining conversion to unspecified_bool_type + // and not more obvious bool to avoid implicit conversions to integer types + typedef T *(wxSharedPtr<T>::*unspecified_bool_type)() const; + operator unspecified_bool_type() const + { + if (m_ref && m_ref->m_ptr) + return &wxSharedPtr<T>::get; + else + return NULL; + } + + T& operator*() const + { + wxASSERT(m_ref != NULL); + wxASSERT(m_ref->m_ptr != NULL); + return *(m_ref->m_ptr); + } + + T* operator->() const + { + wxASSERT(m_ref != NULL); + wxASSERT(m_ref->m_ptr != NULL); + return m_ref->m_ptr; + } + + T* get() const + { + return m_ref ? m_ref->m_ptr : NULL; + } + + void reset( T* ptr = NULL ) + { + Release(); + if (ptr) + m_ref = new reftype(ptr); + } + + template<typename Deleter> + void reset(T* ptr, Deleter d) + { + Release(); + if (ptr) + m_ref = new reftype_with_deleter<Deleter>(ptr, d); + } + + bool unique() const { return (m_ref ? m_ref->m_count == 1 : true); } + long use_count() const { return (m_ref ? (long)m_ref->m_count : 0); } + +private: + + struct reftype + { + reftype(T* ptr) : m_ptr(ptr), m_count(1) {} + virtual ~reftype() {} + virtual void delete_ptr() { delete m_ptr; } + + T* m_ptr; + wxAtomicInt m_count; + }; + + template<typename Deleter> + struct reftype_with_deleter : public reftype + { + reftype_with_deleter(T* ptr, Deleter d) : reftype(ptr), m_deleter(d) {} + virtual void delete_ptr() { m_deleter(this->m_ptr); } + + Deleter m_deleter; + }; + + reftype* m_ref; + + void Acquire(reftype* ref) + { + m_ref = ref; + if (ref) + wxAtomicInc( ref->m_count ); + } + + void Release() + { + if (m_ref) + { + if (!wxAtomicDec( m_ref->m_count )) + { + m_ref->delete_ptr(); + delete m_ref; + } + m_ref = NULL; + } + } +}; + +template <class T, class U> +bool operator == (wxSharedPtr<T> const &a, wxSharedPtr<U> const &b ) +{ + return a.get() == b.get(); +} + +template <class T, class U> +bool operator != (wxSharedPtr<T> const &a, wxSharedPtr<U> const &b ) +{ + return a.get() != b.get(); +} + +#endif // _WX_SHAREDPTR_H_ diff --git a/wxmsw/include/wx-3.0/wx/simplebook.h b/wxmsw/include/wx-3.0/wx/simplebook.h new file mode 100644 index 00000000..d54ebc45 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/simplebook.h @@ -0,0 +1,212 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/simplebook.h +// Purpose: wxBookCtrlBase-derived class without any controller. +// Author: Vadim Zeitlin +// Created: 2012-08-21 +// Copyright: (c) 2012 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SIMPLEBOOK_H_ +#define _WX_SIMPLEBOOK_H_ + +#include "wx/bookctrl.h" + +#if wxUSE_BOOKCTRL + +#include "wx/vector.h" + +// ---------------------------------------------------------------------------- +// wxSimplebook: a book control without any user-actionable controller. +// ---------------------------------------------------------------------------- + +// NB: This class doesn't use DLL export declaration as it's fully inline. + +class wxSimplebook : public wxBookCtrlBase +{ +public: + wxSimplebook() + { + Init(); + } + + wxSimplebook(wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString) + : wxBookCtrlBase(parent, winid, pos, size, style | wxBK_TOP, name) + { + Init(); + } + + + // Methods specific to this class. + + // A method allowing to add a new page without any label (which is unused + // by this control) and show it immediately. + bool ShowNewPage(wxWindow* page) + { + return AddPage(page, wxString(), true /* select it */); + } + + + // Set effect to use for showing/hiding pages. + void SetEffects(wxShowEffect showEffect, wxShowEffect hideEffect) + { + m_showEffect = showEffect; + m_hideEffect = hideEffect; + } + + // Or the same effect for both of them. + void SetEffect(wxShowEffect effect) + { + SetEffects(effect, effect); + } + + // And the same for time outs. + void SetEffectsTimeouts(unsigned showTimeout, unsigned hideTimeout) + { + m_showTimeout = showTimeout; + m_hideTimeout = hideTimeout; + } + + void SetEffectTimeout(unsigned timeout) + { + SetEffectsTimeouts(timeout, timeout); + } + + + // Implement base class pure virtual methods. + + // Page management + virtual bool InsertPage(size_t n, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = NO_IMAGE) + { + if ( !wxBookCtrlBase::InsertPage(n, page, text, bSelect, imageId) ) + return false; + + m_pageTexts.insert(m_pageTexts.begin() + n, text); + + if ( !DoSetSelectionAfterInsertion(n, bSelect) ) + page->Hide(); + + return true; + } + + virtual int SetSelection(size_t n) + { + return DoSetSelection(n, SetSelection_SendEvent); + } + + virtual int ChangeSelection(size_t n) + { + return DoSetSelection(n); + } + + // Neither labels nor images are supported but we still store the labels + // just in case the user code attaches some importance to them. + virtual bool SetPageText(size_t n, const wxString& strText) + { + wxCHECK_MSG( n < GetPageCount(), false, wxS("Invalid page") ); + + m_pageTexts[n] = strText; + + return true; + } + + virtual wxString GetPageText(size_t n) const + { + wxCHECK_MSG( n < GetPageCount(), wxString(), wxS("Invalid page") ); + + return m_pageTexts[n]; + } + + virtual bool SetPageImage(size_t WXUNUSED(n), int WXUNUSED(imageId)) + { + return false; + } + + virtual int GetPageImage(size_t WXUNUSED(n)) const + { + return NO_IMAGE; + } + +protected: + virtual void UpdateSelectedPage(size_t newsel) + { + m_selection = newsel; + } + + virtual wxBookCtrlEvent* CreatePageChangingEvent() const + { + return new wxBookCtrlEvent(wxEVT_BOOKCTRL_PAGE_CHANGING, + GetId()); + } + + virtual void MakeChangedEvent(wxBookCtrlEvent& event) + { + event.SetEventType(wxEVT_BOOKCTRL_PAGE_CHANGED); + } + + virtual wxWindow *DoRemovePage(size_t page) + { + wxWindow* const win = wxBookCtrlBase::DoRemovePage(page); + if ( win ) + { + m_pageTexts.erase(m_pageTexts.begin() + page); + + DoSetSelectionAfterRemoval(page); + } + + return win; + } + + virtual void DoSize() + { + wxWindow* const page = GetCurrentPage(); + if ( page ) + page->SetSize(GetPageRect()); + } + + virtual void DoShowPage(wxWindow* page, bool show) + { + if ( show ) + page->ShowWithEffect(m_showEffect, m_showTimeout); + else + page->HideWithEffect(m_hideEffect, m_hideTimeout); + } + +private: + void Init() + { + // We don't need any border as we don't have anything to separate the + // page contents from. + SetInternalBorder(0); + + // No effects by default. + m_showEffect = + m_hideEffect = wxSHOW_EFFECT_NONE; + + m_showTimeout = + m_hideTimeout = 0; + } + + wxVector<wxString> m_pageTexts; + + wxShowEffect m_showEffect, + m_hideEffect; + + unsigned m_showTimeout, + m_hideTimeout; + + wxDECLARE_NO_COPY_CLASS(wxSimplebook); +}; + +#endif // wxUSE_BOOKCTRL + +#endif // _WX_SIMPLEBOOK_H_ diff --git a/wxmsw/include/wx-3.0/wx/sizer.h b/wxmsw/include/wx-3.0/wx/sizer.h new file mode 100644 index 00000000..7d20b548 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/sizer.h @@ -0,0 +1,1315 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/sizer.h +// Purpose: provide wxSizer class for layout +// Author: Robert Roebling and Robin Dunn +// Modified by: Ron Lee, Vadim Zeitlin (wxSizerFlags) +// Created: +// Copyright: (c) Robin Dunn, Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __WXSIZER_H__ +#define __WXSIZER_H__ + +#include "wx/defs.h" + +#include "wx/window.h" + +//--------------------------------------------------------------------------- +// classes +//--------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxBoxSizer; +class WXDLLIMPEXP_FWD_CORE wxSizerItem; +class WXDLLIMPEXP_FWD_CORE wxSizer; + +#ifndef wxUSE_BORDER_BY_DEFAULT + #ifdef __SMARTPHONE__ + // no borders by default on limited size screen + #define wxUSE_BORDER_BY_DEFAULT 0 + #else + #define wxUSE_BORDER_BY_DEFAULT 1 + #endif +#endif + +// ---------------------------------------------------------------------------- +// wxSizerFlags: flags used for an item in the sizer +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSizerFlags +{ +public: + // construct the flags object initialized with the given proportion (0 by + // default) + wxSizerFlags(int proportion = 0) : m_proportion(proportion) + { + m_flags = 0; + m_borderInPixels = 0; + } + + // setters for all sizer flags, they all return the object itself so that + // calls to them can be chained + + wxSizerFlags& Proportion(int proportion) + { + m_proportion = proportion; + return *this; + } + + wxSizerFlags& Expand() + { + m_flags |= wxEXPAND; + return *this; + } + + // notice that Align() replaces the current alignment flags, use specific + // methods below such as Top(), Left() &c if you want to set just the + // vertical or horizontal alignment + wxSizerFlags& Align(int alignment) // combination of wxAlignment values + { + m_flags &= ~wxALIGN_MASK; + m_flags |= alignment; + + return *this; + } + + // some shortcuts for Align() + wxSizerFlags& Centre() { return Align(wxALIGN_CENTRE); } + wxSizerFlags& Center() { return Centre(); } + + wxSizerFlags& Top() + { + m_flags &= ~(wxALIGN_BOTTOM | wxALIGN_CENTRE_VERTICAL); + return *this; + } + + wxSizerFlags& Left() + { + m_flags &= ~(wxALIGN_RIGHT | wxALIGN_CENTRE_HORIZONTAL); + return *this; + } + + wxSizerFlags& Right() + { + m_flags = (m_flags & ~wxALIGN_CENTRE_HORIZONTAL) | wxALIGN_RIGHT; + return *this; + } + + wxSizerFlags& Bottom() + { + m_flags = (m_flags & ~wxALIGN_CENTRE_VERTICAL) | wxALIGN_BOTTOM; + return *this; + } + + + // default border size used by Border() below + static int GetDefaultBorder() + { +#if wxUSE_BORDER_BY_DEFAULT + #ifdef __WXGTK20__ + // GNOME HIG says to use 6px as the base unit: + // http://library.gnome.org/devel/hig-book/stable/design-window.html.en + return 6; + #else + // FIXME: default border size shouldn't be hardcoded and at the very + // least they should depend on the current font size + return 5; + #endif +#else + return 0; +#endif + } + + + wxSizerFlags& Border(int direction, int borderInPixels) + { + wxCHECK_MSG( !(direction & ~wxALL), *this, + wxS("direction must be a combination of wxDirection ") + wxS("enum values.") ); + + m_flags &= ~wxALL; + m_flags |= direction; + + m_borderInPixels = borderInPixels; + + return *this; + } + + wxSizerFlags& Border(int direction = wxALL) + { +#if wxUSE_BORDER_BY_DEFAULT + return Border(direction, GetDefaultBorder()); +#else + // no borders by default on limited size screen + wxUnusedVar(direction); + + return *this; +#endif + } + + wxSizerFlags& DoubleBorder(int direction = wxALL) + { +#if wxUSE_BORDER_BY_DEFAULT + return Border(direction, 2*GetDefaultBorder()); +#else + wxUnusedVar(direction); + + return *this; +#endif + } + + wxSizerFlags& TripleBorder(int direction = wxALL) + { +#if wxUSE_BORDER_BY_DEFAULT + return Border(direction, 3*GetDefaultBorder()); +#else + wxUnusedVar(direction); + + return *this; +#endif + } + + wxSizerFlags& HorzBorder() + { +#if wxUSE_BORDER_BY_DEFAULT + return Border(wxLEFT | wxRIGHT, GetDefaultBorder()); +#else + return *this; +#endif + } + + wxSizerFlags& DoubleHorzBorder() + { +#if wxUSE_BORDER_BY_DEFAULT + return Border(wxLEFT | wxRIGHT, 2*GetDefaultBorder()); +#else + return *this; +#endif + } + + // setters for the others flags + wxSizerFlags& Shaped() + { + m_flags |= wxSHAPED; + + return *this; + } + + wxSizerFlags& FixedMinSize() + { + m_flags |= wxFIXED_MINSIZE; + + return *this; + } + + // makes the item ignore window's visibility status + wxSizerFlags& ReserveSpaceEvenIfHidden() + { + m_flags |= wxRESERVE_SPACE_EVEN_IF_HIDDEN; + return *this; + } + + // accessors for wxSizer only + int GetProportion() const { return m_proportion; } + int GetFlags() const { return m_flags; } + int GetBorderInPixels() const { return m_borderInPixels; } + +private: + int m_proportion; + int m_flags; + int m_borderInPixels; +}; + + +// ---------------------------------------------------------------------------- +// wxSizerSpacer: used by wxSizerItem to represent a spacer +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSizerSpacer +{ +public: + wxSizerSpacer(const wxSize& size) : m_size(size), m_isShown(true) { } + + void SetSize(const wxSize& size) { m_size = size; } + const wxSize& GetSize() const { return m_size; } + + void Show(bool show) { m_isShown = show; } + bool IsShown() const { return m_isShown; } + +private: + // the size, in pixel + wxSize m_size; + + // is the spacer currently shown? + bool m_isShown; +}; + +// ---------------------------------------------------------------------------- +// wxSizerItem +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSizerItem : public wxObject +{ +public: + // window + wxSizerItem( wxWindow *window, + int proportion=0, + int flag=0, + int border=0, + wxObject* userData=NULL ); + + // window with flags + wxSizerItem(wxWindow *window, const wxSizerFlags& flags) + { + Init(flags); + + DoSetWindow(window); + } + + // subsizer + wxSizerItem( wxSizer *sizer, + int proportion=0, + int flag=0, + int border=0, + wxObject* userData=NULL ); + + // sizer with flags + wxSizerItem(wxSizer *sizer, const wxSizerFlags& flags) + { + Init(flags); + + DoSetSizer(sizer); + } + + // spacer + wxSizerItem( int width, + int height, + int proportion=0, + int flag=0, + int border=0, + wxObject* userData=NULL); + + // spacer with flags + wxSizerItem(int width, int height, const wxSizerFlags& flags) + { + Init(flags); + + DoSetSpacer(wxSize(width, height)); + } + + wxSizerItem(); + virtual ~wxSizerItem(); + + virtual void DeleteWindows(); + + // Enable deleting the SizerItem without destroying the contained sizer. + void DetachSizer() { m_sizer = NULL; } + + virtual wxSize GetSize() const; + virtual wxSize CalcMin(); + virtual void SetDimension( const wxPoint& pos, const wxSize& size ); + + wxSize GetMinSize() const + { return m_minSize; } + wxSize GetMinSizeWithBorder() const; + + wxSize GetMaxSize() const + { return IsWindow() ? m_window->GetMaxSize() : wxDefaultSize; } + wxSize GetMaxSizeWithBorder() const; + + void SetMinSize(const wxSize& size) + { + if ( IsWindow() ) + m_window->SetMinSize(size); + m_minSize = size; + } + void SetMinSize( int x, int y ) + { SetMinSize(wxSize(x, y)); } + void SetInitSize( int x, int y ) + { SetMinSize(wxSize(x, y)); } + + // if either of dimensions is zero, ratio is assumed to be 1 + // to avoid "divide by zero" errors + void SetRatio(int width, int height) + { m_ratio = (width && height) ? ((float) width / (float) height) : 1; } + void SetRatio(const wxSize& size) + { SetRatio(size.x, size.y); } + void SetRatio(float ratio) + { m_ratio = ratio; } + float GetRatio() const + { return m_ratio; } + + virtual wxRect GetRect() { return m_rect; } + + // set a sizer item id (different from a window id, all sizer items, + // including spacers, can have an associated id) + void SetId(int id) { m_id = id; } + int GetId() const { return m_id; } + + bool IsWindow() const { return m_kind == Item_Window; } + bool IsSizer() const { return m_kind == Item_Sizer; } + bool IsSpacer() const { return m_kind == Item_Spacer; } + +#if WXWIN_COMPATIBILITY_2_6 + // Deprecated in 2.6, use {G,S}etProportion instead. + wxDEPRECATED( void SetOption( int option ) ); + wxDEPRECATED( int GetOption() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + + void SetProportion( int proportion ) + { m_proportion = proportion; } + int GetProportion() const + { return m_proportion; } + void SetFlag( int flag ) + { m_flag = flag; } + int GetFlag() const + { return m_flag; } + void SetBorder( int border ) + { m_border = border; } + int GetBorder() const + { return m_border; } + + wxWindow *GetWindow() const + { return m_kind == Item_Window ? m_window : NULL; } + wxSizer *GetSizer() const + { return m_kind == Item_Sizer ? m_sizer : NULL; } + wxSize GetSpacer() const; + + // This function behaves obviously for the windows and spacers but for the + // sizers it returns true if any sizer element is shown and only returns + // false if all of them are hidden. Also, it always returns true if + // wxRESERVE_SPACE_EVEN_IF_HIDDEN flag was used. + bool IsShown() const; + + void Show(bool show); + + void SetUserData(wxObject* userData) + { delete m_userData; m_userData = userData; } + wxObject* GetUserData() const + { return m_userData; } + wxPoint GetPosition() const + { return m_pos; } + + // Called once the first component of an item has been decided. This is + // used in algorithms that depend on knowing the size in one direction + // before the min size in the other direction can be known. + // Returns true if it made use of the information (and min size was changed). + bool InformFirstDirection( int direction, int size, int availableOtherDir=-1 ); + + // these functions delete the current contents of the item if it's a sizer + // or a spacer but not if it is a window + void AssignWindow(wxWindow *window) + { + Free(); + DoSetWindow(window); + } + + void AssignSizer(wxSizer *sizer) + { + Free(); + DoSetSizer(sizer); + } + + void AssignSpacer(const wxSize& size) + { + Free(); + DoSetSpacer(size); + } + + void AssignSpacer(int w, int h) { AssignSpacer(wxSize(w, h)); } + +#if WXWIN_COMPATIBILITY_2_8 + // these functions do not free the old sizer/spacer and so can easily + // provoke the memory leaks and so shouldn't be used, use Assign() instead + wxDEPRECATED( void SetWindow(wxWindow *window) ); + wxDEPRECATED( void SetSizer(wxSizer *sizer) ); + wxDEPRECATED( void SetSpacer(const wxSize& size) ); + wxDEPRECATED( void SetSpacer(int width, int height) ); +#endif // WXWIN_COMPATIBILITY_2_8 + +protected: + // common part of several ctors + void Init() { m_userData = NULL; m_kind = Item_None; } + + // common part of ctors taking wxSizerFlags + void Init(const wxSizerFlags& flags); + + // free current contents + void Free(); + + // common parts of Set/AssignXXX() + void DoSetWindow(wxWindow *window); + void DoSetSizer(wxSizer *sizer); + void DoSetSpacer(const wxSize& size); + + // Add the border specified for this item to the given size + // if it's != wxDefaultSize, just return wxDefaultSize otherwise. + wxSize AddBorderToSize(const wxSize& size) const; + + // discriminated union: depending on m_kind one of the fields is valid + enum + { + Item_None, + Item_Window, + Item_Sizer, + Item_Spacer, + Item_Max + } m_kind; + union + { + wxWindow *m_window; + wxSizer *m_sizer; + wxSizerSpacer *m_spacer; + }; + + wxPoint m_pos; + wxSize m_minSize; + int m_proportion; + int m_border; + int m_flag; + int m_id; + + // on screen rectangle of this item (not including borders) + wxRect m_rect; + + // Aspect ratio can always be calculated from m_size, + // but this would cause precision loss when the window + // is shrunk. It is safer to preserve the initial value. + float m_ratio; + + wxObject *m_userData; + +private: + DECLARE_CLASS(wxSizerItem) + wxDECLARE_NO_COPY_CLASS(wxSizerItem); +}; + +WX_DECLARE_EXPORTED_LIST( wxSizerItem, wxSizerItemList ); + + +//--------------------------------------------------------------------------- +// wxSizer +//--------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSizer: public wxObject, public wxClientDataContainer +{ +public: + wxSizer() { m_containingWindow = NULL; } + virtual ~wxSizer(); + + // methods for adding elements to the sizer: there are Add/Insert/Prepend + // overloads for each of window/sizer/spacer/wxSizerItem + wxSizerItem* Add(wxWindow *window, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Add(wxSizer *sizer, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Add(int width, + int height, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Add( wxWindow *window, const wxSizerFlags& flags); + wxSizerItem* Add( wxSizer *sizer, const wxSizerFlags& flags); + wxSizerItem* Add( int width, int height, const wxSizerFlags& flags); + wxSizerItem* Add( wxSizerItem *item); + + virtual wxSizerItem *AddSpacer(int size); + wxSizerItem* AddStretchSpacer(int prop = 1); + + wxSizerItem* Insert(size_t index, + wxWindow *window, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Insert(size_t index, + wxSizer *sizer, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Insert(size_t index, + int width, + int height, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Insert(size_t index, + wxWindow *window, + const wxSizerFlags& flags); + wxSizerItem* Insert(size_t index, + wxSizer *sizer, + const wxSizerFlags& flags); + wxSizerItem* Insert(size_t index, + int width, + int height, + const wxSizerFlags& flags); + + // NB: do _not_ override this function in the derived classes, this one is + // virtual for compatibility reasons only to allow old code overriding + // it to continue to work, override DoInsert() instead in the new code + virtual wxSizerItem* Insert(size_t index, wxSizerItem *item); + + wxSizerItem* InsertSpacer(size_t index, int size); + wxSizerItem* InsertStretchSpacer(size_t index, int prop = 1); + + wxSizerItem* Prepend(wxWindow *window, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Prepend(wxSizer *sizer, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Prepend(int width, + int height, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Prepend(wxWindow *window, const wxSizerFlags& flags); + wxSizerItem* Prepend(wxSizer *sizer, const wxSizerFlags& flags); + wxSizerItem* Prepend(int width, int height, const wxSizerFlags& flags); + wxSizerItem* Prepend(wxSizerItem *item); + + wxSizerItem* PrependSpacer(int size); + wxSizerItem* PrependStretchSpacer(int prop = 1); + + // set (or possibly unset if window is NULL) or get the window this sizer + // is used in + void SetContainingWindow(wxWindow *window); + wxWindow *GetContainingWindow() const { return m_containingWindow; } + +#if WXWIN_COMPATIBILITY_2_6 + // Deprecated in 2.6 since historically it does not delete the window, + // use Detach instead. + wxDEPRECATED( virtual bool Remove( wxWindow *window ) ); +#endif // WXWIN_COMPATIBILITY_2_6 + + virtual bool Remove( wxSizer *sizer ); + virtual bool Remove( int index ); + + virtual bool Detach( wxWindow *window ); + virtual bool Detach( wxSizer *sizer ); + virtual bool Detach( int index ); + + virtual bool Replace( wxWindow *oldwin, wxWindow *newwin, bool recursive = false ); + virtual bool Replace( wxSizer *oldsz, wxSizer *newsz, bool recursive = false ); + virtual bool Replace( size_t index, wxSizerItem *newitem ); + + virtual void Clear( bool delete_windows = false ); + virtual void DeleteWindows(); + + // Inform sizer about the first direction that has been decided (by parent item) + // Returns true if it made use of the information (and recalculated min size) + virtual bool InformFirstDirection( int WXUNUSED(direction), int WXUNUSED(size), int WXUNUSED(availableOtherDir) ) + { return false; } + + void SetMinSize( int width, int height ) + { DoSetMinSize( width, height ); } + void SetMinSize( const wxSize& size ) + { DoSetMinSize( size.x, size.y ); } + + // Searches recursively + bool SetItemMinSize( wxWindow *window, int width, int height ) + { return DoSetItemMinSize( window, width, height ); } + bool SetItemMinSize( wxWindow *window, const wxSize& size ) + { return DoSetItemMinSize( window, size.x, size.y ); } + + // Searches recursively + bool SetItemMinSize( wxSizer *sizer, int width, int height ) + { return DoSetItemMinSize( sizer, width, height ); } + bool SetItemMinSize( wxSizer *sizer, const wxSize& size ) + { return DoSetItemMinSize( sizer, size.x, size.y ); } + + bool SetItemMinSize( size_t index, int width, int height ) + { return DoSetItemMinSize( index, width, height ); } + bool SetItemMinSize( size_t index, const wxSize& size ) + { return DoSetItemMinSize( index, size.x, size.y ); } + + wxSize GetSize() const + { return m_size; } + wxPoint GetPosition() const + { return m_position; } + + // Calculate the minimal size or return m_minSize if bigger. + wxSize GetMinSize(); + + // These virtual functions are used by the layout algorithm: first + // CalcMin() is called to calculate the minimal size of the sizer and + // prepare for laying it out and then RecalcSizes() is called to really + // update all the sizer items + virtual wxSize CalcMin() = 0; + virtual void RecalcSizes() = 0; + + virtual void Layout(); + + wxSize ComputeFittingClientSize(wxWindow *window); + wxSize ComputeFittingWindowSize(wxWindow *window); + + wxSize Fit( wxWindow *window ); + void FitInside( wxWindow *window ); + void SetSizeHints( wxWindow *window ); +#if WXWIN_COMPATIBILITY_2_8 + // This only calls FitInside() since 2.9 + wxDEPRECATED( void SetVirtualSizeHints( wxWindow *window ) ); +#endif + + wxSizerItemList& GetChildren() + { return m_children; } + const wxSizerItemList& GetChildren() const + { return m_children; } + + void SetDimension(const wxPoint& pos, const wxSize& size) + { + m_position = pos; + m_size = size; + Layout(); + + // This call is required for wxWrapSizer to be able to calculate its + // minimal size correctly. + InformFirstDirection(wxHORIZONTAL, size.x, size.y); + } + void SetDimension(int x, int y, int width, int height) + { SetDimension(wxPoint(x, y), wxSize(width, height)); } + + size_t GetItemCount() const { return m_children.GetCount(); } + bool IsEmpty() const { return m_children.IsEmpty(); } + + wxSizerItem* GetItem( wxWindow *window, bool recursive = false ); + wxSizerItem* GetItem( wxSizer *sizer, bool recursive = false ); + wxSizerItem* GetItem( size_t index ); + wxSizerItem* GetItemById( int id, bool recursive = false ); + + // Manage whether individual scene items are considered + // in the layout calculations or not. + bool Show( wxWindow *window, bool show = true, bool recursive = false ); + bool Show( wxSizer *sizer, bool show = true, bool recursive = false ); + bool Show( size_t index, bool show = true ); + + bool Hide( wxSizer *sizer, bool recursive = false ) + { return Show( sizer, false, recursive ); } + bool Hide( wxWindow *window, bool recursive = false ) + { return Show( window, false, recursive ); } + bool Hide( size_t index ) + { return Show( index, false ); } + + bool IsShown( wxWindow *window ) const; + bool IsShown( wxSizer *sizer ) const; + bool IsShown( size_t index ) const; + + // Recursively call wxWindow::Show () on all sizer items. + virtual void ShowItems (bool show); + + void Show(bool show) { ShowItems(show); } + + // This is the ShowItems() counterpart and returns true if any of the sizer + // items are shown. + virtual bool AreAnyItemsShown() const; + +protected: + wxSize m_size; + wxSize m_minSize; + wxPoint m_position; + wxSizerItemList m_children; + + // the window this sizer is used in, can be NULL + wxWindow *m_containingWindow; + + wxSize GetMaxClientSize( wxWindow *window ) const; + wxSize GetMinClientSize( wxWindow *window ); + wxSize VirtualFitSize( wxWindow *window ); + + virtual void DoSetMinSize( int width, int height ); + virtual bool DoSetItemMinSize( wxWindow *window, int width, int height ); + virtual bool DoSetItemMinSize( wxSizer *sizer, int width, int height ); + virtual bool DoSetItemMinSize( size_t index, int width, int height ); + + // insert a new item into m_children at given index and return the item + // itself + virtual wxSizerItem* DoInsert(size_t index, wxSizerItem *item); + +private: + DECLARE_CLASS(wxSizer) +}; + +//--------------------------------------------------------------------------- +// wxGridSizer +//--------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGridSizer: public wxSizer +{ +public: + // ctors specifying the number of columns only: number of rows will be + // deduced automatically depending on the number of sizer elements + wxGridSizer( int cols, int vgap, int hgap ); + wxGridSizer( int cols, const wxSize& gap = wxSize(0, 0) ); + + // ctors specifying the number of rows and columns + wxGridSizer( int rows, int cols, int vgap, int hgap ); + wxGridSizer( int rows, int cols, const wxSize& gap ); + + virtual void RecalcSizes(); + virtual wxSize CalcMin(); + + void SetCols( int cols ) + { + wxASSERT_MSG( cols >= 0, "Number of columns must be non-negative"); + m_cols = cols; + } + + void SetRows( int rows ) + { + wxASSERT_MSG( rows >= 0, "Number of rows must be non-negative"); + m_rows = rows; + } + + void SetVGap( int gap ) { m_vgap = gap; } + void SetHGap( int gap ) { m_hgap = gap; } + int GetCols() const { return m_cols; } + int GetRows() const { return m_rows; } + int GetVGap() const { return m_vgap; } + int GetHGap() const { return m_hgap; } + + int GetEffectiveColsCount() const { return m_cols ? m_cols : CalcCols(); } + int GetEffectiveRowsCount() const { return m_rows ? m_rows : CalcRows(); } + + // return the number of total items and the number of columns and rows + // (for internal use only) + int CalcRowsCols(int& rows, int& cols) const; + +protected: + // the number of rows/columns in the sizer, if 0 then it is determined + // dynamically depending on the total number of items + int m_rows; + int m_cols; + + // gaps between rows and columns + int m_vgap; + int m_hgap; + + virtual wxSizerItem *DoInsert(size_t index, wxSizerItem *item); + + void SetItemBounds( wxSizerItem *item, int x, int y, int w, int h ); + + // returns the number of columns/rows needed for the current total number + // of children (and the fixed number of rows/columns) + int CalcCols() const + { + wxCHECK_MSG + ( + m_rows, 0, + "Can't calculate number of cols if number of rows is not specified" + ); + + return int(m_children.GetCount() + m_rows - 1) / m_rows; + } + + int CalcRows() const + { + wxCHECK_MSG + ( + m_cols, 0, + "Can't calculate number of cols if number of rows is not specified" + ); + + return int(m_children.GetCount() + m_cols - 1) / m_cols; + } + +private: + DECLARE_CLASS(wxGridSizer) +}; + +//--------------------------------------------------------------------------- +// wxFlexGridSizer +//--------------------------------------------------------------------------- + +// values which define the behaviour for resizing wxFlexGridSizer cells in the +// "non-flexible" direction +enum wxFlexSizerGrowMode +{ + // don't resize the cells in non-flexible direction at all + wxFLEX_GROWMODE_NONE, + + // uniformly resize only the specified ones (default) + wxFLEX_GROWMODE_SPECIFIED, + + // uniformly resize all cells + wxFLEX_GROWMODE_ALL +}; + +class WXDLLIMPEXP_CORE wxFlexGridSizer: public wxGridSizer +{ +public: + // ctors specifying the number of columns only: number of rows will be + // deduced automatically depending on the number of sizer elements + wxFlexGridSizer( int cols, int vgap, int hgap ); + wxFlexGridSizer( int cols, const wxSize& gap = wxSize(0, 0) ); + + // ctors specifying the number of rows and columns + wxFlexGridSizer( int rows, int cols, int vgap, int hgap ); + wxFlexGridSizer( int rows, int cols, const wxSize& gap ); + + // dtor + virtual ~wxFlexGridSizer(); + + // set the rows/columns which will grow (the others will remain of the + // constant initial size) + void AddGrowableRow( size_t idx, int proportion = 0 ); + void RemoveGrowableRow( size_t idx ); + void AddGrowableCol( size_t idx, int proportion = 0 ); + void RemoveGrowableCol( size_t idx ); + + bool IsRowGrowable( size_t idx ); + bool IsColGrowable( size_t idx ); + + // the sizer cells may grow in both directions, not grow at all or only + // grow in one direction but not the other + + // the direction may be wxVERTICAL, wxHORIZONTAL or wxBOTH (default) + void SetFlexibleDirection(int direction) { m_flexDirection = direction; } + int GetFlexibleDirection() const { return m_flexDirection; } + + // note that the grow mode only applies to the direction which is not + // flexible + void SetNonFlexibleGrowMode(wxFlexSizerGrowMode mode) { m_growMode = mode; } + wxFlexSizerGrowMode GetNonFlexibleGrowMode() const { return m_growMode; } + + // Read-only access to the row heights and col widths arrays + const wxArrayInt& GetRowHeights() const { return m_rowHeights; } + const wxArrayInt& GetColWidths() const { return m_colWidths; } + + // implementation + virtual void RecalcSizes(); + virtual wxSize CalcMin(); + +protected: + void AdjustForFlexDirection(); + void AdjustForGrowables(const wxSize& sz); + void FindWidthsAndHeights(int nrows, int ncols); + + // the heights/widths of all rows/columns + wxArrayInt m_rowHeights, + m_colWidths; + + // indices of the growable columns and rows + wxArrayInt m_growableRows, + m_growableCols; + + // proportion values of the corresponding growable rows and columns + wxArrayInt m_growableRowsProportions, + m_growableColsProportions; + + // parameters describing whether the growable cells should be resized in + // both directions or only one + int m_flexDirection; + wxFlexSizerGrowMode m_growMode; + + // saves CalcMin result to optimize RecalcSizes + wxSize m_calculatedMinSize; + +private: + DECLARE_CLASS(wxFlexGridSizer) + wxDECLARE_NO_COPY_CLASS(wxFlexGridSizer); +}; + +//--------------------------------------------------------------------------- +// wxBoxSizer +//--------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxBoxSizer: public wxSizer +{ +public: + wxBoxSizer(int orient) + { + m_orient = orient; + m_totalProportion = 0; + + wxASSERT_MSG( m_orient == wxHORIZONTAL || m_orient == wxVERTICAL, + wxT("invalid value for wxBoxSizer orientation") ); + } + + virtual wxSizerItem *AddSpacer(int size); + + int GetOrientation() const { return m_orient; } + + bool IsVertical() const { return m_orient == wxVERTICAL; } + + void SetOrientation(int orient) { m_orient = orient; } + + // implementation of our resizing logic + virtual wxSize CalcMin(); + virtual void RecalcSizes(); + +protected: + // helpers for our code: this returns the component of the given wxSize in + // the direction of the sizer and in the other direction, respectively + int GetSizeInMajorDir(const wxSize& sz) const + { + return m_orient == wxHORIZONTAL ? sz.x : sz.y; + } + + int& SizeInMajorDir(wxSize& sz) + { + return m_orient == wxHORIZONTAL ? sz.x : sz.y; + } + + int& PosInMajorDir(wxPoint& pt) + { + return m_orient == wxHORIZONTAL ? pt.x : pt.y; + } + + int GetSizeInMinorDir(const wxSize& sz) const + { + return m_orient == wxHORIZONTAL ? sz.y : sz.x; + } + + int& SizeInMinorDir(wxSize& sz) + { + return m_orient == wxHORIZONTAL ? sz.y : sz.x; + } + + int& PosInMinorDir(wxPoint& pt) + { + return m_orient == wxHORIZONTAL ? pt.y : pt.x; + } + + // another helper: creates wxSize from major and minor components + wxSize SizeFromMajorMinor(int major, int minor) const + { + if ( m_orient == wxHORIZONTAL ) + { + return wxSize(major, minor); + } + else // wxVERTICAL + { + return wxSize(minor, major); + } + } + + + // either wxHORIZONTAL or wxVERTICAL + int m_orient; + + // the sum of proportion of all of our elements + int m_totalProportion; + + // the minimal size needed for this sizer as calculated by the last call to + // our CalcMin() + wxSize m_minSize; + +private: + DECLARE_CLASS(wxBoxSizer) +}; + +//--------------------------------------------------------------------------- +// wxStaticBoxSizer +//--------------------------------------------------------------------------- + +#if wxUSE_STATBOX + +class WXDLLIMPEXP_FWD_CORE wxStaticBox; + +class WXDLLIMPEXP_CORE wxStaticBoxSizer: public wxBoxSizer +{ +public: + wxStaticBoxSizer(wxStaticBox *box, int orient); + wxStaticBoxSizer(int orient, wxWindow *win, const wxString& label = wxEmptyString); + virtual ~wxStaticBoxSizer(); + + void RecalcSizes(); + wxSize CalcMin(); + + wxStaticBox *GetStaticBox() const + { return m_staticBox; } + + // override to hide/show the static box as well + virtual void ShowItems (bool show); + virtual bool AreAnyItemsShown() const; + + virtual bool Detach( wxWindow *window ); + virtual bool Detach( wxSizer *sizer ) { return wxBoxSizer::Detach(sizer); } + virtual bool Detach( int index ) { return wxBoxSizer::Detach(index); } + +protected: + wxStaticBox *m_staticBox; + +private: + DECLARE_CLASS(wxStaticBoxSizer) + wxDECLARE_NO_COPY_CLASS(wxStaticBoxSizer); +}; + +#endif // wxUSE_STATBOX + +//--------------------------------------------------------------------------- +// wxStdDialogButtonSizer +//--------------------------------------------------------------------------- + +#if wxUSE_BUTTON + +class WXDLLIMPEXP_CORE wxStdDialogButtonSizer: public wxBoxSizer +{ +public: + // Constructor just creates a new wxBoxSizer, not much else. + // Box sizer orientation is automatically determined here: + // vertical for PDAs, horizontal for everything else? + wxStdDialogButtonSizer(); + + // Checks button ID against system IDs and sets one of the pointers below + // to this button. Does not do any sizer-related things here. + void AddButton(wxButton *button); + + // Use these if no standard ID can/should be used + void SetAffirmativeButton( wxButton *button ); + void SetNegativeButton( wxButton *button ); + void SetCancelButton( wxButton *button ); + + // All platform-specific code here, checks which buttons exist and add + // them to the sizer accordingly. + // Note - one potential hack on Mac we could use here, + // if m_buttonAffirmative is wxID_SAVE then ensure wxID_SAVE + // is set to _("Save") and m_buttonNegative is set to _("Don't Save") + // I wouldn't add any other hacks like that into here, + // but this one I can see being useful. + void Realize(); + + wxButton *GetAffirmativeButton() const { return m_buttonAffirmative; } + wxButton *GetApplyButton() const { return m_buttonApply; } + wxButton *GetNegativeButton() const { return m_buttonNegative; } + wxButton *GetCancelButton() const { return m_buttonCancel; } + wxButton *GetHelpButton() const { return m_buttonHelp; } + +protected: + wxButton *m_buttonAffirmative; // wxID_OK, wxID_YES, wxID_SAVE go here + wxButton *m_buttonApply; // wxID_APPLY + wxButton *m_buttonNegative; // wxID_NO + wxButton *m_buttonCancel; // wxID_CANCEL, wxID_CLOSE + wxButton *m_buttonHelp; // wxID_HELP, wxID_CONTEXT_HELP + +private: + DECLARE_CLASS(wxStdDialogButtonSizer) + wxDECLARE_NO_COPY_CLASS(wxStdDialogButtonSizer); +}; + +#endif // wxUSE_BUTTON + + +// ---------------------------------------------------------------------------- +// inline functions implementation +// ---------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_8 + +inline void wxSizerItem::SetWindow(wxWindow *window) +{ + DoSetWindow(window); +} + +inline void wxSizerItem::SetSizer(wxSizer *sizer) +{ + DoSetSizer(sizer); +} + +inline void wxSizerItem::SetSpacer(const wxSize& size) +{ + DoSetSpacer(size); +} + +inline void wxSizerItem::SetSpacer(int width, int height) +{ + DoSetSpacer(wxSize(width, height)); +} + +#endif // WXWIN_COMPATIBILITY_2_8 + +inline wxSizerItem* +wxSizer::Insert(size_t index, wxSizerItem *item) +{ + return DoInsert(index, item); +} + + +inline wxSizerItem* +wxSizer::Add( wxSizerItem *item ) +{ + return Insert( m_children.GetCount(), item ); +} + +inline wxSizerItem* +wxSizer::Add( wxWindow *window, int proportion, int flag, int border, wxObject* userData ) +{ + return Add( new wxSizerItem( window, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Add( wxSizer *sizer, int proportion, int flag, int border, wxObject* userData ) +{ + return Add( new wxSizerItem( sizer, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Add( int width, int height, int proportion, int flag, int border, wxObject* userData ) +{ + return Add( new wxSizerItem( width, height, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Add( wxWindow *window, const wxSizerFlags& flags ) +{ + return Add( new wxSizerItem(window, flags) ); +} + +inline wxSizerItem* +wxSizer::Add( wxSizer *sizer, const wxSizerFlags& flags ) +{ + return Add( new wxSizerItem(sizer, flags) ); +} + +inline wxSizerItem* +wxSizer::Add( int width, int height, const wxSizerFlags& flags ) +{ + return Add( new wxSizerItem(width, height, flags) ); +} + +inline wxSizerItem* +wxSizer::AddSpacer(int size) +{ + return Add(size, size); +} + +inline wxSizerItem* +wxSizer::AddStretchSpacer(int prop) +{ + return Add(0, 0, prop); +} + +inline wxSizerItem* +wxSizer::Prepend( wxSizerItem *item ) +{ + return Insert( 0, item ); +} + +inline wxSizerItem* +wxSizer::Prepend( wxWindow *window, int proportion, int flag, int border, wxObject* userData ) +{ + return Prepend( new wxSizerItem( window, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Prepend( wxSizer *sizer, int proportion, int flag, int border, wxObject* userData ) +{ + return Prepend( new wxSizerItem( sizer, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Prepend( int width, int height, int proportion, int flag, int border, wxObject* userData ) +{ + return Prepend( new wxSizerItem( width, height, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::PrependSpacer(int size) +{ + return Prepend(size, size); +} + +inline wxSizerItem* +wxSizer::PrependStretchSpacer(int prop) +{ + return Prepend(0, 0, prop); +} + +inline wxSizerItem* +wxSizer::Prepend( wxWindow *window, const wxSizerFlags& flags ) +{ + return Prepend( new wxSizerItem(window, flags) ); +} + +inline wxSizerItem* +wxSizer::Prepend( wxSizer *sizer, const wxSizerFlags& flags ) +{ + return Prepend( new wxSizerItem(sizer, flags) ); +} + +inline wxSizerItem* +wxSizer::Prepend( int width, int height, const wxSizerFlags& flags ) +{ + return Prepend( new wxSizerItem(width, height, flags) ); +} + +inline wxSizerItem* +wxSizer::Insert( size_t index, + wxWindow *window, + int proportion, + int flag, + int border, + wxObject* userData ) +{ + return Insert( index, new wxSizerItem( window, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Insert( size_t index, + wxSizer *sizer, + int proportion, + int flag, + int border, + wxObject* userData ) +{ + return Insert( index, new wxSizerItem( sizer, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Insert( size_t index, + int width, + int height, + int proportion, + int flag, + int border, + wxObject* userData ) +{ + return Insert( index, new wxSizerItem( width, height, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Insert( size_t index, wxWindow *window, const wxSizerFlags& flags ) +{ + return Insert( index, new wxSizerItem(window, flags) ); +} + +inline wxSizerItem* +wxSizer::Insert( size_t index, wxSizer *sizer, const wxSizerFlags& flags ) +{ + return Insert( index, new wxSizerItem(sizer, flags) ); +} + +inline wxSizerItem* +wxSizer::Insert( size_t index, int width, int height, const wxSizerFlags& flags ) +{ + return Insert( index, new wxSizerItem(width, height, flags) ); +} + +inline wxSizerItem* +wxSizer::InsertSpacer(size_t index, int size) +{ + return Insert(index, size, size); +} + +inline wxSizerItem* +wxSizer::InsertStretchSpacer(size_t index, int prop) +{ + return Insert(index, 0, 0, prop); +} + +#endif // __WXSIZER_H__ diff --git a/wxmsw/include/wx-3.0/wx/slider.h b/wxmsw/include/wx-3.0/wx/slider.h new file mode 100644 index 00000000..e3ab597b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/slider.h @@ -0,0 +1,156 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/slider.h +// Purpose: wxSlider interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 09.02.01 +// Copyright: (c) 1996-2001 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SLIDER_H_BASE_ +#define _WX_SLIDER_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_SLIDER + +#include "wx/control.h" + +// ---------------------------------------------------------------------------- +// wxSlider flags +// ---------------------------------------------------------------------------- + +#define wxSL_HORIZONTAL wxHORIZONTAL /* 0x0004 */ +#define wxSL_VERTICAL wxVERTICAL /* 0x0008 */ + +#define wxSL_TICKS 0x0010 +#define wxSL_AUTOTICKS wxSL_TICKS // we don't support manual ticks +#define wxSL_LEFT 0x0040 +#define wxSL_TOP 0x0080 +#define wxSL_RIGHT 0x0100 +#define wxSL_BOTTOM 0x0200 +#define wxSL_BOTH 0x0400 +#define wxSL_SELRANGE 0x0800 +#define wxSL_INVERSE 0x1000 +#define wxSL_MIN_MAX_LABELS 0x2000 +#define wxSL_VALUE_LABEL 0x4000 +#define wxSL_LABELS (wxSL_MIN_MAX_LABELS|wxSL_VALUE_LABEL) + +#if WXWIN_COMPATIBILITY_2_6 + // obsolete + #define wxSL_NOTIFY_DRAG 0x0000 +#endif // WXWIN_COMPATIBILITY_2_6 + +extern WXDLLIMPEXP_DATA_CORE(const char) wxSliderNameStr[]; + +// ---------------------------------------------------------------------------- +// wxSliderBase: define wxSlider interface +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSliderBase : public wxControl +{ +public: + /* the ctor of the derived class should have the following form: + + wxSlider(wxWindow *parent, + wxWindowID id, + int value, int minValue, int maxValue, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSL_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSliderNameStr); + */ + wxSliderBase() { } + + // get/set the current slider value (should be in range) + virtual int GetValue() const = 0; + virtual void SetValue(int value) = 0; + + // retrieve/change the range + virtual void SetRange(int minValue, int maxValue) = 0; + virtual int GetMin() const = 0; + virtual int GetMax() const = 0; + void SetMin( int minValue ) { SetRange( minValue , GetMax() ) ; } + void SetMax( int maxValue ) { SetRange( GetMin() , maxValue ) ; } + + // the line/page size is the increment by which the slider moves when + // cursor arrow key/page up or down are pressed (clicking the mouse is like + // pressing PageUp/Down) and are by default set to 1 and 1/10 of the range + virtual void SetLineSize(int lineSize) = 0; + virtual void SetPageSize(int pageSize) = 0; + virtual int GetLineSize() const = 0; + virtual int GetPageSize() const = 0; + + // these methods get/set the length of the slider pointer in pixels + virtual void SetThumbLength(int lenPixels) = 0; + virtual int GetThumbLength() const = 0; + + // warning: most of subsequent methods are currently only implemented in + // wxMSW under Win95 and are silently ignored on other platforms + + void SetTickFreq(int freq) { DoSetTickFreq(freq); } + virtual int GetTickFreq() const { return 0; } + virtual void ClearTicks() { } + virtual void SetTick(int WXUNUSED(tickPos)) { } + + virtual void ClearSel() { } + virtual int GetSelEnd() const { return GetMin(); } + virtual int GetSelStart() const { return GetMax(); } + virtual void SetSelection(int WXUNUSED(min), int WXUNUSED(max)) { } + +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED_INLINE( void SetTickFreq(int freq, int), DoSetTickFreq(freq); ) +#endif + +protected: + // Platform-specific implementation of SetTickFreq + virtual void DoSetTickFreq(int WXUNUSED(freq)) { /* unsupported by default */ } + + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + // adjust value according to wxSL_INVERSE style + virtual int ValueInvertOrNot(int value) const + { + if (HasFlag(wxSL_INVERSE)) + return (GetMax() + GetMin()) - value; + else + return value; + } + +private: + wxDECLARE_NO_COPY_CLASS(wxSliderBase); +}; + +// ---------------------------------------------------------------------------- +// include the real class declaration +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/slider.h" +#elif defined(__WXMSW__) + #include "wx/msw/slider.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/slider.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/slider.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/slider.h" +#elif defined(__WXMAC__) + #include "wx/osx/slider.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/slider.h" +#elif defined(__WXPM__) + #include "wx/os2/slider.h" +#endif + +#endif // wxUSE_SLIDER + +#endif + // _WX_SLIDER_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/snglinst.h b/wxmsw/include/wx-3.0/wx/snglinst.h new file mode 100644 index 00000000..61213a86 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/snglinst.h @@ -0,0 +1,96 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/snglinst.h +// Purpose: wxSingleInstanceChecker can be used to restrict the number of +// simultaneously running copies of a program to one +// Author: Vadim Zeitlin +// Modified by: +// Created: 08.06.01 +// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SNGLINST_H_ +#define _WX_SNGLINST_H_ + +#if wxUSE_SNGLINST_CHECKER + +#include "wx/app.h" +#include "wx/utils.h" + +// ---------------------------------------------------------------------------- +// wxSingleInstanceChecker +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxSingleInstanceChecker +{ +public: + // default ctor, use Create() after it + wxSingleInstanceChecker() { Init(); } + + // like Create() but no error checking (dangerous!) + wxSingleInstanceChecker(const wxString& name, + const wxString& path = wxEmptyString) + { + Init(); + Create(name, path); + } + + // notice that calling Create() is optional now, if you don't do it before + // calling IsAnotherRunning(), CreateDefault() is used automatically + // + // name it is used as the mutex name under Win32 and the lock file name + // under Unix so it should be as unique as possible and must be non-empty + // + // path is optional and is ignored under Win32 and used as the directory to + // create the lock file in under Unix (default is wxGetHomeDir()) + // + // returns false if initialization failed, it doesn't mean that another + // instance is running - use IsAnotherRunning() to check it + bool Create(const wxString& name, const wxString& path = wxEmptyString); + + // use the default name, which is a combination of wxTheApp->GetAppName() + // and wxGetUserId() for mutex/lock file + // + // this is called implicitly by IsAnotherRunning() if the checker hadn't + // been created until then + bool CreateDefault() + { + wxCHECK_MSG( wxTheApp, false, "must have application instance" ); + return Create(wxTheApp->GetAppName() + '-' + wxGetUserId()); + } + + // is another copy of this program already running? + bool IsAnotherRunning() const + { + if ( !m_impl ) + { + if ( !const_cast<wxSingleInstanceChecker *>(this)->CreateDefault() ) + { + // if creation failed, return false as it's better to not + // prevent this instance from starting up if there is an error + return false; + } + } + + return DoIsAnotherRunning(); + } + + // dtor is not virtual, this class is not meant to be used polymorphically + ~wxSingleInstanceChecker(); + +private: + // common part of all ctors + void Init() { m_impl = NULL; } + + // do check if another instance is running, called only if m_impl != NULL + bool DoIsAnotherRunning() const; + + // the implementation details (platform specific) + class WXDLLIMPEXP_FWD_BASE wxSingleInstanceCheckerImpl *m_impl; + + wxDECLARE_NO_COPY_CLASS(wxSingleInstanceChecker); +}; + +#endif // wxUSE_SNGLINST_CHECKER + +#endif // _WX_SNGLINST_H_ diff --git a/wxmsw/include/wx-3.0/wx/socket.h b/wxmsw/include/wx-3.0/wx/socket.h new file mode 100644 index 00000000..35ff2662 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/socket.h @@ -0,0 +1,435 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/socket.h +// Purpose: Socket handling classes +// Authors: Guilhem Lavaux, Guillermo Rodriguez Garcia +// Modified by: +// Created: April 1997 +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SOCKET_H_ +#define _WX_SOCKET_H_ + +#include "wx/defs.h" + +#if wxUSE_SOCKETS + +// --------------------------------------------------------------------------- +// wxSocket headers +// --------------------------------------------------------------------------- + +#include "wx/event.h" +#include "wx/sckaddr.h" +#include "wx/list.h" + +class wxSocketImpl; + +// ------------------------------------------------------------------------ +// Types and constants +// ------------------------------------------------------------------------ + +// Define the type of native sockets. +#if defined(__WINDOWS__) + // Although socket descriptors are still 32 bit values, even under Win64, + // the socket type is 64 bit there. + typedef wxUIntPtr wxSOCKET_T; +#else + typedef int wxSOCKET_T; +#endif + + +// Types of different socket notifications or events. +// +// NB: the values here should be consecutive and start with 0 as they are +// used to construct the wxSOCKET_XXX_FLAG bit mask values below +enum wxSocketNotify +{ + wxSOCKET_INPUT, + wxSOCKET_OUTPUT, + wxSOCKET_CONNECTION, + wxSOCKET_LOST +}; + +enum +{ + wxSOCKET_INPUT_FLAG = 1 << wxSOCKET_INPUT, + wxSOCKET_OUTPUT_FLAG = 1 << wxSOCKET_OUTPUT, + wxSOCKET_CONNECTION_FLAG = 1 << wxSOCKET_CONNECTION, + wxSOCKET_LOST_FLAG = 1 << wxSOCKET_LOST +}; + +// this is a combination of the bit masks defined above +typedef int wxSocketEventFlags; + +enum wxSocketError +{ + wxSOCKET_NOERROR = 0, + wxSOCKET_INVOP, + wxSOCKET_IOERR, + wxSOCKET_INVADDR, + wxSOCKET_INVSOCK, + wxSOCKET_NOHOST, + wxSOCKET_INVPORT, + wxSOCKET_WOULDBLOCK, + wxSOCKET_TIMEDOUT, + wxSOCKET_MEMERR, + wxSOCKET_OPTERR +}; + +// socket options/flags bit masks +enum +{ + wxSOCKET_NONE = 0x0000, + wxSOCKET_NOWAIT_READ = 0x0001, + wxSOCKET_NOWAIT_WRITE = 0x0002, + wxSOCKET_NOWAIT = wxSOCKET_NOWAIT_READ | wxSOCKET_NOWAIT_WRITE, + wxSOCKET_WAITALL_READ = 0x0004, + wxSOCKET_WAITALL_WRITE = 0x0008, + wxSOCKET_WAITALL = wxSOCKET_WAITALL_READ | wxSOCKET_WAITALL_WRITE, + wxSOCKET_BLOCK = 0x0010, + wxSOCKET_REUSEADDR = 0x0020, + wxSOCKET_BROADCAST = 0x0040, + wxSOCKET_NOBIND = 0x0080 +}; + +typedef int wxSocketFlags; + +// socket kind values (badly defined, don't use) +enum wxSocketType +{ + wxSOCKET_UNINIT, + wxSOCKET_CLIENT, + wxSOCKET_SERVER, + wxSOCKET_BASE, + wxSOCKET_DATAGRAM +}; + + +// event +class WXDLLIMPEXP_FWD_NET wxSocketEvent; +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_NET, wxEVT_SOCKET, wxSocketEvent); + +// -------------------------------------------------------------------------- +// wxSocketBase +// -------------------------------------------------------------------------- + +class WXDLLIMPEXP_NET wxSocketBase : public wxObject +{ +public: + // Public interface + // ---------------- + + // ctors and dtors + wxSocketBase(); + wxSocketBase(wxSocketFlags flags, wxSocketType type); + virtual ~wxSocketBase(); + void Init(); + bool Destroy(); + + // state + bool Ok() const { return IsOk(); } + bool IsOk() const { return m_impl != NULL; } + bool Error() const { return LastError() != wxSOCKET_NOERROR; } + bool IsClosed() const { return m_closed; } + bool IsConnected() const { return m_connected; } + bool IsData() { return WaitForRead(0, 0); } + bool IsDisconnected() const { return !IsConnected(); } + wxUint32 LastCount() const { return m_lcount; } + wxUint32 LastReadCount() const { return m_lcount_read; } + wxUint32 LastWriteCount() const { return m_lcount_write; } + wxSocketError LastError() const; + void SaveState(); + void RestoreState(); + + // addresses + virtual bool GetLocal(wxSockAddress& addr_man) const; + virtual bool GetPeer(wxSockAddress& addr_man) const; + virtual bool SetLocal(const wxIPV4address& local); + + // base IO + virtual bool Close(); + void ShutdownOutput(); + wxSocketBase& Discard(); + wxSocketBase& Peek(void* buffer, wxUint32 nbytes); + wxSocketBase& Read(void* buffer, wxUint32 nbytes); + wxSocketBase& ReadMsg(void *buffer, wxUint32 nbytes); + wxSocketBase& Unread(const void *buffer, wxUint32 nbytes); + wxSocketBase& Write(const void *buffer, wxUint32 nbytes); + wxSocketBase& WriteMsg(const void *buffer, wxUint32 nbytes); + + // all Wait() functions wait until their condition is satisfied or the + // timeout expires; if seconds == -1 (default) then m_timeout value is used + // + // it is also possible to call InterruptWait() to cancel any current Wait() + + // wait for anything at all to happen with this socket + bool Wait(long seconds = -1, long milliseconds = 0); + + // wait until we can read from or write to the socket without blocking + // (notice that this does not mean that the operation will succeed but only + // that it will return immediately) + bool WaitForRead(long seconds = -1, long milliseconds = 0); + bool WaitForWrite(long seconds = -1, long milliseconds = 0); + + // wait until the connection is terminated + bool WaitForLost(long seconds = -1, long milliseconds = 0); + + void InterruptWait() { m_interrupt = true; } + + + wxSocketFlags GetFlags() const { return m_flags; } + void SetFlags(wxSocketFlags flags); + virtual void SetTimeout(long seconds); + long GetTimeout() const { return m_timeout; } + + bool GetOption(int level, int optname, void *optval, int *optlen); + bool SetOption(int level, int optname, const void *optval, int optlen); + wxUint32 GetLastIOSize() const { return m_lcount; } + wxUint32 GetLastIOReadSize() const { return m_lcount_read; } + wxUint32 GetLastIOWriteSize() const { return m_lcount_write; } + + // event handling + void *GetClientData() const { return m_clientData; } + void SetClientData(void *data) { m_clientData = data; } + void SetEventHandler(wxEvtHandler& handler, int id = wxID_ANY); + void SetNotify(wxSocketEventFlags flags); + void Notify(bool notify); + + // Get the underlying socket descriptor. + wxSOCKET_T GetSocket() const; + + // initialize/shutdown the sockets (done automatically so there is no need + // to call these functions usually) + // + // should always be called from the main thread only so one of the cases + // where they should indeed be called explicitly is when the first wxSocket + // object in the application is created in a different thread + static bool Initialize(); + static void Shutdown(); + + // check if wxSocket had been already initialized + // + // notice that this function should be only called from the main thread as + // otherwise it is inherently unsafe because Initialize/Shutdown() may be + // called concurrently with it in the main thread + static bool IsInitialized(); + + // Implementation from now on + // -------------------------- + + // do not use, should be private (called from wxSocketImpl only) + void OnRequest(wxSocketNotify notify); + + // do not use, not documented nor supported + bool IsNoWait() const { return ((m_flags & wxSOCKET_NOWAIT) != 0); } + wxSocketType GetType() const { return m_type; } + +private: + friend class wxSocketClient; + friend class wxSocketServer; + friend class wxDatagramSocket; + + // low level IO + wxUint32 DoRead(void* buffer, wxUint32 nbytes); + wxUint32 DoWrite(const void *buffer, wxUint32 nbytes); + + // wait until the given flags are set for this socket or the given timeout + // (or m_timeout) expires + // + // notice that wxSOCKET_LOST_FLAG is always taken into account and the + // function returns -1 if the connection was lost; otherwise it returns + // true if any of the events specified by flags argument happened or false + // if the timeout expired + int DoWait(long timeout, wxSocketEventFlags flags); + + // a helper calling DoWait() using the same convention as the public + // WaitForXXX() functions use, i.e. use our timeout if seconds == -1 or the + // specified timeout otherwise + int DoWait(long seconds, long milliseconds, wxSocketEventFlags flags); + + // another helper calling DoWait() using our m_timeout + int DoWaitWithTimeout(wxSocketEventFlags flags) + { + return DoWait(m_timeout*1000, flags); + } + + // pushback buffer + void Pushback(const void *buffer, wxUint32 size); + wxUint32 GetPushback(void *buffer, wxUint32 size, bool peek); + + // store the given error as the LastError() + void SetError(wxSocketError error); + +private: + // socket + wxSocketImpl *m_impl; // port-specific implementation + wxSocketType m_type; // wxSocket type + + // state + wxSocketFlags m_flags; // wxSocket flags + bool m_connected; // connected? + bool m_establishing; // establishing connection? + bool m_reading; // busy reading? + bool m_writing; // busy writing? + bool m_closed; // was the other end closed? + wxUint32 m_lcount; // last IO transaction size + wxUint32 m_lcount_read; // last IO transaction size of Read() direction. + wxUint32 m_lcount_write; // last IO transaction size of Write() direction. + unsigned long m_timeout; // IO timeout value in seconds + // (TODO: remove, wxSocketImpl has it too) + wxList m_states; // stack of states (TODO: remove!) + bool m_interrupt; // interrupt ongoing wait operations? + bool m_beingDeleted; // marked for delayed deletion? + wxIPV4address m_localAddress; // bind to local address? + + // pushback buffer + void *m_unread; // pushback buffer + wxUint32 m_unrd_size; // pushback buffer size + wxUint32 m_unrd_cur; // pushback pointer (index into buffer) + + // events + int m_id; // socket id + wxEvtHandler *m_handler; // event handler + void *m_clientData; // client data for events + bool m_notify; // notify events to users? + wxSocketEventFlags m_eventmask; // which events to notify? + wxSocketEventFlags m_eventsgot; // collects events received in OnRequest() + + + friend class wxSocketReadGuard; + friend class wxSocketWriteGuard; + + wxDECLARE_NO_COPY_CLASS(wxSocketBase); + DECLARE_CLASS(wxSocketBase) +}; + + +// -------------------------------------------------------------------------- +// wxSocketServer +// -------------------------------------------------------------------------- + +class WXDLLIMPEXP_NET wxSocketServer : public wxSocketBase +{ +public: + wxSocketServer(const wxSockAddress& addr, + wxSocketFlags flags = wxSOCKET_NONE); + + wxSocketBase* Accept(bool wait = true); + bool AcceptWith(wxSocketBase& socket, bool wait = true); + + bool WaitForAccept(long seconds = -1, long milliseconds = 0); + + wxDECLARE_NO_COPY_CLASS(wxSocketServer); + DECLARE_CLASS(wxSocketServer) +}; + + +// -------------------------------------------------------------------------- +// wxSocketClient +// -------------------------------------------------------------------------- + +class WXDLLIMPEXP_NET wxSocketClient : public wxSocketBase +{ +public: + wxSocketClient(wxSocketFlags flags = wxSOCKET_NONE); + + virtual bool Connect(const wxSockAddress& addr, bool wait = true); + bool Connect(const wxSockAddress& addr, + const wxSockAddress& local, + bool wait = true); + + bool WaitOnConnect(long seconds = -1, long milliseconds = 0); + + // Sets initial socket buffer sizes using the SO_SNDBUF and SO_RCVBUF + // options before calling connect (either one can be -1 to leave it + // unchanged) + void SetInitialSocketBuffers(int recv, int send) + { + m_initialRecvBufferSize = recv; + m_initialSendBufferSize = send; + } + +private: + virtual bool DoConnect(const wxSockAddress& addr, + const wxSockAddress* local, + bool wait = true); + + // buffer sizes, -1 if unset and defaults should be used + int m_initialRecvBufferSize; + int m_initialSendBufferSize; + + wxDECLARE_NO_COPY_CLASS(wxSocketClient); + DECLARE_CLASS(wxSocketClient) +}; + + +// -------------------------------------------------------------------------- +// wxDatagramSocket +// -------------------------------------------------------------------------- + +// WARNING: still in alpha stage + +class WXDLLIMPEXP_NET wxDatagramSocket : public wxSocketBase +{ +public: + wxDatagramSocket(const wxSockAddress& addr, + wxSocketFlags flags = wxSOCKET_NONE); + + wxDatagramSocket& RecvFrom(wxSockAddress& addr, + void *buf, + wxUint32 nBytes); + wxDatagramSocket& SendTo(const wxSockAddress& addr, + const void* buf, + wxUint32 nBytes); + + /* TODO: + bool Connect(wxSockAddress& addr); + */ + +private: + wxDECLARE_NO_COPY_CLASS(wxDatagramSocket); + DECLARE_CLASS(wxDatagramSocket) +}; + + +// -------------------------------------------------------------------------- +// wxSocketEvent +// -------------------------------------------------------------------------- + +class WXDLLIMPEXP_NET wxSocketEvent : public wxEvent +{ +public: + wxSocketEvent(int id = 0) + : wxEvent(id, wxEVT_SOCKET) + { + } + + wxSocketNotify GetSocketEvent() const { return m_event; } + wxSocketBase *GetSocket() const + { return (wxSocketBase *) GetEventObject(); } + void *GetClientData() const { return m_clientData; } + + virtual wxEvent *Clone() const { return new wxSocketEvent(*this); } + virtual wxEventCategory GetEventCategory() const { return wxEVT_CATEGORY_SOCKET; } + +public: + wxSocketNotify m_event; + void *m_clientData; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSocketEvent) +}; + + +typedef void (wxEvtHandler::*wxSocketEventFunction)(wxSocketEvent&); + +#define wxSocketEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxSocketEventFunction, func) + +#define EVT_SOCKET(id, func) \ + wx__DECLARE_EVT1(wxEVT_SOCKET, id, wxSocketEventHandler(func)) + +#endif // wxUSE_SOCKETS + +#endif // _WX_SOCKET_H_ + diff --git a/wxmsw/include/wx-3.0/wx/sound.h b/wxmsw/include/wx-3.0/wx/sound.h new file mode 100644 index 00000000..b81a11cb --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/sound.h @@ -0,0 +1,81 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/sound.h +// Purpose: wxSoundBase class +// Author: Vaclav Slavik +// Modified by: +// Created: 2004/02/01 +// Copyright: (c) 2004, Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SOUND_H_BASE_ +#define _WX_SOUND_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_SOUND + +#include "wx/object.h" + +// ---------------------------------------------------------------------------- +// wxSoundBase: common wxSound code and interface +// ---------------------------------------------------------------------------- + +// Flags for wxSound::Play + +// NB: We can't use enum with some compilers, because they keep reporting +// nonexistent ambiguities between Play(unsigned) and static Play(const +// wxString&, unsigned). +#define wxSOUND_SYNC ((unsigned)0) +#define wxSOUND_ASYNC ((unsigned)1) +#define wxSOUND_LOOP ((unsigned)2) + +// Base class for wxSound implementations +class WXDLLIMPEXP_ADV wxSoundBase : public wxObject +{ +public: + // Play the sound: + bool Play(unsigned flags = wxSOUND_ASYNC) const + { + wxASSERT_MSG( (flags & wxSOUND_LOOP) == 0 || + (flags & wxSOUND_ASYNC) != 0, + wxT("sound can only be looped asynchronously") ); + return DoPlay(flags); + } + + // Plays sound from filename: + static bool Play(const wxString& filename, unsigned flags = wxSOUND_ASYNC); + +protected: + virtual bool DoPlay(unsigned flags) const = 0; +}; + +// ---------------------------------------------------------------------------- +// wxSound class implementation +// ---------------------------------------------------------------------------- + +#if defined(__WINDOWS__) + #include "wx/msw/sound.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/sound.h" +#elif defined(__WXMAC__) + #include "wx/osx/sound.h" +#elif defined(__WXPM__) + #include "wx/os2/sound.h" +#elif defined(__UNIX__) + #include "wx/unix/sound.h" +#endif + +// ---------------------------------------------------------------------------- +// wxSoundBase methods +// ---------------------------------------------------------------------------- + +inline bool wxSoundBase::Play(const wxString& filename, unsigned flags) +{ + wxSound snd(filename); + return snd.IsOk() ? snd.Play(flags) : false; +} + +#endif // wxUSE_SOUND + +#endif // _WX_SOUND_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/spinbutt.h b/wxmsw/include/wx-3.0/wx/spinbutt.h new file mode 100644 index 00000000..cb11e298 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/spinbutt.h @@ -0,0 +1,142 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/spinbutt.h +// Purpose: wxSpinButtonBase class +// Author: Julian Smart, Vadim Zeitlin +// Modified by: +// Created: 23.07.99 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SPINBUTT_H_BASE_ +#define _WX_SPINBUTT_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_SPINBTN + +#include "wx/control.h" +#include "wx/event.h" +#include "wx/range.h" + +#define wxSPIN_BUTTON_NAME wxT("wxSpinButton") + +// ---------------------------------------------------------------------------- +// The wxSpinButton is like a small scrollbar than is often placed next +// to a text control. +// +// Styles: +// wxSP_HORIZONTAL: horizontal spin button +// wxSP_VERTICAL: vertical spin button (the default) +// wxSP_ARROW_KEYS: arrow keys increment/decrement value +// wxSP_WRAP: value wraps at either end +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSpinButtonBase : public wxControl +{ +public: + // ctor initializes the range with the default (0..100) values + wxSpinButtonBase() { m_min = 0; m_max = 100; } + + // accessors + virtual int GetValue() const = 0; + virtual int GetMin() const { return m_min; } + virtual int GetMax() const { return m_max; } + wxRange GetRange() const { return wxRange( GetMin(), GetMax() );} + + // operations + virtual void SetValue(int val) = 0; + virtual void SetMin(int minVal) { SetRange ( minVal , m_max ) ; } + virtual void SetMax(int maxVal) { SetRange ( m_min , maxVal ) ; } + virtual void SetRange(int minVal, int maxVal) + { + m_min = minVal; + m_max = maxVal; + } + void SetRange( const wxRange& range) { SetRange( range.GetMin(), range.GetMax()); } + + // is this spin button vertically oriented? + bool IsVertical() const { return (m_windowStyle & wxSP_VERTICAL) != 0; } + +protected: + // the range value + int m_min; + int m_max; + + wxDECLARE_NO_COPY_CLASS(wxSpinButtonBase); +}; + +// ---------------------------------------------------------------------------- +// include the declaration of the real class +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/spinbutt.h" +#elif defined(__WXMSW__) + #include "wx/msw/spinbutt.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/spinbutt.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/spinbutt.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/spinbutt.h" +#elif defined(__WXMAC__) + #include "wx/osx/spinbutt.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/spinbutt.h" +#elif defined(__WXPM__) + #include "wx/os2/spinbutt.h" +#endif + +// ---------------------------------------------------------------------------- +// the wxSpinButton event +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSpinEvent : public wxNotifyEvent +{ +public: + wxSpinEvent(wxEventType commandType = wxEVT_NULL, int winid = 0) + : wxNotifyEvent(commandType, winid) + { + } + + wxSpinEvent(const wxSpinEvent& event) : wxNotifyEvent(event) {} + + // get the current value of the control + int GetValue() const { return m_commandInt; } + void SetValue(int value) { m_commandInt = value; } + + int GetPosition() const { return m_commandInt; } + void SetPosition(int pos) { m_commandInt = pos; } + + virtual wxEvent *Clone() const { return new wxSpinEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSpinEvent) +}; + +typedef void (wxEvtHandler::*wxSpinEventFunction)(wxSpinEvent&); + +#define wxSpinEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxSpinEventFunction, func) + +// macros for handling spin events: notice that we must use the real values of +// the event type constants and not their references (wxEVT_SPIN[_UP/DOWN]) +// here as otherwise the event tables could end up with non-initialized +// (because of undefined initialization order of the globals defined in +// different translation units) references in them +#define EVT_SPIN_UP(winid, func) \ + wx__DECLARE_EVT1(wxEVT_SPIN_UP, winid, wxSpinEventHandler(func)) +#define EVT_SPIN_DOWN(winid, func) \ + wx__DECLARE_EVT1(wxEVT_SPIN_DOWN, winid, wxSpinEventHandler(func)) +#define EVT_SPIN(winid, func) \ + wx__DECLARE_EVT1(wxEVT_SPIN, winid, wxSpinEventHandler(func)) + +#endif // wxUSE_SPINBTN + +#endif + // _WX_SPINBUTT_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/spinctrl.h b/wxmsw/include/wx-3.0/wx/spinctrl.h new file mode 100644 index 00000000..7a7b3a4b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/spinctrl.h @@ -0,0 +1,155 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/spinctrl.h +// Purpose: wxSpinCtrlBase class +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.07.99 +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SPINCTRL_H_ +#define _WX_SPINCTRL_H_ + +#include "wx/defs.h" + +#if wxUSE_SPINCTRL + +#include "wx/spinbutt.h" // should make wxSpinEvent visible to the app + +// Events +class WXDLLIMPEXP_FWD_CORE wxSpinDoubleEvent; + +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SPINCTRL, wxSpinEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SPINCTRLDOUBLE, wxSpinDoubleEvent); + +// ---------------------------------------------------------------------------- +// A spin ctrl is a text control with a spin button which is usually used to +// prompt the user for a numeric input. +// There are two kinds for number types T=integer or T=double. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSpinCtrlBase : public wxControl +{ +public: + wxSpinCtrlBase() {} + + // accessor functions that derived classes are expected to have + // T GetValue() const + // T GetMin() const + // T GetMax() const + // T GetIncrement() const + virtual bool GetSnapToTicks() const = 0; + // unsigned GetDigits() const - wxSpinCtrlDouble only + + // operation functions that derived classes are expected to have + virtual void SetValue(const wxString& value) = 0; + // void SetValue(T val) + // void SetRange(T minVal, T maxVal) + // void SetIncrement(T inc) + virtual void SetSnapToTicks(bool snap_to_ticks) = 0; + // void SetDigits(unsigned digits) - wxSpinCtrlDouble only + + // The base for numbers display, e.g. 10 or 16. + virtual int GetBase() const = 0; + virtual bool SetBase(int base) = 0; + + // Select text in the textctrl + virtual void SetSelection(long from, long to) = 0; + +private: + wxDECLARE_NO_COPY_CLASS(wxSpinCtrlBase); +}; + +// ---------------------------------------------------------------------------- +// wxSpinDoubleEvent - a wxSpinEvent for double valued controls +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSpinDoubleEvent : public wxNotifyEvent +{ +public: + wxSpinDoubleEvent(wxEventType commandType = wxEVT_NULL, int winid = 0, + double value = 0) + : wxNotifyEvent(commandType, winid), m_value(value) + { + } + + wxSpinDoubleEvent(const wxSpinDoubleEvent& event) + : wxNotifyEvent(event), m_value(event.GetValue()) + { + } + + double GetValue() const { return m_value; } + void SetValue(double value) { m_value = value; } + + virtual wxEvent *Clone() const { return new wxSpinDoubleEvent(*this); } + +protected: + double m_value; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSpinDoubleEvent) +}; + +// ---------------------------------------------------------------------------- +// wxSpinDoubleEvent event type, see also wxSpinEvent in wx/spinbutt.h +// ---------------------------------------------------------------------------- + +typedef void (wxEvtHandler::*wxSpinDoubleEventFunction)(wxSpinDoubleEvent&); + +#define wxSpinDoubleEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxSpinDoubleEventFunction, func) + +// macros for handling spinctrl events + +#define EVT_SPINCTRL(id, fn) \ + wx__DECLARE_EVT1(wxEVT_SPINCTRL, id, wxSpinEventHandler(fn)) + +#define EVT_SPINCTRLDOUBLE(id, fn) \ + wx__DECLARE_EVT1(wxEVT_SPINCTRLDOUBLE, id, wxSpinDoubleEventHandler(fn)) + +// ---------------------------------------------------------------------------- +// include the platform-dependent class implementation +// ---------------------------------------------------------------------------- + +// we may have a native wxSpinCtrl implementation, native wxSpinCtrl and +// wxSpinCtrlDouble implementations or neither, define the appropriate symbols +// and include the generic version if necessary to provide the missing class(es) + +#if defined(__WXUNIVERSAL__) + // nothing, use generic controls +#elif defined(__WXMSW__) + #define wxHAS_NATIVE_SPINCTRL + #include "wx/msw/spinctrl.h" +#elif defined(__WXPM__) + #define wxHAS_NATIVE_SPINCTRL + #include "wx/os2/spinctrl.h" +#elif defined(__WXGTK20__) + #define wxHAS_NATIVE_SPINCTRL + #define wxHAS_NATIVE_SPINCTRLDOUBLE + #include "wx/gtk/spinctrl.h" +#elif defined(__WXGTK__) + #define wxHAS_NATIVE_SPINCTRL + #include "wx/gtk1/spinctrl.h" +#endif // platform + +#if !defined(wxHAS_NATIVE_SPINCTRL) || !defined(wxHAS_NATIVE_SPINCTRLDOUBLE) + #include "wx/generic/spinctlg.h" +#endif + +namespace wxPrivate +{ + +// This is an internal helper function currently used by all ports: return the +// string containing hexadecimal representation of the given number. +extern wxString wxSpinCtrlFormatAsHex(long val, long maxVal); + +} // namespace wxPrivate + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_SPINCTRL_UPDATED wxEVT_SPINCTRL +#define wxEVT_COMMAND_SPINCTRLDOUBLE_UPDATED wxEVT_SPINCTRLDOUBLE + +#endif // wxUSE_SPINCTRL + +#endif // _WX_SPINCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/splash.h b/wxmsw/include/wx-3.0/wx/splash.h new file mode 100644 index 00000000..e4fb0c21 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/splash.h @@ -0,0 +1,17 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/splash.h +// Purpose: Base header for wxSplashScreen +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SPLASH_H_BASE_ +#define _WX_SPLASH_H_BASE_ + +#include "wx/generic/splash.h" + +#endif + // _WX_SPLASH_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/splitter.h b/wxmsw/include/wx-3.0/wx/splitter.h new file mode 100644 index 00000000..f36d2923 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/splitter.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/splitter.h +// Purpose: Base header for wxSplitterWindow +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SPLITTER_H_BASE_ +#define _WX_SPLITTER_H_BASE_ + +#include "wx/event.h" + +// ---------------------------------------------------------------------------- +// wxSplitterWindow flags +// ---------------------------------------------------------------------------- + +#define wxSP_NOBORDER 0x0000 +#define wxSP_THIN_SASH 0x0000 // NB: the default is 3D sash +#define wxSP_NOSASH 0x0010 +#define wxSP_PERMIT_UNSPLIT 0x0040 +#define wxSP_LIVE_UPDATE 0x0080 +#define wxSP_3DSASH 0x0100 +#define wxSP_3DBORDER 0x0200 +#define wxSP_NO_XP_THEME 0x0400 +#define wxSP_BORDER wxSP_3DBORDER +#define wxSP_3D (wxSP_3DBORDER | wxSP_3DSASH) + +#if WXWIN_COMPATIBILITY_2_6 + // obsolete styles, don't do anything + #define wxSP_SASH_AQUA 0 + #define wxSP_FULLSASH 0 +#endif // WXWIN_COMPATIBILITY_2_6 + +class WXDLLIMPEXP_FWD_CORE wxSplitterEvent; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_SPLITTER_SASH_POS_CHANGED, wxSplitterEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_SPLITTER_SASH_POS_CHANGING, wxSplitterEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_SPLITTER_DOUBLECLICKED, wxSplitterEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_SPLITTER_UNSPLIT, wxSplitterEvent ); + +#include "wx/generic/splitter.h" + +#endif // _WX_SPLITTER_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/srchctrl.h b/wxmsw/include/wx-3.0/wx/srchctrl.h new file mode 100644 index 00000000..3ca46225 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/srchctrl.h @@ -0,0 +1,102 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/srchctrl.h +// Purpose: wxSearchCtrlBase class +// Author: Vince Harron +// Created: 2006-02-18 +// Copyright: (c) Vince Harron +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SEARCHCTRL_H_BASE_ +#define _WX_SEARCHCTRL_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_SEARCHCTRL + +#include "wx/textctrl.h" + +#if !defined(__WXUNIVERSAL__) && defined(__WXMAC__) + // search control was introduced in Mac OS X 10.3 Panther + #define wxUSE_NATIVE_SEARCH_CONTROL 1 + + #define wxSearchCtrlBaseBaseClass wxTextCtrl +#else + // no native version, use the generic one + #define wxUSE_NATIVE_SEARCH_CONTROL 0 + + #include "wx/compositewin.h" + #include "wx/containr.h" + + class WXDLLIMPEXP_CORE wxSearchCtrlBaseBaseClass + : public wxCompositeWindow< wxNavigationEnabled<wxControl> >, + public wxTextCtrlIface + { + }; +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +extern WXDLLIMPEXP_DATA_CORE(const char) wxSearchCtrlNameStr[]; + +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SEARCHCTRL_CANCEL_BTN, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SEARCHCTRL_SEARCH_BTN, wxCommandEvent); + +// ---------------------------------------------------------------------------- +// a search ctrl is a text control with a search button and a cancel button +// it is based on the MacOSX 10.3 control HISearchFieldCreate +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSearchCtrlBase : public wxSearchCtrlBaseBaseClass +{ +public: + wxSearchCtrlBase() { } + virtual ~wxSearchCtrlBase() { } + + // search control +#if wxUSE_MENUS + virtual void SetMenu(wxMenu *menu) = 0; + virtual wxMenu *GetMenu() = 0; +#endif // wxUSE_MENUS + + // get/set options + virtual void ShowSearchButton( bool show ) = 0; + virtual bool IsSearchButtonVisible() const = 0; + + virtual void ShowCancelButton( bool show ) = 0; + virtual bool IsCancelButtonVisible() const = 0; + +private: + // implement wxTextEntry pure virtual method + virtual wxWindow *GetEditableWindow() { return this; } +}; + + +// include the platform-dependent class implementation +#if wxUSE_NATIVE_SEARCH_CONTROL + #if defined(__WXMAC__) + #include "wx/osx/srchctrl.h" + #endif +#else + #include "wx/generic/srchctlg.h" +#endif + +// ---------------------------------------------------------------------------- +// macros for handling search events +// ---------------------------------------------------------------------------- + +#define EVT_SEARCHCTRL_CANCEL_BTN(id, fn) \ + wx__DECLARE_EVT1(wxEVT_SEARCHCTRL_CANCEL_BTN, id, wxCommandEventHandler(fn)) + +#define EVT_SEARCHCTRL_SEARCH_BTN(id, fn) \ + wx__DECLARE_EVT1(wxEVT_SEARCHCTRL_SEARCH_BTN, id, wxCommandEventHandler(fn)) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_SEARCHCTRL_CANCEL_BTN wxEVT_SEARCHCTRL_CANCEL_BTN +#define wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN wxEVT_SEARCHCTRL_SEARCH_BTN + +#endif // wxUSE_SEARCHCTRL + +#endif // _WX_SEARCHCTRL_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/sstream.h b/wxmsw/include/wx-3.0/wx/sstream.h new file mode 100644 index 00000000..b0b2290f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/sstream.h @@ -0,0 +1,111 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/sstream.h +// Purpose: string-based streams +// Author: Vadim Zeitlin +// Modified by: +// Created: 2004-09-19 +// Copyright: (c) 2004 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SSTREAM_H_ +#define _WX_SSTREAM_H_ + +#include "wx/stream.h" + +#if wxUSE_STREAMS + +// ---------------------------------------------------------------------------- +// wxStringInputStream is a stream reading from the given (fixed size) string +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStringInputStream : public wxInputStream +{ +public: + // ctor associates the stream with the given string which makes a copy of + // it + wxStringInputStream(const wxString& s); + + virtual wxFileOffset GetLength() const; + virtual bool IsSeekable() const { return true; } + +protected: + virtual wxFileOffset OnSysSeek(wxFileOffset ofs, wxSeekMode mode); + virtual wxFileOffset OnSysTell() const; + virtual size_t OnSysRead(void *buffer, size_t size); + +private: + // the string that was passed in the ctor + wxString m_str; + + // the buffer we're reading from + wxCharBuffer m_buf; + + // length of the buffer we're reading from + size_t m_len; + + // position in the stream in bytes, *not* in chars + size_t m_pos; + + wxDECLARE_NO_COPY_CLASS(wxStringInputStream); +}; + +// ---------------------------------------------------------------------------- +// wxStringOutputStream writes data to the given string, expanding it as needed +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStringOutputStream : public wxOutputStream +{ +public: + // The stream will write data either to the provided string or to an + // internal string which can be retrieved using GetString() + // + // Note that the conversion object should have the life time greater than + // this stream. + wxStringOutputStream(wxString *pString = NULL, + wxMBConv& conv = wxConvUTF8) + : m_conv(conv) +#if wxUSE_UNICODE + , m_unconv(0) +#endif // wxUSE_UNICODE + { + m_str = pString ? pString : &m_strInternal; + m_pos = m_str->length() / sizeof(wxChar); + } + + // get the string containing current output + const wxString& GetString() const { return *m_str; } + + virtual bool IsSeekable() const { return true; } + +protected: + virtual wxFileOffset OnSysTell() const; + virtual size_t OnSysWrite(const void *buffer, size_t size); + +private: + // internal string, not used if caller provided his own string + wxString m_strInternal; + + // pointer given by the caller or just pointer to m_strInternal + wxString *m_str; + + // position in the stream in bytes, *not* in chars + size_t m_pos; + + // converter to use: notice that with the default UTF-8 one the input + // stream must contain valid UTF-8 data, use wxConvISO8859_1 to work with + // arbitrary 8 bit data + wxMBConv& m_conv; + +#if wxUSE_UNICODE + // unconverted data from the last call to OnSysWrite() + wxMemoryBuffer m_unconv; +#endif // wxUSE_UNICODE + + wxDECLARE_NO_COPY_CLASS(wxStringOutputStream); +}; + +#endif // wxUSE_STREAMS + +#endif // _WX_SSTREAM_H_ + diff --git a/wxmsw/include/wx-3.0/wx/stack.h b/wxmsw/include/wx-3.0/wx/stack.h new file mode 100644 index 00000000..b4e8ed2f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/stack.h @@ -0,0 +1,85 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/stack.h +// Purpose: STL stack clone +// Author: Lindsay Mathieson, Vadim Zeitlin +// Created: 30.07.2001 +// Copyright: (c) 2001 Lindsay Mathieson <lindsay@mathieson.org> (WX_DECLARE_STACK) +// 2011 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STACK_H_ +#define _WX_STACK_H_ + +#include "wx/vector.h" + +#if wxUSE_STD_CONTAINERS + +#include <stack> +#define wxStack std::stack + +#else // !wxUSE_STD_CONTAINERS + +// Notice that unlike std::stack, wxStack currently always uses wxVector and +// can't be used with any other underlying container type. +// +// Another difference is that comparison operators between stacks are not +// implemented (but they should be, see 23.2.3.3 of ISO/IEC 14882:1998). + +template <typename T> +class wxStack +{ +public: + typedef wxVector<T> container_type; + typedef typename container_type::size_type size_type; + typedef typename container_type::value_type value_type; + + wxStack() { } + explicit wxStack(const container_type& cont) : m_cont(cont) { } + + // Default copy ctor, assignment operator and dtor are ok. + + + bool empty() const { return m_cont.empty(); } + size_type size() const { return m_cont.size(); } + + value_type& top() { return m_cont.back(); } + const value_type& top() const { return m_cont.back(); } + + void push(const value_type& val) { m_cont.push_back(val); } + void pop() { m_cont.pop_back(); } + +private: + container_type m_cont; +}; + +#endif // wxUSE_STD_CONTAINERS/!wxUSE_STD_CONTAINERS + + +// Deprecated macro-based class for compatibility only, don't use any more. +#define WX_DECLARE_STACK(obj, cls) \ +class cls : public wxVector<obj> \ +{\ +public:\ + void push(const obj& o)\ + {\ + push_back(o); \ + };\ +\ + void pop()\ + {\ + pop_back(); \ + };\ +\ + obj& top()\ + {\ + return at(size() - 1);\ + };\ + const obj& top() const\ + {\ + return at(size() - 1); \ + };\ +} + +#endif // _WX_STACK_H_ + diff --git a/wxmsw/include/wx-3.0/wx/stackwalk.h b/wxmsw/include/wx-3.0/wx/stackwalk.h new file mode 100644 index 00000000..1133d6ef --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/stackwalk.h @@ -0,0 +1,159 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/stackwalk.h +// Purpose: wxStackWalker and related classes, common part +// Author: Vadim Zeitlin +// Modified by: +// Created: 2005-01-07 +// Copyright: (c) 2004 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STACKWALK_H_ +#define _WX_STACKWALK_H_ + +#include "wx/defs.h" + +#if wxUSE_STACKWALKER + +class WXDLLIMPEXP_FWD_BASE wxStackFrame; + +#define wxSTACKWALKER_MAX_DEPTH (200) + +// ---------------------------------------------------------------------------- +// wxStackFrame: a single stack level +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStackFrameBase +{ +private: + // put this inline function here so that it is defined before use + wxStackFrameBase *ConstCast() const + { return const_cast<wxStackFrameBase *>(this); } + +public: + wxStackFrameBase(size_t level, void *address = NULL) + { + m_level = level; + + m_line = + m_offset = 0; + + m_address = address; + } + + // get the level of this frame (deepest/innermost one is 0) + size_t GetLevel() const { return m_level; } + + // return the address of this frame + void *GetAddress() const { return m_address; } + + + // return the unmangled (if possible) name of the function containing this + // frame + wxString GetName() const { ConstCast()->OnGetName(); return m_name; } + + // return the instruction pointer offset from the start of the function + size_t GetOffset() const { ConstCast()->OnGetName(); return m_offset; } + + // get the module this function belongs to (not always available) + wxString GetModule() const { ConstCast()->OnGetName(); return m_module; } + + + // return true if we have the filename and line number for this frame + bool HasSourceLocation() const { return !GetFileName().empty(); } + + // return the name of the file containing this frame, empty if + // unavailable (typically because debug info is missing) + wxString GetFileName() const + { ConstCast()->OnGetLocation(); return m_filename; } + + // return the line number of this frame, 0 if unavailable + size_t GetLine() const { ConstCast()->OnGetLocation(); return m_line; } + + + // return the number of parameters of this function (may return 0 if we + // can't retrieve the parameters info even although the function does have + // parameters) + virtual size_t GetParamCount() const { return 0; } + + // get the name, type and value (in text form) of the given parameter + // + // any pointer may be NULL + // + // return true if at least some values could be retrieved + virtual bool GetParam(size_t WXUNUSED(n), + wxString * WXUNUSED(type), + wxString * WXUNUSED(name), + wxString * WXUNUSED(value)) const + { + return false; + } + + + // although this class is not supposed to be used polymorphically, give it + // a virtual dtor to silence compiler warnings + virtual ~wxStackFrameBase() { } + +protected: + // hooks for derived classes to initialize some fields on demand + virtual void OnGetName() { } + virtual void OnGetLocation() { } + + + // fields are protected, not private, so that OnGetXXX() could modify them + // directly + size_t m_level; + + wxString m_name, + m_module, + m_filename; + + size_t m_line; + + void *m_address; + size_t m_offset; +}; + +// ---------------------------------------------------------------------------- +// wxStackWalker: class for enumerating stack frames +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStackWalkerBase +{ +public: + // ctor does nothing, use Walk() to walk the stack + wxStackWalkerBase() { } + + // dtor does nothing neither but should be virtual + virtual ~wxStackWalkerBase() { } + + // enumerate stack frames from the current location, skipping the initial + // number of them (this can be useful when Walk() is called from some known + // location and you don't want to see the first few frames anyhow; also + // notice that Walk() frame itself is not included if skip >= 1) + virtual void Walk(size_t skip = 1, size_t maxDepth = wxSTACKWALKER_MAX_DEPTH) = 0; + +#if wxUSE_ON_FATAL_EXCEPTION + // enumerate stack frames from the location of uncaught exception + // + // this version can only be called from wxApp::OnFatalException() + virtual void WalkFromException(size_t maxDepth = wxSTACKWALKER_MAX_DEPTH) = 0; +#endif // wxUSE_ON_FATAL_EXCEPTION + +protected: + // this function must be overrided to process the given frame + virtual void OnStackFrame(const wxStackFrame& frame) = 0; +}; + +#ifdef __WINDOWS__ + #include "wx/msw/stackwalk.h" +#elif defined(__UNIX__) + #include "wx/unix/stackwalk.h" +#else + #error "wxStackWalker is not supported, set wxUSE_STACKWALKER to 0" +#endif + +#endif // wxUSE_STACKWALKER + +#endif // _WX_STACKWALK_H_ + diff --git a/wxmsw/include/wx-3.0/wx/statbmp.h b/wxmsw/include/wx-3.0/wx/statbmp.h new file mode 100644 index 00000000..e86f45b5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/statbmp.h @@ -0,0 +1,76 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/statbmp.h +// Purpose: wxStaticBitmap class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 25.08.00 +// Copyright: (c) 2000 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STATBMP_H_BASE_ +#define _WX_STATBMP_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_STATBMP + +#include "wx/control.h" +#include "wx/bitmap.h" +#include "wx/icon.h" + +extern WXDLLIMPEXP_DATA_CORE(const char) wxStaticBitmapNameStr[]; + +// a control showing an icon or a bitmap +class WXDLLIMPEXP_CORE wxStaticBitmapBase : public wxControl +{ +public: + wxStaticBitmapBase() { } + virtual ~wxStaticBitmapBase(); + + // our interface + virtual void SetIcon(const wxIcon& icon) = 0; + virtual void SetBitmap(const wxBitmap& bitmap) = 0; + virtual wxBitmap GetBitmap() const = 0; + virtual wxIcon GetIcon() const /* = 0 -- should be pure virtual */ + { + // stub it out here for now as not all ports implement it (but they + // should) + return wxIcon(); + } + + // overridden base class virtuals + virtual bool AcceptsFocus() const { return false; } + virtual bool HasTransparentBackground() { return true; } + +protected: + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + virtual wxSize DoGetBestSize() const; + + wxDECLARE_NO_COPY_CLASS(wxStaticBitmapBase); +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/statbmp.h" +#elif defined(__WXMSW__) + #include "wx/msw/statbmp.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/statbmp.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/statbmp.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/statbmp.h" +#elif defined(__WXMAC__) + #include "wx/osx/statbmp.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/statbmp.h" +#elif defined(__WXPM__) + #include "wx/os2/statbmp.h" +#endif + +#endif // wxUSE_STATBMP + +#endif + // _WX_STATBMP_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/statbox.h b/wxmsw/include/wx-3.0/wx/statbox.h new file mode 100644 index 00000000..d01f2579 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/statbox.h @@ -0,0 +1,76 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/statbox.h +// Purpose: wxStaticBox base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STATBOX_H_BASE_ +#define _WX_STATBOX_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_STATBOX + +#include "wx/control.h" +#include "wx/containr.h" + +extern WXDLLIMPEXP_DATA_CORE(const char) wxStaticBoxNameStr[]; + +// ---------------------------------------------------------------------------- +// wxStaticBox: a grouping box with a label +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxStaticBoxBase : public wxNavigationEnabled<wxControl> +{ +public: + wxStaticBoxBase(); + + // overridden base class virtuals + virtual bool HasTransparentBackground() { return true; } + + // implementation only: this is used by wxStaticBoxSizer to account for the + // need for extra space taken by the static box + // + // the top border is the margin at the top (where the title is), + // borderOther is the margin on all other sides + virtual void GetBordersForSizer(int *borderTop, int *borderOther) const + { + const int BORDER = 5; // FIXME: hardcoded value + + *borderTop = GetLabel().empty() ? BORDER : GetCharHeight(); + *borderOther = BORDER; + } + +protected: + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + wxDECLARE_NO_COPY_CLASS(wxStaticBoxBase); +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/statbox.h" +#elif defined(__WXMSW__) + #include "wx/msw/statbox.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/statbox.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/statbox.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/statbox.h" +#elif defined(__WXMAC__) + #include "wx/osx/statbox.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/statbox.h" +#elif defined(__WXPM__) + #include "wx/os2/statbox.h" +#endif + +#endif // wxUSE_STATBOX + +#endif + // _WX_STATBOX_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/statline.h b/wxmsw/include/wx-3.0/wx/statline.h new file mode 100644 index 00000000..4f9e0f15 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/statline.h @@ -0,0 +1,105 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/statline.h +// Purpose: wxStaticLine class interface +// Author: Vadim Zeitlin +// Created: 28.06.99 +// Copyright: (c) 1999 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STATLINE_H_BASE_ +#define _WX_STATLINE_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// this defines wxUSE_STATLINE +#include "wx/defs.h" + +#if wxUSE_STATLINE + +// the base class declaration +#include "wx/control.h" + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +// the default name for objects of class wxStaticLine +extern WXDLLIMPEXP_DATA_CORE(const char) wxStaticLineNameStr[]; + +// ---------------------------------------------------------------------------- +// wxStaticLine - a line in a dialog +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxStaticLineBase : public wxControl +{ +public: + // constructor + wxStaticLineBase() { } + + // is the line vertical? + bool IsVertical() const { return (GetWindowStyle() & wxLI_VERTICAL) != 0; } + + // get the default size for the "lesser" dimension of the static line + static int GetDefaultSize() { return 2; } + + // overridden base class virtuals + virtual bool AcceptsFocus() const { return false; } + +protected: + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + // set the right size for the right dimension + wxSize AdjustSize(const wxSize& size) const + { + wxSize sizeReal(size); + if ( IsVertical() ) + { + if ( size.x == wxDefaultCoord ) + sizeReal.x = GetDefaultSize(); + } + else + { + if ( size.y == wxDefaultCoord ) + sizeReal.y = GetDefaultSize(); + } + + return sizeReal; + } + + virtual wxSize DoGetBestSize() const + { + return AdjustSize(wxDefaultSize); + } + + wxDECLARE_NO_COPY_CLASS(wxStaticLineBase); +}; + +// ---------------------------------------------------------------------------- +// now include the actual class declaration +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/statline.h" +#elif defined(__WXMSW__) + #include "wx/msw/statline.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/statline.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/statline.h" +#elif defined(__WXPM__) + #include "wx/os2/statline.h" +#elif defined(__WXMAC__) + #include "wx/osx/statline.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/statline.h" +#else // use generic implementation for all other platforms + #include "wx/generic/statline.h" +#endif + +#endif // wxUSE_STATLINE + +#endif // _WX_STATLINE_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/stattext.h b/wxmsw/include/wx-3.0/wx/stattext.h new file mode 100644 index 00000000..fa290775 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/stattext.h @@ -0,0 +1,110 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/stattext.h +// Purpose: wxStaticText base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STATTEXT_H_BASE_ +#define _WX_STATTEXT_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_STATTEXT + +#include "wx/control.h" + +/* + * wxStaticText flags + */ +#define wxST_NO_AUTORESIZE 0x0001 +// free 0x0002 bit +#define wxST_ELLIPSIZE_START 0x0004 +#define wxST_ELLIPSIZE_MIDDLE 0x0008 +#define wxST_ELLIPSIZE_END 0x0010 + +extern WXDLLIMPEXP_DATA_CORE(const char) wxStaticTextNameStr[]; + +class WXDLLIMPEXP_CORE wxStaticTextBase : public wxControl +{ +public: + wxStaticTextBase() { } + + // wrap the text of the control so that no line is longer than the given + // width (if possible: this function won't break words) + // This function will modify the value returned by GetLabel()! + void Wrap(int width); + + // overridden base virtuals + virtual bool AcceptsFocus() const { return false; } + virtual bool HasTransparentBackground() { return true; } + + bool IsEllipsized() const + { + return HasFlag(wxST_ELLIPSIZE_START) || + HasFlag(wxST_ELLIPSIZE_MIDDLE) || + HasFlag(wxST_ELLIPSIZE_END); + } + +protected: // functions required for wxST_ELLIPSIZE_* support + + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + // Calls Ellipsize() on the real label if necessary. Unlike GetLabelText(), + // keeps the mnemonics instead of removing them. + virtual wxString GetEllipsizedLabel() const; + + // Replaces parts of the string with ellipsis according to the ellipsize + // style. Shouldn't be called if we don't have any. + wxString Ellipsize(const wxString& label) const; + + // to be called when updating the size of the static text: + // updates the label redoing ellipsization calculations + void UpdateLabel(); + + // These functions are platform-specific and must be overridden in ports + // which do not natively support ellipsization and they must be implemented + // in a way so that the m_labelOrig member of wxControl is not touched: + + // returns the real label currently displayed inside the control. + virtual wxString DoGetLabel() const { return wxEmptyString; } + + // sets the real label currently displayed inside the control, + // _without_ invalidating the size. The text passed is always markup-free + // but may contain the mnemonic characters. + virtual void DoSetLabel(const wxString& WXUNUSED(str)) { } + +private: + wxDECLARE_NO_COPY_CLASS(wxStaticTextBase); +}; + +// see wx/generic/stattextg.h for the explanation +#ifndef wxNO_PORT_STATTEXT_INCLUDE + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/stattext.h" +#elif defined(__WXMSW__) + #include "wx/msw/stattext.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/stattext.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/stattext.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/stattext.h" +#elif defined(__WXMAC__) + #include "wx/osx/stattext.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/stattext.h" +#elif defined(__WXPM__) + #include "wx/os2/stattext.h" +#endif + +#endif // !wxNO_PORT_STATTEXT_INCLUDE + +#endif // wxUSE_STATTEXT + +#endif // _WX_STATTEXT_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/statusbr.h b/wxmsw/include/wx-3.0/wx/statusbr.h new file mode 100644 index 00000000..17e033ff --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/statusbr.h @@ -0,0 +1,248 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/statusbr.h +// Purpose: wxStatusBar class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 05.02.00 +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STATUSBR_H_BASE_ +#define _WX_STATUSBR_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_STATUSBAR + +#include "wx/control.h" +#include "wx/list.h" +#include "wx/dynarray.h" + +extern WXDLLIMPEXP_DATA_CORE(const char) wxStatusBarNameStr[]; + +// ---------------------------------------------------------------------------- +// wxStatusBar constants +// ---------------------------------------------------------------------------- + +// wxStatusBar styles +#define wxSTB_SIZEGRIP 0x0010 +#define wxSTB_SHOW_TIPS 0x0020 + +#define wxSTB_ELLIPSIZE_START 0x0040 +#define wxSTB_ELLIPSIZE_MIDDLE 0x0080 +#define wxSTB_ELLIPSIZE_END 0x0100 + +#define wxSTB_DEFAULT_STYLE (wxSTB_SIZEGRIP|wxSTB_ELLIPSIZE_END|wxSTB_SHOW_TIPS|wxFULL_REPAINT_ON_RESIZE) + + +// old compat style name: +#define wxST_SIZEGRIP wxSTB_SIZEGRIP + + +// style flags for wxStatusBar fields +#define wxSB_NORMAL 0x0000 +#define wxSB_FLAT 0x0001 +#define wxSB_RAISED 0x0002 +#define wxSB_SUNKEN 0x0003 + +// ---------------------------------------------------------------------------- +// wxStatusBarPane: an helper for wxStatusBar +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxStatusBarPane +{ +public: + wxStatusBarPane(int style = wxSB_NORMAL, int width = 0) + : m_nStyle(style), m_nWidth(width) + { m_bEllipsized = false; } + + int GetWidth() const { return m_nWidth; } + int GetStyle() const { return m_nStyle; } + wxString GetText() const { return m_text; } + + + // implementation-only from now on + // ------------------------------- + + bool IsEllipsized() const + { return m_bEllipsized; } + void SetIsEllipsized(bool isEllipsized) { m_bEllipsized = isEllipsized; } + + void SetWidth(int width) { m_nWidth = width; } + void SetStyle(int style) { m_nStyle = style; } + + // set text, return true if it changed or false if it was already set to + // this value + bool SetText(const wxString& text); + + // save the existing text on top of our stack and make the new text + // current; return true if the text really changed + bool PushText(const wxString& text); + + // restore the message saved by the last call to Push() (unless it was + // changed by an intervening call to SetText()) and return true if we + // really restored anything + bool PopText(); + +private: + int m_nStyle; + int m_nWidth; // may be negative, indicating a variable-width field + wxString m_text; + + // the array used to keep the previous values of this pane after a + // PushStatusText() call, its top element is the value to restore after the + // next PopStatusText() call while the currently shown value is always in + // m_text + wxArrayString m_arrStack; + + // is the currently shown value shown with ellipsis in the status bar? + bool m_bEllipsized; +}; + +WX_DECLARE_EXPORTED_OBJARRAY(wxStatusBarPane, wxStatusBarPaneArray); + +// ---------------------------------------------------------------------------- +// wxStatusBar: a window near the bottom of the frame used for status info +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxStatusBarBase : public wxControl +{ +public: + wxStatusBarBase(); + + virtual ~wxStatusBarBase(); + + // field count + // ----------- + + // set the number of fields and call SetStatusWidths(widths) if widths are + // given + virtual void SetFieldsCount(int number = 1, const int *widths = NULL); + int GetFieldsCount() const { return (int)m_panes.GetCount(); } + + // field text + // ---------- + + // just change or get the currently shown text + void SetStatusText(const wxString& text, int number = 0); + wxString GetStatusText(int number = 0) const; + + // change the currently shown text to the new one and save the current + // value to be restored by the next call to PopStatusText() + void PushStatusText(const wxString& text, int number = 0); + void PopStatusText(int number = 0); + + // fields widths + // ------------- + + // set status field widths as absolute numbers: positive widths mean that + // the field has the specified absolute width, negative widths are + // interpreted as the sizer options, i.e. the extra space (total space + // minus the sum of fixed width fields) is divided between the fields with + // negative width according to the abs value of the width (field with width + // -2 grows twice as much as one with width -1 &c) + virtual void SetStatusWidths(int n, const int widths[]); + + int GetStatusWidth(int n) const + { return m_panes[n].GetWidth(); } + + // field styles + // ------------ + + // Set the field border style to one of wxSB_XXX values. + virtual void SetStatusStyles(int n, const int styles[]); + + int GetStatusStyle(int n) const + { return m_panes[n].GetStyle(); } + + // geometry + // -------- + + // Get the position and size of the field's internal bounding rectangle + virtual bool GetFieldRect(int i, wxRect& rect) const = 0; + + // sets the minimal vertical size of the status bar + virtual void SetMinHeight(int height) = 0; + + // get the dimensions of the horizontal and vertical borders + virtual int GetBorderX() const = 0; + virtual int GetBorderY() const = 0; + + wxSize GetBorders() const + { return wxSize(GetBorderX(), GetBorderY()); } + + // miscellaneous + // ------------- + + const wxStatusBarPane& GetField(int n) const + { return m_panes[n]; } + + // wxWindow overrides: + + // don't want status bars to accept the focus at all + virtual bool AcceptsFocus() const { return false; } + + // the client size of a toplevel window doesn't include the status bar + virtual bool CanBeOutsideClientArea() const { return true; } + +protected: + // called after the status bar pane text changed and should update its + // display + virtual void DoUpdateStatusText(int number) = 0; + + + // wxWindow overrides: + +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip( wxToolTip *tip ) + { + wxASSERT_MSG(!HasFlag(wxSTB_SHOW_TIPS), + "Do not set tooltip(s) manually when using wxSTB_SHOW_TIPS!"); + wxWindow::DoSetToolTip(tip); + } +#endif // wxUSE_TOOLTIPS + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + + // internal helpers & data: + + // calculate the real field widths for the given total available size + wxArrayInt CalculateAbsWidths(wxCoord widthTotal) const; + + // should be called to remember if the pane text is currently being show + // ellipsized or not + void SetEllipsizedFlag(int n, bool isEllipsized); + + + // the array with the pane infos: + wxStatusBarPaneArray m_panes; + + // if true overrides the width info of the wxStatusBarPanes + bool m_bSameWidthForAllPanes; + + wxDECLARE_NO_COPY_CLASS(wxStatusBarBase); +}; + +// ---------------------------------------------------------------------------- +// include the actual wxStatusBar class declaration +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #define wxStatusBarUniv wxStatusBar + #include "wx/univ/statusbr.h" +#elif defined(__WXMSW__) && wxUSE_NATIVE_STATUSBAR + #include "wx/msw/statusbar.h" +#elif defined(__WXMAC__) + #define wxStatusBarMac wxStatusBar + #include "wx/generic/statusbr.h" + #include "wx/osx/statusbr.h" +#else + #define wxStatusBarGeneric wxStatusBar + #include "wx/generic/statusbr.h" +#endif + +#endif // wxUSE_STATUSBAR + +#endif + // _WX_STATUSBR_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/stc/stc.h b/wxmsw/include/wx-3.0/wx/stc/stc.h new file mode 100644 index 00000000..7ffab648 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/stc/stc.h @@ -0,0 +1,5013 @@ +//////////////////////////////////////////////////////////////////////////// +// Name: wx/stc/stc.h +// Purpose: A wxWidgets implementation of Scintilla. This class is the +// one meant to be used directly by wx applications. It does not +// derive directly from the Scintilla classes, and in fact there +// is no mention of Scintilla classes at all in this header. +// This class delegates all method calls and events to the +// Scintilla objects and so forth. This allows the use of +// Scintilla without polluting the namespace with all the +// classes and itentifiers from Scintilla. +// +// Author: Robin Dunn +// +// Created: 13-Jan-2000 +// Copyright: (c) 2000 by Total Control Software +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +/* + IMPORTANT: include/wx/stc/stc.h is generated by src/stc/gen_iface.py from + src/stc/stc.h.in, don't edit stc.h file as your changes will be + lost after the next regeneration, edit stc.h.in and rerun the + gen_iface.py script instead! + + Parts of this file generated by the script are found in between + the special "{{{" and "}}}" markers, the rest of it is copied + verbatim from src.h.in. + */ + +#ifndef _WX_STC_STC_H_ +#define _WX_STC_STC_H_ + +#include "wx/defs.h" + +#if wxUSE_STC + +#include "wx/control.h" +#include "wx/dnd.h" +#include "wx/stopwatch.h" +#include "wx/versioninfo.h" + +#include "wx/textentry.h" +#if wxUSE_TEXTCTRL + #include "wx/textctrl.h" +#endif // wxUSE_TEXTCTRL + +class WXDLLIMPEXP_FWD_CORE wxScrollBar; + +// SWIG can't handle "#if" type of conditionals, only "#ifdef" +#ifdef SWIG +#define STC_USE_DND 1 +#else +#if wxUSE_DRAG_AND_DROP +#define STC_USE_DND 1 +#endif +#endif + +//---------------------------------------------------------------------- +// STC constants generated section {{{ + +#define wxSTC_INVALID_POSITION -1 + +/// Define start of Scintilla messages to be greater than all Windows edit (EM_*) messages +/// as many EM_ messages can be used although that use is deprecated. +#define wxSTC_START 2000 +#define wxSTC_OPTIONAL_START 3000 +#define wxSTC_LEXER_START 4000 +#define wxSTC_WS_INVISIBLE 0 +#define wxSTC_WS_VISIBLEALWAYS 1 +#define wxSTC_WS_VISIBLEAFTERINDENT 2 +#define wxSTC_EOL_CRLF 0 +#define wxSTC_EOL_CR 1 +#define wxSTC_EOL_LF 2 + +/// The SC_CP_UTF8 value can be used to enter Unicode mode. +/// This is the same value as CP_UTF8 in Windows +#define wxSTC_CP_UTF8 65001 +#define wxSTC_MARKER_MAX 31 +#define wxSTC_MARK_CIRCLE 0 +#define wxSTC_MARK_ROUNDRECT 1 +#define wxSTC_MARK_ARROW 2 +#define wxSTC_MARK_SMALLRECT 3 +#define wxSTC_MARK_SHORTARROW 4 +#define wxSTC_MARK_EMPTY 5 +#define wxSTC_MARK_ARROWDOWN 6 +#define wxSTC_MARK_MINUS 7 +#define wxSTC_MARK_PLUS 8 + +/// Shapes used for outlining column. +#define wxSTC_MARK_VLINE 9 +#define wxSTC_MARK_LCORNER 10 +#define wxSTC_MARK_TCORNER 11 +#define wxSTC_MARK_BOXPLUS 12 +#define wxSTC_MARK_BOXPLUSCONNECTED 13 +#define wxSTC_MARK_BOXMINUS 14 +#define wxSTC_MARK_BOXMINUSCONNECTED 15 +#define wxSTC_MARK_LCORNERCURVE 16 +#define wxSTC_MARK_TCORNERCURVE 17 +#define wxSTC_MARK_CIRCLEPLUS 18 +#define wxSTC_MARK_CIRCLEPLUSCONNECTED 19 +#define wxSTC_MARK_CIRCLEMINUS 20 +#define wxSTC_MARK_CIRCLEMINUSCONNECTED 21 + +/// Invisible mark that only sets the line background colour. +#define wxSTC_MARK_BACKGROUND 22 +#define wxSTC_MARK_DOTDOTDOT 23 +#define wxSTC_MARK_ARROWS 24 +#define wxSTC_MARK_PIXMAP 25 +#define wxSTC_MARK_FULLRECT 26 +#define wxSTC_MARK_LEFTRECT 27 +#define wxSTC_MARK_AVAILABLE 28 +#define wxSTC_MARK_UNDERLINE 29 +#define wxSTC_MARK_RGBAIMAGE 30 +#define wxSTC_MARK_CHARACTER 10000 + +/// Markers used for outlining column. +#define wxSTC_MARKNUM_FOLDEREND 25 +#define wxSTC_MARKNUM_FOLDEROPENMID 26 +#define wxSTC_MARKNUM_FOLDERMIDTAIL 27 +#define wxSTC_MARKNUM_FOLDERTAIL 28 +#define wxSTC_MARKNUM_FOLDERSUB 29 +#define wxSTC_MARKNUM_FOLDER 30 +#define wxSTC_MARKNUM_FOLDEROPEN 31 +#define wxSTC_MASK_FOLDERS 0xFE000000 +#define wxSTC_MARGIN_SYMBOL 0 +#define wxSTC_MARGIN_NUMBER 1 +#define wxSTC_MARGIN_BACK 2 +#define wxSTC_MARGIN_FORE 3 +#define wxSTC_MARGIN_TEXT 4 +#define wxSTC_MARGIN_RTEXT 5 + +/// Styles in range 32..38 are predefined for parts of the UI and are not used as normal styles. +/// Style 39 is for future use. +#define wxSTC_STYLE_DEFAULT 32 +#define wxSTC_STYLE_LINENUMBER 33 +#define wxSTC_STYLE_BRACELIGHT 34 +#define wxSTC_STYLE_BRACEBAD 35 +#define wxSTC_STYLE_CONTROLCHAR 36 +#define wxSTC_STYLE_INDENTGUIDE 37 +#define wxSTC_STYLE_CALLTIP 38 +#define wxSTC_STYLE_LASTPREDEFINED 39 +#define wxSTC_STYLE_MAX 255 + +/// Character set identifiers are used in StyleSetCharacterSet. +/// The values are the same as the Windows *_CHARSET values. +#define wxSTC_CHARSET_ANSI 0 +#define wxSTC_CHARSET_DEFAULT 1 +#define wxSTC_CHARSET_BALTIC 186 +#define wxSTC_CHARSET_CHINESEBIG5 136 +#define wxSTC_CHARSET_EASTEUROPE 238 +#define wxSTC_CHARSET_GB2312 134 +#define wxSTC_CHARSET_GREEK 161 +#define wxSTC_CHARSET_HANGUL 129 +#define wxSTC_CHARSET_MAC 77 +#define wxSTC_CHARSET_OEM 255 +#define wxSTC_CHARSET_RUSSIAN 204 +#define wxSTC_CHARSET_CYRILLIC 1251 +#define wxSTC_CHARSET_SHIFTJIS 128 +#define wxSTC_CHARSET_SYMBOL 2 +#define wxSTC_CHARSET_TURKISH 162 +#define wxSTC_CHARSET_JOHAB 130 +#define wxSTC_CHARSET_HEBREW 177 +#define wxSTC_CHARSET_ARABIC 178 +#define wxSTC_CHARSET_VIETNAMESE 163 +#define wxSTC_CHARSET_THAI 222 +#define wxSTC_CHARSET_8859_15 1000 +#define wxSTC_CASE_MIXED 0 +#define wxSTC_CASE_UPPER 1 +#define wxSTC_CASE_LOWER 2 +#define wxSTC_FONT_SIZE_MULTIPLIER 100 +#define wxSTC_WEIGHT_NORMAL 400 +#define wxSTC_WEIGHT_SEMIBOLD 600 +#define wxSTC_WEIGHT_BOLD 700 + +/// Indicator style enumeration and some constants +#define wxSTC_INDIC_PLAIN 0 +#define wxSTC_INDIC_SQUIGGLE 1 +#define wxSTC_INDIC_TT 2 +#define wxSTC_INDIC_DIAGONAL 3 +#define wxSTC_INDIC_STRIKE 4 +#define wxSTC_INDIC_HIDDEN 5 +#define wxSTC_INDIC_BOX 6 +#define wxSTC_INDIC_ROUNDBOX 7 +#define wxSTC_INDIC_STRAIGHTBOX 8 +#define wxSTC_INDIC_DASH 9 +#define wxSTC_INDIC_DOTS 10 +#define wxSTC_INDIC_SQUIGGLELOW 11 +#define wxSTC_INDIC_DOTBOX 12 +#define wxSTC_INDIC_MAX 31 +#define wxSTC_INDIC_CONTAINER 8 +#define wxSTC_INDIC0_MASK 0x20 +#define wxSTC_INDIC1_MASK 0x40 +#define wxSTC_INDIC2_MASK 0x80 +#define wxSTC_INDICS_MASK 0xE0 +#define wxSTC_IV_NONE 0 +#define wxSTC_IV_REAL 1 +#define wxSTC_IV_LOOKFORWARD 2 +#define wxSTC_IV_LOOKBOTH 3 + +/// PrintColourMode - use same colours as screen. +#define wxSTC_PRINT_NORMAL 0 + +/// PrintColourMode - invert the light value of each style for printing. +#define wxSTC_PRINT_INVERTLIGHT 1 + +/// PrintColourMode - force black text on white background for printing. +#define wxSTC_PRINT_BLACKONWHITE 2 + +/// PrintColourMode - text stays coloured, but all background is forced to be white for printing. +#define wxSTC_PRINT_COLOURONWHITE 3 + +/// PrintColourMode - only the default-background is forced to be white for printing. +#define wxSTC_PRINT_COLOURONWHITEDEFAULTBG 4 +#define wxSTC_FIND_WHOLEWORD 2 +#define wxSTC_FIND_MATCHCASE 4 +#define wxSTC_FIND_WORDSTART 0x00100000 +#define wxSTC_FIND_REGEXP 0x00200000 +#define wxSTC_FIND_POSIX 0x00400000 +#define wxSTC_FOLDLEVELBASE 0x400 +#define wxSTC_FOLDLEVELWHITEFLAG 0x1000 +#define wxSTC_FOLDLEVELHEADERFLAG 0x2000 +#define wxSTC_FOLDLEVELNUMBERMASK 0x0FFF +#define wxSTC_FOLDFLAG_LINEBEFORE_EXPANDED 0x0002 +#define wxSTC_FOLDFLAG_LINEBEFORE_CONTRACTED 0x0004 +#define wxSTC_FOLDFLAG_LINEAFTER_EXPANDED 0x0008 +#define wxSTC_FOLDFLAG_LINEAFTER_CONTRACTED 0x0010 +#define wxSTC_FOLDFLAG_LEVELNUMBERS 0x0040 +#define wxSTC_TIME_FOREVER 10000000 +#define wxSTC_WRAP_NONE 0 +#define wxSTC_WRAP_WORD 1 +#define wxSTC_WRAP_CHAR 2 +#define wxSTC_WRAPVISUALFLAG_NONE 0x0000 +#define wxSTC_WRAPVISUALFLAG_END 0x0001 +#define wxSTC_WRAPVISUALFLAG_START 0x0002 +#define wxSTC_WRAPVISUALFLAG_MARGIN 0x0004 +#define wxSTC_WRAPVISUALFLAGLOC_DEFAULT 0x0000 +#define wxSTC_WRAPVISUALFLAGLOC_END_BY_TEXT 0x0001 +#define wxSTC_WRAPVISUALFLAGLOC_START_BY_TEXT 0x0002 +#define wxSTC_WRAPINDENT_FIXED 0 +#define wxSTC_WRAPINDENT_SAME 1 +#define wxSTC_WRAPINDENT_INDENT 2 +#define wxSTC_CACHE_NONE 0 +#define wxSTC_CACHE_CARET 1 +#define wxSTC_CACHE_PAGE 2 +#define wxSTC_CACHE_DOCUMENT 3 + +/// Control font anti-aliasing. +#define wxSTC_EFF_QUALITY_MASK 0xF +#define wxSTC_EFF_QUALITY_DEFAULT 0 +#define wxSTC_EFF_QUALITY_NON_ANTIALIASED 1 +#define wxSTC_EFF_QUALITY_ANTIALIASED 2 +#define wxSTC_EFF_QUALITY_LCD_OPTIMIZED 3 +#define wxSTC_MULTIPASTE_ONCE 0 +#define wxSTC_MULTIPASTE_EACH 1 +#define wxSTC_EDGE_NONE 0 +#define wxSTC_EDGE_LINE 1 +#define wxSTC_EDGE_BACKGROUND 2 +#define wxSTC_STATUS_OK 0 +#define wxSTC_STATUS_FAILURE 1 +#define wxSTC_STATUS_BADALLOC 2 +#define wxSTC_CURSORNORMAL -1 +#define wxSTC_CURSORARROW 2 +#define wxSTC_CURSORWAIT 4 +#define wxSTC_CURSORREVERSEARROW 7 + +/// Constants for use with SetVisiblePolicy, similar to SetCaretPolicy. +#define wxSTC_VISIBLE_SLOP 0x01 +#define wxSTC_VISIBLE_STRICT 0x04 + +/// Caret policy, used by SetXCaretPolicy and SetYCaretPolicy. +/// If CARET_SLOP is set, we can define a slop value: caretSlop. +/// This value defines an unwanted zone (UZ) where the caret is... unwanted. +/// This zone is defined as a number of pixels near the vertical margins, +/// and as a number of lines near the horizontal margins. +/// By keeping the caret away from the edges, it is seen within its context, +/// so it is likely that the identifier that the caret is on can be completely seen, +/// and that the current line is seen with some of the lines following it which are +/// often dependent on that line. +#define wxSTC_CARET_SLOP 0x01 + +/// If CARET_STRICT is set, the policy is enforced... strictly. +/// The caret is centred on the display if slop is not set, +/// and cannot go in the UZ if slop is set. +#define wxSTC_CARET_STRICT 0x04 + +/// If CARET_JUMPS is set, the display is moved more energetically +/// so the caret can move in the same direction longer before the policy is applied again. +#define wxSTC_CARET_JUMPS 0x10 + +/// If CARET_EVEN is not set, instead of having symmetrical UZs, +/// the left and bottom UZs are extended up to right and top UZs respectively. +/// This way, we favour the displaying of useful information: the begining of lines, +/// where most code reside, and the lines after the caret, eg. the body of a function. +#define wxSTC_CARET_EVEN 0x08 +#define wxSTC_SEL_STREAM 0 +#define wxSTC_SEL_RECTANGLE 1 +#define wxSTC_SEL_LINES 2 +#define wxSTC_SEL_THIN 3 +#define wxSTC_CASEINSENSITIVEBEHAVIOUR_RESPECTCASE 0 +#define wxSTC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE 1 +#define wxSTC_CARETSTICKY_OFF 0 +#define wxSTC_CARETSTICKY_ON 1 +#define wxSTC_CARETSTICKY_WHITESPACE 2 +#define wxSTC_ALPHA_TRANSPARENT 0 +#define wxSTC_ALPHA_OPAQUE 255 +#define wxSTC_ALPHA_NOALPHA 256 +#define wxSTC_CARETSTYLE_INVISIBLE 0 +#define wxSTC_CARETSTYLE_LINE 1 +#define wxSTC_CARETSTYLE_BLOCK 2 +#define wxSTC_MARGINOPTION_NONE 0 +#define wxSTC_MARGINOPTION_SUBLINESELECT 1 +#define wxSTC_ANNOTATION_HIDDEN 0 +#define wxSTC_ANNOTATION_STANDARD 1 +#define wxSTC_ANNOTATION_BOXED 2 +#define wxSTC_UNDO_MAY_COALESCE 1 +#define wxSTC_SCVS_NONE 0 +#define wxSTC_SCVS_RECTANGULARSELECTION 1 +#define wxSTC_SCVS_USERACCESSIBLE 2 +#define wxSTC_TECHNOLOGY_DEFAULT 0 +#define wxSTC_TECHNOLOGY_DIRECTWRITE 1 + +/// Maximum value of keywordSet parameter of SetKeyWords. +#define wxSTC_KEYWORDSET_MAX 8 +#define wxSTC_TYPE_BOOLEAN 0 +#define wxSTC_TYPE_INTEGER 1 +#define wxSTC_TYPE_STRING 2 + +/// Notifications +/// Type of modification and the action which caused the modification. +/// These are defined as a bit mask to make it easy to specify which notifications are wanted. +/// One bit is set from each of SC_MOD_* and SC_PERFORMED_*. +#define wxSTC_MOD_INSERTTEXT 0x1 +#define wxSTC_MOD_DELETETEXT 0x2 +#define wxSTC_MOD_CHANGESTYLE 0x4 +#define wxSTC_MOD_CHANGEFOLD 0x8 +#define wxSTC_PERFORMED_USER 0x10 +#define wxSTC_PERFORMED_UNDO 0x20 +#define wxSTC_PERFORMED_REDO 0x40 +#define wxSTC_MULTISTEPUNDOREDO 0x80 +#define wxSTC_LASTSTEPINUNDOREDO 0x100 +#define wxSTC_MOD_CHANGEMARKER 0x200 +#define wxSTC_MOD_BEFOREINSERT 0x400 +#define wxSTC_MOD_BEFOREDELETE 0x800 +#define wxSTC_MULTILINEUNDOREDO 0x1000 +#define wxSTC_STARTACTION 0x2000 +#define wxSTC_MOD_CHANGEINDICATOR 0x4000 +#define wxSTC_MOD_CHANGELINESTATE 0x8000 +#define wxSTC_MOD_CHANGEMARGIN 0x10000 +#define wxSTC_MOD_CHANGEANNOTATION 0x20000 +#define wxSTC_MOD_CONTAINER 0x40000 +#define wxSTC_MOD_LEXERSTATE 0x80000 +#define wxSTC_MODEVENTMASKALL 0xFFFFF +#define wxSTC_UPDATE_CONTENT 0x1 +#define wxSTC_UPDATE_SELECTION 0x2 +#define wxSTC_UPDATE_V_SCROLL 0x4 +#define wxSTC_UPDATE_H_SCROLL 0x8 + +/// Symbolic key codes and modifier flags. +/// ASCII and other printable characters below 256. +/// Extended keys above 300. +#define wxSTC_KEY_DOWN 300 +#define wxSTC_KEY_UP 301 +#define wxSTC_KEY_LEFT 302 +#define wxSTC_KEY_RIGHT 303 +#define wxSTC_KEY_HOME 304 +#define wxSTC_KEY_END 305 +#define wxSTC_KEY_PRIOR 306 +#define wxSTC_KEY_NEXT 307 +#define wxSTC_KEY_DELETE 308 +#define wxSTC_KEY_INSERT 309 +#define wxSTC_KEY_ESCAPE 7 +#define wxSTC_KEY_BACK 8 +#define wxSTC_KEY_TAB 9 +#define wxSTC_KEY_RETURN 13 +#define wxSTC_KEY_ADD 310 +#define wxSTC_KEY_SUBTRACT 311 +#define wxSTC_KEY_DIVIDE 312 +#define wxSTC_KEY_WIN 313 +#define wxSTC_KEY_RWIN 314 +#define wxSTC_KEY_MENU 315 +#define wxSTC_SCMOD_NORM 0 +#define wxSTC_SCMOD_SHIFT 1 +#define wxSTC_SCMOD_CTRL 2 +#define wxSTC_SCMOD_ALT 4 +#define wxSTC_SCMOD_SUPER 8 +#define wxSTC_SCMOD_META 16 + +/// For SciLexer.h +#define wxSTC_LEX_CONTAINER 0 +#define wxSTC_LEX_NULL 1 +#define wxSTC_LEX_PYTHON 2 +#define wxSTC_LEX_CPP 3 +#define wxSTC_LEX_HTML 4 +#define wxSTC_LEX_XML 5 +#define wxSTC_LEX_PERL 6 +#define wxSTC_LEX_SQL 7 +#define wxSTC_LEX_VB 8 +#define wxSTC_LEX_PROPERTIES 9 +#define wxSTC_LEX_ERRORLIST 10 +#define wxSTC_LEX_MAKEFILE 11 +#define wxSTC_LEX_BATCH 12 +#define wxSTC_LEX_XCODE 13 +#define wxSTC_LEX_LATEX 14 +#define wxSTC_LEX_LUA 15 +#define wxSTC_LEX_DIFF 16 +#define wxSTC_LEX_CONF 17 +#define wxSTC_LEX_PASCAL 18 +#define wxSTC_LEX_AVE 19 +#define wxSTC_LEX_ADA 20 +#define wxSTC_LEX_LISP 21 +#define wxSTC_LEX_RUBY 22 +#define wxSTC_LEX_EIFFEL 23 +#define wxSTC_LEX_EIFFELKW 24 +#define wxSTC_LEX_TCL 25 +#define wxSTC_LEX_NNCRONTAB 26 +#define wxSTC_LEX_BULLANT 27 +#define wxSTC_LEX_VBSCRIPT 28 +#define wxSTC_LEX_BAAN 31 +#define wxSTC_LEX_MATLAB 32 +#define wxSTC_LEX_SCRIPTOL 33 +#define wxSTC_LEX_ASM 34 +#define wxSTC_LEX_CPPNOCASE 35 +#define wxSTC_LEX_FORTRAN 36 +#define wxSTC_LEX_F77 37 +#define wxSTC_LEX_CSS 38 +#define wxSTC_LEX_POV 39 +#define wxSTC_LEX_LOUT 40 +#define wxSTC_LEX_ESCRIPT 41 +#define wxSTC_LEX_PS 42 +#define wxSTC_LEX_NSIS 43 +#define wxSTC_LEX_MMIXAL 44 +#define wxSTC_LEX_CLW 45 +#define wxSTC_LEX_CLWNOCASE 46 +#define wxSTC_LEX_LOT 47 +#define wxSTC_LEX_YAML 48 +#define wxSTC_LEX_TEX 49 +#define wxSTC_LEX_METAPOST 50 +#define wxSTC_LEX_POWERBASIC 51 +#define wxSTC_LEX_FORTH 52 +#define wxSTC_LEX_ERLANG 53 +#define wxSTC_LEX_OCTAVE 54 +#define wxSTC_LEX_MSSQL 55 +#define wxSTC_LEX_VERILOG 56 +#define wxSTC_LEX_KIX 57 +#define wxSTC_LEX_GUI4CLI 58 +#define wxSTC_LEX_SPECMAN 59 +#define wxSTC_LEX_AU3 60 +#define wxSTC_LEX_APDL 61 +#define wxSTC_LEX_BASH 62 +#define wxSTC_LEX_ASN1 63 +#define wxSTC_LEX_VHDL 64 +#define wxSTC_LEX_CAML 65 +#define wxSTC_LEX_BLITZBASIC 66 +#define wxSTC_LEX_PUREBASIC 67 +#define wxSTC_LEX_HASKELL 68 +#define wxSTC_LEX_PHPSCRIPT 69 +#define wxSTC_LEX_TADS3 70 +#define wxSTC_LEX_REBOL 71 +#define wxSTC_LEX_SMALLTALK 72 +#define wxSTC_LEX_FLAGSHIP 73 +#define wxSTC_LEX_CSOUND 74 +#define wxSTC_LEX_FREEBASIC 75 +#define wxSTC_LEX_INNOSETUP 76 +#define wxSTC_LEX_OPAL 77 +#define wxSTC_LEX_SPICE 78 +#define wxSTC_LEX_D 79 +#define wxSTC_LEX_CMAKE 80 +#define wxSTC_LEX_GAP 81 +#define wxSTC_LEX_PLM 82 +#define wxSTC_LEX_PROGRESS 83 +#define wxSTC_LEX_ABAQUS 84 +#define wxSTC_LEX_ASYMPTOTE 85 +#define wxSTC_LEX_R 86 +#define wxSTC_LEX_MAGIK 87 +#define wxSTC_LEX_POWERSHELL 88 +#define wxSTC_LEX_MYSQL 89 +#define wxSTC_LEX_PO 90 +#define wxSTC_LEX_TAL 91 +#define wxSTC_LEX_COBOL 92 +#define wxSTC_LEX_TACL 93 +#define wxSTC_LEX_SORCUS 94 +#define wxSTC_LEX_POWERPRO 95 +#define wxSTC_LEX_NIMROD 96 +#define wxSTC_LEX_SML 97 +#define wxSTC_LEX_MARKDOWN 98 +#define wxSTC_LEX_TXT2TAGS 99 +#define wxSTC_LEX_A68K 100 +#define wxSTC_LEX_MODULA 101 +#define wxSTC_LEX_COFFEESCRIPT 102 +#define wxSTC_LEX_TCMD 103 +#define wxSTC_LEX_AVS 104 +#define wxSTC_LEX_ECL 105 +#define wxSTC_LEX_OSCRIPT 106 +#define wxSTC_LEX_VISUALPROLOG 107 + +/// When a lexer specifies its language as SCLEX_AUTOMATIC it receives a +/// value assigned in sequence from SCLEX_AUTOMATIC+1. +#define wxSTC_LEX_AUTOMATIC 1000 + +/// Lexical states for SCLEX_PYTHON +#define wxSTC_P_DEFAULT 0 +#define wxSTC_P_COMMENTLINE 1 +#define wxSTC_P_NUMBER 2 +#define wxSTC_P_STRING 3 +#define wxSTC_P_CHARACTER 4 +#define wxSTC_P_WORD 5 +#define wxSTC_P_TRIPLE 6 +#define wxSTC_P_TRIPLEDOUBLE 7 +#define wxSTC_P_CLASSNAME 8 +#define wxSTC_P_DEFNAME 9 +#define wxSTC_P_OPERATOR 10 +#define wxSTC_P_IDENTIFIER 11 +#define wxSTC_P_COMMENTBLOCK 12 +#define wxSTC_P_STRINGEOL 13 +#define wxSTC_P_WORD2 14 +#define wxSTC_P_DECORATOR 15 + +/// Lexical states for SCLEX_CPP +#define wxSTC_C_DEFAULT 0 +#define wxSTC_C_COMMENT 1 +#define wxSTC_C_COMMENTLINE 2 +#define wxSTC_C_COMMENTDOC 3 +#define wxSTC_C_NUMBER 4 +#define wxSTC_C_WORD 5 +#define wxSTC_C_STRING 6 +#define wxSTC_C_CHARACTER 7 +#define wxSTC_C_UUID 8 +#define wxSTC_C_PREPROCESSOR 9 +#define wxSTC_C_OPERATOR 10 +#define wxSTC_C_IDENTIFIER 11 +#define wxSTC_C_STRINGEOL 12 +#define wxSTC_C_VERBATIM 13 +#define wxSTC_C_REGEX 14 +#define wxSTC_C_COMMENTLINEDOC 15 +#define wxSTC_C_WORD2 16 +#define wxSTC_C_COMMENTDOCKEYWORD 17 +#define wxSTC_C_COMMENTDOCKEYWORDERROR 18 +#define wxSTC_C_GLOBALCLASS 19 +#define wxSTC_C_STRINGRAW 20 +#define wxSTC_C_TRIPLEVERBATIM 21 +#define wxSTC_C_HASHQUOTEDSTRING 22 +#define wxSTC_C_PREPROCESSORCOMMENT 23 + +/// Lexical states for SCLEX_D +#define wxSTC_D_DEFAULT 0 +#define wxSTC_D_COMMENT 1 +#define wxSTC_D_COMMENTLINE 2 +#define wxSTC_D_COMMENTDOC 3 +#define wxSTC_D_COMMENTNESTED 4 +#define wxSTC_D_NUMBER 5 +#define wxSTC_D_WORD 6 +#define wxSTC_D_WORD2 7 +#define wxSTC_D_WORD3 8 +#define wxSTC_D_TYPEDEF 9 +#define wxSTC_D_STRING 10 +#define wxSTC_D_STRINGEOL 11 +#define wxSTC_D_CHARACTER 12 +#define wxSTC_D_OPERATOR 13 +#define wxSTC_D_IDENTIFIER 14 +#define wxSTC_D_COMMENTLINEDOC 15 +#define wxSTC_D_COMMENTDOCKEYWORD 16 +#define wxSTC_D_COMMENTDOCKEYWORDERROR 17 +#define wxSTC_D_STRINGB 18 +#define wxSTC_D_STRINGR 19 +#define wxSTC_D_WORD5 20 +#define wxSTC_D_WORD6 21 +#define wxSTC_D_WORD7 22 + +/// Lexical states for SCLEX_TCL +#define wxSTC_TCL_DEFAULT 0 +#define wxSTC_TCL_COMMENT 1 +#define wxSTC_TCL_COMMENTLINE 2 +#define wxSTC_TCL_NUMBER 3 +#define wxSTC_TCL_WORD_IN_QUOTE 4 +#define wxSTC_TCL_IN_QUOTE 5 +#define wxSTC_TCL_OPERATOR 6 +#define wxSTC_TCL_IDENTIFIER 7 +#define wxSTC_TCL_SUBSTITUTION 8 +#define wxSTC_TCL_SUB_BRACE 9 +#define wxSTC_TCL_MODIFIER 10 +#define wxSTC_TCL_EXPAND 11 +#define wxSTC_TCL_WORD 12 +#define wxSTC_TCL_WORD2 13 +#define wxSTC_TCL_WORD3 14 +#define wxSTC_TCL_WORD4 15 +#define wxSTC_TCL_WORD5 16 +#define wxSTC_TCL_WORD6 17 +#define wxSTC_TCL_WORD7 18 +#define wxSTC_TCL_WORD8 19 +#define wxSTC_TCL_COMMENT_BOX 20 +#define wxSTC_TCL_BLOCK_COMMENT 21 + +/// Lexical states for SCLEX_HTML, SCLEX_XML +#define wxSTC_H_DEFAULT 0 +#define wxSTC_H_TAG 1 +#define wxSTC_H_TAGUNKNOWN 2 +#define wxSTC_H_ATTRIBUTE 3 +#define wxSTC_H_ATTRIBUTEUNKNOWN 4 +#define wxSTC_H_NUMBER 5 +#define wxSTC_H_DOUBLESTRING 6 +#define wxSTC_H_SINGLESTRING 7 +#define wxSTC_H_OTHER 8 +#define wxSTC_H_COMMENT 9 +#define wxSTC_H_ENTITY 10 + +/// XML and ASP +#define wxSTC_H_TAGEND 11 +#define wxSTC_H_XMLSTART 12 +#define wxSTC_H_XMLEND 13 +#define wxSTC_H_SCRIPT 14 +#define wxSTC_H_ASP 15 +#define wxSTC_H_ASPAT 16 +#define wxSTC_H_CDATA 17 +#define wxSTC_H_QUESTION 18 + +/// More HTML +#define wxSTC_H_VALUE 19 + +/// X-Code +#define wxSTC_H_XCCOMMENT 20 + +/// SGML +#define wxSTC_H_SGML_DEFAULT 21 +#define wxSTC_H_SGML_COMMAND 22 +#define wxSTC_H_SGML_1ST_PARAM 23 +#define wxSTC_H_SGML_DOUBLESTRING 24 +#define wxSTC_H_SGML_SIMPLESTRING 25 +#define wxSTC_H_SGML_ERROR 26 +#define wxSTC_H_SGML_SPECIAL 27 +#define wxSTC_H_SGML_ENTITY 28 +#define wxSTC_H_SGML_COMMENT 29 +#define wxSTC_H_SGML_1ST_PARAM_COMMENT 30 +#define wxSTC_H_SGML_BLOCK_DEFAULT 31 + +/// Embedded Javascript +#define wxSTC_HJ_START 40 +#define wxSTC_HJ_DEFAULT 41 +#define wxSTC_HJ_COMMENT 42 +#define wxSTC_HJ_COMMENTLINE 43 +#define wxSTC_HJ_COMMENTDOC 44 +#define wxSTC_HJ_NUMBER 45 +#define wxSTC_HJ_WORD 46 +#define wxSTC_HJ_KEYWORD 47 +#define wxSTC_HJ_DOUBLESTRING 48 +#define wxSTC_HJ_SINGLESTRING 49 +#define wxSTC_HJ_SYMBOLS 50 +#define wxSTC_HJ_STRINGEOL 51 +#define wxSTC_HJ_REGEX 52 + +/// ASP Javascript +#define wxSTC_HJA_START 55 +#define wxSTC_HJA_DEFAULT 56 +#define wxSTC_HJA_COMMENT 57 +#define wxSTC_HJA_COMMENTLINE 58 +#define wxSTC_HJA_COMMENTDOC 59 +#define wxSTC_HJA_NUMBER 60 +#define wxSTC_HJA_WORD 61 +#define wxSTC_HJA_KEYWORD 62 +#define wxSTC_HJA_DOUBLESTRING 63 +#define wxSTC_HJA_SINGLESTRING 64 +#define wxSTC_HJA_SYMBOLS 65 +#define wxSTC_HJA_STRINGEOL 66 +#define wxSTC_HJA_REGEX 67 + +/// Embedded VBScript +#define wxSTC_HB_START 70 +#define wxSTC_HB_DEFAULT 71 +#define wxSTC_HB_COMMENTLINE 72 +#define wxSTC_HB_NUMBER 73 +#define wxSTC_HB_WORD 74 +#define wxSTC_HB_STRING 75 +#define wxSTC_HB_IDENTIFIER 76 +#define wxSTC_HB_STRINGEOL 77 + +/// ASP VBScript +#define wxSTC_HBA_START 80 +#define wxSTC_HBA_DEFAULT 81 +#define wxSTC_HBA_COMMENTLINE 82 +#define wxSTC_HBA_NUMBER 83 +#define wxSTC_HBA_WORD 84 +#define wxSTC_HBA_STRING 85 +#define wxSTC_HBA_IDENTIFIER 86 +#define wxSTC_HBA_STRINGEOL 87 + +/// Embedded Python +#define wxSTC_HP_START 90 +#define wxSTC_HP_DEFAULT 91 +#define wxSTC_HP_COMMENTLINE 92 +#define wxSTC_HP_NUMBER 93 +#define wxSTC_HP_STRING 94 +#define wxSTC_HP_CHARACTER 95 +#define wxSTC_HP_WORD 96 +#define wxSTC_HP_TRIPLE 97 +#define wxSTC_HP_TRIPLEDOUBLE 98 +#define wxSTC_HP_CLASSNAME 99 +#define wxSTC_HP_DEFNAME 100 +#define wxSTC_HP_OPERATOR 101 +#define wxSTC_HP_IDENTIFIER 102 + +/// PHP +#define wxSTC_HPHP_COMPLEX_VARIABLE 104 + +/// ASP Python +#define wxSTC_HPA_START 105 +#define wxSTC_HPA_DEFAULT 106 +#define wxSTC_HPA_COMMENTLINE 107 +#define wxSTC_HPA_NUMBER 108 +#define wxSTC_HPA_STRING 109 +#define wxSTC_HPA_CHARACTER 110 +#define wxSTC_HPA_WORD 111 +#define wxSTC_HPA_TRIPLE 112 +#define wxSTC_HPA_TRIPLEDOUBLE 113 +#define wxSTC_HPA_CLASSNAME 114 +#define wxSTC_HPA_DEFNAME 115 +#define wxSTC_HPA_OPERATOR 116 +#define wxSTC_HPA_IDENTIFIER 117 + +/// PHP +#define wxSTC_HPHP_DEFAULT 118 +#define wxSTC_HPHP_HSTRING 119 +#define wxSTC_HPHP_SIMPLESTRING 120 +#define wxSTC_HPHP_WORD 121 +#define wxSTC_HPHP_NUMBER 122 +#define wxSTC_HPHP_VARIABLE 123 +#define wxSTC_HPHP_COMMENT 124 +#define wxSTC_HPHP_COMMENTLINE 125 +#define wxSTC_HPHP_HSTRING_VARIABLE 126 +#define wxSTC_HPHP_OPERATOR 127 + +/// Lexical states for SCLEX_PERL +#define wxSTC_PL_DEFAULT 0 +#define wxSTC_PL_ERROR 1 +#define wxSTC_PL_COMMENTLINE 2 +#define wxSTC_PL_POD 3 +#define wxSTC_PL_NUMBER 4 +#define wxSTC_PL_WORD 5 +#define wxSTC_PL_STRING 6 +#define wxSTC_PL_CHARACTER 7 +#define wxSTC_PL_PUNCTUATION 8 +#define wxSTC_PL_PREPROCESSOR 9 +#define wxSTC_PL_OPERATOR 10 +#define wxSTC_PL_IDENTIFIER 11 +#define wxSTC_PL_SCALAR 12 +#define wxSTC_PL_ARRAY 13 +#define wxSTC_PL_HASH 14 +#define wxSTC_PL_SYMBOLTABLE 15 +#define wxSTC_PL_VARIABLE_INDEXER 16 +#define wxSTC_PL_REGEX 17 +#define wxSTC_PL_REGSUBST 18 +#define wxSTC_PL_LONGQUOTE 19 +#define wxSTC_PL_BACKTICKS 20 +#define wxSTC_PL_DATASECTION 21 +#define wxSTC_PL_HERE_DELIM 22 +#define wxSTC_PL_HERE_Q 23 +#define wxSTC_PL_HERE_QQ 24 +#define wxSTC_PL_HERE_QX 25 +#define wxSTC_PL_STRING_Q 26 +#define wxSTC_PL_STRING_QQ 27 +#define wxSTC_PL_STRING_QX 28 +#define wxSTC_PL_STRING_QR 29 +#define wxSTC_PL_STRING_QW 30 +#define wxSTC_PL_POD_VERB 31 +#define wxSTC_PL_SUB_PROTOTYPE 40 +#define wxSTC_PL_FORMAT_IDENT 41 +#define wxSTC_PL_FORMAT 42 +#define wxSTC_PL_STRING_VAR 43 +#define wxSTC_PL_XLAT 44 +#define wxSTC_PL_REGEX_VAR 54 +#define wxSTC_PL_REGSUBST_VAR 55 +#define wxSTC_PL_BACKTICKS_VAR 57 +#define wxSTC_PL_HERE_QQ_VAR 61 +#define wxSTC_PL_HERE_QX_VAR 62 +#define wxSTC_PL_STRING_QQ_VAR 64 +#define wxSTC_PL_STRING_QX_VAR 65 +#define wxSTC_PL_STRING_QR_VAR 66 + +/// Lexical states for SCLEX_RUBY +#define wxSTC_RB_DEFAULT 0 +#define wxSTC_RB_ERROR 1 +#define wxSTC_RB_COMMENTLINE 2 +#define wxSTC_RB_POD 3 +#define wxSTC_RB_NUMBER 4 +#define wxSTC_RB_WORD 5 +#define wxSTC_RB_STRING 6 +#define wxSTC_RB_CHARACTER 7 +#define wxSTC_RB_CLASSNAME 8 +#define wxSTC_RB_DEFNAME 9 +#define wxSTC_RB_OPERATOR 10 +#define wxSTC_RB_IDENTIFIER 11 +#define wxSTC_RB_REGEX 12 +#define wxSTC_RB_GLOBAL 13 +#define wxSTC_RB_SYMBOL 14 +#define wxSTC_RB_MODULE_NAME 15 +#define wxSTC_RB_INSTANCE_VAR 16 +#define wxSTC_RB_CLASS_VAR 17 +#define wxSTC_RB_BACKTICKS 18 +#define wxSTC_RB_DATASECTION 19 +#define wxSTC_RB_HERE_DELIM 20 +#define wxSTC_RB_HERE_Q 21 +#define wxSTC_RB_HERE_QQ 22 +#define wxSTC_RB_HERE_QX 23 +#define wxSTC_RB_STRING_Q 24 +#define wxSTC_RB_STRING_QQ 25 +#define wxSTC_RB_STRING_QX 26 +#define wxSTC_RB_STRING_QR 27 +#define wxSTC_RB_STRING_QW 28 +#define wxSTC_RB_WORD_DEMOTED 29 +#define wxSTC_RB_STDIN 30 +#define wxSTC_RB_STDOUT 31 +#define wxSTC_RB_STDERR 40 +#define wxSTC_RB_UPPER_BOUND 41 + +/// Lexical states for SCLEX_VB, SCLEX_VBSCRIPT, SCLEX_POWERBASIC +#define wxSTC_B_DEFAULT 0 +#define wxSTC_B_COMMENT 1 +#define wxSTC_B_NUMBER 2 +#define wxSTC_B_KEYWORD 3 +#define wxSTC_B_STRING 4 +#define wxSTC_B_PREPROCESSOR 5 +#define wxSTC_B_OPERATOR 6 +#define wxSTC_B_IDENTIFIER 7 +#define wxSTC_B_DATE 8 +#define wxSTC_B_STRINGEOL 9 +#define wxSTC_B_KEYWORD2 10 +#define wxSTC_B_KEYWORD3 11 +#define wxSTC_B_KEYWORD4 12 +#define wxSTC_B_CONSTANT 13 +#define wxSTC_B_ASM 14 +#define wxSTC_B_LABEL 15 +#define wxSTC_B_ERROR 16 +#define wxSTC_B_HEXNUMBER 17 +#define wxSTC_B_BINNUMBER 18 + +/// Lexical states for SCLEX_PROPERTIES +#define wxSTC_PROPS_DEFAULT 0 +#define wxSTC_PROPS_COMMENT 1 +#define wxSTC_PROPS_SECTION 2 +#define wxSTC_PROPS_ASSIGNMENT 3 +#define wxSTC_PROPS_DEFVAL 4 +#define wxSTC_PROPS_KEY 5 + +/// Lexical states for SCLEX_LATEX +#define wxSTC_L_DEFAULT 0 +#define wxSTC_L_COMMAND 1 +#define wxSTC_L_TAG 2 +#define wxSTC_L_MATH 3 +#define wxSTC_L_COMMENT 4 +#define wxSTC_L_TAG2 5 +#define wxSTC_L_MATH2 6 +#define wxSTC_L_COMMENT2 7 +#define wxSTC_L_VERBATIM 8 +#define wxSTC_L_SHORTCMD 9 +#define wxSTC_L_SPECIAL 10 +#define wxSTC_L_CMDOPT 11 +#define wxSTC_L_ERROR 12 + +/// Lexical states for SCLEX_LUA +#define wxSTC_LUA_DEFAULT 0 +#define wxSTC_LUA_COMMENT 1 +#define wxSTC_LUA_COMMENTLINE 2 +#define wxSTC_LUA_COMMENTDOC 3 +#define wxSTC_LUA_NUMBER 4 +#define wxSTC_LUA_WORD 5 +#define wxSTC_LUA_STRING 6 +#define wxSTC_LUA_CHARACTER 7 +#define wxSTC_LUA_LITERALSTRING 8 +#define wxSTC_LUA_PREPROCESSOR 9 +#define wxSTC_LUA_OPERATOR 10 +#define wxSTC_LUA_IDENTIFIER 11 +#define wxSTC_LUA_STRINGEOL 12 +#define wxSTC_LUA_WORD2 13 +#define wxSTC_LUA_WORD3 14 +#define wxSTC_LUA_WORD4 15 +#define wxSTC_LUA_WORD5 16 +#define wxSTC_LUA_WORD6 17 +#define wxSTC_LUA_WORD7 18 +#define wxSTC_LUA_WORD8 19 +#define wxSTC_LUA_LABEL 20 + +/// Lexical states for SCLEX_ERRORLIST +#define wxSTC_ERR_DEFAULT 0 +#define wxSTC_ERR_PYTHON 1 +#define wxSTC_ERR_GCC 2 +#define wxSTC_ERR_MS 3 +#define wxSTC_ERR_CMD 4 +#define wxSTC_ERR_BORLAND 5 +#define wxSTC_ERR_PERL 6 +#define wxSTC_ERR_NET 7 +#define wxSTC_ERR_LUA 8 +#define wxSTC_ERR_CTAG 9 +#define wxSTC_ERR_DIFF_CHANGED 10 +#define wxSTC_ERR_DIFF_ADDITION 11 +#define wxSTC_ERR_DIFF_DELETION 12 +#define wxSTC_ERR_DIFF_MESSAGE 13 +#define wxSTC_ERR_PHP 14 +#define wxSTC_ERR_ELF 15 +#define wxSTC_ERR_IFC 16 +#define wxSTC_ERR_IFORT 17 +#define wxSTC_ERR_ABSF 18 +#define wxSTC_ERR_TIDY 19 +#define wxSTC_ERR_JAVA_STACK 20 +#define wxSTC_ERR_VALUE 21 + +/// Lexical states for SCLEX_BATCH +#define wxSTC_BAT_DEFAULT 0 +#define wxSTC_BAT_COMMENT 1 +#define wxSTC_BAT_WORD 2 +#define wxSTC_BAT_LABEL 3 +#define wxSTC_BAT_HIDE 4 +#define wxSTC_BAT_COMMAND 5 +#define wxSTC_BAT_IDENTIFIER 6 +#define wxSTC_BAT_OPERATOR 7 + +/// Lexical states for SCLEX_TCMD +#define wxSTC_TCMD_DEFAULT 0 +#define wxSTC_TCMD_COMMENT 1 +#define wxSTC_TCMD_WORD 2 +#define wxSTC_TCMD_LABEL 3 +#define wxSTC_TCMD_HIDE 4 +#define wxSTC_TCMD_COMMAND 5 +#define wxSTC_TCMD_IDENTIFIER 6 +#define wxSTC_TCMD_OPERATOR 7 +#define wxSTC_TCMD_ENVIRONMENT 8 +#define wxSTC_TCMD_EXPANSION 9 +#define wxSTC_TCMD_CLABEL 10 + +/// Lexical states for SCLEX_MAKEFILE +#define wxSTC_MAKE_DEFAULT 0 +#define wxSTC_MAKE_COMMENT 1 +#define wxSTC_MAKE_PREPROCESSOR 2 +#define wxSTC_MAKE_IDENTIFIER 3 +#define wxSTC_MAKE_OPERATOR 4 +#define wxSTC_MAKE_TARGET 5 +#define wxSTC_MAKE_IDEOL 9 + +/// Lexical states for SCLEX_DIFF +#define wxSTC_DIFF_DEFAULT 0 +#define wxSTC_DIFF_COMMENT 1 +#define wxSTC_DIFF_COMMAND 2 +#define wxSTC_DIFF_HEADER 3 +#define wxSTC_DIFF_POSITION 4 +#define wxSTC_DIFF_DELETED 5 +#define wxSTC_DIFF_ADDED 6 +#define wxSTC_DIFF_CHANGED 7 + +/// Lexical states for SCLEX_CONF (Apache Configuration Files Lexer) +#define wxSTC_CONF_DEFAULT 0 +#define wxSTC_CONF_COMMENT 1 +#define wxSTC_CONF_NUMBER 2 +#define wxSTC_CONF_IDENTIFIER 3 +#define wxSTC_CONF_EXTENSION 4 +#define wxSTC_CONF_PARAMETER 5 +#define wxSTC_CONF_STRING 6 +#define wxSTC_CONF_OPERATOR 7 +#define wxSTC_CONF_IP 8 +#define wxSTC_CONF_DIRECTIVE 9 + +/// Lexical states for SCLEX_AVE, Avenue +#define wxSTC_AVE_DEFAULT 0 +#define wxSTC_AVE_COMMENT 1 +#define wxSTC_AVE_NUMBER 2 +#define wxSTC_AVE_WORD 3 +#define wxSTC_AVE_STRING 6 +#define wxSTC_AVE_ENUM 7 +#define wxSTC_AVE_STRINGEOL 8 +#define wxSTC_AVE_IDENTIFIER 9 +#define wxSTC_AVE_OPERATOR 10 +#define wxSTC_AVE_WORD1 11 +#define wxSTC_AVE_WORD2 12 +#define wxSTC_AVE_WORD3 13 +#define wxSTC_AVE_WORD4 14 +#define wxSTC_AVE_WORD5 15 +#define wxSTC_AVE_WORD6 16 + +/// Lexical states for SCLEX_ADA +#define wxSTC_ADA_DEFAULT 0 +#define wxSTC_ADA_WORD 1 +#define wxSTC_ADA_IDENTIFIER 2 +#define wxSTC_ADA_NUMBER 3 +#define wxSTC_ADA_DELIMITER 4 +#define wxSTC_ADA_CHARACTER 5 +#define wxSTC_ADA_CHARACTEREOL 6 +#define wxSTC_ADA_STRING 7 +#define wxSTC_ADA_STRINGEOL 8 +#define wxSTC_ADA_LABEL 9 +#define wxSTC_ADA_COMMENTLINE 10 +#define wxSTC_ADA_ILLEGAL 11 + +/// Lexical states for SCLEX_BAAN +#define wxSTC_BAAN_DEFAULT 0 +#define wxSTC_BAAN_COMMENT 1 +#define wxSTC_BAAN_COMMENTDOC 2 +#define wxSTC_BAAN_NUMBER 3 +#define wxSTC_BAAN_WORD 4 +#define wxSTC_BAAN_STRING 5 +#define wxSTC_BAAN_PREPROCESSOR 6 +#define wxSTC_BAAN_OPERATOR 7 +#define wxSTC_BAAN_IDENTIFIER 8 +#define wxSTC_BAAN_STRINGEOL 9 +#define wxSTC_BAAN_WORD2 10 + +/// Lexical states for SCLEX_LISP +#define wxSTC_LISP_DEFAULT 0 +#define wxSTC_LISP_COMMENT 1 +#define wxSTC_LISP_NUMBER 2 +#define wxSTC_LISP_KEYWORD 3 +#define wxSTC_LISP_KEYWORD_KW 4 +#define wxSTC_LISP_SYMBOL 5 +#define wxSTC_LISP_STRING 6 +#define wxSTC_LISP_STRINGEOL 8 +#define wxSTC_LISP_IDENTIFIER 9 +#define wxSTC_LISP_OPERATOR 10 +#define wxSTC_LISP_SPECIAL 11 +#define wxSTC_LISP_MULTI_COMMENT 12 + +/// Lexical states for SCLEX_EIFFEL and SCLEX_EIFFELKW +#define wxSTC_EIFFEL_DEFAULT 0 +#define wxSTC_EIFFEL_COMMENTLINE 1 +#define wxSTC_EIFFEL_NUMBER 2 +#define wxSTC_EIFFEL_WORD 3 +#define wxSTC_EIFFEL_STRING 4 +#define wxSTC_EIFFEL_CHARACTER 5 +#define wxSTC_EIFFEL_OPERATOR 6 +#define wxSTC_EIFFEL_IDENTIFIER 7 +#define wxSTC_EIFFEL_STRINGEOL 8 + +/// Lexical states for SCLEX_NNCRONTAB (nnCron crontab Lexer) +#define wxSTC_NNCRONTAB_DEFAULT 0 +#define wxSTC_NNCRONTAB_COMMENT 1 +#define wxSTC_NNCRONTAB_TASK 2 +#define wxSTC_NNCRONTAB_SECTION 3 +#define wxSTC_NNCRONTAB_KEYWORD 4 +#define wxSTC_NNCRONTAB_MODIFIER 5 +#define wxSTC_NNCRONTAB_ASTERISK 6 +#define wxSTC_NNCRONTAB_NUMBER 7 +#define wxSTC_NNCRONTAB_STRING 8 +#define wxSTC_NNCRONTAB_ENVIRONMENT 9 +#define wxSTC_NNCRONTAB_IDENTIFIER 10 + +/// Lexical states for SCLEX_FORTH (Forth Lexer) +#define wxSTC_FORTH_DEFAULT 0 +#define wxSTC_FORTH_COMMENT 1 +#define wxSTC_FORTH_COMMENT_ML 2 +#define wxSTC_FORTH_IDENTIFIER 3 +#define wxSTC_FORTH_CONTROL 4 +#define wxSTC_FORTH_KEYWORD 5 +#define wxSTC_FORTH_DEFWORD 6 +#define wxSTC_FORTH_PREWORD1 7 +#define wxSTC_FORTH_PREWORD2 8 +#define wxSTC_FORTH_NUMBER 9 +#define wxSTC_FORTH_STRING 10 +#define wxSTC_FORTH_LOCALE 11 + +/// Lexical states for SCLEX_MATLAB +#define wxSTC_MATLAB_DEFAULT 0 +#define wxSTC_MATLAB_COMMENT 1 +#define wxSTC_MATLAB_COMMAND 2 +#define wxSTC_MATLAB_NUMBER 3 +#define wxSTC_MATLAB_KEYWORD 4 + +/// single quoted string +#define wxSTC_MATLAB_STRING 5 +#define wxSTC_MATLAB_OPERATOR 6 +#define wxSTC_MATLAB_IDENTIFIER 7 +#define wxSTC_MATLAB_DOUBLEQUOTESTRING 8 + +/// Lexical states for SCLEX_SCRIPTOL +#define wxSTC_SCRIPTOL_DEFAULT 0 +#define wxSTC_SCRIPTOL_WHITE 1 +#define wxSTC_SCRIPTOL_COMMENTLINE 2 +#define wxSTC_SCRIPTOL_PERSISTENT 3 +#define wxSTC_SCRIPTOL_CSTYLE 4 +#define wxSTC_SCRIPTOL_COMMENTBLOCK 5 +#define wxSTC_SCRIPTOL_NUMBER 6 +#define wxSTC_SCRIPTOL_STRING 7 +#define wxSTC_SCRIPTOL_CHARACTER 8 +#define wxSTC_SCRIPTOL_STRINGEOL 9 +#define wxSTC_SCRIPTOL_KEYWORD 10 +#define wxSTC_SCRIPTOL_OPERATOR 11 +#define wxSTC_SCRIPTOL_IDENTIFIER 12 +#define wxSTC_SCRIPTOL_TRIPLE 13 +#define wxSTC_SCRIPTOL_CLASSNAME 14 +#define wxSTC_SCRIPTOL_PREPROCESSOR 15 + +/// Lexical states for SCLEX_ASM +#define wxSTC_ASM_DEFAULT 0 +#define wxSTC_ASM_COMMENT 1 +#define wxSTC_ASM_NUMBER 2 +#define wxSTC_ASM_STRING 3 +#define wxSTC_ASM_OPERATOR 4 +#define wxSTC_ASM_IDENTIFIER 5 +#define wxSTC_ASM_CPUINSTRUCTION 6 +#define wxSTC_ASM_MATHINSTRUCTION 7 +#define wxSTC_ASM_REGISTER 8 +#define wxSTC_ASM_DIRECTIVE 9 +#define wxSTC_ASM_DIRECTIVEOPERAND 10 +#define wxSTC_ASM_COMMENTBLOCK 11 +#define wxSTC_ASM_CHARACTER 12 +#define wxSTC_ASM_STRINGEOL 13 +#define wxSTC_ASM_EXTINSTRUCTION 14 +#define wxSTC_ASM_COMMENTDIRECTIVE 15 + +/// Lexical states for SCLEX_FORTRAN +#define wxSTC_F_DEFAULT 0 +#define wxSTC_F_COMMENT 1 +#define wxSTC_F_NUMBER 2 +#define wxSTC_F_STRING1 3 +#define wxSTC_F_STRING2 4 +#define wxSTC_F_STRINGEOL 5 +#define wxSTC_F_OPERATOR 6 +#define wxSTC_F_IDENTIFIER 7 +#define wxSTC_F_WORD 8 +#define wxSTC_F_WORD2 9 +#define wxSTC_F_WORD3 10 +#define wxSTC_F_PREPROCESSOR 11 +#define wxSTC_F_OPERATOR2 12 +#define wxSTC_F_LABEL 13 +#define wxSTC_F_CONTINUATION 14 + +/// Lexical states for SCLEX_CSS +#define wxSTC_CSS_DEFAULT 0 +#define wxSTC_CSS_TAG 1 +#define wxSTC_CSS_CLASS 2 +#define wxSTC_CSS_PSEUDOCLASS 3 +#define wxSTC_CSS_UNKNOWN_PSEUDOCLASS 4 +#define wxSTC_CSS_OPERATOR 5 +#define wxSTC_CSS_IDENTIFIER 6 +#define wxSTC_CSS_UNKNOWN_IDENTIFIER 7 +#define wxSTC_CSS_VALUE 8 +#define wxSTC_CSS_COMMENT 9 +#define wxSTC_CSS_ID 10 +#define wxSTC_CSS_IMPORTANT 11 +#define wxSTC_CSS_DIRECTIVE 12 +#define wxSTC_CSS_DOUBLESTRING 13 +#define wxSTC_CSS_SINGLESTRING 14 +#define wxSTC_CSS_IDENTIFIER2 15 +#define wxSTC_CSS_ATTRIBUTE 16 +#define wxSTC_CSS_IDENTIFIER3 17 +#define wxSTC_CSS_PSEUDOELEMENT 18 +#define wxSTC_CSS_EXTENDED_IDENTIFIER 19 +#define wxSTC_CSS_EXTENDED_PSEUDOCLASS 20 +#define wxSTC_CSS_EXTENDED_PSEUDOELEMENT 21 +#define wxSTC_CSS_MEDIA 22 +#define wxSTC_CSS_VARIABLE 23 + +/// Lexical states for SCLEX_POV +#define wxSTC_POV_DEFAULT 0 +#define wxSTC_POV_COMMENT 1 +#define wxSTC_POV_COMMENTLINE 2 +#define wxSTC_POV_NUMBER 3 +#define wxSTC_POV_OPERATOR 4 +#define wxSTC_POV_IDENTIFIER 5 +#define wxSTC_POV_STRING 6 +#define wxSTC_POV_STRINGEOL 7 +#define wxSTC_POV_DIRECTIVE 8 +#define wxSTC_POV_BADDIRECTIVE 9 +#define wxSTC_POV_WORD2 10 +#define wxSTC_POV_WORD3 11 +#define wxSTC_POV_WORD4 12 +#define wxSTC_POV_WORD5 13 +#define wxSTC_POV_WORD6 14 +#define wxSTC_POV_WORD7 15 +#define wxSTC_POV_WORD8 16 + +/// Lexical states for SCLEX_LOUT +#define wxSTC_LOUT_DEFAULT 0 +#define wxSTC_LOUT_COMMENT 1 +#define wxSTC_LOUT_NUMBER 2 +#define wxSTC_LOUT_WORD 3 +#define wxSTC_LOUT_WORD2 4 +#define wxSTC_LOUT_WORD3 5 +#define wxSTC_LOUT_WORD4 6 +#define wxSTC_LOUT_STRING 7 +#define wxSTC_LOUT_OPERATOR 8 +#define wxSTC_LOUT_IDENTIFIER 9 +#define wxSTC_LOUT_STRINGEOL 10 + +/// Lexical states for SCLEX_ESCRIPT +#define wxSTC_ESCRIPT_DEFAULT 0 +#define wxSTC_ESCRIPT_COMMENT 1 +#define wxSTC_ESCRIPT_COMMENTLINE 2 +#define wxSTC_ESCRIPT_COMMENTDOC 3 +#define wxSTC_ESCRIPT_NUMBER 4 +#define wxSTC_ESCRIPT_WORD 5 +#define wxSTC_ESCRIPT_STRING 6 +#define wxSTC_ESCRIPT_OPERATOR 7 +#define wxSTC_ESCRIPT_IDENTIFIER 8 +#define wxSTC_ESCRIPT_BRACE 9 +#define wxSTC_ESCRIPT_WORD2 10 +#define wxSTC_ESCRIPT_WORD3 11 + +/// Lexical states for SCLEX_PS +#define wxSTC_PS_DEFAULT 0 +#define wxSTC_PS_COMMENT 1 +#define wxSTC_PS_DSC_COMMENT 2 +#define wxSTC_PS_DSC_VALUE 3 +#define wxSTC_PS_NUMBER 4 +#define wxSTC_PS_NAME 5 +#define wxSTC_PS_KEYWORD 6 +#define wxSTC_PS_LITERAL 7 +#define wxSTC_PS_IMMEVAL 8 +#define wxSTC_PS_PAREN_ARRAY 9 +#define wxSTC_PS_PAREN_DICT 10 +#define wxSTC_PS_PAREN_PROC 11 +#define wxSTC_PS_TEXT 12 +#define wxSTC_PS_HEXSTRING 13 +#define wxSTC_PS_BASE85STRING 14 +#define wxSTC_PS_BADSTRINGCHAR 15 + +/// Lexical states for SCLEX_NSIS +#define wxSTC_NSIS_DEFAULT 0 +#define wxSTC_NSIS_COMMENT 1 +#define wxSTC_NSIS_STRINGDQ 2 +#define wxSTC_NSIS_STRINGLQ 3 +#define wxSTC_NSIS_STRINGRQ 4 +#define wxSTC_NSIS_FUNCTION 5 +#define wxSTC_NSIS_VARIABLE 6 +#define wxSTC_NSIS_LABEL 7 +#define wxSTC_NSIS_USERDEFINED 8 +#define wxSTC_NSIS_SECTIONDEF 9 +#define wxSTC_NSIS_SUBSECTIONDEF 10 +#define wxSTC_NSIS_IFDEFINEDEF 11 +#define wxSTC_NSIS_MACRODEF 12 +#define wxSTC_NSIS_STRINGVAR 13 +#define wxSTC_NSIS_NUMBER 14 +#define wxSTC_NSIS_SECTIONGROUP 15 +#define wxSTC_NSIS_PAGEEX 16 +#define wxSTC_NSIS_FUNCTIONDEF 17 +#define wxSTC_NSIS_COMMENTBOX 18 + +/// Lexical states for SCLEX_MMIXAL +#define wxSTC_MMIXAL_LEADWS 0 +#define wxSTC_MMIXAL_COMMENT 1 +#define wxSTC_MMIXAL_LABEL 2 +#define wxSTC_MMIXAL_OPCODE 3 +#define wxSTC_MMIXAL_OPCODE_PRE 4 +#define wxSTC_MMIXAL_OPCODE_VALID 5 +#define wxSTC_MMIXAL_OPCODE_UNKNOWN 6 +#define wxSTC_MMIXAL_OPCODE_POST 7 +#define wxSTC_MMIXAL_OPERANDS 8 +#define wxSTC_MMIXAL_NUMBER 9 +#define wxSTC_MMIXAL_REF 10 +#define wxSTC_MMIXAL_CHAR 11 +#define wxSTC_MMIXAL_STRING 12 +#define wxSTC_MMIXAL_REGISTER 13 +#define wxSTC_MMIXAL_HEX 14 +#define wxSTC_MMIXAL_OPERATOR 15 +#define wxSTC_MMIXAL_SYMBOL 16 +#define wxSTC_MMIXAL_INCLUDE 17 + +/// Lexical states for SCLEX_CLW +#define wxSTC_CLW_DEFAULT 0 +#define wxSTC_CLW_LABEL 1 +#define wxSTC_CLW_COMMENT 2 +#define wxSTC_CLW_STRING 3 +#define wxSTC_CLW_USER_IDENTIFIER 4 +#define wxSTC_CLW_INTEGER_CONSTANT 5 +#define wxSTC_CLW_REAL_CONSTANT 6 +#define wxSTC_CLW_PICTURE_STRING 7 +#define wxSTC_CLW_KEYWORD 8 +#define wxSTC_CLW_COMPILER_DIRECTIVE 9 +#define wxSTC_CLW_RUNTIME_EXPRESSIONS 10 +#define wxSTC_CLW_BUILTIN_PROCEDURES_FUNCTION 11 +#define wxSTC_CLW_STRUCTURE_DATA_TYPE 12 +#define wxSTC_CLW_ATTRIBUTE 13 +#define wxSTC_CLW_STANDARD_EQUATE 14 +#define wxSTC_CLW_ERROR 15 +#define wxSTC_CLW_DEPRECATED 16 + +/// Lexical states for SCLEX_LOT +#define wxSTC_LOT_DEFAULT 0 +#define wxSTC_LOT_HEADER 1 +#define wxSTC_LOT_BREAK 2 +#define wxSTC_LOT_SET 3 +#define wxSTC_LOT_PASS 4 +#define wxSTC_LOT_FAIL 5 +#define wxSTC_LOT_ABORT 6 + +/// Lexical states for SCLEX_YAML +#define wxSTC_YAML_DEFAULT 0 +#define wxSTC_YAML_COMMENT 1 +#define wxSTC_YAML_IDENTIFIER 2 +#define wxSTC_YAML_KEYWORD 3 +#define wxSTC_YAML_NUMBER 4 +#define wxSTC_YAML_REFERENCE 5 +#define wxSTC_YAML_DOCUMENT 6 +#define wxSTC_YAML_TEXT 7 +#define wxSTC_YAML_ERROR 8 +#define wxSTC_YAML_OPERATOR 9 + +/// Lexical states for SCLEX_TEX +#define wxSTC_TEX_DEFAULT 0 +#define wxSTC_TEX_SPECIAL 1 +#define wxSTC_TEX_GROUP 2 +#define wxSTC_TEX_SYMBOL 3 +#define wxSTC_TEX_COMMAND 4 +#define wxSTC_TEX_TEXT 5 +#define wxSTC_METAPOST_DEFAULT 0 +#define wxSTC_METAPOST_SPECIAL 1 +#define wxSTC_METAPOST_GROUP 2 +#define wxSTC_METAPOST_SYMBOL 3 +#define wxSTC_METAPOST_COMMAND 4 +#define wxSTC_METAPOST_TEXT 5 +#define wxSTC_METAPOST_EXTRA 6 + +/// Lexical states for SCLEX_ERLANG +#define wxSTC_ERLANG_DEFAULT 0 +#define wxSTC_ERLANG_COMMENT 1 +#define wxSTC_ERLANG_VARIABLE 2 +#define wxSTC_ERLANG_NUMBER 3 +#define wxSTC_ERLANG_KEYWORD 4 +#define wxSTC_ERLANG_STRING 5 +#define wxSTC_ERLANG_OPERATOR 6 +#define wxSTC_ERLANG_ATOM 7 +#define wxSTC_ERLANG_FUNCTION_NAME 8 +#define wxSTC_ERLANG_CHARACTER 9 +#define wxSTC_ERLANG_MACRO 10 +#define wxSTC_ERLANG_RECORD 11 +#define wxSTC_ERLANG_PREPROC 12 +#define wxSTC_ERLANG_NODE_NAME 13 +#define wxSTC_ERLANG_COMMENT_FUNCTION 14 +#define wxSTC_ERLANG_COMMENT_MODULE 15 +#define wxSTC_ERLANG_COMMENT_DOC 16 +#define wxSTC_ERLANG_COMMENT_DOC_MACRO 17 +#define wxSTC_ERLANG_ATOM_QUOTED 18 +#define wxSTC_ERLANG_MACRO_QUOTED 19 +#define wxSTC_ERLANG_RECORD_QUOTED 20 +#define wxSTC_ERLANG_NODE_NAME_QUOTED 21 +#define wxSTC_ERLANG_BIFS 22 +#define wxSTC_ERLANG_MODULES 23 +#define wxSTC_ERLANG_MODULES_ATT 24 +#define wxSTC_ERLANG_UNKNOWN 31 + +/// Lexical states for SCLEX_OCTAVE are identical to MatLab +/// Lexical states for SCLEX_MSSQL +#define wxSTC_MSSQL_DEFAULT 0 +#define wxSTC_MSSQL_COMMENT 1 +#define wxSTC_MSSQL_LINE_COMMENT 2 +#define wxSTC_MSSQL_NUMBER 3 +#define wxSTC_MSSQL_STRING 4 +#define wxSTC_MSSQL_OPERATOR 5 +#define wxSTC_MSSQL_IDENTIFIER 6 +#define wxSTC_MSSQL_VARIABLE 7 +#define wxSTC_MSSQL_COLUMN_NAME 8 +#define wxSTC_MSSQL_STATEMENT 9 +#define wxSTC_MSSQL_DATATYPE 10 +#define wxSTC_MSSQL_SYSTABLE 11 +#define wxSTC_MSSQL_GLOBAL_VARIABLE 12 +#define wxSTC_MSSQL_FUNCTION 13 +#define wxSTC_MSSQL_STORED_PROCEDURE 14 +#define wxSTC_MSSQL_DEFAULT_PREF_DATATYPE 15 +#define wxSTC_MSSQL_COLUMN_NAME_2 16 + +/// Lexical states for SCLEX_VERILOG +#define wxSTC_V_DEFAULT 0 +#define wxSTC_V_COMMENT 1 +#define wxSTC_V_COMMENTLINE 2 +#define wxSTC_V_COMMENTLINEBANG 3 +#define wxSTC_V_NUMBER 4 +#define wxSTC_V_WORD 5 +#define wxSTC_V_STRING 6 +#define wxSTC_V_WORD2 7 +#define wxSTC_V_WORD3 8 +#define wxSTC_V_PREPROCESSOR 9 +#define wxSTC_V_OPERATOR 10 +#define wxSTC_V_IDENTIFIER 11 +#define wxSTC_V_STRINGEOL 12 +#define wxSTC_V_USER 19 + +/// Lexical states for SCLEX_KIX +#define wxSTC_KIX_DEFAULT 0 +#define wxSTC_KIX_COMMENT 1 +#define wxSTC_KIX_STRING1 2 +#define wxSTC_KIX_STRING2 3 +#define wxSTC_KIX_NUMBER 4 +#define wxSTC_KIX_VAR 5 +#define wxSTC_KIX_MACRO 6 +#define wxSTC_KIX_KEYWORD 7 +#define wxSTC_KIX_FUNCTIONS 8 +#define wxSTC_KIX_OPERATOR 9 +#define wxSTC_KIX_IDENTIFIER 31 + +/// Lexical states for SCLEX_GUI4CLI +#define wxSTC_GC_DEFAULT 0 +#define wxSTC_GC_COMMENTLINE 1 +#define wxSTC_GC_COMMENTBLOCK 2 +#define wxSTC_GC_GLOBAL 3 +#define wxSTC_GC_EVENT 4 +#define wxSTC_GC_ATTRIBUTE 5 +#define wxSTC_GC_CONTROL 6 +#define wxSTC_GC_COMMAND 7 +#define wxSTC_GC_STRING 8 +#define wxSTC_GC_OPERATOR 9 + +/// Lexical states for SCLEX_SPECMAN +#define wxSTC_SN_DEFAULT 0 +#define wxSTC_SN_CODE 1 +#define wxSTC_SN_COMMENTLINE 2 +#define wxSTC_SN_COMMENTLINEBANG 3 +#define wxSTC_SN_NUMBER 4 +#define wxSTC_SN_WORD 5 +#define wxSTC_SN_STRING 6 +#define wxSTC_SN_WORD2 7 +#define wxSTC_SN_WORD3 8 +#define wxSTC_SN_PREPROCESSOR 9 +#define wxSTC_SN_OPERATOR 10 +#define wxSTC_SN_IDENTIFIER 11 +#define wxSTC_SN_STRINGEOL 12 +#define wxSTC_SN_REGEXTAG 13 +#define wxSTC_SN_SIGNAL 14 +#define wxSTC_SN_USER 19 + +/// Lexical states for SCLEX_AU3 +#define wxSTC_AU3_DEFAULT 0 +#define wxSTC_AU3_COMMENT 1 +#define wxSTC_AU3_COMMENTBLOCK 2 +#define wxSTC_AU3_NUMBER 3 +#define wxSTC_AU3_FUNCTION 4 +#define wxSTC_AU3_KEYWORD 5 +#define wxSTC_AU3_MACRO 6 +#define wxSTC_AU3_STRING 7 +#define wxSTC_AU3_OPERATOR 8 +#define wxSTC_AU3_VARIABLE 9 +#define wxSTC_AU3_SENT 10 +#define wxSTC_AU3_PREPROCESSOR 11 +#define wxSTC_AU3_SPECIAL 12 +#define wxSTC_AU3_EXPAND 13 +#define wxSTC_AU3_COMOBJ 14 +#define wxSTC_AU3_UDF 15 + +/// Lexical states for SCLEX_APDL +#define wxSTC_APDL_DEFAULT 0 +#define wxSTC_APDL_COMMENT 1 +#define wxSTC_APDL_COMMENTBLOCK 2 +#define wxSTC_APDL_NUMBER 3 +#define wxSTC_APDL_STRING 4 +#define wxSTC_APDL_OPERATOR 5 +#define wxSTC_APDL_WORD 6 +#define wxSTC_APDL_PROCESSOR 7 +#define wxSTC_APDL_COMMAND 8 +#define wxSTC_APDL_SLASHCOMMAND 9 +#define wxSTC_APDL_STARCOMMAND 10 +#define wxSTC_APDL_ARGUMENT 11 +#define wxSTC_APDL_FUNCTION 12 + +/// Lexical states for SCLEX_BASH +#define wxSTC_SH_DEFAULT 0 +#define wxSTC_SH_ERROR 1 +#define wxSTC_SH_COMMENTLINE 2 +#define wxSTC_SH_NUMBER 3 +#define wxSTC_SH_WORD 4 +#define wxSTC_SH_STRING 5 +#define wxSTC_SH_CHARACTER 6 +#define wxSTC_SH_OPERATOR 7 +#define wxSTC_SH_IDENTIFIER 8 +#define wxSTC_SH_SCALAR 9 +#define wxSTC_SH_PARAM 10 +#define wxSTC_SH_BACKTICKS 11 +#define wxSTC_SH_HERE_DELIM 12 +#define wxSTC_SH_HERE_Q 13 + +/// Lexical states for SCLEX_ASN1 +#define wxSTC_ASN1_DEFAULT 0 +#define wxSTC_ASN1_COMMENT 1 +#define wxSTC_ASN1_IDENTIFIER 2 +#define wxSTC_ASN1_STRING 3 +#define wxSTC_ASN1_OID 4 +#define wxSTC_ASN1_SCALAR 5 +#define wxSTC_ASN1_KEYWORD 6 +#define wxSTC_ASN1_ATTRIBUTE 7 +#define wxSTC_ASN1_DESCRIPTOR 8 +#define wxSTC_ASN1_TYPE 9 +#define wxSTC_ASN1_OPERATOR 10 + +/// Lexical states for SCLEX_VHDL +#define wxSTC_VHDL_DEFAULT 0 +#define wxSTC_VHDL_COMMENT 1 +#define wxSTC_VHDL_COMMENTLINEBANG 2 +#define wxSTC_VHDL_NUMBER 3 +#define wxSTC_VHDL_STRING 4 +#define wxSTC_VHDL_OPERATOR 5 +#define wxSTC_VHDL_IDENTIFIER 6 +#define wxSTC_VHDL_STRINGEOL 7 +#define wxSTC_VHDL_KEYWORD 8 +#define wxSTC_VHDL_STDOPERATOR 9 +#define wxSTC_VHDL_ATTRIBUTE 10 +#define wxSTC_VHDL_STDFUNCTION 11 +#define wxSTC_VHDL_STDPACKAGE 12 +#define wxSTC_VHDL_STDTYPE 13 +#define wxSTC_VHDL_USERWORD 14 + +/// Lexical states for SCLEX_CAML +#define wxSTC_CAML_DEFAULT 0 +#define wxSTC_CAML_IDENTIFIER 1 +#define wxSTC_CAML_TAGNAME 2 +#define wxSTC_CAML_KEYWORD 3 +#define wxSTC_CAML_KEYWORD2 4 +#define wxSTC_CAML_KEYWORD3 5 +#define wxSTC_CAML_LINENUM 6 +#define wxSTC_CAML_OPERATOR 7 +#define wxSTC_CAML_NUMBER 8 +#define wxSTC_CAML_CHAR 9 +#define wxSTC_CAML_WHITE 10 +#define wxSTC_CAML_STRING 11 +#define wxSTC_CAML_COMMENT 12 +#define wxSTC_CAML_COMMENT1 13 +#define wxSTC_CAML_COMMENT2 14 +#define wxSTC_CAML_COMMENT3 15 + +/// Lexical states for SCLEX_HASKELL +#define wxSTC_HA_DEFAULT 0 +#define wxSTC_HA_IDENTIFIER 1 +#define wxSTC_HA_KEYWORD 2 +#define wxSTC_HA_NUMBER 3 +#define wxSTC_HA_STRING 4 +#define wxSTC_HA_CHARACTER 5 +#define wxSTC_HA_CLASS 6 +#define wxSTC_HA_MODULE 7 +#define wxSTC_HA_CAPITAL 8 +#define wxSTC_HA_DATA 9 +#define wxSTC_HA_IMPORT 10 +#define wxSTC_HA_OPERATOR 11 +#define wxSTC_HA_INSTANCE 12 +#define wxSTC_HA_COMMENTLINE 13 +#define wxSTC_HA_COMMENTBLOCK 14 +#define wxSTC_HA_COMMENTBLOCK2 15 +#define wxSTC_HA_COMMENTBLOCK3 16 + +/// Lexical states of SCLEX_TADS3 +#define wxSTC_T3_DEFAULT 0 +#define wxSTC_T3_X_DEFAULT 1 +#define wxSTC_T3_PREPROCESSOR 2 +#define wxSTC_T3_BLOCK_COMMENT 3 +#define wxSTC_T3_LINE_COMMENT 4 +#define wxSTC_T3_OPERATOR 5 +#define wxSTC_T3_KEYWORD 6 +#define wxSTC_T3_NUMBER 7 +#define wxSTC_T3_IDENTIFIER 8 +#define wxSTC_T3_S_STRING 9 +#define wxSTC_T3_D_STRING 10 +#define wxSTC_T3_X_STRING 11 +#define wxSTC_T3_LIB_DIRECTIVE 12 +#define wxSTC_T3_MSG_PARAM 13 +#define wxSTC_T3_HTML_TAG 14 +#define wxSTC_T3_HTML_DEFAULT 15 +#define wxSTC_T3_HTML_STRING 16 +#define wxSTC_T3_USER1 17 +#define wxSTC_T3_USER2 18 +#define wxSTC_T3_USER3 19 +#define wxSTC_T3_BRACE 20 + +/// Lexical states for SCLEX_REBOL +#define wxSTC_REBOL_DEFAULT 0 +#define wxSTC_REBOL_COMMENTLINE 1 +#define wxSTC_REBOL_COMMENTBLOCK 2 +#define wxSTC_REBOL_PREFACE 3 +#define wxSTC_REBOL_OPERATOR 4 +#define wxSTC_REBOL_CHARACTER 5 +#define wxSTC_REBOL_QUOTEDSTRING 6 +#define wxSTC_REBOL_BRACEDSTRING 7 +#define wxSTC_REBOL_NUMBER 8 +#define wxSTC_REBOL_PAIR 9 +#define wxSTC_REBOL_TUPLE 10 +#define wxSTC_REBOL_BINARY 11 +#define wxSTC_REBOL_MONEY 12 +#define wxSTC_REBOL_ISSUE 13 +#define wxSTC_REBOL_TAG 14 +#define wxSTC_REBOL_FILE 15 +#define wxSTC_REBOL_EMAIL 16 +#define wxSTC_REBOL_URL 17 +#define wxSTC_REBOL_DATE 18 +#define wxSTC_REBOL_TIME 19 +#define wxSTC_REBOL_IDENTIFIER 20 +#define wxSTC_REBOL_WORD 21 +#define wxSTC_REBOL_WORD2 22 +#define wxSTC_REBOL_WORD3 23 +#define wxSTC_REBOL_WORD4 24 +#define wxSTC_REBOL_WORD5 25 +#define wxSTC_REBOL_WORD6 26 +#define wxSTC_REBOL_WORD7 27 +#define wxSTC_REBOL_WORD8 28 + +/// Lexical states for SCLEX_SQL +#define wxSTC_SQL_DEFAULT 0 +#define wxSTC_SQL_COMMENT 1 +#define wxSTC_SQL_COMMENTLINE 2 +#define wxSTC_SQL_COMMENTDOC 3 +#define wxSTC_SQL_NUMBER 4 +#define wxSTC_SQL_WORD 5 +#define wxSTC_SQL_STRING 6 +#define wxSTC_SQL_CHARACTER 7 +#define wxSTC_SQL_SQLPLUS 8 +#define wxSTC_SQL_SQLPLUS_PROMPT 9 +#define wxSTC_SQL_OPERATOR 10 +#define wxSTC_SQL_IDENTIFIER 11 +#define wxSTC_SQL_SQLPLUS_COMMENT 13 +#define wxSTC_SQL_COMMENTLINEDOC 15 +#define wxSTC_SQL_WORD2 16 +#define wxSTC_SQL_COMMENTDOCKEYWORD 17 +#define wxSTC_SQL_COMMENTDOCKEYWORDERROR 18 +#define wxSTC_SQL_USER1 19 +#define wxSTC_SQL_USER2 20 +#define wxSTC_SQL_USER3 21 +#define wxSTC_SQL_USER4 22 +#define wxSTC_SQL_QUOTEDIDENTIFIER 23 + +/// Lexical states for SCLEX_SMALLTALK +#define wxSTC_ST_DEFAULT 0 +#define wxSTC_ST_STRING 1 +#define wxSTC_ST_NUMBER 2 +#define wxSTC_ST_COMMENT 3 +#define wxSTC_ST_SYMBOL 4 +#define wxSTC_ST_BINARY 5 +#define wxSTC_ST_BOOL 6 +#define wxSTC_ST_SELF 7 +#define wxSTC_ST_SUPER 8 +#define wxSTC_ST_NIL 9 +#define wxSTC_ST_GLOBAL 10 +#define wxSTC_ST_RETURN 11 +#define wxSTC_ST_SPECIAL 12 +#define wxSTC_ST_KWSEND 13 +#define wxSTC_ST_ASSIGN 14 +#define wxSTC_ST_CHARACTER 15 +#define wxSTC_ST_SPEC_SEL 16 + +/// Lexical states for SCLEX_FLAGSHIP (clipper) +#define wxSTC_FS_DEFAULT 0 +#define wxSTC_FS_COMMENT 1 +#define wxSTC_FS_COMMENTLINE 2 +#define wxSTC_FS_COMMENTDOC 3 +#define wxSTC_FS_COMMENTLINEDOC 4 +#define wxSTC_FS_COMMENTDOCKEYWORD 5 +#define wxSTC_FS_COMMENTDOCKEYWORDERROR 6 +#define wxSTC_FS_KEYWORD 7 +#define wxSTC_FS_KEYWORD2 8 +#define wxSTC_FS_KEYWORD3 9 +#define wxSTC_FS_KEYWORD4 10 +#define wxSTC_FS_NUMBER 11 +#define wxSTC_FS_STRING 12 +#define wxSTC_FS_PREPROCESSOR 13 +#define wxSTC_FS_OPERATOR 14 +#define wxSTC_FS_IDENTIFIER 15 +#define wxSTC_FS_DATE 16 +#define wxSTC_FS_STRINGEOL 17 +#define wxSTC_FS_CONSTANT 18 +#define wxSTC_FS_WORDOPERATOR 19 +#define wxSTC_FS_DISABLEDCODE 20 +#define wxSTC_FS_DEFAULT_C 21 +#define wxSTC_FS_COMMENTDOC_C 22 +#define wxSTC_FS_COMMENTLINEDOC_C 23 +#define wxSTC_FS_KEYWORD_C 24 +#define wxSTC_FS_KEYWORD2_C 25 +#define wxSTC_FS_NUMBER_C 26 +#define wxSTC_FS_STRING_C 27 +#define wxSTC_FS_PREPROCESSOR_C 28 +#define wxSTC_FS_OPERATOR_C 29 +#define wxSTC_FS_IDENTIFIER_C 30 +#define wxSTC_FS_STRINGEOL_C 31 + +/// Lexical states for SCLEX_CSOUND +#define wxSTC_CSOUND_DEFAULT 0 +#define wxSTC_CSOUND_COMMENT 1 +#define wxSTC_CSOUND_NUMBER 2 +#define wxSTC_CSOUND_OPERATOR 3 +#define wxSTC_CSOUND_INSTR 4 +#define wxSTC_CSOUND_IDENTIFIER 5 +#define wxSTC_CSOUND_OPCODE 6 +#define wxSTC_CSOUND_HEADERSTMT 7 +#define wxSTC_CSOUND_USERKEYWORD 8 +#define wxSTC_CSOUND_COMMENTBLOCK 9 +#define wxSTC_CSOUND_PARAM 10 +#define wxSTC_CSOUND_ARATE_VAR 11 +#define wxSTC_CSOUND_KRATE_VAR 12 +#define wxSTC_CSOUND_IRATE_VAR 13 +#define wxSTC_CSOUND_GLOBAL_VAR 14 +#define wxSTC_CSOUND_STRINGEOL 15 + +/// Lexical states for SCLEX_INNOSETUP +#define wxSTC_INNO_DEFAULT 0 +#define wxSTC_INNO_COMMENT 1 +#define wxSTC_INNO_KEYWORD 2 +#define wxSTC_INNO_PARAMETER 3 +#define wxSTC_INNO_SECTION 4 +#define wxSTC_INNO_PREPROC 5 +#define wxSTC_INNO_INLINE_EXPANSION 6 +#define wxSTC_INNO_COMMENT_PASCAL 7 +#define wxSTC_INNO_KEYWORD_PASCAL 8 +#define wxSTC_INNO_KEYWORD_USER 9 +#define wxSTC_INNO_STRING_DOUBLE 10 +#define wxSTC_INNO_STRING_SINGLE 11 +#define wxSTC_INNO_IDENTIFIER 12 + +/// Lexical states for SCLEX_OPAL +#define wxSTC_OPAL_SPACE 0 +#define wxSTC_OPAL_COMMENT_BLOCK 1 +#define wxSTC_OPAL_COMMENT_LINE 2 +#define wxSTC_OPAL_INTEGER 3 +#define wxSTC_OPAL_KEYWORD 4 +#define wxSTC_OPAL_SORT 5 +#define wxSTC_OPAL_STRING 6 +#define wxSTC_OPAL_PAR 7 +#define wxSTC_OPAL_BOOL_CONST 8 +#define wxSTC_OPAL_DEFAULT 32 + +/// Lexical states for SCLEX_SPICE +#define wxSTC_SPICE_DEFAULT 0 +#define wxSTC_SPICE_IDENTIFIER 1 +#define wxSTC_SPICE_KEYWORD 2 +#define wxSTC_SPICE_KEYWORD2 3 +#define wxSTC_SPICE_KEYWORD3 4 +#define wxSTC_SPICE_NUMBER 5 +#define wxSTC_SPICE_DELIMITER 6 +#define wxSTC_SPICE_VALUE 7 +#define wxSTC_SPICE_COMMENTLINE 8 + +/// Lexical states for SCLEX_CMAKE +#define wxSTC_CMAKE_DEFAULT 0 +#define wxSTC_CMAKE_COMMENT 1 +#define wxSTC_CMAKE_STRINGDQ 2 +#define wxSTC_CMAKE_STRINGLQ 3 +#define wxSTC_CMAKE_STRINGRQ 4 +#define wxSTC_CMAKE_COMMANDS 5 +#define wxSTC_CMAKE_PARAMETERS 6 +#define wxSTC_CMAKE_VARIABLE 7 +#define wxSTC_CMAKE_USERDEFINED 8 +#define wxSTC_CMAKE_WHILEDEF 9 +#define wxSTC_CMAKE_FOREACHDEF 10 +#define wxSTC_CMAKE_IFDEFINEDEF 11 +#define wxSTC_CMAKE_MACRODEF 12 +#define wxSTC_CMAKE_STRINGVAR 13 +#define wxSTC_CMAKE_NUMBER 14 + +/// Lexical states for SCLEX_GAP +#define wxSTC_GAP_DEFAULT 0 +#define wxSTC_GAP_IDENTIFIER 1 +#define wxSTC_GAP_KEYWORD 2 +#define wxSTC_GAP_KEYWORD2 3 +#define wxSTC_GAP_KEYWORD3 4 +#define wxSTC_GAP_KEYWORD4 5 +#define wxSTC_GAP_STRING 6 +#define wxSTC_GAP_CHAR 7 +#define wxSTC_GAP_OPERATOR 8 +#define wxSTC_GAP_COMMENT 9 +#define wxSTC_GAP_NUMBER 10 +#define wxSTC_GAP_STRINGEOL 11 + +/// Lexical state for SCLEX_PLM +#define wxSTC_PLM_DEFAULT 0 +#define wxSTC_PLM_COMMENT 1 +#define wxSTC_PLM_STRING 2 +#define wxSTC_PLM_NUMBER 3 +#define wxSTC_PLM_IDENTIFIER 4 +#define wxSTC_PLM_OPERATOR 5 +#define wxSTC_PLM_CONTROL 6 +#define wxSTC_PLM_KEYWORD 7 + +/// Lexical state for SCLEX_PROGRESS +#define wxSTC_4GL_DEFAULT 0 +#define wxSTC_4GL_NUMBER 1 +#define wxSTC_4GL_WORD 2 +#define wxSTC_4GL_STRING 3 +#define wxSTC_4GL_CHARACTER 4 +#define wxSTC_4GL_PREPROCESSOR 5 +#define wxSTC_4GL_OPERATOR 6 +#define wxSTC_4GL_IDENTIFIER 7 +#define wxSTC_4GL_BLOCK 8 +#define wxSTC_4GL_END 9 +#define wxSTC_4GL_COMMENT1 10 +#define wxSTC_4GL_COMMENT2 11 +#define wxSTC_4GL_COMMENT3 12 +#define wxSTC_4GL_COMMENT4 13 +#define wxSTC_4GL_COMMENT5 14 +#define wxSTC_4GL_COMMENT6 15 +#define wxSTC_4GL_DEFAULT_ 16 +#define wxSTC_4GL_NUMBER_ 17 +#define wxSTC_4GL_WORD_ 18 +#define wxSTC_4GL_STRING_ 19 +#define wxSTC_4GL_CHARACTER_ 20 +#define wxSTC_4GL_PREPROCESSOR_ 21 +#define wxSTC_4GL_OPERATOR_ 22 +#define wxSTC_4GL_IDENTIFIER_ 23 +#define wxSTC_4GL_BLOCK_ 24 +#define wxSTC_4GL_END_ 25 +#define wxSTC_4GL_COMMENT1_ 26 +#define wxSTC_4GL_COMMENT2_ 27 +#define wxSTC_4GL_COMMENT3_ 28 +#define wxSTC_4GL_COMMENT4_ 29 +#define wxSTC_4GL_COMMENT5_ 30 +#define wxSTC_4GL_COMMENT6_ 31 + +/// Lexical states for SCLEX_ABAQUS +#define wxSTC_ABAQUS_DEFAULT 0 +#define wxSTC_ABAQUS_COMMENT 1 +#define wxSTC_ABAQUS_COMMENTBLOCK 2 +#define wxSTC_ABAQUS_NUMBER 3 +#define wxSTC_ABAQUS_STRING 4 +#define wxSTC_ABAQUS_OPERATOR 5 +#define wxSTC_ABAQUS_WORD 6 +#define wxSTC_ABAQUS_PROCESSOR 7 +#define wxSTC_ABAQUS_COMMAND 8 +#define wxSTC_ABAQUS_SLASHCOMMAND 9 +#define wxSTC_ABAQUS_STARCOMMAND 10 +#define wxSTC_ABAQUS_ARGUMENT 11 +#define wxSTC_ABAQUS_FUNCTION 12 + +/// Lexical states for SCLEX_ASYMPTOTE +#define wxSTC_ASY_DEFAULT 0 +#define wxSTC_ASY_COMMENT 1 +#define wxSTC_ASY_COMMENTLINE 2 +#define wxSTC_ASY_NUMBER 3 +#define wxSTC_ASY_WORD 4 +#define wxSTC_ASY_STRING 5 +#define wxSTC_ASY_CHARACTER 6 +#define wxSTC_ASY_OPERATOR 7 +#define wxSTC_ASY_IDENTIFIER 8 +#define wxSTC_ASY_STRINGEOL 9 +#define wxSTC_ASY_COMMENTLINEDOC 10 +#define wxSTC_ASY_WORD2 11 + +/// Lexical states for SCLEX_R +#define wxSTC_R_DEFAULT 0 +#define wxSTC_R_COMMENT 1 +#define wxSTC_R_KWORD 2 +#define wxSTC_R_BASEKWORD 3 +#define wxSTC_R_OTHERKWORD 4 +#define wxSTC_R_NUMBER 5 +#define wxSTC_R_STRING 6 +#define wxSTC_R_STRING2 7 +#define wxSTC_R_OPERATOR 8 +#define wxSTC_R_IDENTIFIER 9 +#define wxSTC_R_INFIX 10 +#define wxSTC_R_INFIXEOL 11 + +/// Lexical state for SCLEX_MAGIKSF +#define wxSTC_MAGIK_DEFAULT 0 +#define wxSTC_MAGIK_COMMENT 1 +#define wxSTC_MAGIK_HYPER_COMMENT 16 +#define wxSTC_MAGIK_STRING 2 +#define wxSTC_MAGIK_CHARACTER 3 +#define wxSTC_MAGIK_NUMBER 4 +#define wxSTC_MAGIK_IDENTIFIER 5 +#define wxSTC_MAGIK_OPERATOR 6 +#define wxSTC_MAGIK_FLOW 7 +#define wxSTC_MAGIK_CONTAINER 8 +#define wxSTC_MAGIK_BRACKET_BLOCK 9 +#define wxSTC_MAGIK_BRACE_BLOCK 10 +#define wxSTC_MAGIK_SQBRACKET_BLOCK 11 +#define wxSTC_MAGIK_UNKNOWN_KEYWORD 12 +#define wxSTC_MAGIK_KEYWORD 13 +#define wxSTC_MAGIK_PRAGMA 14 +#define wxSTC_MAGIK_SYMBOL 15 + +/// Lexical state for SCLEX_POWERSHELL +#define wxSTC_POWERSHELL_DEFAULT 0 +#define wxSTC_POWERSHELL_COMMENT 1 +#define wxSTC_POWERSHELL_STRING 2 +#define wxSTC_POWERSHELL_CHARACTER 3 +#define wxSTC_POWERSHELL_NUMBER 4 +#define wxSTC_POWERSHELL_VARIABLE 5 +#define wxSTC_POWERSHELL_OPERATOR 6 +#define wxSTC_POWERSHELL_IDENTIFIER 7 +#define wxSTC_POWERSHELL_KEYWORD 8 +#define wxSTC_POWERSHELL_CMDLET 9 +#define wxSTC_POWERSHELL_ALIAS 10 +#define wxSTC_POWERSHELL_FUNCTION 11 +#define wxSTC_POWERSHELL_USER1 12 +#define wxSTC_POWERSHELL_COMMENTSTREAM 13 + +/// Lexical state for SCLEX_MYSQL +#define wxSTC_MYSQL_DEFAULT 0 +#define wxSTC_MYSQL_COMMENT 1 +#define wxSTC_MYSQL_COMMENTLINE 2 +#define wxSTC_MYSQL_VARIABLE 3 +#define wxSTC_MYSQL_SYSTEMVARIABLE 4 +#define wxSTC_MYSQL_KNOWNSYSTEMVARIABLE 5 +#define wxSTC_MYSQL_NUMBER 6 +#define wxSTC_MYSQL_MAJORKEYWORD 7 +#define wxSTC_MYSQL_KEYWORD 8 +#define wxSTC_MYSQL_DATABASEOBJECT 9 +#define wxSTC_MYSQL_PROCEDUREKEYWORD 10 +#define wxSTC_MYSQL_STRING 11 +#define wxSTC_MYSQL_SQSTRING 12 +#define wxSTC_MYSQL_DQSTRING 13 +#define wxSTC_MYSQL_OPERATOR 14 +#define wxSTC_MYSQL_FUNCTION 15 +#define wxSTC_MYSQL_IDENTIFIER 16 +#define wxSTC_MYSQL_QUOTEDIDENTIFIER 17 +#define wxSTC_MYSQL_USER1 18 +#define wxSTC_MYSQL_USER2 19 +#define wxSTC_MYSQL_USER3 20 +#define wxSTC_MYSQL_HIDDENCOMMAND 21 + +/// Lexical state for SCLEX_PO +#define wxSTC_PO_DEFAULT 0 +#define wxSTC_PO_COMMENT 1 +#define wxSTC_PO_MSGID 2 +#define wxSTC_PO_MSGID_TEXT 3 +#define wxSTC_PO_MSGSTR 4 +#define wxSTC_PO_MSGSTR_TEXT 5 +#define wxSTC_PO_MSGCTXT 6 +#define wxSTC_PO_MSGCTXT_TEXT 7 +#define wxSTC_PO_FUZZY 8 + +/// Lexical states for SCLEX_PASCAL +#define wxSTC_PAS_DEFAULT 0 +#define wxSTC_PAS_IDENTIFIER 1 +#define wxSTC_PAS_COMMENT 2 +#define wxSTC_PAS_COMMENT2 3 +#define wxSTC_PAS_COMMENTLINE 4 +#define wxSTC_PAS_PREPROCESSOR 5 +#define wxSTC_PAS_PREPROCESSOR2 6 +#define wxSTC_PAS_NUMBER 7 +#define wxSTC_PAS_HEXNUMBER 8 +#define wxSTC_PAS_WORD 9 +#define wxSTC_PAS_STRING 10 +#define wxSTC_PAS_STRINGEOL 11 +#define wxSTC_PAS_CHARACTER 12 +#define wxSTC_PAS_OPERATOR 13 +#define wxSTC_PAS_ASM 14 + +/// Lexical state for SCLEX_SORCUS +#define wxSTC_SORCUS_DEFAULT 0 +#define wxSTC_SORCUS_COMMAND 1 +#define wxSTC_SORCUS_PARAMETER 2 +#define wxSTC_SORCUS_COMMENTLINE 3 +#define wxSTC_SORCUS_STRING 4 +#define wxSTC_SORCUS_STRINGEOL 5 +#define wxSTC_SORCUS_IDENTIFIER 6 +#define wxSTC_SORCUS_OPERATOR 7 +#define wxSTC_SORCUS_NUMBER 8 +#define wxSTC_SORCUS_CONSTANT 9 + +/// Lexical state for SCLEX_POWERPRO +#define wxSTC_POWERPRO_DEFAULT 0 +#define wxSTC_POWERPRO_COMMENTBLOCK 1 +#define wxSTC_POWERPRO_COMMENTLINE 2 +#define wxSTC_POWERPRO_NUMBER 3 +#define wxSTC_POWERPRO_WORD 4 +#define wxSTC_POWERPRO_WORD2 5 +#define wxSTC_POWERPRO_WORD3 6 +#define wxSTC_POWERPRO_WORD4 7 +#define wxSTC_POWERPRO_DOUBLEQUOTEDSTRING 8 +#define wxSTC_POWERPRO_SINGLEQUOTEDSTRING 9 +#define wxSTC_POWERPRO_LINECONTINUE 10 +#define wxSTC_POWERPRO_OPERATOR 11 +#define wxSTC_POWERPRO_IDENTIFIER 12 +#define wxSTC_POWERPRO_STRINGEOL 13 +#define wxSTC_POWERPRO_VERBATIM 14 +#define wxSTC_POWERPRO_ALTQUOTE 15 +#define wxSTC_POWERPRO_FUNCTION 16 + +/// Lexical states for SCLEX_SML +#define wxSTC_SML_DEFAULT 0 +#define wxSTC_SML_IDENTIFIER 1 +#define wxSTC_SML_TAGNAME 2 +#define wxSTC_SML_KEYWORD 3 +#define wxSTC_SML_KEYWORD2 4 +#define wxSTC_SML_KEYWORD3 5 +#define wxSTC_SML_LINENUM 6 +#define wxSTC_SML_OPERATOR 7 +#define wxSTC_SML_NUMBER 8 +#define wxSTC_SML_CHAR 9 +#define wxSTC_SML_STRING 11 +#define wxSTC_SML_COMMENT 12 +#define wxSTC_SML_COMMENT1 13 +#define wxSTC_SML_COMMENT2 14 +#define wxSTC_SML_COMMENT3 15 + +/// Lexical state for SCLEX_MARKDOWN +#define wxSTC_MARKDOWN_DEFAULT 0 +#define wxSTC_MARKDOWN_LINE_BEGIN 1 +#define wxSTC_MARKDOWN_STRONG1 2 +#define wxSTC_MARKDOWN_STRONG2 3 +#define wxSTC_MARKDOWN_EM1 4 +#define wxSTC_MARKDOWN_EM2 5 +#define wxSTC_MARKDOWN_HEADER1 6 +#define wxSTC_MARKDOWN_HEADER2 7 +#define wxSTC_MARKDOWN_HEADER3 8 +#define wxSTC_MARKDOWN_HEADER4 9 +#define wxSTC_MARKDOWN_HEADER5 10 +#define wxSTC_MARKDOWN_HEADER6 11 +#define wxSTC_MARKDOWN_PRECHAR 12 +#define wxSTC_MARKDOWN_ULIST_ITEM 13 +#define wxSTC_MARKDOWN_OLIST_ITEM 14 +#define wxSTC_MARKDOWN_BLOCKQUOTE 15 +#define wxSTC_MARKDOWN_STRIKEOUT 16 +#define wxSTC_MARKDOWN_HRULE 17 +#define wxSTC_MARKDOWN_LINK 18 +#define wxSTC_MARKDOWN_CODE 19 +#define wxSTC_MARKDOWN_CODE2 20 +#define wxSTC_MARKDOWN_CODEBK 21 + +/// Lexical state for SCLEX_TXT2TAGS +#define wxSTC_TXT2TAGS_DEFAULT 0 +#define wxSTC_TXT2TAGS_LINE_BEGIN 1 +#define wxSTC_TXT2TAGS_STRONG1 2 +#define wxSTC_TXT2TAGS_STRONG2 3 +#define wxSTC_TXT2TAGS_EM1 4 +#define wxSTC_TXT2TAGS_EM2 5 +#define wxSTC_TXT2TAGS_HEADER1 6 +#define wxSTC_TXT2TAGS_HEADER2 7 +#define wxSTC_TXT2TAGS_HEADER3 8 +#define wxSTC_TXT2TAGS_HEADER4 9 +#define wxSTC_TXT2TAGS_HEADER5 10 +#define wxSTC_TXT2TAGS_HEADER6 11 +#define wxSTC_TXT2TAGS_PRECHAR 12 +#define wxSTC_TXT2TAGS_ULIST_ITEM 13 +#define wxSTC_TXT2TAGS_OLIST_ITEM 14 +#define wxSTC_TXT2TAGS_BLOCKQUOTE 15 +#define wxSTC_TXT2TAGS_STRIKEOUT 16 +#define wxSTC_TXT2TAGS_HRULE 17 +#define wxSTC_TXT2TAGS_LINK 18 +#define wxSTC_TXT2TAGS_CODE 19 +#define wxSTC_TXT2TAGS_CODE2 20 +#define wxSTC_TXT2TAGS_CODEBK 21 +#define wxSTC_TXT2TAGS_COMMENT 22 +#define wxSTC_TXT2TAGS_OPTION 23 +#define wxSTC_TXT2TAGS_PREPROC 24 +#define wxSTC_TXT2TAGS_POSTPROC 25 + +/// Lexical states for SCLEX_A68K +#define wxSTC_A68K_DEFAULT 0 +#define wxSTC_A68K_COMMENT 1 +#define wxSTC_A68K_NUMBER_DEC 2 +#define wxSTC_A68K_NUMBER_BIN 3 +#define wxSTC_A68K_NUMBER_HEX 4 +#define wxSTC_A68K_STRING1 5 +#define wxSTC_A68K_OPERATOR 6 +#define wxSTC_A68K_CPUINSTRUCTION 7 +#define wxSTC_A68K_EXTINSTRUCTION 8 +#define wxSTC_A68K_REGISTER 9 +#define wxSTC_A68K_DIRECTIVE 10 +#define wxSTC_A68K_MACRO_ARG 11 +#define wxSTC_A68K_LABEL 12 +#define wxSTC_A68K_STRING2 13 +#define wxSTC_A68K_IDENTIFIER 14 +#define wxSTC_A68K_MACRO_DECLARATION 15 +#define wxSTC_A68K_COMMENT_WORD 16 +#define wxSTC_A68K_COMMENT_SPECIAL 17 +#define wxSTC_A68K_COMMENT_DOXYGEN 18 + +/// Lexical states for SCLEX_MODULA +#define wxSTC_MODULA_DEFAULT 0 +#define wxSTC_MODULA_COMMENT 1 +#define wxSTC_MODULA_DOXYCOMM 2 +#define wxSTC_MODULA_DOXYKEY 3 +#define wxSTC_MODULA_KEYWORD 4 +#define wxSTC_MODULA_RESERVED 5 +#define wxSTC_MODULA_NUMBER 6 +#define wxSTC_MODULA_BASENUM 7 +#define wxSTC_MODULA_FLOAT 8 +#define wxSTC_MODULA_STRING 9 +#define wxSTC_MODULA_STRSPEC 10 +#define wxSTC_MODULA_CHAR 11 +#define wxSTC_MODULA_CHARSPEC 12 +#define wxSTC_MODULA_PROC 13 +#define wxSTC_MODULA_PRAGMA 14 +#define wxSTC_MODULA_PRGKEY 15 +#define wxSTC_MODULA_OPERATOR 16 +#define wxSTC_MODULA_BADSTR 17 + +/// Lexical states for SCLEX_COFFEESCRIPT +#define wxSTC_COFFEESCRIPT_DEFAULT 0 +#define wxSTC_COFFEESCRIPT_COMMENT 1 +#define wxSTC_COFFEESCRIPT_COMMENTLINE 2 +#define wxSTC_COFFEESCRIPT_COMMENTDOC 3 +#define wxSTC_COFFEESCRIPT_NUMBER 4 +#define wxSTC_COFFEESCRIPT_WORD 5 +#define wxSTC_COFFEESCRIPT_STRING 6 +#define wxSTC_COFFEESCRIPT_CHARACTER 7 +#define wxSTC_COFFEESCRIPT_UUID 8 +#define wxSTC_COFFEESCRIPT_PREPROCESSOR 9 +#define wxSTC_COFFEESCRIPT_OPERATOR 10 +#define wxSTC_COFFEESCRIPT_IDENTIFIER 11 +#define wxSTC_COFFEESCRIPT_STRINGEOL 12 +#define wxSTC_COFFEESCRIPT_VERBATIM 13 +#define wxSTC_COFFEESCRIPT_REGEX 14 +#define wxSTC_COFFEESCRIPT_COMMENTLINEDOC 15 +#define wxSTC_COFFEESCRIPT_WORD2 16 +#define wxSTC_COFFEESCRIPT_COMMENTDOCKEYWORD 17 +#define wxSTC_COFFEESCRIPT_COMMENTDOCKEYWORDERROR 18 +#define wxSTC_COFFEESCRIPT_GLOBALCLASS 19 +#define wxSTC_COFFEESCRIPT_STRINGRAW 20 +#define wxSTC_COFFEESCRIPT_TRIPLEVERBATIM 21 +#define wxSTC_COFFEESCRIPT_HASHQUOTEDSTRING 22 +#define wxSTC_COFFEESCRIPT_COMMENTBLOCK 22 +#define wxSTC_COFFEESCRIPT_VERBOSE_REGEX 23 +#define wxSTC_COFFEESCRIPT_VERBOSE_REGEX_COMMENT 24 + +/// Lexical states for SCLEX_AVS +#define wxSTC_AVS_DEFAULT 0 +#define wxSTC_AVS_COMMENTBLOCK 1 +#define wxSTC_AVS_COMMENTBLOCKN 2 +#define wxSTC_AVS_COMMENTLINE 3 +#define wxSTC_AVS_NUMBER 4 +#define wxSTC_AVS_OPERATOR 5 +#define wxSTC_AVS_IDENTIFIER 6 +#define wxSTC_AVS_STRING 7 +#define wxSTC_AVS_TRIPLESTRING 8 +#define wxSTC_AVS_KEYWORD 9 +#define wxSTC_AVS_FILTER 10 +#define wxSTC_AVS_PLUGIN 11 +#define wxSTC_AVS_FUNCTION 12 +#define wxSTC_AVS_CLIPPROP 13 +#define wxSTC_AVS_USERDFN 14 + +/// Lexical states for SCLEX_ECL +#define wxSTC_ECL_DEFAULT 0 +#define wxSTC_ECL_COMMENT 1 +#define wxSTC_ECL_COMMENTLINE 2 +#define wxSTC_ECL_NUMBER 3 +#define wxSTC_ECL_STRING 4 +#define wxSTC_ECL_WORD0 5 +#define wxSTC_ECL_OPERATOR 6 +#define wxSTC_ECL_CHARACTER 7 +#define wxSTC_ECL_UUID 8 +#define wxSTC_ECL_PREPROCESSOR 9 +#define wxSTC_ECL_UNKNOWN 10 +#define wxSTC_ECL_IDENTIFIER 11 +#define wxSTC_ECL_STRINGEOL 12 +#define wxSTC_ECL_VERBATIM 13 +#define wxSTC_ECL_REGEX 14 +#define wxSTC_ECL_COMMENTLINEDOC 15 +#define wxSTC_ECL_WORD1 16 +#define wxSTC_ECL_COMMENTDOCKEYWORD 17 +#define wxSTC_ECL_COMMENTDOCKEYWORDERROR 18 +#define wxSTC_ECL_WORD2 19 +#define wxSTC_ECL_WORD3 20 +#define wxSTC_ECL_WORD4 21 +#define wxSTC_ECL_WORD5 22 +#define wxSTC_ECL_COMMENTDOC 23 +#define wxSTC_ECL_ADDED 24 +#define wxSTC_ECL_DELETED 25 +#define wxSTC_ECL_CHANGED 26 +#define wxSTC_ECL_MOVED 27 + +/// Lexical states for SCLEX_OSCRIPT +#define wxSTC_OSCRIPT_DEFAULT 0 +#define wxSTC_OSCRIPT_LINE_COMMENT 1 +#define wxSTC_OSCRIPT_BLOCK_COMMENT 2 +#define wxSTC_OSCRIPT_DOC_COMMENT 3 +#define wxSTC_OSCRIPT_PREPROCESSOR 4 +#define wxSTC_OSCRIPT_NUMBER 5 +#define wxSTC_OSCRIPT_SINGLEQUOTE_STRING 6 +#define wxSTC_OSCRIPT_DOUBLEQUOTE_STRING 7 +#define wxSTC_OSCRIPT_CONSTANT 8 +#define wxSTC_OSCRIPT_IDENTIFIER 9 +#define wxSTC_OSCRIPT_GLOBAL 10 +#define wxSTC_OSCRIPT_KEYWORD 11 +#define wxSTC_OSCRIPT_OPERATOR 12 +#define wxSTC_OSCRIPT_LABEL 13 +#define wxSTC_OSCRIPT_TYPE 14 +#define wxSTC_OSCRIPT_FUNCTION 15 +#define wxSTC_OSCRIPT_OBJECT 16 +#define wxSTC_OSCRIPT_PROPERTY 17 +#define wxSTC_OSCRIPT_METHOD 18 + +/// Lexical states for SCLEX_VISUALPROLOG +#define wxSTC_VISUALPROLOG_DEFAULT 0 +#define wxSTC_VISUALPROLOG_KEY_MAJOR 1 +#define wxSTC_VISUALPROLOG_KEY_MINOR 2 +#define wxSTC_VISUALPROLOG_KEY_DIRECTIVE 3 +#define wxSTC_VISUALPROLOG_COMMENT_BLOCK 4 +#define wxSTC_VISUALPROLOG_COMMENT_LINE 5 +#define wxSTC_VISUALPROLOG_COMMENT_KEY 6 +#define wxSTC_VISUALPROLOG_COMMENT_KEY_ERROR 7 +#define wxSTC_VISUALPROLOG_IDENTIFIER 8 +#define wxSTC_VISUALPROLOG_VARIABLE 9 +#define wxSTC_VISUALPROLOG_ANONYMOUS 10 +#define wxSTC_VISUALPROLOG_NUMBER 11 +#define wxSTC_VISUALPROLOG_OPERATOR 12 +#define wxSTC_VISUALPROLOG_CHARACTER 13 +#define wxSTC_VISUALPROLOG_CHARACTER_TOO_MANY 14 +#define wxSTC_VISUALPROLOG_CHARACTER_ESCAPE_ERROR 15 +#define wxSTC_VISUALPROLOG_STRING 16 +#define wxSTC_VISUALPROLOG_STRING_ESCAPE 17 +#define wxSTC_VISUALPROLOG_STRING_ESCAPE_ERROR 18 +#define wxSTC_VISUALPROLOG_STRING_EOL_OPEN 19 +#define wxSTC_VISUALPROLOG_STRING_VERBATIM 20 +#define wxSTC_VISUALPROLOG_STRING_VERBATIM_SPECIAL 21 +#define wxSTC_VISUALPROLOG_STRING_VERBATIM_EOL 22 + +//}}} +//---------------------------------------------------------------------- + +//---------------------------------------------------------------------- +// Commands that can be bound to keystrokes section {{{ + + +/// Redoes the next action on the undo history. +#define wxSTC_CMD_REDO 2011 + +/// Select all the text in the document. +#define wxSTC_CMD_SELECTALL 2013 + +/// Undo one action in the undo history. +#define wxSTC_CMD_UNDO 2176 + +/// Cut the selection to the clipboard. +#define wxSTC_CMD_CUT 2177 + +/// Copy the selection to the clipboard. +#define wxSTC_CMD_COPY 2178 + +/// Paste the contents of the clipboard into the document replacing the selection. +#define wxSTC_CMD_PASTE 2179 + +/// Clear the selection. +#define wxSTC_CMD_CLEAR 2180 + +/// Move caret down one line. +#define wxSTC_CMD_LINEDOWN 2300 + +/// Move caret down one line extending selection to new caret position. +#define wxSTC_CMD_LINEDOWNEXTEND 2301 + +/// Move caret up one line. +#define wxSTC_CMD_LINEUP 2302 + +/// Move caret up one line extending selection to new caret position. +#define wxSTC_CMD_LINEUPEXTEND 2303 + +/// Move caret left one character. +#define wxSTC_CMD_CHARLEFT 2304 + +/// Move caret left one character extending selection to new caret position. +#define wxSTC_CMD_CHARLEFTEXTEND 2305 + +/// Move caret right one character. +#define wxSTC_CMD_CHARRIGHT 2306 + +/// Move caret right one character extending selection to new caret position. +#define wxSTC_CMD_CHARRIGHTEXTEND 2307 + +/// Move caret left one word. +#define wxSTC_CMD_WORDLEFT 2308 + +/// Move caret left one word extending selection to new caret position. +#define wxSTC_CMD_WORDLEFTEXTEND 2309 + +/// Move caret right one word. +#define wxSTC_CMD_WORDRIGHT 2310 + +/// Move caret right one word extending selection to new caret position. +#define wxSTC_CMD_WORDRIGHTEXTEND 2311 + +/// Move caret to first position on line. +#define wxSTC_CMD_HOME 2312 + +/// Move caret to first position on line extending selection to new caret position. +#define wxSTC_CMD_HOMEEXTEND 2313 + +/// Move caret to last position on line. +#define wxSTC_CMD_LINEEND 2314 + +/// Move caret to last position on line extending selection to new caret position. +#define wxSTC_CMD_LINEENDEXTEND 2315 + +/// Move caret to first position in document. +#define wxSTC_CMD_DOCUMENTSTART 2316 + +/// Move caret to first position in document extending selection to new caret position. +#define wxSTC_CMD_DOCUMENTSTARTEXTEND 2317 + +/// Move caret to last position in document. +#define wxSTC_CMD_DOCUMENTEND 2318 + +/// Move caret to last position in document extending selection to new caret position. +#define wxSTC_CMD_DOCUMENTENDEXTEND 2319 + +/// Move caret one page up. +#define wxSTC_CMD_PAGEUP 2320 + +/// Move caret one page up extending selection to new caret position. +#define wxSTC_CMD_PAGEUPEXTEND 2321 + +/// Move caret one page down. +#define wxSTC_CMD_PAGEDOWN 2322 + +/// Move caret one page down extending selection to new caret position. +#define wxSTC_CMD_PAGEDOWNEXTEND 2323 + +/// Switch from insert to overtype mode or the reverse. +#define wxSTC_CMD_EDITTOGGLEOVERTYPE 2324 + +/// Cancel any modes such as call tip or auto-completion list display. +#define wxSTC_CMD_CANCEL 2325 + +/// Delete the selection or if no selection, the character before the caret. +#define wxSTC_CMD_DELETEBACK 2326 + +/// If selection is empty or all on one line replace the selection with a tab character. +/// If more than one line selected, indent the lines. +#define wxSTC_CMD_TAB 2327 + +/// Dedent the selected lines. +#define wxSTC_CMD_BACKTAB 2328 + +/// Insert a new line, may use a CRLF, CR or LF depending on EOL mode. +#define wxSTC_CMD_NEWLINE 2329 + +/// Insert a Form Feed character. +#define wxSTC_CMD_FORMFEED 2330 + +/// Move caret to before first visible character on line. +/// If already there move to first character on line. +#define wxSTC_CMD_VCHOME 2331 + +/// Like VCHome but extending selection to new caret position. +#define wxSTC_CMD_VCHOMEEXTEND 2332 + +/// Magnify the displayed text by increasing the sizes by 1 point. +#define wxSTC_CMD_ZOOMIN 2333 + +/// Make the displayed text smaller by decreasing the sizes by 1 point. +#define wxSTC_CMD_ZOOMOUT 2334 + +/// Delete the word to the left of the caret. +#define wxSTC_CMD_DELWORDLEFT 2335 + +/// Delete the word to the right of the caret. +#define wxSTC_CMD_DELWORDRIGHT 2336 + +/// Delete the word to the right of the caret, but not the trailing non-word characters. +#define wxSTC_CMD_DELWORDRIGHTEND 2518 + +/// Cut the line containing the caret. +#define wxSTC_CMD_LINECUT 2337 + +/// Delete the line containing the caret. +#define wxSTC_CMD_LINEDELETE 2338 + +/// Switch the current line with the previous. +#define wxSTC_CMD_LINETRANSPOSE 2339 + +/// Duplicate the current line. +#define wxSTC_CMD_LINEDUPLICATE 2404 + +/// Transform the selection to lower case. +#define wxSTC_CMD_LOWERCASE 2340 + +/// Transform the selection to upper case. +#define wxSTC_CMD_UPPERCASE 2341 + +/// Scroll the document down, keeping the caret visible. +#define wxSTC_CMD_LINESCROLLDOWN 2342 + +/// Scroll the document up, keeping the caret visible. +#define wxSTC_CMD_LINESCROLLUP 2343 + +/// Delete the selection or if no selection, the character before the caret. +/// Will not delete the character before at the start of a line. +#define wxSTC_CMD_DELETEBACKNOTLINE 2344 + +/// Move caret to first position on display line. +#define wxSTC_CMD_HOMEDISPLAY 2345 + +/// Move caret to first position on display line extending selection to +/// new caret position. +#define wxSTC_CMD_HOMEDISPLAYEXTEND 2346 + +/// Move caret to last position on display line. +#define wxSTC_CMD_LINEENDDISPLAY 2347 + +/// Move caret to last position on display line extending selection to new +/// caret position. +#define wxSTC_CMD_LINEENDDISPLAYEXTEND 2348 + +/// These are like their namesakes Home(Extend)?, LineEnd(Extend)?, VCHome(Extend)? +/// except they behave differently when word-wrap is enabled: +/// They go first to the start / end of the display line, like (Home|LineEnd)Display +/// The difference is that, the cursor is already at the point, it goes on to the start +/// or end of the document line, as appropriate for (Home|LineEnd|VCHome)(Extend)?. +#define wxSTC_CMD_HOMEWRAP 2349 +#define wxSTC_CMD_HOMEWRAPEXTEND 2450 +#define wxSTC_CMD_LINEENDWRAP 2451 +#define wxSTC_CMD_LINEENDWRAPEXTEND 2452 +#define wxSTC_CMD_VCHOMEWRAP 2453 +#define wxSTC_CMD_VCHOMEWRAPEXTEND 2454 + +/// Copy the line containing the caret. +#define wxSTC_CMD_LINECOPY 2455 + +/// Move to the previous change in capitalisation. +#define wxSTC_CMD_WORDPARTLEFT 2390 + +/// Move to the previous change in capitalisation extending selection +/// to new caret position. +#define wxSTC_CMD_WORDPARTLEFTEXTEND 2391 + +/// Move to the change next in capitalisation. +#define wxSTC_CMD_WORDPARTRIGHT 2392 + +/// Move to the next change in capitalisation extending selection +/// to new caret position. +#define wxSTC_CMD_WORDPARTRIGHTEXTEND 2393 + +/// Delete back from the current position to the start of the line. +#define wxSTC_CMD_DELLINELEFT 2395 + +/// Delete forwards from the current position to the end of the line. +#define wxSTC_CMD_DELLINERIGHT 2396 + +/// Move caret between paragraphs (delimited by empty lines). +#define wxSTC_CMD_PARADOWN 2413 +#define wxSTC_CMD_PARADOWNEXTEND 2414 +#define wxSTC_CMD_PARAUP 2415 +#define wxSTC_CMD_PARAUPEXTEND 2416 + +/// Move caret down one line, extending rectangular selection to new caret position. +#define wxSTC_CMD_LINEDOWNRECTEXTEND 2426 + +/// Move caret up one line, extending rectangular selection to new caret position. +#define wxSTC_CMD_LINEUPRECTEXTEND 2427 + +/// Move caret left one character, extending rectangular selection to new caret position. +#define wxSTC_CMD_CHARLEFTRECTEXTEND 2428 + +/// Move caret right one character, extending rectangular selection to new caret position. +#define wxSTC_CMD_CHARRIGHTRECTEXTEND 2429 + +/// Move caret to first position on line, extending rectangular selection to new caret position. +#define wxSTC_CMD_HOMERECTEXTEND 2430 + +/// Move caret to before first visible character on line. +/// If already there move to first character on line. +/// In either case, extend rectangular selection to new caret position. +#define wxSTC_CMD_VCHOMERECTEXTEND 2431 + +/// Move caret to last position on line, extending rectangular selection to new caret position. +#define wxSTC_CMD_LINEENDRECTEXTEND 2432 + +/// Move caret one page up, extending rectangular selection to new caret position. +#define wxSTC_CMD_PAGEUPRECTEXTEND 2433 + +/// Move caret one page down, extending rectangular selection to new caret position. +#define wxSTC_CMD_PAGEDOWNRECTEXTEND 2434 + +/// Move caret to top of page, or one page up if already at top of page. +#define wxSTC_CMD_STUTTEREDPAGEUP 2435 + +/// Move caret to top of page, or one page up if already at top of page, extending selection to new caret position. +#define wxSTC_CMD_STUTTEREDPAGEUPEXTEND 2436 + +/// Move caret to bottom of page, or one page down if already at bottom of page. +#define wxSTC_CMD_STUTTEREDPAGEDOWN 2437 + +/// Move caret to bottom of page, or one page down if already at bottom of page, extending selection to new caret position. +#define wxSTC_CMD_STUTTEREDPAGEDOWNEXTEND 2438 + +/// Move caret left one word, position cursor at end of word. +#define wxSTC_CMD_WORDLEFTEND 2439 + +/// Move caret left one word, position cursor at end of word, extending selection to new caret position. +#define wxSTC_CMD_WORDLEFTENDEXTEND 2440 + +/// Move caret right one word, position cursor at end of word. +#define wxSTC_CMD_WORDRIGHTEND 2441 + +/// Move caret right one word, position cursor at end of word, extending selection to new caret position. +#define wxSTC_CMD_WORDRIGHTENDEXTEND 2442 + +/// Centre current line in window. +#define wxSTC_CMD_VERTICALCENTRECARET 2619 + +/// Move the selected lines up one line, shifting the line above after the selection +#define wxSTC_CMD_MOVESELECTEDLINESUP 2620 + +/// Move the selected lines down one line, shifting the line below before the selection +#define wxSTC_CMD_MOVESELECTEDLINESDOWN 2621 + +/// Scroll to start of document. +#define wxSTC_CMD_SCROLLTOSTART 2628 + +/// Scroll to end of document. +#define wxSTC_CMD_SCROLLTOEND 2629 + +//}}} +//---------------------------------------------------------------------- + +class ScintillaWX; // forward declare +class WordList; +struct SCNotification; + +#ifndef SWIG +extern WXDLLIMPEXP_DATA_STC(const char) wxSTCNameStr[]; +class WXDLLIMPEXP_FWD_STC wxStyledTextCtrl; +class WXDLLIMPEXP_FWD_STC wxStyledTextEvent; +#endif + +//---------------------------------------------------------------------- + +class WXDLLIMPEXP_STC wxStyledTextCtrl : public wxControl, +#if wxUSE_TEXTCTRL + public wxTextCtrlIface +#else // !wxUSE_TEXTCTRL + public wxTextEntryBase +#endif // wxUSE_TEXTCTRL/!wxUSE_TEXTCTRL +{ +public: + +#ifdef SWIG + %pythonAppend wxStyledTextCtrl "self._setOORInfo(self)" + %pythonAppend wxStyledTextCtrl() "" + + wxStyledTextCtrl(wxWindow *parent, wxWindowID id=wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxString& name = wxPySTCNameStr); + %RenameCtor(PreStyledTextCtrl, wxStyledTextCtrl()); + +#else + wxStyledTextCtrl(wxWindow *parent, wxWindowID id=wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxString& name = wxSTCNameStr); + wxStyledTextCtrl() { m_swx = NULL; } + ~wxStyledTextCtrl(); + +#endif + + bool Create(wxWindow *parent, wxWindowID id=wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxString& name = wxSTCNameStr); + + + //---------------------------------------------------------------------- + // Generated method declaration section {{{ + + + // Add text to the document at current position. + void AddText(const wxString& text); + + // Add array of cells to document. + void AddStyledText(const wxMemoryBuffer& data); + + // Insert string at a position. + void InsertText(int pos, const wxString& text); + + // Delete all text in the document. + void ClearAll(); + + // Delete a range of text in the document. + void DeleteRange(int pos, int deleteLength); + + // Set all style bytes to 0, remove all folding information. + void ClearDocumentStyle(); + + // Returns the number of bytes in the document. + int GetLength() const; + + // Returns the character byte at the position. + int GetCharAt(int pos) const; + + // Returns the position of the caret. + int GetCurrentPos() const; + + // Returns the position of the opposite end of the selection to the caret. + int GetAnchor() const; + + // Returns the style byte at the position. + int GetStyleAt(int pos) const; + + // Redoes the next action on the undo history. + void Redo(); + + // Choose between collecting actions into the undo + // history and discarding them. + void SetUndoCollection(bool collectUndo); + + // Select all the text in the document. + void SelectAll(); + + // Remember the current position in the undo history as the position + // at which the document was saved. + void SetSavePoint(); + + // Retrieve a buffer of cells. + wxMemoryBuffer GetStyledText(int startPos, int endPos); + + // Are there any redoable actions in the undo history? + bool CanRedo() const; + + // Retrieve the line number at which a particular marker is located. + int MarkerLineFromHandle(int handle); + + // Delete a marker. + void MarkerDeleteHandle(int handle); + + // Is undo history being collected? + bool GetUndoCollection() const; + + // Are white space characters currently visible? + // Returns one of SCWS_* constants. + int GetViewWhiteSpace() const; + + // Make white space characters invisible, always visible or visible outside indentation. + void SetViewWhiteSpace(int viewWS); + + // Find the position from a point within the window. + int PositionFromPoint(wxPoint pt) const; + + // Find the position from a point within the window but return + // INVALID_POSITION if not close to text. + int PositionFromPointClose(int x, int y); + + // Set caret to start of a line and ensure it is visible. + void GotoLine(int line); + + // Set caret to a position and ensure it is visible. + void GotoPos(int pos); + + // Set the selection anchor to a position. The anchor is the opposite + // end of the selection from the caret. + void SetAnchor(int posAnchor); + + // Retrieve the text of the line containing the caret. + // Returns the index of the caret on the line. + #ifdef SWIG + wxString GetCurLine(int* OUTPUT); +#else + wxString GetCurLine(int* linePos=NULL); +#endif + + // Retrieve the position of the last correctly styled character. + int GetEndStyled() const; + + // Convert all line endings in the document to one mode. + void ConvertEOLs(int eolMode); + + // Retrieve the current end of line mode - one of CRLF, CR, or LF. + int GetEOLMode() const; + + // Set the current end of line mode. + void SetEOLMode(int eolMode); + + // Set the current styling position to pos and the styling mask to mask. + // The styling mask can be used to protect some bits in each styling byte from modification. + void StartStyling(int pos, int mask); + + // Change style from current styling position for length characters to a style + // and move the current styling position to after this newly styled segment. + void SetStyling(int length, int style); + + // Is drawing done first into a buffer or direct to the screen? + bool GetBufferedDraw() const; + + // If drawing is buffered then each line of text is drawn into a bitmap buffer + // before drawing it to the screen to avoid flicker. + void SetBufferedDraw(bool buffered); + + // Change the visible size of a tab to be a multiple of the width of a space character. + void SetTabWidth(int tabWidth); + + // Retrieve the visible size of a tab. + int GetTabWidth() const; + + // Set the code page used to interpret the bytes of the document as characters. + void SetCodePage(int codePage); + + // Set the symbol used for a particular marker number, + // and optionally the fore and background colours. + void MarkerDefine(int markerNumber, int markerSymbol, + const wxColour& foreground = wxNullColour, + const wxColour& background = wxNullColour); + + // Set the foreground colour used for a particular marker number. + void MarkerSetForeground(int markerNumber, const wxColour& fore); + + // Set the background colour used for a particular marker number. + void MarkerSetBackground(int markerNumber, const wxColour& back); + + // Set the background colour used for a particular marker number when its folding block is selected. + void MarkerSetBackgroundSelected(int markerNumber, const wxColour& back); + + // Enable/disable highlight for current folding bloc (smallest one that contains the caret) + void MarkerEnableHighlight(bool enabled); + + // Add a marker to a line, returning an ID which can be used to find or delete the marker. + int MarkerAdd(int line, int markerNumber); + + // Delete a marker from a line. + void MarkerDelete(int line, int markerNumber); + + // Delete all markers with a particular number from all lines. + void MarkerDeleteAll(int markerNumber); + + // Get a bit mask of all the markers set on a line. + int MarkerGet(int line); + + // Find the next line at or after lineStart that includes a marker in mask. + // Return -1 when no more lines. + int MarkerNext(int lineStart, int markerMask); + + // Find the previous line before lineStart that includes a marker in mask. + int MarkerPrevious(int lineStart, int markerMask); + + // Define a marker from a bitmap + void MarkerDefineBitmap(int markerNumber, const wxBitmap& bmp); + + // Add a set of markers to a line. + void MarkerAddSet(int line, int set); + + // Set the alpha used for a marker that is drawn in the text area, not the margin. + void MarkerSetAlpha(int markerNumber, int alpha); + + // Set a margin to be either numeric or symbolic. + void SetMarginType(int margin, int marginType); + + // Retrieve the type of a margin. + int GetMarginType(int margin) const; + + // Set the width of a margin to a width expressed in pixels. + void SetMarginWidth(int margin, int pixelWidth); + + // Retrieve the width of a margin in pixels. + int GetMarginWidth(int margin) const; + + // Set a mask that determines which markers are displayed in a margin. + void SetMarginMask(int margin, int mask); + + // Retrieve the marker mask of a margin. + int GetMarginMask(int margin) const; + + // Make a margin sensitive or insensitive to mouse clicks. + void SetMarginSensitive(int margin, bool sensitive); + + // Retrieve the mouse click sensitivity of a margin. + bool GetMarginSensitive(int margin) const; + + // Set the cursor shown when the mouse is inside a margin. + void SetMarginCursor(int margin, int cursor); + + // Retrieve the cursor shown in a margin. + int GetMarginCursor(int margin) const; + + // Clear all the styles and make equivalent to the global default style. + void StyleClearAll(); + + // Set the foreground colour of a style. + void StyleSetForeground(int style, const wxColour& fore); + + // Set the background colour of a style. + void StyleSetBackground(int style, const wxColour& back); + + // Set a style to be bold or not. + void StyleSetBold(int style, bool bold); + + // Set a style to be italic or not. + void StyleSetItalic(int style, bool italic); + + // Set the size of characters of a style. + void StyleSetSize(int style, int sizePoints); + + // Set the font of a style. + void StyleSetFaceName(int style, const wxString& fontName); + + // Set a style to have its end of line filled or not. + void StyleSetEOLFilled(int style, bool filled); + + // Reset the default style to its state at startup + void StyleResetDefault(); + + // Set a style to be underlined or not. + void StyleSetUnderline(int style, bool underline); + + // Get the foreground colour of a style. + wxColour StyleGetForeground(int style) const; + + // Get the background colour of a style. + wxColour StyleGetBackground(int style) const; + + // Get is a style bold or not. + bool StyleGetBold(int style) const; + + // Get is a style italic or not. + bool StyleGetItalic(int style) const; + + // Get the size of characters of a style. + int StyleGetSize(int style) const; + + // Get the font facename of a style + wxString StyleGetFaceName(int style); + + // Get is a style to have its end of line filled or not. + bool StyleGetEOLFilled(int style) const; + + // Get is a style underlined or not. + bool StyleGetUnderline(int style) const; + + // Get is a style mixed case, or to force upper or lower case. + int StyleGetCase(int style) const; + + // Get the character set of the font in a style. + int StyleGetCharacterSet(int style) const; + + // Get is a style visible or not. + bool StyleGetVisible(int style) const; + + // Get is a style changeable or not (read only). + // Experimental feature, currently buggy. + bool StyleGetChangeable(int style) const; + + // Get is a style a hotspot or not. + bool StyleGetHotSpot(int style) const; + + // Set a style to be mixed case, or to force upper or lower case. + void StyleSetCase(int style, int caseForce); + + // Set the size of characters of a style. Size is in points multiplied by 100. + void StyleSetSizeFractional(int style, int caseForce); + + // Get the size of characters of a style in points multiplied by 100 + int StyleGetSizeFractional(int style) const; + + // Set the weight of characters of a style. + void StyleSetWeight(int style, int weight); + + // Get the weight of characters of a style. + int StyleGetWeight(int style) const; + + // Set a style to be a hotspot or not. + void StyleSetHotSpot(int style, bool hotspot); + + // Set the foreground colour of the main and additional selections and whether to use this setting. + void SetSelForeground(bool useSetting, const wxColour& fore); + + // Set the background colour of the main and additional selections and whether to use this setting. + void SetSelBackground(bool useSetting, const wxColour& back); + + // Get the alpha of the selection. + int GetSelAlpha() const; + + // Set the alpha of the selection. + void SetSelAlpha(int alpha); + + // Is the selection end of line filled? + bool GetSelEOLFilled() const; + + // Set the selection to have its end of line filled or not. + void SetSelEOLFilled(bool filled); + + // Set the foreground colour of the caret. + void SetCaretForeground(const wxColour& fore); + + // When key+modifier combination km is pressed perform msg. + void CmdKeyAssign(int key, int modifiers, int cmd); + + // When key+modifier combination km is pressed do nothing. + void CmdKeyClear(int key, int modifiers); + + // Drop all key mappings. + void CmdKeyClearAll(); + + // Set the styles for a segment of the document. + void SetStyleBytes(int length, char* styleBytes); + + // Set a style to be visible or not. + void StyleSetVisible(int style, bool visible); + + // Get the time in milliseconds that the caret is on and off. + int GetCaretPeriod() const; + + // Get the time in milliseconds that the caret is on and off. 0 = steady on. + void SetCaretPeriod(int periodMilliseconds); + + // Set the set of characters making up words for when moving or selecting by word. + // First sets defaults like SetCharsDefault. + void SetWordChars(const wxString& characters); + + // Get the set of characters making up words for when moving or selecting by word. + wxString GetWordChars() const; + + // Start a sequence of actions that is undone and redone as a unit. + // May be nested. + void BeginUndoAction(); + + // End a sequence of actions that is undone and redone as a unit. + void EndUndoAction(); + + // Set an indicator to plain, squiggle or TT. + void IndicatorSetStyle(int indic, int style); + + // Retrieve the style of an indicator. + int IndicatorGetStyle(int indic) const; + + // Set the foreground colour of an indicator. + void IndicatorSetForeground(int indic, const wxColour& fore); + + // Retrieve the foreground colour of an indicator. + wxColour IndicatorGetForeground(int indic) const; + + // Set an indicator to draw under text or over(default). + void IndicatorSetUnder(int indic, bool under); + + // Retrieve whether indicator drawn under or over text. + bool IndicatorGetUnder(int indic) const; + + // Set the foreground colour of all whitespace and whether to use this setting. + void SetWhitespaceForeground(bool useSetting, const wxColour& fore); + + // Set the background colour of all whitespace and whether to use this setting. + void SetWhitespaceBackground(bool useSetting, const wxColour& back); + + // Set the size of the dots used to mark space characters. + void SetWhitespaceSize(int size); + + // Get the size of the dots used to mark space characters. + int GetWhitespaceSize() const; + + // Divide each styling byte into lexical class bits (default: 5) and indicator + // bits (default: 3). If a lexer requires more than 32 lexical states, then this + // is used to expand the possible states. + void SetStyleBits(int bits); + + // Retrieve number of bits in style bytes used to hold the lexical state. + int GetStyleBits() const; + + // Used to hold extra styling information for each line. + void SetLineState(int line, int state); + + // Retrieve the extra styling information for a line. + int GetLineState(int line) const; + + // Retrieve the last line number that has line state. + int GetMaxLineState() const; + + // Is the background of the line containing the caret in a different colour? + bool GetCaretLineVisible() const; + + // Display the background of the line containing the caret in a different colour. + void SetCaretLineVisible(bool show); + + // Get the colour of the background of the line containing the caret. + wxColour GetCaretLineBackground() const; + + // Set the colour of the background of the line containing the caret. + void SetCaretLineBackground(const wxColour& back); + + // Set a style to be changeable or not (read only). + // Experimental feature, currently buggy. + void StyleSetChangeable(int style, bool changeable); + + // Display a auto-completion list. + // The lenEntered parameter indicates how many characters before + // the caret should be used to provide context. + void AutoCompShow(int lenEntered, const wxString& itemList); + + // Remove the auto-completion list from the screen. + void AutoCompCancel(); + + // Is there an auto-completion list visible? + bool AutoCompActive(); + + // Retrieve the position of the caret when the auto-completion list was displayed. + int AutoCompPosStart(); + + // User has selected an item so remove the list and insert the selection. + void AutoCompComplete(); + + // Define a set of character that when typed cancel the auto-completion list. + void AutoCompStops(const wxString& characterSet); + + // Change the separator character in the string setting up an auto-completion list. + // Default is space but can be changed if items contain space. + void AutoCompSetSeparator(int separatorCharacter); + + // Retrieve the auto-completion list separator character. + int AutoCompGetSeparator() const; + + // Select the item in the auto-completion list that starts with a string. + void AutoCompSelect(const wxString& text); + + // Should the auto-completion list be cancelled if the user backspaces to a + // position before where the box was created. + void AutoCompSetCancelAtStart(bool cancel); + + // Retrieve whether auto-completion cancelled by backspacing before start. + bool AutoCompGetCancelAtStart() const; + + // Define a set of characters that when typed will cause the autocompletion to + // choose the selected item. + void AutoCompSetFillUps(const wxString& characterSet); + + // Should a single item auto-completion list automatically choose the item. + void AutoCompSetChooseSingle(bool chooseSingle); + + // Retrieve whether a single item auto-completion list automatically choose the item. + bool AutoCompGetChooseSingle() const; + + // Set whether case is significant when performing auto-completion searches. + void AutoCompSetIgnoreCase(bool ignoreCase); + + // Retrieve state of ignore case flag. + bool AutoCompGetIgnoreCase() const; + + // Display a list of strings and send notification when user chooses one. + void UserListShow(int listType, const wxString& itemList); + + // Set whether or not autocompletion is hidden automatically when nothing matches. + void AutoCompSetAutoHide(bool autoHide); + + // Retrieve whether or not autocompletion is hidden automatically when nothing matches. + bool AutoCompGetAutoHide() const; + + // Set whether or not autocompletion deletes any word characters + // after the inserted text upon completion. + void AutoCompSetDropRestOfWord(bool dropRestOfWord); + + // Retrieve whether or not autocompletion deletes any word characters + // after the inserted text upon completion. + bool AutoCompGetDropRestOfWord() const; + + // Register an image for use in autocompletion lists. + void RegisterImage(int type, const wxBitmap& bmp); + + // Clear all the registered images. + void ClearRegisteredImages(); + + // Retrieve the auto-completion list type-separator character. + int AutoCompGetTypeSeparator() const; + + // Change the type-separator character in the string setting up an auto-completion list. + // Default is '?' but can be changed if items contain '?'. + void AutoCompSetTypeSeparator(int separatorCharacter); + + // Set the maximum width, in characters, of auto-completion and user lists. + // Set to 0 to autosize to fit longest item, which is the default. + void AutoCompSetMaxWidth(int characterCount); + + // Get the maximum width, in characters, of auto-completion and user lists. + int AutoCompGetMaxWidth() const; + + // Set the maximum height, in rows, of auto-completion and user lists. + // The default is 5 rows. + void AutoCompSetMaxHeight(int rowCount); + + // Set the maximum height, in rows, of auto-completion and user lists. + int AutoCompGetMaxHeight() const; + + // Set the number of spaces used for one level of indentation. + void SetIndent(int indentSize); + + // Retrieve indentation size. + int GetIndent() const; + + // Indentation will only use space characters if useTabs is false, otherwise + // it will use a combination of tabs and spaces. + void SetUseTabs(bool useTabs); + + // Retrieve whether tabs will be used in indentation. + bool GetUseTabs() const; + + // Change the indentation of a line to a number of columns. + void SetLineIndentation(int line, int indentSize); + + // Retrieve the number of columns that a line is indented. + int GetLineIndentation(int line) const; + + // Retrieve the position before the first non indentation character on a line. + int GetLineIndentPosition(int line) const; + + // Retrieve the column number of a position, taking tab width into account. + int GetColumn(int pos) const; + + // Count characters between two positions. + int CountCharacters(int startPos, int endPos); + + // Show or hide the horizontal scroll bar. + void SetUseHorizontalScrollBar(bool show); + + // Is the horizontal scroll bar visible? + bool GetUseHorizontalScrollBar() const; + + // Show or hide indentation guides. + void SetIndentationGuides(int indentView); + + // Are the indentation guides visible? + int GetIndentationGuides() const; + + // Set the highlighted indentation guide column. + // 0 = no highlighted guide. + void SetHighlightGuide(int column); + + // Get the highlighted indentation guide column. + int GetHighlightGuide() const; + + // Get the position after the last visible characters on a line. + int GetLineEndPosition(int line) const; + + // Get the code page used to interpret the bytes of the document as characters. + int GetCodePage() const; + + // Get the foreground colour of the caret. + wxColour GetCaretForeground() const; + + // In read-only mode? + bool GetReadOnly() const; + + // Sets the position of the caret. + void SetCurrentPos(int pos); + + // Sets the position that starts the selection - this becomes the anchor. + void SetSelectionStart(int pos); + + // Returns the position at the start of the selection. + int GetSelectionStart() const; + + // Sets the position that ends the selection - this becomes the currentPosition. + void SetSelectionEnd(int pos); + + // Returns the position at the end of the selection. + int GetSelectionEnd() const; + + // Set caret to a position, while removing any existing selection. + void SetEmptySelection(int pos); + + // Sets the print magnification added to the point size of each style for printing. + void SetPrintMagnification(int magnification); + + // Returns the print magnification. + int GetPrintMagnification() const; + + // Modify colours when printing for clearer printed text. + void SetPrintColourMode(int mode); + + // Returns the print colour mode. + int GetPrintColourMode() const; + + // Find some text in the document. + int FindText(int minPos, int maxPos, const wxString& text, int flags=0); + + // On Windows, will draw the document into a display context such as a printer. + int FormatRange(bool doDraw, + int startPos, + int endPos, + wxDC* draw, + wxDC* target, + wxRect renderRect, + wxRect pageRect); + + // Retrieve the display line at the top of the display. + int GetFirstVisibleLine() const; + + // Retrieve the contents of a line. + wxString GetLine(int line) const; + + // Returns the number of lines in the document. There is always at least one. + int GetLineCount() const; + + // Sets the size in pixels of the left margin. + void SetMarginLeft(int pixelWidth); + + // Returns the size in pixels of the left margin. + int GetMarginLeft() const; + + // Sets the size in pixels of the right margin. + void SetMarginRight(int pixelWidth); + + // Returns the size in pixels of the right margin. + int GetMarginRight() const; + + // Is the document different from when it was last saved? + bool GetModify() const; + + // Retrieve the selected text. + wxString GetSelectedText(); + + // Retrieve a range of text. + wxString GetTextRange(int startPos, int endPos); + + // Draw the selection in normal style or with selection highlighted. + void HideSelection(bool normal); + + // Retrieve the line containing a position. + int LineFromPosition(int pos) const; + + // Retrieve the position at the start of a line. + int PositionFromLine(int line) const; + + // Scroll horizontally and vertically. + void LineScroll(int columns, int lines); + + // Ensure the caret is visible. + void EnsureCaretVisible(); + + // Replace the selected text with the argument text. + void ReplaceSelection(const wxString& text); + + // Set to read only or read write. + void SetReadOnly(bool readOnly); + + // Will a paste succeed? + bool CanPaste() const; + + // Are there any undoable actions in the undo history? + bool CanUndo() const; + + // Delete the undo history. + void EmptyUndoBuffer(); + + // Undo one action in the undo history. + void Undo(); + + // Cut the selection to the clipboard. + void Cut(); + + // Copy the selection to the clipboard. + void Copy(); + + // Paste the contents of the clipboard into the document replacing the selection. + void Paste(); + + // Clear the selection. + void Clear(); + + // Replace the contents of the document with the argument text. + void SetText(const wxString& text); + + // Retrieve all the text in the document. + wxString GetText() const; + + // Retrieve the number of characters in the document. + int GetTextLength() const; + + // Set to overtype (true) or insert mode. + void SetOvertype(bool overtype); + + // Returns true if overtype mode is active otherwise false is returned. + bool GetOvertype() const; + + // Set the width of the insert mode caret. + void SetCaretWidth(int pixelWidth); + + // Returns the width of the insert mode caret. + int GetCaretWidth() const; + + // Sets the position that starts the target which is used for updating the + // document without affecting the scroll position. + void SetTargetStart(int pos); + + // Get the position that starts the target. + int GetTargetStart() const; + + // Sets the position that ends the target which is used for updating the + // document without affecting the scroll position. + void SetTargetEnd(int pos); + + // Get the position that ends the target. + int GetTargetEnd() const; + + // Replace the target text with the argument text. + // Text is counted so it can contain NULs. + // Returns the length of the replacement text. + int ReplaceTarget(const wxString& text); + + // Replace the target text with the argument text after \\d processing. + // Text is counted so it can contain NULs. + // Looks for \\d where d is between 1 and 9 and replaces these with the strings + // matched in the last search operation which were surrounded by \( and \). + // Returns the length of the replacement text including any change + // caused by processing the \\d patterns. + int ReplaceTargetRE(const wxString& text); + + // Search for a counted string in the target and set the target to the found + // range. Text is counted so it can contain NULs. + // Returns length of range or -1 for failure in which case target is not moved. + int SearchInTarget(const wxString& text); + + // Set the search flags used by SearchInTarget. + void SetSearchFlags(int flags); + + // Get the search flags used by SearchInTarget. + int GetSearchFlags() const; + + // Show a call tip containing a definition near position pos. + void CallTipShow(int pos, const wxString& definition); + + // Remove the call tip from the screen. + void CallTipCancel(); + + // Is there an active call tip? + bool CallTipActive(); + + // Retrieve the position where the caret was before displaying the call tip. + int CallTipPosAtStart(); + + // Highlight a segment of the definition. + void CallTipSetHighlight(int start, int end); + + // Set the background colour for the call tip. + void CallTipSetBackground(const wxColour& back); + + // Set the foreground colour for the call tip. + void CallTipSetForeground(const wxColour& fore); + + // Set the foreground colour for the highlighted part of the call tip. + void CallTipSetForegroundHighlight(const wxColour& fore); + + // Enable use of STYLE_CALLTIP and set call tip tab size in pixels. + void CallTipUseStyle(int tabSize); + + // Set position of calltip, above or below text. + void CallTipSetPosition(bool above); + + // Find the display line of a document line taking hidden lines into account. + int VisibleFromDocLine(int line); + + // Find the document line of a display line taking hidden lines into account. + int DocLineFromVisible(int lineDisplay); + + // The number of display lines needed to wrap a document line + int WrapCount(int line); + + // Set the fold level of a line. + // This encodes an integer level along with flags indicating whether the + // line is a header and whether it is effectively white space. + void SetFoldLevel(int line, int level); + + // Retrieve the fold level of a line. + int GetFoldLevel(int line) const; + + // Find the last child line of a header line. + int GetLastChild(int line, int level) const; + + // Find the parent line of a child line. + int GetFoldParent(int line) const; + + // Make a range of lines visible. + void ShowLines(int lineStart, int lineEnd); + + // Make a range of lines invisible. + void HideLines(int lineStart, int lineEnd); + + // Is a line visible? + bool GetLineVisible(int line) const; + + // Are all lines visible? + bool GetAllLinesVisible() const; + + // Show the children of a header line. + void SetFoldExpanded(int line, bool expanded); + + // Is a header line expanded? + bool GetFoldExpanded(int line) const; + + // Switch a header line between expanded and contracted. + void ToggleFold(int line); + + // Ensure a particular line is visible by expanding any header line hiding it. + void EnsureVisible(int line); + + // Set some style options for folding. + void SetFoldFlags(int flags); + + // Ensure a particular line is visible by expanding any header line hiding it. + // Use the currently set visibility policy to determine which range to display. + void EnsureVisibleEnforcePolicy(int line); + + // Sets whether a tab pressed when caret is within indentation indents. + void SetTabIndents(bool tabIndents); + + // Does a tab pressed when caret is within indentation indent? + bool GetTabIndents() const; + + // Sets whether a backspace pressed when caret is within indentation unindents. + void SetBackSpaceUnIndents(bool bsUnIndents); + + // Does a backspace pressed when caret is within indentation unindent? + bool GetBackSpaceUnIndents() const; + + // Sets the time the mouse must sit still to generate a mouse dwell event. + void SetMouseDwellTime(int periodMilliseconds); + + // Retrieve the time the mouse must sit still to generate a mouse dwell event. + int GetMouseDwellTime() const; + + // Get position of start of word. + int WordStartPosition(int pos, bool onlyWordCharacters); + + // Get position of end of word. + int WordEndPosition(int pos, bool onlyWordCharacters); + + // Sets whether text is word wrapped. + void SetWrapMode(int mode); + + // Retrieve whether text is word wrapped. + int GetWrapMode() const; + + // Set the display mode of visual flags for wrapped lines. + void SetWrapVisualFlags(int wrapVisualFlags); + + // Retrive the display mode of visual flags for wrapped lines. + int GetWrapVisualFlags() const; + + // Set the location of visual flags for wrapped lines. + void SetWrapVisualFlagsLocation(int wrapVisualFlagsLocation); + + // Retrive the location of visual flags for wrapped lines. + int GetWrapVisualFlagsLocation() const; + + // Set the start indent for wrapped lines. + void SetWrapStartIndent(int indent); + + // Retrive the start indent for wrapped lines. + int GetWrapStartIndent() const; + + // Sets how wrapped sublines are placed. Default is fixed. + void SetWrapIndentMode(int mode); + + // Retrieve how wrapped sublines are placed. Default is fixed. + int GetWrapIndentMode() const; + + // Sets the degree of caching of layout information. + void SetLayoutCache(int mode); + + // Retrieve the degree of caching of layout information. + int GetLayoutCache() const; + + // Sets the document width assumed for scrolling. + void SetScrollWidth(int pixelWidth); + + // Retrieve the document width assumed for scrolling. + int GetScrollWidth() const; + + // Sets whether the maximum width line displayed is used to set scroll width. + void SetScrollWidthTracking(bool tracking); + + // Retrieve whether the scroll width tracks wide lines. + bool GetScrollWidthTracking() const; + + // Measure the pixel width of some text in a particular style. + // NUL terminated text argument. + // Does not handle tab or control characters. + int TextWidth(int style, const wxString& text); + + // Sets the scroll range so that maximum scroll position has + // the last line at the bottom of the view (default). + // Setting this to false allows scrolling one page below the last line. + void SetEndAtLastLine(bool endAtLastLine); + + // Retrieve whether the maximum scroll position has the last + // line at the bottom of the view. + bool GetEndAtLastLine() const; + + // Retrieve the height of a particular line of text in pixels. + int TextHeight(int line); + + // Show or hide the vertical scroll bar. + void SetUseVerticalScrollBar(bool show); + + // Is the vertical scroll bar visible? + bool GetUseVerticalScrollBar() const; + + // Append a string to the end of the document without changing the selection. + void AppendText(const wxString& text); + + // Is drawing done in two phases with backgrounds drawn before foregrounds? + bool GetTwoPhaseDraw() const; + + // In twoPhaseDraw mode, drawing is performed in two phases, first the background + // and then the foreground. This avoids chopping off characters that overlap the next run. + void SetTwoPhaseDraw(bool twoPhase); + + // Scroll so that a display line is at the top of the display. + void SetFirstVisibleLine(int lineDisplay); + + // Change the effect of pasting when there are multiple selections. + void SetMultiPaste(int multiPaste); + + // Retrieve the effect of pasting when there are multiple selections. + int GetMultiPaste() const; + + // Retrieve the value of a tag from a regular expression search. + wxString GetTag(int tagNumber) const; + + // Make the target range start and end be the same as the selection range start and end. + void TargetFromSelection(); + + // Join the lines in the target. + void LinesJoin(); + + // Split the lines in the target into lines that are less wide than pixelWidth + // where possible. + void LinesSplit(int pixelWidth); + + // Set the colours used as a chequerboard pattern in the fold margin + void SetFoldMarginColour(bool useSetting, const wxColour& back); + void SetFoldMarginHiColour(bool useSetting, const wxColour& fore); + + // Move caret down one line. + void LineDown(); + + // Move caret down one line extending selection to new caret position. + void LineDownExtend(); + + // Move caret up one line. + void LineUp(); + + // Move caret up one line extending selection to new caret position. + void LineUpExtend(); + + // Move caret left one character. + void CharLeft(); + + // Move caret left one character extending selection to new caret position. + void CharLeftExtend(); + + // Move caret right one character. + void CharRight(); + + // Move caret right one character extending selection to new caret position. + void CharRightExtend(); + + // Move caret left one word. + void WordLeft(); + + // Move caret left one word extending selection to new caret position. + void WordLeftExtend(); + + // Move caret right one word. + void WordRight(); + + // Move caret right one word extending selection to new caret position. + void WordRightExtend(); + + // Move caret to first position on line. + void Home(); + + // Move caret to first position on line extending selection to new caret position. + void HomeExtend(); + + // Move caret to last position on line. + void LineEnd(); + + // Move caret to last position on line extending selection to new caret position. + void LineEndExtend(); + + // Move caret to first position in document. + void DocumentStart(); + + // Move caret to first position in document extending selection to new caret position. + void DocumentStartExtend(); + + // Move caret to last position in document. + void DocumentEnd(); + + // Move caret to last position in document extending selection to new caret position. + void DocumentEndExtend(); + + // Move caret one page up. + void PageUp(); + + // Move caret one page up extending selection to new caret position. + void PageUpExtend(); + + // Move caret one page down. + void PageDown(); + + // Move caret one page down extending selection to new caret position. + void PageDownExtend(); + + // Switch from insert to overtype mode or the reverse. + void EditToggleOvertype(); + + // Cancel any modes such as call tip or auto-completion list display. + void Cancel(); + + // Delete the selection or if no selection, the character before the caret. + void DeleteBack(); + + // If selection is empty or all on one line replace the selection with a tab character. + // If more than one line selected, indent the lines. + void Tab(); + + // Dedent the selected lines. + void BackTab(); + + // Insert a new line, may use a CRLF, CR or LF depending on EOL mode. + void NewLine(); + + // Insert a Form Feed character. + void FormFeed(); + + // Move caret to before first visible character on line. + // If already there move to first character on line. + void VCHome(); + + // Like VCHome but extending selection to new caret position. + void VCHomeExtend(); + + // Magnify the displayed text by increasing the sizes by 1 point. + void ZoomIn(); + + // Make the displayed text smaller by decreasing the sizes by 1 point. + void ZoomOut(); + + // Delete the word to the left of the caret. + void DelWordLeft(); + + // Delete the word to the right of the caret. + void DelWordRight(); + + // Delete the word to the right of the caret, but not the trailing non-word characters. + void DelWordRightEnd(); + + // Cut the line containing the caret. + void LineCut(); + + // Delete the line containing the caret. + void LineDelete(); + + // Switch the current line with the previous. + void LineTranspose(); + + // Duplicate the current line. + void LineDuplicate(); + + // Transform the selection to lower case. + void LowerCase(); + + // Transform the selection to upper case. + void UpperCase(); + + // Scroll the document down, keeping the caret visible. + void LineScrollDown(); + + // Scroll the document up, keeping the caret visible. + void LineScrollUp(); + + // Delete the selection or if no selection, the character before the caret. + // Will not delete the character before at the start of a line. + void DeleteBackNotLine(); + + // Move caret to first position on display line. + void HomeDisplay(); + + // Move caret to first position on display line extending selection to + // new caret position. + void HomeDisplayExtend(); + + // Move caret to last position on display line. + void LineEndDisplay(); + + // Move caret to last position on display line extending selection to new + // caret position. + void LineEndDisplayExtend(); + + // These are like their namesakes Home(Extend)?, LineEnd(Extend)?, VCHome(Extend)? + // except they behave differently when word-wrap is enabled: + // They go first to the start / end of the display line, like (Home|LineEnd)Display + // The difference is that, the cursor is already at the point, it goes on to the start + // or end of the document line, as appropriate for (Home|LineEnd|VCHome)(Extend)?. + void HomeWrap(); + void HomeWrapExtend(); + void LineEndWrap(); + void LineEndWrapExtend(); + void VCHomeWrap(); + void VCHomeWrapExtend(); + + // Copy the line containing the caret. + void LineCopy(); + + // Move the caret inside current view if it's not there already. + void MoveCaretInsideView(); + + // How many characters are on a line, including end of line characters? + int LineLength(int line) const; + + // Highlight the characters at two positions. + void BraceHighlight(int pos1, int pos2); + + // Use specified indicator to highlight matching braces instead of changing their style. + void BraceHighlightIndicator(bool useBraceHighlightIndicator, int indicator); + + // Highlight the character at a position indicating there is no matching brace. + void BraceBadLight(int pos); + + // Use specified indicator to highlight non matching brace instead of changing its style. + void BraceBadLightIndicator(bool useBraceBadLightIndicator, int indicator); + + // Find the position of a matching brace or INVALID_POSITION if no match. + int BraceMatch(int pos); + + // Are the end of line characters visible? + bool GetViewEOL() const; + + // Make the end of line characters visible or invisible. + void SetViewEOL(bool visible); + + // Retrieve a pointer to the document object. + void* GetDocPointer(); + + // Change the document object used. + void SetDocPointer(void* docPointer); + + // Set which document modification events are sent to the container. + void SetModEventMask(int mask); + + // Retrieve the column number which text should be kept within. + int GetEdgeColumn() const; + + // Set the column number of the edge. + // If text goes past the edge then it is highlighted. + void SetEdgeColumn(int column); + + // Retrieve the edge highlight mode. + int GetEdgeMode() const; + + // The edge may be displayed by a line (EDGE_LINE) or by highlighting text that + // goes beyond it (EDGE_BACKGROUND) or not displayed at all (EDGE_NONE). + void SetEdgeMode(int mode); + + // Retrieve the colour used in edge indication. + wxColour GetEdgeColour() const; + + // Change the colour used in edge indication. + void SetEdgeColour(const wxColour& edgeColour); + + // Sets the current caret position to be the search anchor. + void SearchAnchor(); + + // Find some text starting at the search anchor. + // Does not ensure the selection is visible. + int SearchNext(int flags, const wxString& text); + + // Find some text starting at the search anchor and moving backwards. + // Does not ensure the selection is visible. + int SearchPrev(int flags, const wxString& text); + + // Retrieves the number of lines completely visible. + int LinesOnScreen() const; + + // Set whether a pop up menu is displayed automatically when the user presses + // the wrong mouse button. + void UsePopUp(bool allowPopUp); + + // Is the selection rectangular? The alternative is the more common stream selection. + bool SelectionIsRectangle() const; + + // Set the zoom level. This number of points is added to the size of all fonts. + // It may be positive to magnify or negative to reduce. + void SetZoom(int zoom); + + // Retrieve the zoom level. + int GetZoom() const; + + // Create a new document object. + // Starts with reference count of 1 and not selected into editor. + void* CreateDocument(); + + // Extend life of document. + void AddRefDocument(void* docPointer); + + // Release a reference to the document, deleting document if it fades to black. + void ReleaseDocument(void* docPointer); + + // Get which document modification events are sent to the container. + int GetModEventMask() const; + + // Change internal focus flag. + void SetSTCFocus(bool focus); + + // Get internal focus flag. + bool GetSTCFocus() const; + + // Change error status - 0 = OK. + void SetStatus(int statusCode); + + // Get error status. + int GetStatus() const; + + // Set whether the mouse is captured when its button is pressed. + void SetMouseDownCaptures(bool captures); + + // Get whether mouse gets captured. + bool GetMouseDownCaptures() const; + + // Sets the cursor to one of the SC_CURSOR* values. + void SetSTCCursor(int cursorType); + + // Get cursor type. + int GetSTCCursor() const; + + // Change the way control characters are displayed: + // If symbol is < 32, keep the drawn way, else, use the given character. + void SetControlCharSymbol(int symbol); + + // Get the way control characters are displayed. + int GetControlCharSymbol() const; + + // Move to the previous change in capitalisation. + void WordPartLeft(); + + // Move to the previous change in capitalisation extending selection + // to new caret position. + void WordPartLeftExtend(); + + // Move to the change next in capitalisation. + void WordPartRight(); + + // Move to the next change in capitalisation extending selection + // to new caret position. + void WordPartRightExtend(); + + // Set the way the display area is determined when a particular line + // is to be moved to by Find, FindNext, GotoLine, etc. + void SetVisiblePolicy(int visiblePolicy, int visibleSlop); + + // Delete back from the current position to the start of the line. + void DelLineLeft(); + + // Delete forwards from the current position to the end of the line. + void DelLineRight(); + + // Get and Set the xOffset (ie, horizontal scroll position). + void SetXOffset(int newOffset); + int GetXOffset() const; + + // Set the last x chosen value to be the caret x position. + void ChooseCaretX(); + + // Set the way the caret is kept visible when going sideways. + // The exclusion zone is given in pixels. + void SetXCaretPolicy(int caretPolicy, int caretSlop); + + // Set the way the line the caret is on is kept visible. + // The exclusion zone is given in lines. + void SetYCaretPolicy(int caretPolicy, int caretSlop); + + // Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE). + void SetPrintWrapMode(int mode); + + // Is printing line wrapped? + int GetPrintWrapMode() const; + + // Set a fore colour for active hotspots. + void SetHotspotActiveForeground(bool useSetting, const wxColour& fore); + + // Get the fore colour for active hotspots. + wxColour GetHotspotActiveForeground() const; + + // Set a back colour for active hotspots. + void SetHotspotActiveBackground(bool useSetting, const wxColour& back); + + // Get the back colour for active hotspots. + wxColour GetHotspotActiveBackground() const; + + // Enable / Disable underlining active hotspots. + void SetHotspotActiveUnderline(bool underline); + + // Get whether underlining for active hotspots. + bool GetHotspotActiveUnderline() const; + + // Limit hotspots to single line so hotspots on two lines don't merge. + void SetHotspotSingleLine(bool singleLine); + + // Get the HotspotSingleLine property + bool GetHotspotSingleLine() const; + + // Move caret between paragraphs (delimited by empty lines). + void ParaDown(); + void ParaDownExtend(); + void ParaUp(); + void ParaUpExtend(); + + // Given a valid document position, return the previous position taking code + // page into account. Returns 0 if passed 0. + int PositionBefore(int pos); + + // Given a valid document position, return the next position taking code + // page into account. Maximum value returned is the last position in the document. + int PositionAfter(int pos); + + // Copy a range of text to the clipboard. Positions are clipped into the document. + void CopyRange(int start, int end); + + // Copy argument text to the clipboard. + void CopyText(int length, const wxString& text); + + // Set the selection mode to stream (SC_SEL_STREAM) or rectangular (SC_SEL_RECTANGLE/SC_SEL_THIN) or + // by lines (SC_SEL_LINES). + void SetSelectionMode(int mode); + + // Get the mode of the current selection. + int GetSelectionMode() const; + + // Retrieve the position of the start of the selection at the given line (INVALID_POSITION if no selection on this line). + int GetLineSelStartPosition(int line); + + // Retrieve the position of the end of the selection at the given line (INVALID_POSITION if no selection on this line). + int GetLineSelEndPosition(int line); + + // Move caret down one line, extending rectangular selection to new caret position. + void LineDownRectExtend(); + + // Move caret up one line, extending rectangular selection to new caret position. + void LineUpRectExtend(); + + // Move caret left one character, extending rectangular selection to new caret position. + void CharLeftRectExtend(); + + // Move caret right one character, extending rectangular selection to new caret position. + void CharRightRectExtend(); + + // Move caret to first position on line, extending rectangular selection to new caret position. + void HomeRectExtend(); + + // Move caret to before first visible character on line. + // If already there move to first character on line. + // In either case, extend rectangular selection to new caret position. + void VCHomeRectExtend(); + + // Move caret to last position on line, extending rectangular selection to new caret position. + void LineEndRectExtend(); + + // Move caret one page up, extending rectangular selection to new caret position. + void PageUpRectExtend(); + + // Move caret one page down, extending rectangular selection to new caret position. + void PageDownRectExtend(); + + // Move caret to top of page, or one page up if already at top of page. + void StutteredPageUp(); + + // Move caret to top of page, or one page up if already at top of page, extending selection to new caret position. + void StutteredPageUpExtend(); + + // Move caret to bottom of page, or one page down if already at bottom of page. + void StutteredPageDown(); + + // Move caret to bottom of page, or one page down if already at bottom of page, extending selection to new caret position. + void StutteredPageDownExtend(); + + // Move caret left one word, position cursor at end of word. + void WordLeftEnd(); + + // Move caret left one word, position cursor at end of word, extending selection to new caret position. + void WordLeftEndExtend(); + + // Move caret right one word, position cursor at end of word. + void WordRightEnd(); + + // Move caret right one word, position cursor at end of word, extending selection to new caret position. + void WordRightEndExtend(); + + // Set the set of characters making up whitespace for when moving or selecting by word. + // Should be called after SetWordChars. + void SetWhitespaceChars(const wxString& characters); + + // Get the set of characters making up whitespace for when moving or selecting by word. + wxString GetWhitespaceChars() const; + + // Set the set of characters making up punctuation characters + // Should be called after SetWordChars. + void SetPunctuationChars(const wxString& characters); + + // Get the set of characters making up punctuation characters + wxString GetPunctuationChars() const; + + // Reset the set of characters for whitespace and word characters to the defaults. + void SetCharsDefault(); + + // Get currently selected item position in the auto-completion list + int AutoCompGetCurrent() const; + + // Set auto-completion case insensitive behaviour to either prefer case-sensitive matches or have no preference. + void AutoCompSetCaseInsensitiveBehaviour(int behaviour); + + // Get auto-completion case insensitive behaviour. + int AutoCompGetCaseInsensitiveBehaviour() const; + + // Enlarge the document to a particular size of text bytes. + void Allocate(int bytes); + + // Find the position of a column on a line taking into account tabs and + // multi-byte characters. If beyond end of line, return line end position. + int FindColumn(int line, int column); + + // Can the caret preferred x position only be changed by explicit movement commands? + int GetCaretSticky() const; + + // Stop the caret preferred x position changing when the user types. + void SetCaretSticky(int useCaretStickyBehaviour); + + // Switch between sticky and non-sticky: meant to be bound to a key. + void ToggleCaretSticky(); + + // Enable/Disable convert-on-paste for line endings + void SetPasteConvertEndings(bool convert); + + // Get convert-on-paste setting + bool GetPasteConvertEndings() const; + + // Duplicate the selection. If selection empty duplicate the line containing the caret. + void SelectionDuplicate(); + + // Set background alpha of the caret line. + void SetCaretLineBackAlpha(int alpha); + + // Get the background alpha of the caret line. + int GetCaretLineBackAlpha() const; + + // Set the style of the caret to be drawn. + void SetCaretStyle(int caretStyle); + + // Returns the current style of the caret. + int GetCaretStyle() const; + + // Set the indicator used for IndicatorFillRange and IndicatorClearRange + void SetIndicatorCurrent(int indicator); + + // Get the current indicator + int GetIndicatorCurrent() const; + + // Set the value used for IndicatorFillRange + void SetIndicatorValue(int value); + + // Get the current indicator value + int GetIndicatorValue() const; + + // Turn a indicator on over a range. + void IndicatorFillRange(int position, int fillLength); + + // Turn a indicator off over a range. + void IndicatorClearRange(int position, int clearLength); + + // Are any indicators present at position? + int IndicatorAllOnFor(int position); + + // What value does a particular indicator have at at a position? + int IndicatorValueAt(int indicator, int position); + + // Where does a particular indicator start? + int IndicatorStart(int indicator, int position); + + // Where does a particular indicator end? + int IndicatorEnd(int indicator, int position); + + // Set number of entries in position cache + void SetPositionCacheSize(int size); + + // How many entries are allocated to the position cache? + int GetPositionCacheSize() const; + + // Copy the selection, if selection empty copy the line with the caret + void CopyAllowLine(); + + // Compact the document buffer and return a read-only pointer to the + // characters in the document. + const char* GetCharacterPointer() const; + + // Return a read-only pointer to a range of characters in the document. + // May move the gap so that the range is contiguous, but will only move up + // to rangeLength bytes. + const char* GetRangePointer(int position, int rangeLength) const; + + // Return a position which, to avoid performance costs, should not be within + // the range of a call to GetRangePointer. + int GetGapPosition() const; + + // Always interpret keyboard input as Unicode + void SetKeysUnicode(bool keysUnicode); + + // Are keys always interpreted as Unicode? + bool GetKeysUnicode() const; + + // Set the alpha fill colour of the given indicator. + void IndicatorSetAlpha(int indicator, int alpha); + + // Get the alpha fill colour of the given indicator. + int IndicatorGetAlpha(int indicator) const; + + // Set the alpha outline colour of the given indicator. + void IndicatorSetOutlineAlpha(int indicator, int alpha); + + // Get the alpha outline colour of the given indicator. + int IndicatorGetOutlineAlpha(int indicator) const; + + // Set extra ascent for each line + void SetExtraAscent(int extraAscent); + + // Get extra ascent for each line + int GetExtraAscent() const; + + // Set extra descent for each line + void SetExtraDescent(int extraDescent); + + // Get extra descent for each line + int GetExtraDescent() const; + + // Which symbol was defined for markerNumber with MarkerDefine + int GetMarkerSymbolDefined(int markerNumber); + + // Set the text in the text margin for a line + void MarginSetText(int line, const wxString& text); + + // Get the text in the text margin for a line + wxString MarginGetText(int line) const; + + // Set the style number for the text margin for a line + void MarginSetStyle(int line, int style); + + // Get the style number for the text margin for a line + int MarginGetStyle(int line) const; + + // Set the style in the text margin for a line + void MarginSetStyles(int line, const wxString& styles); + + // Get the styles in the text margin for a line + wxString MarginGetStyles(int line) const; + + // Clear the margin text on all lines + void MarginTextClearAll(); + + // Get the start of the range of style numbers used for margin text + void MarginSetStyleOffset(int style); + + // Get the start of the range of style numbers used for margin text + int MarginGetStyleOffset() const; + + // Set the margin options. + void SetMarginOptions(int marginOptions); + + // Get the margin options. + int GetMarginOptions() const; + + // Set the annotation text for a line + void AnnotationSetText(int line, const wxString& text); + + // Get the annotation text for a line + wxString AnnotationGetText(int line) const; + + // Set the style number for the annotations for a line + void AnnotationSetStyle(int line, int style); + + // Get the style number for the annotations for a line + int AnnotationGetStyle(int line) const; + + // Set the annotation styles for a line + void AnnotationSetStyles(int line, const wxString& styles); + + // Get the annotation styles for a line + wxString AnnotationGetStyles(int line) const; + + // Get the number of annotation lines for a line + int AnnotationGetLines(int line) const; + + // Clear the annotations from all lines + void AnnotationClearAll(); + + // Set the visibility for the annotations for a view + void AnnotationSetVisible(int visible); + + // Get the visibility for the annotations for a view + int AnnotationGetVisible() const; + + // Get the start of the range of style numbers used for annotations + void AnnotationSetStyleOffset(int style); + + // Get the start of the range of style numbers used for annotations + int AnnotationGetStyleOffset() const; + + // Add a container action to the undo stack + void AddUndoAction(int token, int flags); + + // Find the position of a character from a point within the window. + int CharPositionFromPoint(int x, int y); + + // Find the position of a character from a point within the window. + // Return INVALID_POSITION if not close to text. + int CharPositionFromPointClose(int x, int y); + + // Set whether multiple selections can be made + void SetMultipleSelection(bool multipleSelection); + + // Whether multiple selections can be made + bool GetMultipleSelection() const; + + // Set whether typing can be performed into multiple selections + void SetAdditionalSelectionTyping(bool additionalSelectionTyping); + + // Whether typing can be performed into multiple selections + bool GetAdditionalSelectionTyping() const; + + // Set whether additional carets will blink + void SetAdditionalCaretsBlink(bool additionalCaretsBlink); + + // Whether additional carets will blink + bool GetAdditionalCaretsBlink() const; + + // Set whether additional carets are visible + void SetAdditionalCaretsVisible(bool additionalCaretsBlink); + + // Whether additional carets are visible + bool GetAdditionalCaretsVisible() const; + + // How many selections are there? + int GetSelections() const; + + // Clear selections to a single empty stream selection + void ClearSelections(); + + // Add a selection + int AddSelection(int caret, int anchor); + + // Set the main selection + void SetMainSelection(int selection); + + // Which selection is the main selection + int GetMainSelection() const; + void SetSelectionNCaret(int selection, int pos); + int GetSelectionNCaret(int selection) const; + void SetSelectionNAnchor(int selection, int posAnchor); + int GetSelectionNAnchor(int selection) const; + void SetSelectionNCaretVirtualSpace(int selection, int space); + int GetSelectionNCaretVirtualSpace(int selection) const; + void SetSelectionNAnchorVirtualSpace(int selection, int space); + int GetSelectionNAnchorVirtualSpace(int selection) const; + + // Sets the position that starts the selection - this becomes the anchor. + void SetSelectionNStart(int selection, int pos); + + // Returns the position at the start of the selection. + int GetSelectionNStart(int selection) const; + + // Sets the position that ends the selection - this becomes the currentPosition. + void SetSelectionNEnd(int selection, int pos); + + // Returns the position at the end of the selection. + int GetSelectionNEnd(int selection) const; + void SetRectangularSelectionCaret(int pos); + int GetRectangularSelectionCaret() const; + void SetRectangularSelectionAnchor(int posAnchor); + int GetRectangularSelectionAnchor() const; + void SetRectangularSelectionCaretVirtualSpace(int space); + int GetRectangularSelectionCaretVirtualSpace() const; + void SetRectangularSelectionAnchorVirtualSpace(int space); + int GetRectangularSelectionAnchorVirtualSpace() const; + void SetVirtualSpaceOptions(int virtualSpaceOptions); + int GetVirtualSpaceOptions() const; + + // On GTK+, allow selecting the modifier key to use for mouse-based + // rectangular selection. Often the window manager requires Alt+Mouse Drag + // for moving windows. + // Valid values are SCMOD_CTRL(default), SCMOD_ALT, or SCMOD_SUPER. + void SetRectangularSelectionModifier(int modifier); + + // Get the modifier key used for rectangular selection. + int GetRectangularSelectionModifier() const; + + // Set the foreground colour of additional selections. + // Must have previously called SetSelFore with non-zero first argument for this to have an effect. + void SetAdditionalSelForeground(const wxColour& fore); + + // Set the background colour of additional selections. + // Must have previously called SetSelBack with non-zero first argument for this to have an effect. + void SetAdditionalSelBackground(const wxColour& back); + + // Set the alpha of the selection. + void SetAdditionalSelAlpha(int alpha); + + // Get the alpha of the selection. + int GetAdditionalSelAlpha() const; + + // Set the foreground colour of additional carets. + void SetAdditionalCaretForeground(const wxColour& fore); + + // Get the foreground colour of additional carets. + wxColour GetAdditionalCaretForeground() const; + + // Set the main selection to the next selection. + void RotateSelection(); + + // Swap that caret and anchor of the main selection. + void SwapMainAnchorCaret(); + + // Indicate that the internal state of a lexer has changed over a range and therefore + // there may be a need to redraw. + int ChangeLexerState(int start, int end); + + // Find the next line at or after lineStart that is a contracted fold header line. + // Return -1 when no more lines. + int ContractedFoldNext(int lineStart); + + // Centre current line in window. + void VerticalCentreCaret(); + + // Move the selected lines up one line, shifting the line above after the selection + void MoveSelectedLinesUp(); + + // Move the selected lines down one line, shifting the line below before the selection + void MoveSelectedLinesDown(); + + // Set the identifier reported as idFrom in notification messages. + void SetIdentifier(int identifier); + + // Get the identifier. + int GetIdentifier() const; + + // Set the width for future RGBA image data. + void RGBAImageSetWidth(int width); + + // Set the height for future RGBA image data. + void RGBAImageSetHeight(int height); + + // Define a marker from RGBA data. + // It has the width and height from RGBAImageSetWidth/Height + void MarkerDefineRGBAImage(int markerNumber, const unsigned char* pixels); + + // Register an RGBA image for use in autocompletion lists. + // It has the width and height from RGBAImageSetWidth/Height + void RegisterRGBAImage(int type, const unsigned char* pixels); + + // Scroll to start of document. + void ScrollToStart(); + + // Scroll to end of document. + void ScrollToEnd(); + + // Set the technology used. + void SetTechnology(int technology); + + // Get the tech. + int GetTechnology() const; + + // Create an ILoader*. + void* CreateLoader(int bytes) const; + + // Start notifying the container of all key presses and commands. + void StartRecord(); + + // Stop notifying the container of all key presses and commands. + void StopRecord(); + + // Set the lexing language of the document. + void SetLexer(int lexer); + + // Retrieve the lexing language of the document. + int GetLexer() const; + + // Colourise a segment of the document using the current lexing language. + void Colourise(int start, int end); + + // Set up a value that may be used by a lexer for some optional feature. + void SetProperty(const wxString& key, const wxString& value); + + // Set up the key words used by the lexer. + void SetKeyWords(int keywordSet, const wxString& keyWords); + + // Set the lexing language of the document based on string name. + void SetLexerLanguage(const wxString& language); + + // Retrieve a 'property' value previously set with SetProperty. + wxString GetProperty(const wxString& key); + + // Retrieve a 'property' value previously set with SetProperty, + // with '$()' variable replacement on returned buffer. + wxString GetPropertyExpanded(const wxString& key); + + // Retrieve a 'property' value previously set with SetProperty, + // interpreted as an int AFTER any '$()' variable replacement. + int GetPropertyInt(const wxString& key) const; + + // Retrieve the number of bits the current lexer needs for styling. + int GetStyleBitsNeeded() const; + + // For private communication between an application and a known lexer. + void* PrivateLexerCall(int operation, void* pointer); + + // Retrieve a '\n' separated list of properties understood by the current lexer. + wxString PropertyNames() const; + + // Retrieve the type of a property. + int PropertyType(const wxString& name); + + // Describe a property. + wxString DescribeProperty(const wxString& name) const; + + // Retrieve a '\n' separated list of descriptions of the keyword sets understood by the current lexer. + wxString DescribeKeyWordSets() const; + + //}}} + //---------------------------------------------------------------------- + + // Manually declared methods + + // Returns the line number of the line with the caret. + int GetCurrentLine(); + + // Extract style settings from a spec-string which is composed of one or + // more of the following comma separated elements: + // + // bold turns on bold + // italic turns on italics + // fore:[name or #RRGGBB] sets the foreground colour + // back:[name or #RRGGBB] sets the background colour + // face:[facename] sets the font face name to use + // size:[num] sets the font size in points + // eol turns on eol filling + // underline turns on underlining + // + void StyleSetSpec(int styleNum, const wxString& spec); + + + // Get the font of a style. + wxFont StyleGetFont(int style); + + + // Set style size, face, bold, italic, and underline attributes from + // a wxFont's attributes. + void StyleSetFont(int styleNum, wxFont& font); + + + + // Set all font style attributes at once. + void StyleSetFontAttr(int styleNum, int size, + const wxString& faceName, + bool bold, bool italic, + bool underline, + wxFontEncoding encoding=wxFONTENCODING_DEFAULT); + + + // Set the character set of the font in a style. Converts the Scintilla + // character set values to a wxFontEncoding. + void StyleSetCharacterSet(int style, int characterSet); + + // Set the font encoding to be used by a style. + void StyleSetFontEncoding(int style, wxFontEncoding encoding); + + + // Perform one of the operations defined by the wxSTC_CMD_* constants. + void CmdKeyExecute(int cmd); + + + // Set the left and right margin in the edit area, measured in pixels. + void SetMargins(int left, int right); + + + // Retrieve the point in the window where a position is displayed. + wxPoint PointFromPosition(int pos); + + + // Scroll enough to make the given line visible + void ScrollToLine(int line); + + + // Scroll enough to make the given column visible + void ScrollToColumn(int column); + + + // Send a message to Scintilla + // + // NB: this method is not really const as it can modify the control but it + // has to be declared as such as it's called from both const and + // non-const methods and we can't distinguish between the two + wxIntPtr SendMsg(int msg, wxUIntPtr wp=0, wxIntPtr lp=0) const; + + + // Set the vertical scrollbar to use instead of the ont that's built-in. + void SetVScrollBar(wxScrollBar* bar); + + + // Set the horizontal scrollbar to use instead of the ont that's built-in. + void SetHScrollBar(wxScrollBar* bar); + + // Can be used to prevent the EVT_CHAR handler from adding the char + bool GetLastKeydownProcessed() { return m_lastKeyDownConsumed; } + void SetLastKeydownProcessed(bool val) { m_lastKeyDownConsumed = val; } + + // if we derive from wxTextAreaBase it already provides these methods +#if !wxUSE_TEXTCTRL + // Write the contents of the editor to filename + bool SaveFile(const wxString& filename); + + // Load the contents of filename into the editor + bool LoadFile(const wxString& filename); +#endif // !wxUSE_TEXTCTRL + +#ifdef STC_USE_DND + // Allow for simulating a DnD DragOver + wxDragResult DoDragOver(wxCoord x, wxCoord y, wxDragResult def); + + // Allow for simulating a DnD DropText + bool DoDropText(long x, long y, const wxString& data); +#endif + + // Specify whether anti-aliased fonts should be used. Will have no effect + // on some platforms, but on some (wxMac for example) can greatly improve + // performance. + void SetUseAntiAliasing(bool useAA); + + // Returns the current UseAntiAliasing setting. + bool GetUseAntiAliasing(); + + // Clear annotations from the given line. + void AnnotationClearLine(int line); + + + + // The following methods are nearly equivalent to their similarly named + // cousins above. The difference is that these methods bypass wxString + // and always use a char* even if used in a unicode build of wxWidgets. + // In that case the character data will be utf-8 encoded since that is + // what is used internally by Scintilla in unicode builds. + + // Add text to the document at current position. + void AddTextRaw(const char* text, int length=-1); + + // Insert string at a position. + void InsertTextRaw(int pos, const char* text); + + // Retrieve the text of the line containing the caret. + // Returns the index of the caret on the line. +#ifdef SWIG + wxCharBuffer GetCurLineRaw(int* OUTPUT); +#else + wxCharBuffer GetCurLineRaw(int* linePos=NULL); +#endif + + // Retrieve the contents of a line. + wxCharBuffer GetLineRaw(int line); + + // Retrieve the selected text. + wxCharBuffer GetSelectedTextRaw(); + + // Retrieve a range of text. + wxCharBuffer GetTextRangeRaw(int startPos, int endPos); + + // Replace the contents of the document with the argument text. + void SetTextRaw(const char* text); + + // Retrieve all the text in the document. + wxCharBuffer GetTextRaw(); + + // Append a string to the end of the document without changing the selection. + void AppendTextRaw(const char* text, int length=-1); + +#ifdef SWIG + %pythoncode "_stc_utf8_methods.py" +#endif + + + // implement wxTextEntryBase pure virtual methods + // ---------------------------------------------- + + virtual void WriteText(const wxString& text) + { + ReplaceSelection(text); + } + + virtual void Remove(long from, long to) + { + Replace(from, to, ""); + } + virtual void Replace(long from, long to, const wxString& text) + { + SetTargetStart((int)from); + SetTargetEnd((int)to); + ReplaceTarget(text); + } + + /* + These functions are already declared in the generated section. + + virtual void Copy(); + virtual void Cut(); + virtual void Paste(); + + virtual void Undo(); + virtual void Redo(); + + virtual bool CanUndo() const; + virtual bool CanRedo() const; + + */ + + virtual void SetInsertionPoint(long pos) + { + SetCurrentPos(int(pos == -1 ? GetLastPosition() : pos)); + } + virtual long GetInsertionPoint() const { return GetCurrentPos(); } + virtual long GetLastPosition() const { return GetTextLength(); } + + virtual void SetSelection(long from, long to) + { + if ( from == -1 && to == -1 ) + { + SelectAll(); + } + else + { + SetSelectionStart((int)from); + SetSelectionEnd((int)to); + } + } + + virtual void SelectNone() + { + ClearSelections(); + } + +#ifdef SWIG + void GetSelection(long* OUTPUT, long* OUTPUT) const; +#else + virtual void GetSelection(long *from, long *to) const + { + if ( from ) + *from = GetSelectionStart(); + if ( to ) + *to = GetSelectionEnd(); + } + + // kept for compatibility only + void GetSelection(int *from, int *to) + { + long f, t; + GetSelection(&f, &t); + if ( from ) + *from = (int)f; + if ( to ) + *to = (int)t; + } +#endif + + virtual bool IsEditable() const { return !GetReadOnly(); } + virtual void SetEditable(bool editable) { SetReadOnly(!editable); } + + // implement wxTextAreaBase pure virtual methods + // --------------------------------------------- + + virtual int GetLineLength(long lineNo) const { return static_cast<int>(GetLineText(lineNo).length()); } + virtual wxString GetLineText(long lineNo) const + { + wxString text = GetLine(static_cast<int>(lineNo)); + size_t lastNewLine = text.find_last_not_of(wxS("\r\n")); + + if ( lastNewLine != wxString::npos ) + text.erase(lastNewLine + 1); // remove trailing cr+lf + else + text.clear(); + return text; + } + virtual int GetNumberOfLines() const { return GetLineCount(); } + + virtual bool IsModified() const { return GetModify(); } + virtual void MarkDirty() { wxFAIL_MSG("not implemented"); } + virtual void DiscardEdits() { SetSavePoint(); } + + virtual bool SetStyle(long WXUNUSED(start), long WXUNUSED(end), + const wxTextAttr& WXUNUSED(style)) + { + wxFAIL_MSG("not implemented"); + + return false; + } + + virtual bool GetStyle(long WXUNUSED(position), wxTextAttr& WXUNUSED(style)) + { + wxFAIL_MSG("not implemented"); + + return false; + } + + virtual bool SetDefaultStyle(const wxTextAttr& WXUNUSED(style)) + { + wxFAIL_MSG("not implemented"); + + return false; + } + + virtual long XYToPosition(long x, long y) const + { + long pos = PositionFromLine((int)y); + pos += x; + return pos; + } + + virtual bool PositionToXY(long pos, long *x, long *y) const + { + int l = LineFromPosition((int)pos); + if ( l == -1 ) + return false; + + if ( x ) + *x = pos - PositionFromLine(l); + + if ( y ) + *y = l; + + return true; + } + + virtual void ShowPosition(long pos) { GotoPos((int)pos); } + + // FIXME-VC6: can't use wxWindow here because of "error C2603: illegal + // access declaration: 'wxWindow' is not a direct base of + // 'wxStyledTextCtrl'" with VC6 + using wxControl::HitTest; + + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const + { + const long l = PositionFromPoint(pt); + if ( l == -1 ) + return wxTE_HT_BELOW; // we don't really know where it was + + if ( pos ) + *pos = l; + + return wxTE_HT_ON_TEXT; + } + + // just unhide it + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, + wxTextCoord *col, + wxTextCoord *row) const + { + return wxTextAreaBase::HitTest(pt, col, row); + } + + static wxVersionInfo GetLibraryVersionInfo(); + +protected: + virtual void DoSetValue(const wxString& value, int flags); + virtual wxString DoGetValue() const { return GetText(); } + virtual wxWindow *GetEditableWindow() { return this; } + +#ifndef SWIG + virtual bool DoLoadFile(const wxString& file, int fileType); + virtual bool DoSaveFile(const wxString& file, int fileType); + + // Event handlers + void OnPaint(wxPaintEvent& evt); + void OnScrollWin(wxScrollWinEvent& evt); + void OnScroll(wxScrollEvent& evt); + void OnSize(wxSizeEvent& evt); + void OnMouseLeftDown(wxMouseEvent& evt); + void OnMouseMove(wxMouseEvent& evt); + void OnMouseLeftUp(wxMouseEvent& evt); + void OnMouseRightUp(wxMouseEvent& evt); + void OnMouseMiddleUp(wxMouseEvent& evt); + void OnContextMenu(wxContextMenuEvent& evt); + void OnMouseWheel(wxMouseEvent& evt); + void OnChar(wxKeyEvent& evt); + void OnKeyDown(wxKeyEvent& evt); + void OnLoseFocus(wxFocusEvent& evt); + void OnGainFocus(wxFocusEvent& evt); + void OnSysColourChanged(wxSysColourChangedEvent& evt); + void OnEraseBackground(wxEraseEvent& evt); + void OnMenu(wxCommandEvent& evt); + void OnListBox(wxCommandEvent& evt); + void OnIdle(wxIdleEvent& evt); + + virtual wxSize DoGetBestSize() const; + + // Turn notifications from Scintilla into events + void NotifyChange(); + void NotifyParent(SCNotification* scn); + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxStyledTextCtrl) + +protected: + + ScintillaWX* m_swx; + wxStopWatch m_stopWatch; + wxScrollBar* m_vScrollBar; + wxScrollBar* m_hScrollBar; + + bool m_lastKeyDownConsumed; + + friend class ScintillaWX; + friend class Platform; +#endif // !SWIG +}; + +//---------------------------------------------------------------------- + +class WXDLLIMPEXP_STC wxStyledTextEvent : public wxCommandEvent { +public: + wxStyledTextEvent(wxEventType commandType=0, int id=0); +#ifndef SWIG + wxStyledTextEvent(const wxStyledTextEvent& event); +#endif + ~wxStyledTextEvent() {} + + void SetPosition(int pos) { m_position = pos; } + void SetKey(int k) { m_key = k; } + void SetModifiers(int m) { m_modifiers = m; } + void SetModificationType(int t) { m_modificationType = t; } + void SetText(const wxString& t) { m_text = t; } + void SetLength(int len) { m_length = len; } + void SetLinesAdded(int num) { m_linesAdded = num; } + void SetLine(int val) { m_line = val; } + void SetFoldLevelNow(int val) { m_foldLevelNow = val; } + void SetFoldLevelPrev(int val) { m_foldLevelPrev = val; } + void SetMargin(int val) { m_margin = val; } + void SetMessage(int val) { m_message = val; } + void SetWParam(int val) { m_wParam = val; } + void SetLParam(int val) { m_lParam = val; } + void SetListType(int val) { m_listType = val; } + void SetX(int val) { m_x = val; } + void SetY(int val) { m_y = val; } + void SetToken(int val) { m_token = val; } + void SetAnnotationLinesAdded(int val) { m_annotationLinesAdded = val; } + void SetUpdated(int val) { m_updated = val; } +#ifdef STC_USE_DND + void SetDragText(const wxString& val) { m_dragText = val; } + void SetDragFlags(int flags) { m_dragFlags = flags; } + void SetDragResult(wxDragResult val) { m_dragResult = val; } + + // This method is kept mainly for backwards compatibility, use + // SetDragFlags() in the new code. + void SetDragAllowMove(bool allow) + { + if ( allow ) + m_dragFlags |= wxDrag_AllowMove; + else + m_dragFlags &= ~(wxDrag_AllowMove | wxDrag_DefaultMove); + } +#endif + + int GetPosition() const { return m_position; } + int GetKey() const { return m_key; } + int GetModifiers() const { return m_modifiers; } + int GetModificationType() const { return m_modificationType; } + wxString GetText() const { return m_text; } + int GetLength() const { return m_length; } + int GetLinesAdded() const { return m_linesAdded; } + int GetLine() const { return m_line; } + int GetFoldLevelNow() const { return m_foldLevelNow; } + int GetFoldLevelPrev() const { return m_foldLevelPrev; } + int GetMargin() const { return m_margin; } + int GetMessage() const { return m_message; } + int GetWParam() const { return m_wParam; } + int GetLParam() const { return m_lParam; } + int GetListType() const { return m_listType; } + int GetX() const { return m_x; } + int GetY() const { return m_y; } + int GetToken() const { return m_token; } + int GetAnnotationsLinesAdded() const { return m_annotationLinesAdded; } + int GetUpdated() const { return m_updated; } + +#ifdef STC_USE_DND + wxString GetDragText() { return m_dragText; } + int GetDragFlags() { return m_dragFlags; } + wxDragResult GetDragResult() { return m_dragResult; } + + bool GetDragAllowMove() { return (GetDragFlags() & wxDrag_AllowMove) != 0; } +#endif + + bool GetShift() const; + bool GetControl() const; + bool GetAlt() const; + + virtual wxEvent* Clone() const { return new wxStyledTextEvent(*this); } + +#ifndef SWIG +private: + DECLARE_DYNAMIC_CLASS(wxStyledTextEvent) + + int m_position; + int m_key; + int m_modifiers; + + int m_modificationType; // wxEVT_STC_MODIFIED + wxString m_text; + int m_length; + int m_linesAdded; + int m_line; + int m_foldLevelNow; + int m_foldLevelPrev; + + int m_margin; // wxEVT_STC_MARGINCLICK + + int m_message; // wxEVT_STC_MACRORECORD + int m_wParam; + int m_lParam; + + int m_listType; + int m_x; + int m_y; + + int m_token; // wxEVT_STC__MODIFIED with SC_MOD_CONTAINER + int m_annotationLinesAdded; // wxEVT_STC_MODIFIED with SC_MOD_CHANGEANNOTATION + int m_updated; // wxEVT_STC_UPDATEUI + + +#if wxUSE_DRAG_AND_DROP + wxString m_dragText; // wxEVT_STC_START_DRAG, wxEVT_STC_DO_DROP + int m_dragFlags; // wxEVT_STC_START_DRAG + wxDragResult m_dragResult; // wxEVT_STC_DRAG_OVER,wxEVT_STC_DO_DROP +#endif +#endif +}; + + + +#ifndef SWIG +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_CHANGE, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_STYLENEEDED, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_CHARADDED, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_SAVEPOINTREACHED, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_SAVEPOINTLEFT, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_ROMODIFYATTEMPT, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_KEY, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_DOUBLECLICK, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_UPDATEUI, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_MODIFIED, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_MACRORECORD, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_MARGINCLICK, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_NEEDSHOWN, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_PAINTED, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_USERLISTSELECTION, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_URIDROPPED, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_DWELLSTART, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_DWELLEND, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_START_DRAG, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_DRAG_OVER, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_DO_DROP, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_ZOOM, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_HOTSPOT_CLICK, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_HOTSPOT_DCLICK, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_CALLTIP_CLICK, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_AUTOCOMP_SELECTION, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_INDICATOR_CLICK, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_INDICATOR_RELEASE, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_AUTOCOMP_CANCELLED, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_AUTOCOMP_CHAR_DELETED, wxStyledTextEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_HOTSPOT_RELEASE_CLICK, wxStyledTextEvent ); +#else + enum { + wxEVT_STC_CHANGE, + wxEVT_STC_STYLENEEDED, + wxEVT_STC_CHARADDED, + wxEVT_STC_SAVEPOINTREACHED, + wxEVT_STC_SAVEPOINTLEFT, + wxEVT_STC_ROMODIFYATTEMPT, + wxEVT_STC_KEY, + wxEVT_STC_DOUBLECLICK, + wxEVT_STC_UPDATEUI, + wxEVT_STC_MODIFIED, + wxEVT_STC_MACRORECORD, + wxEVT_STC_MARGINCLICK, + wxEVT_STC_NEEDSHOWN, + wxEVT_STC_PAINTED, + wxEVT_STC_USERLISTSELECTION, + wxEVT_STC_URIDROPPED, + wxEVT_STC_DWELLSTART, + wxEVT_STC_DWELLEND, + wxEVT_STC_START_DRAG, + wxEVT_STC_DRAG_OVER, + wxEVT_STC_DO_DROP, + wxEVT_STC_ZOOM, + wxEVT_STC_HOTSPOT_CLICK, + wxEVT_STC_HOTSPOT_DCLICK, + wxEVT_STC_CALLTIP_CLICK, + wxEVT_STC_AUTOCOMP_SELECTION, + wxEVT_STC_INDICATOR_CLICK, + wxEVT_STC_INDICATOR_RELEASE, + wxEVT_STC_AUTOCOMP_CANCELLED, + wxEVT_STC_AUTOCOMP_CHAR_DELETED, + wxEVT_STC_HOTSPOT_RELEASE_CLICK + }; +#endif + + + +#ifndef SWIG +typedef void (wxEvtHandler::*wxStyledTextEventFunction)(wxStyledTextEvent&); + +#define wxStyledTextEventHandler( func ) \ + wxEVENT_HANDLER_CAST( wxStyledTextEventFunction, func ) + +#define EVT_STC_CHANGE(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHANGE, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_STYLENEEDED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_STYLENEEDED, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_CHARADDED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHARADDED, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_SAVEPOINTREACHED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTREACHED, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_SAVEPOINTLEFT(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTLEFT, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_ROMODIFYATTEMPT(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_ROMODIFYATTEMPT, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_KEY(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_KEY, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_DOUBLECLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DOUBLECLICK, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_UPDATEUI(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_UPDATEUI, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_MODIFIED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MODIFIED, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_MACRORECORD(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MACRORECORD, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_MARGINCLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MARGINCLICK, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_NEEDSHOWN(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_NEEDSHOWN, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_PAINTED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_PAINTED, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_USERLISTSELECTION(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_USERLISTSELECTION, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_URIDROPPED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_URIDROPPED, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_DWELLSTART(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DWELLSTART, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_DWELLEND(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DWELLEND, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_START_DRAG(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_START_DRAG, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_DRAG_OVER(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DRAG_OVER, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_DO_DROP(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DO_DROP, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_ZOOM(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_ZOOM, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_HOTSPOT_CLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_HOTSPOT_CLICK, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_HOTSPOT_DCLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_HOTSPOT_DCLICK, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_CALLTIP_CLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CALLTIP_CLICK, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_AUTOCOMP_SELECTION(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_AUTOCOMP_SELECTION, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_INDICATOR_CLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_INDICATOR_CLICK, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_INDICATOR_RELEASE(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_INDICATOR_RELEASE, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_AUTOCOMP_CANCELLED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_AUTOCOMP_CANCELLED, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_AUTOCOMP_CHAR_DELETED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_AUTOCOMP_CHAR_DELETED, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), +#define EVT_STC_HOTSPOT_RELEASE_CLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_HOTSPOT_RELEASE_CLICK, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ), + +#endif + +#endif // wxUSE_STC + +#endif // _WX_STC_STC_H_ diff --git a/wxmsw/include/wx-3.0/wx/stdpaths.h b/wxmsw/include/wx-3.0/wx/stdpaths.h new file mode 100644 index 00000000..9d920444 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/stdpaths.h @@ -0,0 +1,225 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/stdpaths.h +// Purpose: declaration of wxStandardPaths class +// Author: Vadim Zeitlin +// Modified by: +// Created: 2004-10-17 +// Copyright: (c) 2004 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STDPATHS_H_ +#define _WX_STDPATHS_H_ + +#include "wx/defs.h" + +#include "wx/string.h" +#include "wx/filefn.h" + +class WXDLLIMPEXP_FWD_BASE wxStandardPaths; + +// ---------------------------------------------------------------------------- +// wxStandardPaths returns the standard locations in the file system +// ---------------------------------------------------------------------------- + +// NB: This is always compiled in, wxUSE_STDPATHS=0 only disables native +// wxStandardPaths class, but a minimal version is always available +class WXDLLIMPEXP_BASE wxStandardPathsBase +{ +public: + // possible resources categories + enum ResourceCat + { + // no special category + ResourceCat_None, + + // message catalog resources + ResourceCat_Messages, + + // end of enum marker + ResourceCat_Max + }; + + // what should we use to construct paths unique to this application: + // (AppInfo_AppName and AppInfo_VendorName can be combined together) + enum + { + AppInfo_None = 0, // nothing + AppInfo_AppName = 1, // the application name + AppInfo_VendorName = 2 // the vendor name + }; + + + // return the global standard paths object + static wxStandardPaths& Get(); + + // return the path (directory+filename) of the running executable or + // wxEmptyString if it couldn't be determined. + // The path is returned as an absolute path whenever possible. + // Default implementation only try to use wxApp->argv[0]. + virtual wxString GetExecutablePath() const; + + // return the directory with system config files: + // /etc under Unix, c:\Documents and Settings\All Users\Application Data + // under Windows, /Library/Preferences for Mac + virtual wxString GetConfigDir() const = 0; + + // return the directory for the user config files: + // $HOME under Unix, c:\Documents and Settings\username under Windows, + // ~/Library/Preferences under Mac + // + // only use this if you have a single file to put there, otherwise + // GetUserDataDir() is more appropriate + virtual wxString GetUserConfigDir() const = 0; + + // return the location of the applications global, i.e. not user-specific, + // data files + // + // prefix/share/appname under Unix, c:\Program Files\appname under Windows, + // appname.app/Contents/SharedSupport app bundle directory under Mac + virtual wxString GetDataDir() const = 0; + + // return the location for application data files which are host-specific + // + // same as GetDataDir() except under Unix where it is /etc/appname + virtual wxString GetLocalDataDir() const; + + // return the directory for the user-dependent application data files + // + // $HOME/.appname under Unix, + // c:\Documents and Settings\username\Application Data\appname under Windows + // and ~/Library/Application Support/appname under Mac + virtual wxString GetUserDataDir() const = 0; + + // return the directory for user data files which shouldn't be shared with + // the other machines + // + // same as GetUserDataDir() for all platforms except Windows where it is + // the "Local Settings\Application Data\appname" directory + virtual wxString GetUserLocalDataDir() const; + + // return the directory where the loadable modules (plugins) live + // + // prefix/lib/appname under Unix, program directory under Windows and + // Contents/Plugins app bundle subdirectory under Mac + virtual wxString GetPluginsDir() const = 0; + + // get resources directory: resources are auxiliary files used by the + // application and include things like image and sound files + // + // same as GetDataDir() for all platforms except Mac where it returns + // Contents/Resources subdirectory of the app bundle + virtual wxString GetResourcesDir() const { return GetDataDir(); } + + // get localized resources directory containing the resource files of the + // specified category for the given language + // + // in general this is just GetResourcesDir()/lang under Windows and Unix + // and GetResourcesDir()/lang.lproj under Mac but is something quite + // different under Unix for message catalog category (namely the standard + // prefix/share/locale/lang/LC_MESSAGES) + virtual wxString + GetLocalizedResourcesDir(const wxString& lang, + ResourceCat WXUNUSED(category) + = ResourceCat_None) const + { + return GetResourcesDir() + wxFILE_SEP_PATH + lang; + } + + // return the "Documents" directory for the current user + // + // C:\Documents and Settings\username\My Documents under Windows, + // $HOME under Unix and ~/Documents under Mac + virtual wxString GetDocumentsDir() const; + + // return the directory for the documents files used by this application: + // it's a subdirectory of GetDocumentsDir() constructed using the + // application name/vendor if it exists or just GetDocumentsDir() otherwise + virtual wxString GetAppDocumentsDir() const; + + // return the temporary directory for the current user + virtual wxString GetTempDir() const; + + + // virtual dtor for the base class + virtual ~wxStandardPathsBase(); + + // Information used by AppendAppInfo + void UseAppInfo(int info) + { + m_usedAppInfo = info; + } + + bool UsesAppInfo(int info) const { return (m_usedAppInfo & info) != 0; } + + +protected: + // Ctor is protected as this is a base class which should never be created + // directly. + wxStandardPathsBase(); + + // append the path component, with a leading path separator if a + // path separator or dot (.) is not already at the end of dir + static wxString AppendPathComponent(const wxString& dir, const wxString& component); + + // append application information determined by m_usedAppInfo to dir + wxString AppendAppInfo(const wxString& dir) const; + + + // combination of AppInfo_XXX flags used by AppendAppInfo() + int m_usedAppInfo; +}; + +#if wxUSE_STDPATHS + #if defined(__WINDOWS__) + #include "wx/msw/stdpaths.h" + #define wxHAS_NATIVE_STDPATHS + // We want CoreFoundation paths on both CarbonLib and Darwin (for all ports) + #elif defined(__WXMAC__) || defined(__DARWIN__) + #include "wx/osx/core/stdpaths.h" + #define wxHAS_NATIVE_STDPATHS + #elif defined(__OS2__) + #include "wx/os2/stdpaths.h" + #define wxHAS_NATIVE_STDPATHS + #elif defined(__UNIX__) + #include "wx/unix/stdpaths.h" + #define wxHAS_NATIVE_STDPATHS + #endif +#endif + +// ---------------------------------------------------------------------------- +// Minimal generic implementation +// ---------------------------------------------------------------------------- + +// NB: Note that this minimal implementation is compiled in even if +// wxUSE_STDPATHS=0, so that our code can still use wxStandardPaths. + +#ifndef wxHAS_NATIVE_STDPATHS +class WXDLLIMPEXP_BASE wxStandardPaths : public wxStandardPathsBase +{ +public: + void SetInstallPrefix(const wxString& prefix) { m_prefix = prefix; } + wxString GetInstallPrefix() const { return m_prefix; } + + virtual wxString GetExecutablePath() const { return m_prefix; } + virtual wxString GetConfigDir() const { return m_prefix; } + virtual wxString GetUserConfigDir() const { return m_prefix; } + virtual wxString GetDataDir() const { return m_prefix; } + virtual wxString GetLocalDataDir() const { return m_prefix; } + virtual wxString GetUserDataDir() const { return m_prefix; } + virtual wxString GetPluginsDir() const { return m_prefix; } + virtual wxString GetDocumentsDir() const { return m_prefix; } + +protected: + // Ctor is protected because wxStandardPaths::Get() should always be used + // to access the global wxStandardPaths object of the correct type instead + // of creating one of a possibly wrong type yourself. + wxStandardPaths() { } + +private: + wxString m_prefix; +}; +#endif // !wxHAS_NATIVE_STDPATHS + +#endif // _WX_STDPATHS_H_ + diff --git a/wxmsw/include/wx-3.0/wx/stdstream.h b/wxmsw/include/wx-3.0/wx/stdstream.h new file mode 100644 index 00000000..73ac0ac2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/stdstream.h @@ -0,0 +1,122 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/stdstream.h +// Purpose: Header of std::istream and std::ostream derived wrappers for +// wxInputStream and wxOutputStream +// Author: Jonathan Liu <net147@gmail.com> +// Created: 2009-05-02 +// Copyright: (c) 2009 Jonathan Liu +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STDSTREAM_H_ +#define _WX_STDSTREAM_H_ + +#include "wx/defs.h" // wxUSE_STD_IOSTREAM + +#if wxUSE_STREAMS && wxUSE_STD_IOSTREAM + +#include "wx/defs.h" +#include "wx/stream.h" +#include "wx/ioswrap.h" + +// ========================================================================== +// wxStdInputStreamBuffer +// ========================================================================== + +class WXDLLIMPEXP_BASE wxStdInputStreamBuffer : public std::streambuf +{ +public: + wxStdInputStreamBuffer(wxInputStream& stream); + virtual ~wxStdInputStreamBuffer() { } + +protected: + virtual std::streambuf *setbuf(char *s, std::streamsize n); + virtual std::streampos seekoff(std::streamoff off, + std::ios_base::seekdir way, + std::ios_base::openmode which = + std::ios_base::in | + std::ios_base::out); + virtual std::streampos seekpos(std::streampos sp, + std::ios_base::openmode which = + std::ios_base::in | + std::ios_base::out); + virtual std::streamsize showmanyc(); + virtual std::streamsize xsgetn(char *s, std::streamsize n); + virtual int underflow(); + virtual int uflow(); + virtual int pbackfail(int c = EOF); + + // Special work around for VC8/9 (this bug was fixed in VC10 and later): + // these versions have non-standard _Xsgetn_s() that it being called from + // the stream code instead of xsgetn() and so our overridden implementation + // never actually gets used. To work around this, forward to it explicitly. +#if defined(__VISUALC8__) || defined(__VISUALC9__) + virtual std::streamsize + _Xsgetn_s(char *s, size_t WXUNUSED(size), std::streamsize n) + { + return xsgetn(s, n); + } +#endif // VC8 or VC9 + + wxInputStream& m_stream; + int m_lastChar; +}; + +// ========================================================================== +// wxStdInputStream +// ========================================================================== + +class WXDLLIMPEXP_BASE wxStdInputStream : public std::istream +{ +public: + wxStdInputStream(wxInputStream& stream); + virtual ~wxStdInputStream() { } + +protected: + wxStdInputStreamBuffer m_streamBuffer; +}; + +// ========================================================================== +// wxStdOutputStreamBuffer +// ========================================================================== + +class WXDLLIMPEXP_BASE wxStdOutputStreamBuffer : public std::streambuf +{ +public: + wxStdOutputStreamBuffer(wxOutputStream& stream); + virtual ~wxStdOutputStreamBuffer() { } + +protected: + virtual std::streambuf *setbuf(char *s, std::streamsize n); + virtual std::streampos seekoff(std::streamoff off, + std::ios_base::seekdir way, + std::ios_base::openmode which = + std::ios_base::in | + std::ios_base::out); + virtual std::streampos seekpos(std::streampos sp, + std::ios_base::openmode which = + std::ios_base::in | + std::ios_base::out); + virtual std::streamsize xsputn(const char *s, std::streamsize n); + virtual int overflow(int c); + + wxOutputStream& m_stream; +}; + +// ========================================================================== +// wxStdOutputStream +// ========================================================================== + +class WXDLLIMPEXP_BASE wxStdOutputStream : public std::ostream +{ +public: + wxStdOutputStream(wxOutputStream& stream); + virtual ~wxStdOutputStream() { } + +protected: + wxStdOutputStreamBuffer m_streamBuffer; +}; + +#endif // wxUSE_STREAMS && wxUSE_STD_IOSTREAM + +#endif // _WX_STDSTREAM_H_ diff --git a/wxmsw/include/wx-3.0/wx/stockitem.h b/wxmsw/include/wx-3.0/wx/stockitem.h new file mode 100644 index 00000000..72d3e714 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/stockitem.h @@ -0,0 +1,80 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/stockitem.h +// Purpose: stock items helpers (privateh header) +// Author: Vaclav Slavik +// Modified by: +// Created: 2004-08-15 +// Copyright: (c) Vaclav Slavik, 2004 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STOCKITEM_H_ +#define _WX_STOCKITEM_H_ + +#include "wx/defs.h" +#include "wx/chartype.h" +#include "wx/string.h" +#include "wx/accel.h" + +// ---------------------------------------------------------------------------- +// Helper functions for stock items handling: +// ---------------------------------------------------------------------------- + +// Returns true if the ID is in the list of recognized stock actions +WXDLLIMPEXP_CORE bool wxIsStockID(wxWindowID id); + +// Returns true of the label is empty or label of a stock button with +// given ID +WXDLLIMPEXP_CORE bool wxIsStockLabel(wxWindowID id, const wxString& label); + +enum wxStockLabelQueryFlag +{ + wxSTOCK_NOFLAGS = 0, + + wxSTOCK_WITH_MNEMONIC = 1, + wxSTOCK_WITH_ACCELERATOR = 2, + + // by default, stock items text is returned with ellipsis, if appropriate, + // this flag allows to avoid having it + wxSTOCK_WITHOUT_ELLIPSIS = 4, + + // return label for button, not menu item: buttons should always use + // mnemonics and never use ellipsis + wxSTOCK_FOR_BUTTON = wxSTOCK_WITHOUT_ELLIPSIS | wxSTOCK_WITH_MNEMONIC +}; + +// Returns label that should be used for given stock UI element (e.g. "&OK" +// for wxSTOCK_OK); if wxSTOCK_WITH_MNEMONIC is given, the & character +// is included; if wxSTOCK_WITH_ACCELERATOR is given, the stock accelerator +// for given ID is concatenated to the label using \t as separator +WXDLLIMPEXP_CORE wxString wxGetStockLabel(wxWindowID id, + long flags = wxSTOCK_WITH_MNEMONIC); + +#if wxUSE_ACCEL + + // Returns the accelerator that should be used for given stock UI element + // (e.g. "Ctrl+x" for wxSTOCK_EXIT) + WXDLLIMPEXP_CORE wxAcceleratorEntry wxGetStockAccelerator(wxWindowID id); + +#endif + +// wxStockHelpStringClient conceptually works like wxArtClient: it gives a hint to +// wxGetStockHelpString() about the context where the help string is to be used +enum wxStockHelpStringClient +{ + wxSTOCK_MENU // help string to use for menu items +}; + +// Returns an help string for the given stock UI element and for the given "context". +WXDLLIMPEXP_CORE wxString wxGetStockHelpString(wxWindowID id, + wxStockHelpStringClient client = wxSTOCK_MENU); + + +#ifdef __WXGTK20__ + +// Translates stock ID to GTK+'s stock item string identifier: +WXDLLIMPEXP_CORE const char *wxGetStockGtkID(wxWindowID id); + +#endif + +#endif // _WX_STOCKITEM_H_ diff --git a/wxmsw/include/wx-3.0/wx/stopwatch.h b/wxmsw/include/wx-3.0/wx/stopwatch.h new file mode 100644 index 00000000..248f7575 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/stopwatch.h @@ -0,0 +1,104 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/stopwatch.h +// Purpose: wxStopWatch and global time-related functions +// Author: Julian Smart (wxTimer), Sylvain Bougnoux (wxStopWatch), +// Vadim Zeitlin (time functions, current wxStopWatch) +// Created: 26.06.03 (extracted from wx/timer.h) +// Copyright: (c) 1998-2003 Julian Smart, Sylvain Bougnoux +// (c) 2011 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STOPWATCH_H_ +#define _WX_STOPWATCH_H_ + +#include "wx/defs.h" +#include "wx/longlong.h" + +// Time-related functions are also available via this header for compatibility +// but you should include wx/time.h directly if you need only them and not +// wxStopWatch itself. +#include "wx/time.h" + +// ---------------------------------------------------------------------------- +// wxStopWatch: measure time intervals with up to 1ms resolution +// ---------------------------------------------------------------------------- + +#if wxUSE_STOPWATCH + +class WXDLLIMPEXP_BASE wxStopWatch +{ +public: + // ctor starts the stop watch + wxStopWatch() { m_pauseCount = 0; Start(); } + + // Start the stop watch at the moment t0 expressed in milliseconds (i.e. + // calling Time() immediately afterwards returns t0). This can be used to + // restart an existing stopwatch. + void Start(long t0 = 0); + + // pause the stop watch + void Pause() + { + if ( m_pauseCount++ == 0 ) + m_elapsedBeforePause = GetCurrentClockValue() - m_t0; + } + + // resume it + void Resume() + { + wxASSERT_MSG( m_pauseCount > 0, + wxT("Resuming stop watch which is not paused") ); + + if ( --m_pauseCount == 0 ) + { + DoStart(); + m_t0 -= m_elapsedBeforePause; + } + } + + // Get elapsed time since the last Start() in microseconds. + wxLongLong TimeInMicro() const; + + // get elapsed time since the last Start() in milliseconds + long Time() const { return (TimeInMicro()/1000).ToLong(); } + +private: + // Really starts the stop watch. The initial time is set to current clock + // value. + void DoStart(); + + // Returns the current clock value in its native units. + wxLongLong GetCurrentClockValue() const; + + // Return the frequency of the clock used in its ticks per second. + wxLongLong GetClockFreq() const; + + + // The clock value when the stop watch was last started. Its units vary + // depending on the platform. + wxLongLong m_t0; + + // The elapsed time as of last Pause() call (only valid if m_pauseCount > + // 0) in the same units as m_t0. + wxLongLong m_elapsedBeforePause; + + // if > 0, the stop watch is paused, otherwise it is running + int m_pauseCount; +}; + +#endif // wxUSE_STOPWATCH + +#if wxUSE_LONGLONG && WXWIN_COMPATIBILITY_2_6 + + // Starts a global timer + // -- DEPRECATED: use wxStopWatch instead + wxDEPRECATED( void WXDLLIMPEXP_BASE wxStartTimer() ); + + // Gets elapsed milliseconds since last wxStartTimer or wxGetElapsedTime + // -- DEPRECATED: use wxStopWatch instead + wxDEPRECATED( long WXDLLIMPEXP_BASE wxGetElapsedTime(bool resetTimer = true) ); + +#endif // wxUSE_LONGLONG && WXWIN_COMPATIBILITY_2_6 + +#endif // _WX_STOPWATCH_H_ diff --git a/wxmsw/include/wx-3.0/wx/strconv.h b/wxmsw/include/wx-3.0/wx/strconv.h new file mode 100644 index 00000000..3dc37521 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/strconv.h @@ -0,0 +1,675 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/strconv.h +// Purpose: conversion routines for char sets any Unicode +// Author: Ove Kaaven, Robert Roebling, Vadim Zeitlin +// Modified by: +// Created: 29/01/98 +// Copyright: (c) 1998 Ove Kaaven, Robert Roebling +// (c) 1998-2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STRCONV_H_ +#define _WX_STRCONV_H_ + +#include "wx/defs.h" +#include "wx/chartype.h" +#include "wx/buffer.h" + +#ifdef __DIGITALMARS__ +#include "typeinfo.h" +#endif + +#if defined(__VISAGECPP__) && __IBMCPP__ >= 400 +# undef __BSEXCPT__ +#endif + +#include <stdlib.h> + +class WXDLLIMPEXP_FWD_BASE wxString; + +// the error value returned by wxMBConv methods +#define wxCONV_FAILED ((size_t)-1) + +// ---------------------------------------------------------------------------- +// wxMBConv (abstract base class for conversions) +// ---------------------------------------------------------------------------- + +// When deriving a new class from wxMBConv you must reimplement ToWChar() and +// FromWChar() methods which are not pure virtual only for historical reasons, +// don't let the fact that the existing classes implement MB2WC/WC2MB() instead +// confuse you. +// +// You also have to implement Clone() to allow copying the conversions +// polymorphically. +// +// And you might need to override GetMBNulLen() as well. +class WXDLLIMPEXP_BASE wxMBConv +{ +public: + // The functions doing actual conversion from/to narrow to/from wide + // character strings. + // + // On success, the return value is the length (i.e. the number of + // characters, not bytes) of the converted string including any trailing + // L'\0' or (possibly multiple) '\0'(s). If the conversion fails or if + // there is not enough space for everything, including the trailing NUL + // character(s), in the output buffer, wxCONV_FAILED is returned. + // + // In the special case when dst is NULL (the value of dstLen is ignored + // then) the return value is the length of the needed buffer but nothing + // happens otherwise. If srcLen is wxNO_LEN, the entire string, up to and + // including the trailing NUL(s), is converted, otherwise exactly srcLen + // bytes are. + // + // Typical usage: + // + // size_t dstLen = conv.ToWChar(NULL, 0, src); + // if ( dstLen == wxCONV_FAILED ) + // ... handle error ... + // wchar_t *wbuf = new wchar_t[dstLen]; + // conv.ToWChar(wbuf, dstLen, src); + // ... work with wbuf ... + // delete [] wbuf; + // + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + + + // Convenience functions for translating NUL-terminated strings: returns + // the buffer containing the converted string or NULL pointer if the + // conversion failed. + const wxWCharBuffer cMB2WC(const char *in) const; + const wxCharBuffer cWC2MB(const wchar_t *in) const; + + // Convenience functions for converting strings which may contain embedded + // NULs and don't have to be NUL-terminated. + // + // inLen is the length of the buffer including trailing NUL if any or + // wxNO_LEN if the input is NUL-terminated. + // + // outLen receives, if not NULL, the length of the converted string or 0 if + // the conversion failed (returning 0 and not -1 in this case makes it + // difficult to distinguish between failed conversion and empty input but + // this is done for backwards compatibility). Notice that the rules for + // whether outLen accounts or not for the last NUL are the same as for + // To/FromWChar() above: if inLen is specified, outLen is exactly the + // number of characters converted, whether the last one of them was NUL or + // not. But if inLen == wxNO_LEN then outLen doesn't account for the last + // NUL even though it is present. + const wxWCharBuffer + cMB2WC(const char *in, size_t inLen, size_t *outLen) const; + const wxCharBuffer + cWC2MB(const wchar_t *in, size_t inLen, size_t *outLen) const; + + // And yet more convenience functions for converting the entire buffers: + // these are the simplest and least error-prone as you never need to bother + // with lengths/sizes directly. + const wxWCharBuffer cMB2WC(const wxScopedCharBuffer& in) const; + const wxCharBuffer cWC2MB(const wxScopedWCharBuffer& in) const; + + // convenience functions for converting MB or WC to/from wxWin default +#if wxUSE_UNICODE + const wxWCharBuffer cMB2WX(const char *psz) const { return cMB2WC(psz); } + const wxCharBuffer cWX2MB(const wchar_t *psz) const { return cWC2MB(psz); } + const wchar_t* cWC2WX(const wchar_t *psz) const { return psz; } + const wchar_t* cWX2WC(const wchar_t *psz) const { return psz; } +#else // ANSI + const char* cMB2WX(const char *psz) const { return psz; } + const char* cWX2MB(const char *psz) const { return psz; } + const wxCharBuffer cWC2WX(const wchar_t *psz) const { return cWC2MB(psz); } + const wxWCharBuffer cWX2WC(const char *psz) const { return cMB2WC(psz); } +#endif // Unicode/ANSI + + // this function is used in the implementation of cMB2WC() to distinguish + // between the following cases: + // + // a) var width encoding with strings terminated by a single NUL + // (usual multibyte encodings): return 1 in this case + // b) fixed width encoding with 2 bytes/char and so terminated by + // 2 NULs (UTF-16/UCS-2 and variants): return 2 in this case + // c) fixed width encoding with 4 bytes/char and so terminated by + // 4 NULs (UTF-32/UCS-4 and variants): return 4 in this case + // + // anything else is not supported currently and -1 should be returned + virtual size_t GetMBNulLen() const { return 1; } + + // return the maximal value currently returned by GetMBNulLen() for any + // encoding + static size_t GetMaxMBNulLen() { return 4 /* for UTF-32 */; } + +#if wxUSE_UNICODE_UTF8 + // return true if the converter's charset is UTF-8, i.e. char* strings + // decoded using this object can be directly copied to wxString's internal + // storage without converting to WC and than back to UTF-8 MB string + virtual bool IsUTF8() const { return false; } +#endif + + // The old conversion functions. The existing classes currently mostly + // implement these ones but we're in transition to using To/FromWChar() + // instead and any new classes should implement just the new functions. + // For now, however, we provide default implementation of To/FromWChar() in + // this base class in terms of MB2WC/WC2MB() to avoid having to rewrite all + // the conversions at once. + // + // On success, the return value is the length (i.e. the number of + // characters, not bytes) not counting the trailing NUL(s) of the converted + // string. On failure, (size_t)-1 is returned. In the special case when + // outputBuf is NULL the return value is the same one but nothing is + // written to the buffer. + // + // Note that outLen is the length of the output buffer, not the length of + // the input (which is always supposed to be terminated by one or more + // NULs, as appropriate for the encoding)! + virtual size_t MB2WC(wchar_t *out, const char *in, size_t outLen) const; + virtual size_t WC2MB(char *out, const wchar_t *in, size_t outLen) const; + + + // make a heap-allocated copy of this object + virtual wxMBConv *Clone() const = 0; + + // virtual dtor for any base class + virtual ~wxMBConv(); +}; + +// ---------------------------------------------------------------------------- +// wxMBConvLibc uses standard mbstowcs() and wcstombs() functions for +// conversion (hence it depends on the current locale) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvLibc : public wxMBConv +{ +public: + virtual size_t MB2WC(wchar_t *outputBuf, const char *psz, size_t outputSize) const; + virtual size_t WC2MB(char *outputBuf, const wchar_t *psz, size_t outputSize) const; + + virtual wxMBConv *Clone() const { return new wxMBConvLibc; } + +#if wxUSE_UNICODE_UTF8 + virtual bool IsUTF8() const { return wxLocaleIsUtf8; } +#endif +}; + +#ifdef __UNIX__ + +// ---------------------------------------------------------------------------- +// wxConvBrokenFileNames is made for Unix in Unicode mode when +// files are accidentally written in an encoding which is not +// the system encoding. Typically, the system encoding will be +// UTF8 but there might be files stored in ISO8859-1 on disk. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxConvBrokenFileNames : public wxMBConv +{ +public: + wxConvBrokenFileNames(const wxString& charset); + wxConvBrokenFileNames(const wxConvBrokenFileNames& conv) + : wxMBConv(), + m_conv(conv.m_conv ? conv.m_conv->Clone() : NULL) + { + } + virtual ~wxConvBrokenFileNames() { delete m_conv; } + + virtual size_t MB2WC(wchar_t *out, const char *in, size_t outLen) const + { + return m_conv->MB2WC(out, in, outLen); + } + + virtual size_t WC2MB(char *out, const wchar_t *in, size_t outLen) const + { + return m_conv->WC2MB(out, in, outLen); + } + + virtual size_t GetMBNulLen() const + { + // cast needed to call a private function + return m_conv->GetMBNulLen(); + } + +#if wxUSE_UNICODE_UTF8 + virtual bool IsUTF8() const { return m_conv->IsUTF8(); } +#endif + + virtual wxMBConv *Clone() const { return new wxConvBrokenFileNames(*this); } + +private: + // the conversion object we forward to + wxMBConv *m_conv; + + wxDECLARE_NO_ASSIGN_CLASS(wxConvBrokenFileNames); +}; + +#endif // __UNIX__ + +// ---------------------------------------------------------------------------- +// wxMBConvUTF7 (for conversion using UTF7 encoding) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvUTF7 : public wxMBConv +{ +public: + wxMBConvUTF7() { } + + // compiler-generated copy ctor, assignment operator and dtor are ok + // (assuming it's ok to copy the shift state -- not really sure about it) + + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + + virtual wxMBConv *Clone() const { return new wxMBConvUTF7; } + +private: + // UTF-7 decoder/encoder may be in direct mode or in shifted mode after a + // '+' (and until the '-' or any other non-base64 character) + struct StateMode + { + enum Mode + { + Direct, // pass through state + Shifted // after a '+' (and before '-') + }; + }; + + // the current decoder state: this is only used by ToWChar() if srcLen + // parameter is not wxNO_LEN, when working on the entire NUL-terminated + // strings we neither update nor use the state + class DecoderState : private StateMode + { + private: + // current state: this one is private as we want to enforce the use of + // ToDirect/ToShifted() methods below + Mode mode; + + public: + // the initial state is direct + DecoderState() { mode = Direct; } + + // switch to/from shifted mode + void ToDirect() { mode = Direct; } + void ToShifted() { mode = Shifted; accum = bit = 0; isLSB = false; } + + bool IsDirect() const { return mode == Direct; } + bool IsShifted() const { return mode == Shifted; } + + + // these variables are only used in shifted mode + + unsigned int accum; // accumulator of the bit we've already got + unsigned int bit; // the number of bits consumed mod 8 + unsigned char msb; // the high byte of UTF-16 word + bool isLSB; // whether we're decoding LSB or MSB of UTF-16 word + }; + + DecoderState m_stateDecoder; + + + // encoder state is simpler as we always receive entire Unicode characters + // on input + class EncoderState : private StateMode + { + private: + Mode mode; + + public: + EncoderState() { mode = Direct; } + + void ToDirect() { mode = Direct; } + void ToShifted() { mode = Shifted; accum = bit = 0; } + + bool IsDirect() const { return mode == Direct; } + bool IsShifted() const { return mode == Shifted; } + + unsigned int accum; + unsigned int bit; + }; + + EncoderState m_stateEncoder; +}; + +// ---------------------------------------------------------------------------- +// wxMBConvUTF8 (for conversion using UTF8 encoding) +// ---------------------------------------------------------------------------- + +// this is the real UTF-8 conversion class, it has to be called "strict UTF-8" +// for compatibility reasons: the wxMBConvUTF8 class below also supports lossy +// conversions if it is created with non default options +class WXDLLIMPEXP_BASE wxMBConvStrictUTF8 : public wxMBConv +{ +public: + // compiler-generated default ctor and other methods are ok + + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + + virtual wxMBConv *Clone() const { return new wxMBConvStrictUTF8(); } + +#if wxUSE_UNICODE_UTF8 + // NB: other mapping modes are not, strictly speaking, UTF-8, so we can't + // take the shortcut in that case + virtual bool IsUTF8() const { return true; } +#endif +}; + +class WXDLLIMPEXP_BASE wxMBConvUTF8 : public wxMBConvStrictUTF8 +{ +public: + enum + { + MAP_INVALID_UTF8_NOT = 0, + MAP_INVALID_UTF8_TO_PUA = 1, + MAP_INVALID_UTF8_TO_OCTAL = 2 + }; + + wxMBConvUTF8(int options = MAP_INVALID_UTF8_NOT) : m_options(options) { } + + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + + virtual wxMBConv *Clone() const { return new wxMBConvUTF8(m_options); } + +#if wxUSE_UNICODE_UTF8 + // NB: other mapping modes are not, strictly speaking, UTF-8, so we can't + // take the shortcut in that case + virtual bool IsUTF8() const { return m_options == MAP_INVALID_UTF8_NOT; } +#endif + +private: + int m_options; +}; + +// ---------------------------------------------------------------------------- +// wxMBConvUTF16Base: for both LE and BE variants +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvUTF16Base : public wxMBConv +{ +public: + enum { BYTES_PER_CHAR = 2 }; + + virtual size_t GetMBNulLen() const { return BYTES_PER_CHAR; } + +protected: + // return the length of the buffer using srcLen if it's not wxNO_LEN and + // computing the length ourselves if it is; also checks that the length is + // even if specified as we need an entire number of UTF-16 characters and + // returns wxNO_LEN which indicates error if it is odd + static size_t GetLength(const char *src, size_t srcLen); +}; + +// ---------------------------------------------------------------------------- +// wxMBConvUTF16LE (for conversion using UTF16 Little Endian encoding) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvUTF16LE : public wxMBConvUTF16Base +{ +public: + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + virtual wxMBConv *Clone() const { return new wxMBConvUTF16LE; } +}; + +// ---------------------------------------------------------------------------- +// wxMBConvUTF16BE (for conversion using UTF16 Big Endian encoding) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvUTF16BE : public wxMBConvUTF16Base +{ +public: + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + virtual wxMBConv *Clone() const { return new wxMBConvUTF16BE; } +}; + +// ---------------------------------------------------------------------------- +// wxMBConvUTF32Base: base class for both LE and BE variants +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvUTF32Base : public wxMBConv +{ +public: + enum { BYTES_PER_CHAR = 4 }; + + virtual size_t GetMBNulLen() const { return BYTES_PER_CHAR; } + +protected: + // this is similar to wxMBConvUTF16Base method with the same name except + // that, of course, it verifies that length is divisible by 4 if given and + // not by 2 + static size_t GetLength(const char *src, size_t srcLen); +}; + +// ---------------------------------------------------------------------------- +// wxMBConvUTF32LE (for conversion using UTF32 Little Endian encoding) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvUTF32LE : public wxMBConvUTF32Base +{ +public: + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + virtual wxMBConv *Clone() const { return new wxMBConvUTF32LE; } +}; + +// ---------------------------------------------------------------------------- +// wxMBConvUTF32BE (for conversion using UTF32 Big Endian encoding) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvUTF32BE : public wxMBConvUTF32Base +{ +public: + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + virtual wxMBConv *Clone() const { return new wxMBConvUTF32BE; } +}; + +// ---------------------------------------------------------------------------- +// wxCSConv (for conversion based on loadable char sets) +// ---------------------------------------------------------------------------- + +#include "wx/fontenc.h" + +class WXDLLIMPEXP_BASE wxCSConv : public wxMBConv +{ +public: + // we can be created either from charset name or from an encoding constant + // but we can't have both at once + wxCSConv(const wxString& charset); + wxCSConv(wxFontEncoding encoding); + + wxCSConv(const wxCSConv& conv); + virtual ~wxCSConv(); + + wxCSConv& operator=(const wxCSConv& conv); + + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + virtual size_t GetMBNulLen() const; + +#if wxUSE_UNICODE_UTF8 + virtual bool IsUTF8() const; +#endif + + virtual wxMBConv *Clone() const { return new wxCSConv(*this); } + + void Clear(); + + // return true if the conversion could be initialized successfully + bool IsOk() const; + +private: + // common part of all ctors + void Init(); + + // Creates the conversion to use, called from all ctors to initialize + // m_convReal. + wxMBConv *DoCreate() const; + + // Set the name (may be only called when m_name == NULL), makes copy of + // the charset string. + void SetName(const char *charset); + + // Set m_encoding field respecting the rules below, i.e. making sure it has + // a valid value if m_name == NULL (thus this should be always called after + // SetName()). + // + // Input encoding may be valid or not. + void SetEncoding(wxFontEncoding encoding); + + + // The encoding we use is specified by the two fields below: + // + // 1. If m_name != NULL, m_encoding corresponds to it if it's one of + // encodings we know about (i.e. member of wxFontEncoding) or is + // wxFONTENCODING_SYSTEM otherwise. + // + // 2. If m_name == NULL, m_encoding is always valid, i.e. not one of + // wxFONTENCODING_{SYSTEM,DEFAULT,MAX}. + char *m_name; + wxFontEncoding m_encoding; + + // The conversion object for our encoding or NULL if we failed to create it + // in which case we fall back to hard-coded ISO8859-1 conversion. + wxMBConv *m_convReal; +}; + + +// ---------------------------------------------------------------------------- +// declare predefined conversion objects +// ---------------------------------------------------------------------------- + +// Note: this macro is an implementation detail (see the comment in +// strconv.cpp). The wxGet_XXX() and wxGet_XXXPtr() functions shouldn't be +// used by user code and neither should XXXPtr, use the wxConvXXX macro +// instead. +#define WX_DECLARE_GLOBAL_CONV(klass, name) \ + extern WXDLLIMPEXP_DATA_BASE(klass*) name##Ptr; \ + extern WXDLLIMPEXP_BASE klass* wxGet_##name##Ptr(); \ + inline klass& wxGet_##name() \ + { \ + if ( !name##Ptr ) \ + name##Ptr = wxGet_##name##Ptr(); \ + return *name##Ptr; \ + } + + +// conversion to be used with all standard functions affected by locale, e.g. +// strtol(), strftime(), ... +WX_DECLARE_GLOBAL_CONV(wxMBConv, wxConvLibc) +#define wxConvLibc wxGet_wxConvLibc() + +// conversion ISO-8859-1/UTF-7/UTF-8 <-> wchar_t +WX_DECLARE_GLOBAL_CONV(wxCSConv, wxConvISO8859_1) +#define wxConvISO8859_1 wxGet_wxConvISO8859_1() + +WX_DECLARE_GLOBAL_CONV(wxMBConvStrictUTF8, wxConvUTF8) +#define wxConvUTF8 wxGet_wxConvUTF8() + +WX_DECLARE_GLOBAL_CONV(wxMBConvUTF7, wxConvUTF7) +#define wxConvUTF7 wxGet_wxConvUTF7() + +// conversion used for the file names on the systems where they're not Unicode +// (basically anything except Windows) +// +// this is used by all file functions, can be changed by the application +// +// by default UTF-8 under Mac OS X and wxConvLibc elsewhere (but it's not used +// under Windows normally) +extern WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvFileName; + +// backwards compatible define +#define wxConvFile (*wxConvFileName) + +// the current conversion object, may be set to any conversion, is used by +// default in a couple of places inside wx (initially same as wxConvLibc) +extern WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvCurrent; + +// the conversion corresponding to the current locale +WX_DECLARE_GLOBAL_CONV(wxCSConv, wxConvLocal) +#define wxConvLocal wxGet_wxConvLocal() + +// the conversion corresponding to the encoding of the standard UI elements +// +// by default this is the same as wxConvLocal but may be changed if the program +// needs to use a fixed encoding +extern WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvUI; + +#undef WX_DECLARE_GLOBAL_CONV + +// ---------------------------------------------------------------------------- +// endianness-dependent conversions +// ---------------------------------------------------------------------------- + +#ifdef WORDS_BIGENDIAN + typedef wxMBConvUTF16BE wxMBConvUTF16; + typedef wxMBConvUTF32BE wxMBConvUTF32; +#else + typedef wxMBConvUTF16LE wxMBConvUTF16; + typedef wxMBConvUTF32LE wxMBConvUTF32; +#endif + +// ---------------------------------------------------------------------------- +// filename conversion macros +// ---------------------------------------------------------------------------- + +// filenames are multibyte on Unix and widechar on Windows +#if wxMBFILES && wxUSE_UNICODE + #define wxFNCONV(name) wxConvFileName->cWX2MB(name) + #define wxFNSTRINGCAST wxMBSTRINGCAST +#else +#if defined( __WXOSX_OR_COCOA__ ) && wxMBFILES + #define wxFNCONV(name) wxConvFileName->cWC2MB( wxConvLocal.cWX2WC(name) ) +#else + #define wxFNCONV(name) name +#endif + #define wxFNSTRINGCAST WXSTRINGCAST +#endif + +// ---------------------------------------------------------------------------- +// macros for the most common conversions +// ---------------------------------------------------------------------------- + +#if wxUSE_UNICODE + #define wxConvertWX2MB(s) wxConvCurrent->cWX2MB(s) + #define wxConvertMB2WX(s) wxConvCurrent->cMB2WX(s) + + // these functions should be used when the conversions really, really have + // to succeed (usually because we pass their results to a standard C + // function which would crash if we passed NULL to it), so these functions + // always return a valid pointer if their argument is non-NULL + + // this function safety is achieved by trying wxConvLibc first, wxConvUTF8 + // next if it fails and, finally, wxConvISO8859_1 which always succeeds + extern WXDLLIMPEXP_BASE wxWCharBuffer wxSafeConvertMB2WX(const char *s); + + // this function uses wxConvLibc and wxConvUTF8(MAP_INVALID_UTF8_TO_OCTAL) + // if it fails + extern WXDLLIMPEXP_BASE wxCharBuffer wxSafeConvertWX2MB(const wchar_t *ws); +#else // ANSI + // no conversions to do + #define wxConvertWX2MB(s) (s) + #define wxConvertMB2WX(s) (s) + #define wxSafeConvertMB2WX(s) (s) + #define wxSafeConvertWX2MB(s) (s) +#endif // Unicode/ANSI + +#endif // _WX_STRCONV_H_ + diff --git a/wxmsw/include/wx-3.0/wx/stream.h b/wxmsw/include/wx-3.0/wx/stream.h new file mode 100644 index 00000000..0c380d6a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/stream.h @@ -0,0 +1,704 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/stream.h +// Purpose: stream classes +// Author: Guilhem Lavaux, Guillermo Rodriguez Garcia, Vadim Zeitlin +// Modified by: +// Created: 11/07/98 +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WXSTREAM_H__ +#define _WX_WXSTREAM_H__ + +#include "wx/defs.h" + +#if wxUSE_STREAMS + +#include <stdio.h> +#include "wx/object.h" +#include "wx/string.h" +#include "wx/filefn.h" // for wxFileOffset, wxInvalidOffset and wxSeekMode + +class WXDLLIMPEXP_FWD_BASE wxStreamBase; +class WXDLLIMPEXP_FWD_BASE wxInputStream; +class WXDLLIMPEXP_FWD_BASE wxOutputStream; + +typedef wxInputStream& (*__wxInputManip)(wxInputStream&); +typedef wxOutputStream& (*__wxOutputManip)(wxOutputStream&); + +WXDLLIMPEXP_BASE wxOutputStream& wxEndL(wxOutputStream& o_stream); + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +enum wxStreamError +{ + wxSTREAM_NO_ERROR = 0, // stream is in good state + wxSTREAM_EOF, // EOF reached in Read() or similar + wxSTREAM_WRITE_ERROR, // generic write error + wxSTREAM_READ_ERROR // generic read error +}; + +const int wxEOF = -1; + +// ============================================================================ +// base stream classes: wxInputStream and wxOutputStream +// ============================================================================ + +// --------------------------------------------------------------------------- +// wxStreamBase: common (but non virtual!) base for all stream classes +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStreamBase : public wxObject +{ +public: + wxStreamBase(); + virtual ~wxStreamBase(); + + // error testing + wxStreamError GetLastError() const { return m_lasterror; } + virtual bool IsOk() const { return GetLastError() == wxSTREAM_NO_ERROR; } + bool operator!() const { return !IsOk(); } + + // reset the stream state + void Reset(wxStreamError error = wxSTREAM_NO_ERROR) { m_lasterror = error; } + + // this doesn't make sense for all streams, always test its return value + virtual size_t GetSize() const; + virtual wxFileOffset GetLength() const { return wxInvalidOffset; } + + // returns true if the streams supports seeking to arbitrary offsets + virtual bool IsSeekable() const { return false; } + +protected: + virtual wxFileOffset OnSysSeek(wxFileOffset seek, wxSeekMode mode); + virtual wxFileOffset OnSysTell() const; + + size_t m_lastcount; + wxStreamError m_lasterror; + + friend class wxStreamBuffer; + + DECLARE_ABSTRACT_CLASS(wxStreamBase) + wxDECLARE_NO_COPY_CLASS(wxStreamBase); +}; + +// ---------------------------------------------------------------------------- +// wxInputStream: base class for the input streams +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxInputStream : public wxStreamBase +{ +public: + // ctor and dtor, nothing exciting + wxInputStream(); + virtual ~wxInputStream(); + + + // IO functions + // ------------ + + // return a character from the stream without removing it, i.e. it will + // still be returned by the next call to GetC() + // + // blocks until something appears in the stream if necessary, if nothing + // ever does (i.e. EOF) LastRead() will return 0 (and the return value is + // undefined), otherwise 1 + virtual char Peek(); + + // return one byte from the stream, blocking until it appears if + // necessary + // + // on success returns a value between 0 - 255, or wxEOF on EOF or error. + int GetC(); + + // read at most the given number of bytes from the stream + // + // there are 2 possible situations here: either there is nothing at all in + // the stream right now in which case Read() blocks until something appears + // (use CanRead() to avoid this) or there is already some data available in + // the stream and then Read() doesn't block but returns just the data it + // can read without waiting for more + // + // in any case, if there are not enough bytes in the stream right now, + // LastRead() value will be less than size but greater than 0. If it is 0, + // it means that EOF has been reached. + virtual wxInputStream& Read(void *buffer, size_t size); + + // Read exactly the given number of bytes, unlike Read(), which may read + // less than the requested amount of data without returning an error, this + // method either reads all the data or returns false. + bool ReadAll(void *buffer, size_t size); + + // copy the entire contents of this stream into streamOut, stopping only + // when EOF is reached or an error occurs + wxInputStream& Read(wxOutputStream& streamOut); + + + // status functions + // ---------------- + + // returns the number of bytes read by the last call to Read(), GetC() or + // Peek() + // + // this should be used to discover whether that call succeeded in reading + // all the requested data or not + virtual size_t LastRead() const { return wxStreamBase::m_lastcount; } + + // returns true if some data is available in the stream right now, so that + // calling Read() wouldn't block + virtual bool CanRead() const; + + // is the stream at EOF? + // + // note that this cannot be really implemented for all streams and + // CanRead() is more reliable than Eof() + virtual bool Eof() const; + + + // write back buffer + // ----------------- + + // put back the specified number of bytes into the stream, they will be + // fetched by the next call to the read functions + // + // returns the number of bytes really stuffed back + size_t Ungetch(const void *buffer, size_t size); + + // put back the specified character in the stream + // + // returns true if ok, false on error + bool Ungetch(char c); + + + // position functions + // ------------------ + + // move the stream pointer to the given position (if the stream supports + // it) + // + // returns wxInvalidOffset on error + virtual wxFileOffset SeekI(wxFileOffset pos, wxSeekMode mode = wxFromStart); + + // return the current position of the stream pointer or wxInvalidOffset + virtual wxFileOffset TellI() const; + + + // stream-like operators + // --------------------- + + wxInputStream& operator>>(wxOutputStream& out) { return Read(out); } + wxInputStream& operator>>(__wxInputManip func) { return func(*this); } + +protected: + // do read up to size bytes of data into the provided buffer + // + // this method should return 0 if EOF has been reached or an error occurred + // (m_lasterror should be set accordingly as well) or the number of bytes + // read + virtual size_t OnSysRead(void *buffer, size_t size) = 0; + + // write-back buffer support + // ------------------------- + + // return the pointer to a buffer big enough to hold sizeNeeded bytes + char *AllocSpaceWBack(size_t sizeNeeded); + + // read up to size data from the write back buffer, return the number of + // bytes read + size_t GetWBack(void *buf, size_t size); + + // write back buffer or NULL if none + char *m_wback; + + // the size of the buffer + size_t m_wbacksize; + + // the current position in the buffer + size_t m_wbackcur; + + friend class wxStreamBuffer; + + DECLARE_ABSTRACT_CLASS(wxInputStream) + wxDECLARE_NO_COPY_CLASS(wxInputStream); +}; + +// ---------------------------------------------------------------------------- +// wxOutputStream: base for the output streams +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxOutputStream : public wxStreamBase +{ +public: + wxOutputStream(); + virtual ~wxOutputStream(); + + void PutC(char c); + virtual wxOutputStream& Write(const void *buffer, size_t size); + + // This is ReadAll() equivalent for Write(): it either writes exactly the + // given number of bytes or returns false, unlike Write() which can write + // less data than requested but still return without error. + bool WriteAll(const void *buffer, size_t size); + + wxOutputStream& Write(wxInputStream& stream_in); + + virtual wxFileOffset SeekO(wxFileOffset pos, wxSeekMode mode = wxFromStart); + virtual wxFileOffset TellO() const; + + virtual size_t LastWrite() const { return wxStreamBase::m_lastcount; } + + virtual void Sync(); + virtual bool Close() { return true; } + + wxOutputStream& operator<<(wxInputStream& out) { return Write(out); } + wxOutputStream& operator<<( __wxOutputManip func) { return func(*this); } + +protected: + // to be implemented in the derived classes (it should have been pure + // virtual) + virtual size_t OnSysWrite(const void *buffer, size_t bufsize); + + friend class wxStreamBuffer; + + DECLARE_ABSTRACT_CLASS(wxOutputStream) + wxDECLARE_NO_COPY_CLASS(wxOutputStream); +}; + +// ============================================================================ +// helper stream classes +// ============================================================================ + +// --------------------------------------------------------------------------- +// A stream for measuring streamed output +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxCountingOutputStream : public wxOutputStream +{ +public: + wxCountingOutputStream(); + + virtual wxFileOffset GetLength() const; + bool Ok() const { return IsOk(); } + virtual bool IsOk() const { return true; } + +protected: + virtual size_t OnSysWrite(const void *buffer, size_t size); + virtual wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + virtual wxFileOffset OnSysTell() const; + + size_t m_currentPos, + m_lastPos; + + DECLARE_DYNAMIC_CLASS(wxCountingOutputStream) + wxDECLARE_NO_COPY_CLASS(wxCountingOutputStream); +}; + +// --------------------------------------------------------------------------- +// "Filter" streams +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFilterInputStream : public wxInputStream +{ +public: + wxFilterInputStream(); + wxFilterInputStream(wxInputStream& stream); + wxFilterInputStream(wxInputStream *stream); + virtual ~wxFilterInputStream(); + + char Peek() { return m_parent_i_stream->Peek(); } + + wxFileOffset GetLength() const { return m_parent_i_stream->GetLength(); } + + wxInputStream *GetFilterInputStream() const { return m_parent_i_stream; } + +protected: + wxInputStream *m_parent_i_stream; + bool m_owns; + + DECLARE_ABSTRACT_CLASS(wxFilterInputStream) + wxDECLARE_NO_COPY_CLASS(wxFilterInputStream); +}; + +class WXDLLIMPEXP_BASE wxFilterOutputStream : public wxOutputStream +{ +public: + wxFilterOutputStream(); + wxFilterOutputStream(wxOutputStream& stream); + wxFilterOutputStream(wxOutputStream *stream); + virtual ~wxFilterOutputStream(); + + wxFileOffset GetLength() const { return m_parent_o_stream->GetLength(); } + + wxOutputStream *GetFilterOutputStream() const { return m_parent_o_stream; } + + bool Close(); + +protected: + wxOutputStream *m_parent_o_stream; + bool m_owns; + + DECLARE_ABSTRACT_CLASS(wxFilterOutputStream) + wxDECLARE_NO_COPY_CLASS(wxFilterOutputStream); +}; + +enum wxStreamProtocolType +{ + wxSTREAM_PROTOCOL, // wxFileSystem protocol (should be only one) + wxSTREAM_MIMETYPE, // MIME types the stream handles + wxSTREAM_ENCODING, // The HTTP Content-Encodings the stream handles + wxSTREAM_FILEEXT // File extensions the stream handles +}; + +void WXDLLIMPEXP_BASE wxUseFilterClasses(); + +class WXDLLIMPEXP_BASE wxFilterClassFactoryBase : public wxObject +{ +public: + virtual ~wxFilterClassFactoryBase() { } + + wxString GetProtocol() const { return wxString(*GetProtocols()); } + wxString PopExtension(const wxString& location) const; + + virtual const wxChar * const *GetProtocols(wxStreamProtocolType type + = wxSTREAM_PROTOCOL) const = 0; + + bool CanHandle(const wxString& protocol, + wxStreamProtocolType type + = wxSTREAM_PROTOCOL) const; + +protected: + wxString::size_type FindExtension(const wxString& location) const; + + DECLARE_ABSTRACT_CLASS(wxFilterClassFactoryBase) +}; + +class WXDLLIMPEXP_BASE wxFilterClassFactory : public wxFilterClassFactoryBase +{ +public: + virtual ~wxFilterClassFactory() { } + + virtual wxFilterInputStream *NewStream(wxInputStream& stream) const = 0; + virtual wxFilterOutputStream *NewStream(wxOutputStream& stream) const = 0; + virtual wxFilterInputStream *NewStream(wxInputStream *stream) const = 0; + virtual wxFilterOutputStream *NewStream(wxOutputStream *stream) const = 0; + + static const wxFilterClassFactory *Find(const wxString& protocol, + wxStreamProtocolType type + = wxSTREAM_PROTOCOL); + + static const wxFilterClassFactory *GetFirst(); + const wxFilterClassFactory *GetNext() const { return m_next; } + + void PushFront() { Remove(); m_next = sm_first; sm_first = this; } + void Remove(); + +protected: + wxFilterClassFactory() : m_next(this) { } + + wxFilterClassFactory& operator=(const wxFilterClassFactory&) + { return *this; } + +private: + static wxFilterClassFactory *sm_first; + wxFilterClassFactory *m_next; + + DECLARE_ABSTRACT_CLASS(wxFilterClassFactory) +}; + +// ============================================================================ +// buffered streams +// ============================================================================ + +// --------------------------------------------------------------------------- +// Stream buffer: this class can be derived from and passed to +// wxBufferedStreams to implement custom buffering +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStreamBuffer +{ +public: + enum BufMode + { + read, + write, + read_write + }; + + wxStreamBuffer(wxStreamBase& stream, BufMode mode) + { + InitWithStream(stream, mode); + } + + wxStreamBuffer(size_t bufsize, wxInputStream& stream) + { + InitWithStream(stream, read); + SetBufferIO(bufsize); + } + + wxStreamBuffer(size_t bufsize, wxOutputStream& stream) + { + InitWithStream(stream, write); + SetBufferIO(bufsize); + } + + wxStreamBuffer(const wxStreamBuffer& buf); + virtual ~wxStreamBuffer(); + + // Filtered IO + virtual size_t Read(void *buffer, size_t size); + size_t Read(wxStreamBuffer *buf); + virtual size_t Write(const void *buffer, size_t size); + size_t Write(wxStreamBuffer *buf); + + virtual char Peek(); + virtual char GetChar(); + virtual void PutChar(char c); + virtual wxFileOffset Tell() const; + virtual wxFileOffset Seek(wxFileOffset pos, wxSeekMode mode); + + // Buffer control + void ResetBuffer(); + void Truncate(); + + // NB: the buffer must always be allocated with malloc() if takeOwn is + // true as it will be deallocated by free() + void SetBufferIO(void *start, void *end, bool takeOwnership = false); + void SetBufferIO(void *start, size_t len, bool takeOwnership = false); + void SetBufferIO(size_t bufsize); + void *GetBufferStart() const { return m_buffer_start; } + void *GetBufferEnd() const { return m_buffer_end; } + void *GetBufferPos() const { return m_buffer_pos; } + size_t GetBufferSize() const { return m_buffer_end - m_buffer_start; } + size_t GetIntPosition() const { return m_buffer_pos - m_buffer_start; } + void SetIntPosition(size_t pos) { m_buffer_pos = m_buffer_start + pos; } + size_t GetLastAccess() const { return m_buffer_end - m_buffer_start; } + size_t GetBytesLeft() const { return m_buffer_end - m_buffer_pos; } + + void Fixed(bool fixed) { m_fixed = fixed; } + void Flushable(bool f) { m_flushable = f; } + + bool FlushBuffer(); + bool FillBuffer(); + size_t GetDataLeft(); + + // misc accessors + wxStreamBase *GetStream() const { return m_stream; } + bool HasBuffer() const { return m_buffer_start != m_buffer_end; } + + bool IsFixed() const { return m_fixed; } + bool IsFlushable() const { return m_flushable; } + + // only for input/output buffers respectively, returns NULL otherwise + wxInputStream *GetInputStream() const; + wxOutputStream *GetOutputStream() const; + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, for compatibility only + wxDEPRECATED( wxStreamBase *Stream() ); +#endif // WXWIN_COMPATIBILITY_2_6 + + // this constructs a dummy wxStreamBuffer, used by (and exists for) + // wxMemoryStreams only, don't use! + wxStreamBuffer(BufMode mode); + +protected: + void GetFromBuffer(void *buffer, size_t size); + void PutToBuffer(const void *buffer, size_t size); + + // set the last error to the specified value if we didn't have it before + void SetError(wxStreamError err); + + // common part of several ctors + void Init(); + + // common part of ctors taking wxStreamBase parameter + void InitWithStream(wxStreamBase& stream, BufMode mode); + + // init buffer variables to be empty + void InitBuffer(); + + // free the buffer (always safe to call) + void FreeBuffer(); + + // the buffer itself: the pointers to its start and end and the current + // position in the buffer + char *m_buffer_start, + *m_buffer_end, + *m_buffer_pos; + + // the stream we're associated with + wxStreamBase *m_stream; + + // its mode + BufMode m_mode; + + // flags + bool m_destroybuf, // deallocate buffer? + m_fixed, + m_flushable; + + + wxDECLARE_NO_ASSIGN_CLASS(wxStreamBuffer); +}; + +// --------------------------------------------------------------------------- +// wxBufferedInputStream +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxBufferedInputStream : public wxFilterInputStream +{ +public: + // create a buffered stream on top of the specified low-level stream + // + // if a non NULL buffer is given to the stream, it will be deleted by it, + // otherwise a default 1KB buffer will be used + wxBufferedInputStream(wxInputStream& stream, + wxStreamBuffer *buffer = NULL); + + // ctor allowing to specify the buffer size, it's just a more convenient + // alternative to creating wxStreamBuffer, calling its SetBufferIO(bufsize) + // and using the ctor above + wxBufferedInputStream(wxInputStream& stream, size_t bufsize); + + + virtual ~wxBufferedInputStream(); + + char Peek(); + wxInputStream& Read(void *buffer, size_t size); + + // Position functions + wxFileOffset SeekI(wxFileOffset pos, wxSeekMode mode = wxFromStart); + wxFileOffset TellI() const; + bool IsSeekable() const { return m_parent_i_stream->IsSeekable(); } + + // the buffer given to the stream will be deleted by it + void SetInputStreamBuffer(wxStreamBuffer *buffer); + wxStreamBuffer *GetInputStreamBuffer() const { return m_i_streambuf; } + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, for compatibility only + wxDEPRECATED( wxStreamBuffer *InputStreamBuffer() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + virtual size_t OnSysRead(void *buffer, size_t bufsize); + virtual wxFileOffset OnSysSeek(wxFileOffset seek, wxSeekMode mode); + virtual wxFileOffset OnSysTell() const; + + wxStreamBuffer *m_i_streambuf; + + wxDECLARE_NO_COPY_CLASS(wxBufferedInputStream); +}; + +// ---------------------------------------------------------------------------- +// wxBufferedOutputStream +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxBufferedOutputStream : public wxFilterOutputStream +{ +public: + // create a buffered stream on top of the specified low-level stream + // + // if a non NULL buffer is given to the stream, it will be deleted by it, + // otherwise a default 1KB buffer will be used + wxBufferedOutputStream(wxOutputStream& stream, + wxStreamBuffer *buffer = NULL); + + // ctor allowing to specify the buffer size, it's just a more convenient + // alternative to creating wxStreamBuffer, calling its SetBufferIO(bufsize) + // and using the ctor above + wxBufferedOutputStream(wxOutputStream& stream, size_t bufsize); + + virtual ~wxBufferedOutputStream(); + + wxOutputStream& Write(const void *buffer, size_t size); + + // Position functions + wxFileOffset SeekO(wxFileOffset pos, wxSeekMode mode = wxFromStart); + wxFileOffset TellO() const; + bool IsSeekable() const { return m_parent_o_stream->IsSeekable(); } + + void Sync(); + bool Close(); + + wxFileOffset GetLength() const; + + // the buffer given to the stream will be deleted by it + void SetOutputStreamBuffer(wxStreamBuffer *buffer); + wxStreamBuffer *GetOutputStreamBuffer() const { return m_o_streambuf; } + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, for compatibility only + wxDEPRECATED( wxStreamBuffer *OutputStreamBuffer() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + virtual size_t OnSysWrite(const void *buffer, size_t bufsize); + virtual wxFileOffset OnSysSeek(wxFileOffset seek, wxSeekMode mode); + virtual wxFileOffset OnSysTell() const; + + wxStreamBuffer *m_o_streambuf; + + wxDECLARE_NO_COPY_CLASS(wxBufferedOutputStream); +}; + +#if WXWIN_COMPATIBILITY_2_6 + inline wxStreamBase *wxStreamBuffer::Stream() { return m_stream; } + inline wxStreamBuffer *wxBufferedInputStream::InputStreamBuffer() const { return m_i_streambuf; } + inline wxStreamBuffer *wxBufferedOutputStream::OutputStreamBuffer() const { return m_o_streambuf; } +#endif // WXWIN_COMPATIBILITY_2_6 + +// --------------------------------------------------------------------------- +// wxWrapperInputStream: forwards all IO to another stream. +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxWrapperInputStream : public wxFilterInputStream +{ +public: + // Constructor fully initializing the stream. The overload taking pointer + // takes ownership of the parent stream, the one taking reference does not. + // + // Notice that this class also has a default ctor but it's protected as the + // derived class is supposed to take care of calling InitParentStream() if + // it's used. + wxWrapperInputStream(wxInputStream& stream); + wxWrapperInputStream(wxInputStream* stream); + + // Override the base class methods to forward to the wrapped stream. + virtual wxFileOffset GetLength() const; + virtual bool IsSeekable() const; + +protected: + virtual size_t OnSysRead(void *buffer, size_t size); + virtual wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + virtual wxFileOffset OnSysTell() const; + + // Ensure that our own last error is the same as that of the real stream. + // + // This method is const because the error must be updated even from const + // methods (in other words, it really should have been mutable in the first + // place). + void SynchronizeLastError() const + { + const_cast<wxWrapperInputStream*>(this)-> + Reset(m_parent_i_stream->GetLastError()); + } + + // Default constructor, use InitParentStream() later. + wxWrapperInputStream(); + + // Set up the wrapped stream for an object initialized using the default + // constructor. The ownership logic is the same as above. + void InitParentStream(wxInputStream& stream); + void InitParentStream(wxInputStream* stream); + + wxDECLARE_NO_COPY_CLASS(wxWrapperInputStream); +}; + + +#endif // wxUSE_STREAMS + +#endif // _WX_WXSTREAM_H__ diff --git a/wxmsw/include/wx-3.0/wx/string.h b/wxmsw/include/wx-3.0/wx/string.h new file mode 100644 index 00000000..ef1a8d9a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/string.h @@ -0,0 +1,4323 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/string.h +// Purpose: wxString class +// Author: Vadim Zeitlin +// Modified by: +// Created: 29/01/98 +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/* + Efficient string class [more or less] compatible with MFC CString, + wxWidgets version 1 wxString and std::string and some handy functions + missing from string.h. +*/ + +#ifndef _WX_WXSTRING_H__ +#define _WX_WXSTRING_H__ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" // everybody should include this + +#if defined(__WXMAC__) || defined(__VISAGECPP__) + #include <ctype.h> +#endif + +#if defined(__VISAGECPP__) && __IBMCPP__ >= 400 + // problem in VACPP V4 with including stdlib.h multiple times + // strconv includes it anyway +# include <stdio.h> +# include <string.h> +# include <stdarg.h> +# include <limits.h> +#else +# include <string.h> +# include <stdio.h> +# include <stdarg.h> +# include <limits.h> +# include <stdlib.h> +#endif + +#include "wx/wxcrtbase.h" // for wxChar, wxStrlen() etc. +#include "wx/strvararg.h" +#include "wx/buffer.h" // for wxCharBuffer +#include "wx/strconv.h" // for wxConvertXXX() macros and wxMBConv classes +#include "wx/stringimpl.h" +#include "wx/stringops.h" +#include "wx/unichar.h" + +// by default we cache the mapping of the positions in UTF-8 string to the byte +// offset as this results in noticeable performance improvements for loops over +// strings using indices; comment out this line to disable this +// +// notice that this optimization is well worth using even in debug builds as it +// changes asymptotic complexity of algorithms using indices to iterate over +// wxString back to expected linear from quadratic +// +// also notice that wxTLS_TYPE() (__declspec(thread) in this case) is unsafe to +// use in DLL build under pre-Vista Windows so we disable this code for now, if +// anybody really needs to use UTF-8 build under Windows with this optimization +// it would have to be re-tested and probably corrected +// CS: under OSX release builds the string destructor/cache cleanup sometimes +// crashes, disable until we find the true reason or a better workaround +#if wxUSE_UNICODE_UTF8 && !defined(__WINDOWS__) && !defined(__WXOSX__) + #define wxUSE_STRING_POS_CACHE 1 +#else + #define wxUSE_STRING_POS_CACHE 0 +#endif + +#if wxUSE_STRING_POS_CACHE + #include "wx/tls.h" + + // change this 0 to 1 to enable additional (very expensive) asserts + // verifying that string caching logic works as expected + #if 0 + #define wxSTRING_CACHE_ASSERT(cond) wxASSERT(cond) + #else + #define wxSTRING_CACHE_ASSERT(cond) + #endif +#endif // wxUSE_STRING_POS_CACHE + +class WXDLLIMPEXP_FWD_BASE wxString; + +// unless this symbol is predefined to disable the compatibility functions, do +// use them +#ifndef WXWIN_COMPATIBILITY_STRING_PTR_AS_ITER + #define WXWIN_COMPATIBILITY_STRING_PTR_AS_ITER 1 +#endif + +namespace wxPrivate +{ + template <typename T> struct wxStringAsBufHelper; +} + +// --------------------------------------------------------------------------- +// macros +// --------------------------------------------------------------------------- + +// casts [unfortunately!] needed to call some broken functions which require +// "char *" instead of "const char *" +#define WXSTRINGCAST (wxChar *)(const wxChar *) +#define wxCSTRINGCAST (wxChar *)(const wxChar *) +#define wxMBSTRINGCAST (char *)(const char *) +#define wxWCSTRINGCAST (wchar_t *)(const wchar_t *) + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_6 + +// deprecated in favour of wxString::npos, don't use in new code +// +// maximum possible length for a string means "take all string" everywhere +#define wxSTRING_MAXLEN wxString::npos + +#endif // WXWIN_COMPATIBILITY_2_6 + +// --------------------------------------------------------------------------- +// global functions complementing standard C string library replacements for +// strlen() and portable strcasecmp() +//--------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_8 +// Use wxXXX() functions from wxcrt.h instead! These functions are for +// backwards compatibility only. + +// checks whether the passed in pointer is NULL and if the string is empty +wxDEPRECATED_MSG("use wxIsEmpty() instead") +inline bool IsEmpty(const char *p) { return (!p || !*p); } + +// safe version of strlen() (returns 0 if passed NULL pointer) +wxDEPRECATED_MSG("use wxStrlen() instead") +inline size_t Strlen(const char *psz) + { return psz ? strlen(psz) : 0; } + +// portable strcasecmp/_stricmp +wxDEPRECATED_MSG("use wxStricmp() instead") +inline int Stricmp(const char *psz1, const char *psz2) + { return wxCRT_StricmpA(psz1, psz2); } + +#endif // WXWIN_COMPATIBILITY_2_8 + +// ---------------------------------------------------------------------------- +// wxCStrData +// ---------------------------------------------------------------------------- + +// Lightweight object returned by wxString::c_str() and implicitly convertible +// to either const char* or const wchar_t*. +class wxCStrData +{ +private: + // Ctors; for internal use by wxString and wxCStrData only + wxCStrData(const wxString *str, size_t offset = 0, bool owned = false) + : m_str(str), m_offset(offset), m_owned(owned) {} + +public: + // Ctor constructs the object from char literal; they are needed to make + // operator?: compile and they intentionally take char*, not const char* + inline wxCStrData(char *buf); + inline wxCStrData(wchar_t *buf); + inline wxCStrData(const wxCStrData& data); + + inline ~wxCStrData(); + + // AsWChar() and AsChar() can't be defined here as they use wxString and so + // must come after it and because of this won't be inlined when called from + // wxString methods (without a lot of work to extract these wxString methods + // from inside the class itself). But we still define them being inline + // below to let compiler inline them from elsewhere. And because of this we + // must declare them as inline here because otherwise some compilers give + // warnings about them, e.g. mingw32 3.4.5 warns about "<symbol> defined + // locally after being referenced with dllimport linkage" while IRIX + // mipsPro 7.4 warns about "function declared inline after being called". + inline const wchar_t* AsWChar() const; + operator const wchar_t*() const { return AsWChar(); } + + inline const char* AsChar() const; + const unsigned char* AsUnsignedChar() const + { return (const unsigned char *) AsChar(); } + operator const char*() const { return AsChar(); } + operator const unsigned char*() const { return AsUnsignedChar(); } + + operator const void*() const { return AsChar(); } + + // returns buffers that are valid as long as the associated wxString exists + const wxScopedCharBuffer AsCharBuf() const + { + return wxScopedCharBuffer::CreateNonOwned(AsChar()); + } + + const wxScopedWCharBuffer AsWCharBuf() const + { + return wxScopedWCharBuffer::CreateNonOwned(AsWChar()); + } + + inline wxString AsString() const; + + // returns the value as C string in internal representation (equivalent + // to AsString().wx_str(), but more efficient) + const wxStringCharType *AsInternal() const; + + // allow expressions like "c_str()[0]": + inline wxUniChar operator[](size_t n) const; + wxUniChar operator[](int n) const { return operator[](size_t(n)); } + wxUniChar operator[](long n) const { return operator[](size_t(n)); } +#ifndef wxSIZE_T_IS_UINT + wxUniChar operator[](unsigned int n) const { return operator[](size_t(n)); } +#endif // size_t != unsigned int + + // These operators are needed to emulate the pointer semantics of c_str(): + // expressions like "wxChar *p = str.c_str() + 1;" should continue to work + // (we need both versions to resolve ambiguities). Note that this means + // the 'n' value is interpreted as addition to char*/wchar_t* pointer, it + // is *not* number of Unicode characters in wxString. + wxCStrData operator+(int n) const + { return wxCStrData(m_str, m_offset + n, m_owned); } + wxCStrData operator+(long n) const + { return wxCStrData(m_str, m_offset + n, m_owned); } + wxCStrData operator+(size_t n) const + { return wxCStrData(m_str, m_offset + n, m_owned); } + + // and these for "str.c_str() + (p2 - p1)" (it also works for any integer + // expression but it must be ptrdiff_t and not e.g. int to work in this + // example): + wxCStrData operator-(ptrdiff_t n) const + { + wxASSERT_MSG( n <= (ptrdiff_t)m_offset, + wxT("attempt to construct address before the beginning of the string") ); + return wxCStrData(m_str, m_offset - n, m_owned); + } + + // this operator is needed to make expressions like "*c_str()" or + // "*(c_str() + 2)" work + inline wxUniChar operator*() const; + +private: + // the wxString this object was returned for + const wxString *m_str; + // Offset into c_str() return value. Note that this is *not* offset in + // m_str in Unicode characters. Instead, it is index into the + // char*/wchar_t* buffer returned by c_str(). It's interpretation depends + // on how is the wxCStrData instance used: if it is eventually cast to + // const char*, m_offset will be in bytes form string's start; if it is + // cast to const wchar_t*, it will be in wchar_t values. + size_t m_offset; + // should m_str be deleted, i.e. is it owned by us? + bool m_owned; + + friend class WXDLLIMPEXP_FWD_BASE wxString; +}; + +// ---------------------------------------------------------------------------- +// wxStringPrintfMixin +// --------------------------------------------------------------------------- + +// NB: VC6 has a bug that causes linker errors if you have template methods +// in a class using __declspec(dllimport). The solution is to split such +// class into two classes, one that contains the template methods and does +// *not* use WXDLLIMPEXP_BASE and another class that contains the rest +// (with DLL linkage). +// +// We only do this for VC6 here, because the code is less efficient +// (Printf() has to use dynamic_cast<>) and because OpenWatcom compiler +// cannot compile this code. + +#if defined(__VISUALC__) && __VISUALC__ < 1300 + #define wxNEEDS_WXSTRING_PRINTF_MIXIN +#endif + +#ifdef wxNEEDS_WXSTRING_PRINTF_MIXIN +// this class contains implementation of wxString's vararg methods, it's +// exported from wxBase DLL +class WXDLLIMPEXP_BASE wxStringPrintfMixinBase +{ +protected: + wxStringPrintfMixinBase() {} + +#if !wxUSE_UTF8_LOCALE_ONLY + int DoPrintfWchar(const wxChar *format, ...); + static wxString DoFormatWchar(const wxChar *format, ...); +#endif +#if wxUSE_UNICODE_UTF8 + int DoPrintfUtf8(const char *format, ...); + static wxString DoFormatUtf8(const char *format, ...); +#endif +}; + +// this class contains template wrappers for wxString's vararg methods, it's +// intentionally *not* exported from the DLL in order to fix the VC6 bug +// described above +class wxStringPrintfMixin : public wxStringPrintfMixinBase +{ +private: + // to further complicate things, we can't return wxString from + // wxStringPrintfMixin::Format() because wxString is not yet declared at + // this point; the solution is to use this fake type trait template - this + // way the compiler won't know the return type until Format() is used + // (this doesn't compile with Watcom, but VC6 compiles it just fine): + template<typename T> struct StringReturnType + { + typedef wxString type; + }; + +public: + // these are duplicated wxString methods, they're also declared below + // if !wxNEEDS_WXSTRING_PRINTF_MIXIN: + + // static wxString Format(const wString& format, ...) WX_ATTRIBUTE_PRINTF_1; + WX_DEFINE_VARARG_FUNC_SANS_N0(static typename StringReturnType<T1>::type, + Format, 1, (const wxFormatString&), + DoFormatWchar, DoFormatUtf8) + // We have to implement the version without template arguments manually + // because of the StringReturnType<> hack, although WX_DEFINE_VARARG_FUNC + // normally does it itself. It has to be a template so that we can use + // the hack, even though there's no real template parameter. We can't move + // it to wxStrig, because it would shadow these versions of Format() then. + template<typename T> + inline static typename StringReturnType<T>::type + Format(const T& fmt) + { + // NB: this doesn't compile if T is not (some form of) a string; + // this makes Format's prototype equivalent to + // Format(const wxFormatString& fmt) + return DoFormatWchar(wxFormatString(fmt)); + } + + // int Printf(const wxString& format, ...); + WX_DEFINE_VARARG_FUNC(int, Printf, 1, (const wxFormatString&), + DoPrintfWchar, DoPrintfUtf8) + // int sprintf(const wxString& format, ...) WX_ATTRIBUTE_PRINTF_2; + WX_DEFINE_VARARG_FUNC(int, sprintf, 1, (const wxFormatString&), + DoPrintfWchar, DoPrintfUtf8) + +protected: + wxStringPrintfMixin() : wxStringPrintfMixinBase() {} +}; +#endif // wxNEEDS_WXSTRING_PRINTF_MIXIN + + +// ---------------------------------------------------------------------------- +// wxString: string class trying to be compatible with std::string, MFC +// CString and wxWindows 1.x wxString all at once +// --------------------------------------------------------------------------- + +#ifdef wxNEEDS_WXSTRING_PRINTF_MIXIN + // "non dll-interface class 'wxStringPrintfMixin' used as base interface + // for dll-interface class 'wxString'" -- this is OK in our case + #pragma warning (push) + #pragma warning (disable:4275) +#endif + +#if wxUSE_UNICODE_UTF8 +// see the comment near wxString::iterator for why we need this +class WXDLLIMPEXP_BASE wxStringIteratorNode +{ +public: + wxStringIteratorNode() + : m_str(NULL), m_citer(NULL), m_iter(NULL), m_prev(NULL), m_next(NULL) {} + wxStringIteratorNode(const wxString *str, + wxStringImpl::const_iterator *citer) + { DoSet(str, citer, NULL); } + wxStringIteratorNode(const wxString *str, wxStringImpl::iterator *iter) + { DoSet(str, NULL, iter); } + ~wxStringIteratorNode() + { clear(); } + + inline void set(const wxString *str, wxStringImpl::const_iterator *citer) + { clear(); DoSet(str, citer, NULL); } + inline void set(const wxString *str, wxStringImpl::iterator *iter) + { clear(); DoSet(str, NULL, iter); } + + const wxString *m_str; + wxStringImpl::const_iterator *m_citer; + wxStringImpl::iterator *m_iter; + wxStringIteratorNode *m_prev, *m_next; + +private: + inline void clear(); + inline void DoSet(const wxString *str, + wxStringImpl::const_iterator *citer, + wxStringImpl::iterator *iter); + + // the node belongs to a particular iterator instance, it's not copied + // when a copy of the iterator is made + wxDECLARE_NO_COPY_CLASS(wxStringIteratorNode); +}; +#endif // wxUSE_UNICODE_UTF8 + +class WXDLLIMPEXP_BASE wxString +#ifdef wxNEEDS_WXSTRING_PRINTF_MIXIN + : public wxStringPrintfMixin +#endif +{ + // NB: special care was taken in arranging the member functions in such order + // that all inline functions can be effectively inlined, verify that all + // performance critical functions are still inlined if you change order! +public: + // an 'invalid' value for string index, moved to this place due to a CW bug + static const size_t npos; + +private: + // if we hadn't made these operators private, it would be possible to + // compile "wxString s; s = 17;" without any warnings as 17 is implicitly + // converted to char in C and we do have operator=(char) + // + // NB: we don't need other versions (short/long and unsigned) as attempt + // to assign another numeric type to wxString will now result in + // ambiguity between operator=(char) and operator=(int) + wxString& operator=(int); + + // these methods are not implemented - there is _no_ conversion from int to + // string, you're doing something wrong if the compiler wants to call it! + // + // try `s << i' or `s.Printf("%d", i)' instead + wxString(int); + + + // buffer for holding temporary substring when using any of the methods + // that take (char*,size_t) or (wchar_t*,size_t) arguments: + template<typename T> + struct SubstrBufFromType + { + T data; + size_t len; + + SubstrBufFromType(const T& data_, size_t len_) + : data(data_), len(len_) + { + wxASSERT_MSG( len != npos, "must have real length" ); + } + }; + +#if wxUSE_UNICODE_UTF8 + // even char* -> char* needs conversion, from locale charset to UTF-8 + typedef SubstrBufFromType<wxScopedCharBuffer> SubstrBufFromWC; + typedef SubstrBufFromType<wxScopedCharBuffer> SubstrBufFromMB; +#elif wxUSE_UNICODE_WCHAR + typedef SubstrBufFromType<const wchar_t*> SubstrBufFromWC; + typedef SubstrBufFromType<wxScopedWCharBuffer> SubstrBufFromMB; +#else + typedef SubstrBufFromType<const char*> SubstrBufFromMB; + typedef SubstrBufFromType<wxScopedCharBuffer> SubstrBufFromWC; +#endif + + + // Functions implementing primitive operations on string data; wxString + // methods and iterators are implemented in terms of it. The differences + // between UTF-8 and wchar_t* representations of the string are mostly + // contained here. + +#if wxUSE_UNICODE_UTF8 + static SubstrBufFromMB ConvertStr(const char *psz, size_t nLength, + const wxMBConv& conv); + static SubstrBufFromWC ConvertStr(const wchar_t *pwz, size_t nLength, + const wxMBConv& conv); +#elif wxUSE_UNICODE_WCHAR + static SubstrBufFromMB ConvertStr(const char *psz, size_t nLength, + const wxMBConv& conv); +#else + static SubstrBufFromWC ConvertStr(const wchar_t *pwz, size_t nLength, + const wxMBConv& conv); +#endif + +#if !wxUSE_UNICODE_UTF8 // wxUSE_UNICODE_WCHAR or !wxUSE_UNICODE + // returns C string encoded as the implementation expects: + #if wxUSE_UNICODE + static const wchar_t* ImplStr(const wchar_t* str) + { return str ? str : wxT(""); } + static const SubstrBufFromWC ImplStr(const wchar_t* str, size_t n) + { return SubstrBufFromWC(str, (str && n == npos) ? wxWcslen(str) : n); } + static wxScopedWCharBuffer ImplStr(const char* str, + const wxMBConv& conv = wxConvLibc) + { return ConvertStr(str, npos, conv).data; } + static SubstrBufFromMB ImplStr(const char* str, size_t n, + const wxMBConv& conv = wxConvLibc) + { return ConvertStr(str, n, conv); } + #else + static const char* ImplStr(const char* str, + const wxMBConv& WXUNUSED(conv) = wxConvLibc) + { return str ? str : ""; } + static const SubstrBufFromMB ImplStr(const char* str, size_t n, + const wxMBConv& WXUNUSED(conv) = wxConvLibc) + { return SubstrBufFromMB(str, (str && n == npos) ? wxStrlen(str) : n); } + static wxScopedCharBuffer ImplStr(const wchar_t* str) + { return ConvertStr(str, npos, wxConvLibc).data; } + static SubstrBufFromWC ImplStr(const wchar_t* str, size_t n) + { return ConvertStr(str, n, wxConvLibc); } + #endif + + // translates position index in wxString to/from index in underlying + // wxStringImpl: + static size_t PosToImpl(size_t pos) { return pos; } + static void PosLenToImpl(size_t pos, size_t len, + size_t *implPos, size_t *implLen) + { *implPos = pos; *implLen = len; } + static size_t LenToImpl(size_t len) { return len; } + static size_t PosFromImpl(size_t pos) { return pos; } + + // we don't want to define these as empty inline functions as it could + // result in noticeable (and quite unnecessary in non-UTF-8 build) slowdown + // in debug build where the inline functions are not effectively inlined + #define wxSTRING_INVALIDATE_CACHE() + #define wxSTRING_INVALIDATE_CACHED_LENGTH() + #define wxSTRING_UPDATE_CACHED_LENGTH(n) + #define wxSTRING_SET_CACHED_LENGTH(n) + +#else // wxUSE_UNICODE_UTF8 + + static wxScopedCharBuffer ImplStr(const char* str, + const wxMBConv& conv = wxConvLibc) + { return ConvertStr(str, npos, conv).data; } + static SubstrBufFromMB ImplStr(const char* str, size_t n, + const wxMBConv& conv = wxConvLibc) + { return ConvertStr(str, n, conv); } + + static wxScopedCharBuffer ImplStr(const wchar_t* str) + { return ConvertStr(str, npos, wxMBConvUTF8()).data; } + static SubstrBufFromWC ImplStr(const wchar_t* str, size_t n) + { return ConvertStr(str, n, wxMBConvUTF8()); } + +#if wxUSE_STRING_POS_CACHE + // this is an extremely simple cache used by PosToImpl(): each cache element + // contains the string it applies to and the index corresponding to the last + // used position in this wxString in its m_impl string + // + // NB: notice that this struct (and nested Element one) must be a POD or we + // wouldn't be able to use a thread-local variable of this type, in + // particular it should have no ctor -- we rely on statics being + // initialized to 0 instead + struct Cache + { + enum { SIZE = 8 }; + + struct Element + { + const wxString *str; // the string to which this element applies + size_t pos, // the cached index in this string + impl, // the corresponding position in its m_impl + len; // cached length or npos if unknown + + // reset cached index to 0 + void ResetPos() { pos = impl = 0; } + + // reset position and length + void Reset() { ResetPos(); len = npos; } + }; + + // cache the indices mapping for the last few string used + Element cached[SIZE]; + + // the last used index + unsigned lastUsed; + }; + +#ifndef wxHAS_COMPILER_TLS + // we must use an accessor function and not a static variable when the TLS + // variables support is implemented in the library (and not by the compiler) + // because the global s_cache variable could be not yet initialized when a + // ctor of another global object is executed and if that ctor uses any + // wxString methods, bad things happen + // + // however notice that this approach does not work when compiler TLS is used, + // at least not with g++ 4.1.2 under amd64 as it apparently compiles code + // using this accessor incorrectly when optimizations are enabled (-O2 is + // enough) -- luckily we don't need it then neither as static __thread + // variables are initialized by 0 anyhow then and so we can use the variable + // directly + WXEXPORT static Cache& GetCache() + { + static wxTLS_TYPE(Cache) s_cache; + + return wxTLS_VALUE(s_cache); + } + + // this helper struct is used to ensure that GetCache() is called during + // static initialization time, i.e. before any threads creation, as otherwise + // the static s_cache construction inside GetCache() wouldn't be MT-safe + friend struct wxStrCacheInitializer; +#else // wxHAS_COMPILER_TLS + static wxTLS_TYPE(Cache) ms_cache; + static Cache& GetCache() { return wxTLS_VALUE(ms_cache); } +#endif // !wxHAS_COMPILER_TLS/wxHAS_COMPILER_TLS + + static Cache::Element *GetCacheBegin() { return GetCache().cached; } + static Cache::Element *GetCacheEnd() { return GetCacheBegin() + Cache::SIZE; } + static unsigned& LastUsedCacheElement() { return GetCache().lastUsed; } + + // this is used in debug builds only to provide a convenient function, + // callable from a debugger, to show the cache contents + friend struct wxStrCacheDumper; + + // uncomment this to have access to some profiling statistics on program + // termination + //#define wxPROFILE_STRING_CACHE + +#ifdef wxPROFILE_STRING_CACHE + static struct PosToImplCacheStats + { + unsigned postot, // total non-trivial calls to PosToImpl + poshits, // cache hits from PosToImpl() + mishits, // cached position beyond the needed one + sumpos, // sum of all positions, used to compute the + // average position after dividing by postot + sumofs, // sum of all offsets after using the cache, used to + // compute the average after dividing by hits + lentot, // number of total calls to length() + lenhits; // number of cache hits in length() + } ms_cacheStats; + + friend struct wxStrCacheStatsDumper; + + #define wxCACHE_PROFILE_FIELD_INC(field) ms_cacheStats.field++ + #define wxCACHE_PROFILE_FIELD_ADD(field, val) ms_cacheStats.field += (val) +#else // !wxPROFILE_STRING_CACHE + #define wxCACHE_PROFILE_FIELD_INC(field) + #define wxCACHE_PROFILE_FIELD_ADD(field, val) +#endif // wxPROFILE_STRING_CACHE/!wxPROFILE_STRING_CACHE + + // note: it could seem that the functions below shouldn't be inline because + // they are big, contain loops and so the compiler shouldn't be able to + // inline them anyhow, however moving them into string.cpp does decrease the + // code performance by ~5%, at least when using g++ 4.1 so do keep them here + // unless tests show that it's not advantageous any more + + // return the pointer to the cache element for this string or NULL if not + // cached + Cache::Element *FindCacheElement() const + { + // profiling seems to show a small but consistent gain if we use this + // simple loop instead of starting from the last used element (there are + // a lot of misses in this function...) + Cache::Element * const cacheBegin = GetCacheBegin(); +#ifndef wxHAS_COMPILER_TLS + // during destruction tls calls may return NULL, in this case return NULL + // immediately without accessing anything else + if ( cacheBegin == NULL ) + return NULL; +#endif + Cache::Element * const cacheEnd = GetCacheEnd(); + for ( Cache::Element *c = cacheBegin; c != cacheEnd; c++ ) + { + if ( c->str == this ) + return c; + } + + return NULL; + } + + // unlike FindCacheElement(), this one always returns a valid pointer to the + // cache element for this string, it may have valid last cached position and + // its corresponding index in the byte string or not + Cache::Element *GetCacheElement() const + { + Cache::Element * const cacheBegin = GetCacheBegin(); + Cache::Element * const cacheEnd = GetCacheEnd(); + Cache::Element * const cacheStart = cacheBegin + LastUsedCacheElement(); + + // check the last used first, this does no (measurable) harm for a miss + // but does help for simple loops addressing the same string all the time + if ( cacheStart->str == this ) + return cacheStart; + + // notice that we're going to check cacheStart again inside this call but + // profiling shows that it's still faster to use a simple loop like + // inside FindCacheElement() than manually looping with wrapping starting + // from the cache entry after the start one + Cache::Element *c = FindCacheElement(); + if ( !c ) + { + // claim the next cache entry for this string + c = cacheStart; + if ( ++c == cacheEnd ) + c = cacheBegin; + + c->str = this; + c->Reset(); + + // and remember the last used element + LastUsedCacheElement() = c - cacheBegin; + } + + return c; + } + + size_t DoPosToImpl(size_t pos) const + { + wxCACHE_PROFILE_FIELD_INC(postot); + + // NB: although the case of pos == 1 (and offset from cached position + // equal to 1) are common, nothing is gained by writing special code + // for handling them, the compiler (at least g++ 4.1 used) seems to + // optimize the code well enough on its own + + wxCACHE_PROFILE_FIELD_ADD(sumpos, pos); + + Cache::Element * const cache = GetCacheElement(); + + // cached position can't be 0 so if it is, it means that this entry was + // used for length caching only so far, i.e. it doesn't count as a hit + // from our point of view + if ( cache->pos ) + { + wxCACHE_PROFILE_FIELD_INC(poshits); + } + + if ( pos == cache->pos ) + return cache->impl; + + // this seems to happen only rarely so just reset the cache in this case + // instead of complicating code even further by seeking backwards in this + // case + if ( cache->pos > pos ) + { + wxCACHE_PROFILE_FIELD_INC(mishits); + + cache->ResetPos(); + } + + wxCACHE_PROFILE_FIELD_ADD(sumofs, pos - cache->pos); + + + wxStringImpl::const_iterator i(m_impl.begin() + cache->impl); + for ( size_t n = cache->pos; n < pos; n++ ) + wxStringOperations::IncIter(i); + + cache->pos = pos; + cache->impl = i - m_impl.begin(); + + wxSTRING_CACHE_ASSERT( + (int)cache->impl == (begin() + pos).impl() - m_impl.begin() ); + + return cache->impl; + } + + void InvalidateCache() + { + Cache::Element * const cache = FindCacheElement(); + if ( cache ) + cache->Reset(); + } + + void InvalidateCachedLength() + { + Cache::Element * const cache = FindCacheElement(); + if ( cache ) + cache->len = npos; + } + + void SetCachedLength(size_t len) + { + // we optimistically cache the length here even if the string wasn't + // present in the cache before, this seems to do no harm and the + // potential for avoiding length recomputation for long strings looks + // interesting + GetCacheElement()->len = len; + } + + void UpdateCachedLength(ptrdiff_t delta) + { + Cache::Element * const cache = FindCacheElement(); + if ( cache && cache->len != npos ) + { + wxSTRING_CACHE_ASSERT( (ptrdiff_t)cache->len + delta >= 0 ); + + cache->len += delta; + } + } + + #define wxSTRING_INVALIDATE_CACHE() InvalidateCache() + #define wxSTRING_INVALIDATE_CACHED_LENGTH() InvalidateCachedLength() + #define wxSTRING_UPDATE_CACHED_LENGTH(n) UpdateCachedLength(n) + #define wxSTRING_SET_CACHED_LENGTH(n) SetCachedLength(n) +#else // !wxUSE_STRING_POS_CACHE + size_t DoPosToImpl(size_t pos) const + { + return (begin() + pos).impl() - m_impl.begin(); + } + + #define wxSTRING_INVALIDATE_CACHE() + #define wxSTRING_INVALIDATE_CACHED_LENGTH() + #define wxSTRING_UPDATE_CACHED_LENGTH(n) + #define wxSTRING_SET_CACHED_LENGTH(n) +#endif // wxUSE_STRING_POS_CACHE/!wxUSE_STRING_POS_CACHE + + size_t PosToImpl(size_t pos) const + { + return pos == 0 || pos == npos ? pos : DoPosToImpl(pos); + } + + void PosLenToImpl(size_t pos, size_t len, size_t *implPos, size_t *implLen) const; + + size_t LenToImpl(size_t len) const + { + size_t pos, len2; + PosLenToImpl(0, len, &pos, &len2); + return len2; + } + + size_t PosFromImpl(size_t pos) const + { + if ( pos == 0 || pos == npos ) + return pos; + else + return const_iterator(this, m_impl.begin() + pos) - begin(); + } +#endif // !wxUSE_UNICODE_UTF8/wxUSE_UNICODE_UTF8 + +public: + // standard types + typedef wxUniChar value_type; + typedef wxUniChar char_type; + typedef wxUniCharRef reference; + typedef wxChar* pointer; + typedef const wxChar* const_pointer; + + typedef size_t size_type; + typedef wxUniChar const_reference; + +#if wxUSE_STD_STRING + #if wxUSE_UNICODE_UTF8 + // random access is not O(1), as required by Random Access Iterator + #define WX_STR_ITERATOR_TAG std::bidirectional_iterator_tag + #else + #define WX_STR_ITERATOR_TAG std::random_access_iterator_tag + #endif + #define WX_DEFINE_ITERATOR_CATEGORY(cat) typedef cat iterator_category; +#else + // not defining iterator_category at all in this case is better than defining + // it as some dummy type -- at least it results in more intelligible error + // messages + #define WX_DEFINE_ITERATOR_CATEGORY(cat) +#endif + + #define WX_STR_ITERATOR_IMPL(iterator_name, pointer_type, reference_type) \ + private: \ + typedef wxStringImpl::iterator_name underlying_iterator; \ + public: \ + WX_DEFINE_ITERATOR_CATEGORY(WX_STR_ITERATOR_TAG) \ + typedef wxUniChar value_type; \ + typedef ptrdiff_t difference_type; \ + typedef reference_type reference; \ + typedef pointer_type pointer; \ + \ + reference operator[](size_t n) const { return *(*this + n); } \ + \ + iterator_name& operator++() \ + { wxStringOperations::IncIter(m_cur); return *this; } \ + iterator_name& operator--() \ + { wxStringOperations::DecIter(m_cur); return *this; } \ + iterator_name operator++(int) \ + { \ + iterator_name tmp = *this; \ + wxStringOperations::IncIter(m_cur); \ + return tmp; \ + } \ + iterator_name operator--(int) \ + { \ + iterator_name tmp = *this; \ + wxStringOperations::DecIter(m_cur); \ + return tmp; \ + } \ + \ + iterator_name& operator+=(ptrdiff_t n) \ + { \ + m_cur = wxStringOperations::AddToIter(m_cur, n); \ + return *this; \ + } \ + iterator_name& operator-=(ptrdiff_t n) \ + { \ + m_cur = wxStringOperations::AddToIter(m_cur, -n); \ + return *this; \ + } \ + \ + difference_type operator-(const iterator_name& i) const \ + { return wxStringOperations::DiffIters(m_cur, i.m_cur); } \ + \ + bool operator==(const iterator_name& i) const \ + { return m_cur == i.m_cur; } \ + bool operator!=(const iterator_name& i) const \ + { return m_cur != i.m_cur; } \ + \ + bool operator<(const iterator_name& i) const \ + { return m_cur < i.m_cur; } \ + bool operator>(const iterator_name& i) const \ + { return m_cur > i.m_cur; } \ + bool operator<=(const iterator_name& i) const \ + { return m_cur <= i.m_cur; } \ + bool operator>=(const iterator_name& i) const \ + { return m_cur >= i.m_cur; } \ + \ + private: \ + /* for internal wxString use only: */ \ + underlying_iterator impl() const { return m_cur; } \ + \ + friend class wxString; \ + friend class wxCStrData; \ + \ + private: \ + underlying_iterator m_cur + + class WXDLLIMPEXP_FWD_BASE const_iterator; + +#if wxUSE_UNICODE_UTF8 + // NB: In UTF-8 build, (non-const) iterator needs to keep reference + // to the underlying wxStringImpl, because UTF-8 is variable-length + // encoding and changing the value pointer to by an iterator (using + // its operator*) requires calling wxStringImpl::replace() if the old + // and new values differ in their encoding's length. + // + // Furthermore, the replace() call may invalid all iterators for the + // string, so we have to keep track of outstanding iterators and update + // them if replace() happens. + // + // This is implemented by maintaining linked list of iterators for every + // string and traversing it in wxUniCharRef::operator=(). Head of the + // list is stored in wxString. (FIXME-UTF8) + + class WXDLLIMPEXP_BASE iterator + { + WX_STR_ITERATOR_IMPL(iterator, wxChar*, wxUniCharRef); + + public: + iterator() {} + iterator(const iterator& i) + : m_cur(i.m_cur), m_node(i.str(), &m_cur) {} + iterator& operator=(const iterator& i) + { + if (&i != this) + { + m_cur = i.m_cur; + m_node.set(i.str(), &m_cur); + } + return *this; + } + + reference operator*() + { return wxUniCharRef::CreateForString(*str(), m_cur); } + + iterator operator+(ptrdiff_t n) const + { return iterator(str(), wxStringOperations::AddToIter(m_cur, n)); } + iterator operator-(ptrdiff_t n) const + { return iterator(str(), wxStringOperations::AddToIter(m_cur, -n)); } + + // Normal iterators need to be comparable with the const_iterators so + // declare the comparison operators and implement them below after the + // full const_iterator declaration. + bool operator==(const const_iterator& i) const; + bool operator!=(const const_iterator& i) const; + bool operator<(const const_iterator& i) const; + bool operator>(const const_iterator& i) const; + bool operator<=(const const_iterator& i) const; + bool operator>=(const const_iterator& i) const; + + private: + iterator(wxString *wxstr, underlying_iterator ptr) + : m_cur(ptr), m_node(wxstr, &m_cur) {} + + wxString* str() const { return const_cast<wxString*>(m_node.m_str); } + + wxStringIteratorNode m_node; + + friend class const_iterator; + }; + + class WXDLLIMPEXP_BASE const_iterator + { + // NB: reference_type is intentionally value, not reference, the character + // may be encoded differently in wxString data: + WX_STR_ITERATOR_IMPL(const_iterator, const wxChar*, wxUniChar); + + public: + const_iterator() {} + const_iterator(const const_iterator& i) + : m_cur(i.m_cur), m_node(i.str(), &m_cur) {} + const_iterator(const iterator& i) + : m_cur(i.m_cur), m_node(i.str(), &m_cur) {} + + const_iterator& operator=(const const_iterator& i) + { + if (&i != this) + { + m_cur = i.m_cur; + m_node.set(i.str(), &m_cur); + } + return *this; + } + const_iterator& operator=(const iterator& i) + { m_cur = i.m_cur; m_node.set(i.str(), &m_cur); return *this; } + + reference operator*() const + { return wxStringOperations::DecodeChar(m_cur); } + + const_iterator operator+(ptrdiff_t n) const + { return const_iterator(str(), wxStringOperations::AddToIter(m_cur, n)); } + const_iterator operator-(ptrdiff_t n) const + { return const_iterator(str(), wxStringOperations::AddToIter(m_cur, -n)); } + + // Notice that comparison operators taking non-const iterator are not + // needed here because of the implicit conversion from non-const iterator + // to const ones ensure that the versions for const_iterator declared + // inside WX_STR_ITERATOR_IMPL can be used. + + private: + // for internal wxString use only: + const_iterator(const wxString *wxstr, underlying_iterator ptr) + : m_cur(ptr), m_node(wxstr, &m_cur) {} + + const wxString* str() const { return m_node.m_str; } + + wxStringIteratorNode m_node; + }; + + size_t IterToImplPos(wxString::iterator i) const + { return wxStringImpl::const_iterator(i.impl()) - m_impl.begin(); } + + iterator GetIterForNthChar(size_t n) + { return iterator(this, m_impl.begin() + PosToImpl(n)); } + const_iterator GetIterForNthChar(size_t n) const + { return const_iterator(this, m_impl.begin() + PosToImpl(n)); } +#else // !wxUSE_UNICODE_UTF8 + + class WXDLLIMPEXP_BASE iterator + { + WX_STR_ITERATOR_IMPL(iterator, wxChar*, wxUniCharRef); + + public: + iterator() {} + iterator(const iterator& i) : m_cur(i.m_cur) {} + + reference operator*() + { return wxUniCharRef::CreateForString(m_cur); } + + iterator operator+(ptrdiff_t n) const + { return iterator(wxStringOperations::AddToIter(m_cur, n)); } + iterator operator-(ptrdiff_t n) const + { return iterator(wxStringOperations::AddToIter(m_cur, -n)); } + + // As in UTF-8 case above, define comparison operators taking + // const_iterator too. + bool operator==(const const_iterator& i) const; + bool operator!=(const const_iterator& i) const; + bool operator<(const const_iterator& i) const; + bool operator>(const const_iterator& i) const; + bool operator<=(const const_iterator& i) const; + bool operator>=(const const_iterator& i) const; + + private: + // for internal wxString use only: + iterator(underlying_iterator ptr) : m_cur(ptr) {} + iterator(wxString *WXUNUSED(str), underlying_iterator ptr) : m_cur(ptr) {} + + friend class const_iterator; + }; + + class WXDLLIMPEXP_BASE const_iterator + { + // NB: reference_type is intentionally value, not reference, the character + // may be encoded differently in wxString data: + WX_STR_ITERATOR_IMPL(const_iterator, const wxChar*, wxUniChar); + + public: + const_iterator() {} + const_iterator(const const_iterator& i) : m_cur(i.m_cur) {} + const_iterator(const iterator& i) : m_cur(i.m_cur) {} + + reference operator*() const + { return wxStringOperations::DecodeChar(m_cur); } + + const_iterator operator+(ptrdiff_t n) const + { return const_iterator(wxStringOperations::AddToIter(m_cur, n)); } + const_iterator operator-(ptrdiff_t n) const + { return const_iterator(wxStringOperations::AddToIter(m_cur, -n)); } + + // As in UTF-8 case above, we don't need comparison operators taking + // iterator because we have an implicit conversion from iterator to + // const_iterator so the operators declared by WX_STR_ITERATOR_IMPL will + // be used. + + private: + // for internal wxString use only: + const_iterator(underlying_iterator ptr) : m_cur(ptr) {} + const_iterator(const wxString *WXUNUSED(str), underlying_iterator ptr) + : m_cur(ptr) {} + }; + + iterator GetIterForNthChar(size_t n) { return begin() + n; } + const_iterator GetIterForNthChar(size_t n) const { return begin() + n; } +#endif // wxUSE_UNICODE_UTF8/!wxUSE_UNICODE_UTF8 + + #undef WX_STR_ITERATOR_TAG + #undef WX_STR_ITERATOR_IMPL + + // This method is mostly used by wxWidgets itself and return the offset of + // the given iterator in bytes relative to the start of the buffer + // representing the current string contents in the current locale encoding. + // + // It is inefficient as it involves converting part of the string to this + // encoding (and also unsafe as it simply returns 0 if the conversion fails) + // and so should be avoided if possible, wx itself only uses it to implement + // backwards-compatible API. + ptrdiff_t IterOffsetInMBStr(const const_iterator& i) const + { + const wxString str(begin(), i); + + // This is logically equivalent to strlen(str.mb_str()) but avoids + // actually converting the string to multibyte and just computes the + // length that it would have after conversion. + size_t ofs = wxConvLibc.FromWChar(NULL, 0, str.wc_str(), str.length()); + return ofs == wxCONV_FAILED ? 0 : static_cast<ptrdiff_t>(ofs); + } + + friend class iterator; + friend class const_iterator; + + template <typename T> + class reverse_iterator_impl + { + public: + typedef T iterator_type; + + WX_DEFINE_ITERATOR_CATEGORY(typename T::iterator_category) + typedef typename T::value_type value_type; + typedef typename T::difference_type difference_type; + typedef typename T::reference reference; + typedef typename T::pointer *pointer; + + reverse_iterator_impl() {} + reverse_iterator_impl(iterator_type i) : m_cur(i) {} + reverse_iterator_impl(const reverse_iterator_impl& ri) + : m_cur(ri.m_cur) {} + + iterator_type base() const { return m_cur; } + + reference operator*() const { return *(m_cur-1); } + reference operator[](size_t n) const { return *(*this + n); } + + reverse_iterator_impl& operator++() + { --m_cur; return *this; } + reverse_iterator_impl operator++(int) + { reverse_iterator_impl tmp = *this; --m_cur; return tmp; } + reverse_iterator_impl& operator--() + { ++m_cur; return *this; } + reverse_iterator_impl operator--(int) + { reverse_iterator_impl tmp = *this; ++m_cur; return tmp; } + + // NB: explicit <T> in the functions below is to keep BCC 5.5 happy + reverse_iterator_impl operator+(ptrdiff_t n) const + { return reverse_iterator_impl<T>(m_cur - n); } + reverse_iterator_impl operator-(ptrdiff_t n) const + { return reverse_iterator_impl<T>(m_cur + n); } + reverse_iterator_impl operator+=(ptrdiff_t n) + { m_cur -= n; return *this; } + reverse_iterator_impl operator-=(ptrdiff_t n) + { m_cur += n; return *this; } + + unsigned operator-(const reverse_iterator_impl& i) const + { return i.m_cur - m_cur; } + + bool operator==(const reverse_iterator_impl& ri) const + { return m_cur == ri.m_cur; } + bool operator!=(const reverse_iterator_impl& ri) const + { return !(*this == ri); } + + bool operator<(const reverse_iterator_impl& i) const + { return m_cur > i.m_cur; } + bool operator>(const reverse_iterator_impl& i) const + { return m_cur < i.m_cur; } + bool operator<=(const reverse_iterator_impl& i) const + { return m_cur >= i.m_cur; } + bool operator>=(const reverse_iterator_impl& i) const + { return m_cur <= i.m_cur; } + + private: + iterator_type m_cur; + }; + + typedef reverse_iterator_impl<iterator> reverse_iterator; + typedef reverse_iterator_impl<const_iterator> const_reverse_iterator; + +private: + // used to transform an expression built using c_str() (and hence of type + // wxCStrData) to an iterator into the string + static const_iterator CreateConstIterator(const wxCStrData& data) + { + return const_iterator(data.m_str, + (data.m_str->begin() + data.m_offset).impl()); + } + + // in UTF-8 STL build, creation from std::string requires conversion under + // non-UTF8 locales, so we can't have and use wxString(wxStringImpl) ctor; + // instead we define dummy type that lets us have wxString ctor for creation + // from wxStringImpl that couldn't be used by user code (in all other builds, + // "standard" ctors can be used): +#if wxUSE_UNICODE_UTF8 && wxUSE_STL_BASED_WXSTRING + struct CtorFromStringImplTag {}; + + wxString(CtorFromStringImplTag* WXUNUSED(dummy), const wxStringImpl& src) + : m_impl(src) {} + + static wxString FromImpl(const wxStringImpl& src) + { return wxString((CtorFromStringImplTag*)NULL, src); } +#else + #if !wxUSE_STL_BASED_WXSTRING + wxString(const wxStringImpl& src) : m_impl(src) { } + // else: already defined as wxString(wxStdString) below + #endif + static wxString FromImpl(const wxStringImpl& src) { return wxString(src); } +#endif + +public: + // constructors and destructor + // ctor for an empty string + wxString() {} + + // copy ctor + wxString(const wxString& stringSrc) : m_impl(stringSrc.m_impl) { } + + // string containing nRepeat copies of ch + wxString(wxUniChar ch, size_t nRepeat = 1 ) + { assign(nRepeat, ch); } + wxString(size_t nRepeat, wxUniChar ch) + { assign(nRepeat, ch); } + wxString(wxUniCharRef ch, size_t nRepeat = 1) + { assign(nRepeat, ch); } + wxString(size_t nRepeat, wxUniCharRef ch) + { assign(nRepeat, ch); } + wxString(char ch, size_t nRepeat = 1) + { assign(nRepeat, ch); } + wxString(size_t nRepeat, char ch) + { assign(nRepeat, ch); } + wxString(wchar_t ch, size_t nRepeat = 1) + { assign(nRepeat, ch); } + wxString(size_t nRepeat, wchar_t ch) + { assign(nRepeat, ch); } + + // ctors from char* strings: + wxString(const char *psz) + : m_impl(ImplStr(psz)) {} + wxString(const char *psz, const wxMBConv& conv) + : m_impl(ImplStr(psz, conv)) {} + wxString(const char *psz, size_t nLength) + { assign(psz, nLength); } + wxString(const char *psz, const wxMBConv& conv, size_t nLength) + { + SubstrBufFromMB str(ImplStr(psz, nLength, conv)); + m_impl.assign(str.data, str.len); + } + + // and unsigned char*: + wxString(const unsigned char *psz) + : m_impl(ImplStr((const char*)psz)) {} + wxString(const unsigned char *psz, const wxMBConv& conv) + : m_impl(ImplStr((const char*)psz, conv)) {} + wxString(const unsigned char *psz, size_t nLength) + { assign((const char*)psz, nLength); } + wxString(const unsigned char *psz, const wxMBConv& conv, size_t nLength) + { + SubstrBufFromMB str(ImplStr((const char*)psz, nLength, conv)); + m_impl.assign(str.data, str.len); + } + + // ctors from wchar_t* strings: + wxString(const wchar_t *pwz) + : m_impl(ImplStr(pwz)) {} + wxString(const wchar_t *pwz, const wxMBConv& WXUNUSED(conv)) + : m_impl(ImplStr(pwz)) {} + wxString(const wchar_t *pwz, size_t nLength) + { assign(pwz, nLength); } + wxString(const wchar_t *pwz, const wxMBConv& WXUNUSED(conv), size_t nLength) + { assign(pwz, nLength); } + + wxString(const wxScopedCharBuffer& buf) + { assign(buf.data(), buf.length()); } + wxString(const wxScopedWCharBuffer& buf) + { assign(buf.data(), buf.length()); } + + // NB: this version uses m_impl.c_str() to force making a copy of the + // string, so that "wxString(str.c_str())" idiom for passing strings + // between threads works + wxString(const wxCStrData& cstr) + : m_impl(cstr.AsString().m_impl.c_str()) { } + + // as we provide both ctors with this signature for both char and unsigned + // char string, we need to provide one for wxCStrData to resolve ambiguity + wxString(const wxCStrData& cstr, size_t nLength) + : m_impl(cstr.AsString().Mid(0, nLength).m_impl) {} + + // and because wxString is convertible to wxCStrData and const wxChar * + // we also need to provide this one + wxString(const wxString& str, size_t nLength) + { assign(str, nLength); } + + +#if wxUSE_STRING_POS_CACHE + ~wxString() + { + // we need to invalidate our cache entry as another string could be + // recreated at the same address (unlikely, but still possible, with the + // heap-allocated strings but perfectly common with stack-allocated ones) + InvalidateCache(); + } +#endif // wxUSE_STRING_POS_CACHE + + // even if we're not built with wxUSE_STD_STRING_CONV_IN_WXSTRING == 1 it is + // very convenient to allow implicit conversions from std::string to wxString + // and vice verse as this allows to use the same strings in non-GUI and GUI + // code, however we don't want to unconditionally add this ctor as it would + // make wx lib dependent on libstdc++ on some Linux versions which is bad, so + // instead we ask the client code to define this wxUSE_STD_STRING symbol if + // they need it +#if wxUSE_STD_STRING + #if wxUSE_UNICODE_WCHAR + wxString(const wxStdWideString& str) : m_impl(str) {} + #else // UTF-8 or ANSI + wxString(const wxStdWideString& str) + { assign(str.c_str(), str.length()); } + #endif + + #if !wxUSE_UNICODE // ANSI build + // FIXME-UTF8: do this in UTF8 build #if wxUSE_UTF8_LOCALE_ONLY, too + wxString(const std::string& str) : m_impl(str) {} + #else // Unicode + wxString(const std::string& str) + { assign(str.c_str(), str.length()); } + #endif +#endif // wxUSE_STD_STRING + + // Also always provide explicit conversions to std::[w]string in any case, + // see below for the implicit ones. +#if wxUSE_STD_STRING + // We can avoid a copy if we already use this string type internally, + // otherwise we create a copy on the fly: + #if wxUSE_UNICODE_WCHAR && wxUSE_STL_BASED_WXSTRING + #define wxStringToStdWstringRetType const wxStdWideString& + const wxStdWideString& ToStdWstring() const { return m_impl; } + #else + // wxStringImpl is either not std::string or needs conversion + #define wxStringToStdWstringRetType wxStdWideString + wxStdWideString ToStdWstring() const + { +#if wxUSE_UNICODE_WCHAR + wxScopedWCharBuffer buf = + wxScopedWCharBuffer::CreateNonOwned(m_impl.c_str(), m_impl.length()); +#else // !wxUSE_UNICODE_WCHAR + wxScopedWCharBuffer buf(wc_str()); +#endif + + return wxStdWideString(buf.data(), buf.length()); + } + #endif + + #if (!wxUSE_UNICODE || wxUSE_UTF8_LOCALE_ONLY) && wxUSE_STL_BASED_WXSTRING + // wxStringImpl is std::string in the encoding we want + #define wxStringToStdStringRetType const std::string& + const std::string& ToStdString() const { return m_impl; } + #else + // wxStringImpl is either not std::string or needs conversion + #define wxStringToStdStringRetType std::string + std::string ToStdString() const + { + wxScopedCharBuffer buf(mb_str()); + return std::string(buf.data(), buf.length()); + } + #endif + +#if wxUSE_STD_STRING_CONV_IN_WXSTRING + // Implicit conversions to std::[w]string are not provided by default as + // they conflict with the implicit conversions to "const char/wchar_t *" + // which we use for backwards compatibility but do provide them if + // explicitly requested. + operator wxStringToStdStringRetType() const { return ToStdString(); } + operator wxStringToStdWstringRetType() const { return ToStdWstring(); } +#endif // wxUSE_STD_STRING_CONV_IN_WXSTRING + +#undef wxStringToStdStringRetType +#undef wxStringToStdWstringRetType + +#endif // wxUSE_STD_STRING + + wxString Clone() const + { + // make a deep copy of the string, i.e. the returned string will have + // ref count = 1 with refcounted implementation + return wxString::FromImpl(wxStringImpl(m_impl.c_str(), m_impl.length())); + } + + // first valid index position + const_iterator begin() const { return const_iterator(this, m_impl.begin()); } + iterator begin() { return iterator(this, m_impl.begin()); } + // position one after the last valid one + const_iterator end() const { return const_iterator(this, m_impl.end()); } + iterator end() { return iterator(this, m_impl.end()); } + + // first element of the reversed string + const_reverse_iterator rbegin() const + { return const_reverse_iterator(end()); } + reverse_iterator rbegin() + { return reverse_iterator(end()); } + // one beyond the end of the reversed string + const_reverse_iterator rend() const + { return const_reverse_iterator(begin()); } + reverse_iterator rend() + { return reverse_iterator(begin()); } + + // std::string methods: +#if wxUSE_UNICODE_UTF8 + size_t length() const + { +#if wxUSE_STRING_POS_CACHE + wxCACHE_PROFILE_FIELD_INC(lentot); + + Cache::Element * const cache = GetCacheElement(); + + if ( cache->len == npos ) + { + // it's probably not worth trying to be clever and using cache->pos + // here as it's probably 0 anyhow -- you usually call length() before + // starting to index the string + cache->len = end() - begin(); + } + else + { + wxCACHE_PROFILE_FIELD_INC(lenhits); + + wxSTRING_CACHE_ASSERT( (int)cache->len == end() - begin() ); + } + + return cache->len; +#else // !wxUSE_STRING_POS_CACHE + return end() - begin(); +#endif // wxUSE_STRING_POS_CACHE/!wxUSE_STRING_POS_CACHE + } +#else + size_t length() const { return m_impl.length(); } +#endif + + size_type size() const { return length(); } + size_type max_size() const { return npos; } + + bool empty() const { return m_impl.empty(); } + + // NB: these methods don't have a well-defined meaning in UTF-8 case + size_type capacity() const { return m_impl.capacity(); } + void reserve(size_t sz) { m_impl.reserve(sz); } + + void resize(size_t nSize, wxUniChar ch = wxT('\0')) + { + const size_t len = length(); + if ( nSize == len) + return; + +#if wxUSE_UNICODE_UTF8 + if ( nSize < len ) + { + wxSTRING_INVALIDATE_CACHE(); + + // we can't use wxStringImpl::resize() for truncating the string as it + // counts in bytes, not characters + erase(nSize); + return; + } + + // we also can't use (presumably more efficient) resize() if we have to + // append characters taking more than one byte + if ( !ch.IsAscii() ) + { + append(nSize - len, ch); + } + else // can use (presumably faster) resize() version +#endif // wxUSE_UNICODE_UTF8 + { + wxSTRING_INVALIDATE_CACHED_LENGTH(); + + m_impl.resize(nSize, (wxStringCharType)ch); + } + } + + wxString substr(size_t nStart = 0, size_t nLen = npos) const + { + size_t pos, len; + PosLenToImpl(nStart, nLen, &pos, &len); + return FromImpl(m_impl.substr(pos, len)); + } + + // generic attributes & operations + // as standard strlen() + size_t Len() const { return length(); } + // string contains any characters? + bool IsEmpty() const { return empty(); } + // empty string is "false", so !str will return true + bool operator!() const { return empty(); } + // truncate the string to given length + wxString& Truncate(size_t uiLen); + // empty string contents + void Empty() { clear(); } + // empty the string and free memory + void Clear() { clear(); } + + // contents test + // Is an ascii value + bool IsAscii() const; + // Is a number + bool IsNumber() const; + // Is a word + bool IsWord() const; + + // data access (all indexes are 0 based) + // read access + wxUniChar at(size_t n) const + { return wxStringOperations::DecodeChar(m_impl.begin() + PosToImpl(n)); } + wxUniChar GetChar(size_t n) const + { return at(n); } + // read/write access + wxUniCharRef at(size_t n) + { return *GetIterForNthChar(n); } + wxUniCharRef GetWritableChar(size_t n) + { return at(n); } + // write access + void SetChar(size_t n, wxUniChar ch) + { at(n) = ch; } + + // get last character + wxUniChar Last() const + { + wxASSERT_MSG( !empty(), wxT("wxString: index out of bounds") ); + return *rbegin(); + } + + // get writable last character + wxUniCharRef Last() + { + wxASSERT_MSG( !empty(), wxT("wxString: index out of bounds") ); + return *rbegin(); + } + + /* + Note that we we must define all of the overloads below to avoid + ambiguity when using str[0]. + */ + wxUniChar operator[](int n) const + { return at(n); } + wxUniChar operator[](long n) const + { return at(n); } + wxUniChar operator[](size_t n) const + { return at(n); } +#ifndef wxSIZE_T_IS_UINT + wxUniChar operator[](unsigned int n) const + { return at(n); } +#endif // size_t != unsigned int + + // operator versions of GetWriteableChar() + wxUniCharRef operator[](int n) + { return at(n); } + wxUniCharRef operator[](long n) + { return at(n); } + wxUniCharRef operator[](size_t n) + { return at(n); } +#ifndef wxSIZE_T_IS_UINT + wxUniCharRef operator[](unsigned int n) + { return at(n); } +#endif // size_t != unsigned int + + + /* + Overview of wxString conversions, implicit and explicit: + + - wxString has a std::[w]string-like c_str() method, however it does + not return a C-style string directly but instead returns wxCStrData + helper object which is convertible to either "char *" narrow string + or "wchar_t *" wide string. Usually the correct conversion will be + applied by the compiler automatically but if this doesn't happen you + need to explicitly choose one using wxCStrData::AsChar() or AsWChar() + methods or another wxString conversion function. + + - One of the places where the conversion does *NOT* happen correctly is + when c_str() is passed to a vararg function such as printf() so you + must *NOT* use c_str() with them. Either use wxPrintf() (all wx + functions do handle c_str() correctly, even if they appear to be + vararg (but they're not, really)) or add an explicit AsChar() or, if + compatibility with previous wxWidgets versions is important, add a + cast to "const char *". + + - In non-STL mode only, wxString is also implicitly convertible to + wxCStrData. The same warning as above applies. + + - c_str() is polymorphic as it can be converted to either narrow or + wide string. If you explicitly need one or the other, choose to use + mb_str() (for narrow) or wc_str() (for wide) instead. Notice that + these functions can return either the pointer to string directly (if + this is what the string uses internally) or a temporary buffer + containing the string and convertible to it. Again, conversion will + usually be done automatically by the compiler but beware of the + vararg functions: you need an explicit cast when using them. + + - There are also non-const versions of mb_str() and wc_str() called + char_str() and wchar_str(). They are only meant to be used with + non-const-correct functions and they always return buffers. + + - Finally wx_str() returns whatever string representation is used by + wxString internally. It may be either a narrow or wide string + depending on wxWidgets build mode but it will always be a raw pointer + (and not a buffer). + */ + + // explicit conversion to wxCStrData + wxCStrData c_str() const { return wxCStrData(this); } + wxCStrData data() const { return c_str(); } + + // implicit conversion to wxCStrData + operator wxCStrData() const { return c_str(); } + + // the first two operators conflict with operators for conversion to + // std::string and they must be disabled if those conversions are enabled; + // the next one only makes sense if conversions to char* are also defined + // and not defining it in STL build also helps us to get more clear error + // messages for the code which relies on implicit conversion to char* in + // STL build +#if !wxUSE_STD_STRING_CONV_IN_WXSTRING + operator const char*() const { return c_str(); } + operator const wchar_t*() const { return c_str(); } + + // implicit conversion to untyped pointer for compatibility with previous + // wxWidgets versions: this is the same as conversion to const char * so it + // may fail! + operator const void*() const { return c_str(); } +#endif // !wxUSE_STD_STRING_CONV_IN_WXSTRING + + // identical to c_str(), for MFC compatibility + const wxCStrData GetData() const { return c_str(); } + + // explicit conversion to C string in internal representation (char*, + // wchar_t*, UTF-8-encoded char*, depending on the build): + const wxStringCharType *wx_str() const { return m_impl.c_str(); } + + // conversion to *non-const* multibyte or widestring buffer; modifying + // returned buffer won't affect the string, these methods are only useful + // for passing values to const-incorrect functions + wxWritableCharBuffer char_str(const wxMBConv& conv = wxConvLibc) const + { return mb_str(conv); } + wxWritableWCharBuffer wchar_str() const { return wc_str(); } + + // conversion to the buffer of the given type T (= char or wchar_t) and + // also optionally return the buffer length + // + // this is mostly/only useful for the template functions + // + // FIXME-VC6: the second argument only exists for VC6 which doesn't support + // explicit template function selection, do not use it unless + // you must support VC6! + template <typename T> + wxCharTypeBuffer<T> tchar_str(size_t *len = NULL, + T * WXUNUSED(dummy) = NULL) const + { +#if wxUSE_UNICODE + // we need a helper dispatcher depending on type + return wxPrivate::wxStringAsBufHelper<T>::Get(*this, len); +#else // ANSI + // T can only be char in ANSI build + if ( len ) + *len = length(); + + return wxCharTypeBuffer<T>::CreateNonOwned(wx_str(), length()); +#endif // Unicode build kind + } + + // conversion to/from plain (i.e. 7 bit) ASCII: this is useful for + // converting numbers or strings which are certain not to contain special + // chars (typically system functions, X atoms, environment variables etc.) + // + // the behaviour of these functions with the strings containing anything + // else than 7 bit ASCII characters is undefined, use at your own risk. +#if wxUSE_UNICODE + static wxString FromAscii(const char *ascii, size_t len); + static wxString FromAscii(const char *ascii); + static wxString FromAscii(char ascii); + const wxScopedCharBuffer ToAscii() const; +#else // ANSI + static wxString FromAscii(const char *ascii) { return wxString( ascii ); } + static wxString FromAscii(const char *ascii, size_t len) + { return wxString( ascii, len ); } + static wxString FromAscii(char ascii) { return wxString( ascii ); } + const char *ToAscii() const { return c_str(); } +#endif // Unicode/!Unicode + + // also provide unsigned char overloads as signed/unsigned doesn't matter + // for 7 bit ASCII characters + static wxString FromAscii(const unsigned char *ascii) + { return FromAscii((const char *)ascii); } + static wxString FromAscii(const unsigned char *ascii, size_t len) + { return FromAscii((const char *)ascii, len); } + + // conversion to/from UTF-8: +#if wxUSE_UNICODE_UTF8 + static wxString FromUTF8Unchecked(const char *utf8) + { + if ( !utf8 ) + return wxEmptyString; + + wxASSERT( wxStringOperations::IsValidUtf8String(utf8) ); + return FromImpl(wxStringImpl(utf8)); + } + static wxString FromUTF8Unchecked(const char *utf8, size_t len) + { + if ( !utf8 ) + return wxEmptyString; + if ( len == npos ) + return FromUTF8Unchecked(utf8); + + wxASSERT( wxStringOperations::IsValidUtf8String(utf8, len) ); + return FromImpl(wxStringImpl(utf8, len)); + } + + static wxString FromUTF8(const char *utf8) + { + if ( !utf8 || !wxStringOperations::IsValidUtf8String(utf8) ) + return ""; + + return FromImpl(wxStringImpl(utf8)); + } + static wxString FromUTF8(const char *utf8, size_t len) + { + if ( len == npos ) + return FromUTF8(utf8); + + if ( !utf8 || !wxStringOperations::IsValidUtf8String(utf8, len) ) + return ""; + + return FromImpl(wxStringImpl(utf8, len)); + } + + const wxScopedCharBuffer utf8_str() const + { return wxCharBuffer::CreateNonOwned(m_impl.c_str(), m_impl.length()); } + + // this function exists in UTF-8 build only and returns the length of the + // internal UTF-8 representation + size_t utf8_length() const { return m_impl.length(); } +#elif wxUSE_UNICODE_WCHAR + static wxString FromUTF8(const char *utf8, size_t len = npos) + { return wxString(utf8, wxMBConvUTF8(), len); } + static wxString FromUTF8Unchecked(const char *utf8, size_t len = npos) + { + const wxString s(utf8, wxMBConvUTF8(), len); + wxASSERT_MSG( !utf8 || !*utf8 || !s.empty(), + "string must be valid UTF-8" ); + return s; + } + const wxScopedCharBuffer utf8_str() const { return mb_str(wxMBConvUTF8()); } +#else // ANSI + static wxString FromUTF8(const char *utf8) + { return wxString(wxMBConvUTF8().cMB2WC(utf8)); } + static wxString FromUTF8(const char *utf8, size_t len) + { + size_t wlen; + wxScopedWCharBuffer buf(wxMBConvUTF8().cMB2WC(utf8, len == npos ? wxNO_LEN : len, &wlen)); + return wxString(buf.data(), wlen); + } + static wxString FromUTF8Unchecked(const char *utf8, size_t len = npos) + { + size_t wlen; + wxScopedWCharBuffer buf + ( + wxMBConvUTF8().cMB2WC + ( + utf8, + len == npos ? wxNO_LEN : len, + &wlen + ) + ); + wxASSERT_MSG( !utf8 || !*utf8 || wlen, + "string must be valid UTF-8" ); + + return wxString(buf.data(), wlen); + } + const wxScopedCharBuffer utf8_str() const + { return wxMBConvUTF8().cWC2MB(wc_str()); } +#endif + + const wxScopedCharBuffer ToUTF8() const { return utf8_str(); } + + // functions for storing binary data in wxString: +#if wxUSE_UNICODE + static wxString From8BitData(const char *data, size_t len) + { return wxString(data, wxConvISO8859_1, len); } + // version for NUL-terminated data: + static wxString From8BitData(const char *data) + { return wxString(data, wxConvISO8859_1); } + const wxScopedCharBuffer To8BitData() const + { return mb_str(wxConvISO8859_1); } +#else // ANSI + static wxString From8BitData(const char *data, size_t len) + { return wxString(data, len); } + // version for NUL-terminated data: + static wxString From8BitData(const char *data) + { return wxString(data); } + const wxScopedCharBuffer To8BitData() const + { return wxScopedCharBuffer::CreateNonOwned(wx_str(), length()); } +#endif // Unicode/ANSI + + // conversions with (possible) format conversions: have to return a + // buffer with temporary data + // + // the functions defined (in either Unicode or ANSI) mode are mb_str() to + // return an ANSI (multibyte) string, wc_str() to return a wide string and + // fn_str() to return a string which should be used with the OS APIs + // accepting the file names. The return value is always the same, but the + // type differs because a function may either return pointer to the buffer + // directly or have to use intermediate buffer for translation. + +#if wxUSE_UNICODE + + // this is an optimization: even though using mb_str(wxConvLibc) does the + // same thing (i.e. returns pointer to internal representation as locale is + // always an UTF-8 one) in wxUSE_UTF8_LOCALE_ONLY case, we can avoid the + // extra checks and the temporary buffer construction by providing a + // separate mb_str() overload +#if wxUSE_UTF8_LOCALE_ONLY + const char* mb_str() const { return wx_str(); } + const wxScopedCharBuffer mb_str(const wxMBConv& conv) const + { + return AsCharBuf(conv); + } +#else // !wxUSE_UTF8_LOCALE_ONLY + const wxScopedCharBuffer mb_str(const wxMBConv& conv = wxConvLibc) const + { + return AsCharBuf(conv); + } +#endif // wxUSE_UTF8_LOCALE_ONLY/!wxUSE_UTF8_LOCALE_ONLY + + const wxWX2MBbuf mbc_str() const { return mb_str(*wxConvCurrent); } + +#if wxUSE_UNICODE_WCHAR + const wchar_t* wc_str() const { return wx_str(); } +#elif wxUSE_UNICODE_UTF8 + const wxScopedWCharBuffer wc_str() const + { return AsWCharBuf(wxMBConvStrictUTF8()); } +#endif + // for compatibility with !wxUSE_UNICODE version + const wxWX2WCbuf wc_str(const wxMBConv& WXUNUSED(conv)) const + { return wc_str(); } + +#if wxMBFILES + const wxScopedCharBuffer fn_str() const { return mb_str(wxConvFile); } +#else // !wxMBFILES + const wxWX2WCbuf fn_str() const { return wc_str(); } +#endif // wxMBFILES/!wxMBFILES + +#else // ANSI + const char* mb_str() const { return wx_str(); } + + // for compatibility with wxUSE_UNICODE version + const char* mb_str(const wxMBConv& WXUNUSED(conv)) const { return wx_str(); } + + const wxWX2MBbuf mbc_str() const { return mb_str(); } + + const wxScopedWCharBuffer wc_str(const wxMBConv& conv = wxConvLibc) const + { return AsWCharBuf(conv); } + + const wxScopedCharBuffer fn_str() const + { return wxConvFile.cWC2WX( wc_str( wxConvLibc ) ); } +#endif // Unicode/ANSI + +#if wxUSE_UNICODE_UTF8 + const wxScopedWCharBuffer t_str() const { return wc_str(); } +#elif wxUSE_UNICODE_WCHAR + const wchar_t* t_str() const { return wx_str(); } +#else + const char* t_str() const { return wx_str(); } +#endif + + + // overloaded assignment + // from another wxString + wxString& operator=(const wxString& stringSrc) + { + if ( this != &stringSrc ) + { + wxSTRING_INVALIDATE_CACHE(); + + m_impl = stringSrc.m_impl; + } + + return *this; + } + + wxString& operator=(const wxCStrData& cstr) + { return *this = cstr.AsString(); } + // from a character + wxString& operator=(wxUniChar ch) + { + wxSTRING_INVALIDATE_CACHE(); + +#if wxUSE_UNICODE_UTF8 + if ( !ch.IsAscii() ) + m_impl = wxStringOperations::EncodeChar(ch); + else +#endif // wxUSE_UNICODE_UTF8 + m_impl = (wxStringCharType)ch; + return *this; + } + + wxString& operator=(wxUniCharRef ch) + { return operator=((wxUniChar)ch); } + wxString& operator=(char ch) + { return operator=(wxUniChar(ch)); } + wxString& operator=(unsigned char ch) + { return operator=(wxUniChar(ch)); } + wxString& operator=(wchar_t ch) + { return operator=(wxUniChar(ch)); } + // from a C string - STL probably will crash on NULL, + // so we need to compensate in that case +#if wxUSE_STL_BASED_WXSTRING + wxString& operator=(const char *psz) + { + wxSTRING_INVALIDATE_CACHE(); + + if ( psz ) + m_impl = ImplStr(psz); + else + clear(); + + return *this; + } + + wxString& operator=(const wchar_t *pwz) + { + wxSTRING_INVALIDATE_CACHE(); + + if ( pwz ) + m_impl = ImplStr(pwz); + else + clear(); + + return *this; + } +#else // !wxUSE_STL_BASED_WXSTRING + wxString& operator=(const char *psz) + { + wxSTRING_INVALIDATE_CACHE(); + + m_impl = ImplStr(psz); + + return *this; + } + + wxString& operator=(const wchar_t *pwz) + { + wxSTRING_INVALIDATE_CACHE(); + + m_impl = ImplStr(pwz); + + return *this; + } +#endif // wxUSE_STL_BASED_WXSTRING/!wxUSE_STL_BASED_WXSTRING + + wxString& operator=(const unsigned char *psz) + { return operator=((const char*)psz); } + + // from wxScopedWCharBuffer + wxString& operator=(const wxScopedWCharBuffer& s) + { return assign(s); } + // from wxScopedCharBuffer + wxString& operator=(const wxScopedCharBuffer& s) + { return assign(s); } + + // string concatenation + // in place concatenation + /* + Concatenate and return the result. Note that the left to right + associativity of << allows to write things like "str << str1 << str2 + << ..." (unlike with +=) + */ + // string += string + wxString& operator<<(const wxString& s) + { +#if WXWIN_COMPATIBILITY_2_8 && !wxUSE_STL_BASED_WXSTRING && !wxUSE_UNICODE_UTF8 + wxASSERT_MSG( s.IsValid(), + wxT("did you forget to call UngetWriteBuf()?") ); +#endif + + append(s); + return *this; + } + // string += C string + wxString& operator<<(const char *psz) + { append(psz); return *this; } + wxString& operator<<(const wchar_t *pwz) + { append(pwz); return *this; } + wxString& operator<<(const wxCStrData& psz) + { append(psz.AsString()); return *this; } + // string += char + wxString& operator<<(wxUniChar ch) { append(1, ch); return *this; } + wxString& operator<<(wxUniCharRef ch) { append(1, ch); return *this; } + wxString& operator<<(char ch) { append(1, ch); return *this; } + wxString& operator<<(unsigned char ch) { append(1, ch); return *this; } + wxString& operator<<(wchar_t ch) { append(1, ch); return *this; } + + // string += buffer (i.e. from wxGetString) + wxString& operator<<(const wxScopedWCharBuffer& s) + { return append(s); } + wxString& operator<<(const wxScopedCharBuffer& s) + { return append(s); } + + // string += C string + wxString& Append(const wxString& s) + { + // test for empty() to share the string if possible + if ( empty() ) + *this = s; + else + append(s); + return *this; + } + wxString& Append(const char* psz) + { append(psz); return *this; } + wxString& Append(const wchar_t* pwz) + { append(pwz); return *this; } + wxString& Append(const wxCStrData& psz) + { append(psz); return *this; } + wxString& Append(const wxScopedCharBuffer& psz) + { append(psz); return *this; } + wxString& Append(const wxScopedWCharBuffer& psz) + { append(psz); return *this; } + wxString& Append(const char* psz, size_t nLen) + { append(psz, nLen); return *this; } + wxString& Append(const wchar_t* pwz, size_t nLen) + { append(pwz, nLen); return *this; } + wxString& Append(const wxCStrData& psz, size_t nLen) + { append(psz, nLen); return *this; } + wxString& Append(const wxScopedCharBuffer& psz, size_t nLen) + { append(psz, nLen); return *this; } + wxString& Append(const wxScopedWCharBuffer& psz, size_t nLen) + { append(psz, nLen); return *this; } + // append count copies of given character + wxString& Append(wxUniChar ch, size_t count = 1u) + { append(count, ch); return *this; } + wxString& Append(wxUniCharRef ch, size_t count = 1u) + { append(count, ch); return *this; } + wxString& Append(char ch, size_t count = 1u) + { append(count, ch); return *this; } + wxString& Append(unsigned char ch, size_t count = 1u) + { append(count, ch); return *this; } + wxString& Append(wchar_t ch, size_t count = 1u) + { append(count, ch); return *this; } + + // prepend a string, return the string itself + wxString& Prepend(const wxString& str) + { *this = str + *this; return *this; } + + // non-destructive concatenation + // two strings + friend wxString WXDLLIMPEXP_BASE operator+(const wxString& string1, + const wxString& string2); + // string with a single char + friend wxString WXDLLIMPEXP_BASE operator+(const wxString& string, wxUniChar ch); + // char with a string + friend wxString WXDLLIMPEXP_BASE operator+(wxUniChar ch, const wxString& string); + // string with C string + friend wxString WXDLLIMPEXP_BASE operator+(const wxString& string, + const char *psz); + friend wxString WXDLLIMPEXP_BASE operator+(const wxString& string, + const wchar_t *pwz); + // C string with string + friend wxString WXDLLIMPEXP_BASE operator+(const char *psz, + const wxString& string); + friend wxString WXDLLIMPEXP_BASE operator+(const wchar_t *pwz, + const wxString& string); + + // stream-like functions + // insert an int into string + wxString& operator<<(int i) + { return (*this) << Format(wxT("%d"), i); } + // insert an unsigned int into string + wxString& operator<<(unsigned int ui) + { return (*this) << Format(wxT("%u"), ui); } + // insert a long into string + wxString& operator<<(long l) + { return (*this) << Format(wxT("%ld"), l); } + // insert an unsigned long into string + wxString& operator<<(unsigned long ul) + { return (*this) << Format(wxT("%lu"), ul); } +#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + // insert a long long if they exist and aren't longs + wxString& operator<<(wxLongLong_t ll) + { + return (*this) << Format("%" wxLongLongFmtSpec "d", ll); + } + // insert an unsigned long long + wxString& operator<<(wxULongLong_t ull) + { + return (*this) << Format("%" wxLongLongFmtSpec "u" , ull); + } +#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + // insert a float into string + wxString& operator<<(float f) + { return (*this) << Format(wxT("%f"), f); } + // insert a double into string + wxString& operator<<(double d) + { return (*this) << Format(wxT("%g"), d); } + + // string comparison + // case-sensitive comparison (returns a value < 0, = 0 or > 0) + int Cmp(const char *psz) const + { return compare(psz); } + int Cmp(const wchar_t *pwz) const + { return compare(pwz); } + int Cmp(const wxString& s) const + { return compare(s); } + int Cmp(const wxCStrData& s) const + { return compare(s); } + int Cmp(const wxScopedCharBuffer& s) const + { return compare(s); } + int Cmp(const wxScopedWCharBuffer& s) const + { return compare(s); } + // same as Cmp() but not case-sensitive + int CmpNoCase(const wxString& s) const; + + // test for the string equality, either considering case or not + // (if compareWithCase then the case matters) + bool IsSameAs(const wxString& str, bool compareWithCase = true) const + { +#if !wxUSE_UNICODE_UTF8 + // in UTF-8 build, length() is O(n) and doing this would be _slower_ + if ( length() != str.length() ) + return false; +#endif + return (compareWithCase ? Cmp(str) : CmpNoCase(str)) == 0; + } + bool IsSameAs(const char *str, bool compareWithCase = true) const + { return (compareWithCase ? Cmp(str) : CmpNoCase(str)) == 0; } + bool IsSameAs(const wchar_t *str, bool compareWithCase = true) const + { return (compareWithCase ? Cmp(str) : CmpNoCase(str)) == 0; } + + bool IsSameAs(const wxCStrData& str, bool compareWithCase = true) const + { return IsSameAs(str.AsString(), compareWithCase); } + bool IsSameAs(const wxScopedCharBuffer& str, bool compareWithCase = true) const + { return IsSameAs(str.data(), compareWithCase); } + bool IsSameAs(const wxScopedWCharBuffer& str, bool compareWithCase = true) const + { return IsSameAs(str.data(), compareWithCase); } + // comparison with a single character: returns true if equal + bool IsSameAs(wxUniChar c, bool compareWithCase = true) const; + // FIXME-UTF8: remove these overloads + bool IsSameAs(wxUniCharRef c, bool compareWithCase = true) const + { return IsSameAs(wxUniChar(c), compareWithCase); } + bool IsSameAs(char c, bool compareWithCase = true) const + { return IsSameAs(wxUniChar(c), compareWithCase); } + bool IsSameAs(unsigned char c, bool compareWithCase = true) const + { return IsSameAs(wxUniChar(c), compareWithCase); } + bool IsSameAs(wchar_t c, bool compareWithCase = true) const + { return IsSameAs(wxUniChar(c), compareWithCase); } + bool IsSameAs(int c, bool compareWithCase = true) const + { return IsSameAs(wxUniChar(c), compareWithCase); } + + // simple sub-string extraction + // return substring starting at nFirst of length nCount (or till the end + // if nCount = default value) + wxString Mid(size_t nFirst, size_t nCount = npos) const; + + // operator version of Mid() + wxString operator()(size_t start, size_t len) const + { return Mid(start, len); } + + // check if the string starts with the given prefix and return the rest + // of the string in the provided pointer if it is not NULL; otherwise + // return false + bool StartsWith(const wxString& prefix, wxString *rest = NULL) const; + // check if the string ends with the given suffix and return the + // beginning of the string before the suffix in the provided pointer if + // it is not NULL; otherwise return false + bool EndsWith(const wxString& suffix, wxString *rest = NULL) const; + + // get first nCount characters + wxString Left(size_t nCount) const; + // get last nCount characters + wxString Right(size_t nCount) const; + // get all characters before the first occurrence of ch + // (returns the whole string if ch not found) and also put everything + // following the first occurrence of ch into rest if it's non-NULL + wxString BeforeFirst(wxUniChar ch, wxString *rest = NULL) const; + // get all characters before the last occurrence of ch + // (returns empty string if ch not found) and also put everything + // following the last occurrence of ch into rest if it's non-NULL + wxString BeforeLast(wxUniChar ch, wxString *rest = NULL) const; + // get all characters after the first occurrence of ch + // (returns empty string if ch not found) + wxString AfterFirst(wxUniChar ch) const; + // get all characters after the last occurrence of ch + // (returns the whole string if ch not found) + wxString AfterLast(wxUniChar ch) const; + + // for compatibility only, use more explicitly named functions above + wxString Before(wxUniChar ch) const { return BeforeLast(ch); } + wxString After(wxUniChar ch) const { return AfterFirst(ch); } + + // case conversion + // convert to upper case in place, return the string itself + wxString& MakeUpper(); + // convert to upper case, return the copy of the string + wxString Upper() const { return wxString(*this).MakeUpper(); } + // convert to lower case in place, return the string itself + wxString& MakeLower(); + // convert to lower case, return the copy of the string + wxString Lower() const { return wxString(*this).MakeLower(); } + // convert the first character to the upper case and the rest to the + // lower one, return the modified string itself + wxString& MakeCapitalized(); + // convert the first character to the upper case and the rest to the + // lower one, return the copy of the string + wxString Capitalize() const { return wxString(*this).MakeCapitalized(); } + + // trimming/padding whitespace (either side) and truncating + // remove spaces from left or from right (default) side + wxString& Trim(bool bFromRight = true); + // add nCount copies chPad in the beginning or at the end (default) + wxString& Pad(size_t nCount, wxUniChar chPad = wxT(' '), bool bFromRight = true); + + // searching and replacing + // searching (return starting index, or -1 if not found) + int Find(wxUniChar ch, bool bFromEnd = false) const; // like strchr/strrchr + int Find(wxUniCharRef ch, bool bFromEnd = false) const + { return Find(wxUniChar(ch), bFromEnd); } + int Find(char ch, bool bFromEnd = false) const + { return Find(wxUniChar(ch), bFromEnd); } + int Find(unsigned char ch, bool bFromEnd = false) const + { return Find(wxUniChar(ch), bFromEnd); } + int Find(wchar_t ch, bool bFromEnd = false) const + { return Find(wxUniChar(ch), bFromEnd); } + // searching (return starting index, or -1 if not found) + int Find(const wxString& sub) const // like strstr + { + size_type idx = find(sub); + return (idx == npos) ? wxNOT_FOUND : (int)idx; + } + int Find(const char *sub) const // like strstr + { + size_type idx = find(sub); + return (idx == npos) ? wxNOT_FOUND : (int)idx; + } + int Find(const wchar_t *sub) const // like strstr + { + size_type idx = find(sub); + return (idx == npos) ? wxNOT_FOUND : (int)idx; + } + + int Find(const wxCStrData& sub) const + { return Find(sub.AsString()); } + int Find(const wxScopedCharBuffer& sub) const + { return Find(sub.data()); } + int Find(const wxScopedWCharBuffer& sub) const + { return Find(sub.data()); } + + // replace first (or all of bReplaceAll) occurrences of substring with + // another string, returns the number of replacements made + size_t Replace(const wxString& strOld, + const wxString& strNew, + bool bReplaceAll = true); + + // check if the string contents matches a mask containing '*' and '?' + bool Matches(const wxString& mask) const; + + // conversion to numbers: all functions return true only if the whole + // string is a number and put the value of this number into the pointer + // provided, the base is the numeric base in which the conversion should be + // done and must be comprised between 2 and 36 or be 0 in which case the + // standard C rules apply (leading '0' => octal, "0x" => hex) + // convert to a signed integer + bool ToLong(long *val, int base = 10) const; + // convert to an unsigned integer + bool ToULong(unsigned long *val, int base = 10) const; + // convert to wxLongLong +#if defined(wxLongLong_t) + bool ToLongLong(wxLongLong_t *val, int base = 10) const; + // convert to wxULongLong + bool ToULongLong(wxULongLong_t *val, int base = 10) const; +#endif // wxLongLong_t + // convert to a double + bool ToDouble(double *val) const; + + // conversions to numbers using C locale + // convert to a signed integer + bool ToCLong(long *val, int base = 10) const; + // convert to an unsigned integer + bool ToCULong(unsigned long *val, int base = 10) const; + // convert to a double + bool ToCDouble(double *val) const; + + // create a string representing the given floating point number with the + // default (like %g) or fixed (if precision >=0) precision + // in the current locale + static wxString FromDouble(double val, int precision = -1); + // in C locale + static wxString FromCDouble(double val, int precision = -1); + +#ifndef wxNEEDS_WXSTRING_PRINTF_MIXIN + // formatted input/output + // as sprintf(), returns the number of characters written or < 0 on error + // (take 'this' into account in attribute parameter count) + // int Printf(const wxString& format, ...); + WX_DEFINE_VARARG_FUNC(int, Printf, 1, (const wxFormatString&), + DoPrintfWchar, DoPrintfUtf8) +#ifdef __WATCOMC__ + // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351 + WX_VARARG_WATCOM_WORKAROUND(int, Printf, 1, (const wxString&), + (wxFormatString(f1))); + WX_VARARG_WATCOM_WORKAROUND(int, Printf, 1, (const wxCStrData&), + (wxFormatString(f1))); + WX_VARARG_WATCOM_WORKAROUND(int, Printf, 1, (const char*), + (wxFormatString(f1))); + WX_VARARG_WATCOM_WORKAROUND(int, Printf, 1, (const wchar_t*), + (wxFormatString(f1))); +#endif +#endif // !wxNEEDS_WXSTRING_PRINTF_MIXIN + // as vprintf(), returns the number of characters written or < 0 on error + int PrintfV(const wxString& format, va_list argptr); + +#ifndef wxNEEDS_WXSTRING_PRINTF_MIXIN + // returns the string containing the result of Printf() to it + // static wxString Format(const wxString& format, ...) WX_ATTRIBUTE_PRINTF_1; + WX_DEFINE_VARARG_FUNC(static wxString, Format, 1, (const wxFormatString&), + DoFormatWchar, DoFormatUtf8) +#ifdef __WATCOMC__ + // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351 + WX_VARARG_WATCOM_WORKAROUND(static wxString, Format, 1, (const wxString&), + (wxFormatString(f1))); + WX_VARARG_WATCOM_WORKAROUND(static wxString, Format, 1, (const wxCStrData&), + (wxFormatString(f1))); + WX_VARARG_WATCOM_WORKAROUND(static wxString, Format, 1, (const char*), + (wxFormatString(f1))); + WX_VARARG_WATCOM_WORKAROUND(static wxString, Format, 1, (const wchar_t*), + (wxFormatString(f1))); +#endif +#endif + // the same as above, but takes a va_list + static wxString FormatV(const wxString& format, va_list argptr); + + // raw access to string memory + // ensure that string has space for at least nLen characters + // only works if the data of this string is not shared + bool Alloc(size_t nLen) { reserve(nLen); return capacity() >= nLen; } + // minimize the string's memory + // only works if the data of this string is not shared + bool Shrink(); +#if WXWIN_COMPATIBILITY_2_8 && !wxUSE_STL_BASED_WXSTRING && !wxUSE_UNICODE_UTF8 + // These are deprecated, use wxStringBuffer or wxStringBufferLength instead + // + // get writable buffer of at least nLen bytes. Unget() *must* be called + // a.s.a.p. to put string back in a reasonable state! + wxDEPRECATED( wxStringCharType *GetWriteBuf(size_t nLen) ); + // call this immediately after GetWriteBuf() has been used + wxDEPRECATED( void UngetWriteBuf() ); + wxDEPRECATED( void UngetWriteBuf(size_t nLen) ); +#endif // WXWIN_COMPATIBILITY_2_8 && !wxUSE_STL_BASED_WXSTRING && wxUSE_UNICODE_UTF8 + + // wxWidgets version 1 compatibility functions + + // use Mid() + wxString SubString(size_t from, size_t to) const + { return Mid(from, (to - from + 1)); } + // values for second parameter of CompareTo function + enum caseCompare {exact, ignoreCase}; + // values for first parameter of Strip function + enum stripType {leading = 0x1, trailing = 0x2, both = 0x3}; + +#ifndef wxNEEDS_WXSTRING_PRINTF_MIXIN + // use Printf() + // (take 'this' into account in attribute parameter count) + // int sprintf(const wxString& format, ...) WX_ATTRIBUTE_PRINTF_2; + WX_DEFINE_VARARG_FUNC(int, sprintf, 1, (const wxFormatString&), + DoPrintfWchar, DoPrintfUtf8) +#ifdef __WATCOMC__ + // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351 + WX_VARARG_WATCOM_WORKAROUND(int, sprintf, 1, (const wxString&), + (wxFormatString(f1))); + WX_VARARG_WATCOM_WORKAROUND(int, sprintf, 1, (const wxCStrData&), + (wxFormatString(f1))); + WX_VARARG_WATCOM_WORKAROUND(int, sprintf, 1, (const char*), + (wxFormatString(f1))); + WX_VARARG_WATCOM_WORKAROUND(int, sprintf, 1, (const wchar_t*), + (wxFormatString(f1))); +#endif +#endif // wxNEEDS_WXSTRING_PRINTF_MIXIN + + // use Cmp() + int CompareTo(const wxChar* psz, caseCompare cmp = exact) const + { return cmp == exact ? Cmp(psz) : CmpNoCase(psz); } + + // use length() + size_t Length() const { return length(); } + // Count the number of characters + int Freq(wxUniChar ch) const; + // use MakeLower + void LowerCase() { MakeLower(); } + // use MakeUpper + void UpperCase() { MakeUpper(); } + // use Trim except that it doesn't change this string + wxString Strip(stripType w = trailing) const; + + // use Find (more general variants not yet supported) + size_t Index(const wxChar* psz) const { return Find(psz); } + size_t Index(wxUniChar ch) const { return Find(ch); } + // use Truncate + wxString& Remove(size_t pos) { return Truncate(pos); } + wxString& RemoveLast(size_t n = 1) { return Truncate(length() - n); } + + wxString& Remove(size_t nStart, size_t nLen) + { return (wxString&)erase( nStart, nLen ); } + + // use Find() + int First( wxUniChar ch ) const { return Find(ch); } + int First( wxUniCharRef ch ) const { return Find(ch); } + int First( char ch ) const { return Find(ch); } + int First( unsigned char ch ) const { return Find(ch); } + int First( wchar_t ch ) const { return Find(ch); } + int First( const wxString& str ) const { return Find(str); } + int Last( wxUniChar ch ) const { return Find(ch, true); } + bool Contains(const wxString& str) const { return Find(str) != wxNOT_FOUND; } + + // use empty() + bool IsNull() const { return empty(); } + + // std::string compatibility functions + + // take nLen chars starting at nPos + wxString(const wxString& str, size_t nPos, size_t nLen) + { assign(str, nPos, nLen); } + // take all characters from first to last + wxString(const_iterator first, const_iterator last) + : m_impl(first.impl(), last.impl()) { } +#if WXWIN_COMPATIBILITY_STRING_PTR_AS_ITER + // the 2 overloads below are for compatibility with the existing code using + // pointers instead of iterators + wxString(const char *first, const char *last) + { + SubstrBufFromMB str(ImplStr(first, last - first)); + m_impl.assign(str.data, str.len); + } + wxString(const wchar_t *first, const wchar_t *last) + { + SubstrBufFromWC str(ImplStr(first, last - first)); + m_impl.assign(str.data, str.len); + } + // and this one is needed to compile code adding offsets to c_str() result + wxString(const wxCStrData& first, const wxCStrData& last) + : m_impl(CreateConstIterator(first).impl(), + CreateConstIterator(last).impl()) + { + wxASSERT_MSG( first.m_str == last.m_str, + wxT("pointers must be into the same string") ); + } +#endif // WXWIN_COMPATIBILITY_STRING_PTR_AS_ITER + + // lib.string.modifiers + // append elements str[pos], ..., str[pos+n] + wxString& append(const wxString& str, size_t pos, size_t n) + { + wxSTRING_UPDATE_CACHED_LENGTH(n); + + size_t from, len; + str.PosLenToImpl(pos, n, &from, &len); + m_impl.append(str.m_impl, from, len); + return *this; + } + // append a string + wxString& append(const wxString& str) + { + wxSTRING_UPDATE_CACHED_LENGTH(str.length()); + + m_impl.append(str.m_impl); + return *this; + } + + // append first n (or all if n == npos) characters of sz + wxString& append(const char *sz) + { + wxSTRING_INVALIDATE_CACHED_LENGTH(); + + m_impl.append(ImplStr(sz)); + return *this; + } + + wxString& append(const wchar_t *sz) + { + wxSTRING_INVALIDATE_CACHED_LENGTH(); + + m_impl.append(ImplStr(sz)); + return *this; + } + + wxString& append(const char *sz, size_t n) + { + wxSTRING_INVALIDATE_CACHED_LENGTH(); + + SubstrBufFromMB str(ImplStr(sz, n)); + m_impl.append(str.data, str.len); + return *this; + } + wxString& append(const wchar_t *sz, size_t n) + { + wxSTRING_UPDATE_CACHED_LENGTH(n); + + SubstrBufFromWC str(ImplStr(sz, n)); + m_impl.append(str.data, str.len); + return *this; + } + + wxString& append(const wxCStrData& str) + { return append(str.AsString()); } + wxString& append(const wxScopedCharBuffer& str) + { return append(str.data(), str.length()); } + wxString& append(const wxScopedWCharBuffer& str) + { return append(str.data(), str.length()); } + wxString& append(const wxCStrData& str, size_t n) + { return append(str.AsString(), 0, n); } + wxString& append(const wxScopedCharBuffer& str, size_t n) + { return append(str.data(), n); } + wxString& append(const wxScopedWCharBuffer& str, size_t n) + { return append(str.data(), n); } + + // append n copies of ch + wxString& append(size_t n, wxUniChar ch) + { +#if wxUSE_UNICODE_UTF8 + if ( !ch.IsAscii() ) + { + wxSTRING_INVALIDATE_CACHED_LENGTH(); + + m_impl.append(wxStringOperations::EncodeNChars(n, ch)); + } + else // ASCII +#endif + { + wxSTRING_UPDATE_CACHED_LENGTH(n); + + m_impl.append(n, (wxStringCharType)ch); + } + + return *this; + } + + wxString& append(size_t n, wxUniCharRef ch) + { return append(n, wxUniChar(ch)); } + wxString& append(size_t n, char ch) + { return append(n, wxUniChar(ch)); } + wxString& append(size_t n, unsigned char ch) + { return append(n, wxUniChar(ch)); } + wxString& append(size_t n, wchar_t ch) + { return append(n, wxUniChar(ch)); } + + // append from first to last + wxString& append(const_iterator first, const_iterator last) + { + wxSTRING_INVALIDATE_CACHED_LENGTH(); + + m_impl.append(first.impl(), last.impl()); + return *this; + } +#if WXWIN_COMPATIBILITY_STRING_PTR_AS_ITER + wxString& append(const char *first, const char *last) + { return append(first, last - first); } + wxString& append(const wchar_t *first, const wchar_t *last) + { return append(first, last - first); } + wxString& append(const wxCStrData& first, const wxCStrData& last) + { return append(CreateConstIterator(first), CreateConstIterator(last)); } +#endif // WXWIN_COMPATIBILITY_STRING_PTR_AS_ITER + + // same as `this_string = str' + wxString& assign(const wxString& str) + { + wxSTRING_SET_CACHED_LENGTH(str.length()); + + m_impl = str.m_impl; + + return *this; + } + + // This is a non-standard-compliant overload taking the first "len" + // characters of the source string. + wxString& assign(const wxString& str, size_t len) + { +#if wxUSE_STRING_POS_CACHE + // It is legal to pass len > str.length() to wxStringImpl::assign() but + // by restricting it here we save some work for that function so it's not + // really less efficient and, at the same time, ensure that we don't + // cache invalid length. + const size_t lenSrc = str.length(); + if ( len > lenSrc ) + len = lenSrc; + + wxSTRING_SET_CACHED_LENGTH(len); +#endif // wxUSE_STRING_POS_CACHE + + m_impl.assign(str.m_impl, 0, str.LenToImpl(len)); + + return *this; + } + + // same as ` = str[pos..pos + n] + wxString& assign(const wxString& str, size_t pos, size_t n) + { + size_t from, len; + str.PosLenToImpl(pos, n, &from, &len); + m_impl.assign(str.m_impl, from, len); + + // it's important to call this after PosLenToImpl() above in case str is + // the same string as this one + wxSTRING_SET_CACHED_LENGTH(n); + + return *this; + } + + // same as `= first n (or all if n == npos) characters of sz' + wxString& assign(const char *sz) + { + wxSTRING_INVALIDATE_CACHE(); + + m_impl.assign(ImplStr(sz)); + + return *this; + } + + wxString& assign(const wchar_t *sz) + { + wxSTRING_INVALIDATE_CACHE(); + + m_impl.assign(ImplStr(sz)); + + return *this; + } + + wxString& assign(const char *sz, size_t n) + { + wxSTRING_INVALIDATE_CACHE(); + + SubstrBufFromMB str(ImplStr(sz, n)); + m_impl.assign(str.data, str.len); + + return *this; + } + + wxString& assign(const wchar_t *sz, size_t n) + { + wxSTRING_SET_CACHED_LENGTH(n); + + SubstrBufFromWC str(ImplStr(sz, n)); + m_impl.assign(str.data, str.len); + + return *this; + } + + wxString& assign(const wxCStrData& str) + { return assign(str.AsString()); } + wxString& assign(const wxScopedCharBuffer& str) + { return assign(str.data(), str.length()); } + wxString& assign(const wxScopedWCharBuffer& str) + { return assign(str.data(), str.length()); } + wxString& assign(const wxCStrData& str, size_t len) + { return assign(str.AsString(), len); } + wxString& assign(const wxScopedCharBuffer& str, size_t len) + { return assign(str.data(), len); } + wxString& assign(const wxScopedWCharBuffer& str, size_t len) + { return assign(str.data(), len); } + + // same as `= n copies of ch' + wxString& assign(size_t n, wxUniChar ch) + { + wxSTRING_SET_CACHED_LENGTH(n); + +#if wxUSE_UNICODE_UTF8 + if ( !ch.IsAscii() ) + m_impl.assign(wxStringOperations::EncodeNChars(n, ch)); + else +#endif + m_impl.assign(n, (wxStringCharType)ch); + + return *this; + } + + wxString& assign(size_t n, wxUniCharRef ch) + { return assign(n, wxUniChar(ch)); } + wxString& assign(size_t n, char ch) + { return assign(n, wxUniChar(ch)); } + wxString& assign(size_t n, unsigned char ch) + { return assign(n, wxUniChar(ch)); } + wxString& assign(size_t n, wchar_t ch) + { return assign(n, wxUniChar(ch)); } + + // assign from first to last + wxString& assign(const_iterator first, const_iterator last) + { + wxSTRING_INVALIDATE_CACHE(); + + m_impl.assign(first.impl(), last.impl()); + + return *this; + } +#if WXWIN_COMPATIBILITY_STRING_PTR_AS_ITER + wxString& assign(const char *first, const char *last) + { return assign(first, last - first); } + wxString& assign(const wchar_t *first, const wchar_t *last) + { return assign(first, last - first); } + wxString& assign(const wxCStrData& first, const wxCStrData& last) + { return assign(CreateConstIterator(first), CreateConstIterator(last)); } +#endif // WXWIN_COMPATIBILITY_STRING_PTR_AS_ITER + + // string comparison + int compare(const wxString& str) const; + int compare(const char* sz) const; + int compare(const wchar_t* sz) const; + int compare(const wxCStrData& str) const + { return compare(str.AsString()); } + int compare(const wxScopedCharBuffer& str) const + { return compare(str.data()); } + int compare(const wxScopedWCharBuffer& str) const + { return compare(str.data()); } + // comparison with a substring + int compare(size_t nStart, size_t nLen, const wxString& str) const; + // comparison of 2 substrings + int compare(size_t nStart, size_t nLen, + const wxString& str, size_t nStart2, size_t nLen2) const; + // substring comparison with first nCount characters of sz + int compare(size_t nStart, size_t nLen, + const char* sz, size_t nCount = npos) const; + int compare(size_t nStart, size_t nLen, + const wchar_t* sz, size_t nCount = npos) const; + + // insert another string + wxString& insert(size_t nPos, const wxString& str) + { insert(GetIterForNthChar(nPos), str.begin(), str.end()); return *this; } + // insert n chars of str starting at nStart (in str) + wxString& insert(size_t nPos, const wxString& str, size_t nStart, size_t n) + { + wxSTRING_UPDATE_CACHED_LENGTH(n); + + size_t from, len; + str.PosLenToImpl(nStart, n, &from, &len); + m_impl.insert(PosToImpl(nPos), str.m_impl, from, len); + + return *this; + } + + // insert first n (or all if n == npos) characters of sz + wxString& insert(size_t nPos, const char *sz) + { + wxSTRING_INVALIDATE_CACHE(); + + m_impl.insert(PosToImpl(nPos), ImplStr(sz)); + + return *this; + } + + wxString& insert(size_t nPos, const wchar_t *sz) + { + wxSTRING_INVALIDATE_CACHE(); + + m_impl.insert(PosToImpl(nPos), ImplStr(sz)); return *this; + } + + wxString& insert(size_t nPos, const char *sz, size_t n) + { + wxSTRING_UPDATE_CACHED_LENGTH(n); + + SubstrBufFromMB str(ImplStr(sz, n)); + m_impl.insert(PosToImpl(nPos), str.data, str.len); + + return *this; + } + + wxString& insert(size_t nPos, const wchar_t *sz, size_t n) + { + wxSTRING_UPDATE_CACHED_LENGTH(n); + + SubstrBufFromWC str(ImplStr(sz, n)); + m_impl.insert(PosToImpl(nPos), str.data, str.len); + + return *this; + } + + // insert n copies of ch + wxString& insert(size_t nPos, size_t n, wxUniChar ch) + { + wxSTRING_UPDATE_CACHED_LENGTH(n); + +#if wxUSE_UNICODE_UTF8 + if ( !ch.IsAscii() ) + m_impl.insert(PosToImpl(nPos), wxStringOperations::EncodeNChars(n, ch)); + else +#endif + m_impl.insert(PosToImpl(nPos), n, (wxStringCharType)ch); + return *this; + } + + iterator insert(iterator it, wxUniChar ch) + { + wxSTRING_UPDATE_CACHED_LENGTH(1); + +#if wxUSE_UNICODE_UTF8 + if ( !ch.IsAscii() ) + { + size_t pos = IterToImplPos(it); + m_impl.insert(pos, wxStringOperations::EncodeChar(ch)); + return iterator(this, m_impl.begin() + pos); + } + else +#endif + return iterator(this, m_impl.insert(it.impl(), (wxStringCharType)ch)); + } + + void insert(iterator it, const_iterator first, const_iterator last) + { + wxSTRING_INVALIDATE_CACHE(); + + m_impl.insert(it.impl(), first.impl(), last.impl()); + } + +#if WXWIN_COMPATIBILITY_STRING_PTR_AS_ITER + void insert(iterator it, const char *first, const char *last) + { insert(it - begin(), first, last - first); } + void insert(iterator it, const wchar_t *first, const wchar_t *last) + { insert(it - begin(), first, last - first); } + void insert(iterator it, const wxCStrData& first, const wxCStrData& last) + { insert(it, CreateConstIterator(first), CreateConstIterator(last)); } +#endif // WXWIN_COMPATIBILITY_STRING_PTR_AS_ITER + + void insert(iterator it, size_type n, wxUniChar ch) + { + wxSTRING_UPDATE_CACHED_LENGTH(n); + +#if wxUSE_UNICODE_UTF8 + if ( !ch.IsAscii() ) + m_impl.insert(IterToImplPos(it), wxStringOperations::EncodeNChars(n, ch)); + else +#endif + m_impl.insert(it.impl(), n, (wxStringCharType)ch); + } + + // delete characters from nStart to nStart + nLen + wxString& erase(size_type pos = 0, size_type n = npos) + { + wxSTRING_INVALIDATE_CACHE(); + + size_t from, len; + PosLenToImpl(pos, n, &from, &len); + m_impl.erase(from, len); + + return *this; + } + + // delete characters from first up to last + iterator erase(iterator first, iterator last) + { + wxSTRING_INVALIDATE_CACHE(); + + return iterator(this, m_impl.erase(first.impl(), last.impl())); + } + + iterator erase(iterator first) + { + wxSTRING_UPDATE_CACHED_LENGTH(-1); + + return iterator(this, m_impl.erase(first.impl())); + } + +#ifdef wxSTRING_BASE_HASNT_CLEAR + void clear() { erase(); } +#else + void clear() + { + wxSTRING_SET_CACHED_LENGTH(0); + + m_impl.clear(); + } +#endif + + // replaces the substring of length nLen starting at nStart + wxString& replace(size_t nStart, size_t nLen, const char* sz) + { + wxSTRING_INVALIDATE_CACHE(); + + size_t from, len; + PosLenToImpl(nStart, nLen, &from, &len); + m_impl.replace(from, len, ImplStr(sz)); + + return *this; + } + + wxString& replace(size_t nStart, size_t nLen, const wchar_t* sz) + { + wxSTRING_INVALIDATE_CACHE(); + + size_t from, len; + PosLenToImpl(nStart, nLen, &from, &len); + m_impl.replace(from, len, ImplStr(sz)); + + return *this; + } + + // replaces the substring of length nLen starting at nStart + wxString& replace(size_t nStart, size_t nLen, const wxString& str) + { + wxSTRING_INVALIDATE_CACHE(); + + size_t from, len; + PosLenToImpl(nStart, nLen, &from, &len); + m_impl.replace(from, len, str.m_impl); + + return *this; + } + + // replaces the substring with nCount copies of ch + wxString& replace(size_t nStart, size_t nLen, size_t nCount, wxUniChar ch) + { + wxSTRING_INVALIDATE_CACHE(); + + size_t from, len; + PosLenToImpl(nStart, nLen, &from, &len); +#if wxUSE_UNICODE_UTF8 + if ( !ch.IsAscii() ) + m_impl.replace(from, len, wxStringOperations::EncodeNChars(nCount, ch)); + else +#endif + m_impl.replace(from, len, nCount, (wxStringCharType)ch); + + return *this; + } + + // replaces a substring with another substring + wxString& replace(size_t nStart, size_t nLen, + const wxString& str, size_t nStart2, size_t nLen2) + { + wxSTRING_INVALIDATE_CACHE(); + + size_t from, len; + PosLenToImpl(nStart, nLen, &from, &len); + + size_t from2, len2; + str.PosLenToImpl(nStart2, nLen2, &from2, &len2); + + m_impl.replace(from, len, str.m_impl, from2, len2); + + return *this; + } + + // replaces the substring with first nCount chars of sz + wxString& replace(size_t nStart, size_t nLen, + const char* sz, size_t nCount) + { + wxSTRING_INVALIDATE_CACHE(); + + size_t from, len; + PosLenToImpl(nStart, nLen, &from, &len); + + SubstrBufFromMB str(ImplStr(sz, nCount)); + + m_impl.replace(from, len, str.data, str.len); + + return *this; + } + + wxString& replace(size_t nStart, size_t nLen, + const wchar_t* sz, size_t nCount) + { + wxSTRING_INVALIDATE_CACHE(); + + size_t from, len; + PosLenToImpl(nStart, nLen, &from, &len); + + SubstrBufFromWC str(ImplStr(sz, nCount)); + + m_impl.replace(from, len, str.data, str.len); + + return *this; + } + + wxString& replace(size_t nStart, size_t nLen, + const wxString& s, size_t nCount) + { + wxSTRING_INVALIDATE_CACHE(); + + size_t from, len; + PosLenToImpl(nStart, nLen, &from, &len); + m_impl.replace(from, len, s.m_impl.c_str(), s.LenToImpl(nCount)); + + return *this; + } + + wxString& replace(iterator first, iterator last, const char* s) + { + wxSTRING_INVALIDATE_CACHE(); + + m_impl.replace(first.impl(), last.impl(), ImplStr(s)); + + return *this; + } + + wxString& replace(iterator first, iterator last, const wchar_t* s) + { + wxSTRING_INVALIDATE_CACHE(); + + m_impl.replace(first.impl(), last.impl(), ImplStr(s)); + + return *this; + } + + wxString& replace(iterator first, iterator last, const char* s, size_type n) + { + wxSTRING_INVALIDATE_CACHE(); + + SubstrBufFromMB str(ImplStr(s, n)); + m_impl.replace(first.impl(), last.impl(), str.data, str.len); + + return *this; + } + + wxString& replace(iterator first, iterator last, const wchar_t* s, size_type n) + { + wxSTRING_INVALIDATE_CACHE(); + + SubstrBufFromWC str(ImplStr(s, n)); + m_impl.replace(first.impl(), last.impl(), str.data, str.len); + + return *this; + } + + wxString& replace(iterator first, iterator last, const wxString& s) + { + wxSTRING_INVALIDATE_CACHE(); + + m_impl.replace(first.impl(), last.impl(), s.m_impl); + + return *this; + } + + wxString& replace(iterator first, iterator last, size_type n, wxUniChar ch) + { + wxSTRING_INVALIDATE_CACHE(); + +#if wxUSE_UNICODE_UTF8 + if ( !ch.IsAscii() ) + m_impl.replace(first.impl(), last.impl(), + wxStringOperations::EncodeNChars(n, ch)); + else +#endif + m_impl.replace(first.impl(), last.impl(), n, (wxStringCharType)ch); + + return *this; + } + + wxString& replace(iterator first, iterator last, + const_iterator first1, const_iterator last1) + { + wxSTRING_INVALIDATE_CACHE(); + + m_impl.replace(first.impl(), last.impl(), first1.impl(), last1.impl()); + + return *this; + } + + wxString& replace(iterator first, iterator last, + const char *first1, const char *last1) + { replace(first, last, first1, last1 - first1); return *this; } + wxString& replace(iterator first, iterator last, + const wchar_t *first1, const wchar_t *last1) + { replace(first, last, first1, last1 - first1); return *this; } + + // swap two strings + void swap(wxString& str) + { +#if wxUSE_STRING_POS_CACHE + // we modify not only this string but also the other one directly so we + // need to invalidate cache for both of them (we could also try to + // exchange their cache entries but it seems unlikely to be worth it) + InvalidateCache(); + str.InvalidateCache(); +#endif // wxUSE_STRING_POS_CACHE + + m_impl.swap(str.m_impl); + } + + // find a substring + size_t find(const wxString& str, size_t nStart = 0) const + { return PosFromImpl(m_impl.find(str.m_impl, PosToImpl(nStart))); } + + // find first n characters of sz + size_t find(const char* sz, size_t nStart = 0, size_t n = npos) const + { + SubstrBufFromMB str(ImplStr(sz, n)); + return PosFromImpl(m_impl.find(str.data, PosToImpl(nStart), str.len)); + } + size_t find(const wchar_t* sz, size_t nStart = 0, size_t n = npos) const + { + SubstrBufFromWC str(ImplStr(sz, n)); + return PosFromImpl(m_impl.find(str.data, PosToImpl(nStart), str.len)); + } + size_t find(const wxScopedCharBuffer& s, size_t nStart = 0, size_t n = npos) const + { return find(s.data(), nStart, n); } + size_t find(const wxScopedWCharBuffer& s, size_t nStart = 0, size_t n = npos) const + { return find(s.data(), nStart, n); } + size_t find(const wxCStrData& s, size_t nStart = 0, size_t n = npos) const + { return find(s.AsWChar(), nStart, n); } + + // find the first occurrence of character ch after nStart + size_t find(wxUniChar ch, size_t nStart = 0) const + { +#if wxUSE_UNICODE_UTF8 + if ( !ch.IsAscii() ) + return PosFromImpl(m_impl.find(wxStringOperations::EncodeChar(ch), + PosToImpl(nStart))); + else +#endif + return PosFromImpl(m_impl.find((wxStringCharType)ch, + PosToImpl(nStart))); + + } + size_t find(wxUniCharRef ch, size_t nStart = 0) const + { return find(wxUniChar(ch), nStart); } + size_t find(char ch, size_t nStart = 0) const + { return find(wxUniChar(ch), nStart); } + size_t find(unsigned char ch, size_t nStart = 0) const + { return find(wxUniChar(ch), nStart); } + size_t find(wchar_t ch, size_t nStart = 0) const + { return find(wxUniChar(ch), nStart); } + + // rfind() family is exactly like find() but works right to left + + // as find, but from the end + size_t rfind(const wxString& str, size_t nStart = npos) const + { return PosFromImpl(m_impl.rfind(str.m_impl, PosToImpl(nStart))); } + + // as find, but from the end + size_t rfind(const char* sz, size_t nStart = npos, size_t n = npos) const + { + SubstrBufFromMB str(ImplStr(sz, n)); + return PosFromImpl(m_impl.rfind(str.data, PosToImpl(nStart), str.len)); + } + size_t rfind(const wchar_t* sz, size_t nStart = npos, size_t n = npos) const + { + SubstrBufFromWC str(ImplStr(sz, n)); + return PosFromImpl(m_impl.rfind(str.data, PosToImpl(nStart), str.len)); + } + size_t rfind(const wxScopedCharBuffer& s, size_t nStart = npos, size_t n = npos) const + { return rfind(s.data(), nStart, n); } + size_t rfind(const wxScopedWCharBuffer& s, size_t nStart = npos, size_t n = npos) const + { return rfind(s.data(), nStart, n); } + size_t rfind(const wxCStrData& s, size_t nStart = npos, size_t n = npos) const + { return rfind(s.AsWChar(), nStart, n); } + // as find, but from the end + size_t rfind(wxUniChar ch, size_t nStart = npos) const + { +#if wxUSE_UNICODE_UTF8 + if ( !ch.IsAscii() ) + return PosFromImpl(m_impl.rfind(wxStringOperations::EncodeChar(ch), + PosToImpl(nStart))); + else +#endif + return PosFromImpl(m_impl.rfind((wxStringCharType)ch, + PosToImpl(nStart))); + } + size_t rfind(wxUniCharRef ch, size_t nStart = npos) const + { return rfind(wxUniChar(ch), nStart); } + size_t rfind(char ch, size_t nStart = npos) const + { return rfind(wxUniChar(ch), nStart); } + size_t rfind(unsigned char ch, size_t nStart = npos) const + { return rfind(wxUniChar(ch), nStart); } + size_t rfind(wchar_t ch, size_t nStart = npos) const + { return rfind(wxUniChar(ch), nStart); } + + // find first/last occurrence of any character (not) in the set: +#if wxUSE_STL_BASED_WXSTRING && !wxUSE_UNICODE_UTF8 + // FIXME-UTF8: this is not entirely correct, because it doesn't work if + // sizeof(wchar_t)==2 and surrogates are present in the string; + // should we care? Probably not. + size_t find_first_of(const wxString& str, size_t nStart = 0) const + { return m_impl.find_first_of(str.m_impl, nStart); } + size_t find_first_of(const char* sz, size_t nStart = 0) const + { return m_impl.find_first_of(ImplStr(sz), nStart); } + size_t find_first_of(const wchar_t* sz, size_t nStart = 0) const + { return m_impl.find_first_of(ImplStr(sz), nStart); } + size_t find_first_of(const char* sz, size_t nStart, size_t n) const + { return m_impl.find_first_of(ImplStr(sz), nStart, n); } + size_t find_first_of(const wchar_t* sz, size_t nStart, size_t n) const + { return m_impl.find_first_of(ImplStr(sz), nStart, n); } + size_t find_first_of(wxUniChar c, size_t nStart = 0) const + { return m_impl.find_first_of((wxChar)c, nStart); } + + size_t find_last_of(const wxString& str, size_t nStart = npos) const + { return m_impl.find_last_of(str.m_impl, nStart); } + size_t find_last_of(const char* sz, size_t nStart = npos) const + { return m_impl.find_last_of(ImplStr(sz), nStart); } + size_t find_last_of(const wchar_t* sz, size_t nStart = npos) const + { return m_impl.find_last_of(ImplStr(sz), nStart); } + size_t find_last_of(const char* sz, size_t nStart, size_t n) const + { return m_impl.find_last_of(ImplStr(sz), nStart, n); } + size_t find_last_of(const wchar_t* sz, size_t nStart, size_t n) const + { return m_impl.find_last_of(ImplStr(sz), nStart, n); } + size_t find_last_of(wxUniChar c, size_t nStart = npos) const + { return m_impl.find_last_of((wxChar)c, nStart); } + + size_t find_first_not_of(const wxString& str, size_t nStart = 0) const + { return m_impl.find_first_not_of(str.m_impl, nStart); } + size_t find_first_not_of(const char* sz, size_t nStart = 0) const + { return m_impl.find_first_not_of(ImplStr(sz), nStart); } + size_t find_first_not_of(const wchar_t* sz, size_t nStart = 0) const + { return m_impl.find_first_not_of(ImplStr(sz), nStart); } + size_t find_first_not_of(const char* sz, size_t nStart, size_t n) const + { return m_impl.find_first_not_of(ImplStr(sz), nStart, n); } + size_t find_first_not_of(const wchar_t* sz, size_t nStart, size_t n) const + { return m_impl.find_first_not_of(ImplStr(sz), nStart, n); } + size_t find_first_not_of(wxUniChar c, size_t nStart = 0) const + { return m_impl.find_first_not_of((wxChar)c, nStart); } + + size_t find_last_not_of(const wxString& str, size_t nStart = npos) const + { return m_impl.find_last_not_of(str.m_impl, nStart); } + size_t find_last_not_of(const char* sz, size_t nStart = npos) const + { return m_impl.find_last_not_of(ImplStr(sz), nStart); } + size_t find_last_not_of(const wchar_t* sz, size_t nStart = npos) const + { return m_impl.find_last_not_of(ImplStr(sz), nStart); } + size_t find_last_not_of(const char* sz, size_t nStart, size_t n) const + { return m_impl.find_last_not_of(ImplStr(sz), nStart, n); } + size_t find_last_not_of(const wchar_t* sz, size_t nStart, size_t n) const + { return m_impl.find_last_not_of(ImplStr(sz), nStart, n); } + size_t find_last_not_of(wxUniChar c, size_t nStart = npos) const + { return m_impl.find_last_not_of((wxChar)c, nStart); } +#else + // we can't use std::string implementation in UTF-8 build, because the + // character sets would be interpreted wrongly: + + // as strpbrk() but starts at nStart, returns npos if not found + size_t find_first_of(const wxString& str, size_t nStart = 0) const +#if wxUSE_UNICODE // FIXME-UTF8: temporary + { return find_first_of(str.wc_str(), nStart); } +#else + { return find_first_of(str.mb_str(), nStart); } +#endif + // same as above + size_t find_first_of(const char* sz, size_t nStart = 0) const; + size_t find_first_of(const wchar_t* sz, size_t nStart = 0) const; + size_t find_first_of(const char* sz, size_t nStart, size_t n) const; + size_t find_first_of(const wchar_t* sz, size_t nStart, size_t n) const; + // same as find(char, size_t) + size_t find_first_of(wxUniChar c, size_t nStart = 0) const + { return find(c, nStart); } + // find the last (starting from nStart) char from str in this string + size_t find_last_of (const wxString& str, size_t nStart = npos) const +#if wxUSE_UNICODE // FIXME-UTF8: temporary + { return find_last_of(str.wc_str(), nStart); } +#else + { return find_last_of(str.mb_str(), nStart); } +#endif + // same as above + size_t find_last_of (const char* sz, size_t nStart = npos) const; + size_t find_last_of (const wchar_t* sz, size_t nStart = npos) const; + size_t find_last_of(const char* sz, size_t nStart, size_t n) const; + size_t find_last_of(const wchar_t* sz, size_t nStart, size_t n) const; + // same as above + size_t find_last_of(wxUniChar c, size_t nStart = npos) const + { return rfind(c, nStart); } + + // find first/last occurrence of any character not in the set + + // as strspn() (starting from nStart), returns npos on failure + size_t find_first_not_of(const wxString& str, size_t nStart = 0) const +#if wxUSE_UNICODE // FIXME-UTF8: temporary + { return find_first_not_of(str.wc_str(), nStart); } +#else + { return find_first_not_of(str.mb_str(), nStart); } +#endif + // same as above + size_t find_first_not_of(const char* sz, size_t nStart = 0) const; + size_t find_first_not_of(const wchar_t* sz, size_t nStart = 0) const; + size_t find_first_not_of(const char* sz, size_t nStart, size_t n) const; + size_t find_first_not_of(const wchar_t* sz, size_t nStart, size_t n) const; + // same as above + size_t find_first_not_of(wxUniChar ch, size_t nStart = 0) const; + // as strcspn() + size_t find_last_not_of(const wxString& str, size_t nStart = npos) const +#if wxUSE_UNICODE // FIXME-UTF8: temporary + { return find_last_not_of(str.wc_str(), nStart); } +#else + { return find_last_not_of(str.mb_str(), nStart); } +#endif + // same as above + size_t find_last_not_of(const char* sz, size_t nStart = npos) const; + size_t find_last_not_of(const wchar_t* sz, size_t nStart = npos) const; + size_t find_last_not_of(const char* sz, size_t nStart, size_t n) const; + size_t find_last_not_of(const wchar_t* sz, size_t nStart, size_t n) const; + // same as above + size_t find_last_not_of(wxUniChar ch, size_t nStart = npos) const; +#endif // wxUSE_STL_BASED_WXSTRING && !wxUSE_UNICODE_UTF8 or not + + // provide char/wchar_t/wxUniCharRef overloads for char-finding functions + // above to resolve ambiguities: + size_t find_first_of(wxUniCharRef ch, size_t nStart = 0) const + { return find_first_of(wxUniChar(ch), nStart); } + size_t find_first_of(char ch, size_t nStart = 0) const + { return find_first_of(wxUniChar(ch), nStart); } + size_t find_first_of(unsigned char ch, size_t nStart = 0) const + { return find_first_of(wxUniChar(ch), nStart); } + size_t find_first_of(wchar_t ch, size_t nStart = 0) const + { return find_first_of(wxUniChar(ch), nStart); } + size_t find_last_of(wxUniCharRef ch, size_t nStart = npos) const + { return find_last_of(wxUniChar(ch), nStart); } + size_t find_last_of(char ch, size_t nStart = npos) const + { return find_last_of(wxUniChar(ch), nStart); } + size_t find_last_of(unsigned char ch, size_t nStart = npos) const + { return find_last_of(wxUniChar(ch), nStart); } + size_t find_last_of(wchar_t ch, size_t nStart = npos) const + { return find_last_of(wxUniChar(ch), nStart); } + size_t find_first_not_of(wxUniCharRef ch, size_t nStart = 0) const + { return find_first_not_of(wxUniChar(ch), nStart); } + size_t find_first_not_of(char ch, size_t nStart = 0) const + { return find_first_not_of(wxUniChar(ch), nStart); } + size_t find_first_not_of(unsigned char ch, size_t nStart = 0) const + { return find_first_not_of(wxUniChar(ch), nStart); } + size_t find_first_not_of(wchar_t ch, size_t nStart = 0) const + { return find_first_not_of(wxUniChar(ch), nStart); } + size_t find_last_not_of(wxUniCharRef ch, size_t nStart = npos) const + { return find_last_not_of(wxUniChar(ch), nStart); } + size_t find_last_not_of(char ch, size_t nStart = npos) const + { return find_last_not_of(wxUniChar(ch), nStart); } + size_t find_last_not_of(unsigned char ch, size_t nStart = npos) const + { return find_last_not_of(wxUniChar(ch), nStart); } + size_t find_last_not_of(wchar_t ch, size_t nStart = npos) const + { return find_last_not_of(wxUniChar(ch), nStart); } + + // and additional overloads for the versions taking strings: + size_t find_first_of(const wxCStrData& sz, size_t nStart = 0) const + { return find_first_of(sz.AsString(), nStart); } + size_t find_first_of(const wxScopedCharBuffer& sz, size_t nStart = 0) const + { return find_first_of(sz.data(), nStart); } + size_t find_first_of(const wxScopedWCharBuffer& sz, size_t nStart = 0) const + { return find_first_of(sz.data(), nStart); } + size_t find_first_of(const wxCStrData& sz, size_t nStart, size_t n) const + { return find_first_of(sz.AsWChar(), nStart, n); } + size_t find_first_of(const wxScopedCharBuffer& sz, size_t nStart, size_t n) const + { return find_first_of(sz.data(), nStart, n); } + size_t find_first_of(const wxScopedWCharBuffer& sz, size_t nStart, size_t n) const + { return find_first_of(sz.data(), nStart, n); } + + size_t find_last_of(const wxCStrData& sz, size_t nStart = 0) const + { return find_last_of(sz.AsString(), nStart); } + size_t find_last_of(const wxScopedCharBuffer& sz, size_t nStart = 0) const + { return find_last_of(sz.data(), nStart); } + size_t find_last_of(const wxScopedWCharBuffer& sz, size_t nStart = 0) const + { return find_last_of(sz.data(), nStart); } + size_t find_last_of(const wxCStrData& sz, size_t nStart, size_t n) const + { return find_last_of(sz.AsWChar(), nStart, n); } + size_t find_last_of(const wxScopedCharBuffer& sz, size_t nStart, size_t n) const + { return find_last_of(sz.data(), nStart, n); } + size_t find_last_of(const wxScopedWCharBuffer& sz, size_t nStart, size_t n) const + { return find_last_of(sz.data(), nStart, n); } + + size_t find_first_not_of(const wxCStrData& sz, size_t nStart = 0) const + { return find_first_not_of(sz.AsString(), nStart); } + size_t find_first_not_of(const wxScopedCharBuffer& sz, size_t nStart = 0) const + { return find_first_not_of(sz.data(), nStart); } + size_t find_first_not_of(const wxScopedWCharBuffer& sz, size_t nStart = 0) const + { return find_first_not_of(sz.data(), nStart); } + size_t find_first_not_of(const wxCStrData& sz, size_t nStart, size_t n) const + { return find_first_not_of(sz.AsWChar(), nStart, n); } + size_t find_first_not_of(const wxScopedCharBuffer& sz, size_t nStart, size_t n) const + { return find_first_not_of(sz.data(), nStart, n); } + size_t find_first_not_of(const wxScopedWCharBuffer& sz, size_t nStart, size_t n) const + { return find_first_not_of(sz.data(), nStart, n); } + + size_t find_last_not_of(const wxCStrData& sz, size_t nStart = 0) const + { return find_last_not_of(sz.AsString(), nStart); } + size_t find_last_not_of(const wxScopedCharBuffer& sz, size_t nStart = 0) const + { return find_last_not_of(sz.data(), nStart); } + size_t find_last_not_of(const wxScopedWCharBuffer& sz, size_t nStart = 0) const + { return find_last_not_of(sz.data(), nStart); } + size_t find_last_not_of(const wxCStrData& sz, size_t nStart, size_t n) const + { return find_last_not_of(sz.AsWChar(), nStart, n); } + size_t find_last_not_of(const wxScopedCharBuffer& sz, size_t nStart, size_t n) const + { return find_last_not_of(sz.data(), nStart, n); } + size_t find_last_not_of(const wxScopedWCharBuffer& sz, size_t nStart, size_t n) const + { return find_last_not_of(sz.data(), nStart, n); } + + // string += string + wxString& operator+=(const wxString& s) + { + wxSTRING_INVALIDATE_CACHED_LENGTH(); + + m_impl += s.m_impl; + return *this; + } + // string += C string + wxString& operator+=(const char *psz) + { + wxSTRING_INVALIDATE_CACHED_LENGTH(); + + m_impl += ImplStr(psz); + return *this; + } + wxString& operator+=(const wchar_t *pwz) + { + wxSTRING_INVALIDATE_CACHED_LENGTH(); + + m_impl += ImplStr(pwz); + return *this; + } + wxString& operator+=(const wxCStrData& s) + { + wxSTRING_INVALIDATE_CACHED_LENGTH(); + + m_impl += s.AsString().m_impl; + return *this; + } + wxString& operator+=(const wxScopedCharBuffer& s) + { return append(s); } + wxString& operator+=(const wxScopedWCharBuffer& s) + { return append(s); } + // string += char + wxString& operator+=(wxUniChar ch) + { + wxSTRING_UPDATE_CACHED_LENGTH(1); + +#if wxUSE_UNICODE_UTF8 + if ( !ch.IsAscii() ) + m_impl += wxStringOperations::EncodeChar(ch); + else +#endif + m_impl += (wxStringCharType)ch; + return *this; + } + wxString& operator+=(wxUniCharRef ch) { return *this += wxUniChar(ch); } + wxString& operator+=(int ch) { return *this += wxUniChar(ch); } + wxString& operator+=(char ch) { return *this += wxUniChar(ch); } + wxString& operator+=(unsigned char ch) { return *this += wxUniChar(ch); } + wxString& operator+=(wchar_t ch) { return *this += wxUniChar(ch); } + +private: +#if !wxUSE_STL_BASED_WXSTRING + // helpers for wxStringBuffer and wxStringBufferLength + wxStringCharType *DoGetWriteBuf(size_t nLen) + { + return m_impl.DoGetWriteBuf(nLen); + } + + void DoUngetWriteBuf() + { + wxSTRING_INVALIDATE_CACHE(); + + m_impl.DoUngetWriteBuf(); + } + + void DoUngetWriteBuf(size_t nLen) + { + wxSTRING_INVALIDATE_CACHE(); + + m_impl.DoUngetWriteBuf(nLen); + } +#endif // !wxUSE_STL_BASED_WXSTRING + +#ifndef wxNEEDS_WXSTRING_PRINTF_MIXIN + #if !wxUSE_UTF8_LOCALE_ONLY + int DoPrintfWchar(const wxChar *format, ...); + static wxString DoFormatWchar(const wxChar *format, ...); + #endif + #if wxUSE_UNICODE_UTF8 + int DoPrintfUtf8(const char *format, ...); + static wxString DoFormatUtf8(const char *format, ...); + #endif +#endif + +#if !wxUSE_STL_BASED_WXSTRING + // check string's data validity + bool IsValid() const { return m_impl.GetStringData()->IsValid(); } +#endif + +private: + wxStringImpl m_impl; + + // buffers for compatibility conversion from (char*)c_str() and + // (wchar_t*)c_str(): the pointers returned by these functions should remain + // valid until the string itself is modified for compatibility with the + // existing code and consistency with std::string::c_str() so returning a + // temporary buffer won't do and we need to cache the conversion results + + // TODO-UTF8: benchmark various approaches to keeping compatibility buffers + template<typename T> + struct ConvertedBuffer + { + // notice that there is no need to initialize m_len here as it's unused + // as long as m_str is NULL + ConvertedBuffer() : m_str(NULL) {} + ~ConvertedBuffer() + { free(m_str); } + + bool Extend(size_t len) + { + // add extra 1 for the trailing NUL + void * const str = realloc(m_str, sizeof(T)*(len + 1)); + if ( !str ) + return false; + + m_str = static_cast<T *>(str); + m_len = len; + + return true; + } + + const wxScopedCharTypeBuffer<T> AsScopedBuffer() const + { + return wxScopedCharTypeBuffer<T>::CreateNonOwned(m_str, m_len); + } + + T *m_str; // pointer to the string data + size_t m_len; // length, not size, i.e. in chars and without last NUL + }; + + +#if wxUSE_UNICODE + // common mb_str() and wxCStrData::AsChar() helper: performs the conversion + // and returns either m_convertedToChar.m_str (in which case its m_len is + // also updated) or NULL if it failed + // + // there is an important exception: in wxUSE_UNICODE_UTF8 build if conv is a + // UTF-8 one, we return m_impl.c_str() directly, without doing any conversion + // as optimization and so the caller needs to check for this before using + // m_convertedToChar + // + // NB: AsChar() returns char* in any build, unlike mb_str() + const char *AsChar(const wxMBConv& conv) const; + + // mb_str() implementation helper + wxScopedCharBuffer AsCharBuf(const wxMBConv& conv) const + { +#if wxUSE_UNICODE_UTF8 + // avoid conversion if we can + if ( conv.IsUTF8() ) + { + return wxScopedCharBuffer::CreateNonOwned(m_impl.c_str(), + m_impl.length()); + } +#endif // wxUSE_UNICODE_UTF8 + + // call this solely in order to fill in m_convertedToChar as AsChar() + // updates it as a side effect: this is a bit ugly but it's a completely + // internal function so the users of this class shouldn't care or know + // about it and doing it like this, i.e. having a separate AsChar(), + // allows us to avoid the creation and destruction of a temporary buffer + // when using wxCStrData without duplicating any code + if ( !AsChar(conv) ) + { + // although it would be probably more correct to return NULL buffer + // from here if the conversion fails, a lot of existing code doesn't + // expect mb_str() (or wc_str()) to ever return NULL so return an + // empty string otherwise to avoid crashes in it + // + // also, some existing code does check for the conversion success and + // so asserting here would be bad too -- even if it does mean that + // silently losing data is possible for badly written code + return wxScopedCharBuffer::CreateNonOwned("", 0); + } + + return m_convertedToChar.AsScopedBuffer(); + } + + ConvertedBuffer<char> m_convertedToChar; +#endif // !wxUSE_UNICODE + +#if !wxUSE_UNICODE_WCHAR + // common wc_str() and wxCStrData::AsWChar() helper for both UTF-8 and ANSI + // builds: converts the string contents into m_convertedToWChar and returns + // NULL if the conversion failed (this can only happen in ANSI build) + // + // NB: AsWChar() returns wchar_t* in any build, unlike wc_str() + const wchar_t *AsWChar(const wxMBConv& conv) const; + + // wc_str() implementation helper + wxScopedWCharBuffer AsWCharBuf(const wxMBConv& conv) const + { + if ( !AsWChar(conv) ) + return wxScopedWCharBuffer::CreateNonOwned(L"", 0); + + return m_convertedToWChar.AsScopedBuffer(); + } + + ConvertedBuffer<wchar_t> m_convertedToWChar; +#endif // !wxUSE_UNICODE_WCHAR + +#if wxUSE_UNICODE_UTF8 + // FIXME-UTF8: (try to) move this elsewhere (TLS) or solve differently + // assigning to character pointer to by wxString::iterator may + // change the underlying wxStringImpl iterator, so we have to + // keep track of all iterators and update them as necessary: + struct wxStringIteratorNodeHead + { + wxStringIteratorNodeHead() : ptr(NULL) {} + wxStringIteratorNode *ptr; + + // copying is disallowed as it would result in more than one pointer into + // the same linked list + wxDECLARE_NO_COPY_CLASS(wxStringIteratorNodeHead); + }; + + wxStringIteratorNodeHead m_iterators; + + friend class WXDLLIMPEXP_FWD_BASE wxStringIteratorNode; + friend class WXDLLIMPEXP_FWD_BASE wxUniCharRef; +#endif // wxUSE_UNICODE_UTF8 + + friend class WXDLLIMPEXP_FWD_BASE wxCStrData; + friend class wxStringInternalBuffer; + friend class wxStringInternalBufferLength; +}; + +#ifdef wxNEEDS_WXSTRING_PRINTF_MIXIN + #pragma warning (pop) +#endif + +// string iterator operators that satisfy STL Random Access Iterator +// requirements: +inline wxString::iterator operator+(ptrdiff_t n, wxString::iterator i) + { return i + n; } +inline wxString::const_iterator operator+(ptrdiff_t n, wxString::const_iterator i) + { return i + n; } +inline wxString::reverse_iterator operator+(ptrdiff_t n, wxString::reverse_iterator i) + { return i + n; } +inline wxString::const_reverse_iterator operator+(ptrdiff_t n, wxString::const_reverse_iterator i) + { return i + n; } + +// notice that even though for many compilers the friend declarations above are +// enough, from the point of view of C++ standard we must have the declarations +// here as friend ones are not injected in the enclosing namespace and without +// them the code fails to compile with conforming compilers such as xlC or g++4 +wxString WXDLLIMPEXP_BASE operator+(const wxString& string1, const wxString& string2); +wxString WXDLLIMPEXP_BASE operator+(const wxString& string, const char *psz); +wxString WXDLLIMPEXP_BASE operator+(const wxString& string, const wchar_t *pwz); +wxString WXDLLIMPEXP_BASE operator+(const char *psz, const wxString& string); +wxString WXDLLIMPEXP_BASE operator+(const wchar_t *pwz, const wxString& string); + +wxString WXDLLIMPEXP_BASE operator+(const wxString& string, wxUniChar ch); +wxString WXDLLIMPEXP_BASE operator+(wxUniChar ch, const wxString& string); + +inline wxString operator+(const wxString& string, wxUniCharRef ch) + { return string + (wxUniChar)ch; } +inline wxString operator+(const wxString& string, char ch) + { return string + wxUniChar(ch); } +inline wxString operator+(const wxString& string, wchar_t ch) + { return string + wxUniChar(ch); } +inline wxString operator+(wxUniCharRef ch, const wxString& string) + { return (wxUniChar)ch + string; } +inline wxString operator+(char ch, const wxString& string) + { return wxUniChar(ch) + string; } +inline wxString operator+(wchar_t ch, const wxString& string) + { return wxUniChar(ch) + string; } + + +#define wxGetEmptyString() wxString() + +// ---------------------------------------------------------------------------- +// helper functions which couldn't be defined inline +// ---------------------------------------------------------------------------- + +namespace wxPrivate +{ + +#if wxUSE_UNICODE_WCHAR + +template <> +struct wxStringAsBufHelper<char> +{ + static wxScopedCharBuffer Get(const wxString& s, size_t *len) + { + wxScopedCharBuffer buf(s.mb_str()); + if ( len ) + *len = buf ? strlen(buf) : 0; + return buf; + } +}; + +template <> +struct wxStringAsBufHelper<wchar_t> +{ + static wxScopedWCharBuffer Get(const wxString& s, size_t *len) + { + const size_t length = s.length(); + if ( len ) + *len = length; + return wxScopedWCharBuffer::CreateNonOwned(s.wx_str(), length); + } +}; + +#elif wxUSE_UNICODE_UTF8 + +template <> +struct wxStringAsBufHelper<char> +{ + static wxScopedCharBuffer Get(const wxString& s, size_t *len) + { + const size_t length = s.utf8_length(); + if ( len ) + *len = length; + return wxScopedCharBuffer::CreateNonOwned(s.wx_str(), length); + } +}; + +template <> +struct wxStringAsBufHelper<wchar_t> +{ + static wxScopedWCharBuffer Get(const wxString& s, size_t *len) + { + wxScopedWCharBuffer wbuf(s.wc_str()); + if ( len ) + *len = wxWcslen(wbuf); + return wbuf; + } +}; + +#endif // Unicode build kind + +} // namespace wxPrivate + +// ---------------------------------------------------------------------------- +// wxStringBuffer: a tiny class allowing to get a writable pointer into string +// ---------------------------------------------------------------------------- + +#if !wxUSE_STL_BASED_WXSTRING +// string buffer for direct access to string data in their native +// representation: +class wxStringInternalBuffer +{ +public: + typedef wxStringCharType CharType; + + wxStringInternalBuffer(wxString& str, size_t lenWanted = 1024) + : m_str(str), m_buf(NULL) + { m_buf = m_str.DoGetWriteBuf(lenWanted); } + + ~wxStringInternalBuffer() { m_str.DoUngetWriteBuf(); } + + operator wxStringCharType*() const { return m_buf; } + +private: + wxString& m_str; + wxStringCharType *m_buf; + + wxDECLARE_NO_COPY_CLASS(wxStringInternalBuffer); +}; + +class wxStringInternalBufferLength +{ +public: + typedef wxStringCharType CharType; + + wxStringInternalBufferLength(wxString& str, size_t lenWanted = 1024) + : m_str(str), m_buf(NULL), m_len(0), m_lenSet(false) + { + m_buf = m_str.DoGetWriteBuf(lenWanted); + wxASSERT(m_buf != NULL); + } + + ~wxStringInternalBufferLength() + { + wxASSERT(m_lenSet); + m_str.DoUngetWriteBuf(m_len); + } + + operator wxStringCharType*() const { return m_buf; } + void SetLength(size_t length) { m_len = length; m_lenSet = true; } + +private: + wxString& m_str; + wxStringCharType *m_buf; + size_t m_len; + bool m_lenSet; + + wxDECLARE_NO_COPY_CLASS(wxStringInternalBufferLength); +}; + +#endif // !wxUSE_STL_BASED_WXSTRING + +template<typename T> +class wxStringTypeBufferBase +{ +public: + typedef T CharType; + + wxStringTypeBufferBase(wxString& str, size_t lenWanted = 1024) + : m_str(str), m_buf(lenWanted) + { + // for compatibility with old wxStringBuffer which provided direct + // access to wxString internal buffer, initialize ourselves with the + // string initial contents + + // FIXME-VC6: remove the ugly (CharType *)NULL and use normal + // tchar_str<CharType> + size_t len; + const wxCharTypeBuffer<CharType> buf(str.tchar_str(&len, (CharType *)NULL)); + if ( buf ) + { + if ( len > lenWanted ) + { + // in this case there is not enough space for terminating NUL, + // ensure that we still put it there + m_buf.data()[lenWanted] = 0; + len = lenWanted - 1; + } + + memcpy(m_buf.data(), buf, (len + 1)*sizeof(CharType)); + } + //else: conversion failed, this can happen when trying to get Unicode + // string contents into a char string + } + + operator CharType*() { return m_buf.data(); } + +protected: + wxString& m_str; + wxCharTypeBuffer<CharType> m_buf; +}; + +template<typename T> +class wxStringTypeBufferLengthBase : public wxStringTypeBufferBase<T> +{ +public: + wxStringTypeBufferLengthBase(wxString& str, size_t lenWanted = 1024) + : wxStringTypeBufferBase<T>(str, lenWanted), + m_len(0), + m_lenSet(false) + { } + + ~wxStringTypeBufferLengthBase() + { + wxASSERT_MSG( this->m_lenSet, "forgot to call SetLength()" ); + } + + void SetLength(size_t length) { m_len = length; m_lenSet = true; } + +protected: + size_t m_len; + bool m_lenSet; +}; + +template<typename T> +class wxStringTypeBuffer : public wxStringTypeBufferBase<T> +{ +public: + wxStringTypeBuffer(wxString& str, size_t lenWanted = 1024) + : wxStringTypeBufferBase<T>(str, lenWanted) + { } + + ~wxStringTypeBuffer() + { + this->m_str.assign(this->m_buf.data()); + } + + wxDECLARE_NO_COPY_CLASS(wxStringTypeBuffer); +}; + +template<typename T> +class wxStringTypeBufferLength : public wxStringTypeBufferLengthBase<T> +{ +public: + wxStringTypeBufferLength(wxString& str, size_t lenWanted = 1024) + : wxStringTypeBufferLengthBase<T>(str, lenWanted) + { } + + ~wxStringTypeBufferLength() + { + this->m_str.assign(this->m_buf.data(), this->m_len); + } + + wxDECLARE_NO_COPY_CLASS(wxStringTypeBufferLength); +}; + +#if wxUSE_STL_BASED_WXSTRING + +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxStringTypeBufferBase<wxStringCharType> ) + +class wxStringInternalBuffer : public wxStringTypeBufferBase<wxStringCharType> +{ +public: + wxStringInternalBuffer(wxString& str, size_t lenWanted = 1024) + : wxStringTypeBufferBase<wxStringCharType>(str, lenWanted) {} + ~wxStringInternalBuffer() + { m_str.m_impl.assign(m_buf.data()); } + + wxDECLARE_NO_COPY_CLASS(wxStringInternalBuffer); +}; + +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( + wxStringTypeBufferLengthBase<wxStringCharType> ) + +class wxStringInternalBufferLength + : public wxStringTypeBufferLengthBase<wxStringCharType> +{ +public: + wxStringInternalBufferLength(wxString& str, size_t lenWanted = 1024) + : wxStringTypeBufferLengthBase<wxStringCharType>(str, lenWanted) {} + + ~wxStringInternalBufferLength() + { + m_str.m_impl.assign(m_buf.data(), m_len); + } + + wxDECLARE_NO_COPY_CLASS(wxStringInternalBufferLength); +}; + +#endif // wxUSE_STL_BASED_WXSTRING + + +#if wxUSE_STL_BASED_WXSTRING || wxUSE_UNICODE_UTF8 +typedef wxStringTypeBuffer<wxChar> wxStringBuffer; +typedef wxStringTypeBufferLength<wxChar> wxStringBufferLength; +#else // if !wxUSE_STL_BASED_WXSTRING && !wxUSE_UNICODE_UTF8 +typedef wxStringInternalBuffer wxStringBuffer; +typedef wxStringInternalBufferLength wxStringBufferLength; +#endif // !wxUSE_STL_BASED_WXSTRING && !wxUSE_UNICODE_UTF8 + +#if wxUSE_UNICODE_UTF8 +typedef wxStringInternalBuffer wxUTF8StringBuffer; +typedef wxStringInternalBufferLength wxUTF8StringBufferLength; +#elif wxUSE_UNICODE_WCHAR + +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxStringTypeBufferBase<char> ) + +// Note about inlined dtors in the classes below: this is done not for +// performance reasons but just to avoid linking errors in the MSVC DLL build +// under Windows: if a class has non-inline methods it must be declared as +// being DLL-exported but, due to an extremely interesting feature of MSVC 7 +// and later, any template class which is used as a base of a DLL-exported +// class is implicitly made DLL-exported too, as explained at the bottom of +// http://msdn.microsoft.com/en-us/library/twa2aw10.aspx (just to confirm: yes, +// _inheriting_ from a class can change whether it is being exported from DLL) +// +// But this results in link errors because the base template class is not DLL- +// exported, whether it is declared with WXDLLIMPEXP_BASE or not, because it +// does have only inline functions. So the simplest fix is to just make all the +// functions of these classes inline too. + +class wxUTF8StringBuffer : public wxStringTypeBufferBase<char> +{ +public: + wxUTF8StringBuffer(wxString& str, size_t lenWanted = 1024) + : wxStringTypeBufferBase<char>(str, lenWanted) {} + ~wxUTF8StringBuffer() + { + wxMBConvStrictUTF8 conv; + size_t wlen = conv.ToWChar(NULL, 0, m_buf); + wxCHECK_RET( wlen != wxCONV_FAILED, "invalid UTF-8 data in string buffer?" ); + + wxStringInternalBuffer wbuf(m_str, wlen); + conv.ToWChar(wbuf, wlen, m_buf); + } + + wxDECLARE_NO_COPY_CLASS(wxUTF8StringBuffer); +}; + +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxStringTypeBufferLengthBase<char> ) + +class wxUTF8StringBufferLength : public wxStringTypeBufferLengthBase<char> +{ +public: + wxUTF8StringBufferLength(wxString& str, size_t lenWanted = 1024) + : wxStringTypeBufferLengthBase<char>(str, lenWanted) {} + ~wxUTF8StringBufferLength() + { + wxCHECK_RET(m_lenSet, "length not set"); + + wxMBConvStrictUTF8 conv; + size_t wlen = conv.ToWChar(NULL, 0, m_buf, m_len); + wxCHECK_RET( wlen != wxCONV_FAILED, "invalid UTF-8 data in string buffer?" ); + + wxStringInternalBufferLength wbuf(m_str, wlen); + conv.ToWChar(wbuf, wlen, m_buf, m_len); + wbuf.SetLength(wlen); + } + + wxDECLARE_NO_COPY_CLASS(wxUTF8StringBufferLength); +}; +#endif // wxUSE_UNICODE_UTF8/wxUSE_UNICODE_WCHAR + + +// --------------------------------------------------------------------------- +// wxString comparison functions: operator versions are always case sensitive +// --------------------------------------------------------------------------- + +#define wxCMP_WXCHAR_STRING(p, s, op) 0 op s.Cmp(p) + +wxDEFINE_ALL_COMPARISONS(const wxChar *, const wxString&, wxCMP_WXCHAR_STRING) + +#undef wxCMP_WXCHAR_STRING + +inline bool operator==(const wxString& s1, const wxString& s2) + { return s1.IsSameAs(s2); } +inline bool operator!=(const wxString& s1, const wxString& s2) + { return !s1.IsSameAs(s2); } +inline bool operator< (const wxString& s1, const wxString& s2) + { return s1.Cmp(s2) < 0; } +inline bool operator> (const wxString& s1, const wxString& s2) + { return s1.Cmp(s2) > 0; } +inline bool operator<=(const wxString& s1, const wxString& s2) + { return s1.Cmp(s2) <= 0; } +inline bool operator>=(const wxString& s1, const wxString& s2) + { return s1.Cmp(s2) >= 0; } + +inline bool operator==(const wxString& s1, const wxCStrData& s2) + { return s1 == s2.AsString(); } +inline bool operator==(const wxCStrData& s1, const wxString& s2) + { return s1.AsString() == s2; } +inline bool operator!=(const wxString& s1, const wxCStrData& s2) + { return s1 != s2.AsString(); } +inline bool operator!=(const wxCStrData& s1, const wxString& s2) + { return s1.AsString() != s2; } + +inline bool operator==(const wxString& s1, const wxScopedWCharBuffer& s2) + { return (s1.Cmp((const wchar_t *)s2) == 0); } +inline bool operator==(const wxScopedWCharBuffer& s1, const wxString& s2) + { return (s2.Cmp((const wchar_t *)s1) == 0); } +inline bool operator!=(const wxString& s1, const wxScopedWCharBuffer& s2) + { return (s1.Cmp((const wchar_t *)s2) != 0); } +inline bool operator!=(const wxScopedWCharBuffer& s1, const wxString& s2) + { return (s2.Cmp((const wchar_t *)s1) != 0); } + +inline bool operator==(const wxString& s1, const wxScopedCharBuffer& s2) + { return (s1.Cmp((const char *)s2) == 0); } +inline bool operator==(const wxScopedCharBuffer& s1, const wxString& s2) + { return (s2.Cmp((const char *)s1) == 0); } +inline bool operator!=(const wxString& s1, const wxScopedCharBuffer& s2) + { return (s1.Cmp((const char *)s2) != 0); } +inline bool operator!=(const wxScopedCharBuffer& s1, const wxString& s2) + { return (s2.Cmp((const char *)s1) != 0); } + +inline wxString operator+(const wxString& string, const wxScopedWCharBuffer& buf) + { return string + (const wchar_t *)buf; } +inline wxString operator+(const wxScopedWCharBuffer& buf, const wxString& string) + { return (const wchar_t *)buf + string; } + +inline wxString operator+(const wxString& string, const wxScopedCharBuffer& buf) + { return string + (const char *)buf; } +inline wxString operator+(const wxScopedCharBuffer& buf, const wxString& string) + { return (const char *)buf + string; } + +// comparison with char +inline bool operator==(const wxUniChar& c, const wxString& s) { return s.IsSameAs(c); } +inline bool operator==(const wxUniCharRef& c, const wxString& s) { return s.IsSameAs(c); } +inline bool operator==(char c, const wxString& s) { return s.IsSameAs(c); } +inline bool operator==(wchar_t c, const wxString& s) { return s.IsSameAs(c); } +inline bool operator==(int c, const wxString& s) { return s.IsSameAs(c); } +inline bool operator==(const wxString& s, const wxUniChar& c) { return s.IsSameAs(c); } +inline bool operator==(const wxString& s, const wxUniCharRef& c) { return s.IsSameAs(c); } +inline bool operator==(const wxString& s, char c) { return s.IsSameAs(c); } +inline bool operator==(const wxString& s, wchar_t c) { return s.IsSameAs(c); } +inline bool operator!=(const wxUniChar& c, const wxString& s) { return !s.IsSameAs(c); } +inline bool operator!=(const wxUniCharRef& c, const wxString& s) { return !s.IsSameAs(c); } +inline bool operator!=(char c, const wxString& s) { return !s.IsSameAs(c); } +inline bool operator!=(wchar_t c, const wxString& s) { return !s.IsSameAs(c); } +inline bool operator!=(int c, const wxString& s) { return !s.IsSameAs(c); } +inline bool operator!=(const wxString& s, const wxUniChar& c) { return !s.IsSameAs(c); } +inline bool operator!=(const wxString& s, const wxUniCharRef& c) { return !s.IsSameAs(c); } +inline bool operator!=(const wxString& s, char c) { return !s.IsSameAs(c); } +inline bool operator!=(const wxString& s, wchar_t c) { return !s.IsSameAs(c); } + + +// wxString iterators comparisons +inline bool wxString::iterator::operator==(const const_iterator& i) const + { return i == *this; } +inline bool wxString::iterator::operator!=(const const_iterator& i) const + { return i != *this; } +inline bool wxString::iterator::operator<(const const_iterator& i) const + { return i > *this; } +inline bool wxString::iterator::operator>(const const_iterator& i) const + { return i < *this; } +inline bool wxString::iterator::operator<=(const const_iterator& i) const + { return i >= *this; } +inline bool wxString::iterator::operator>=(const const_iterator& i) const + { return i <= *this; } + +// comparison with C string in Unicode build +#if wxUSE_UNICODE + +#define wxCMP_CHAR_STRING(p, s, op) wxString(p) op s + +wxDEFINE_ALL_COMPARISONS(const char *, const wxString&, wxCMP_CHAR_STRING) + +#undef wxCMP_CHAR_STRING + +#endif // wxUSE_UNICODE + +// we also need to provide the operators for comparison with wxCStrData to +// resolve ambiguity between operator(const wxChar *,const wxString &) and +// operator(const wxChar *, const wxChar *) for "p == s.c_str()" +// +// notice that these are (shallow) pointer comparisons, not (deep) string ones +#define wxCMP_CHAR_CSTRDATA(p, s, op) p op s.AsChar() +#define wxCMP_WCHAR_CSTRDATA(p, s, op) p op s.AsWChar() + +wxDEFINE_ALL_COMPARISONS(const wchar_t *, const wxCStrData&, wxCMP_WCHAR_CSTRDATA) +wxDEFINE_ALL_COMPARISONS(const char *, const wxCStrData&, wxCMP_CHAR_CSTRDATA) + +#undef wxCMP_CHAR_CSTRDATA +#undef wxCMP_WCHAR_CSTRDATA + +// --------------------------------------------------------------------------- +// Implementation only from here until the end of file +// --------------------------------------------------------------------------- + +#if wxUSE_STD_IOSTREAM + +#include "wx/iosfwrap.h" + +WXDLLIMPEXP_BASE wxSTD ostream& operator<<(wxSTD ostream&, const wxString&); +WXDLLIMPEXP_BASE wxSTD ostream& operator<<(wxSTD ostream&, const wxCStrData&); +WXDLLIMPEXP_BASE wxSTD ostream& operator<<(wxSTD ostream&, const wxScopedCharBuffer&); +#ifndef __BORLANDC__ +WXDLLIMPEXP_BASE wxSTD ostream& operator<<(wxSTD ostream&, const wxScopedWCharBuffer&); +#endif + +#if wxUSE_UNICODE && defined(HAVE_WOSTREAM) + +WXDLLIMPEXP_BASE wxSTD wostream& operator<<(wxSTD wostream&, const wxString&); +WXDLLIMPEXP_BASE wxSTD wostream& operator<<(wxSTD wostream&, const wxCStrData&); +WXDLLIMPEXP_BASE wxSTD wostream& operator<<(wxSTD wostream&, const wxScopedWCharBuffer&); + +#endif // wxUSE_UNICODE && defined(HAVE_WOSTREAM) + +#endif // wxUSE_STD_IOSTREAM + +// --------------------------------------------------------------------------- +// wxCStrData implementation +// --------------------------------------------------------------------------- + +inline wxCStrData::wxCStrData(char *buf) + : m_str(new wxString(buf)), m_offset(0), m_owned(true) {} +inline wxCStrData::wxCStrData(wchar_t *buf) + : m_str(new wxString(buf)), m_offset(0), m_owned(true) {} + +inline wxCStrData::wxCStrData(const wxCStrData& data) + : m_str(data.m_owned ? new wxString(*data.m_str) : data.m_str), + m_offset(data.m_offset), + m_owned(data.m_owned) +{ +} + +inline wxCStrData::~wxCStrData() +{ + if ( m_owned ) + delete const_cast<wxString*>(m_str); // cast to silence warnings +} + +// AsChar() and AsWChar() implementations simply forward to wxString methods + +inline const wchar_t* wxCStrData::AsWChar() const +{ + const wchar_t * const p = +#if wxUSE_UNICODE_WCHAR + m_str->wc_str(); +#elif wxUSE_UNICODE_UTF8 + m_str->AsWChar(wxMBConvStrictUTF8()); +#else + m_str->AsWChar(wxConvLibc); +#endif + + // in Unicode build the string always has a valid Unicode representation + // and even if a conversion is needed (as in UTF8 case) it can't fail + // + // but in ANSI build the string contents might be not convertible to + // Unicode using the current locale encoding so we do need to check for + // errors +#if !wxUSE_UNICODE + if ( !p ) + { + // if conversion fails, return empty string and not NULL to avoid + // crashes in code written with either wxWidgets 2 wxString or + // std::string behaviour in mind: neither of them ever returns NULL + // from its c_str() and so we shouldn't neither + // + // notice that the same is done in AsChar() below and + // wxString::wc_str() and mb_str() for the same reasons + return L""; + } +#endif // !wxUSE_UNICODE + + return p + m_offset; +} + +inline const char* wxCStrData::AsChar() const +{ +#if wxUSE_UNICODE && !wxUSE_UTF8_LOCALE_ONLY + const char * const p = m_str->AsChar(wxConvLibc); + if ( !p ) + return ""; +#else // !wxUSE_UNICODE || wxUSE_UTF8_LOCALE_ONLY + const char * const p = m_str->mb_str(); +#endif // wxUSE_UNICODE && !wxUSE_UTF8_LOCALE_ONLY + + return p + m_offset; +} + +inline wxString wxCStrData::AsString() const +{ + if ( m_offset == 0 ) + return *m_str; + else + return m_str->Mid(m_offset); +} + +inline const wxStringCharType *wxCStrData::AsInternal() const +{ +#if wxUSE_UNICODE_UTF8 + return wxStringOperations::AddToIter(m_str->wx_str(), m_offset); +#else + return m_str->wx_str() + m_offset; +#endif +} + +inline wxUniChar wxCStrData::operator*() const +{ + if ( m_str->empty() ) + return wxUniChar(wxT('\0')); + else + return (*m_str)[m_offset]; +} + +inline wxUniChar wxCStrData::operator[](size_t n) const +{ + // NB: we intentionally use operator[] and not at() here because the former + // works for the terminating NUL while the latter does not + return (*m_str)[m_offset + n]; +} + +// ---------------------------------------------------------------------------- +// more wxCStrData operators +// ---------------------------------------------------------------------------- + +// we need to define those to allow "size_t pos = p - s.c_str()" where p is +// some pointer into the string +inline size_t operator-(const char *p, const wxCStrData& cs) +{ + return p - cs.AsChar(); +} + +inline size_t operator-(const wchar_t *p, const wxCStrData& cs) +{ + return p - cs.AsWChar(); +} + +// ---------------------------------------------------------------------------- +// implementation of wx[W]CharBuffer inline methods using wxCStrData +// ---------------------------------------------------------------------------- + +// FIXME-UTF8: move this to buffer.h +inline wxCharBuffer::wxCharBuffer(const wxCStrData& cstr) + : wxCharTypeBufferBase(cstr.AsCharBuf()) +{ +} + +inline wxWCharBuffer::wxWCharBuffer(const wxCStrData& cstr) + : wxCharTypeBufferBase(cstr.AsWCharBuf()) +{ +} + +#if wxUSE_UNICODE_UTF8 +// ---------------------------------------------------------------------------- +// implementation of wxStringIteratorNode inline methods +// ---------------------------------------------------------------------------- + +void wxStringIteratorNode::DoSet(const wxString *str, + wxStringImpl::const_iterator *citer, + wxStringImpl::iterator *iter) +{ + m_prev = NULL; + m_iter = iter; + m_citer = citer; + m_str = str; + if ( str ) + { + m_next = str->m_iterators.ptr; + const_cast<wxString*>(m_str)->m_iterators.ptr = this; + if ( m_next ) + m_next->m_prev = this; + } + else + { + m_next = NULL; + } +} + +void wxStringIteratorNode::clear() +{ + if ( m_next ) + m_next->m_prev = m_prev; + if ( m_prev ) + m_prev->m_next = m_next; + else if ( m_str ) // first in the list + const_cast<wxString*>(m_str)->m_iterators.ptr = m_next; + + m_next = m_prev = NULL; + m_citer = NULL; + m_iter = NULL; + m_str = NULL; +} +#endif // wxUSE_UNICODE_UTF8 + +#if WXWIN_COMPATIBILITY_2_8 + // lot of code out there doesn't explicitly include wx/crt.h, but uses + // CRT wrappers that are now declared in wx/wxcrt.h and wx/wxcrtvararg.h, + // so let's include this header now that wxString is defined and it's safe + // to do it: + #include "wx/crt.h" +#endif + +// ---------------------------------------------------------------------------- +// Checks on wxString characters +// ---------------------------------------------------------------------------- + +template<bool (T)(const wxUniChar& c)> + inline bool wxStringCheck(const wxString& val) + { + for ( wxString::const_iterator i = val.begin(); + i != val.end(); + ++i ) + if (T(*i) == 0) + return false; + return true; + } + +#endif // _WX_WXSTRING_H_ diff --git a/wxmsw/include/wx-3.0/wx/stringimpl.h b/wxmsw/include/wx-3.0/wx/stringimpl.h new file mode 100644 index 00000000..50d4af9c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/stringimpl.h @@ -0,0 +1,564 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/stringimpl.h +// Purpose: wxStringImpl class, implementation of wxString +// Author: Vadim Zeitlin +// Modified by: +// Created: 29/01/98 +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/* + This header implements std::string-like string class, wxStringImpl, that is + used by wxString to store the data. Alternatively, if wxUSE_STD_STRING=1, + wxStringImpl is just a typedef to std:: string class. +*/ + +#ifndef _WX_WXSTRINGIMPL_H__ +#define _WX_WXSTRINGIMPL_H__ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" // everybody should include this +#include "wx/chartype.h" // for wxChar +#include "wx/wxcrtbase.h" // for wxStrlen() etc. + +#include <stdlib.h> + +// --------------------------------------------------------------------------- +// macros +// --------------------------------------------------------------------------- + +// implementation only +#define wxASSERT_VALID_INDEX(i) \ + wxASSERT_MSG( (size_t)(i) <= length(), wxT("invalid index in wxString") ) + + +// ---------------------------------------------------------------------------- +// global data +// ---------------------------------------------------------------------------- + +// global pointer to empty string +extern WXDLLIMPEXP_DATA_BASE(const wxChar*) wxEmptyString; +#if wxUSE_UNICODE_UTF8 +// FIXME-UTF8: we should have only one wxEmptyString +extern WXDLLIMPEXP_DATA_BASE(const wxStringCharType*) wxEmptyStringImpl; +#endif + + +// ---------------------------------------------------------------------------- +// deal with various build options +// ---------------------------------------------------------------------------- + +// we use STL-based string internally if we use std::string at all now, there +// should be no reason to prefer our internal implement but if you really need +// it you can predefine wxUSE_STL_BASED_WXSTRING as 0 when building the library +#ifndef wxUSE_STL_BASED_WXSTRING + #define wxUSE_STL_BASED_WXSTRING wxUSE_STD_STRING +#endif + +// in both cases we need to define wxStdString +#if wxUSE_STL_BASED_WXSTRING || wxUSE_STD_STRING + +#include "wx/beforestd.h" +#include <string> +#include "wx/afterstd.h" + +#ifdef HAVE_STD_WSTRING + typedef std::wstring wxStdWideString; +#else + typedef std::basic_string<wchar_t> wxStdWideString; +#endif + +#if wxUSE_UNICODE_WCHAR + typedef wxStdWideString wxStdString; +#else + typedef std::string wxStdString; +#endif + +#endif // wxUSE_STL_BASED_WXSTRING || wxUSE_STD_STRING + + +#if wxUSE_STL_BASED_WXSTRING + + // we always want ctor from std::string when using std::string internally + #undef wxUSE_STD_STRING + #define wxUSE_STD_STRING 1 + + // the versions of std::string included with gcc 2.95 and VC6 (for which + // _MSC_VER == 1200) and eVC4 (_MSC_VER == 1201) lack clear() method + #if (defined(__GNUG__) && (__GNUG__ < 3)) || \ + !wxCHECK_VISUALC_VERSION(7) || defined(__EVC4__) + #define wxSTRING_BASE_HASNT_CLEAR + #endif + + typedef wxStdString wxStringImpl; +#else // if !wxUSE_STL_BASED_WXSTRING + +// in non-STL mode, compare() is implemented in wxString and not wxStringImpl +#undef HAVE_STD_STRING_COMPARE + +// --------------------------------------------------------------------------- +// string data prepended with some housekeeping info (used by wxString class), +// is never used directly (but had to be put here to allow inlining) +// --------------------------------------------------------------------------- + +struct WXDLLIMPEXP_BASE wxStringData +{ + int nRefs; // reference count + size_t nDataLength, // actual string length + nAllocLength; // allocated memory size + + // mimics declaration 'wxStringCharType data[nAllocLength]' + wxStringCharType* data() const { return (wxStringCharType*)(this + 1); } + + // empty string has a special ref count so it's never deleted + bool IsEmpty() const { return (nRefs == -1); } + bool IsShared() const { return (nRefs > 1); } + + // lock/unlock + void Lock() { if ( !IsEmpty() ) nRefs++; } + + // VC++ will refuse to inline Unlock but profiling shows that it is wrong +#if defined(__VISUALC__) && (__VISUALC__ >= 1200) + __forceinline +#endif + // VC++ free must take place in same DLL as allocation when using non dll + // run-time library (e.g. Multithreaded instead of Multithreaded DLL) +#if defined(__VISUALC__) && defined(_MT) && !defined(_DLL) + void Unlock() { if ( !IsEmpty() && --nRefs == 0) Free(); } + // we must not inline deallocation since allocation is not inlined + void Free(); +#else + void Unlock() { if ( !IsEmpty() && --nRefs == 0) free(this); } +#endif + + // if we had taken control over string memory (GetWriteBuf), it's + // intentionally put in invalid state + void Validate(bool b) { nRefs = (b ? 1 : 0); } + bool IsValid() const { return (nRefs != 0); } +}; + +class WXDLLIMPEXP_BASE wxStringImpl +{ +public: + // an 'invalid' value for string index, moved to this place due to a CW bug + static const size_t npos; + +protected: + // points to data preceded by wxStringData structure with ref count info + wxStringCharType *m_pchData; + + // accessor to string data + wxStringData* GetStringData() const { return (wxStringData*)m_pchData - 1; } + + // string (re)initialization functions + // initializes the string to the empty value (must be called only from + // ctors, use Reinit() otherwise) +#if wxUSE_UNICODE_UTF8 + void Init() { m_pchData = (wxStringCharType *)wxEmptyStringImpl; } // FIXME-UTF8 +#else + void Init() { m_pchData = (wxStringCharType *)wxEmptyString; } +#endif + // initializes the string with (a part of) C-string + void InitWith(const wxStringCharType *psz, size_t nPos = 0, size_t nLen = npos); + // as Init, but also frees old data + void Reinit() { GetStringData()->Unlock(); Init(); } + + // memory allocation + // allocates memory for string of length nLen + bool AllocBuffer(size_t nLen); + // effectively copies data to string + bool AssignCopy(size_t, const wxStringCharType *); + + // append a (sub)string + bool ConcatSelf(size_t nLen, const wxStringCharType *src, size_t nMaxLen); + bool ConcatSelf(size_t nLen, const wxStringCharType *src) + { return ConcatSelf(nLen, src, nLen); } + + // functions called before writing to the string: they copy it if there + // are other references to our data (should be the only owner when writing) + bool CopyBeforeWrite(); + bool AllocBeforeWrite(size_t); + + // compatibility with wxString + bool Alloc(size_t nLen); + +public: + // standard types + typedef wxStringCharType value_type; + typedef wxStringCharType char_type; + typedef size_t size_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef value_type* pointer; + typedef const value_type* const_pointer; + + // macro to define the bulk of iterator and const_iterator classes + #define WX_DEFINE_STRINGIMPL_ITERATOR(iterator_name, ref_type, ptr_type) \ + public: \ + typedef wxStringCharType value_type; \ + typedef ref_type reference; \ + typedef ptr_type pointer; \ + typedef int difference_type; \ + \ + iterator_name() : m_ptr(NULL) { } \ + iterator_name(pointer ptr) : m_ptr(ptr) { } \ + \ + reference operator*() const { return *m_ptr; } \ + \ + iterator_name& operator++() { m_ptr++; return *this; } \ + iterator_name operator++(int) \ + { \ + const iterator_name tmp(*this); \ + m_ptr++; \ + return tmp; \ + } \ + \ + iterator_name& operator--() { m_ptr--; return *this; } \ + iterator_name operator--(int) \ + { \ + const iterator_name tmp(*this); \ + m_ptr--; \ + return tmp; \ + } \ + \ + iterator_name operator+(ptrdiff_t n) const \ + { return iterator_name(m_ptr + n); } \ + iterator_name operator-(ptrdiff_t n) const \ + { return iterator_name(m_ptr - n); } \ + iterator_name& operator+=(ptrdiff_t n) \ + { m_ptr += n; return *this; } \ + iterator_name& operator-=(ptrdiff_t n) \ + { m_ptr -= n; return *this; } \ + \ + difference_type operator-(const iterator_name& i) const \ + { return m_ptr - i.m_ptr; } \ + \ + bool operator==(const iterator_name& i) const \ + { return m_ptr == i.m_ptr; } \ + bool operator!=(const iterator_name& i) const \ + { return m_ptr != i.m_ptr; } \ + \ + bool operator<(const iterator_name& i) const \ + { return m_ptr < i.m_ptr; } \ + bool operator>(const iterator_name& i) const \ + { return m_ptr > i.m_ptr; } \ + bool operator<=(const iterator_name& i) const \ + { return m_ptr <= i.m_ptr; } \ + bool operator>=(const iterator_name& i) const \ + { return m_ptr >= i.m_ptr; } \ + \ + private: \ + /* for wxStringImpl use only */ \ + pointer GetPtr() const { return m_ptr; } \ + \ + friend class wxStringImpl; \ + \ + pointer m_ptr + + // we need to declare const_iterator in wxStringImpl scope, the friend + // declaration inside iterator class itself is not enough, or at least not + // for g++ 3.4 (g++ 4 is ok) + class WXDLLIMPEXP_FWD_BASE const_iterator; + + class WXDLLIMPEXP_BASE iterator + { + WX_DEFINE_STRINGIMPL_ITERATOR(iterator, + wxStringCharType&, + wxStringCharType*); + + friend class const_iterator; + }; + + class WXDLLIMPEXP_BASE const_iterator + { + public: + const_iterator(iterator i) : m_ptr(i.m_ptr) { } + + WX_DEFINE_STRINGIMPL_ITERATOR(const_iterator, + const wxStringCharType&, + const wxStringCharType*); + }; + + #undef WX_DEFINE_STRINGIMPL_ITERATOR + + + // constructors and destructor + // ctor for an empty string + wxStringImpl() { Init(); } + // copy ctor + wxStringImpl(const wxStringImpl& stringSrc) + { + wxASSERT_MSG( stringSrc.GetStringData()->IsValid(), + wxT("did you forget to call UngetWriteBuf()?") ); + + if ( stringSrc.empty() ) { + // nothing to do for an empty string + Init(); + } + else { + m_pchData = stringSrc.m_pchData; // share same data + GetStringData()->Lock(); // => one more copy + } + } + // string containing nRepeat copies of ch + wxStringImpl(size_type nRepeat, wxStringCharType ch); + // ctor takes first nLength characters from C string + // (default value of npos means take all the string) + wxStringImpl(const wxStringCharType *psz) + { InitWith(psz, 0, npos); } + wxStringImpl(const wxStringCharType *psz, size_t nLength) + { InitWith(psz, 0, nLength); } + // take nLen chars starting at nPos + wxStringImpl(const wxStringImpl& str, size_t nPos, size_t nLen) + { + wxASSERT_MSG( str.GetStringData()->IsValid(), + wxT("did you forget to call UngetWriteBuf()?") ); + Init(); + size_t strLen = str.length() - nPos; nLen = strLen < nLen ? strLen : nLen; + InitWith(str.c_str(), nPos, nLen); + } + // take everything between start and end + wxStringImpl(const_iterator start, const_iterator end); + + + // ctor from and conversion to std::string +#if wxUSE_STD_STRING + wxStringImpl(const wxStdString& impl) + { InitWith(impl.c_str(), 0, impl.length()); } + + operator wxStdString() const + { return wxStdString(c_str(), length()); } +#endif + +#if defined(__VISUALC__) && (__VISUALC__ >= 1200) + // disable warning about Unlock() below not being inlined (first, it + // seems to be inlined nevertheless and second, even if it isn't, there + // is nothing we can do about this + #pragma warning(push) + #pragma warning (disable:4714) +#endif + + // dtor is not virtual, this class must not be inherited from! + ~wxStringImpl() + { + GetStringData()->Unlock(); + } + +#if defined(__VISUALC__) && (__VISUALC__ >= 1200) + #pragma warning(pop) +#endif + + // overloaded assignment + // from another wxString + wxStringImpl& operator=(const wxStringImpl& stringSrc); + // from a character + wxStringImpl& operator=(wxStringCharType ch); + // from a C string + wxStringImpl& operator=(const wxStringCharType *psz); + + // return the length of the string + size_type length() const { return GetStringData()->nDataLength; } + // return the length of the string + size_type size() const { return length(); } + // return the maximum size of the string + size_type max_size() const { return npos; } + // resize the string, filling the space with c if c != 0 + void resize(size_t nSize, wxStringCharType ch = '\0'); + // delete the contents of the string + void clear() { erase(0, npos); } + // returns true if the string is empty + bool empty() const { return length() == 0; } + // inform string about planned change in size + void reserve(size_t sz) { Alloc(sz); } + size_type capacity() const { return GetStringData()->nAllocLength; } + + // lib.string.access + // return the character at position n + value_type operator[](size_type n) const { return m_pchData[n]; } + value_type at(size_type n) const + { wxASSERT_VALID_INDEX( n ); return m_pchData[n]; } + // returns the writable character at position n + reference operator[](size_type n) { CopyBeforeWrite(); return m_pchData[n]; } + reference at(size_type n) + { + wxASSERT_VALID_INDEX( n ); + CopyBeforeWrite(); + return m_pchData[n]; + } // FIXME-UTF8: not useful for us...? + + // lib.string.modifiers + // append elements str[pos], ..., str[pos+n] + wxStringImpl& append(const wxStringImpl& str, size_t pos, size_t n) + { + wxASSERT(pos <= str.length()); + ConcatSelf(n, str.c_str() + pos, str.length() - pos); + return *this; + } + // append a string + wxStringImpl& append(const wxStringImpl& str) + { ConcatSelf(str.length(), str.c_str()); return *this; } + // append first n (or all if n == npos) characters of sz + wxStringImpl& append(const wxStringCharType *sz) + { ConcatSelf(wxStrlen(sz), sz); return *this; } + wxStringImpl& append(const wxStringCharType *sz, size_t n) + { ConcatSelf(n, sz); return *this; } + // append n copies of ch + wxStringImpl& append(size_t n, wxStringCharType ch); + // append from first to last + wxStringImpl& append(const_iterator first, const_iterator last) + { ConcatSelf(last - first, first.GetPtr()); return *this; } + + // same as `this_string = str' + wxStringImpl& assign(const wxStringImpl& str) + { return *this = str; } + // same as ` = str[pos..pos + n] + wxStringImpl& assign(const wxStringImpl& str, size_t pos, size_t n) + { return replace(0, npos, str, pos, n); } + // same as `= first n (or all if n == npos) characters of sz' + wxStringImpl& assign(const wxStringCharType *sz) + { return replace(0, npos, sz, wxStrlen(sz)); } + wxStringImpl& assign(const wxStringCharType *sz, size_t n) + { return replace(0, npos, sz, n); } + // same as `= n copies of ch' + wxStringImpl& assign(size_t n, wxStringCharType ch) + { return replace(0, npos, n, ch); } + // assign from first to last + wxStringImpl& assign(const_iterator first, const_iterator last) + { return replace(begin(), end(), first, last); } + + // first valid index position + const_iterator begin() const { return m_pchData; } + iterator begin(); + // position one after the last valid one + const_iterator end() const { return m_pchData + length(); } + iterator end(); + + // insert another string + wxStringImpl& insert(size_t nPos, const wxStringImpl& str) + { + wxASSERT( str.GetStringData()->IsValid() ); + return insert(nPos, str.c_str(), str.length()); + } + // insert n chars of str starting at nStart (in str) + wxStringImpl& insert(size_t nPos, const wxStringImpl& str, size_t nStart, size_t n) + { + wxASSERT( str.GetStringData()->IsValid() ); + wxASSERT( nStart < str.length() ); + size_t strLen = str.length() - nStart; + n = strLen < n ? strLen : n; + return insert(nPos, str.c_str() + nStart, n); + } + // insert first n (or all if n == npos) characters of sz + wxStringImpl& insert(size_t nPos, const wxStringCharType *sz, size_t n = npos); + // insert n copies of ch + wxStringImpl& insert(size_t nPos, size_t n, wxStringCharType ch) + { return insert(nPos, wxStringImpl(n, ch)); } + iterator insert(iterator it, wxStringCharType ch) + { size_t idx = it - begin(); insert(idx, 1, ch); return begin() + idx; } + void insert(iterator it, const_iterator first, const_iterator last) + { insert(it - begin(), first.GetPtr(), last - first); } + void insert(iterator it, size_type n, wxStringCharType ch) + { insert(it - begin(), n, ch); } + + // delete characters from nStart to nStart + nLen + wxStringImpl& erase(size_type pos = 0, size_type n = npos); + iterator erase(iterator first, iterator last) + { + size_t idx = first - begin(); + erase(idx, last - first); + return begin() + idx; + } + iterator erase(iterator first); + + // explicit conversion to C string (use this with printf()!) + const wxStringCharType* c_str() const { return m_pchData; } + const wxStringCharType* data() const { return m_pchData; } + + // replaces the substring of length nLen starting at nStart + wxStringImpl& replace(size_t nStart, size_t nLen, const wxStringCharType* sz) + { return replace(nStart, nLen, sz, npos); } + // replaces the substring of length nLen starting at nStart + wxStringImpl& replace(size_t nStart, size_t nLen, const wxStringImpl& str) + { return replace(nStart, nLen, str.c_str(), str.length()); } + // replaces the substring with nCount copies of ch + wxStringImpl& replace(size_t nStart, size_t nLen, + size_t nCount, wxStringCharType ch) + { return replace(nStart, nLen, wxStringImpl(nCount, ch)); } + // replaces a substring with another substring + wxStringImpl& replace(size_t nStart, size_t nLen, + const wxStringImpl& str, size_t nStart2, size_t nLen2) + { return replace(nStart, nLen, str.substr(nStart2, nLen2)); } + // replaces the substring with first nCount chars of sz + wxStringImpl& replace(size_t nStart, size_t nLen, + const wxStringCharType* sz, size_t nCount); + + wxStringImpl& replace(iterator first, iterator last, const_pointer s) + { return replace(first - begin(), last - first, s); } + wxStringImpl& replace(iterator first, iterator last, const_pointer s, + size_type n) + { return replace(first - begin(), last - first, s, n); } + wxStringImpl& replace(iterator first, iterator last, const wxStringImpl& s) + { return replace(first - begin(), last - first, s); } + wxStringImpl& replace(iterator first, iterator last, size_type n, wxStringCharType c) + { return replace(first - begin(), last - first, n, c); } + wxStringImpl& replace(iterator first, iterator last, + const_iterator first1, const_iterator last1) + { return replace(first - begin(), last - first, first1.GetPtr(), last1 - first1); } + + // swap two strings + void swap(wxStringImpl& str); + + // All find() functions take the nStart argument which specifies the + // position to start the search on, the default value is 0. All functions + // return npos if there were no match. + + // find a substring + size_t find(const wxStringImpl& str, size_t nStart = 0) const; + + // find first n characters of sz + size_t find(const wxStringCharType* sz, size_t nStart = 0, size_t n = npos) const; + + // find the first occurrence of character ch after nStart + size_t find(wxStringCharType ch, size_t nStart = 0) const; + + // rfind() family is exactly like find() but works right to left + + // as find, but from the end + size_t rfind(const wxStringImpl& str, size_t nStart = npos) const; + + // as find, but from the end + size_t rfind(const wxStringCharType* sz, size_t nStart = npos, + size_t n = npos) const; + // as find, but from the end + size_t rfind(wxStringCharType ch, size_t nStart = npos) const; + + size_type copy(wxStringCharType* s, size_type n, size_type pos = 0); + + // substring extraction + wxStringImpl substr(size_t nStart = 0, size_t nLen = npos) const; + + // string += string + wxStringImpl& operator+=(const wxStringImpl& s) { return append(s); } + // string += C string + wxStringImpl& operator+=(const wxStringCharType *psz) { return append(psz); } + // string += char + wxStringImpl& operator+=(wxStringCharType ch) { return append(1, ch); } + + // helpers for wxStringBuffer and wxStringBufferLength + wxStringCharType *DoGetWriteBuf(size_t nLen); + void DoUngetWriteBuf(); + void DoUngetWriteBuf(size_t nLen); + + friend class WXDLLIMPEXP_FWD_BASE wxString; +}; + +#endif // !wxUSE_STL_BASED_WXSTRING + +// don't pollute the library user's name space +#undef wxASSERT_VALID_INDEX + +#endif // _WX_WXSTRINGIMPL_H__ diff --git a/wxmsw/include/wx-3.0/wx/stringops.h b/wxmsw/include/wx-3.0/wx/stringops.h new file mode 100644 index 00000000..21c61217 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/stringops.h @@ -0,0 +1,172 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/stringops.h +// Purpose: implementation of wxString primitive operations +// Author: Vaclav Slavik +// Modified by: +// Created: 2007-04-16 +// Copyright: (c) 2007 REA Elektronik GmbH +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WXSTRINGOPS_H__ +#define _WX_WXSTRINGOPS_H__ + +#include "wx/chartype.h" +#include "wx/stringimpl.h" +#include "wx/unichar.h" +#include "wx/buffer.h" + +// This header contains wxStringOperations "namespace" class that implements +// elementary operations on string data as static methods; wxString methods and +// iterators are implemented in terms of it. Two implementations are available, +// one for UTF-8 encoded char* string and one for "raw" wchar_t* strings (or +// char* in ANSI build). + +// FIXME-UTF8: only wchar after we remove ANSI build +#if wxUSE_UNICODE_WCHAR || !wxUSE_UNICODE +struct WXDLLIMPEXP_BASE wxStringOperationsWchar +{ + // moves the iterator to the next Unicode character + template <typename Iterator> + static void IncIter(Iterator& i) { ++i; } + + // moves the iterator to the previous Unicode character + template <typename Iterator> + static void DecIter(Iterator& i) { --i; } + + // moves the iterator by n Unicode characters + template <typename Iterator> + static Iterator AddToIter(const Iterator& i, ptrdiff_t n) + { return i + n; } + + // returns distance of the two iterators in Unicode characters + template <typename Iterator> + static ptrdiff_t DiffIters(const Iterator& i1, const Iterator& i2) + { return i1 - i2; } + + // encodes the character to a form used to represent it in internal + // representation (returns a string in UTF8 version) + static wxChar EncodeChar(const wxUniChar& ch) { return (wxChar)ch; } + + static wxUniChar DecodeChar(const wxStringImpl::const_iterator& i) + { return *i; } +}; +#endif // wxUSE_UNICODE_WCHAR || !wxUSE_UNICODE + + +#if wxUSE_UNICODE_UTF8 +struct WXDLLIMPEXP_BASE wxStringOperationsUtf8 +{ + // checks correctness of UTF-8 sequence + static bool IsValidUtf8String(const char *c, + size_t len = wxStringImpl::npos); + static bool IsValidUtf8LeadByte(unsigned char c) + { + return (c <= 0x7F) || (c >= 0xC2 && c <= 0xF4); + } + + // table of offsets to skip forward when iterating over UTF-8 sequence + static const unsigned char ms_utf8IterTable[256]; + + + template<typename Iterator> + static void IncIter(Iterator& i) + { + wxASSERT( IsValidUtf8LeadByte(*i) ); + i += ms_utf8IterTable[(unsigned char)*i]; + } + + template<typename Iterator> + static void DecIter(Iterator& i) + { + // Non-lead bytes are all in the 0x80..0xBF range (i.e. 10xxxxxx in + // binary), so we just have to go back until we hit a byte that is + // either < 0x80 (i.e. 0xxxxxxx in binary) or 0xC0..0xFF (11xxxxxx in + // binary; this includes some invalid values, but we can ignore it + // here, because we assume valid UTF-8 input for the purpose of + // efficient implementation). + --i; + while ( ((*i) & 0xC0) == 0x80 /* 2 highest bits are '10' */ ) + --i; + } + + template<typename Iterator> + static Iterator AddToIter(const Iterator& i, ptrdiff_t n) + { + Iterator out(i); + + if ( n > 0 ) + { + for ( ptrdiff_t j = 0; j < n; ++j ) + IncIter(out); + } + else if ( n < 0 ) + { + for ( ptrdiff_t j = 0; j > n; --j ) + DecIter(out); + } + + return out; + } + + template<typename Iterator> + static ptrdiff_t DiffIters(Iterator i1, Iterator i2) + { + ptrdiff_t dist = 0; + + if ( i1 < i2 ) + { + while ( i1 != i2 ) + { + IncIter(i1); + dist--; + } + } + else if ( i2 < i1 ) + { + while ( i2 != i1 ) + { + IncIter(i2); + dist++; + } + } + + return dist; + } + + // encodes the character as UTF-8: + typedef wxUniChar::Utf8CharBuffer Utf8CharBuffer; + static Utf8CharBuffer EncodeChar(const wxUniChar& ch) + { return ch.AsUTF8(); } + + // returns n copies of ch encoded in UTF-8 string + static wxCharBuffer EncodeNChars(size_t n, const wxUniChar& ch); + + // returns the length of UTF-8 encoding of the character with lead byte 'c' + static size_t GetUtf8CharLength(char c) + { + wxASSERT( IsValidUtf8LeadByte(c) ); + return ms_utf8IterTable[(unsigned char)c]; + } + + // decodes single UTF-8 character from UTF-8 string + static wxUniChar DecodeChar(wxStringImpl::const_iterator i) + { + if ( (unsigned char)*i < 0x80 ) + return (int)*i; + return DecodeNonAsciiChar(i); + } + +private: + static wxUniChar DecodeNonAsciiChar(wxStringImpl::const_iterator i); +}; +#endif // wxUSE_UNICODE_UTF8 + + +#if wxUSE_UNICODE_UTF8 +typedef wxStringOperationsUtf8 wxStringOperations; +#else +typedef wxStringOperationsWchar wxStringOperations; +#endif + +#endif // _WX_WXSTRINGOPS_H_ diff --git a/wxmsw/include/wx-3.0/wx/strvararg.h b/wxmsw/include/wx-3.0/wx/strvararg.h new file mode 100644 index 00000000..6562ee31 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/strvararg.h @@ -0,0 +1,1222 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/strvararg.h +// Purpose: macros for implementing type-safe vararg passing of strings +// Author: Vaclav Slavik +// Created: 2007-02-19 +// Copyright: (c) 2007 REA Elektronik GmbH +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STRVARARG_H_ +#define _WX_STRVARARG_H_ + +#include "wx/platform.h" +#if wxONLY_WATCOM_EARLIER_THAN(1,4) + #error "OpenWatcom version >= 1.4 is required to compile this code" +#endif + +#include "wx/cpp.h" +#include "wx/chartype.h" +#include "wx/strconv.h" +#include "wx/buffer.h" +#include "wx/unichar.h" + +#if defined(HAVE_TYPE_TRAITS) + #include <type_traits> +#elif defined(HAVE_TR1_TYPE_TRAITS) + #ifdef __VISUALC__ + #include <type_traits> + #else + #include <tr1/type_traits> + #endif +#endif + +class WXDLLIMPEXP_FWD_BASE wxCStrData; +class WXDLLIMPEXP_FWD_BASE wxString; + +// ---------------------------------------------------------------------------- +// WX_DEFINE_VARARG_FUNC* macros +// ---------------------------------------------------------------------------- + +// This macro is used to implement type-safe wrappers for variadic functions +// that accept strings as arguments. This makes it possible to pass char*, +// wchar_t* or even wxString (as opposed to having to use wxString::c_str()) +// to e.g. wxPrintf(). +// +// This is done by defining a set of N template function taking 1..N arguments +// (currently, N is set to 30 in this header). These functions are just thin +// wrappers around another variadic function ('impl' or 'implUtf8' arguments, +// see below) and the only thing the wrapper does is that it normalizes the +// arguments passed in so that they are of the type expected by variadic +// functions taking string arguments, i.e., char* or wchar_t*, depending on the +// build: +// * char* in the current locale's charset in ANSI build +// * char* with UTF-8 encoding if wxUSE_UNICODE_UTF8 and the app is running +// under an UTF-8 locale +// * wchar_t* if wxUSE_UNICODE_WCHAR or if wxUSE_UNICODE_UTF8 and the current +// locale is not UTF-8 +// +// Note that wxFormatString *must* be used for the format parameter of these +// functions, otherwise the implementation won't work correctly. Furthermore, +// it must be passed by value, not reference, because it's modified by the +// vararg templates internally. +// +// Parameters: +// [ there are examples in square brackets showing values of the parameters +// for the wxFprintf() wrapper for fprintf() function with the following +// prototype: +// int wxFprintf(FILE *stream, const wxString& format, ...); ] +// +// rettype Functions' return type [int] +// name Name of the function [fprintf] +// numfixed The number of leading "fixed" (i.e., not variadic) +// arguments of the function (e.g. "stream" and "format" +// arguments of fprintf()); their type is _not_ converted +// using wxArgNormalizer<T>, unlike the rest of +// the function's arguments [2] +// fixed List of types of the leading "fixed" arguments, in +// parenthesis [(FILE*,const wxString&)] +// impl Name of the variadic function that implements 'name' for +// the native strings representation (wchar_t* if +// wxUSE_UNICODE_WCHAR or wxUSE_UNICODE_UTF8 when running under +// non-UTF8 locale, char* in ANSI build) [wxCrt_Fprintf] +// implUtf8 Like 'impl', but for the UTF-8 char* version to be used +// if wxUSE_UNICODE_UTF8 and running under UTF-8 locale +// (ignored otherwise) [fprintf] +// +#define WX_DEFINE_VARARG_FUNC(rettype, name, numfixed, fixed, impl, implUtf8) \ + _WX_VARARG_DEFINE_FUNC_N0(rettype, name, impl, implUtf8, numfixed, fixed) \ + WX_DEFINE_VARARG_FUNC_SANS_N0(rettype, name, numfixed, fixed, impl, implUtf8) + +// ditto, but without the version with 0 template/vararg arguments +#define WX_DEFINE_VARARG_FUNC_SANS_N0(rettype, name, \ + numfixed, fixed, impl, implUtf8) \ + _WX_VARARG_ITER(_WX_VARARG_MAX_ARGS, \ + _WX_VARARG_DEFINE_FUNC, \ + rettype, name, impl, implUtf8, numfixed, fixed) + +// Like WX_DEFINE_VARARG_FUNC, but for variadic functions that don't return +// a value. +#define WX_DEFINE_VARARG_FUNC_VOID(name, numfixed, fixed, impl, implUtf8) \ + _WX_VARARG_DEFINE_FUNC_VOID_N0(name, impl, implUtf8, numfixed, fixed) \ + _WX_VARARG_ITER(_WX_VARARG_MAX_ARGS, \ + _WX_VARARG_DEFINE_FUNC_VOID, \ + void, name, impl, implUtf8, numfixed, fixed) + +// Like WX_DEFINE_VARARG_FUNC_VOID, but instead of wrapping an implementation +// function, does nothing in defined functions' bodies. +// +// Used to implement wxLogXXX functions if wxUSE_LOG=0. +#define WX_DEFINE_VARARG_FUNC_NOP(name, numfixed, fixed) \ + _WX_VARARG_DEFINE_FUNC_NOP_N0(name, numfixed, fixed) \ + _WX_VARARG_ITER(_WX_VARARG_MAX_ARGS, \ + _WX_VARARG_DEFINE_FUNC_NOP, \ + void, name, dummy, dummy, numfixed, fixed) + +// Like WX_DEFINE_VARARG_FUNC_CTOR, but for defining template constructors +#define WX_DEFINE_VARARG_FUNC_CTOR(name, numfixed, fixed, impl, implUtf8) \ + _WX_VARARG_DEFINE_FUNC_CTOR_N0(name, impl, implUtf8, numfixed, fixed) \ + _WX_VARARG_ITER(_WX_VARARG_MAX_ARGS, \ + _WX_VARARG_DEFINE_FUNC_CTOR, \ + void, name, impl, implUtf8, numfixed, fixed) + + +// ---------------------------------------------------------------------------- +// wxFormatString +// ---------------------------------------------------------------------------- + +// This class must be used for format string argument of the functions +// defined using WX_DEFINE_VARARG_FUNC_* macros. It converts the string to +// char* or wchar_t* for passing to implementation function efficiently (i.e. +// without keeping the converted string in memory for longer than necessary, +// like c_str()). It also converts format string to the correct form that +// accounts for string changes done by wxArgNormalizer<> +// +// Note that this class can _only_ be used for function arguments! +class WXDLLIMPEXP_BASE wxFormatString +{ +public: + wxFormatString(const char *str) + : m_char(wxScopedCharBuffer::CreateNonOwned(str)), m_str(NULL), m_cstr(NULL) {} + wxFormatString(const wchar_t *str) + : m_wchar(wxScopedWCharBuffer::CreateNonOwned(str)), m_str(NULL), m_cstr(NULL) {} + wxFormatString(const wxString& str) + : m_str(&str), m_cstr(NULL) {} + wxFormatString(const wxCStrData& str) + : m_str(NULL), m_cstr(&str) {} + wxFormatString(const wxScopedCharBuffer& str) + : m_char(str), m_str(NULL), m_cstr(NULL) {} + wxFormatString(const wxScopedWCharBuffer& str) + : m_wchar(str), m_str(NULL), m_cstr(NULL) {} + + // Possible argument types. These are or-combinable for wxASSERT_ARG_TYPE + // convenience. Some of the values are or-combined with another value, this + // expresses "supertypes" for use with wxASSERT_ARG_TYPE masks. For example, + // a char* string is also a pointer and an integer is also a char. + enum ArgumentType + { + Arg_Char = 0x0001, // character as char %c + Arg_Pointer = 0x0002, // %p + Arg_String = 0x0004 | Arg_Pointer, // any form of string (%s and %p too) + + Arg_Int = 0x0008 | Arg_Char, // (ints can be used with %c) +#if SIZEOF_INT == SIZEOF_LONG + Arg_LongInt = Arg_Int, +#else + Arg_LongInt = 0x0010, +#endif +#if defined(SIZEOF_LONG_LONG) && SIZEOF_LONG_LONG == SIZEOF_LONG + Arg_LongLongInt = Arg_LongInt, +#elif defined(wxLongLong_t) + Arg_LongLongInt = 0x0020, +#endif + + Arg_Double = 0x0040, + Arg_LongDouble = 0x0080, + +#if defined(wxSIZE_T_IS_UINT) + Arg_Size_t = Arg_Int, +#elif defined(wxSIZE_T_IS_ULONG) + Arg_Size_t = Arg_LongInt, +#elif defined(SIZEOF_LONG_LONG) && SIZEOF_SIZE_T == SIZEOF_LONG_LONG + Arg_Size_t = Arg_LongLongInt, +#else + Arg_Size_t = 0x0100, +#endif + + Arg_IntPtr = 0x0200, // %n -- store # of chars written + Arg_ShortIntPtr = 0x0400, + Arg_LongIntPtr = 0x0800, + + Arg_Unknown = 0x8000 // unrecognized specifier (likely error) + }; + + // returns the type of format specifier for n-th variadic argument (this is + // not necessarily n-th format specifier if positional specifiers are used); + // called by wxArgNormalizer<> specializations to get information about + // n-th variadic argument desired representation + ArgumentType GetArgumentType(unsigned n) const; + + // returns the value passed to ctor, only converted to wxString, similarly + // to other InputAsXXX() methods + wxString InputAsString() const; + +#if !wxUSE_UNICODE_WCHAR + operator const char*() const + { return const_cast<wxFormatString*>(this)->AsChar(); } +private: + // InputAsChar() returns the value passed to ctor, only converted + // to char, while AsChar() takes the string returned by InputAsChar() + // and does format string conversion on it as well (and similarly for + // ..AsWChar() below) + const char* InputAsChar(); + const char* AsChar(); + wxScopedCharBuffer m_convertedChar; +#endif // !wxUSE_UNICODE_WCHAR + +#if wxUSE_UNICODE && !wxUSE_UTF8_LOCALE_ONLY +public: + operator const wchar_t*() const + { return const_cast<wxFormatString*>(this)->AsWChar(); } +private: + const wchar_t* InputAsWChar(); + const wchar_t* AsWChar(); + wxScopedWCharBuffer m_convertedWChar; +#endif // wxUSE_UNICODE && !wxUSE_UTF8_LOCALE_ONLY + +private: + wxScopedCharBuffer m_char; + wxScopedWCharBuffer m_wchar; + + // NB: we can use a pointer here, because wxFormatString is only used + // as function argument, so it has shorter life than the string + // passed to the ctor + const wxString * const m_str; + const wxCStrData * const m_cstr; + + wxDECLARE_NO_ASSIGN_CLASS(wxFormatString); +}; + +// these two helper classes are used to find wxFormatString argument among fixed +// arguments passed to a vararg template +struct wxFormatStringArgument +{ + wxFormatStringArgument(const wxFormatString *s = NULL) : m_str(s) {} + const wxFormatString *m_str; + + // overriding this operator allows us to reuse _WX_VARARG_JOIN macro + wxFormatStringArgument operator,(const wxFormatStringArgument& a) const + { + wxASSERT_MSG( m_str == NULL || a.m_str == NULL, + "can't have two format strings in vararg function" ); + return wxFormatStringArgument(m_str ? m_str : a.m_str); + } + + operator const wxFormatString*() const { return m_str; } +}; + +template<typename T> +struct wxFormatStringArgumentFinder +{ + static wxFormatStringArgument find(T) + { + // by default, arguments are not format strings, so return "not found" + return wxFormatStringArgument(); + } +}; + +template<> +struct wxFormatStringArgumentFinder<const wxFormatString&> +{ + static wxFormatStringArgument find(const wxFormatString& arg) + { return wxFormatStringArgument(&arg); } +}; + +template<> +struct wxFormatStringArgumentFinder<wxFormatString> + : public wxFormatStringArgumentFinder<const wxFormatString&> {}; + +// avoid passing big objects by value to wxFormatStringArgumentFinder::find() +// (and especially wx[W]CharBuffer with its auto_ptr<> style semantics!): +template<> +struct wxFormatStringArgumentFinder<wxString> + : public wxFormatStringArgumentFinder<const wxString&> {}; + +template<> +struct wxFormatStringArgumentFinder<wxScopedCharBuffer> + : public wxFormatStringArgumentFinder<const wxScopedCharBuffer&> {}; + +template<> +struct wxFormatStringArgumentFinder<wxScopedWCharBuffer> + : public wxFormatStringArgumentFinder<const wxScopedWCharBuffer&> {}; + +template<> +struct wxFormatStringArgumentFinder<wxCharBuffer> + : public wxFormatStringArgumentFinder<const wxCharBuffer&> {}; + +template<> +struct wxFormatStringArgumentFinder<wxWCharBuffer> + : public wxFormatStringArgumentFinder<const wxWCharBuffer&> {}; + + +// ---------------------------------------------------------------------------- +// wxArgNormalizer*<T> converters +// ---------------------------------------------------------------------------- + +#if wxDEBUG_LEVEL + // Check that the format specifier for index-th argument in 'fmt' has + // the correct type (one of wxFormatString::Arg_XXX or-combination in + // 'expected_mask'). + #define wxASSERT_ARG_TYPE(fmt, index, expected_mask) \ + wxSTATEMENT_MACRO_BEGIN \ + if ( !fmt ) \ + break; \ + const int argtype = fmt->GetArgumentType(index); \ + wxASSERT_MSG( (argtype & (expected_mask)) == argtype, \ + "format specifier doesn't match argument type" ); \ + wxSTATEMENT_MACRO_END +#else + // Just define it to suppress "unused parameter" warnings for the + // parameters which we don't use otherwise + #define wxASSERT_ARG_TYPE(fmt, index, expected_mask) \ + wxUnusedVar(fmt); \ + wxUnusedVar(index) +#endif // wxDEBUG_LEVEL/!wxDEBUG_LEVEL + + +#if defined(HAVE_TYPE_TRAITS) || defined(HAVE_TR1_TYPE_TRAITS) + +// Note: this type is misnamed, so that the error message is easier to +// understand (no error happens for enums, because the IsEnum=true case is +// specialized). +template<bool IsEnum> +struct wxFormatStringSpecifierNonPodType {}; + +template<> +struct wxFormatStringSpecifierNonPodType<true> +{ + enum { value = wxFormatString::Arg_Int }; +}; + +template<typename T> +struct wxFormatStringSpecifier +{ +#ifdef HAVE_TYPE_TRAITS + typedef std::is_enum<T> is_enum; +#elif defined HAVE_TR1_TYPE_TRAITS + typedef std::tr1::is_enum<T> is_enum; +#endif + enum { value = wxFormatStringSpecifierNonPodType<is_enum::value>::value }; +}; + +#else // !HAVE_(TR1_)TYPE_TRAITS + +template<typename T> +struct wxFormatStringSpecifier +{ + // We can't detect enums without is_enum, so the only thing we can + // do is to accept unknown types. However, the only acceptable unknown + // types still are enums, which are promoted to ints, so return Arg_Int + // here. This will at least catch passing of non-POD types through ... at + // runtime. + // + // Furthermore, if the compiler doesn't have partial template + // specialization, we didn't cover pointers either. +#ifdef HAVE_PARTIAL_SPECIALIZATION + enum { value = wxFormatString::Arg_Int }; +#else + enum { value = wxFormatString::Arg_Int | wxFormatString::Arg_Pointer }; +#endif +}; + +#endif // HAVE_TR1_TYPE_TRAITS/!HAVE_TR1_TYPE_TRAITS + + +#ifdef HAVE_PARTIAL_SPECIALIZATION +template<typename T> +struct wxFormatStringSpecifier<T*> +{ + enum { value = wxFormatString::Arg_Pointer }; +}; + +template<typename T> +struct wxFormatStringSpecifier<const T*> +{ + enum { value = wxFormatString::Arg_Pointer }; +}; +#endif // !HAVE_PARTIAL_SPECIALIZATION + + +#define wxFORMAT_STRING_SPECIFIER(T, arg) \ + template<> struct wxFormatStringSpecifier<T> \ + { \ + enum { value = arg }; \ + }; + +wxFORMAT_STRING_SPECIFIER(bool, wxFormatString::Arg_Int) +wxFORMAT_STRING_SPECIFIER(int, wxFormatString::Arg_Int) +wxFORMAT_STRING_SPECIFIER(unsigned int, wxFormatString::Arg_Int) +wxFORMAT_STRING_SPECIFIER(short int, wxFormatString::Arg_Int) +wxFORMAT_STRING_SPECIFIER(short unsigned int, wxFormatString::Arg_Int) +wxFORMAT_STRING_SPECIFIER(long int, wxFormatString::Arg_LongInt) +wxFORMAT_STRING_SPECIFIER(long unsigned int, wxFormatString::Arg_LongInt) +#ifdef wxLongLong_t +wxFORMAT_STRING_SPECIFIER(wxLongLong_t, wxFormatString::Arg_LongLongInt) +wxFORMAT_STRING_SPECIFIER(wxULongLong_t, wxFormatString::Arg_LongLongInt) +#endif +wxFORMAT_STRING_SPECIFIER(float, wxFormatString::Arg_Double) +wxFORMAT_STRING_SPECIFIER(double, wxFormatString::Arg_Double) +wxFORMAT_STRING_SPECIFIER(long double, wxFormatString::Arg_LongDouble) + +#if wxWCHAR_T_IS_REAL_TYPE +wxFORMAT_STRING_SPECIFIER(wchar_t, wxFormatString::Arg_Char | wxFormatString::Arg_Int) +#endif + +#if !wxUSE_UNICODE +wxFORMAT_STRING_SPECIFIER(char, wxFormatString::Arg_Char | wxFormatString::Arg_Int) +wxFORMAT_STRING_SPECIFIER(signed char, wxFormatString::Arg_Char | wxFormatString::Arg_Int) +wxFORMAT_STRING_SPECIFIER(unsigned char, wxFormatString::Arg_Char | wxFormatString::Arg_Int) +#endif + +wxFORMAT_STRING_SPECIFIER(char*, wxFormatString::Arg_String) +wxFORMAT_STRING_SPECIFIER(unsigned char*, wxFormatString::Arg_String) +wxFORMAT_STRING_SPECIFIER(signed char*, wxFormatString::Arg_String) +wxFORMAT_STRING_SPECIFIER(const char*, wxFormatString::Arg_String) +wxFORMAT_STRING_SPECIFIER(const unsigned char*, wxFormatString::Arg_String) +wxFORMAT_STRING_SPECIFIER(const signed char*, wxFormatString::Arg_String) +wxFORMAT_STRING_SPECIFIER(wchar_t*, wxFormatString::Arg_String) +wxFORMAT_STRING_SPECIFIER(const wchar_t*, wxFormatString::Arg_String) + +wxFORMAT_STRING_SPECIFIER(int*, wxFormatString::Arg_IntPtr | wxFormatString::Arg_Pointer) +wxFORMAT_STRING_SPECIFIER(short int*, wxFormatString::Arg_ShortIntPtr | wxFormatString::Arg_Pointer) +wxFORMAT_STRING_SPECIFIER(long int*, wxFormatString::Arg_LongIntPtr | wxFormatString::Arg_Pointer) + +#undef wxFORMAT_STRING_SPECIFIER + + +// Converts an argument passed to wxPrint etc. into standard form expected, +// by wxXXX functions, e.g. all strings (wxString, char*, wchar_t*) are +// converted into wchar_t* or char* depending on the build. +template<typename T> +struct wxArgNormalizer +{ + // Ctor. 'value' is the value passed as variadic argument, 'fmt' is pointer + // to printf-like format string or NULL if the variadic function doesn't + // use format string and 'index' is index of 'value' in variadic arguments + // list (starting at 1) + wxArgNormalizer(T value, + const wxFormatString *fmt, unsigned index) + : m_value(value) + { + wxASSERT_ARG_TYPE( fmt, index, wxFormatStringSpecifier<T>::value ); + } + + // Returns the value in a form that can be safely passed to real vararg + // functions. In case of strings, this is char* in ANSI build and wchar_t* + // in Unicode build. + T get() const { return m_value; } + + T m_value; +}; + +// normalizer for passing arguments to functions working with wchar_t* (and +// until ANSI build is removed, char* in ANSI build as well - FIXME-UTF8) +// string representation +#if !wxUSE_UTF8_LOCALE_ONLY +template<typename T> +struct wxArgNormalizerWchar : public wxArgNormalizer<T> +{ + wxArgNormalizerWchar(T value, + const wxFormatString *fmt, unsigned index) + : wxArgNormalizer<T>(value, fmt, index) {} +}; +#endif // !wxUSE_UTF8_LOCALE_ONLY + +// normalizer for passing arguments to functions working with UTF-8 encoded +// char* strings +#if wxUSE_UNICODE_UTF8 + template<typename T> + struct wxArgNormalizerUtf8 : public wxArgNormalizer<T> + { + wxArgNormalizerUtf8(T value, + const wxFormatString *fmt, unsigned index) + : wxArgNormalizer<T>(value, fmt, index) {} + }; + + #define wxArgNormalizerNative wxArgNormalizerUtf8 +#else // wxUSE_UNICODE_WCHAR + #define wxArgNormalizerNative wxArgNormalizerWchar +#endif // wxUSE_UNICODE_UTF8 // wxUSE_UNICODE_UTF8 + + + +// special cases for converting strings: + + +// base class for wxArgNormalizer<T> specializations that need to do conversion; +// CharType is either wxStringCharType or wchar_t in UTF-8 build when wrapping +// widechar CRT function +template<typename CharType> +struct wxArgNormalizerWithBuffer +{ + typedef wxScopedCharTypeBuffer<CharType> CharBuffer; + + wxArgNormalizerWithBuffer() {} + wxArgNormalizerWithBuffer(const CharBuffer& buf, + const wxFormatString *fmt, + unsigned index) + : m_value(buf) + { + wxASSERT_ARG_TYPE( fmt, index, wxFormatString::Arg_String ); + } + + const CharType *get() const { return m_value; } + + CharBuffer m_value; +}; + +// string objects: +template<> +struct WXDLLIMPEXP_BASE wxArgNormalizerNative<const wxString&> +{ + wxArgNormalizerNative(const wxString& s, + const wxFormatString *fmt, + unsigned index) + : m_value(s) + { + wxASSERT_ARG_TYPE( fmt, index, wxFormatString::Arg_String ); + } + + const wxStringCharType *get() const; + + const wxString& m_value; +}; + +// c_str() values: +template<> +struct WXDLLIMPEXP_BASE wxArgNormalizerNative<const wxCStrData&> +{ + wxArgNormalizerNative(const wxCStrData& value, + const wxFormatString *fmt, + unsigned index) + : m_value(value) + { + wxASSERT_ARG_TYPE( fmt, index, wxFormatString::Arg_String ); + } + + const wxStringCharType *get() const; + + const wxCStrData& m_value; +}; + +// wxString/wxCStrData conversion to wchar_t* value +#if wxUSE_UNICODE_UTF8 && !wxUSE_UTF8_LOCALE_ONLY +template<> +struct WXDLLIMPEXP_BASE wxArgNormalizerWchar<const wxString&> + : public wxArgNormalizerWithBuffer<wchar_t> +{ + wxArgNormalizerWchar(const wxString& s, + const wxFormatString *fmt, unsigned index); +}; + +template<> +struct WXDLLIMPEXP_BASE wxArgNormalizerWchar<const wxCStrData&> + : public wxArgNormalizerWithBuffer<wchar_t> +{ + wxArgNormalizerWchar(const wxCStrData& s, + const wxFormatString *fmt, unsigned index); +}; +#endif // wxUSE_UNICODE_UTF8 && !wxUSE_UTF8_LOCALE_ONLY + + +// C string pointers of the wrong type (wchar_t* for ANSI or UTF8 build, +// char* for wchar_t Unicode build or UTF8): +#if wxUSE_UNICODE_WCHAR + +template<> +struct wxArgNormalizerWchar<const char*> + : public wxArgNormalizerWithBuffer<wchar_t> +{ + wxArgNormalizerWchar(const char* s, + const wxFormatString *fmt, unsigned index) + : wxArgNormalizerWithBuffer<wchar_t>(wxConvLibc.cMB2WC(s), fmt, index) {} +}; + +#elif wxUSE_UNICODE_UTF8 + +template<> +struct wxArgNormalizerUtf8<const wchar_t*> + : public wxArgNormalizerWithBuffer<char> +{ + wxArgNormalizerUtf8(const wchar_t* s, + const wxFormatString *fmt, unsigned index) + : wxArgNormalizerWithBuffer<char>(wxConvUTF8.cWC2MB(s), fmt, index) {} +}; + +template<> +struct wxArgNormalizerUtf8<const char*> + : public wxArgNormalizerWithBuffer<char> +{ + wxArgNormalizerUtf8(const char* s, + const wxFormatString *fmt, + unsigned index) + { + wxASSERT_ARG_TYPE( fmt, index, wxFormatString::Arg_String ); + + if ( wxLocaleIsUtf8 ) + { + m_value = wxScopedCharBuffer::CreateNonOwned(s); + } + else + { + // convert to widechar string first: + wxScopedWCharBuffer buf(wxConvLibc.cMB2WC(s)); + + // then to UTF-8: + if ( buf ) + m_value = wxConvUTF8.cWC2MB(buf); + } + } +}; + +// UTF-8 build needs conversion to wchar_t* too: +#if !wxUSE_UTF8_LOCALE_ONLY +template<> +struct wxArgNormalizerWchar<const char*> + : public wxArgNormalizerWithBuffer<wchar_t> +{ + wxArgNormalizerWchar(const char* s, + const wxFormatString *fmt, unsigned index) + : wxArgNormalizerWithBuffer<wchar_t>(wxConvLibc.cMB2WC(s), fmt, index) {} +}; +#endif // !wxUSE_UTF8_LOCALE_ONLY + +#else // ANSI - FIXME-UTF8 + +template<> +struct wxArgNormalizerWchar<const wchar_t*> + : public wxArgNormalizerWithBuffer<char> +{ + wxArgNormalizerWchar(const wchar_t* s, + const wxFormatString *fmt, unsigned index) + : wxArgNormalizerWithBuffer<char>(wxConvLibc.cWC2MB(s), fmt, index) {} +}; + +#endif // wxUSE_UNICODE_WCHAR/wxUSE_UNICODE_UTF8/ANSI + + +// this macro is used to implement specialization that are exactly same as +// some other specialization, i.e. to "forward" the implementation (e.g. for +// T=wxString and T=const wxString&). Note that the ctor takes BaseT argument, +// not T! +#if wxUSE_UNICODE_UTF8 + #if wxUSE_UTF8_LOCALE_ONLY + #define WX_ARG_NORMALIZER_FORWARD(T, BaseT) \ + _WX_ARG_NORMALIZER_FORWARD_IMPL(wxArgNormalizerUtf8, T, BaseT) + #else // possibly non-UTF8 locales + #define WX_ARG_NORMALIZER_FORWARD(T, BaseT) \ + _WX_ARG_NORMALIZER_FORWARD_IMPL(wxArgNormalizerWchar, T, BaseT); \ + _WX_ARG_NORMALIZER_FORWARD_IMPL(wxArgNormalizerUtf8, T, BaseT) + #endif +#else // wxUSE_UNICODE_WCHAR + #define WX_ARG_NORMALIZER_FORWARD(T, BaseT) \ + _WX_ARG_NORMALIZER_FORWARD_IMPL(wxArgNormalizerWchar, T, BaseT) +#endif // wxUSE_UNICODE_UTF8/wxUSE_UNICODE_WCHAR + +#define _WX_ARG_NORMALIZER_FORWARD_IMPL(Normalizer, T, BaseT) \ + template<> \ + struct Normalizer<T> : public Normalizer<BaseT> \ + { \ + Normalizer(BaseT value, \ + const wxFormatString *fmt, unsigned index) \ + : Normalizer<BaseT>(value, fmt, index) {} \ + } + +// non-reference versions of specializations for string objects +WX_ARG_NORMALIZER_FORWARD(wxString, const wxString&); +WX_ARG_NORMALIZER_FORWARD(wxCStrData, const wxCStrData&); + +// versions for passing non-const pointers: +WX_ARG_NORMALIZER_FORWARD(char*, const char*); +WX_ARG_NORMALIZER_FORWARD(wchar_t*, const wchar_t*); + +// versions for passing wx[W]CharBuffer: +WX_ARG_NORMALIZER_FORWARD(wxScopedCharBuffer, const char*); +WX_ARG_NORMALIZER_FORWARD(const wxScopedCharBuffer&, const char*); +WX_ARG_NORMALIZER_FORWARD(wxScopedWCharBuffer, const wchar_t*); +WX_ARG_NORMALIZER_FORWARD(const wxScopedWCharBuffer&, const wchar_t*); +WX_ARG_NORMALIZER_FORWARD(wxCharBuffer, const char*); +WX_ARG_NORMALIZER_FORWARD(const wxCharBuffer&, const char*); +WX_ARG_NORMALIZER_FORWARD(wxWCharBuffer, const wchar_t*); +WX_ARG_NORMALIZER_FORWARD(const wxWCharBuffer&, const wchar_t*); + +// versions for std::[w]string: +#if wxUSE_STD_STRING + +#include "wx/stringimpl.h" + +#if !wxUSE_UTF8_LOCALE_ONLY +template<> +struct wxArgNormalizerWchar<const std::string&> + : public wxArgNormalizerWchar<const char*> +{ + wxArgNormalizerWchar(const std::string& s, + const wxFormatString *fmt, unsigned index) + : wxArgNormalizerWchar<const char*>(s.c_str(), fmt, index) {} +}; + +template<> +struct wxArgNormalizerWchar<const wxStdWideString&> + : public wxArgNormalizerWchar<const wchar_t*> +{ + wxArgNormalizerWchar(const wxStdWideString& s, + const wxFormatString *fmt, unsigned index) + : wxArgNormalizerWchar<const wchar_t*>(s.c_str(), fmt, index) {} +}; +#endif // !wxUSE_UTF8_LOCALE_ONLY + +#if wxUSE_UNICODE_UTF8 +template<> +struct wxArgNormalizerUtf8<const std::string&> + : public wxArgNormalizerUtf8<const char*> +{ + wxArgNormalizerUtf8(const std::string& s, + const wxFormatString *fmt, unsigned index) + : wxArgNormalizerUtf8<const char*>(s.c_str(), fmt, index) {} +}; + +template<> +struct wxArgNormalizerUtf8<const wxStdWideString&> + : public wxArgNormalizerUtf8<const wchar_t*> +{ + wxArgNormalizerUtf8(const wxStdWideString& s, + const wxFormatString *fmt, unsigned index) + : wxArgNormalizerUtf8<const wchar_t*>(s.c_str(), fmt, index) {} +}; +#endif // wxUSE_UNICODE_UTF8 + +WX_ARG_NORMALIZER_FORWARD(std::string, const std::string&); +WX_ARG_NORMALIZER_FORWARD(wxStdWideString, const wxStdWideString&); + +#endif // wxUSE_STD_STRING + + +// versions for wxUniChar, wxUniCharRef: +// (this is same for UTF-8 and Wchar builds, we just convert to wchar_t) +template<> +struct wxArgNormalizer<const wxUniChar&> : public wxArgNormalizer<wchar_t> +{ + wxArgNormalizer(const wxUniChar& s, + const wxFormatString *fmt, unsigned index) + : wxArgNormalizer<wchar_t>(wx_truncate_cast(wchar_t, s.GetValue()), fmt, index) {} +}; + +// for wchar_t, default handler does the right thing + +// char has to be treated differently in Unicode builds: a char argument may +// be used either for a character value (which should be converted into +// wxUniChar) or as an integer value (which should be left as-is). We take +// advantage of the fact that both char and wchar_t are converted into int +// in variadic arguments here. +#if wxUSE_UNICODE +template<typename T> +struct wxArgNormalizerNarrowChar +{ + wxArgNormalizerNarrowChar(T value, + const wxFormatString *fmt, unsigned index) + { + wxASSERT_ARG_TYPE( fmt, index, + wxFormatString::Arg_Char | wxFormatString::Arg_Int ); + + // FIXME-UTF8: which one is better default in absence of fmt string + // (i.e. when used like e.g. Foo("foo", "bar", 'c', NULL)? + if ( !fmt || fmt->GetArgumentType(index) == wxFormatString::Arg_Char ) + m_value = wx_truncate_cast(T, wxUniChar(value).GetValue()); + else + m_value = value; + } + + int get() const { return m_value; } + + T m_value; +}; + +template<> +struct wxArgNormalizer<char> : public wxArgNormalizerNarrowChar<char> +{ + wxArgNormalizer(char value, + const wxFormatString *fmt, unsigned index) + : wxArgNormalizerNarrowChar<char>(value, fmt, index) {} +}; + +template<> +struct wxArgNormalizer<unsigned char> + : public wxArgNormalizerNarrowChar<unsigned char> +{ + wxArgNormalizer(unsigned char value, + const wxFormatString *fmt, unsigned index) + : wxArgNormalizerNarrowChar<unsigned char>(value, fmt, index) {} +}; + +template<> +struct wxArgNormalizer<signed char> + : public wxArgNormalizerNarrowChar<signed char> +{ + wxArgNormalizer(signed char value, + const wxFormatString *fmt, unsigned index) + : wxArgNormalizerNarrowChar<signed char>(value, fmt, index) {} +}; + +#endif // wxUSE_UNICODE + +// convert references: +WX_ARG_NORMALIZER_FORWARD(wxUniChar, const wxUniChar&); +WX_ARG_NORMALIZER_FORWARD(const wxUniCharRef&, const wxUniChar&); +WX_ARG_NORMALIZER_FORWARD(wxUniCharRef, const wxUniChar&); +WX_ARG_NORMALIZER_FORWARD(const wchar_t&, wchar_t); + +WX_ARG_NORMALIZER_FORWARD(const char&, char); +WX_ARG_NORMALIZER_FORWARD(const unsigned char&, unsigned char); +WX_ARG_NORMALIZER_FORWARD(const signed char&, signed char); + + +#undef WX_ARG_NORMALIZER_FORWARD +#undef _WX_ARG_NORMALIZER_FORWARD_IMPL + +// NB: Don't #undef wxASSERT_ARG_TYPE here as it's also used in wx/longlong.h. + +// ---------------------------------------------------------------------------- +// WX_VA_ARG_STRING +// ---------------------------------------------------------------------------- + +// Replacement for va_arg() for use with strings in functions that accept +// strings normalized by wxArgNormalizer<T>: + +struct WXDLLIMPEXP_BASE wxArgNormalizedString +{ + wxArgNormalizedString(const void* ptr) : m_ptr(ptr) {} + + // returns true if non-NULL string was passed in + bool IsValid() const { return m_ptr != NULL; } + operator bool() const { return IsValid(); } + + // extracts the string, returns empty string if NULL was passed in + wxString GetString() const; + operator wxString() const; + +private: + const void *m_ptr; +}; + +#define WX_VA_ARG_STRING(ap) wxArgNormalizedString(va_arg(ap, const void*)) + +// ---------------------------------------------------------------------------- +// implementation of the WX_DEFINE_VARARG_* macros +// ---------------------------------------------------------------------------- + +// NB: The vararg emulation code is limited to 30 variadic and 4 fixed +// arguments at the moment. +// If you need more variadic arguments, you need to +// 1) increase the value of _WX_VARARG_MAX_ARGS +// 2) add _WX_VARARG_JOIN_* and _WX_VARARG_ITER_* up to the new +// _WX_VARARG_MAX_ARGS value to the lists below +// If you need more fixed arguments, you need to +// 1) increase the value of _WX_VARARG_MAX_FIXED_ARGS +// 2) add _WX_VARARG_FIXED_EXPAND_* and _WX_VARARG_FIXED_UNUSED_EXPAND_* +// macros below +#define _WX_VARARG_MAX_ARGS 30 +#define _WX_VARARG_MAX_FIXED_ARGS 4 + +#define _WX_VARARG_JOIN_1(m) m(1) +#define _WX_VARARG_JOIN_2(m) _WX_VARARG_JOIN_1(m), m(2) +#define _WX_VARARG_JOIN_3(m) _WX_VARARG_JOIN_2(m), m(3) +#define _WX_VARARG_JOIN_4(m) _WX_VARARG_JOIN_3(m), m(4) +#define _WX_VARARG_JOIN_5(m) _WX_VARARG_JOIN_4(m), m(5) +#define _WX_VARARG_JOIN_6(m) _WX_VARARG_JOIN_5(m), m(6) +#define _WX_VARARG_JOIN_7(m) _WX_VARARG_JOIN_6(m), m(7) +#define _WX_VARARG_JOIN_8(m) _WX_VARARG_JOIN_7(m), m(8) +#define _WX_VARARG_JOIN_9(m) _WX_VARARG_JOIN_8(m), m(9) +#define _WX_VARARG_JOIN_10(m) _WX_VARARG_JOIN_9(m), m(10) +#define _WX_VARARG_JOIN_11(m) _WX_VARARG_JOIN_10(m), m(11) +#define _WX_VARARG_JOIN_12(m) _WX_VARARG_JOIN_11(m), m(12) +#define _WX_VARARG_JOIN_13(m) _WX_VARARG_JOIN_12(m), m(13) +#define _WX_VARARG_JOIN_14(m) _WX_VARARG_JOIN_13(m), m(14) +#define _WX_VARARG_JOIN_15(m) _WX_VARARG_JOIN_14(m), m(15) +#define _WX_VARARG_JOIN_16(m) _WX_VARARG_JOIN_15(m), m(16) +#define _WX_VARARG_JOIN_17(m) _WX_VARARG_JOIN_16(m), m(17) +#define _WX_VARARG_JOIN_18(m) _WX_VARARG_JOIN_17(m), m(18) +#define _WX_VARARG_JOIN_19(m) _WX_VARARG_JOIN_18(m), m(19) +#define _WX_VARARG_JOIN_20(m) _WX_VARARG_JOIN_19(m), m(20) +#define _WX_VARARG_JOIN_21(m) _WX_VARARG_JOIN_20(m), m(21) +#define _WX_VARARG_JOIN_22(m) _WX_VARARG_JOIN_21(m), m(22) +#define _WX_VARARG_JOIN_23(m) _WX_VARARG_JOIN_22(m), m(23) +#define _WX_VARARG_JOIN_24(m) _WX_VARARG_JOIN_23(m), m(24) +#define _WX_VARARG_JOIN_25(m) _WX_VARARG_JOIN_24(m), m(25) +#define _WX_VARARG_JOIN_26(m) _WX_VARARG_JOIN_25(m), m(26) +#define _WX_VARARG_JOIN_27(m) _WX_VARARG_JOIN_26(m), m(27) +#define _WX_VARARG_JOIN_28(m) _WX_VARARG_JOIN_27(m), m(28) +#define _WX_VARARG_JOIN_29(m) _WX_VARARG_JOIN_28(m), m(29) +#define _WX_VARARG_JOIN_30(m) _WX_VARARG_JOIN_29(m), m(30) + +#define _WX_VARARG_ITER_1(m,a,b,c,d,e,f) m(1,a,b,c,d,e,f) +#define _WX_VARARG_ITER_2(m,a,b,c,d,e,f) _WX_VARARG_ITER_1(m,a,b,c,d,e,f) m(2,a,b,c,d,e,f) +#define _WX_VARARG_ITER_3(m,a,b,c,d,e,f) _WX_VARARG_ITER_2(m,a,b,c,d,e,f) m(3,a,b,c,d,e,f) +#define _WX_VARARG_ITER_4(m,a,b,c,d,e,f) _WX_VARARG_ITER_3(m,a,b,c,d,e,f) m(4,a,b,c,d,e,f) +#define _WX_VARARG_ITER_5(m,a,b,c,d,e,f) _WX_VARARG_ITER_4(m,a,b,c,d,e,f) m(5,a,b,c,d,e,f) +#define _WX_VARARG_ITER_6(m,a,b,c,d,e,f) _WX_VARARG_ITER_5(m,a,b,c,d,e,f) m(6,a,b,c,d,e,f) +#define _WX_VARARG_ITER_7(m,a,b,c,d,e,f) _WX_VARARG_ITER_6(m,a,b,c,d,e,f) m(7,a,b,c,d,e,f) +#define _WX_VARARG_ITER_8(m,a,b,c,d,e,f) _WX_VARARG_ITER_7(m,a,b,c,d,e,f) m(8,a,b,c,d,e,f) +#define _WX_VARARG_ITER_9(m,a,b,c,d,e,f) _WX_VARARG_ITER_8(m,a,b,c,d,e,f) m(9,a,b,c,d,e,f) +#define _WX_VARARG_ITER_10(m,a,b,c,d,e,f) _WX_VARARG_ITER_9(m,a,b,c,d,e,f) m(10,a,b,c,d,e,f) +#define _WX_VARARG_ITER_11(m,a,b,c,d,e,f) _WX_VARARG_ITER_10(m,a,b,c,d,e,f) m(11,a,b,c,d,e,f) +#define _WX_VARARG_ITER_12(m,a,b,c,d,e,f) _WX_VARARG_ITER_11(m,a,b,c,d,e,f) m(12,a,b,c,d,e,f) +#define _WX_VARARG_ITER_13(m,a,b,c,d,e,f) _WX_VARARG_ITER_12(m,a,b,c,d,e,f) m(13,a,b,c,d,e,f) +#define _WX_VARARG_ITER_14(m,a,b,c,d,e,f) _WX_VARARG_ITER_13(m,a,b,c,d,e,f) m(14,a,b,c,d,e,f) +#define _WX_VARARG_ITER_15(m,a,b,c,d,e,f) _WX_VARARG_ITER_14(m,a,b,c,d,e,f) m(15,a,b,c,d,e,f) +#define _WX_VARARG_ITER_16(m,a,b,c,d,e,f) _WX_VARARG_ITER_15(m,a,b,c,d,e,f) m(16,a,b,c,d,e,f) +#define _WX_VARARG_ITER_17(m,a,b,c,d,e,f) _WX_VARARG_ITER_16(m,a,b,c,d,e,f) m(17,a,b,c,d,e,f) +#define _WX_VARARG_ITER_18(m,a,b,c,d,e,f) _WX_VARARG_ITER_17(m,a,b,c,d,e,f) m(18,a,b,c,d,e,f) +#define _WX_VARARG_ITER_19(m,a,b,c,d,e,f) _WX_VARARG_ITER_18(m,a,b,c,d,e,f) m(19,a,b,c,d,e,f) +#define _WX_VARARG_ITER_20(m,a,b,c,d,e,f) _WX_VARARG_ITER_19(m,a,b,c,d,e,f) m(20,a,b,c,d,e,f) +#define _WX_VARARG_ITER_21(m,a,b,c,d,e,f) _WX_VARARG_ITER_20(m,a,b,c,d,e,f) m(21,a,b,c,d,e,f) +#define _WX_VARARG_ITER_22(m,a,b,c,d,e,f) _WX_VARARG_ITER_21(m,a,b,c,d,e,f) m(22,a,b,c,d,e,f) +#define _WX_VARARG_ITER_23(m,a,b,c,d,e,f) _WX_VARARG_ITER_22(m,a,b,c,d,e,f) m(23,a,b,c,d,e,f) +#define _WX_VARARG_ITER_24(m,a,b,c,d,e,f) _WX_VARARG_ITER_23(m,a,b,c,d,e,f) m(24,a,b,c,d,e,f) +#define _WX_VARARG_ITER_25(m,a,b,c,d,e,f) _WX_VARARG_ITER_24(m,a,b,c,d,e,f) m(25,a,b,c,d,e,f) +#define _WX_VARARG_ITER_26(m,a,b,c,d,e,f) _WX_VARARG_ITER_25(m,a,b,c,d,e,f) m(26,a,b,c,d,e,f) +#define _WX_VARARG_ITER_27(m,a,b,c,d,e,f) _WX_VARARG_ITER_26(m,a,b,c,d,e,f) m(27,a,b,c,d,e,f) +#define _WX_VARARG_ITER_28(m,a,b,c,d,e,f) _WX_VARARG_ITER_27(m,a,b,c,d,e,f) m(28,a,b,c,d,e,f) +#define _WX_VARARG_ITER_29(m,a,b,c,d,e,f) _WX_VARARG_ITER_28(m,a,b,c,d,e,f) m(29,a,b,c,d,e,f) +#define _WX_VARARG_ITER_30(m,a,b,c,d,e,f) _WX_VARARG_ITER_29(m,a,b,c,d,e,f) m(30,a,b,c,d,e,f) + + +#define _WX_VARARG_FIXED_EXPAND_1(t1) \ + t1 f1 +#define _WX_VARARG_FIXED_EXPAND_2(t1,t2) \ + t1 f1, t2 f2 +#define _WX_VARARG_FIXED_EXPAND_3(t1,t2,t3) \ + t1 f1, t2 f2, t3 f3 +#define _WX_VARARG_FIXED_EXPAND_4(t1,t2,t3,t4) \ + t1 f1, t2 f2, t3 f3, t4 f4 + +#define _WX_VARARG_FIXED_UNUSED_EXPAND_1(t1) \ + t1 WXUNUSED(f1) +#define _WX_VARARG_FIXED_UNUSED_EXPAND_2(t1,t2) \ + t1 WXUNUSED(f1), t2 WXUNUSED(f2) +#define _WX_VARARG_FIXED_UNUSED_EXPAND_3(t1,t2,t3) \ + t1 WXUNUSED(f1), t2 WXUNUSED(f2), t3 WXUNUSED(f3) +#define _WX_VARARG_FIXED_UNUSED_EXPAND_4(t1,t2,t3,t4) \ + t1 WXUNUSED(f1), t2 WXUNUSED(f2), t3 WXUNUSED(f3), t4 WXUNUSED(f4) + +#define _WX_VARARG_FIXED_TYPEDEFS_1(t1) \ + typedef t1 TF1 +#define _WX_VARARG_FIXED_TYPEDEFS_2(t1,t2) \ + _WX_VARARG_FIXED_TYPEDEFS_1(t1); typedef t2 TF2 +#define _WX_VARARG_FIXED_TYPEDEFS_3(t1,t2,t3) \ + _WX_VARARG_FIXED_TYPEDEFS_2(t1,t2); typedef t3 TF3 +#define _WX_VARARG_FIXED_TYPEDEFS_4(t1,t2,t3,t4) \ + _WX_VARARG_FIXED_TYPEDEFS_3(t1,t2,t3); typedef t4 TF4 + +// This macro expands N-items tuple of fixed arguments types into part of +// function's declaration. For example, +// "_WX_VARARG_FIXED_EXPAND(3, (int, char*, int))" expands into +// "int f1, char* f2, int f3". +#define _WX_VARARG_FIXED_EXPAND(N, args) \ + _WX_VARARG_FIXED_EXPAND_IMPL(N, args) +#define _WX_VARARG_FIXED_EXPAND_IMPL(N, args) \ + _WX_VARARG_FIXED_EXPAND_##N args + +// Ditto for unused arguments +#define _WX_VARARG_FIXED_UNUSED_EXPAND(N, args) \ + _WX_VARARG_FIXED_UNUSED_EXPAND_IMPL(N, args) +#define _WX_VARARG_FIXED_UNUSED_EXPAND_IMPL(N, args) \ + _WX_VARARG_FIXED_UNUSED_EXPAND_##N args + +// Declarates typedefs for fixed arguments types; i-th fixed argument types +// will have TFi typedef. +#define _WX_VARARG_FIXED_TYPEDEFS(N, args) \ + _WX_VARARG_FIXED_TYPEDEFS_IMPL(N, args) +#define _WX_VARARG_FIXED_TYPEDEFS_IMPL(N, args) \ + _WX_VARARG_FIXED_TYPEDEFS_##N args + + +// This macro calls another macro 'm' passed as second argument 'N' times, +// with its only argument set to 1..N, and concatenates the results using +// comma as separator. +// +// An example: +// #define foo(i) x##i +// // this expands to "x1,x2,x3,x4" +// _WX_VARARG_JOIN(4, foo) +// +// +// N must not be greater than _WX_VARARG_MAX_ARGS (=30). +#define _WX_VARARG_JOIN(N, m) _WX_VARARG_JOIN_IMPL(N, m) +#define _WX_VARARG_JOIN_IMPL(N, m) _WX_VARARG_JOIN_##N(m) + + +// This macro calls another macro 'm' passed as second argument 'N' times, with +// its first argument set to 1..N and the remaining arguments set to 'a', 'b', +// 'c', 'd', 'e' and 'f'. The results are separated with whitespace in the +// expansion. +// +// An example: +// // this macro expands to: +// // foo(1,a,b,c,d,e,f) +// // foo(2,a,b,c,d,e,f) +// // foo(3,a,b,c,d,e,f) +// _WX_VARARG_ITER(3, foo, a, b, c, d, e, f) +// +// N must not be greater than _WX_VARARG_MAX_ARGS (=30). +#define _WX_VARARG_ITER(N,m,a,b,c,d,e,f) \ + _WX_VARARG_ITER_IMPL(N,m,a,b,c,d,e,f) +#define _WX_VARARG_ITER_IMPL(N,m,a,b,c,d,e,f) \ + _WX_VARARG_ITER_##N(m,a,b,c,d,e,f) + +// Generates code snippet for i-th "variadic" argument in vararg function's +// prototype: +#define _WX_VARARG_ARG(i) T##i a##i + +// Like _WX_VARARG_ARG_UNUSED, but outputs argument's type with WXUNUSED: +#define _WX_VARARG_ARG_UNUSED(i) T##i WXUNUSED(a##i) + +// Generates code snippet for i-th type in vararg function's template<...>: +#define _WX_VARARG_TEMPL(i) typename T##i + +// Generates code snippet for passing i-th argument of vararg function +// wrapper to its implementation, normalizing it in the process: +#define _WX_VARARG_PASS_WCHAR(i) \ + wxArgNormalizerWchar<T##i>(a##i, fmt, i).get() +#define _WX_VARARG_PASS_UTF8(i) \ + wxArgNormalizerUtf8<T##i>(a##i, fmt, i).get() + + +// And the same for fixed arguments, _not_ normalizing it: +#define _WX_VARARG_PASS_FIXED(i) f##i + +#define _WX_VARARG_FIND_FMT(i) \ + (wxFormatStringArgumentFinder<TF##i>::find(f##i)) + +#define _WX_VARARG_FORMAT_STRING(numfixed, fixed) \ + _WX_VARARG_FIXED_TYPEDEFS(numfixed, fixed); \ + const wxFormatString *fmt = \ + (_WX_VARARG_JOIN(numfixed, _WX_VARARG_FIND_FMT)) + +#if wxUSE_UNICODE_UTF8 + #define _WX_VARARG_DO_CALL_UTF8(return_kw, impl, implUtf8, N, numfixed) \ + return_kw implUtf8(_WX_VARARG_JOIN(numfixed, _WX_VARARG_PASS_FIXED), \ + _WX_VARARG_JOIN(N, _WX_VARARG_PASS_UTF8)) + #define _WX_VARARG_DO_CALL0_UTF8(return_kw, impl, implUtf8, numfixed) \ + return_kw implUtf8(_WX_VARARG_JOIN(numfixed, _WX_VARARG_PASS_FIXED)) +#endif // wxUSE_UNICODE_UTF8 + +#define _WX_VARARG_DO_CALL_WCHAR(return_kw, impl, implUtf8, N, numfixed) \ + return_kw impl(_WX_VARARG_JOIN(numfixed, _WX_VARARG_PASS_FIXED), \ + _WX_VARARG_JOIN(N, _WX_VARARG_PASS_WCHAR)) +#define _WX_VARARG_DO_CALL0_WCHAR(return_kw, impl, implUtf8, numfixed) \ + return_kw impl(_WX_VARARG_JOIN(numfixed, _WX_VARARG_PASS_FIXED)) + +#if wxUSE_UNICODE_UTF8 + #if wxUSE_UTF8_LOCALE_ONLY + #define _WX_VARARG_DO_CALL _WX_VARARG_DO_CALL_UTF8 + #define _WX_VARARG_DO_CALL0 _WX_VARARG_DO_CALL0_UTF8 + #else // possibly non-UTF8 locales + #define _WX_VARARG_DO_CALL(return_kw, impl, implUtf8, N, numfixed) \ + if ( wxLocaleIsUtf8 ) \ + _WX_VARARG_DO_CALL_UTF8(return_kw, impl, implUtf8, N, numfixed);\ + else \ + _WX_VARARG_DO_CALL_WCHAR(return_kw, impl, implUtf8, N, numfixed) + + #define _WX_VARARG_DO_CALL0(return_kw, impl, implUtf8, numfixed) \ + if ( wxLocaleIsUtf8 ) \ + _WX_VARARG_DO_CALL0_UTF8(return_kw, impl, implUtf8, numfixed); \ + else \ + _WX_VARARG_DO_CALL0_WCHAR(return_kw, impl, implUtf8, numfixed) + #endif // wxUSE_UTF8_LOCALE_ONLY or not +#else // wxUSE_UNICODE_WCHAR or ANSI + #define _WX_VARARG_DO_CALL _WX_VARARG_DO_CALL_WCHAR + #define _WX_VARARG_DO_CALL0 _WX_VARARG_DO_CALL0_WCHAR +#endif // wxUSE_UNICODE_UTF8 / wxUSE_UNICODE_WCHAR + + +// Macro to be used with _WX_VARARG_ITER in the implementation of +// WX_DEFINE_VARARG_FUNC (see its documentation for the meaning of arguments) +#define _WX_VARARG_DEFINE_FUNC(N, rettype, name, \ + impl, implUtf8, numfixed, fixed) \ + template<_WX_VARARG_JOIN(N, _WX_VARARG_TEMPL)> \ + rettype name(_WX_VARARG_FIXED_EXPAND(numfixed, fixed), \ + _WX_VARARG_JOIN(N, _WX_VARARG_ARG)) \ + { \ + _WX_VARARG_FORMAT_STRING(numfixed, fixed); \ + _WX_VARARG_DO_CALL(return, impl, implUtf8, N, numfixed); \ + } + +#define _WX_VARARG_DEFINE_FUNC_N0(rettype, name, \ + impl, implUtf8, numfixed, fixed) \ + inline rettype name(_WX_VARARG_FIXED_EXPAND(numfixed, fixed)) \ + { \ + _WX_VARARG_DO_CALL0(return, impl, implUtf8, numfixed); \ + } + +// Macro to be used with _WX_VARARG_ITER in the implementation of +// WX_DEFINE_VARARG_FUNC_VOID (see its documentation for the meaning of +// arguments; rettype is ignored and is used only to satisfy _WX_VARARG_ITER's +// requirements). +#define _WX_VARARG_DEFINE_FUNC_VOID(N, rettype, name, \ + impl, implUtf8, numfixed, fixed) \ + template<_WX_VARARG_JOIN(N, _WX_VARARG_TEMPL)> \ + void name(_WX_VARARG_FIXED_EXPAND(numfixed, fixed), \ + _WX_VARARG_JOIN(N, _WX_VARARG_ARG)) \ + { \ + _WX_VARARG_FORMAT_STRING(numfixed, fixed); \ + _WX_VARARG_DO_CALL(wxEMPTY_PARAMETER_VALUE, \ + impl, implUtf8, N, numfixed); \ + } + +#define _WX_VARARG_DEFINE_FUNC_VOID_N0(name, impl, implUtf8, numfixed, fixed) \ + inline void name(_WX_VARARG_FIXED_EXPAND(numfixed, fixed)) \ + { \ + _WX_VARARG_DO_CALL0(wxEMPTY_PARAMETER_VALUE, \ + impl, implUtf8, numfixed); \ + } + +// Macro to be used with _WX_VARARG_ITER in the implementation of +// WX_DEFINE_VARARG_FUNC_CTOR (see its documentation for the meaning of +// arguments; rettype is ignored and is used only to satisfy _WX_VARARG_ITER's +// requirements). +#define _WX_VARARG_DEFINE_FUNC_CTOR(N, rettype, name, \ + impl, implUtf8, numfixed, fixed) \ + template<_WX_VARARG_JOIN(N, _WX_VARARG_TEMPL)> \ + name(_WX_VARARG_FIXED_EXPAND(numfixed, fixed), \ + _WX_VARARG_JOIN(N, _WX_VARARG_ARG)) \ + { \ + _WX_VARARG_FORMAT_STRING(numfixed, fixed); \ + _WX_VARARG_DO_CALL(wxEMPTY_PARAMETER_VALUE, \ + impl, implUtf8, N, numfixed); \ + } + +#define _WX_VARARG_DEFINE_FUNC_CTOR_N0(name, impl, implUtf8, numfixed, fixed) \ + inline name(_WX_VARARG_FIXED_EXPAND(numfixed, fixed)) \ + { \ + _WX_VARARG_DO_CALL0(wxEMPTY_PARAMETER_VALUE, \ + impl, implUtf8, numfixed); \ + } + +// Macro to be used with _WX_VARARG_ITER in the implementation of +// WX_DEFINE_VARARG_FUNC_NOP, i.e. empty stub for a disabled vararg function. +// The rettype and impl arguments are ignored. +#define _WX_VARARG_DEFINE_FUNC_NOP(N, rettype, name, \ + impl, implUtf8, numfixed, fixed) \ + template<_WX_VARARG_JOIN(N, _WX_VARARG_TEMPL)> \ + void name(_WX_VARARG_FIXED_UNUSED_EXPAND(numfixed, fixed), \ + _WX_VARARG_JOIN(N, _WX_VARARG_ARG_UNUSED)) \ + {} + +#define _WX_VARARG_DEFINE_FUNC_NOP_N0(name, numfixed, fixed) \ + inline void name(_WX_VARARG_FIXED_UNUSED_EXPAND(numfixed, fixed)) \ + {} + + +// ---------------------------------------------------------------------------- +// workaround for OpenWatcom bug #351 +// ---------------------------------------------------------------------------- + +#ifdef __WATCOMC__ +// workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351 + +// This macro can be used to forward a 'vararg' template to another one with +// different fixed arguments types. Parameters are same as for +// WX_DEFINE_VARARG_FUNC (rettype=void can be used here), 'convfixed' is how +// to convert fixed arguments. For example, this is typical code for dealing +// with different forms of format string: +// +// WX_DEFINE_VARARG_FUNC_VOID(Printf, 1, (const wxFormatString&), +// DoPrintfWchar, DoPrintfUtf8) +// #ifdef __WATCOMC__ +// WX_VARARG_WATCOM_WORKAROUND(void, Printf, 1, (const wxString&), +// (wxFormatString(f1))) +// WX_VARARG_WATCOM_WORKAROUND(void, Printf, 1, (const char*), +// (wxFormatString(f1))) +// ... +#define WX_VARARG_WATCOM_WORKAROUND(rettype, name, numfixed, fixed, convfixed)\ + _WX_VARARG_ITER(_WX_VARARG_MAX_ARGS, \ + _WX_VARARG_WATCOM_WORKAROUND, \ + rettype, name, convfixed, dummy, numfixed, fixed) + +#define WX_VARARG_WATCOM_WORKAROUND_CTOR(name, numfixed, fixed, convfixed) \ + _WX_VARARG_ITER(_WX_VARARG_MAX_ARGS, \ + _WX_VARARG_WATCOM_WORKAROUND_CTOR, \ + dummy, name, convfixed, dummy, numfixed, fixed) + +#define _WX_VARARG_WATCOM_UNPACK_1(a1) a1 +#define _WX_VARARG_WATCOM_UNPACK_2(a1, a2) a1, a2 +#define _WX_VARARG_WATCOM_UNPACK_3(a1, a2, a3) a1, a2, a3 +#define _WX_VARARG_WATCOM_UNPACK_4(a1, a2, a3, a4) a1, a2, a3, a4 +#define _WX_VARARG_WATCOM_UNPACK(N, convfixed) \ + _WX_VARARG_WATCOM_UNPACK_##N convfixed + +#define _WX_VARARG_PASS_WATCOM(i) a##i + +#define _WX_VARARG_WATCOM_WORKAROUND(N, rettype, name, \ + convfixed, dummy, numfixed, fixed) \ + template<_WX_VARARG_JOIN(N, _WX_VARARG_TEMPL)> \ + rettype name(_WX_VARARG_FIXED_EXPAND(numfixed, fixed), \ + _WX_VARARG_JOIN(N, _WX_VARARG_ARG)) \ + { \ + return name(_WX_VARARG_WATCOM_UNPACK(numfixed, convfixed), \ + _WX_VARARG_JOIN(N, _WX_VARARG_PASS_WATCOM)); \ + } + +#define _WX_VARARG_WATCOM_WORKAROUND_CTOR(N, dummy1, name, \ + convfixed, dummy2, numfixed, fixed) \ + template<_WX_VARARG_JOIN(N, _WX_VARARG_TEMPL)> \ + name(_WX_VARARG_FIXED_EXPAND(numfixed, fixed), \ + _WX_VARARG_JOIN(N, _WX_VARARG_ARG)) \ + { \ + name(_WX_VARARG_WATCOM_UNPACK(numfixed, convfixed), \ + _WX_VARARG_JOIN(N, _WX_VARARG_PASS_WATCOM)); \ + } + +#endif // __WATCOMC__ + +#endif // _WX_STRVARARG_H_ diff --git a/wxmsw/include/wx-3.0/wx/sysopt.h b/wxmsw/include/wx-3.0/wx/sysopt.h new file mode 100644 index 00000000..63474c06 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/sysopt.h @@ -0,0 +1,74 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/sysopt.h +// Purpose: wxSystemOptions +// Author: Julian Smart +// Modified by: +// Created: 2001-07-10 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SYSOPT_H_ +#define _WX_SYSOPT_H_ + +#include "wx/object.h" + +// ---------------------------------------------------------------------------- +// Enables an application to influence the wxWidgets implementation +// ---------------------------------------------------------------------------- + +class +#if wxUSE_SYSTEM_OPTIONS +WXDLLIMPEXP_BASE +#endif +wxSystemOptions : public wxObject +{ +public: + wxSystemOptions() { } + + // User-customizable hints to wxWidgets or associated libraries + // These could also be used to influence GetSystem... calls, indeed + // to implement SetSystemColour/Font/Metric + +#if wxUSE_SYSTEM_OPTIONS + static void SetOption(const wxString& name, const wxString& value); + static void SetOption(const wxString& name, int value); +#endif // wxUSE_SYSTEM_OPTIONS + static wxString GetOption(const wxString& name); + static int GetOptionInt(const wxString& name); + static bool HasOption(const wxString& name); + + static bool IsFalse(const wxString& name) + { + return HasOption(name) && GetOptionInt(name) == 0; + } +}; + +#if !wxUSE_SYSTEM_OPTIONS + +// define inline stubs for accessors to make it possible to use wxSystemOptions +// in the library itself without checking for wxUSE_SYSTEM_OPTIONS all the time + +/* static */ inline +wxString wxSystemOptions::GetOption(const wxString& WXUNUSED(name)) +{ + return wxEmptyString; +} + +/* static */ inline +int wxSystemOptions::GetOptionInt(const wxString& WXUNUSED(name)) +{ + return 0; +} + +/* static */ inline +bool wxSystemOptions::HasOption(const wxString& WXUNUSED(name)) +{ + return false; +} + +#endif // !wxUSE_SYSTEM_OPTIONS + +#endif + // _WX_SYSOPT_H_ + diff --git a/wxmsw/include/wx-3.0/wx/tarstrm.h b/wxmsw/include/wx-3.0/wx/tarstrm.h new file mode 100644 index 00000000..906d4383 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/tarstrm.h @@ -0,0 +1,353 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/tarstrm.h +// Purpose: Streams for Tar files +// Author: Mike Wetherell +// Copyright: (c) 2004 Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WXTARSTREAM_H__ +#define _WX_WXTARSTREAM_H__ + +#include "wx/defs.h" + +#if wxUSE_TARSTREAM + +#include "wx/archive.h" +#include "wx/hashmap.h" + + +///////////////////////////////////////////////////////////////////////////// +// Constants + +// TypeFlag values +enum wxTarType +{ + wxTAR_REGTYPE = '0', // regular file + wxTAR_LNKTYPE = '1', // hard link + wxTAR_SYMTYPE = '2', // symbolic link + wxTAR_CHRTYPE = '3', // character special + wxTAR_BLKTYPE = '4', // block special + wxTAR_DIRTYPE = '5', // directory + wxTAR_FIFOTYPE = '6', // named pipe + wxTAR_CONTTYPE = '7' // contiguous file +}; + +// Archive Formats (use wxTAR_PAX, it's backward compatible) +enum wxTarFormat +{ + wxTAR_USTAR, // POSIX.1-1990 tar format + wxTAR_PAX // POSIX.1-2001 tar format +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxTarNotifier + +class WXDLLIMPEXP_BASE wxTarNotifier +{ +public: + virtual ~wxTarNotifier() { } + + virtual void OnEntryUpdated(class wxTarEntry& entry) = 0; +}; + + +///////////////////////////////////////////////////////////////////////////// +// Tar Entry - hold the meta data for a file in the tar + +class WXDLLIMPEXP_BASE wxTarEntry : public wxArchiveEntry +{ +public: + wxTarEntry(const wxString& name = wxEmptyString, + const wxDateTime& dt = wxDateTime::Now(), + wxFileOffset size = wxInvalidOffset); + virtual ~wxTarEntry(); + + wxTarEntry(const wxTarEntry& entry); + wxTarEntry& operator=(const wxTarEntry& entry); + + // Get accessors + wxString GetName(wxPathFormat format = wxPATH_NATIVE) const; + wxString GetInternalName() const { return m_Name; } + wxPathFormat GetInternalFormat() const { return wxPATH_UNIX; } + int GetMode() const; + int GetUserId() const { return m_UserId; } + int GetGroupId() const { return m_GroupId; } + wxFileOffset GetSize() const { return m_Size; } + wxFileOffset GetOffset() const { return m_Offset; } + wxDateTime GetDateTime() const { return m_ModifyTime; } + wxDateTime GetAccessTime() const { return m_AccessTime; } + wxDateTime GetCreateTime() const { return m_CreateTime; } + int GetTypeFlag() const { return m_TypeFlag; } + wxString GetLinkName() const { return m_LinkName; } + wxString GetUserName() const { return m_UserName; } + wxString GetGroupName() const { return m_GroupName; } + int GetDevMajor() const { return m_DevMajor; } + int GetDevMinor() const { return m_DevMinor; } + + // is accessors + bool IsDir() const; + bool IsReadOnly() const { return !(m_Mode & 0222); } + + // set accessors + void SetName(const wxString& name, wxPathFormat format = wxPATH_NATIVE); + void SetUserId(int id) { m_UserId = id; } + void SetGroupId(int id) { m_GroupId = id; } + void SetMode(int mode); + void SetSize(wxFileOffset size) { m_Size = size; } + void SetDateTime(const wxDateTime& dt) { m_ModifyTime = dt; } + void SetAccessTime(const wxDateTime& dt) { m_AccessTime = dt; } + void SetCreateTime(const wxDateTime& dt) { m_CreateTime = dt; } + void SetTypeFlag(int type) { m_TypeFlag = type; } + void SetLinkName(const wxString& link) { m_LinkName = link; } + void SetUserName(const wxString& user) { m_UserName = user; } + void SetGroupName(const wxString& group) { m_GroupName = group; } + void SetDevMajor(int dev) { m_DevMajor = dev; } + void SetDevMinor(int dev) { m_DevMinor = dev; } + + // set is accessors + void SetIsDir(bool isDir = true); + void SetIsReadOnly(bool isReadOnly = true); + + static wxString GetInternalName(const wxString& name, + wxPathFormat format = wxPATH_NATIVE, + bool *pIsDir = NULL); + + wxTarEntry *Clone() const { return new wxTarEntry(*this); } + + void SetNotifier(wxTarNotifier& WXUNUSED(notifier)) { } + +private: + void SetOffset(wxFileOffset offset) { m_Offset = offset; } + + virtual wxArchiveEntry* DoClone() const { return Clone(); } + + wxString m_Name; + int m_Mode; + bool m_IsModeSet; + int m_UserId; + int m_GroupId; + wxFileOffset m_Size; + wxFileOffset m_Offset; + wxDateTime m_ModifyTime; + wxDateTime m_AccessTime; + wxDateTime m_CreateTime; + int m_TypeFlag; + wxString m_LinkName; + wxString m_UserName; + wxString m_GroupName; + int m_DevMajor; + int m_DevMinor; + + friend class wxTarInputStream; + + DECLARE_DYNAMIC_CLASS(wxTarEntry) +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxTarInputStream + +WX_DECLARE_STRING_HASH_MAP(wxString, wxTarHeaderRecords); + +class WXDLLIMPEXP_BASE wxTarInputStream : public wxArchiveInputStream +{ +public: + typedef wxTarEntry entry_type; + + wxTarInputStream(wxInputStream& stream, wxMBConv& conv = wxConvLocal); + wxTarInputStream(wxInputStream *stream, wxMBConv& conv = wxConvLocal); + virtual ~wxTarInputStream(); + + bool OpenEntry(wxTarEntry& entry); + bool CloseEntry(); + + wxTarEntry *GetNextEntry(); + + wxFileOffset GetLength() const { return m_size; } + bool IsSeekable() const { return m_parent_i_stream->IsSeekable(); } + +protected: + size_t OnSysRead(void *buffer, size_t size); + wxFileOffset OnSysTell() const { return m_pos; } + wxFileOffset OnSysSeek(wxFileOffset seek, wxSeekMode mode); + +private: + void Init(); + + wxArchiveEntry *DoGetNextEntry() { return GetNextEntry(); } + bool OpenEntry(wxArchiveEntry& entry); + bool IsOpened() const { return m_pos != wxInvalidOffset; } + + wxStreamError ReadHeaders(); + bool ReadExtendedHeader(wxTarHeaderRecords*& recs); + + wxString GetExtendedHeader(const wxString& key) const; + wxString GetHeaderPath() const; + wxFileOffset GetHeaderNumber(int id) const; + wxString GetHeaderString(int id) const; + wxDateTime GetHeaderDate(const wxString& key) const; + + wxFileOffset m_pos; // position within the current entry + wxFileOffset m_offset; // offset to the start of the entry's data + wxFileOffset m_size; // size of the current entry's data + + int m_sumType; + int m_tarType; + class wxTarHeaderBlock *m_hdr; + wxTarHeaderRecords *m_HeaderRecs; + wxTarHeaderRecords *m_GlobalHeaderRecs; + + wxDECLARE_NO_COPY_CLASS(wxTarInputStream); +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxTarOutputStream + +class WXDLLIMPEXP_BASE wxTarOutputStream : public wxArchiveOutputStream +{ +public: + wxTarOutputStream(wxOutputStream& stream, + wxTarFormat format = wxTAR_PAX, + wxMBConv& conv = wxConvLocal); + wxTarOutputStream(wxOutputStream *stream, + wxTarFormat format = wxTAR_PAX, + wxMBConv& conv = wxConvLocal); + virtual ~wxTarOutputStream(); + + bool PutNextEntry(wxTarEntry *entry); + + bool PutNextEntry(const wxString& name, + const wxDateTime& dt = wxDateTime::Now(), + wxFileOffset size = wxInvalidOffset); + + bool PutNextDirEntry(const wxString& name, + const wxDateTime& dt = wxDateTime::Now()); + + bool CopyEntry(wxTarEntry *entry, wxTarInputStream& inputStream); + bool CopyArchiveMetaData(wxTarInputStream& WXUNUSED(s)) { return true; } + + void Sync(); + bool CloseEntry(); + bool Close(); + + bool IsSeekable() const { return m_parent_o_stream->IsSeekable(); } + + void SetBlockingFactor(int factor) { m_BlockingFactor = factor; } + int GetBlockingFactor() const { return m_BlockingFactor; } + +protected: + size_t OnSysWrite(const void *buffer, size_t size); + wxFileOffset OnSysTell() const { return m_pos; } + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + +private: + void Init(wxTarFormat format); + + bool PutNextEntry(wxArchiveEntry *entry); + bool CopyEntry(wxArchiveEntry *entry, wxArchiveInputStream& stream); + bool CopyArchiveMetaData(wxArchiveInputStream& WXUNUSED(s)) { return true; } + bool IsOpened() const { return m_pos != wxInvalidOffset; } + + bool WriteHeaders(wxTarEntry& entry); + bool ModifyHeader(); + wxString PaxHeaderPath(const wxString& format, const wxString& path); + + void SetExtendedHeader(const wxString& key, const wxString& value); + void SetHeaderPath(const wxString& name); + bool SetHeaderNumber(int id, wxFileOffset n); + void SetHeaderString(int id, const wxString& str); + void SetHeaderDate(const wxString& key, const wxDateTime& datetime); + + wxFileOffset m_pos; // position within the current entry + wxFileOffset m_maxpos; // max pos written + wxFileOffset m_size; // expected entry size + + wxFileOffset m_headpos; // offset within the file to the entry's header + wxFileOffset m_datapos; // offset within the file to the entry's data + + wxFileOffset m_tarstart;// offset within the file to the tar + wxFileOffset m_tarsize; // size of tar so far + + bool m_pax; + int m_BlockingFactor; + wxUint32 m_chksum; + bool m_large; + class wxTarHeaderBlock *m_hdr; + class wxTarHeaderBlock *m_hdr2; + char *m_extendedHdr; + size_t m_extendedSize; + wxString m_badfit; + bool m_endrecWritten; + + wxDECLARE_NO_COPY_CLASS(wxTarOutputStream); +}; + + +///////////////////////////////////////////////////////////////////////////// +// Iterators + +#if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR +typedef wxArchiveIterator<wxTarInputStream> wxTarIter; +typedef wxArchiveIterator<wxTarInputStream, + std::pair<wxString, wxTarEntry*> > wxTarPairIter; +#endif + + +///////////////////////////////////////////////////////////////////////////// +// wxTarClassFactory + +class WXDLLIMPEXP_BASE wxTarClassFactory : public wxArchiveClassFactory +{ +public: + typedef wxTarEntry entry_type; + typedef wxTarInputStream instream_type; + typedef wxTarOutputStream outstream_type; + typedef wxTarNotifier notifier_type; +#if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR + typedef wxTarIter iter_type; + typedef wxTarPairIter pairiter_type; +#endif + + wxTarClassFactory(); + + wxTarEntry *NewEntry() const + { return new wxTarEntry; } + wxTarInputStream *NewStream(wxInputStream& stream) const + { return new wxTarInputStream(stream, GetConv()); } + wxTarOutputStream *NewStream(wxOutputStream& stream) const + { return new wxTarOutputStream(stream, wxTAR_PAX, GetConv()); } + wxTarInputStream *NewStream(wxInputStream *stream) const + { return new wxTarInputStream(stream, GetConv()); } + wxTarOutputStream *NewStream(wxOutputStream *stream) const + { return new wxTarOutputStream(stream, wxTAR_PAX, GetConv()); } + + wxString GetInternalName(const wxString& name, + wxPathFormat format = wxPATH_NATIVE) const + { return wxTarEntry::GetInternalName(name, format); } + + const wxChar * const *GetProtocols(wxStreamProtocolType type + = wxSTREAM_PROTOCOL) const; + +protected: + wxArchiveEntry *DoNewEntry() const + { return NewEntry(); } + wxArchiveInputStream *DoNewStream(wxInputStream& stream) const + { return NewStream(stream); } + wxArchiveOutputStream *DoNewStream(wxOutputStream& stream) const + { return NewStream(stream); } + wxArchiveInputStream *DoNewStream(wxInputStream *stream) const + { return NewStream(stream); } + wxArchiveOutputStream *DoNewStream(wxOutputStream *stream) const + { return NewStream(stream); } + +private: + DECLARE_DYNAMIC_CLASS(wxTarClassFactory) +}; + + +#endif // wxUSE_TARSTREAM + +#endif // _WX_WXTARSTREAM_H__ diff --git a/wxmsw/include/wx-3.0/wx/taskbar.h b/wxmsw/include/wx-3.0/wx/taskbar.h new file mode 100644 index 00000000..4a81088b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/taskbar.h @@ -0,0 +1,154 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/taskbar.h +// Purpose: wxTaskBarIcon base header and class +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TASKBAR_H_BASE_ +#define _WX_TASKBAR_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_TASKBARICON + +#include "wx/event.h" + +class WXDLLIMPEXP_FWD_ADV wxTaskBarIconEvent; + +// ---------------------------------------------------------------------------- + +// type of taskbar item to create. Only applicable in wxOSX_COCOA +enum wxTaskBarIconType +{ + wxTBI_DOCK, + wxTBI_CUSTOM_STATUSITEM, +#if defined(wxOSX_USE_COCOA) && wxOSX_USE_COCOA + wxTBI_DEFAULT_TYPE = wxTBI_CUSTOM_STATUSITEM +#else + wxTBI_DEFAULT_TYPE = wxTBI_DOCK +#endif +}; + + +// ---------------------------------------------------------------------------- +// wxTaskBarIconBase: define wxTaskBarIcon interface +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxTaskBarIconBase : public wxEvtHandler +{ +public: + wxTaskBarIconBase() { } + +#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) + static bool IsAvailable(); +#else + static bool IsAvailable() { return true; } +#endif + + // Operations: + virtual bool SetIcon(const wxIcon& icon, + const wxString& tooltip = wxEmptyString) = 0; + virtual bool RemoveIcon() = 0; + virtual bool PopupMenu(wxMenu *menu) = 0; + + // delayed destruction (similarly to wxWindow::Destroy()) + void Destroy(); + +protected: + // creates menu to be displayed when user clicks on the icon + virtual wxMenu *CreatePopupMenu() { return NULL; } + +private: + // default events handling, calls CreatePopupMenu: + void OnRightButtonDown(wxTaskBarIconEvent& event); + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxTaskBarIconBase); +}; + + +// ---------------------------------------------------------------------------- +// now include the actual class declaration +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/taskbar.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/taskbar.h" +#elif defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) + #include "wx/unix/taskbarx11.h" +#elif defined (__WXMAC__) + #include "wx/osx/taskbarosx.h" +#elif defined (__WXCOCOA__) + #include "wx/cocoa/taskbar.h" +#endif + +// ---------------------------------------------------------------------------- +// wxTaskBarIcon events +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxTaskBarIconEvent : public wxEvent +{ +public: + wxTaskBarIconEvent(wxEventType evtType, wxTaskBarIcon *tbIcon) + : wxEvent(wxID_ANY, evtType) + { + SetEventObject(tbIcon); + } + + virtual wxEvent *Clone() const { return new wxTaskBarIconEvent(*this); } + +private: + wxDECLARE_NO_ASSIGN_CLASS(wxTaskBarIconEvent); +}; + +typedef void (wxEvtHandler::*wxTaskBarIconEventFunction)(wxTaskBarIconEvent&); + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_TASKBAR_MOVE, wxTaskBarIconEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_TASKBAR_LEFT_DOWN, wxTaskBarIconEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_TASKBAR_LEFT_UP, wxTaskBarIconEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_TASKBAR_RIGHT_DOWN, wxTaskBarIconEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_TASKBAR_RIGHT_UP, wxTaskBarIconEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_TASKBAR_LEFT_DCLICK, wxTaskBarIconEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_TASKBAR_RIGHT_DCLICK, wxTaskBarIconEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_TASKBAR_BALLOON_TIMEOUT, wxTaskBarIconEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_TASKBAR_BALLOON_CLICK, wxTaskBarIconEvent ); + +#define wxTaskBarIconEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxTaskBarIconEventFunction, func) + +#define wx__DECLARE_TASKBAREVT(evt, fn) \ + wx__DECLARE_EVT0(wxEVT_TASKBAR_ ## evt, wxTaskBarIconEventHandler(fn)) + +#define EVT_TASKBAR_MOVE(fn) wx__DECLARE_TASKBAREVT(MOVE, fn) +#define EVT_TASKBAR_LEFT_DOWN(fn) wx__DECLARE_TASKBAREVT(LEFT_DOWN, fn) +#define EVT_TASKBAR_LEFT_UP(fn) wx__DECLARE_TASKBAREVT(LEFT_UP, fn) +#define EVT_TASKBAR_RIGHT_DOWN(fn) wx__DECLARE_TASKBAREVT(RIGHT_DOWN, fn) +#define EVT_TASKBAR_RIGHT_UP(fn) wx__DECLARE_TASKBAREVT(RIGHT_UP, fn) +#define EVT_TASKBAR_LEFT_DCLICK(fn) wx__DECLARE_TASKBAREVT(LEFT_DCLICK, fn) +#define EVT_TASKBAR_RIGHT_DCLICK(fn) wx__DECLARE_TASKBAREVT(RIGHT_DCLICK, fn) + +// taskbar menu is shown on right button press under all platforms except MSW +// where it's shown on right button release, using this event type and macro +// allows to write code which works correctly on all platforms +#ifdef __WXMSW__ + #define wxEVT_TASKBAR_CLICK wxEVT_TASKBAR_RIGHT_UP +#else + #define wxEVT_TASKBAR_CLICK wxEVT_TASKBAR_RIGHT_DOWN +#endif +#define EVT_TASKBAR_CLICK(fn) wx__DECLARE_TASKBAREVT(CLICK, fn) + +// these events are currently generated only under wxMSW and only after (MSW- +// specific) ShowBalloon() had been called, don't use them in portable code +#define EVT_TASKBAR_BALLOON_TIMEOUT(fn) \ + wx__DECLARE_TASKBAREVT(BALLOON_TIMEOUT, fn) +#define EVT_TASKBAR_BALLOON_CLICK(fn) \ + wx__DECLARE_TASKBAREVT(BALLOON_CLICK, fn) + +#endif // wxUSE_TASKBARICON + +#endif // _WX_TASKBAR_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/tbarbase.h b/wxmsw/include/wx-3.0/wx/tbarbase.h new file mode 100644 index 00000000..c9ff7f43 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/tbarbase.h @@ -0,0 +1,715 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/tbarbase.h +// Purpose: Base class for toolbar classes +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TBARBASE_H_ +#define _WX_TBARBASE_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_TOOLBAR + +#include "wx/bitmap.h" +#include "wx/list.h" +#include "wx/control.h" + +class WXDLLIMPEXP_FWD_CORE wxToolBarBase; +class WXDLLIMPEXP_FWD_CORE wxToolBarToolBase; +class WXDLLIMPEXP_FWD_CORE wxImage; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +extern WXDLLIMPEXP_DATA_CORE(const char) wxToolBarNameStr[]; +extern WXDLLIMPEXP_DATA_CORE(const wxSize) wxDefaultSize; +extern WXDLLIMPEXP_DATA_CORE(const wxPoint) wxDefaultPosition; + +enum wxToolBarToolStyle +{ + wxTOOL_STYLE_BUTTON = 1, + wxTOOL_STYLE_SEPARATOR = 2, + wxTOOL_STYLE_CONTROL +}; + +// ---------------------------------------------------------------------------- +// wxToolBarTool is a toolbar element. +// +// It has a unique id (except for the separators which always have id wxID_ANY), the +// style (telling whether it is a normal button, separator or a control), the +// state (toggled or not, enabled or not) and short and long help strings. The +// default implementations use the short help string for the tooltip text which +// is popped up when the mouse pointer enters the tool and the long help string +// for the applications status bar. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxToolBarToolBase : public wxObject +{ +public: + // ctors & dtor + // ------------ + + // generic ctor for any kind of tool + wxToolBarToolBase(wxToolBarBase *tbar = NULL, + int toolid = wxID_SEPARATOR, + const wxString& label = wxEmptyString, + const wxBitmap& bmpNormal = wxNullBitmap, + const wxBitmap& bmpDisabled = wxNullBitmap, + wxItemKind kind = wxITEM_NORMAL, + wxObject *clientData = NULL, + const wxString& shortHelpString = wxEmptyString, + const wxString& longHelpString = wxEmptyString) + : m_label(label), + m_shortHelpString(shortHelpString), + m_longHelpString(longHelpString) + { + Init + ( + tbar, + toolid == wxID_SEPARATOR ? wxTOOL_STYLE_SEPARATOR + : wxTOOL_STYLE_BUTTON, + toolid == wxID_ANY ? wxWindow::NewControlId() + : toolid, + kind + ); + + m_clientData = clientData; + + m_bmpNormal = bmpNormal; + m_bmpDisabled = bmpDisabled; + } + + // ctor for controls only + wxToolBarToolBase(wxToolBarBase *tbar, + wxControl *control, + const wxString& label) + : m_label(label) + { + Init(tbar, wxTOOL_STYLE_CONTROL, control->GetId(), wxITEM_MAX); + + m_control = control; + } + + virtual ~wxToolBarToolBase(); + + // accessors + // --------- + + // general + int GetId() const { return m_id; } + + wxControl *GetControl() const + { + wxASSERT_MSG( IsControl(), wxT("this toolbar tool is not a control") ); + + return m_control; + } + + wxToolBarBase *GetToolBar() const { return m_tbar; } + + // style/kind + bool IsStretchable() const { return m_stretchable; } + bool IsButton() const { return m_toolStyle == wxTOOL_STYLE_BUTTON; } + bool IsControl() const { return m_toolStyle == wxTOOL_STYLE_CONTROL; } + bool IsSeparator() const { return m_toolStyle == wxTOOL_STYLE_SEPARATOR; } + bool IsStretchableSpace() const { return IsSeparator() && IsStretchable(); } + int GetStyle() const { return m_toolStyle; } + wxItemKind GetKind() const + { + wxASSERT_MSG( IsButton(), wxT("only makes sense for buttons") ); + + return m_kind; + } + + void MakeStretchable() + { + wxASSERT_MSG( IsSeparator(), "only separators can be stretchable" ); + + m_stretchable = true; + } + + // state + bool IsEnabled() const { return m_enabled; } + bool IsToggled() const { return m_toggled; } + bool CanBeToggled() const + { return m_kind == wxITEM_CHECK || m_kind == wxITEM_RADIO; } + + // attributes + const wxBitmap& GetNormalBitmap() const { return m_bmpNormal; } + const wxBitmap& GetDisabledBitmap() const { return m_bmpDisabled; } + + const wxBitmap& GetBitmap() const + { return IsEnabled() ? GetNormalBitmap() : GetDisabledBitmap(); } + + const wxString& GetLabel() const { return m_label; } + + const wxString& GetShortHelp() const { return m_shortHelpString; } + const wxString& GetLongHelp() const { return m_longHelpString; } + + wxObject *GetClientData() const + { + if ( m_toolStyle == wxTOOL_STYLE_CONTROL ) + { + return (wxObject*)m_control->GetClientData(); + } + else + { + return m_clientData; + } + } + + // modifiers: return true if the state really changed + virtual bool Enable(bool enable); + virtual bool Toggle(bool toggle); + virtual bool SetToggle(bool toggle); + virtual bool SetShortHelp(const wxString& help); + virtual bool SetLongHelp(const wxString& help); + + void Toggle() { Toggle(!IsToggled()); } + + virtual void SetNormalBitmap(const wxBitmap& bmp) { m_bmpNormal = bmp; } + virtual void SetDisabledBitmap(const wxBitmap& bmp) { m_bmpDisabled = bmp; } + + virtual void SetLabel(const wxString& label) { m_label = label; } + + void SetClientData(wxObject *clientData) + { + if ( m_toolStyle == wxTOOL_STYLE_CONTROL ) + { + m_control->SetClientData(clientData); + } + else + { + m_clientData = clientData; + } + } + + // add tool to/remove it from a toolbar + virtual void Detach() { m_tbar = NULL; } + virtual void Attach(wxToolBarBase *tbar) { m_tbar = tbar; } + +#if wxUSE_MENUS + // these methods are only for tools of wxITEM_DROPDOWN kind (but even such + // tools can have a NULL associated menu) + virtual void SetDropdownMenu(wxMenu *menu); + wxMenu *GetDropdownMenu() const { return m_dropdownMenu; } +#endif + +protected: + // common part of all ctors + void Init(wxToolBarBase *tbar, + wxToolBarToolStyle style, + int toolid, + wxItemKind kind) + { + m_tbar = tbar; + m_toolStyle = style; + m_id = toolid; + m_kind = kind; + + m_clientData = NULL; + + m_stretchable = false; + m_toggled = false; + m_enabled = true; + +#if wxUSE_MENUS + m_dropdownMenu = NULL; +#endif + + } + + wxToolBarBase *m_tbar; // the toolbar to which we belong (may be NULL) + + // tool parameters + wxToolBarToolStyle m_toolStyle; + wxWindowIDRef m_id; // the tool id, wxID_SEPARATOR for separator + wxItemKind m_kind; // for normal buttons may be wxITEM_NORMAL/CHECK/RADIO + + // as controls have their own client data, no need to waste memory + union + { + wxObject *m_clientData; + wxControl *m_control; + }; + + // true if this tool is stretchable: currently is only value for separators + bool m_stretchable; + + // tool state + bool m_toggled; + bool m_enabled; + + // normal and disabled bitmaps for the tool, both can be invalid + wxBitmap m_bmpNormal; + wxBitmap m_bmpDisabled; + + // the button label + wxString m_label; + + // short and long help strings + wxString m_shortHelpString; + wxString m_longHelpString; + +#if wxUSE_MENUS + wxMenu *m_dropdownMenu; +#endif + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxToolBarToolBase) +}; + +// a list of toolbar tools +WX_DECLARE_EXPORTED_LIST(wxToolBarToolBase, wxToolBarToolsList); + +// ---------------------------------------------------------------------------- +// the base class for all toolbars +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxToolBarBase : public wxControl +{ +public: + wxToolBarBase(); + virtual ~wxToolBarBase(); + + // toolbar construction + // -------------------- + + // the full AddTool() function + // + // If bmpDisabled is wxNullBitmap, a shadowed version of the normal bitmap + // is created and used as the disabled image. + wxToolBarToolBase *AddTool(int toolid, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled, + wxItemKind kind = wxITEM_NORMAL, + const wxString& shortHelp = wxEmptyString, + const wxString& longHelp = wxEmptyString, + wxObject *data = NULL) + { + return DoAddTool(toolid, label, bitmap, bmpDisabled, kind, + shortHelp, longHelp, data); + } + + // the most common AddTool() version + wxToolBarToolBase *AddTool(int toolid, + const wxString& label, + const wxBitmap& bitmap, + const wxString& shortHelp = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL) + { + return AddTool(toolid, label, bitmap, wxNullBitmap, kind, shortHelp); + } + + // add a check tool, i.e. a tool which can be toggled + wxToolBarToolBase *AddCheckTool(int toolid, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled = wxNullBitmap, + const wxString& shortHelp = wxEmptyString, + const wxString& longHelp = wxEmptyString, + wxObject *data = NULL) + { + return AddTool(toolid, label, bitmap, bmpDisabled, wxITEM_CHECK, + shortHelp, longHelp, data); + } + + // add a radio tool, i.e. a tool which can be toggled and releases any + // other toggled radio tools in the same group when it happens + wxToolBarToolBase *AddRadioTool(int toolid, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled = wxNullBitmap, + const wxString& shortHelp = wxEmptyString, + const wxString& longHelp = wxEmptyString, + wxObject *data = NULL) + { + return AddTool(toolid, label, bitmap, bmpDisabled, wxITEM_RADIO, + shortHelp, longHelp, data); + } + + + // insert the new tool at the given position, if pos == GetToolsCount(), it + // is equivalent to AddTool() + virtual wxToolBarToolBase *InsertTool + ( + size_t pos, + int toolid, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled = wxNullBitmap, + wxItemKind kind = wxITEM_NORMAL, + const wxString& shortHelp = wxEmptyString, + const wxString& longHelp = wxEmptyString, + wxObject *clientData = NULL + ); + + virtual wxToolBarToolBase *AddTool (wxToolBarToolBase *tool); + virtual wxToolBarToolBase *InsertTool (size_t pos, wxToolBarToolBase *tool); + + // add an arbitrary control to the toolbar (notice that the control will be + // deleted by the toolbar and that it will also adjust its position/size) + // + // the label is optional and, if specified, will be shown near the control + // NB: the control should have toolbar as its parent + virtual wxToolBarToolBase * + AddControl(wxControl *control, const wxString& label = wxEmptyString); + + virtual wxToolBarToolBase * + InsertControl(size_t pos, wxControl *control, + const wxString& label = wxEmptyString); + + // get the control with the given id or return NULL + virtual wxControl *FindControl( int toolid ); + + // add a separator to the toolbar + virtual wxToolBarToolBase *AddSeparator(); + virtual wxToolBarToolBase *InsertSeparator(size_t pos); + + // add a stretchable space to the toolbar: this is similar to a separator + // except that it's always blank and that all the extra space the toolbar + // has is [equally] distributed among the stretchable spaces in it + virtual wxToolBarToolBase *AddStretchableSpace(); + virtual wxToolBarToolBase *InsertStretchableSpace(size_t pos); + + // remove the tool from the toolbar: the caller is responsible for actually + // deleting the pointer + virtual wxToolBarToolBase *RemoveTool(int toolid); + + // delete tool either by index or by position + virtual bool DeleteToolByPos(size_t pos); + virtual bool DeleteTool(int toolid); + + // delete all tools + virtual void ClearTools(); + + // must be called after all buttons have been created to finish toolbar + // initialisation + // + // derived class versions should call the base one first, before doing + // platform-specific stuff + virtual bool Realize(); + + // tools state + // ----------- + + virtual void EnableTool(int toolid, bool enable); + virtual void ToggleTool(int toolid, bool toggle); + + // Set this to be togglable (or not) + virtual void SetToggle(int toolid, bool toggle); + + // set/get tools client data (not for controls) + virtual wxObject *GetToolClientData(int toolid) const; + virtual void SetToolClientData(int toolid, wxObject *clientData); + + // returns tool pos, or wxNOT_FOUND if tool isn't found + virtual int GetToolPos(int id) const; + + // return true if the tool is toggled + virtual bool GetToolState(int toolid) const; + + virtual bool GetToolEnabled(int toolid) const; + + virtual void SetToolShortHelp(int toolid, const wxString& helpString); + virtual wxString GetToolShortHelp(int toolid) const; + virtual void SetToolLongHelp(int toolid, const wxString& helpString); + virtual wxString GetToolLongHelp(int toolid) const; + + virtual void SetToolNormalBitmap(int WXUNUSED(id), + const wxBitmap& WXUNUSED(bitmap)) {} + virtual void SetToolDisabledBitmap(int WXUNUSED(id), + const wxBitmap& WXUNUSED(bitmap)) {} + + + // margins/packing/separation + // -------------------------- + + virtual void SetMargins(int x, int y); + void SetMargins(const wxSize& size) + { SetMargins((int) size.x, (int) size.y); } + virtual void SetToolPacking(int packing) + { m_toolPacking = packing; } + virtual void SetToolSeparation(int separation) + { m_toolSeparation = separation; } + + virtual wxSize GetToolMargins() const { return wxSize(m_xMargin, m_yMargin); } + virtual int GetToolPacking() const { return m_toolPacking; } + virtual int GetToolSeparation() const { return m_toolSeparation; } + + // toolbar geometry + // ---------------- + + // set the number of toolbar rows + virtual void SetRows(int nRows); + + // the toolbar can wrap - limit the number of columns or rows it may take + void SetMaxRowsCols(int rows, int cols) + { m_maxRows = rows; m_maxCols = cols; } + int GetMaxRows() const { return m_maxRows; } + int GetMaxCols() const { return m_maxCols; } + + // get/set the size of the bitmaps used by the toolbar: should be called + // before adding any tools to the toolbar + virtual void SetToolBitmapSize(const wxSize& size) + { m_defaultWidth = size.x; m_defaultHeight = size.y; } + virtual wxSize GetToolBitmapSize() const + { return wxSize(m_defaultWidth, m_defaultHeight); } + + // the button size in some implementations is bigger than the bitmap size: + // get the total button size (by default the same as bitmap size) + virtual wxSize GetToolSize() const + { return GetToolBitmapSize(); } + + // returns a (non separator) tool containing the point (x, y) or NULL if + // there is no tool at this point (coordinates are client) + virtual wxToolBarToolBase *FindToolForPosition(wxCoord x, + wxCoord y) const = 0; + + // find the tool by id + wxToolBarToolBase *FindById(int toolid) const; + + // return true if this is a vertical toolbar, otherwise false + bool IsVertical() const; + + // these methods allow to access tools by their index in the toolbar + size_t GetToolsCount() const { return m_tools.GetCount(); } + const wxToolBarToolBase *GetToolByPos(int pos) const { return m_tools[pos]; } + +#if WXWIN_COMPATIBILITY_2_8 + // the old versions of the various methods kept for compatibility + // don't use in the new code! + // -------------------------------------------------------------- + wxDEPRECATED_INLINE( + wxToolBarToolBase *AddTool(int toolid, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled, + bool toggle = false, + wxObject *clientData = NULL, + const wxString& shortHelpString = wxEmptyString, + const wxString& longHelpString = wxEmptyString) + , + return AddTool(toolid, wxEmptyString, + bitmap, bmpDisabled, + toggle ? wxITEM_CHECK : wxITEM_NORMAL, + shortHelpString, longHelpString, clientData); + ) + wxDEPRECATED_INLINE( + wxToolBarToolBase *AddTool(int toolid, + const wxBitmap& bitmap, + const wxString& shortHelpString = wxEmptyString, + const wxString& longHelpString = wxEmptyString) + , + return AddTool(toolid, wxEmptyString, + bitmap, wxNullBitmap, wxITEM_NORMAL, + shortHelpString, longHelpString, NULL); + ) + wxDEPRECATED_INLINE( + wxToolBarToolBase *AddTool(int toolid, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled, + bool toggle, + wxCoord xPos, + wxCoord yPos = wxDefaultCoord, + wxObject *clientData = NULL, + const wxString& shortHelp = wxEmptyString, + const wxString& longHelp = wxEmptyString) + , + return DoAddTool(toolid, wxEmptyString, bitmap, bmpDisabled, + toggle ? wxITEM_CHECK : wxITEM_NORMAL, + shortHelp, longHelp, clientData, xPos, yPos); + ) + wxDEPRECATED_INLINE( + wxToolBarToolBase *InsertTool(size_t pos, + int toolid, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled = wxNullBitmap, + bool toggle = false, + wxObject *clientData = NULL, + const wxString& shortHelp = wxEmptyString, + const wxString& longHelp = wxEmptyString) + , + return InsertTool(pos, toolid, wxEmptyString, bitmap, bmpDisabled, + toggle ? wxITEM_CHECK : wxITEM_NORMAL, + shortHelp, longHelp, clientData); + ) +#endif // WXWIN_COMPATIBILITY_2_8 + + // event handlers + // -------------- + + // NB: these functions are deprecated, use EVT_TOOL_XXX() instead! + + // Only allow toggle if returns true. Call when left button up. + virtual bool OnLeftClick(int toolid, bool toggleDown); + + // Call when right button down. + virtual void OnRightClick(int toolid, long x, long y); + + // Called when the mouse cursor enters a tool bitmap. + // Argument is wxID_ANY if mouse is exiting the toolbar. + virtual void OnMouseEnter(int toolid); + + // more deprecated functions + // ------------------------- + + // use GetToolMargins() instead + wxSize GetMargins() const { return GetToolMargins(); } + + // Tool factories, + // helper functions to create toolbar tools + // ------------------------- + virtual wxToolBarToolBase *CreateTool(int toolid, + const wxString& label, + const wxBitmap& bmpNormal, + const wxBitmap& bmpDisabled = wxNullBitmap, + wxItemKind kind = wxITEM_NORMAL, + wxObject *clientData = NULL, + const wxString& shortHelp = wxEmptyString, + const wxString& longHelp = wxEmptyString) = 0; + + virtual wxToolBarToolBase *CreateTool(wxControl *control, + const wxString& label) = 0; + + // this one is not virtual but just a simple helper/wrapper around + // CreateTool() for separators + wxToolBarToolBase *CreateSeparator() + { + return CreateTool(wxID_SEPARATOR, + wxEmptyString, + wxNullBitmap, wxNullBitmap, + wxITEM_SEPARATOR, NULL, + wxEmptyString, wxEmptyString); + } + + + // implementation only from now on + // ------------------------------- + + // Do the toolbar button updates (check for EVT_UPDATE_UI handlers) + virtual void UpdateWindowUI(long flags = wxUPDATE_UI_NONE) ; + + // don't want toolbars to accept the focus + virtual bool AcceptsFocus() const { return false; } + +#if wxUSE_MENUS + // Set dropdown menu + bool SetDropdownMenu(int toolid, wxMenu *menu); +#endif + +protected: + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + // to implement in derived classes + // ------------------------------- + + // create a new toolbar tool and add it to the toolbar, this is typically + // implemented by just calling InsertTool() + virtual wxToolBarToolBase *DoAddTool + ( + int toolid, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled, + wxItemKind kind, + const wxString& shortHelp = wxEmptyString, + const wxString& longHelp = wxEmptyString, + wxObject *clientData = NULL, + wxCoord xPos = wxDefaultCoord, + wxCoord yPos = wxDefaultCoord + ); + + // the tool is not yet inserted into m_tools list when this function is + // called and will only be added to it if this function succeeds + virtual bool DoInsertTool(size_t pos, wxToolBarToolBase *tool) = 0; + + // the tool is still in m_tools list when this function is called, it will + // only be deleted from it if it succeeds + virtual bool DoDeleteTool(size_t pos, wxToolBarToolBase *tool) = 0; + + // called when the tools enabled flag changes + virtual void DoEnableTool(wxToolBarToolBase *tool, bool enable) = 0; + + // called when the tool is toggled + virtual void DoToggleTool(wxToolBarToolBase *tool, bool toggle) = 0; + + // called when the tools "can be toggled" flag changes + virtual void DoSetToggle(wxToolBarToolBase *tool, bool toggle) = 0; + + + // helper functions + // ---------------- + + // call this from derived class ctor/Create() to ensure that we have either + // wxTB_HORIZONTAL or wxTB_VERTICAL style, there is a lot of existing code + // which randomly checks either one or the other of them and gets confused + // if neither is set (and making one of them 0 is not an option neither as + // then the existing tests would break down) + void FixupStyle(); + + // un-toggle all buttons in the same radio group + void UnToggleRadioGroup(wxToolBarToolBase *tool); + + // make the size of the buttons big enough to fit the largest bitmap size + void AdjustToolBitmapSize(); + + // calls InsertTool() and deletes the tool if inserting it failed + wxToolBarToolBase *DoInsertNewTool(size_t pos, wxToolBarToolBase *tool) + { + if ( !InsertTool(pos, tool) ) + { + delete tool; + return NULL; + } + + return tool; + } + + // the list of all our tools + wxToolBarToolsList m_tools; + + // the offset of the first tool + int m_xMargin; + int m_yMargin; + + // the maximum number of toolbar rows/columns + int m_maxRows; + int m_maxCols; + + // the tool packing and separation + int m_toolPacking, + m_toolSeparation; + + // the size of the toolbar bitmaps + wxCoord m_defaultWidth, m_defaultHeight; + +private: + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxToolBarBase); +}; + +// deprecated function for creating the image for disabled buttons, use +// wxImage::ConvertToGreyscale() instead +#if WXWIN_COMPATIBILITY_2_8 + +wxDEPRECATED( bool wxCreateGreyedImage(const wxImage& in, wxImage& out) ); + +#endif // WXWIN_COMPATIBILITY_2_8 + + +#endif // wxUSE_TOOLBAR + +#endif + // _WX_TBARBASE_H_ + diff --git a/wxmsw/include/wx-3.0/wx/textbuf.h b/wxmsw/include/wx-3.0/wx/textbuf.h new file mode 100644 index 00000000..a2511b42 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/textbuf.h @@ -0,0 +1,210 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/textbuf.h +// Purpose: class wxTextBuffer to work with text buffers of _small_ size +// (buffer is fully loaded in memory) and which understands CR/LF +// differences between platforms. +// Created: 14.11.01 +// Author: Morten Hanssen, Vadim Zeitlin +// Copyright: (c) 1998-2001 Morten Hanssen, Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TEXTBUFFER_H +#define _WX_TEXTBUFFER_H + +#include "wx/defs.h" +#include "wx/arrstr.h" +#include "wx/convauto.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// the line termination type (kept wxTextFileType name for compatibility) +enum wxTextFileType +{ + wxTextFileType_None, // incomplete (the last line of the file only) + wxTextFileType_Unix, // line is terminated with 'LF' = 0xA = 10 = '\n' + wxTextFileType_Dos, // 'CR' 'LF' + wxTextFileType_Mac, // 'CR' = 0xD = 13 = '\r' + wxTextFileType_Os2 // 'CR' 'LF' +}; + +#include "wx/string.h" + +#if wxUSE_TEXTBUFFER + +#include "wx/dynarray.h" + +// ---------------------------------------------------------------------------- +// wxTextBuffer +// ---------------------------------------------------------------------------- + +WX_DEFINE_USER_EXPORTED_ARRAY_INT(wxTextFileType, + wxArrayLinesType, + class WXDLLIMPEXP_BASE); + +#endif // wxUSE_TEXTBUFFER + +class WXDLLIMPEXP_BASE wxTextBuffer +{ +public: + // constants and static functions + // default type for current platform (determined at compile time) + static const wxTextFileType typeDefault; + + // this function returns a string which is identical to "text" passed in + // except that the line terminator characters are changed to correspond the + // given type. Called with the default argument, the function translates + // the string to the native format (Unix for Unix, DOS for Windows, ...). + static wxString Translate(const wxString& text, + wxTextFileType type = typeDefault); + + // get the buffer termination string + static const wxChar *GetEOL(wxTextFileType type = typeDefault); + + // the static methods of this class are compiled in even when + // !wxUSE_TEXTBUFFER because they are used by the library itself, but the + // rest can be left out +#if wxUSE_TEXTBUFFER + + // buffer operations + // ----------------- + + // buffer exists? + bool Exists() const; + + // create the buffer if it doesn't already exist + bool Create(); + + // same as Create() but with (another) buffer name + bool Create(const wxString& strBufferName); + + // Open() also loads buffer in memory on success + bool Open(const wxMBConv& conv = wxConvAuto()); + + // same as Open() but with (another) buffer name + bool Open(const wxString& strBufferName, const wxMBConv& conv = wxConvAuto()); + + // closes the buffer and frees memory, losing all changes + bool Close(); + + // is buffer currently opened? + bool IsOpened() const { return m_isOpened; } + + // accessors + // --------- + + // get the number of lines in the buffer + size_t GetLineCount() const { return m_aLines.size(); } + + // the returned line may be modified (but don't add CR/LF at the end!) + wxString& GetLine(size_t n) { return m_aLines[n]; } + const wxString& GetLine(size_t n) const { return m_aLines[n]; } + wxString& operator[](size_t n) { return m_aLines[n]; } + const wxString& operator[](size_t n) const { return m_aLines[n]; } + + // the current line has meaning only when you're using + // GetFirstLine()/GetNextLine() functions, it doesn't get updated when + // you're using "direct access" i.e. GetLine() + size_t GetCurrentLine() const { return m_nCurLine; } + void GoToLine(size_t n) { m_nCurLine = n; } + bool Eof() const { return m_nCurLine == m_aLines.size(); } + + // these methods allow more "iterator-like" traversal of the list of + // lines, i.e. you may write something like: + // for ( str = GetFirstLine(); !Eof(); str = GetNextLine() ) { ... } + + // NB: const is commented out because not all compilers understand + // 'mutable' keyword yet (m_nCurLine should be mutable) + wxString& GetFirstLine() /* const */ + { return m_aLines.empty() ? ms_eof : m_aLines[m_nCurLine = 0]; } + wxString& GetNextLine() /* const */ + { return ++m_nCurLine == m_aLines.size() ? ms_eof + : m_aLines[m_nCurLine]; } + wxString& GetPrevLine() /* const */ + { wxASSERT(m_nCurLine > 0); return m_aLines[--m_nCurLine]; } + wxString& GetLastLine() /* const */ + { m_nCurLine = m_aLines.size() - 1; return m_aLines.Last(); } + + // get the type of the line (see also GetEOL) + wxTextFileType GetLineType(size_t n) const { return m_aTypes[n]; } + + // guess the type of buffer + wxTextFileType GuessType() const; + + // get the name of the buffer + const wxString& GetName() const { return m_strBufferName; } + + // add/remove lines + // ---------------- + + // add a line to the end + void AddLine(const wxString& str, wxTextFileType type = typeDefault) + { m_aLines.push_back(str); m_aTypes.push_back(type); } + // insert a line before the line number n + void InsertLine(const wxString& str, + size_t n, + wxTextFileType type = typeDefault) + { + m_aLines.insert(m_aLines.begin() + n, str); + m_aTypes.insert(m_aTypes.begin()+n, type); + } + + // delete one line + void RemoveLine(size_t n) + { + m_aLines.erase(m_aLines.begin() + n); + m_aTypes.erase(m_aTypes.begin() + n); + } + + // remove all lines + void Clear() { m_aLines.clear(); m_aTypes.clear(); m_nCurLine = 0; } + + // change the buffer (default argument means "don't change type") + // possibly in another format + bool Write(wxTextFileType typeNew = wxTextFileType_None, + const wxMBConv& conv = wxConvAuto()); + + // dtor + virtual ~wxTextBuffer(); + +protected: + // ctors + // ----- + + // default ctor, use Open(string) + wxTextBuffer() { m_nCurLine = 0; m_isOpened = false; } + + // ctor from filename + wxTextBuffer(const wxString& strBufferName); + + enum wxTextBufferOpenMode { ReadAccess, WriteAccess }; + + // Must implement these in derived classes. + virtual bool OnExists() const = 0; + virtual bool OnOpen(const wxString &strBufferName, + wxTextBufferOpenMode openmode) = 0; + virtual bool OnClose() = 0; + virtual bool OnRead(const wxMBConv& conv) = 0; + virtual bool OnWrite(wxTextFileType typeNew, const wxMBConv& conv) = 0; + + static wxString ms_eof; // dummy string returned at EOF + wxString m_strBufferName; // name of the buffer + +private: + wxArrayLinesType m_aTypes; // type of each line + wxArrayString m_aLines; // lines of file + + size_t m_nCurLine; // number of current line in the buffer + + bool m_isOpened; // was the buffer successfully opened the last time? +#endif // wxUSE_TEXTBUFFER + + // copy ctor/assignment operator not implemented + wxTextBuffer(const wxTextBuffer&); + wxTextBuffer& operator=(const wxTextBuffer&); +}; + +#endif // _WX_TEXTBUFFER_H + diff --git a/wxmsw/include/wx-3.0/wx/textcompleter.h b/wxmsw/include/wx-3.0/wx/textcompleter.h new file mode 100644 index 00000000..bc4135f8 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/textcompleter.h @@ -0,0 +1,86 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/textcompleter.h +// Purpose: Declaration of wxTextCompleter class. +// Author: Vadim Zeitlin +// Created: 2011-04-13 +// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TEXTCOMPLETER_H_ +#define _WX_TEXTCOMPLETER_H_ + +// ---------------------------------------------------------------------------- +// wxTextCompleter: used by wxTextEnter::AutoComplete() +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTextCompleter +{ +public: + wxTextCompleter() { } + + // The virtual functions to be implemented by the derived classes: the + // first one is called to start preparing for completions for the given + // prefix and, if it returns true, GetNext() is called until it returns an + // empty string indicating that there are no more completions. + virtual bool Start(const wxString& prefix) = 0; + virtual wxString GetNext() = 0; + + virtual ~wxTextCompleter(); + +private: + wxDECLARE_NO_COPY_CLASS(wxTextCompleter); +}; + +// ---------------------------------------------------------------------------- +// wxTextCompleterSimple: returns the entire set of completions at once +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTextCompleterSimple : public wxTextCompleter +{ +public: + wxTextCompleterSimple() { } + + // Must be implemented to return all the completions for the given prefix. + virtual void GetCompletions(const wxString& prefix, wxArrayString& res) = 0; + + virtual bool Start(const wxString& prefix); + virtual wxString GetNext(); + +private: + wxArrayString m_completions; + unsigned m_index; + + wxDECLARE_NO_COPY_CLASS(wxTextCompleterSimple); +}; + +// ---------------------------------------------------------------------------- +// wxTextCompleterFixed: Trivial wxTextCompleter implementation which always +// returns the same fixed array of completions. +// ---------------------------------------------------------------------------- + +// NB: This class is private and intentionally not documented as it is +// currently used only for implementation of completion with the fixed list +// of strings only by wxWidgets itself, do not use it outside of wxWidgets. + +class wxTextCompleterFixed : public wxTextCompleterSimple +{ +public: + void SetCompletions(const wxArrayString& strings) + { + m_strings = strings; + } + + virtual void GetCompletions(const wxString& WXUNUSED(prefix), + wxArrayString& res) + { + res = m_strings; + } + +private: + wxArrayString m_strings; +}; + + +#endif // _WX_TEXTCOMPLETER_H_ + diff --git a/wxmsw/include/wx-3.0/wx/textctrl.h b/wxmsw/include/wx-3.0/wx/textctrl.h new file mode 100644 index 00000000..83634e18 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/textctrl.h @@ -0,0 +1,920 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/textctrl.h +// Purpose: wxTextAttr and wxTextCtrlBase class - the interface of wxTextCtrl +// Author: Vadim Zeitlin +// Modified by: +// Created: 13.07.99 +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TEXTCTRL_H_BASE_ +#define _WX_TEXTCTRL_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_TEXTCTRL + +#include "wx/control.h" // the base class +#include "wx/textentry.h" // single-line text entry interface +#include "wx/dynarray.h" // wxArrayInt +#include "wx/gdicmn.h" // wxPoint + +// some compilers don't have standard compliant rdbuf() (and MSVC has it only +// in its new iostream library, not in the old one used with iostream.h) +#if defined(__WATCOMC__) || \ + ((defined(__VISUALC5__) || defined(__VISUALC6__)) && wxUSE_IOSTREAMH) + #define wxHAS_TEXT_WINDOW_STREAM 0 +#elif wxUSE_STD_IOSTREAM + #include "wx/ioswrap.h" + #define wxHAS_TEXT_WINDOW_STREAM 1 +#else + #define wxHAS_TEXT_WINDOW_STREAM 0 +#endif + +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxTextCtrlBase; + +// ---------------------------------------------------------------------------- +// wxTextCtrl types +// ---------------------------------------------------------------------------- + +// wxTextCoord is the line or row number (which should have been unsigned but +// is long for backwards compatibility) +typedef long wxTextCoord; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +extern WXDLLIMPEXP_DATA_CORE(const char) wxTextCtrlNameStr[]; + +// this is intentionally not enum to avoid warning fixes with +// typecasting from enum type to wxTextCoord +const wxTextCoord wxOutOfRangeTextCoord = -1; +const wxTextCoord wxInvalidTextCoord = -2; + +// ---------------------------------------------------------------------------- +// wxTextCtrl style flags +// ---------------------------------------------------------------------------- + +#define wxTE_NO_VSCROLL 0x0002 + +#define wxTE_READONLY 0x0010 +#define wxTE_MULTILINE 0x0020 +#define wxTE_PROCESS_TAB 0x0040 + +// alignment flags +#define wxTE_LEFT 0x0000 // 0x0000 +#define wxTE_CENTER wxALIGN_CENTER_HORIZONTAL // 0x0100 +#define wxTE_RIGHT wxALIGN_RIGHT // 0x0200 +#define wxTE_CENTRE wxTE_CENTER + +// this style means to use RICHEDIT control and does something only under wxMSW +// and Win32 and is silently ignored under all other platforms +#define wxTE_RICH 0x0080 + +#define wxTE_PROCESS_ENTER 0x0400 +#define wxTE_PASSWORD 0x0800 + +// automatically detect the URLs and generate the events when mouse is +// moved/clicked over an URL +// +// this is for Win32 richedit and wxGTK2 multiline controls only so far +#define wxTE_AUTO_URL 0x1000 + +// by default, the Windows text control doesn't show the selection when it +// doesn't have focus - use this style to force it to always show it +#define wxTE_NOHIDESEL 0x2000 + +// use wxHSCROLL to not wrap text at all, wxTE_CHARWRAP to wrap it at any +// position and wxTE_WORDWRAP to wrap at words boundary +// +// if no wrapping style is given at all, the control wraps at word boundary +#define wxTE_DONTWRAP wxHSCROLL +#define wxTE_CHARWRAP 0x4000 // wrap at any position +#define wxTE_WORDWRAP 0x0001 // wrap only at words boundaries +#define wxTE_BESTWRAP 0x0000 // this is the default + +#if WXWIN_COMPATIBILITY_2_6 + // obsolete synonym + #define wxTE_LINEWRAP wxTE_CHARWRAP +#endif // WXWIN_COMPATIBILITY_2_6 + +#if WXWIN_COMPATIBILITY_2_8 + // this style is (or at least should be) on by default now, don't use it + #define wxTE_AUTO_SCROLL 0 +#endif // WXWIN_COMPATIBILITY_2_8 + +// force using RichEdit version 2.0 or 3.0 instead of 1.0 (default) for +// wxTE_RICH controls - can be used together with or instead of wxTE_RICH +#define wxTE_RICH2 0x8000 + +// reuse wxTE_RICH2's value for CAPEDIT control on Windows CE +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) +#define wxTE_CAPITALIZE wxTE_RICH2 +#else +#define wxTE_CAPITALIZE 0 +#endif + +// ---------------------------------------------------------------------------- +// wxTextCtrl file types +// ---------------------------------------------------------------------------- + +#define wxTEXT_TYPE_ANY 0 + +// ---------------------------------------------------------------------------- +// wxTextCtrl::HitTest return values +// ---------------------------------------------------------------------------- + +// the point asked is ... +enum wxTextCtrlHitTestResult +{ + wxTE_HT_UNKNOWN = -2, // this means HitTest() is simply not implemented + wxTE_HT_BEFORE, // either to the left or upper + wxTE_HT_ON_TEXT, // directly on + wxTE_HT_BELOW, // below [the last line] + wxTE_HT_BEYOND // after [the end of line] +}; +// ... the character returned + +// ---------------------------------------------------------------------------- +// Types for wxTextAttr +// ---------------------------------------------------------------------------- + +// Alignment + +enum wxTextAttrAlignment +{ + wxTEXT_ALIGNMENT_DEFAULT, + wxTEXT_ALIGNMENT_LEFT, + wxTEXT_ALIGNMENT_CENTRE, + wxTEXT_ALIGNMENT_CENTER = wxTEXT_ALIGNMENT_CENTRE, + wxTEXT_ALIGNMENT_RIGHT, + wxTEXT_ALIGNMENT_JUSTIFIED +}; + +// Flags to indicate which attributes are being applied +enum wxTextAttrFlags +{ + wxTEXT_ATTR_TEXT_COLOUR = 0x00000001, + wxTEXT_ATTR_BACKGROUND_COLOUR = 0x00000002, + + wxTEXT_ATTR_FONT_FACE = 0x00000004, + wxTEXT_ATTR_FONT_POINT_SIZE = 0x00000008, + wxTEXT_ATTR_FONT_PIXEL_SIZE = 0x10000000, + wxTEXT_ATTR_FONT_WEIGHT = 0x00000010, + wxTEXT_ATTR_FONT_ITALIC = 0x00000020, + wxTEXT_ATTR_FONT_UNDERLINE = 0x00000040, + wxTEXT_ATTR_FONT_STRIKETHROUGH = 0x08000000, + wxTEXT_ATTR_FONT_ENCODING = 0x02000000, + wxTEXT_ATTR_FONT_FAMILY = 0x04000000, + wxTEXT_ATTR_FONT_SIZE = \ + ( wxTEXT_ATTR_FONT_POINT_SIZE | wxTEXT_ATTR_FONT_PIXEL_SIZE ), + wxTEXT_ATTR_FONT = \ + ( wxTEXT_ATTR_FONT_FACE | wxTEXT_ATTR_FONT_SIZE | wxTEXT_ATTR_FONT_WEIGHT | \ + wxTEXT_ATTR_FONT_ITALIC | wxTEXT_ATTR_FONT_UNDERLINE | wxTEXT_ATTR_FONT_STRIKETHROUGH | wxTEXT_ATTR_FONT_ENCODING | wxTEXT_ATTR_FONT_FAMILY ), + + wxTEXT_ATTR_ALIGNMENT = 0x00000080, + wxTEXT_ATTR_LEFT_INDENT = 0x00000100, + wxTEXT_ATTR_RIGHT_INDENT = 0x00000200, + wxTEXT_ATTR_TABS = 0x00000400, + wxTEXT_ATTR_PARA_SPACING_AFTER = 0x00000800, + wxTEXT_ATTR_PARA_SPACING_BEFORE = 0x00001000, + wxTEXT_ATTR_LINE_SPACING = 0x00002000, + wxTEXT_ATTR_CHARACTER_STYLE_NAME = 0x00004000, + wxTEXT_ATTR_PARAGRAPH_STYLE_NAME = 0x00008000, + wxTEXT_ATTR_LIST_STYLE_NAME = 0x00010000, + + wxTEXT_ATTR_BULLET_STYLE = 0x00020000, + wxTEXT_ATTR_BULLET_NUMBER = 0x00040000, + wxTEXT_ATTR_BULLET_TEXT = 0x00080000, + wxTEXT_ATTR_BULLET_NAME = 0x00100000, + + wxTEXT_ATTR_BULLET = \ + ( wxTEXT_ATTR_BULLET_STYLE | wxTEXT_ATTR_BULLET_NUMBER | wxTEXT_ATTR_BULLET_TEXT | \ + wxTEXT_ATTR_BULLET_NAME ), + + + wxTEXT_ATTR_URL = 0x00200000, + wxTEXT_ATTR_PAGE_BREAK = 0x00400000, + wxTEXT_ATTR_EFFECTS = 0x00800000, + wxTEXT_ATTR_OUTLINE_LEVEL = 0x01000000, + + /*! + * Character and paragraph combined styles + */ + + wxTEXT_ATTR_CHARACTER = \ + (wxTEXT_ATTR_FONT|wxTEXT_ATTR_EFFECTS| \ + wxTEXT_ATTR_BACKGROUND_COLOUR|wxTEXT_ATTR_TEXT_COLOUR|wxTEXT_ATTR_CHARACTER_STYLE_NAME|wxTEXT_ATTR_URL), + + wxTEXT_ATTR_PARAGRAPH = \ + (wxTEXT_ATTR_ALIGNMENT|wxTEXT_ATTR_LEFT_INDENT|wxTEXT_ATTR_RIGHT_INDENT|wxTEXT_ATTR_TABS|\ + wxTEXT_ATTR_PARA_SPACING_BEFORE|wxTEXT_ATTR_PARA_SPACING_AFTER|wxTEXT_ATTR_LINE_SPACING|\ + wxTEXT_ATTR_BULLET|wxTEXT_ATTR_PARAGRAPH_STYLE_NAME|wxTEXT_ATTR_LIST_STYLE_NAME|wxTEXT_ATTR_OUTLINE_LEVEL|wxTEXT_ATTR_PAGE_BREAK), + + wxTEXT_ATTR_ALL = (wxTEXT_ATTR_CHARACTER|wxTEXT_ATTR_PARAGRAPH) +}; + +/*! + * Styles for wxTextAttr::SetBulletStyle + */ +enum wxTextAttrBulletStyle +{ + wxTEXT_ATTR_BULLET_STYLE_NONE = 0x00000000, + wxTEXT_ATTR_BULLET_STYLE_ARABIC = 0x00000001, + wxTEXT_ATTR_BULLET_STYLE_LETTERS_UPPER = 0x00000002, + wxTEXT_ATTR_BULLET_STYLE_LETTERS_LOWER = 0x00000004, + wxTEXT_ATTR_BULLET_STYLE_ROMAN_UPPER = 0x00000008, + wxTEXT_ATTR_BULLET_STYLE_ROMAN_LOWER = 0x00000010, + wxTEXT_ATTR_BULLET_STYLE_SYMBOL = 0x00000020, + wxTEXT_ATTR_BULLET_STYLE_BITMAP = 0x00000040, + wxTEXT_ATTR_BULLET_STYLE_PARENTHESES = 0x00000080, + wxTEXT_ATTR_BULLET_STYLE_PERIOD = 0x00000100, + wxTEXT_ATTR_BULLET_STYLE_STANDARD = 0x00000200, + wxTEXT_ATTR_BULLET_STYLE_RIGHT_PARENTHESIS = 0x00000400, + wxTEXT_ATTR_BULLET_STYLE_OUTLINE = 0x00000800, + + wxTEXT_ATTR_BULLET_STYLE_ALIGN_LEFT = 0x00000000, + wxTEXT_ATTR_BULLET_STYLE_ALIGN_RIGHT = 0x00001000, + wxTEXT_ATTR_BULLET_STYLE_ALIGN_CENTRE = 0x00002000, + + wxTEXT_ATTR_BULLET_STYLE_CONTINUATION = 0x00004000 +}; + +/*! + * Styles for wxTextAttr::SetTextEffects + */ +enum wxTextAttrEffects +{ + wxTEXT_ATTR_EFFECT_NONE = 0x00000000, + wxTEXT_ATTR_EFFECT_CAPITALS = 0x00000001, + wxTEXT_ATTR_EFFECT_SMALL_CAPITALS = 0x00000002, + wxTEXT_ATTR_EFFECT_STRIKETHROUGH = 0x00000004, + wxTEXT_ATTR_EFFECT_DOUBLE_STRIKETHROUGH = 0x00000008, + wxTEXT_ATTR_EFFECT_SHADOW = 0x00000010, + wxTEXT_ATTR_EFFECT_EMBOSS = 0x00000020, + wxTEXT_ATTR_EFFECT_OUTLINE = 0x00000040, + wxTEXT_ATTR_EFFECT_ENGRAVE = 0x00000080, + wxTEXT_ATTR_EFFECT_SUPERSCRIPT = 0x00000100, + wxTEXT_ATTR_EFFECT_SUBSCRIPT = 0x00000200 +}; + +/*! + * Line spacing values + */ +enum wxTextAttrLineSpacing +{ + wxTEXT_ATTR_LINE_SPACING_NORMAL = 10, + wxTEXT_ATTR_LINE_SPACING_HALF = 15, + wxTEXT_ATTR_LINE_SPACING_TWICE = 20 +}; + +// ---------------------------------------------------------------------------- +// wxTextAttr: a structure containing the visual attributes of a text +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTextAttr +{ +public: + // ctors + wxTextAttr() { Init(); } + wxTextAttr(const wxTextAttr& attr) { Init(); Copy(attr); } + wxTextAttr(const wxColour& colText, + const wxColour& colBack = wxNullColour, + const wxFont& font = wxNullFont, + wxTextAttrAlignment alignment = wxTEXT_ALIGNMENT_DEFAULT); + + // Initialise this object. + void Init(); + + // Copy + void Copy(const wxTextAttr& attr); + + // Assignment + void operator= (const wxTextAttr& attr); + + // Equality test + bool operator== (const wxTextAttr& attr) const; + + // Partial equality test. If @a weakTest is @true, attributes of this object do not + // have to be present if those attributes of @a attr are present. If @a weakTest is + // @false, the function will fail if an attribute is present in @a attr but not + // in this object. + bool EqPartial(const wxTextAttr& attr, bool weakTest = true) const; + + // Get attributes from font. + bool GetFontAttributes(const wxFont& font, int flags = wxTEXT_ATTR_FONT); + + // setters + void SetTextColour(const wxColour& colText) { m_colText = colText; m_flags |= wxTEXT_ATTR_TEXT_COLOUR; } + void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; m_flags |= wxTEXT_ATTR_BACKGROUND_COLOUR; } + void SetAlignment(wxTextAttrAlignment alignment) { m_textAlignment = alignment; m_flags |= wxTEXT_ATTR_ALIGNMENT; } + void SetTabs(const wxArrayInt& tabs) { m_tabs = tabs; m_flags |= wxTEXT_ATTR_TABS; } + void SetLeftIndent(int indent, int subIndent = 0) { m_leftIndent = indent; m_leftSubIndent = subIndent; m_flags |= wxTEXT_ATTR_LEFT_INDENT; } + void SetRightIndent(int indent) { m_rightIndent = indent; m_flags |= wxTEXT_ATTR_RIGHT_INDENT; } + + void SetFontSize(int pointSize) { m_fontSize = pointSize; m_flags &= ~wxTEXT_ATTR_FONT_SIZE; m_flags |= wxTEXT_ATTR_FONT_POINT_SIZE; } + void SetFontPointSize(int pointSize) { m_fontSize = pointSize; m_flags &= ~wxTEXT_ATTR_FONT_SIZE; m_flags |= wxTEXT_ATTR_FONT_POINT_SIZE; } + void SetFontPixelSize(int pixelSize) { m_fontSize = pixelSize; m_flags &= ~wxTEXT_ATTR_FONT_SIZE; m_flags |= wxTEXT_ATTR_FONT_PIXEL_SIZE; } + void SetFontStyle(wxFontStyle fontStyle) { m_fontStyle = fontStyle; m_flags |= wxTEXT_ATTR_FONT_ITALIC; } + void SetFontWeight(wxFontWeight fontWeight) { m_fontWeight = fontWeight; m_flags |= wxTEXT_ATTR_FONT_WEIGHT; } + void SetFontFaceName(const wxString& faceName) { m_fontFaceName = faceName; m_flags |= wxTEXT_ATTR_FONT_FACE; } + void SetFontUnderlined(bool underlined) { m_fontUnderlined = underlined; m_flags |= wxTEXT_ATTR_FONT_UNDERLINE; } + void SetFontStrikethrough(bool strikethrough) { m_fontStrikethrough = strikethrough; m_flags |= wxTEXT_ATTR_FONT_STRIKETHROUGH; } + void SetFontEncoding(wxFontEncoding encoding) { m_fontEncoding = encoding; m_flags |= wxTEXT_ATTR_FONT_ENCODING; } + void SetFontFamily(wxFontFamily family) { m_fontFamily = family; m_flags |= wxTEXT_ATTR_FONT_FAMILY; } + + // Set font + void SetFont(const wxFont& font, int flags = (wxTEXT_ATTR_FONT & ~wxTEXT_ATTR_FONT_PIXEL_SIZE)) { GetFontAttributes(font, flags); } + + void SetFlags(long flags) { m_flags = flags; } + + void SetCharacterStyleName(const wxString& name) { m_characterStyleName = name; m_flags |= wxTEXT_ATTR_CHARACTER_STYLE_NAME; } + void SetParagraphStyleName(const wxString& name) { m_paragraphStyleName = name; m_flags |= wxTEXT_ATTR_PARAGRAPH_STYLE_NAME; } + void SetListStyleName(const wxString& name) { m_listStyleName = name; SetFlags(GetFlags() | wxTEXT_ATTR_LIST_STYLE_NAME); } + void SetParagraphSpacingAfter(int spacing) { m_paragraphSpacingAfter = spacing; m_flags |= wxTEXT_ATTR_PARA_SPACING_AFTER; } + void SetParagraphSpacingBefore(int spacing) { m_paragraphSpacingBefore = spacing; m_flags |= wxTEXT_ATTR_PARA_SPACING_BEFORE; } + void SetLineSpacing(int spacing) { m_lineSpacing = spacing; m_flags |= wxTEXT_ATTR_LINE_SPACING; } + void SetBulletStyle(int style) { m_bulletStyle = style; m_flags |= wxTEXT_ATTR_BULLET_STYLE; } + void SetBulletNumber(int n) { m_bulletNumber = n; m_flags |= wxTEXT_ATTR_BULLET_NUMBER; } + void SetBulletText(const wxString& text) { m_bulletText = text; m_flags |= wxTEXT_ATTR_BULLET_TEXT; } + void SetBulletFont(const wxString& bulletFont) { m_bulletFont = bulletFont; } + void SetBulletName(const wxString& name) { m_bulletName = name; m_flags |= wxTEXT_ATTR_BULLET_NAME; } + void SetURL(const wxString& url) { m_urlTarget = url; m_flags |= wxTEXT_ATTR_URL; } + void SetPageBreak(bool pageBreak = true) { SetFlags(pageBreak ? (GetFlags() | wxTEXT_ATTR_PAGE_BREAK) : (GetFlags() & ~wxTEXT_ATTR_PAGE_BREAK)); } + void SetTextEffects(int effects) { m_textEffects = effects; SetFlags(GetFlags() | wxTEXT_ATTR_EFFECTS); } + void SetTextEffectFlags(int effects) { m_textEffectFlags = effects; } + void SetOutlineLevel(int level) { m_outlineLevel = level; SetFlags(GetFlags() | wxTEXT_ATTR_OUTLINE_LEVEL); } + + const wxColour& GetTextColour() const { return m_colText; } + const wxColour& GetBackgroundColour() const { return m_colBack; } + wxTextAttrAlignment GetAlignment() const { return m_textAlignment; } + const wxArrayInt& GetTabs() const { return m_tabs; } + long GetLeftIndent() const { return m_leftIndent; } + long GetLeftSubIndent() const { return m_leftSubIndent; } + long GetRightIndent() const { return m_rightIndent; } + long GetFlags() const { return m_flags; } + + int GetFontSize() const { return m_fontSize; } + wxFontStyle GetFontStyle() const { return m_fontStyle; } + wxFontWeight GetFontWeight() const { return m_fontWeight; } + bool GetFontUnderlined() const { return m_fontUnderlined; } + bool GetFontStrikethrough() const { return m_fontStrikethrough; } + const wxString& GetFontFaceName() const { return m_fontFaceName; } + wxFontEncoding GetFontEncoding() const { return m_fontEncoding; } + wxFontFamily GetFontFamily() const { return m_fontFamily; } + + wxFont GetFont() const; + + const wxString& GetCharacterStyleName() const { return m_characterStyleName; } + const wxString& GetParagraphStyleName() const { return m_paragraphStyleName; } + const wxString& GetListStyleName() const { return m_listStyleName; } + int GetParagraphSpacingAfter() const { return m_paragraphSpacingAfter; } + int GetParagraphSpacingBefore() const { return m_paragraphSpacingBefore; } + + int GetLineSpacing() const { return m_lineSpacing; } + int GetBulletStyle() const { return m_bulletStyle; } + int GetBulletNumber() const { return m_bulletNumber; } + const wxString& GetBulletText() const { return m_bulletText; } + const wxString& GetBulletFont() const { return m_bulletFont; } + const wxString& GetBulletName() const { return m_bulletName; } + const wxString& GetURL() const { return m_urlTarget; } + int GetTextEffects() const { return m_textEffects; } + int GetTextEffectFlags() const { return m_textEffectFlags; } + int GetOutlineLevel() const { return m_outlineLevel; } + + // accessors + bool HasTextColour() const { return m_colText.IsOk() && HasFlag(wxTEXT_ATTR_TEXT_COLOUR) ; } + bool HasBackgroundColour() const { return m_colBack.IsOk() && HasFlag(wxTEXT_ATTR_BACKGROUND_COLOUR) ; } + bool HasAlignment() const { return (m_textAlignment != wxTEXT_ALIGNMENT_DEFAULT) && HasFlag(wxTEXT_ATTR_ALIGNMENT) ; } + bool HasTabs() const { return HasFlag(wxTEXT_ATTR_TABS) ; } + bool HasLeftIndent() const { return HasFlag(wxTEXT_ATTR_LEFT_INDENT); } + bool HasRightIndent() const { return HasFlag(wxTEXT_ATTR_RIGHT_INDENT); } + bool HasFontWeight() const { return HasFlag(wxTEXT_ATTR_FONT_WEIGHT); } + bool HasFontSize() const { return HasFlag(wxTEXT_ATTR_FONT_SIZE); } + bool HasFontPointSize() const { return HasFlag(wxTEXT_ATTR_FONT_POINT_SIZE); } + bool HasFontPixelSize() const { return HasFlag(wxTEXT_ATTR_FONT_PIXEL_SIZE); } + bool HasFontItalic() const { return HasFlag(wxTEXT_ATTR_FONT_ITALIC); } + bool HasFontUnderlined() const { return HasFlag(wxTEXT_ATTR_FONT_UNDERLINE); } + bool HasFontStrikethrough() const { return HasFlag(wxTEXT_ATTR_FONT_STRIKETHROUGH); } + bool HasFontFaceName() const { return HasFlag(wxTEXT_ATTR_FONT_FACE); } + bool HasFontEncoding() const { return HasFlag(wxTEXT_ATTR_FONT_ENCODING); } + bool HasFontFamily() const { return HasFlag(wxTEXT_ATTR_FONT_FAMILY); } + bool HasFont() const { return HasFlag(wxTEXT_ATTR_FONT); } + + bool HasParagraphSpacingAfter() const { return HasFlag(wxTEXT_ATTR_PARA_SPACING_AFTER); } + bool HasParagraphSpacingBefore() const { return HasFlag(wxTEXT_ATTR_PARA_SPACING_BEFORE); } + bool HasLineSpacing() const { return HasFlag(wxTEXT_ATTR_LINE_SPACING); } + bool HasCharacterStyleName() const { return HasFlag(wxTEXT_ATTR_CHARACTER_STYLE_NAME) && !m_characterStyleName.IsEmpty(); } + bool HasParagraphStyleName() const { return HasFlag(wxTEXT_ATTR_PARAGRAPH_STYLE_NAME) && !m_paragraphStyleName.IsEmpty(); } + bool HasListStyleName() const { return HasFlag(wxTEXT_ATTR_LIST_STYLE_NAME) || !m_listStyleName.IsEmpty(); } + bool HasBulletStyle() const { return HasFlag(wxTEXT_ATTR_BULLET_STYLE); } + bool HasBulletNumber() const { return HasFlag(wxTEXT_ATTR_BULLET_NUMBER); } + bool HasBulletText() const { return HasFlag(wxTEXT_ATTR_BULLET_TEXT); } + bool HasBulletName() const { return HasFlag(wxTEXT_ATTR_BULLET_NAME); } + bool HasURL() const { return HasFlag(wxTEXT_ATTR_URL); } + bool HasPageBreak() const { return HasFlag(wxTEXT_ATTR_PAGE_BREAK); } + bool HasTextEffects() const { return HasFlag(wxTEXT_ATTR_EFFECTS); } + bool HasTextEffect(int effect) const { return HasFlag(wxTEXT_ATTR_EFFECTS) && ((GetTextEffectFlags() & effect) != 0); } + bool HasOutlineLevel() const { return HasFlag(wxTEXT_ATTR_OUTLINE_LEVEL); } + + bool HasFlag(long flag) const { return (m_flags & flag) != 0; } + void RemoveFlag(long flag) { m_flags &= ~flag; } + void AddFlag(long flag) { m_flags |= flag; } + + // Is this a character style? + bool IsCharacterStyle() const { return HasFlag(wxTEXT_ATTR_CHARACTER); } + bool IsParagraphStyle() const { return HasFlag(wxTEXT_ATTR_PARAGRAPH); } + + // returns false if we have any attributes set, true otherwise + bool IsDefault() const + { + return GetFlags() == 0; + } + + // Merges the given attributes. If compareWith + // is non-NULL, then it will be used to mask out those attributes that are the same in style + // and compareWith, for situations where we don't want to explicitly set inherited attributes. + bool Apply(const wxTextAttr& style, const wxTextAttr* compareWith = NULL); + + // merges the attributes of the base and the overlay objects and returns + // the result; the parameter attributes take precedence + // + // WARNING: the order of arguments is the opposite of Combine() + static wxTextAttr Merge(const wxTextAttr& base, const wxTextAttr& overlay) + { + return Combine(overlay, base, NULL); + } + + // merges the attributes of this object and overlay + void Merge(const wxTextAttr& overlay) + { + *this = Merge(*this, overlay); + } + + // return the attribute having the valid font and colours: it uses the + // attributes set in attr and falls back first to attrDefault and then to + // the text control font/colours for those attributes which are not set + static wxTextAttr Combine(const wxTextAttr& attr, + const wxTextAttr& attrDef, + const wxTextCtrlBase *text); + + // Compare tabs + static bool TabsEq(const wxArrayInt& tabs1, const wxArrayInt& tabs2); + + // Remove attributes + static bool RemoveStyle(wxTextAttr& destStyle, const wxTextAttr& style); + + // Combine two bitlists, specifying the bits of interest with separate flags. + static bool CombineBitlists(int& valueA, int valueB, int& flagsA, int flagsB); + + // Compare two bitlists + static bool BitlistsEqPartial(int valueA, int valueB, int flags); + + // Split into paragraph and character styles + static bool SplitParaCharStyles(const wxTextAttr& style, wxTextAttr& parStyle, wxTextAttr& charStyle); + +private: + long m_flags; + + // Paragraph styles + wxArrayInt m_tabs; // array of int: tab stops in 1/10 mm + int m_leftIndent; // left indent in 1/10 mm + int m_leftSubIndent; // left indent for all but the first + // line in a paragraph relative to the + // first line, in 1/10 mm + int m_rightIndent; // right indent in 1/10 mm + wxTextAttrAlignment m_textAlignment; + + int m_paragraphSpacingAfter; + int m_paragraphSpacingBefore; + int m_lineSpacing; + int m_bulletStyle; + int m_bulletNumber; + int m_textEffects; + int m_textEffectFlags; + int m_outlineLevel; + wxString m_bulletText; + wxString m_bulletFont; + wxString m_bulletName; + wxString m_urlTarget; + wxFontEncoding m_fontEncoding; + + // Character styles + wxColour m_colText, + m_colBack; + int m_fontSize; + wxFontStyle m_fontStyle; + wxFontWeight m_fontWeight; + wxFontFamily m_fontFamily; + bool m_fontUnderlined; + bool m_fontStrikethrough; + wxString m_fontFaceName; + + // Character style + wxString m_characterStyleName; + + // Paragraph style + wxString m_paragraphStyleName; + + // List style + wxString m_listStyleName; +}; + +// ---------------------------------------------------------------------------- +// wxTextAreaBase: multiline text control specific methods +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTextAreaBase +{ +public: + wxTextAreaBase() { } + virtual ~wxTextAreaBase() { } + + // lines access + // ------------ + + virtual int GetLineLength(long lineNo) const = 0; + virtual wxString GetLineText(long lineNo) const = 0; + virtual int GetNumberOfLines() const = 0; + + + // file IO + // ------- + + bool LoadFile(const wxString& file, int fileType = wxTEXT_TYPE_ANY) + { return DoLoadFile(file, fileType); } + bool SaveFile(const wxString& file = wxEmptyString, + int fileType = wxTEXT_TYPE_ANY); + + // dirty flag handling + // ------------------- + + virtual bool IsModified() const = 0; + virtual void MarkDirty() = 0; + virtual void DiscardEdits() = 0; + void SetModified(bool modified) + { + if ( modified ) + MarkDirty(); + else + DiscardEdits(); + } + + + // styles handling + // --------------- + + // text control under some platforms supports the text styles: these + // methods allow to apply the given text style to the given selection or to + // set/get the style which will be used for all appended text + virtual bool SetStyle(long start, long end, const wxTextAttr& style) = 0; + virtual bool GetStyle(long position, wxTextAttr& style) = 0; + virtual bool SetDefaultStyle(const wxTextAttr& style) = 0; + virtual const wxTextAttr& GetDefaultStyle() const { return m_defaultStyle; } + + + // coordinates translation + // ----------------------- + + // translate between the position (which is just an index in the text ctrl + // considering all its contents as a single strings) and (x, y) coordinates + // which represent column and line. + virtual long XYToPosition(long x, long y) const = 0; + virtual bool PositionToXY(long pos, long *x, long *y) const = 0; + + // translate the given position (which is just an index in the text control) + // to client coordinates + wxPoint PositionToCoords(long pos) const; + + + virtual void ShowPosition(long pos) = 0; + + // find the character at position given in pixels + // + // NB: pt is in device coords (not adjusted for the client area origin nor + // scrolling) + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const; + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, + wxTextCoord *col, + wxTextCoord *row) const; + virtual wxString GetValue() const = 0; + virtual void SetValue(const wxString& value) = 0; + +protected: + // implementation of loading/saving + virtual bool DoLoadFile(const wxString& file, int fileType); + virtual bool DoSaveFile(const wxString& file, int fileType); + + // Return true if the given position is valid, i.e. positive and less than + // the last position. + virtual bool IsValidPosition(long pos) const = 0; + + // Default stub implementation of PositionToCoords() always returns + // wxDefaultPosition. + virtual wxPoint DoPositionToCoords(long pos) const; + + // the name of the last file loaded with LoadFile() which will be used by + // SaveFile() by default + wxString m_filename; + + // the text style which will be used for any new text added to the control + wxTextAttr m_defaultStyle; + + + wxDECLARE_NO_COPY_CLASS(wxTextAreaBase); +}; + +// this class defines wxTextCtrl interface, wxTextCtrlBase actually implements +// too much things because it derives from wxTextEntry and not wxTextEntryBase +// and so any classes which "look like" wxTextCtrl (such as wxRichTextCtrl) +// but don't need the (native) implementation bits from wxTextEntry should +// actually derive from this one and not wxTextCtrlBase +class WXDLLIMPEXP_CORE wxTextCtrlIface : public wxTextAreaBase, + public wxTextEntryBase +{ +public: + wxTextCtrlIface() { } + + // wxTextAreaBase overrides + virtual wxString GetValue() const + { + return wxTextEntryBase::GetValue(); + } + virtual void SetValue(const wxString& value) + { + wxTextEntryBase::SetValue(value); + } + +protected: + virtual bool IsValidPosition(long pos) const + { + return pos >= 0 && pos <= GetLastPosition(); + } + +private: + wxDECLARE_NO_COPY_CLASS(wxTextCtrlIface); +}; + +// ---------------------------------------------------------------------------- +// wxTextCtrl: a single or multiple line text zone where user can edit text +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTextCtrlBase : public wxControl, +#if wxHAS_TEXT_WINDOW_STREAM + public wxSTD streambuf, +#endif + public wxTextAreaBase, + public wxTextEntry +{ +public: + // creation + // -------- + + wxTextCtrlBase() { } + virtual ~wxTextCtrlBase() { } + + + // more readable flag testing methods + bool IsSingleLine() const { return !HasFlag(wxTE_MULTILINE); } + bool IsMultiLine() const { return !IsSingleLine(); } + + // stream-like insertion operators: these are always available, whether we + // were, or not, compiled with streambuf support + wxTextCtrl& operator<<(const wxString& s); + wxTextCtrl& operator<<(int i); + wxTextCtrl& operator<<(long i); + wxTextCtrl& operator<<(float f) { return *this << double(f); } + wxTextCtrl& operator<<(double d); + wxTextCtrl& operator<<(char c) { return *this << wxString(c); } + wxTextCtrl& operator<<(wchar_t c) { return *this << wxString(c); } + + // insert the character which would have resulted from this key event, + // return true if anything has been inserted + virtual bool EmulateKeyPress(const wxKeyEvent& event); + + + // do the window-specific processing after processing the update event + virtual void DoUpdateWindowUI(wxUpdateUIEvent& event); + + virtual bool ShouldInheritColours() const { return false; } + + // work around the problem with having HitTest() both in wxControl and + // wxTextAreaBase base classes + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const + { + return wxTextAreaBase::HitTest(pt, pos); + } + + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, + wxTextCoord *col, + wxTextCoord *row) const + { + return wxTextAreaBase::HitTest(pt, col, row); + } + + // we provide stubs for these functions as not all platforms have styles + // support, but we really should leave them pure virtual here + virtual bool SetStyle(long start, long end, const wxTextAttr& style); + virtual bool GetStyle(long position, wxTextAttr& style); + virtual bool SetDefaultStyle(const wxTextAttr& style); + + // wxTextAreaBase overrides + virtual wxString GetValue() const + { + return wxTextEntry::GetValue(); + } + virtual void SetValue(const wxString& value) + { + wxTextEntry::SetValue(value); + } + + // wxTextEntry overrides + virtual bool SetHint(const wxString& hint); + + // wxWindow overrides + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL) + { + return GetCompositeControlsDefaultAttributes(variant); + } + +protected: + // override streambuf method +#if wxHAS_TEXT_WINDOW_STREAM + int overflow(int i); +#endif // wxHAS_TEXT_WINDOW_STREAM + + // Another wxTextAreaBase override. + virtual bool IsValidPosition(long pos) const + { + return pos >= 0 && pos <= GetLastPosition(); + } + + // implement the wxTextEntry pure virtual method + virtual wxWindow *GetEditableWindow() { return this; } + + wxDECLARE_NO_COPY_CLASS(wxTextCtrlBase); + DECLARE_ABSTRACT_CLASS(wxTextCtrlBase) +}; + +// ---------------------------------------------------------------------------- +// include the platform-dependent class definition +// ---------------------------------------------------------------------------- + +#if defined(__WXX11__) + #include "wx/x11/textctrl.h" +#elif defined(__WXUNIVERSAL__) + #include "wx/univ/textctrl.h" +#elif defined(__SMARTPHONE__) && defined(__WXWINCE__) + #include "wx/msw/wince/textctrlce.h" +#elif defined(__WXMSW__) + #include "wx/msw/textctrl.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/textctrl.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/textctrl.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/textctrl.h" +#elif defined(__WXMAC__) + #include "wx/osx/textctrl.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/textctrl.h" +#elif defined(__WXPM__) + #include "wx/os2/textctrl.h" +#endif + +// ---------------------------------------------------------------------------- +// wxTextCtrl events +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxTextUrlEvent; + +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT_ENTER, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT_URL, wxTextUrlEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT_MAXLEN, wxCommandEvent); + +class WXDLLIMPEXP_CORE wxTextUrlEvent : public wxCommandEvent +{ +public: + wxTextUrlEvent(int winid, const wxMouseEvent& evtMouse, + long start, long end) + : wxCommandEvent(wxEVT_TEXT_URL, winid), + m_evtMouse(evtMouse), m_start(start), m_end(end) + { } + wxTextUrlEvent(const wxTextUrlEvent& event) + : wxCommandEvent(event), + m_evtMouse(event.m_evtMouse), + m_start(event.m_start), + m_end(event.m_end) { } + + // get the mouse event which happened over the URL + const wxMouseEvent& GetMouseEvent() const { return m_evtMouse; } + + // get the start of the URL + long GetURLStart() const { return m_start; } + + // get the end of the URL + long GetURLEnd() const { return m_end; } + + virtual wxEvent *Clone() const { return new wxTextUrlEvent(*this); } + +protected: + // the corresponding mouse event + wxMouseEvent m_evtMouse; + + // the start and end indices of the URL in the text control + long m_start, + m_end; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxTextUrlEvent) + +public: + // for wxWin RTTI only, don't use + wxTextUrlEvent() : m_evtMouse(), m_start(0), m_end(0) { } +}; + +typedef void (wxEvtHandler::*wxTextUrlEventFunction)(wxTextUrlEvent&); + +#define wxTextEventHandler(func) wxCommandEventHandler(func) +#define wxTextUrlEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxTextUrlEventFunction, func) + +#define wx__DECLARE_TEXTEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_TEXT_ ## evt, id, wxTextEventHandler(fn)) + +#define wx__DECLARE_TEXTURLEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_TEXT_ ## evt, id, wxTextUrlEventHandler(fn)) + +#define EVT_TEXT(id, fn) wx__DECLARE_EVT1(wxEVT_TEXT, id, wxTextEventHandler(fn)) +#define EVT_TEXT_ENTER(id, fn) wx__DECLARE_TEXTEVT(ENTER, id, fn) +#define EVT_TEXT_URL(id, fn) wx__DECLARE_TEXTURLEVT(URL, id, fn) +#define EVT_TEXT_MAXLEN(id, fn) wx__DECLARE_TEXTEVT(MAXLEN, id, fn) + +#if wxHAS_TEXT_WINDOW_STREAM + +// ---------------------------------------------------------------------------- +// wxStreamToTextRedirector: this class redirects all data sent to the given +// C++ stream to the wxTextCtrl given to its ctor during its lifetime. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxStreamToTextRedirector +{ +private: + void Init(wxTextCtrl *text) + { + m_sbufOld = m_ostr.rdbuf(); + m_ostr.rdbuf(text); + } + +public: + wxStreamToTextRedirector(wxTextCtrl *text) + : m_ostr(wxSTD cout) + { + Init(text); + } + + wxStreamToTextRedirector(wxTextCtrl *text, wxSTD ostream *ostr) + : m_ostr(*ostr) + { + Init(text); + } + + ~wxStreamToTextRedirector() + { + m_ostr.rdbuf(m_sbufOld); + } + +private: + // the stream we're redirecting + wxSTD ostream& m_ostr; + + // the old streambuf (before we changed it) + wxSTD streambuf *m_sbufOld; +}; + +#endif // wxHAS_TEXT_WINDOW_STREAM + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_TEXT_UPDATED wxEVT_TEXT +#define wxEVT_COMMAND_TEXT_ENTER wxEVT_TEXT_ENTER +#define wxEVT_COMMAND_TEXT_URL wxEVT_TEXT_URL +#define wxEVT_COMMAND_TEXT_MAXLEN wxEVT_TEXT_MAXLEN + +#endif // wxUSE_TEXTCTRL + +#endif + // _WX_TEXTCTRL_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/textdlg.h b/wxmsw/include/wx-3.0/wx/textdlg.h new file mode 100644 index 00000000..509b700b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/textdlg.h @@ -0,0 +1,17 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/textdlg.h +// Purpose: wxTextEntryDialog class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TEXTDLG_H_BASE_ +#define _WX_TEXTDLG_H_BASE_ + +#include "wx/generic/textdlgg.h" + +#endif // _WX_TEXTDLG_H_BASE_ + diff --git a/wxmsw/include/wx-3.0/wx/textentry.h b/wxmsw/include/wx-3.0/wx/textentry.h new file mode 100644 index 00000000..2707afa2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/textentry.h @@ -0,0 +1,332 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/textentry.h +// Purpose: declares wxTextEntry interface defining a simple text entry +// Author: Vadim Zeitlin +// Created: 2007-09-24 +// Copyright: (c) 2007 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TEXTENTRY_H_ +#define _WX_TEXTENTRY_H_ + +// wxTextPos is the position in the text (currently it's hardly used anywhere +// and should probably be replaced with int anyhow) +typedef long wxTextPos; + +class WXDLLIMPEXP_FWD_BASE wxArrayString; +class WXDLLIMPEXP_FWD_CORE wxTextCompleter; +class WXDLLIMPEXP_FWD_CORE wxTextEntryHintData; +class WXDLLIMPEXP_FWD_CORE wxWindow; + +#include "wx/filefn.h" // for wxFILE and wxDIR only +#include "wx/gdicmn.h" // for wxPoint + +// ---------------------------------------------------------------------------- +// wxTextEntryBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTextEntryBase +{ +public: + wxTextEntryBase() { m_eventsBlock = 0; m_hintData = NULL; } + virtual ~wxTextEntryBase(); + + + // accessing the value + // ------------------- + + // SetValue() generates a text change event, ChangeValue() doesn't + virtual void SetValue(const wxString& value) + { DoSetValue(value, SetValue_SendEvent); } + virtual void ChangeValue(const wxString& value); + + // writing text inserts it at the current position replacing any current + // selection, appending always inserts it at the end and doesn't remove any + // existing text (but it will reset the selection if there is any) + virtual void WriteText(const wxString& text) = 0; + virtual void AppendText(const wxString& text); + + virtual wxString GetValue() const; + virtual wxString GetRange(long from, long to) const; + bool IsEmpty() const { return GetLastPosition() <= 0; } + + + // editing operations + // ------------------ + + virtual void Replace(long from, long to, const wxString& value); + virtual void Remove(long from, long to) = 0; + virtual void Clear() { SetValue(wxString()); } + void RemoveSelection(); + + + // clipboard operations + // -------------------- + + virtual void Copy() = 0; + virtual void Cut() = 0; + virtual void Paste() = 0; + + virtual bool CanCopy() const; + virtual bool CanCut() const; + virtual bool CanPaste() const; + + // undo/redo + // --------- + + virtual void Undo() = 0; + virtual void Redo() = 0; + + virtual bool CanUndo() const = 0; + virtual bool CanRedo() const = 0; + + + // insertion point + // --------------- + + // note that moving insertion point removes any current selection + virtual void SetInsertionPoint(long pos) = 0; + virtual void SetInsertionPointEnd() { SetInsertionPoint(-1); } + virtual long GetInsertionPoint() const = 0; + virtual long GetLastPosition() const = 0; + + + // selection + // --------- + + virtual void SetSelection(long from, long to) = 0; + virtual void SelectAll() { SetSelection(-1, -1); } + virtual void SelectNone() + { const long pos = GetInsertionPoint(); SetSelection(pos, pos); } + virtual void GetSelection(long *from, long *to) const = 0; + bool HasSelection() const; + virtual wxString GetStringSelection() const; + + + // auto-completion + // --------------- + + // these functions allow to auto-complete the text already entered into the + // control using either the given fixed list of strings, the paths from the + // file system or an arbitrary user-defined completer + // + // they all return true if completion was enabled or false on error (most + // commonly meaning that this functionality is not available under the + // current platform) + + bool AutoComplete(const wxArrayString& choices) + { return DoAutoCompleteStrings(choices); } + + bool AutoCompleteFileNames() + { return DoAutoCompleteFileNames(wxFILE); } + + bool AutoCompleteDirectories() + { return DoAutoCompleteFileNames(wxDIR); } + + // notice that we take ownership of the pointer and will delete it + // + // if the pointer is NULL auto-completion is disabled + bool AutoComplete(wxTextCompleter *completer) + { return DoAutoCompleteCustom(completer); } + + + // status + // ------ + + virtual bool IsEditable() const = 0; + virtual void SetEditable(bool editable) = 0; + + + // set the max number of characters which may be entered in a single line + // text control + virtual void SetMaxLength(unsigned long WXUNUSED(len)) { } + + + // hints + // ----- + + // hint is the (usually greyed out) text shown in the control as long as + // it's empty and doesn't have focus, it is typically used in controls used + // for searching to let the user know what is supposed to be entered there + + virtual bool SetHint(const wxString& hint); + virtual wxString GetHint() const; + + + // margins + // ------- + + // margins are the empty space between borders of control and the text + // itself. When setting margin, use value -1 to indicate that specific + // margin should not be changed. + + bool SetMargins(const wxPoint& pt) + { return DoSetMargins(pt); } + bool SetMargins(wxCoord left, wxCoord top = -1) + { return DoSetMargins(wxPoint(left, top)); } + wxPoint GetMargins() const + { return DoGetMargins(); } + + + // implementation only + // ------------------- + + // generate the wxEVT_TEXT event for GetEditableWindow(), + // like SetValue() does and return true if the event was processed + // + // NB: this is public for wxRichTextCtrl use only right now, do not call it + static bool SendTextUpdatedEvent(wxWindow *win); + + // generate the wxEVT_TEXT event for this window + bool SendTextUpdatedEvent() + { + return SendTextUpdatedEvent(GetEditableWindow()); + } + + + // generate the wxEVT_TEXT event for this window if the + // events are not currently disabled + void SendTextUpdatedEventIfAllowed() + { + if ( EventsAllowed() ) + SendTextUpdatedEvent(); + } + + // this function is provided solely for the purpose of forwarding text + // change notifications state from one control to another, e.g. it can be + // used by a wxComboBox which derives from wxTextEntry if it delegates all + // of its methods to another wxTextCtrl + void ForwardEnableTextChangedEvents(bool enable) + { + // it's important to call the functions which update m_eventsBlock here + // and not just our own EnableTextChangedEvents() because our state + // (i.e. the result of EventsAllowed()) must change as well + if ( enable ) + ResumeTextChangedEvents(); + else + SuppressTextChangedEvents(); + } + +protected: + // flags for DoSetValue(): common part of SetValue() and ChangeValue() and + // also used to implement WriteText() in wxMSW + enum + { + SetValue_NoEvent = 0, + SetValue_SendEvent = 1, + SetValue_SelectionOnly = 2 + }; + + virtual void DoSetValue(const wxString& value, int flags); + virtual wxString DoGetValue() const = 0; + + // override this to return the associated window, it will be used for event + // generation and also by generic hints implementation + virtual wxWindow *GetEditableWindow() = 0; + + // margins functions + virtual bool DoSetMargins(const wxPoint& pt); + virtual wxPoint DoGetMargins() const; + + // the derived classes should override these virtual methods to implement + // auto-completion, they do the same thing as their public counterparts but + // have different names to allow overriding just one of them without hiding + // the other one(s) + virtual bool DoAutoCompleteStrings(const wxArrayString& WXUNUSED(choices)) + { return false; } + virtual bool DoAutoCompleteFileNames(int WXUNUSED(flags)) // wxFILE | wxDIR + { return false; } + virtual bool DoAutoCompleteCustom(wxTextCompleter *completer); + + + // class which should be used to temporarily disable text change events + // + // if suppress argument in ctor is false, nothing is done + class EventsSuppressor + { + public: + EventsSuppressor(wxTextEntryBase *text, bool suppress = true) + : m_text(text), + m_suppress(suppress) + { + if ( m_suppress ) + m_text->SuppressTextChangedEvents(); + } + + ~EventsSuppressor() + { + if ( m_suppress ) + m_text->ResumeTextChangedEvents(); + } + + private: + wxTextEntryBase *m_text; + bool m_suppress; + }; + + friend class EventsSuppressor; + +private: + // suppress or resume the text changed events generation: don't use these + // functions directly, use EventsSuppressor class above instead + void SuppressTextChangedEvents() + { + if ( !m_eventsBlock++ ) + EnableTextChangedEvents(false); + } + + void ResumeTextChangedEvents() + { + if ( !--m_eventsBlock ) + EnableTextChangedEvents(true); + } + + + // this must be overridden in the derived classes if our implementation of + // SetValue() or Replace() is used to disable (and enable back) generation + // of the text changed events + // + // initially the generation of the events is enabled + virtual void EnableTextChangedEvents(bool WXUNUSED(enable)) { } + + // return true if the events are currently not suppressed + bool EventsAllowed() const { return m_eventsBlock == 0; } + + + // if this counter is non-null, events are blocked + unsigned m_eventsBlock; + + // hint-related stuff, only allocated if/when SetHint() is used + wxTextEntryHintData *m_hintData; + + // It needs to call our Do{Get,Set}Value() to work with the real control + // contents. + friend class wxTextEntryHintData; +}; + +#ifdef __WXUNIVERSAL__ + // TODO: we need to use wxTextEntryDelegate here, but for now just prevent + // the GTK/MSW classes from being used in wxUniv build + class WXDLLIMPEXP_CORE wxTextEntry : public wxTextEntryBase + { + }; +#elif defined(__WXGTK20__) + #include "wx/gtk/textentry.h" +#elif defined(__WXMAC__) + #include "wx/osx/textentry.h" +#elif defined(__WXMSW__) + #include "wx/msw/textentry.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/textentry.h" +#elif defined(__WXPM__) + #include "wx/os2/textentry.h" +#else + // no platform-specific implementation of wxTextEntry yet + class WXDLLIMPEXP_CORE wxTextEntry : public wxTextEntryBase + { + }; +#endif + +#endif // _WX_TEXTENTRY_H_ + diff --git a/wxmsw/include/wx-3.0/wx/textfile.h b/wxmsw/include/wx-3.0/wx/textfile.h new file mode 100644 index 00000000..e6aa3ba6 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/textfile.h @@ -0,0 +1,61 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/textfile.h +// Purpose: class wxTextFile to work with text files of _small_ size +// (file is fully loaded in memory) and which understands CR/LF +// differences between platforms. +// Author: Vadim Zeitlin +// Modified by: +// Created: 03.04.98 +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TEXTFILE_H +#define _WX_TEXTFILE_H + +#include "wx/defs.h" + +#include "wx/textbuf.h" + +#if wxUSE_TEXTFILE + +#include "wx/file.h" + +// ---------------------------------------------------------------------------- +// wxTextFile +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxTextFile : public wxTextBuffer +{ +public: + // constructors + wxTextFile() { } + wxTextFile(const wxString& strFileName); + +protected: + // implement the base class pure virtuals + virtual bool OnExists() const; + virtual bool OnOpen(const wxString &strBufferName, + wxTextBufferOpenMode OpenMode); + virtual bool OnClose(); + virtual bool OnRead(const wxMBConv& conv); + virtual bool OnWrite(wxTextFileType typeNew, const wxMBConv& conv); + +private: + + wxFile m_file; + + wxDECLARE_NO_COPY_CLASS(wxTextFile); +}; + +#else // !wxUSE_TEXTFILE + +// old code relies on the static methods of wxTextFile being always available +// and they still are available in wxTextBuffer (even if !wxUSE_TEXTBUFFER), so +// make it possible to use them in a backwards compatible way +typedef wxTextBuffer wxTextFile; + +#endif // wxUSE_TEXTFILE/!wxUSE_TEXTFILE + +#endif // _WX_TEXTFILE_H + diff --git a/wxmsw/include/wx-3.0/wx/textwrapper.h b/wxmsw/include/wx-3.0/wx/textwrapper.h new file mode 100644 index 00000000..a708cebd --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/textwrapper.h @@ -0,0 +1,128 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/textwrapper.h +// Purpose: declaration of wxTextWrapper class +// Author: Vadim Zeitlin +// Created: 2009-05-31 (extracted from dlgcmn.cpp via wx/private/stattext.h) +// Copyright: (c) 1999, 2009 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TEXTWRAPPER_H_ +#define _WX_TEXTWRAPPER_H_ + +#include "wx/window.h" + +// ---------------------------------------------------------------------------- +// wxTextWrapper +// ---------------------------------------------------------------------------- + +// this class is used to wrap the text on word boundary: wrapping is done by +// calling OnStartLine() and OnOutputLine() functions +class WXDLLIMPEXP_CORE wxTextWrapper +{ +public: + wxTextWrapper() { m_eol = false; } + + // win is used for getting the font, text is the text to wrap, width is the + // max line width or -1 to disable wrapping + void Wrap(wxWindow *win, const wxString& text, int widthMax); + + // we don't need it, but just to avoid compiler warnings + virtual ~wxTextWrapper() { } + +protected: + // line may be empty + virtual void OnOutputLine(const wxString& line) = 0; + + // called at the start of every new line (except the very first one) + virtual void OnNewLine() { } + +private: + // call OnOutputLine() and set m_eol to true + void DoOutputLine(const wxString& line) + { + OnOutputLine(line); + + m_eol = true; + } + + // this function is a destructive inspector: when it returns true it also + // resets the flag to false so calling it again wouldn't return true any + // more + bool IsStartOfNewLine() + { + if ( !m_eol ) + return false; + + m_eol = false; + + return true; + } + + + bool m_eol; + + wxDECLARE_NO_COPY_CLASS(wxTextWrapper); +}; + +#if wxUSE_STATTEXT + +#include "wx/sizer.h" +#include "wx/stattext.h" + +// A class creating a sizer with one static text per line of text. Creation of +// the controls used for each line can be customized by overriding +// OnCreateLine() function. +// +// This class is currently private to wxWidgets and used only by wxDialog +// itself. We may make it public later if there is sufficient interest. +class wxTextSizerWrapper : public wxTextWrapper +{ +public: + wxTextSizerWrapper(wxWindow *win) + { + m_win = win; + m_hLine = 0; + } + + wxSizer *CreateSizer(const wxString& text, int widthMax) + { + m_sizer = new wxBoxSizer(wxVERTICAL); + Wrap(m_win, text, widthMax); + return m_sizer; + } + + wxWindow *GetParent() const { return m_win; } + +protected: + virtual wxWindow *OnCreateLine(const wxString& line) + { + return new wxStaticText(m_win, wxID_ANY, + wxControl::EscapeMnemonics(line)); + } + + virtual void OnOutputLine(const wxString& line) + { + if ( !line.empty() ) + { + m_sizer->Add(OnCreateLine(line)); + } + else // empty line, no need to create a control for it + { + if ( !m_hLine ) + m_hLine = m_win->GetCharHeight(); + + m_sizer->Add(5, m_hLine); + } + } + +private: + wxWindow *m_win; + wxSizer *m_sizer; + int m_hLine; +}; + +#endif // wxUSE_STATTEXT + +#endif // _WX_TEXTWRAPPER_H_ + diff --git a/wxmsw/include/wx-3.0/wx/tglbtn.h b/wxmsw/include/wx-3.0/wx/tglbtn.h new file mode 100644 index 00000000..8cb2a2e8 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/tglbtn.h @@ -0,0 +1,101 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/tglbtn.h +// Purpose: This dummy header includes the proper header file for the +// system we're compiling under. +// Author: John Norris, minor changes by Axel Schlueter +// Modified by: +// Created: 08.02.01 +// Copyright: (c) 2000 Johnny C. Norris II +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TOGGLEBUTTON_H_BASE_ +#define _WX_TOGGLEBUTTON_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_TOGGLEBTN + +#include "wx/event.h" +#include "wx/anybutton.h" // base class + +extern WXDLLIMPEXP_DATA_CORE(const char) wxCheckBoxNameStr[]; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TOGGLEBUTTON, wxCommandEvent ); + +// ---------------------------------------------------------------------------- +// wxToggleButtonBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxToggleButtonBase : public wxAnyButton +{ +public: + wxToggleButtonBase() { } + + // Get/set the value + virtual void SetValue(bool state) = 0; + virtual bool GetValue() const = 0; + + void UpdateWindowUI(long flags) + { + wxControl::UpdateWindowUI(flags); + + if ( !IsShown() ) + return; + + wxWindow *tlw = wxGetTopLevelParent( this ); + if (tlw && wxPendingDelete.Member( tlw )) + return; + + wxUpdateUIEvent event( GetId() ); + event.SetEventObject(this); + + if (GetEventHandler()->ProcessEvent(event) ) + { + if ( event.GetSetChecked() ) + SetValue( event.GetChecked() ); + } + } + + // Buttons on MSW can look bad if they are not native colours, because + // then they become owner-drawn and not theme-drawn. Disable it here + // in wxToggleButtonBase to make it consistent. + virtual bool ShouldInheritColours() const { return false; } + +protected: + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + wxDECLARE_NO_COPY_CLASS(wxToggleButtonBase); +}; + + +#define EVT_TOGGLEBUTTON(id, fn) \ + wx__DECLARE_EVT1(wxEVT_TOGGLEBUTTON, id, wxCommandEventHandler(fn)) + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/tglbtn.h" +#elif defined(__WXMSW__) + #include "wx/msw/tglbtn.h" + #define wxHAS_BITMAPTOGGLEBUTTON +#elif defined(__WXGTK20__) + #include "wx/gtk/tglbtn.h" + #define wxHAS_BITMAPTOGGLEBUTTON +#elif defined(__WXGTK__) + #include "wx/gtk1/tglbtn.h" +# elif defined(__WXMOTIF__) + #include "wx/motif/tglbtn.h" +#elif defined(__WXMAC__) + #include "wx/osx/tglbtn.h" + #define wxHAS_BITMAPTOGGLEBUTTON +#elif defined(__WXPM__) + #include "wx/os2/tglbtn.h" +#endif + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_TOGGLEBUTTON_CLICKED wxEVT_TOGGLEBUTTON + +#endif // wxUSE_TOGGLEBTN + +#endif // _WX_TOGGLEBUTTON_H_BASE_ + diff --git a/wxmsw/include/wx-3.0/wx/thread.h b/wxmsw/include/wx-3.0/wx/thread.h new file mode 100644 index 00000000..6806d82f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/thread.h @@ -0,0 +1,879 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/thread.h +// Purpose: Thread API +// Author: Guilhem Lavaux +// Modified by: Vadim Zeitlin (modifications partly inspired by omnithreads +// package from Olivetti & Oracle Research Laboratory) +// Created: 04/13/98 +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_THREAD_H_ +#define _WX_THREAD_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// get the value of wxUSE_THREADS configuration flag +#include "wx/defs.h" + +#if wxUSE_THREADS + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +enum wxMutexError +{ + wxMUTEX_NO_ERROR = 0, // operation completed successfully + wxMUTEX_INVALID, // mutex hasn't been initialized + wxMUTEX_DEAD_LOCK, // mutex is already locked by the calling thread + wxMUTEX_BUSY, // mutex is already locked by another thread + wxMUTEX_UNLOCKED, // attempt to unlock a mutex which is not locked + wxMUTEX_TIMEOUT, // LockTimeout() has timed out + wxMUTEX_MISC_ERROR // any other error +}; + +enum wxCondError +{ + wxCOND_NO_ERROR = 0, + wxCOND_INVALID, + wxCOND_TIMEOUT, // WaitTimeout() has timed out + wxCOND_MISC_ERROR +}; + +enum wxSemaError +{ + wxSEMA_NO_ERROR = 0, + wxSEMA_INVALID, // semaphore hasn't been initialized successfully + wxSEMA_BUSY, // returned by TryWait() if Wait() would block + wxSEMA_TIMEOUT, // returned by WaitTimeout() + wxSEMA_OVERFLOW, // Post() would increase counter past the max + wxSEMA_MISC_ERROR +}; + +enum wxThreadError +{ + wxTHREAD_NO_ERROR = 0, // No error + wxTHREAD_NO_RESOURCE, // No resource left to create a new thread + wxTHREAD_RUNNING, // The thread is already running + wxTHREAD_NOT_RUNNING, // The thread isn't running + wxTHREAD_KILLED, // Thread we waited for had to be killed + wxTHREAD_MISC_ERROR // Some other error +}; + +enum wxThreadKind +{ + wxTHREAD_DETACHED, + wxTHREAD_JOINABLE +}; + +enum wxThreadWait +{ + wxTHREAD_WAIT_BLOCK, + wxTHREAD_WAIT_YIELD, // process events while waiting; MSW only + + // For compatibility reasons we use wxTHREAD_WAIT_YIELD by default as this + // was the default behaviour of wxMSW 2.8 but it should be avoided as it's + // dangerous and not portable. +#if WXWIN_COMPATIBILITY_2_8 + wxTHREAD_WAIT_DEFAULT = wxTHREAD_WAIT_YIELD +#else + wxTHREAD_WAIT_DEFAULT = wxTHREAD_WAIT_BLOCK +#endif +}; + +// Obsolete synonyms for wxPRIORITY_XXX for backwards compatibility-only +enum +{ + WXTHREAD_MIN_PRIORITY = wxPRIORITY_MIN, + WXTHREAD_DEFAULT_PRIORITY = wxPRIORITY_DEFAULT, + WXTHREAD_MAX_PRIORITY = wxPRIORITY_MAX +}; + +// There are 2 types of mutexes: normal mutexes and recursive ones. The attempt +// to lock a normal mutex by a thread which already owns it results in +// undefined behaviour (it always works under Windows, it will almost always +// result in a deadlock under Unix). Locking a recursive mutex in such +// situation always succeeds and it must be unlocked as many times as it has +// been locked. +// +// However recursive mutexes have several important drawbacks: first, in the +// POSIX implementation, they're less efficient. Second, and more importantly, +// they CAN NOT BE USED WITH CONDITION VARIABLES under Unix! Using them with +// wxCondition will work under Windows and some Unices (notably Linux) but will +// deadlock under other Unix versions (e.g. Solaris). As it might be difficult +// to ensure that a recursive mutex is not used with wxCondition, it is a good +// idea to avoid using recursive mutexes at all. Also, the last problem with +// them is that some (older) Unix versions don't support this at all -- which +// results in a configure warning when building and a deadlock when using them. +enum wxMutexType +{ + // normal mutex: try to always use this one + wxMUTEX_DEFAULT, + + // recursive mutex: don't use these ones with wxCondition + wxMUTEX_RECURSIVE +}; + +// forward declarations +class WXDLLIMPEXP_FWD_BASE wxThreadHelper; +class WXDLLIMPEXP_FWD_BASE wxConditionInternal; +class WXDLLIMPEXP_FWD_BASE wxMutexInternal; +class WXDLLIMPEXP_FWD_BASE wxSemaphoreInternal; +class WXDLLIMPEXP_FWD_BASE wxThreadInternal; + +// ---------------------------------------------------------------------------- +// A mutex object is a synchronization object whose state is set to signaled +// when it is not owned by any thread, and nonsignaled when it is owned. Its +// name comes from its usefulness in coordinating mutually-exclusive access to +// a shared resource. Only one thread at a time can own a mutex object. +// ---------------------------------------------------------------------------- + +// you should consider wxMutexLocker whenever possible instead of directly +// working with wxMutex class - it is safer +class WXDLLIMPEXP_BASE wxMutex +{ +public: + // constructor & destructor + // ------------------------ + + // create either default (always safe) or recursive mutex + wxMutex(wxMutexType mutexType = wxMUTEX_DEFAULT); + + // destroys the mutex kernel object + ~wxMutex(); + + // test if the mutex has been created successfully + bool IsOk() const; + + // mutex operations + // ---------------- + + // Lock the mutex, blocking on it until it is unlocked by the other thread. + // The result of locking a mutex already locked by the current thread + // depend on the mutex type. + // + // The caller must call Unlock() later if Lock() returned wxMUTEX_NO_ERROR. + wxMutexError Lock(); + + // Same as Lock() but return wxMUTEX_TIMEOUT if the mutex can't be locked + // during the given number of milliseconds + wxMutexError LockTimeout(unsigned long ms); + + // Try to lock the mutex: if it is currently locked, return immediately + // with an error. Otherwise the caller must call Unlock(). + wxMutexError TryLock(); + + // Unlock the mutex. It is an error to unlock an already unlocked mutex + wxMutexError Unlock(); + +protected: + wxMutexInternal *m_internal; + + friend class wxConditionInternal; + + wxDECLARE_NO_COPY_CLASS(wxMutex); +}; + +// a helper class which locks the mutex in the ctor and unlocks it in the dtor: +// this ensures that mutex is always unlocked, even if the function returns or +// throws an exception before it reaches the end +class WXDLLIMPEXP_BASE wxMutexLocker +{ +public: + // lock the mutex in the ctor + wxMutexLocker(wxMutex& mutex) + : m_isOk(false), m_mutex(mutex) + { m_isOk = ( m_mutex.Lock() == wxMUTEX_NO_ERROR ); } + + // returns true if mutex was successfully locked in ctor + bool IsOk() const + { return m_isOk; } + + // unlock the mutex in dtor + ~wxMutexLocker() + { if ( IsOk() ) m_mutex.Unlock(); } + +private: + // no assignment operator nor copy ctor + wxMutexLocker(const wxMutexLocker&); + wxMutexLocker& operator=(const wxMutexLocker&); + + bool m_isOk; + wxMutex& m_mutex; +}; + +// ---------------------------------------------------------------------------- +// Critical section: this is the same as mutex but is only visible to the +// threads of the same process. For the platforms which don't have native +// support for critical sections, they're implemented entirely in terms of +// mutexes. +// +// NB: wxCriticalSection object does not allocate any memory in its ctor +// which makes it possible to have static globals of this class +// ---------------------------------------------------------------------------- + +// in order to avoid any overhead under platforms where critical sections are +// just mutexes make all wxCriticalSection class functions inline +#if !defined(__WINDOWS__) + #define wxCRITSECT_IS_MUTEX 1 + + #define wxCRITSECT_INLINE WXEXPORT inline +#else // MSW + #define wxCRITSECT_IS_MUTEX 0 + + #define wxCRITSECT_INLINE +#endif // MSW/!MSW + +enum wxCriticalSectionType +{ + // recursive critical section + wxCRITSEC_DEFAULT, + + // non-recursive critical section + wxCRITSEC_NON_RECURSIVE +}; + +// you should consider wxCriticalSectionLocker whenever possible instead of +// directly working with wxCriticalSection class - it is safer +class WXDLLIMPEXP_BASE wxCriticalSection +{ +public: + // ctor & dtor + wxCRITSECT_INLINE wxCriticalSection( wxCriticalSectionType critSecType = wxCRITSEC_DEFAULT ); + wxCRITSECT_INLINE ~wxCriticalSection(); + // enter the section (the same as locking a mutex) + wxCRITSECT_INLINE void Enter(); + + // try to enter the section (the same as trying to lock a mutex) + wxCRITSECT_INLINE bool TryEnter(); + + // leave the critical section (same as unlocking a mutex) + wxCRITSECT_INLINE void Leave(); + +private: +#if wxCRITSECT_IS_MUTEX + wxMutex m_mutex; +#elif defined(__WINDOWS__) + // we can't allocate any memory in the ctor, so use placement new - + // unfortunately, we have to hardcode the sizeof() here because we can't + // include windows.h from this public header and we also have to use the + // union to force the correct (i.e. maximal) alignment + // + // if CRITICAL_SECTION size changes in Windows, you'll get an assert from + // thread.cpp and will need to increase the buffer size +#ifdef __WIN64__ + typedef char wxCritSectBuffer[40]; +#else // __WIN32__ + typedef char wxCritSectBuffer[24]; +#endif + union + { + unsigned long m_dummy1; + void *m_dummy2; + + wxCritSectBuffer m_buffer; + }; +#endif // Unix&OS2/Win32 + + wxDECLARE_NO_COPY_CLASS(wxCriticalSection); +}; + +#if wxCRITSECT_IS_MUTEX + // implement wxCriticalSection using mutexes + inline wxCriticalSection::wxCriticalSection( wxCriticalSectionType critSecType ) + : m_mutex( critSecType == wxCRITSEC_DEFAULT ? wxMUTEX_RECURSIVE : wxMUTEX_DEFAULT ) { } + inline wxCriticalSection::~wxCriticalSection() { } + + inline void wxCriticalSection::Enter() { (void)m_mutex.Lock(); } + inline bool wxCriticalSection::TryEnter() { return m_mutex.TryLock() == wxMUTEX_NO_ERROR; } + inline void wxCriticalSection::Leave() { (void)m_mutex.Unlock(); } +#endif // wxCRITSECT_IS_MUTEX + +#undef wxCRITSECT_INLINE +#undef wxCRITSECT_IS_MUTEX + +// wxCriticalSectionLocker is the same to critical sections as wxMutexLocker is +// to mutexes +class WXDLLIMPEXP_BASE wxCriticalSectionLocker +{ +public: + wxCriticalSectionLocker(wxCriticalSection& cs) + : m_critsect(cs) + { + m_critsect.Enter(); + } + + ~wxCriticalSectionLocker() + { + m_critsect.Leave(); + } + +private: + wxCriticalSection& m_critsect; + + wxDECLARE_NO_COPY_CLASS(wxCriticalSectionLocker); +}; + +// ---------------------------------------------------------------------------- +// wxCondition models a POSIX condition variable which allows one (or more) +// thread(s) to wait until some condition is fulfilled +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxCondition +{ +public: + // Each wxCondition object is associated with a (single) wxMutex object. + // The mutex object MUST be locked before calling Wait() + wxCondition(wxMutex& mutex); + + // dtor is not virtual, don't use this class polymorphically + ~wxCondition(); + + // return true if the condition has been created successfully + bool IsOk() const; + + // NB: the associated mutex MUST be locked beforehand by the calling thread + // + // it atomically releases the lock on the associated mutex + // and starts waiting to be woken up by a Signal()/Broadcast() + // once its signaled, then it will wait until it can reacquire + // the lock on the associated mutex object, before returning. + wxCondError Wait(); + + // std::condition_variable-like variant that evaluates the associated condition + template<typename Functor> + wxCondError Wait(const Functor& predicate) + { + while ( !predicate() ) + { + wxCondError e = Wait(); + if ( e != wxCOND_NO_ERROR ) + return e; + } + return wxCOND_NO_ERROR; + } + + // exactly as Wait() except that it may also return if the specified + // timeout elapses even if the condition hasn't been signalled: in this + // case, the return value is wxCOND_TIMEOUT, otherwise (i.e. in case of a + // normal return) it is wxCOND_NO_ERROR. + // + // the timeout parameter specifies an interval that needs to be waited for + // in milliseconds + wxCondError WaitTimeout(unsigned long milliseconds); + + // NB: the associated mutex may or may not be locked by the calling thread + // + // this method unblocks one thread if any are blocking on the condition. + // if no thread is blocking in Wait(), then the signal is NOT remembered + // The thread which was blocking on Wait() will then reacquire the lock + // on the associated mutex object before returning + wxCondError Signal(); + + // NB: the associated mutex may or may not be locked by the calling thread + // + // this method unblocks all threads if any are blocking on the condition. + // if no thread is blocking in Wait(), then the signal is NOT remembered + // The threads which were blocking on Wait() will then reacquire the lock + // on the associated mutex object before returning. + wxCondError Broadcast(); + + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated version, don't use + wxDEPRECATED( bool Wait(unsigned long milliseconds) ); +#endif // WXWIN_COMPATIBILITY_2_6 + +private: + wxConditionInternal *m_internal; + + wxDECLARE_NO_COPY_CLASS(wxCondition); +}; + +#if WXWIN_COMPATIBILITY_2_6 + inline bool wxCondition::Wait(unsigned long milliseconds) + { return WaitTimeout(milliseconds) == wxCOND_NO_ERROR; } +#endif // WXWIN_COMPATIBILITY_2_6 + +// ---------------------------------------------------------------------------- +// wxSemaphore: a counter limiting the number of threads concurrently accessing +// a shared resource +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxSemaphore +{ +public: + // specifying a maxcount of 0 actually makes wxSemaphore behave as if there + // is no upper limit, if maxcount is 1 the semaphore behaves as a mutex + wxSemaphore( int initialcount = 0, int maxcount = 0 ); + + // dtor is not virtual, don't use this class polymorphically + ~wxSemaphore(); + + // return true if the semaphore has been created successfully + bool IsOk() const; + + // wait indefinitely, until the semaphore count goes beyond 0 + // and then decrement it and return (this method might have been called + // Acquire()) + wxSemaError Wait(); + + // same as Wait(), but does not block, returns wxSEMA_NO_ERROR if + // successful and wxSEMA_BUSY if the count is currently zero + wxSemaError TryWait(); + + // same as Wait(), but as a timeout limit, returns wxSEMA_NO_ERROR if the + // semaphore was acquired and wxSEMA_TIMEOUT if the timeout has elapsed + wxSemaError WaitTimeout(unsigned long milliseconds); + + // increments the semaphore count and signals one of the waiting threads + wxSemaError Post(); + +private: + wxSemaphoreInternal *m_internal; + + wxDECLARE_NO_COPY_CLASS(wxSemaphore); +}; + +// ---------------------------------------------------------------------------- +// wxThread: class encapsulating a thread of execution +// ---------------------------------------------------------------------------- + +// there are two different kinds of threads: joinable and detached (default) +// ones. Only joinable threads can return a return code and only detached +// threads auto-delete themselves - the user should delete the joinable +// threads manually. + +// NB: in the function descriptions the words "this thread" mean the thread +// created by the wxThread object while "main thread" is the thread created +// during the process initialization (a.k.a. the GUI thread) + +// On VMS thread pointers are 64 bits (also needed for other systems??? +#ifdef __VMS + typedef unsigned long long wxThreadIdType; +#else + typedef unsigned long wxThreadIdType; +#endif + +class WXDLLIMPEXP_BASE wxThread +{ +public: + // the return type for the thread function + typedef void *ExitCode; + + // static functions + // Returns the wxThread object for the calling thread. NULL is returned + // if the caller is the main thread (but it's recommended to use + // IsMain() and only call This() for threads other than the main one + // because NULL is also returned on error). If the thread wasn't + // created with wxThread class, the returned value is undefined. + static wxThread *This(); + + // Returns true if current thread is the main thread. + // + // Notice that it also returns true if main thread id hadn't been + // initialized yet on the assumption that it's too early in wx startup + // process for any other threads to have been created in this case. + static bool IsMain() + { + return !ms_idMainThread || GetCurrentId() == ms_idMainThread; + } + + // Return the main thread id + static wxThreadIdType GetMainId() { return ms_idMainThread; } + + // Release the rest of our time slice letting the other threads run + static void Yield(); + + // Sleep during the specified period of time in milliseconds + // + // This is the same as wxMilliSleep(). + static void Sleep(unsigned long milliseconds); + + // get the number of system CPUs - useful with SetConcurrency() + // (the "best" value for it is usually number of CPUs + 1) + // + // Returns -1 if unknown, number of CPUs otherwise + static int GetCPUCount(); + + // Get the platform specific thread ID and return as a long. This + // can be used to uniquely identify threads, even if they are not + // wxThreads. This is used by wxPython. + static wxThreadIdType GetCurrentId(); + + // sets the concurrency level: this is, roughly, the number of threads + // the system tries to schedule to run in parallel. 0 means the + // default value (usually acceptable, but may not yield the best + // performance for this process) + // + // Returns true on success, false otherwise (if not implemented, for + // example) + static bool SetConcurrency(size_t level); + + // constructor only creates the C++ thread object and doesn't create (or + // start) the real thread + wxThread(wxThreadKind kind = wxTHREAD_DETACHED); + + // functions that change the thread state: all these can only be called + // from _another_ thread (typically the thread that created this one, e.g. + // the main thread), not from the thread itself + + // create a new thread and optionally set the stack size on + // platforms that support that - call Run() to start it + // (special cased for watcom which won't accept 0 default) + + wxThreadError Create(unsigned int stackSize = 0); + + // starts execution of the thread - from the moment Run() is called + // the execution of wxThread::Entry() may start at any moment, caller + // shouldn't suppose that it starts after (or before) Run() returns. + wxThreadError Run(); + + // stops the thread if it's running and deletes the wxThread object if + // this is a detached thread freeing its memory - otherwise (for + // joinable threads) you still need to delete wxThread object + // yourself. + // + // this function only works if the thread calls TestDestroy() + // periodically - the thread will only be deleted the next time it + // does it! + // + // will fill the rc pointer with the thread exit code if it's !NULL + wxThreadError Delete(ExitCode *rc = NULL, + wxThreadWait waitMode = wxTHREAD_WAIT_DEFAULT); + + // waits for a joinable thread to finish and returns its exit code + // + // Returns (ExitCode)-1 on error (for example, if the thread is not + // joinable) + ExitCode Wait(wxThreadWait waitMode = wxTHREAD_WAIT_DEFAULT); + + // kills the thread without giving it any chance to clean up - should + // not be used under normal circumstances, use Delete() instead. + // It is a dangerous function that should only be used in the most + // extreme cases! + // + // The wxThread object is deleted by Kill() if the thread is + // detachable, but you still have to delete it manually for joinable + // threads. + wxThreadError Kill(); + + // pause a running thread: as Delete(), this only works if the thread + // calls TestDestroy() regularly + wxThreadError Pause(); + + // resume a paused thread + wxThreadError Resume(); + + // priority + // Sets the priority to "prio" which must be in 0..100 range (see + // also wxPRIORITY_XXX constants). + // + // NB: the priority can only be set before the thread is created + void SetPriority(unsigned int prio); + + // Get the current priority. + unsigned int GetPriority() const; + + // thread status inquiries + // Returns true if the thread is alive: i.e. running or suspended + bool IsAlive() const; + // Returns true if the thread is running (not paused, not killed). + bool IsRunning() const; + // Returns true if the thread is suspended + bool IsPaused() const; + + // is the thread of detached kind? + bool IsDetached() const { return m_isDetached; } + + // Get the thread ID - a platform dependent number which uniquely + // identifies a thread inside a process + wxThreadIdType GetId() const; + + wxThreadKind GetKind() const + { return m_isDetached ? wxTHREAD_DETACHED : wxTHREAD_JOINABLE; } + + // Returns true if the thread was asked to terminate: this function should + // be called by the thread from time to time, otherwise the main thread + // will be left forever in Delete()! + virtual bool TestDestroy(); + + // dtor is public, but the detached threads should never be deleted - use + // Delete() instead (or leave the thread terminate by itself) + virtual ~wxThread(); + +protected: + // exits from the current thread - can be called only from this thread + void Exit(ExitCode exitcode = 0); + + // entry point for the thread - called by Run() and executes in the context + // of this thread. + virtual void *Entry() = 0; + + // use this to call the Entry() virtual method + void *CallEntry(); + + // Callbacks which may be overridden by the derived class to perform some + // specific actions when the thread is deleted or killed. By default they + // do nothing. + + // This one is called by Delete() before actually deleting the thread and + // is executed in the context of the thread that called Delete(). + virtual void OnDelete() {} + + // This one is called by Kill() before killing the thread and is executed + // in the context of the thread that called Kill(). + virtual void OnKill() {} + +private: + // no copy ctor/assignment operator + wxThread(const wxThread&); + wxThread& operator=(const wxThread&); + + // called when the thread exits - in the context of this thread + // + // NB: this function will not be called if the thread is Kill()ed + virtual void OnExit() { } + + friend class wxThreadInternal; + friend class wxThreadModule; + + + // the main thread identifier, should be set on startup + static wxThreadIdType ms_idMainThread; + + // the (platform-dependent) thread class implementation + wxThreadInternal *m_internal; + + // protects access to any methods of wxThreadInternal object + wxCriticalSection m_critsect; + + // true if the thread is detached, false if it is joinable + bool m_isDetached; +}; + +// wxThreadHelperThread class +// -------------------------- + +class WXDLLIMPEXP_BASE wxThreadHelperThread : public wxThread +{ +public: + // constructor only creates the C++ thread object and doesn't create (or + // start) the real thread + wxThreadHelperThread(wxThreadHelper& owner, wxThreadKind kind) + : wxThread(kind), m_owner(owner) + { } + +protected: + // entry point for the thread -- calls Entry() in owner. + virtual void *Entry(); + +private: + // the owner of the thread + wxThreadHelper& m_owner; + + // no copy ctor/assignment operator + wxThreadHelperThread(const wxThreadHelperThread&); + wxThreadHelperThread& operator=(const wxThreadHelperThread&); +}; + +// ---------------------------------------------------------------------------- +// wxThreadHelper: this class implements the threading logic to run a +// background task in another object (such as a window). It is a mix-in: just +// derive from it to implement a threading background task in your class. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxThreadHelper +{ +private: + void KillThread() + { + // If wxThreadHelperThread is detached and is about to finish, it will + // set m_thread to NULL so don't delete it then. + // But if KillThread is called before wxThreadHelperThread (in detached mode) + // sets it to NULL, then the thread object still exists and can be killed + wxCriticalSectionLocker locker(m_critSection); + + if ( m_thread ) + { + m_thread->Kill(); + + if ( m_kind == wxTHREAD_JOINABLE ) + delete m_thread; + + m_thread = NULL; + } + } + +public: + // constructor only initializes m_thread to NULL + wxThreadHelper(wxThreadKind kind = wxTHREAD_JOINABLE) + : m_thread(NULL), m_kind(kind) { } + + // destructor deletes m_thread + virtual ~wxThreadHelper() { KillThread(); } + +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED( wxThreadError Create(unsigned int stackSize = 0) ); +#endif + + // create a new thread (and optionally set the stack size on platforms that + // support/need that), call Run() to start it + wxThreadError CreateThread(wxThreadKind kind = wxTHREAD_JOINABLE, + unsigned int stackSize = 0) + { + KillThread(); + + m_kind = kind; + m_thread = new wxThreadHelperThread(*this, m_kind); + + return m_thread->Create(stackSize); + } + + // entry point for the thread - called by Run() and executes in the context + // of this thread. + virtual void *Entry() = 0; + + // returns a pointer to the thread which can be used to call Run() + wxThread *GetThread() const + { + wxCriticalSectionLocker locker((wxCriticalSection&)m_critSection); + + wxThread* thread = m_thread; + + return thread; + } + +protected: + wxThread *m_thread; + wxThreadKind m_kind; + wxCriticalSection m_critSection; // To guard the m_thread variable + + friend class wxThreadHelperThread; +}; + +#if WXWIN_COMPATIBILITY_2_8 +inline wxThreadError wxThreadHelper::Create(unsigned int stackSize) +{ return CreateThread(m_kind, stackSize); } +#endif + +// call Entry() in owner, put it down here to avoid circular declarations +inline void *wxThreadHelperThread::Entry() +{ + void * const result = m_owner.Entry(); + + wxCriticalSectionLocker locker(m_owner.m_critSection); + + // Detached thread will be deleted after returning, so make sure + // wxThreadHelper::GetThread will not return an invalid pointer. + // And that wxThreadHelper::KillThread will not try to kill + // an already deleted thread + if ( m_owner.m_kind == wxTHREAD_DETACHED ) + m_owner.m_thread = NULL; + + return result; +} + +// ---------------------------------------------------------------------------- +// Automatic initialization +// ---------------------------------------------------------------------------- + +// GUI mutex handling. +void WXDLLIMPEXP_BASE wxMutexGuiEnter(); +void WXDLLIMPEXP_BASE wxMutexGuiLeave(); + +// macros for entering/leaving critical sections which may be used without +// having to take them inside "#if wxUSE_THREADS" +#define wxENTER_CRIT_SECT(cs) (cs).Enter() +#define wxLEAVE_CRIT_SECT(cs) (cs).Leave() +#define wxCRIT_SECT_DECLARE(cs) static wxCriticalSection cs +#define wxCRIT_SECT_DECLARE_MEMBER(cs) wxCriticalSection cs +#define wxCRIT_SECT_LOCKER(name, cs) wxCriticalSectionLocker name(cs) + +// function for checking if we're in the main thread which may be used whether +// wxUSE_THREADS is 0 or 1 +inline bool wxIsMainThread() { return wxThread::IsMain(); } + +#else // !wxUSE_THREADS + +// no thread support +inline void wxMutexGuiEnter() { } +inline void wxMutexGuiLeave() { } + +// macros for entering/leaving critical sections which may be used without +// having to take them inside "#if wxUSE_THREADS" +// (the implementation uses dummy structs to force semicolon after the macro; +// also notice that Watcom doesn't like declaring a struct as a member so we +// need to actually define it in wxCRIT_SECT_DECLARE_MEMBER) +#define wxENTER_CRIT_SECT(cs) do {} while (0) +#define wxLEAVE_CRIT_SECT(cs) do {} while (0) +#define wxCRIT_SECT_DECLARE(cs) struct wxDummyCS##cs +#define wxCRIT_SECT_DECLARE_MEMBER(cs) struct wxDummyCSMember##cs { } +#define wxCRIT_SECT_LOCKER(name, cs) struct wxDummyCSLocker##name + +// if there is only one thread, it is always the main one +inline bool wxIsMainThread() { return true; } + +#endif // wxUSE_THREADS/!wxUSE_THREADS + +// mark part of code as being a critical section: this macro declares a +// critical section with the given name and enters it immediately and leaves +// it at the end of the current scope +// +// example: +// +// int Count() +// { +// static int s_counter = 0; +// +// wxCRITICAL_SECTION(counter); +// +// return ++s_counter; +// } +// +// this function is MT-safe in presence of the threads but there is no +// overhead when the library is compiled without threads +#define wxCRITICAL_SECTION(name) \ + wxCRIT_SECT_DECLARE(s_cs##name); \ + wxCRIT_SECT_LOCKER(cs##name##Locker, s_cs##name) + +// automatically lock GUI mutex in ctor and unlock it in dtor +class WXDLLIMPEXP_BASE wxMutexGuiLocker +{ +public: + wxMutexGuiLocker() { wxMutexGuiEnter(); } + ~wxMutexGuiLocker() { wxMutexGuiLeave(); } +}; + +// ----------------------------------------------------------------------------- +// implementation only until the end of file +// ----------------------------------------------------------------------------- + +#if wxUSE_THREADS + +#if defined(__WINDOWS__) || defined(__OS2__) || defined(__EMX__) || defined(__DARWIN__) + // unlock GUI if there are threads waiting for and lock it back when + // there are no more of them - should be called periodically by the main + // thread + extern void WXDLLIMPEXP_BASE wxMutexGuiLeaveOrEnter(); + + // returns true if the main thread has GUI lock + extern bool WXDLLIMPEXP_BASE wxGuiOwnedByMainThread(); + + // wakes up the main thread if it's sleeping inside ::GetMessage() + extern void WXDLLIMPEXP_BASE wxWakeUpMainThread(); + +#ifndef __DARWIN__ + // return true if the main thread is waiting for some other to terminate: + // wxApp then should block all "dangerous" messages + extern bool WXDLLIMPEXP_BASE wxIsWaitingForThread(); +#endif +#endif // MSW, OS/2 + +#endif // wxUSE_THREADS + +#endif // _WX_THREAD_H_ diff --git a/wxmsw/include/wx-3.0/wx/thrimpl.cpp b/wxmsw/include/wx-3.0/wx/thrimpl.cpp new file mode 100644 index 00000000..000b24d5 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/thrimpl.cpp @@ -0,0 +1,357 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/thrimpl.cpp +// Purpose: common part of wxThread Implementations +// Author: Vadim Zeitlin +// Modified by: +// Created: 04.06.02 (extracted from src/*/thread.cpp files) +// Copyright: (c) Vadim Zeitlin (2002) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// this file is supposed to be included only by the various thread.cpp + +// ---------------------------------------------------------------------------- +// wxMutex +// ---------------------------------------------------------------------------- + +wxMutex::wxMutex(wxMutexType mutexType) +{ + m_internal = new wxMutexInternal(mutexType); + + if ( !m_internal->IsOk() ) + { + delete m_internal; + m_internal = NULL; + } +} + +wxMutex::~wxMutex() +{ + delete m_internal; +} + +bool wxMutex::IsOk() const +{ + return m_internal != NULL; +} + +wxMutexError wxMutex::Lock() +{ + wxCHECK_MSG( m_internal, wxMUTEX_INVALID, + wxT("wxMutex::Lock(): not initialized") ); + + return m_internal->Lock(); +} + +wxMutexError wxMutex::LockTimeout(unsigned long ms) +{ + wxCHECK_MSG( m_internal, wxMUTEX_INVALID, + wxT("wxMutex::Lock(): not initialized") ); + + return m_internal->Lock(ms); +} + +wxMutexError wxMutex::TryLock() +{ + wxCHECK_MSG( m_internal, wxMUTEX_INVALID, + wxT("wxMutex::TryLock(): not initialized") ); + + return m_internal->TryLock(); +} + +wxMutexError wxMutex::Unlock() +{ + wxCHECK_MSG( m_internal, wxMUTEX_INVALID, + wxT("wxMutex::Unlock(): not initialized") ); + + return m_internal->Unlock(); +} + +// -------------------------------------------------------------------------- +// wxConditionInternal +// -------------------------------------------------------------------------- + +// Win32 and OS/2 don't have explicit support for the POSIX condition +// variables and their events/event semaphores have quite different semantics, +// so we reimplement the conditions from scratch using the mutexes and +// semaphores +#if defined(__WINDOWS__) || defined(__OS2__) || defined(__EMX__) + +class wxConditionInternal +{ +public: + wxConditionInternal(wxMutex& mutex); + + bool IsOk() const { return m_mutex.IsOk() && m_semaphore.IsOk(); } + + wxCondError Wait(); + wxCondError WaitTimeout(unsigned long milliseconds); + + wxCondError Signal(); + wxCondError Broadcast(); + +private: + // the number of threads currently waiting for this condition + LONG m_numWaiters; + + // the critical section protecting m_numWaiters + wxCriticalSection m_csWaiters; + + wxMutex& m_mutex; + wxSemaphore m_semaphore; + + wxDECLARE_NO_COPY_CLASS(wxConditionInternal); +}; + +wxConditionInternal::wxConditionInternal(wxMutex& mutex) + : m_mutex(mutex) +{ + // another thread can't access it until we return from ctor, so no need to + // protect access to m_numWaiters here + m_numWaiters = 0; +} + +wxCondError wxConditionInternal::Wait() +{ + // increment the number of waiters + { + wxCriticalSectionLocker lock(m_csWaiters); + m_numWaiters++; + } + + m_mutex.Unlock(); + + // after unlocking the mutex other threads may Signal() us, but it is ok + // now as we had already incremented m_numWaiters so Signal() will post the + // semaphore and decrement m_numWaiters back even if it is called before we + // start to Wait() + const wxSemaError err = m_semaphore.Wait(); + + m_mutex.Lock(); + + if ( err == wxSEMA_NO_ERROR ) + { + // m_numWaiters was decremented by Signal() + return wxCOND_NO_ERROR; + } + + // but in case of an error we need to do it manually + { + wxCriticalSectionLocker lock(m_csWaiters); + m_numWaiters--; + } + + return err == wxSEMA_TIMEOUT ? wxCOND_TIMEOUT : wxCOND_MISC_ERROR; +} + +wxCondError wxConditionInternal::WaitTimeout(unsigned long milliseconds) +{ + { + wxCriticalSectionLocker lock(m_csWaiters); + m_numWaiters++; + } + + m_mutex.Unlock(); + + wxSemaError err = m_semaphore.WaitTimeout(milliseconds); + + m_mutex.Lock(); + + if ( err == wxSEMA_NO_ERROR ) + return wxCOND_NO_ERROR; + + if ( err == wxSEMA_TIMEOUT ) + { + // a potential race condition exists here: it happens when a waiting + // thread times out but doesn't have time to decrement m_numWaiters yet + // before Signal() is called in another thread + // + // to handle this particular case, check the semaphore again after + // acquiring m_csWaiters lock -- this will catch the signals missed + // during this window + wxCriticalSectionLocker lock(m_csWaiters); + + err = m_semaphore.WaitTimeout(0); + if ( err == wxSEMA_NO_ERROR ) + return wxCOND_NO_ERROR; + + // we need to decrement m_numWaiters ourselves as it wasn't done by + // Signal() + m_numWaiters--; + + return err == wxSEMA_TIMEOUT ? wxCOND_TIMEOUT : wxCOND_MISC_ERROR; + } + + // undo m_numWaiters++ above in case of an error + { + wxCriticalSectionLocker lock(m_csWaiters); + m_numWaiters--; + } + + return wxCOND_MISC_ERROR; +} + +wxCondError wxConditionInternal::Signal() +{ + wxCriticalSectionLocker lock(m_csWaiters); + + if ( m_numWaiters > 0 ) + { + // increment the semaphore by 1 + if ( m_semaphore.Post() != wxSEMA_NO_ERROR ) + return wxCOND_MISC_ERROR; + + m_numWaiters--; + } + + return wxCOND_NO_ERROR; +} + +wxCondError wxConditionInternal::Broadcast() +{ + wxCriticalSectionLocker lock(m_csWaiters); + + while ( m_numWaiters > 0 ) + { + if ( m_semaphore.Post() != wxSEMA_NO_ERROR ) + return wxCOND_MISC_ERROR; + + m_numWaiters--; + } + + return wxCOND_NO_ERROR; +} + +#endif // __WINDOWS__ || __OS2__ || __EMX__ + +// ---------------------------------------------------------------------------- +// wxCondition +// ---------------------------------------------------------------------------- + +wxCondition::wxCondition(wxMutex& mutex) +{ + m_internal = new wxConditionInternal(mutex); + + if ( !m_internal->IsOk() ) + { + delete m_internal; + m_internal = NULL; + } +} + +wxCondition::~wxCondition() +{ + delete m_internal; +} + +bool wxCondition::IsOk() const +{ + return m_internal != NULL; +} + +wxCondError wxCondition::Wait() +{ + wxCHECK_MSG( m_internal, wxCOND_INVALID, + wxT("wxCondition::Wait(): not initialized") ); + + return m_internal->Wait(); +} + +wxCondError wxCondition::WaitTimeout(unsigned long milliseconds) +{ + wxCHECK_MSG( m_internal, wxCOND_INVALID, + wxT("wxCondition::Wait(): not initialized") ); + + return m_internal->WaitTimeout(milliseconds); +} + +wxCondError wxCondition::Signal() +{ + wxCHECK_MSG( m_internal, wxCOND_INVALID, + wxT("wxCondition::Signal(): not initialized") ); + + return m_internal->Signal(); +} + +wxCondError wxCondition::Broadcast() +{ + wxCHECK_MSG( m_internal, wxCOND_INVALID, + wxT("wxCondition::Broadcast(): not initialized") ); + + return m_internal->Broadcast(); +} + +// -------------------------------------------------------------------------- +// wxSemaphore +// -------------------------------------------------------------------------- + +wxSemaphore::wxSemaphore(int initialcount, int maxcount) +{ + m_internal = new wxSemaphoreInternal( initialcount, maxcount ); + if ( !m_internal->IsOk() ) + { + delete m_internal; + m_internal = NULL; + } +} + +wxSemaphore::~wxSemaphore() +{ + delete m_internal; +} + +bool wxSemaphore::IsOk() const +{ + return m_internal != NULL; +} + +wxSemaError wxSemaphore::Wait() +{ + wxCHECK_MSG( m_internal, wxSEMA_INVALID, + wxT("wxSemaphore::Wait(): not initialized") ); + + return m_internal->Wait(); +} + +wxSemaError wxSemaphore::TryWait() +{ + wxCHECK_MSG( m_internal, wxSEMA_INVALID, + wxT("wxSemaphore::TryWait(): not initialized") ); + + return m_internal->TryWait(); +} + +wxSemaError wxSemaphore::WaitTimeout(unsigned long milliseconds) +{ + wxCHECK_MSG( m_internal, wxSEMA_INVALID, + wxT("wxSemaphore::WaitTimeout(): not initialized") ); + + return m_internal->WaitTimeout(milliseconds); +} + +wxSemaError wxSemaphore::Post() +{ + wxCHECK_MSG( m_internal, wxSEMA_INVALID, + wxT("wxSemaphore::Post(): not initialized") ); + + return m_internal->Post(); +} + +// ---------------------------------------------------------------------------- +// wxThread +// ---------------------------------------------------------------------------- + +#include "wx/utils.h" +#include "wx/private/threadinfo.h" +#include "wx/scopeguard.h" + +void wxThread::Sleep(unsigned long milliseconds) +{ + wxMilliSleep(milliseconds); +} + +void *wxThread::CallEntry() +{ + wxON_BLOCK_EXIT0(wxThreadSpecificInfo::ThreadCleanUp); + return Entry(); +} diff --git a/wxmsw/include/wx-3.0/wx/time.h b/wxmsw/include/wx-3.0/wx/time.h new file mode 100644 index 00000000..64442239 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/time.h @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/time.h +// Purpose: Miscellaneous time-related functions. +// Author: Vadim Zeitlin +// Created: 2011-11-26 +// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TIME_H_ +#define _WX_TIME_H_ + +#include "wx/longlong.h" + +// Returns the difference between UTC and local time in seconds. +WXDLLIMPEXP_BASE int wxGetTimeZone(); + +// Get number of seconds since local time 00:00:00 Jan 1st 1970. +extern long WXDLLIMPEXP_BASE wxGetLocalTime(); + +// Get number of seconds since GMT 00:00:00, Jan 1st 1970. +extern long WXDLLIMPEXP_BASE wxGetUTCTime(); + +#if wxUSE_LONGLONG + typedef wxLongLong wxMilliClock_t; + inline long wxMilliClockToLong(wxLongLong ll) { return ll.ToLong(); } +#else + typedef double wxMilliClock_t; + inline long wxMilliClockToLong(double d) { return wx_truncate_cast(long, d); } +#endif // wxUSE_LONGLONG + +// Get number of milliseconds since local time 00:00:00 Jan 1st 1970 +extern wxMilliClock_t WXDLLIMPEXP_BASE wxGetLocalTimeMillis(); + +#if wxUSE_LONGLONG + +// Get the number of milliseconds or microseconds since the Epoch. +wxLongLong WXDLLIMPEXP_BASE wxGetUTCTimeMillis(); +wxLongLong WXDLLIMPEXP_BASE wxGetUTCTimeUSec(); + +#endif // wxUSE_LONGLONG + +#define wxGetCurrentTime() wxGetLocalTime() + +// on some really old systems gettimeofday() doesn't have the second argument, +// define wxGetTimeOfDay() to hide this difference +#ifdef HAVE_GETTIMEOFDAY + #ifdef WX_GETTIMEOFDAY_NO_TZ + #define wxGetTimeOfDay(tv) gettimeofday(tv) + #else + #define wxGetTimeOfDay(tv) gettimeofday((tv), NULL) + #endif +#endif // HAVE_GETTIMEOFDAY + +/* Two wrapper functions for thread safety */ +#ifdef HAVE_LOCALTIME_R +#define wxLocaltime_r localtime_r +#else +WXDLLIMPEXP_BASE struct tm *wxLocaltime_r(const time_t*, struct tm*); +#if wxUSE_THREADS && !defined(__WINDOWS__) && !defined(__WATCOMC__) + // On Windows, localtime _is_ threadsafe! +#warning using pseudo thread-safe wrapper for localtime to emulate localtime_r +#endif +#endif + +#ifdef HAVE_GMTIME_R +#define wxGmtime_r gmtime_r +#else +WXDLLIMPEXP_BASE struct tm *wxGmtime_r(const time_t*, struct tm*); +#if wxUSE_THREADS && !defined(__WINDOWS__) && !defined(__WATCOMC__) + // On Windows, gmtime _is_ threadsafe! +#warning using pseudo thread-safe wrapper for gmtime to emulate gmtime_r +#endif +#endif + +#endif // _WX_TIME_H_ diff --git a/wxmsw/include/wx-3.0/wx/timectrl.h b/wxmsw/include/wx-3.0/wx/timectrl.h new file mode 100644 index 00000000..928d9aed --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/timectrl.h @@ -0,0 +1,124 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/timectrl.h +// Purpose: Declaration of wxTimePickerCtrl class. +// Author: Vadim Zeitlin +// Created: 2011-09-22 +// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TIMECTRL_H_ +#define _WX_TIMECTRL_H_ + +#include "wx/defs.h" + +#if wxUSE_TIMEPICKCTRL + +#include "wx/datetimectrl.h" + +#define wxTimePickerCtrlNameStr wxS("timectrl") + +// No special styles are currently defined for this control but still define a +// symbolic constant for the default style for consistency. +enum +{ + wxTP_DEFAULT = 0 +}; + +// ---------------------------------------------------------------------------- +// wxTimePickerCtrl: Allow the user to enter the time. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxTimePickerCtrlBase : public wxDateTimePickerCtrl +{ +public: + /* + The derived classes should implement ctor and Create() method with the + following signature: + + bool Create(wxWindow *parent, + wxWindowID id, + const wxDateTime& dt = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTP_DEFAULT, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxTimePickerCtrlNameStr); + */ + + /* + We also inherit Set/GetValue() methods from the base class which define + our public API. Notice that the date portion of the date passed as + input or received as output is or should be ignored, only the time part + of wxDateTime objects is really significant here. Use Set/GetTime() + below for possibly simpler interface. + */ + + // Set the given time. + bool SetTime(int hour, int min, int sec) + { + // Notice that we should use a date on which DST doesn't change to + // avoid any problems with time discontinuity so use a fixed date (on + // which nobody changes DST) instead of e.g. today. + wxDateTime dt(1, wxDateTime::Jan, 2012, hour, min, sec); + if ( !dt.IsValid() ) + { + // No need to assert here, wxDateTime already does it for us. + return false; + } + + SetValue(dt); + + return true; + } + + // Get the current time components. All pointers must be non-NULL. + bool GetTime(int* hour, int* min, int* sec) const + { + wxCHECK_MSG( hour && min && sec, false, + wxS("Time component pointers must be non-NULL") ); + + const wxDateTime::Tm tm = GetValue().GetTm(); + *hour = tm.hour; + *min = tm.min; + *sec = tm.sec; + + return true; + } +}; + +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + #include "wx/msw/timectrl.h" + + #define wxHAS_NATIVE_TIMEPICKERCTRL +#elif defined(__WXOSX_COCOA__) && !defined(__WXUNIVERSAL__) + #include "wx/osx/timectrl.h" + + #define wxHAS_NATIVE_TIMEPICKERCTRL +#else + #include "wx/generic/timectrl.h" + + class WXDLLIMPEXP_ADV wxTimePickerCtrl : public wxTimePickerCtrlGeneric + { + public: + wxTimePickerCtrl() { } + wxTimePickerCtrl(wxWindow *parent, + wxWindowID id, + const wxDateTime& date = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTP_DEFAULT, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxTimePickerCtrlNameStr) + : wxTimePickerCtrlGeneric(parent, id, date, pos, size, style, validator, name) + { + } + + private: + wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxTimePickerCtrl); + }; +#endif + +#endif // wxUSE_TIMEPICKCTRL + +#endif // _WX_TIMECTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/timer.h b/wxmsw/include/wx-3.0/wx/timer.h new file mode 100644 index 00000000..8ee5684e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/timer.h @@ -0,0 +1,196 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/timer.h +// Purpose: wxTimer, wxStopWatch and global time-related functions +// Author: Julian Smart +// Modified by: Vadim Zeitlin (wxTimerBase) +// Guillermo Rodriguez (global clean up) +// Created: 04/01/98 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TIMER_H_BASE_ +#define _WX_TIMER_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_TIMER + +#include "wx/object.h" +#include "wx/longlong.h" +#include "wx/event.h" +#include "wx/stopwatch.h" // for backwards compatibility +#include "wx/utils.h" + + +// more readable flags for Start(): + +// generate notifications periodically until the timer is stopped (default) +#define wxTIMER_CONTINUOUS false + +// only send the notification once and then stop the timer +#define wxTIMER_ONE_SHOT true + +class WXDLLIMPEXP_FWD_BASE wxTimerImpl; +class WXDLLIMPEXP_FWD_BASE wxTimerEvent; + +// timer event type +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_BASE, wxEVT_TIMER, wxTimerEvent); + +// the interface of wxTimer class +class WXDLLIMPEXP_BASE wxTimer : public wxEvtHandler +{ +public: + // ctors and initializers + // ---------------------- + + // default: if you don't call SetOwner(), your only chance to get timer + // notifications is to override Notify() in the derived class + wxTimer() + { + Init(); + SetOwner(this); + } + + // ctor which allows to avoid having to override Notify() in the derived + // class: the owner will get timer notifications which can be handled with + // EVT_TIMER + wxTimer(wxEvtHandler *owner, int timerid = wxID_ANY) + { + Init(); + SetOwner(owner, timerid); + } + + // same as ctor above + void SetOwner(wxEvtHandler *owner, int timerid = wxID_ANY); + + virtual ~wxTimer(); + + + // working with the timer + // ---------------------- + + // NB: Start() and Stop() are not supposed to be overridden, they are only + // virtual for historical reasons, only Notify() can be overridden + + // start the timer: if milliseconds == -1, use the same value as for the + // last Start() + // + // it is now valid to call Start() multiple times: this just restarts the + // timer if it is already running + virtual bool Start(int milliseconds = -1, bool oneShot = false); + + // start the timer for one iteration only, this is just a simple wrapper + // for Start() + bool StartOnce(int milliseconds = -1) { return Start(milliseconds, true); } + + // stop the timer, does nothing if the timer is not running + virtual void Stop(); + + // override this in your wxTimer-derived class if you want to process timer + // messages in it, use non default ctor or SetOwner() otherwise + virtual void Notify(); + + + // accessors + // --------- + + // get the object notified about the timer events + wxEvtHandler *GetOwner() const; + + // return true if the timer is running + bool IsRunning() const; + + // return the timer ID + int GetId() const; + + // get the (last) timer interval in milliseconds + int GetInterval() const; + + // return true if the timer is one shot + bool IsOneShot() const; + +protected: + // common part of all ctors + void Init(); + + wxTimerImpl *m_impl; + + wxDECLARE_NO_COPY_CLASS(wxTimer); +}; + +// ---------------------------------------------------------------------------- +// wxTimerRunner: starts the timer in its ctor, stops in the dtor +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxTimerRunner +{ +public: + wxTimerRunner(wxTimer& timer) : m_timer(timer) { } + wxTimerRunner(wxTimer& timer, int milli, bool oneShot = false) + : m_timer(timer) + { + m_timer.Start(milli, oneShot); + } + + void Start(int milli, bool oneShot = false) + { + m_timer.Start(milli, oneShot); + } + + ~wxTimerRunner() + { + if ( m_timer.IsRunning() ) + { + m_timer.Stop(); + } + } + +private: + wxTimer& m_timer; + + wxDECLARE_NO_COPY_CLASS(wxTimerRunner); +}; + +// ---------------------------------------------------------------------------- +// wxTimerEvent +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxTimerEvent : public wxEvent +{ +public: + wxTimerEvent() + : wxEvent(wxID_ANY, wxEVT_TIMER) { m_timer=NULL; } + + wxTimerEvent(wxTimer& timer) + : wxEvent(timer.GetId(), wxEVT_TIMER), + m_timer(&timer) + { + SetEventObject(timer.GetOwner()); + } + + // accessors + int GetInterval() const { return m_timer->GetInterval(); } + wxTimer& GetTimer() const { return *m_timer; } + + // implement the base class pure virtual + virtual wxEvent *Clone() const { return new wxTimerEvent(*this); } + virtual wxEventCategory GetEventCategory() const { return wxEVT_CATEGORY_TIMER; } + +private: + wxTimer* m_timer; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxTimerEvent) +}; + +typedef void (wxEvtHandler::*wxTimerEventFunction)(wxTimerEvent&); + +#define wxTimerEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxTimerEventFunction, func) + +#define EVT_TIMER(timerid, func) \ + wx__DECLARE_EVT1(wxEVT_TIMER, timerid, wxTimerEventHandler(func)) + +#endif // wxUSE_TIMER + +#endif // _WX_TIMER_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/tipdlg.h b/wxmsw/include/wx-3.0/wx/tipdlg.h new file mode 100644 index 00000000..e0093855 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/tipdlg.h @@ -0,0 +1,85 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/tipdlg.h +// Purpose: declaration of wxTipDialog +// Author: Vadim Zeitlin +// Modified by: +// Created: 28.06.99 +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TIPDLG_H_ +#define _WX_TIPDLG_H_ + +// ---------------------------------------------------------------------------- +// headers which we must include here +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_STARTUP_TIPS + +#include "wx/textfile.h" + +// ---------------------------------------------------------------------------- +// wxTipProvider - a class which is used by wxTipDialog to get the text of the +// tips +// ---------------------------------------------------------------------------- + +// the abstract base class: it provides the tips, i.e. implements the GetTip() +// function which returns the new tip each time it's called. To support this, +// wxTipProvider evidently needs some internal state which is the tip "index" +// and which should be saved/restored by the program to not always show one and +// the same tip (of course, you may use random starting position as well...) +class WXDLLIMPEXP_ADV wxTipProvider +{ +public: + wxTipProvider(size_t currentTip) { m_currentTip = currentTip; } + + // get the current tip and update the internal state to return the next tip + // when called for the next time + virtual wxString GetTip() = 0; + + // get the current tip "index" (or whatever allows the tip provider to know + // from where to start the next time) + size_t GetCurrentTip() const { return m_currentTip; } + + // Allows any user-derived class to optionally override this function to + // modify the tip as soon as it is read. If return wxEmptyString, then + // the tip is skipped, and the next one is read. + virtual wxString PreprocessTip(const wxString& tip) { return tip; } + + // virtual dtor for the base class + virtual ~wxTipProvider() { } + +protected: + size_t m_currentTip; +}; + +// a function which returns an implementation of wxTipProvider using the +// specified text file as the source of tips (each line is a tip). +// +// NB: the caller is responsible for deleting the pointer! +#if wxUSE_TEXTFILE +WXDLLIMPEXP_ADV wxTipProvider *wxCreateFileTipProvider(const wxString& filename, + size_t currentTip); +#endif // wxUSE_TEXTFILE + +// ---------------------------------------------------------------------------- +// wxTipDialog +// ---------------------------------------------------------------------------- + +// A dialog which shows a "tip" - a short and helpful messages describing to +// the user some program characteristic. Many programs show the tips at +// startup, so the dialog has "Show tips on startup" checkbox which allows to +// the user to disable this (however, it's the program which should show, or +// not, the dialog on startup depending on its value, not this class). +// +// The function returns true if this checkbox is checked, false otherwise. +WXDLLIMPEXP_ADV bool wxShowTip(wxWindow *parent, + wxTipProvider *tipProvider, + bool showAtStartup = true); + +#endif // wxUSE_STARTUP_TIPS + +#endif // _WX_TIPDLG_H_ diff --git a/wxmsw/include/wx-3.0/wx/tipwin.h b/wxmsw/include/wx-3.0/wx/tipwin.h new file mode 100644 index 00000000..a2ca0f13 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/tipwin.h @@ -0,0 +1,97 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/tipwin.h +// Purpose: wxTipWindow is a window like the one typically used for +// showing the tooltips +// Author: Vadim Zeitlin +// Modified by: +// Created: 10.09.00 +// Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TIPWIN_H_ +#define _WX_TIPWIN_H_ + +#if wxUSE_TIPWINDOW + +#if wxUSE_POPUPWIN + #include "wx/popupwin.h" + + #define wxTipWindowBase wxPopupTransientWindow +#else + #include "wx/frame.h" + + #define wxTipWindowBase wxFrame +#endif +#include "wx/arrstr.h" + +class WXDLLIMPEXP_FWD_CORE wxTipWindowView; + +// ---------------------------------------------------------------------------- +// wxTipWindow +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTipWindow : public wxTipWindowBase +{ +public: + // the mandatory ctor parameters are: the parent window and the text to + // show + // + // optionally you may also specify the length at which the lines are going + // to be broken in rows (100 pixels by default) + // + // windowPtr and rectBound are just passed to SetTipWindowPtr() and + // SetBoundingRect() - see below + wxTipWindow(wxWindow *parent, + const wxString& text, + wxCoord maxLength = 100, + wxTipWindow** windowPtr = NULL, + wxRect *rectBound = NULL); + + virtual ~wxTipWindow(); + + // If windowPtr is not NULL the given address will be NULLed when the + // window has closed + void SetTipWindowPtr(wxTipWindow** windowPtr) { m_windowPtr = windowPtr; } + + // If rectBound is not NULL, the window will disappear automatically when + // the mouse leave the specified rect: note that rectBound should be in the + // screen coordinates! + void SetBoundingRect(const wxRect& rectBound); + + // Hide and destroy the window + void Close(); + +protected: + // called by wxTipWindowView only + bool CheckMouseInBounds(const wxPoint& pos); + + // event handlers + void OnMouseClick(wxMouseEvent& event); + +#if !wxUSE_POPUPWIN + void OnActivate(wxActivateEvent& event); + void OnKillFocus(wxFocusEvent& event); +#else // wxUSE_POPUPWIN + virtual void OnDismiss(); +#endif // wxUSE_POPUPWIN/!wxUSE_POPUPWIN + +private: + wxArrayString m_textLines; + wxCoord m_heightLine; + + wxTipWindowView *m_view; + + wxTipWindow** m_windowPtr; + wxRect m_rectBound; + + DECLARE_EVENT_TABLE() + + friend class wxTipWindowView; + + wxDECLARE_NO_COPY_CLASS(wxTipWindow); +}; + +#endif // wxUSE_TIPWINDOW + +#endif // _WX_TIPWIN_H_ diff --git a/wxmsw/include/wx-3.0/wx/tls.h b/wxmsw/include/wx-3.0/wx/tls.h new file mode 100644 index 00000000..6a4ee037 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/tls.h @@ -0,0 +1,143 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/tls.h +// Purpose: Implementation of thread local storage +// Author: Vadim Zeitlin +// Created: 2008-08-08 +// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TLS_H_ +#define _WX_TLS_H_ + +#include "wx/defs.h" + +// ---------------------------------------------------------------------------- +// check for compiler support of thread-specific variables +// ---------------------------------------------------------------------------- + +// when not using threads at all, there is no need for thread-specific +// values to be really thread-specific +#if !wxUSE_THREADS + #define wxHAS_COMPILER_TLS + #define wxTHREAD_SPECIFIC_DECL +// otherwise try to find the compiler-specific way to handle TLS unless +// explicitly disabled by setting wxUSE_COMPILER_TLS to 0 (it is 1 by default). +#elif wxUSE_COMPILER_TLS +// __thread keyword is not supported correctly by MinGW, at least in some +// configurations, see http://sourceforge.net/support/tracker.php?aid=2837047 +// and when in doubt we prefer to not use it at all. +#if defined(HAVE___THREAD_KEYWORD) && !defined(__MINGW32__) + #define wxHAS_COMPILER_TLS + #define wxTHREAD_SPECIFIC_DECL __thread +// MSVC has its own version which might be supported by some other Windows +// compilers, to be tested +#elif wxCHECK_VISUALC_VERSION(7) + #define wxHAS_COMPILER_TLS + #define wxTHREAD_SPECIFIC_DECL __declspec(thread) +#endif // compilers +#endif // wxUSE_COMPILER_TLS + +// ---------------------------------------------------------------------------- +// define wxTLS_TYPE() +// ---------------------------------------------------------------------------- + +#ifdef wxHAS_COMPILER_TLS + #define wxTLS_TYPE(T) wxTHREAD_SPECIFIC_DECL T + #define wxTLS_PTR(var) (&(var)) + #define wxTLS_VALUE(var) (var) +#else // !wxHAS_COMPILER_TLS + + extern "C" + { + typedef void (*wxTlsDestructorFunction)(void*); + } + + #if defined(__WINDOWS__) + #include "wx/msw/tls.h" + #elif defined(__OS2__) + #include "wx/os2/tls.h" + #elif defined(__UNIX__) + #include "wx/unix/tls.h" + #else + // TODO: we could emulate TLS for such platforms... + #error Neither compiler nor OS support thread-specific variables. + #endif + + #include <stdlib.h> // for calloc() + + // wxTlsValue<T> represents a thread-specific value of type T but, unlike + // with native compiler thread-specific variables, it behaves like a + // (never NULL) pointer to T and so needs to be dereferenced before use + // + // Note: T must be a POD! + // + // Note: On Unix, thread-specific T value is freed when the thread exits. + // On Windows, thread-specific values are freed later, when given + // wxTlsValue<T> is destroyed. The only exception to this is the + // value for the main thread, which is always freed when + // wxTlsValue<T> is destroyed. + template <typename T> + class wxTlsValue + { + public: + typedef T ValueType; + + // ctor doesn't do anything, the object is created on first access + wxTlsValue() : m_key(free) {} + + // dtor is only called in the main thread context and so is not enough + // to free memory allocated by us for the other threads, we use + // destructor function when using Pthreads for this (which is not + // called for the main thread as it doesn't call pthread_exit() but + // just to be safe we also reset the key anyhow) + ~wxTlsValue() + { + if ( m_key.Get() ) + m_key.Set(NULL); // this deletes the value + } + + // access the object creating it on demand + ValueType *Get() + { + void *value = m_key.Get(); + if ( !value ) + { + // ValueType must be POD to be used in wxHAS_COMPILER_TLS case + // anyhow (at least gcc doesn't accept non-POD values being + // declared with __thread) so initialize it as a POD too + value = calloc(1, sizeof(ValueType)); + + if ( !m_key.Set(value) ) + { + free(value); + + // this will probably result in a crash in the caller but + // it's arguably better to crash immediately instead of + // slowly dying from out-of-memory errors which would + // happen as the next access to this object would allocate + // another ValueType instance and so on forever + value = NULL; + } + } + + return static_cast<ValueType *>(value); + } + + // pointer-like accessors + ValueType *operator->() { return Get(); } + ValueType& operator*() { return *Get(); } + + private: + wxTlsKey m_key; + + DECLARE_NO_COPY_TEMPLATE_CLASS(wxTlsValue, T) + }; + + #define wxTLS_TYPE(T) wxTlsValue<T> + #define wxTLS_PTR(var) ((var).Get()) + #define wxTLS_VALUE(var) (*(var)) +#endif // wxHAS_COMPILER_TLS/!wxHAS_COMPILER_TLS + +#endif // _WX_TLS_H_ + diff --git a/wxmsw/include/wx-3.0/wx/tokenzr.h b/wxmsw/include/wx-3.0/wx/tokenzr.h new file mode 100644 index 00000000..2eb65197 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/tokenzr.h @@ -0,0 +1,148 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/tokenzr.h +// Purpose: String tokenizer - a C++ replacement for strtok(3) +// Author: Guilhem Lavaux +// Modified by: (or rather rewritten by) Vadim Zeitlin +// Created: 04/22/98 +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TOKENZRH +#define _WX_TOKENZRH + +#include "wx/object.h" +#include "wx/string.h" +#include "wx/arrstr.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// default: delimiters are usual white space characters +#define wxDEFAULT_DELIMITERS (wxT(" \t\r\n")) + +// wxStringTokenizer mode flags which determine its behaviour +enum wxStringTokenizerMode +{ + wxTOKEN_INVALID = -1, // set by def ctor until SetString() is called + wxTOKEN_DEFAULT, // strtok() for whitespace delims, RET_EMPTY else + wxTOKEN_RET_EMPTY, // return empty token in the middle of the string + wxTOKEN_RET_EMPTY_ALL, // return trailing empty tokens too + wxTOKEN_RET_DELIMS, // return the delim with token (implies RET_EMPTY) + wxTOKEN_STRTOK // behave exactly like strtok(3) +}; + +// ---------------------------------------------------------------------------- +// wxStringTokenizer: replaces infamous strtok() and has some other features +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStringTokenizer : public wxObject +{ +public: + // ctors and initializers + // default ctor, call SetString() later + wxStringTokenizer() { m_mode = wxTOKEN_INVALID; } + // ctor which gives us the string + wxStringTokenizer(const wxString& str, + const wxString& delims = wxDEFAULT_DELIMITERS, + wxStringTokenizerMode mode = wxTOKEN_DEFAULT); + + // args are same as for the non default ctor above + void SetString(const wxString& str, + const wxString& delims = wxDEFAULT_DELIMITERS, + wxStringTokenizerMode mode = wxTOKEN_DEFAULT); + + // reinitialize the tokenizer with the same delimiters/mode + void Reinit(const wxString& str); + + // tokens access + // return the number of remaining tokens + size_t CountTokens() const; + // did we reach the end of the string? + bool HasMoreTokens() const; + // get the next token, will return empty string if !HasMoreTokens() + wxString GetNextToken(); + // get the delimiter which terminated the token last retrieved by + // GetNextToken() or NUL if there had been no tokens yet or the last + // one wasn't terminated (but ran to the end of the string) + wxChar GetLastDelimiter() const { return m_lastDelim; } + + // get current tokenizer state + // returns the part of the string which remains to tokenize (*not* the + // initial string) + wxString GetString() const { return wxString(m_pos, m_string.end()); } + + // returns the current position (i.e. one index after the last + // returned token or 0 if GetNextToken() has never been called) in the + // original string + size_t GetPosition() const { return m_pos - m_string.begin(); } + + // misc + // get the current mode - can be different from the one passed to the + // ctor if it was wxTOKEN_DEFAULT + wxStringTokenizerMode GetMode() const { return m_mode; } + // do we return empty tokens? + bool AllowEmpty() const { return m_mode != wxTOKEN_STRTOK; } + + + // backwards compatibility section from now on + // ------------------------------------------- + + // for compatibility only, use GetNextToken() instead + wxString NextToken() { return GetNextToken(); } + + // compatibility only, don't use + void SetString(const wxString& to_tokenize, + const wxString& delims, + bool WXUNUSED(ret_delim)) + { + SetString(to_tokenize, delims, wxTOKEN_RET_DELIMS); + } + + wxStringTokenizer(const wxString& to_tokenize, + const wxString& delims, + bool ret_delim) + { + SetString(to_tokenize, delims, ret_delim); + } + +protected: + bool IsOk() const { return m_mode != wxTOKEN_INVALID; } + + bool DoHasMoreTokens() const; + + enum MoreTokensState + { + MoreTokens_Unknown, + MoreTokens_Yes, + MoreTokens_No + }; + + MoreTokensState m_hasMoreTokens; + + wxString m_string; // the string we tokenize + wxString::const_iterator m_stringEnd; + // FIXME-UTF8: use wxWcharBuffer + wxWxCharBuffer m_delims; // all possible delimiters + size_t m_delimsLen; + + wxString::const_iterator m_pos; // the current position in m_string + + wxStringTokenizerMode m_mode; // see wxTOKEN_XXX values + + wxChar m_lastDelim; // delimiter after last token or '\0' +}; + +// ---------------------------------------------------------------------------- +// convenience function which returns all tokens at once +// ---------------------------------------------------------------------------- + +// the function takes the same parameters as wxStringTokenizer ctor and returns +// the array containing all tokens +wxArrayString WXDLLIMPEXP_BASE +wxStringTokenize(const wxString& str, + const wxString& delims = wxDEFAULT_DELIMITERS, + wxStringTokenizerMode mode = wxTOKEN_DEFAULT); + +#endif // _WX_TOKENZRH diff --git a/wxmsw/include/wx-3.0/wx/toolbar.h b/wxmsw/include/wx-3.0/wx/toolbar.h new file mode 100644 index 00000000..49a446e7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/toolbar.h @@ -0,0 +1,92 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/toolbar.h +// Purpose: wxToolBar interface declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.11.99 +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TOOLBAR_H_BASE_ +#define _WX_TOOLBAR_H_BASE_ + +#include "wx/defs.h" + +// ---------------------------------------------------------------------------- +// wxToolBar style flags +// ---------------------------------------------------------------------------- + +enum +{ + // lay out the toolbar horizontally + wxTB_HORIZONTAL = wxHORIZONTAL, // == 0x0004 + wxTB_TOP = wxTB_HORIZONTAL, + + // lay out the toolbar vertically + wxTB_VERTICAL = wxVERTICAL, // == 0x0008 + wxTB_LEFT = wxTB_VERTICAL, + + // show 3D buttons (wxToolBarSimple only) + wxTB_3DBUTTONS = 0x0010, + + // "flat" buttons (Win32/GTK only) + wxTB_FLAT = 0x0020, + + // dockable toolbar (GTK only) + wxTB_DOCKABLE = 0x0040, + + // don't show the icons (they're shown by default) + wxTB_NOICONS = 0x0080, + + // show the text (not shown by default) + wxTB_TEXT = 0x0100, + + // don't show the divider between toolbar and the window (Win32 only) + wxTB_NODIVIDER = 0x0200, + + // no automatic alignment (Win32 only, useless) + wxTB_NOALIGN = 0x0400, + + // show the text and the icons alongside, not vertically stacked (Win32/GTK) + wxTB_HORZ_LAYOUT = 0x0800, + wxTB_HORZ_TEXT = wxTB_HORZ_LAYOUT | wxTB_TEXT, + + // don't show the toolbar short help tooltips + wxTB_NO_TOOLTIPS = 0x1000, + + // lay out toolbar at the bottom of the window + wxTB_BOTTOM = 0x2000, + + // lay out toolbar at the right edge of the window + wxTB_RIGHT = 0x4000, + + wxTB_DEFAULT_STYLE = wxTB_HORIZONTAL | wxTB_FLAT +}; + +#if wxUSE_TOOLBAR + #include "wx/tbarbase.h" // the base class for all toolbars + + #if defined(__WXUNIVERSAL__) + #include "wx/univ/toolbar.h" + #elif defined(__WXMSW__) && (!defined(_WIN32_WCE) || (_WIN32_WCE >= 400 && !defined(__POCKETPC__) && !defined(__SMARTPHONE__))) + #include "wx/msw/toolbar.h" + #elif defined(__WXWINCE__) + #include "wx/msw/wince/tbarwce.h" + #elif defined(__WXMOTIF__) + #include "wx/motif/toolbar.h" + #elif defined(__WXGTK20__) + #include "wx/gtk/toolbar.h" + #elif defined(__WXGTK__) + #include "wx/gtk1/toolbar.h" + #elif defined(__WXMAC__) + #include "wx/osx/toolbar.h" + #elif defined(__WXCOCOA__) + #include "wx/cocoa/toolbar.h" + #elif defined(__WXPM__) + #include "wx/os2/toolbar.h" + #endif +#endif // wxUSE_TOOLBAR + +#endif + // _WX_TOOLBAR_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/toolbook.h b/wxmsw/include/wx-3.0/wx/toolbook.h new file mode 100644 index 00000000..45730cd9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/toolbook.h @@ -0,0 +1,148 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/toolbook.h +// Purpose: wxToolbook: wxToolBar and wxNotebook combination +// Author: Julian Smart +// Modified by: +// Created: 2006-01-29 +// Copyright: (c) 2006 Julian Smart +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TOOLBOOK_H_ +#define _WX_TOOLBOOK_H_ + +#include "wx/defs.h" + +#if wxUSE_TOOLBOOK + +#include "wx/bookctrl.h" +#include "wx/containr.h" + +class WXDLLIMPEXP_FWD_CORE wxToolBarBase; +class WXDLLIMPEXP_FWD_CORE wxCommandEvent; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TOOLBOOK_PAGE_CHANGED, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TOOLBOOK_PAGE_CHANGING, wxBookCtrlEvent ); + + +// Use wxButtonToolBar +#define wxTBK_BUTTONBAR 0x0100 + +// Use wxTB_HORZ_LAYOUT style for the controlling toolbar +#define wxTBK_HORZ_LAYOUT 0x8000 + +// deprecated synonym, don't use +#if WXWIN_COMPATIBILITY_2_8 + #define wxBK_BUTTONBAR wxTBK_BUTTONBAR +#endif + +// ---------------------------------------------------------------------------- +// wxToolbook +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxToolbook : public wxNavigationEnabled<wxBookCtrlBase> +{ +public: + wxToolbook() + { + Init(); + } + + wxToolbook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString) + { + Init(); + + (void)Create(parent, id, pos, size, style, name); + } + + // quasi ctor + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString); + + + // implement base class virtuals + virtual bool SetPageText(size_t n, const wxString& strText); + virtual wxString GetPageText(size_t n) const; + virtual int GetPageImage(size_t n) const; + virtual bool SetPageImage(size_t n, int imageId); + virtual bool InsertPage(size_t n, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = NO_IMAGE); + virtual int SetSelection(size_t n) { return DoSetSelection(n, SetSelection_SendEvent); } + virtual int ChangeSelection(size_t n) { return DoSetSelection(n); } + virtual void SetImageList(wxImageList *imageList); + + virtual bool DeleteAllPages(); + virtual int HitTest(const wxPoint& pt, long *flags = NULL) const; + + + // methods which are not part of base wxBookctrl API + + // get the underlying toolbar + wxToolBarBase* GetToolBar() const { return (wxToolBarBase*)m_bookctrl; } + + // must be called in OnIdle or by application to realize the toolbar and + // select the initial page. + void Realize(); + +protected: + virtual wxWindow *DoRemovePage(size_t page); + + // event handlers + void OnToolSelected(wxCommandEvent& event); + void OnSize(wxSizeEvent& event); + void OnIdle(wxIdleEvent& event); + + void UpdateSelectedPage(size_t newsel); + + wxBookCtrlEvent* CreatePageChangingEvent() const; + void MakeChangedEvent(wxBookCtrlEvent &event); + + // whether the toolbar needs to be realized + bool m_needsRealizing; + + // maximum bitmap size + wxSize m_maxBitmapSize; + +private: + // common part of all constructors + void Init(); + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxToolbook) +}; + +// ---------------------------------------------------------------------------- +// listbook event class and related stuff +// ---------------------------------------------------------------------------- + +// wxToolbookEvent is obsolete and defined for compatibility only +#define wxToolbookEvent wxBookCtrlEvent +typedef wxBookCtrlEventFunction wxToolbookEventFunction; +#define wxToolbookEventHandler(func) wxBookCtrlEventHandler(func) + + +#define EVT_TOOLBOOK_PAGE_CHANGED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_TOOLBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) + +#define EVT_TOOLBOOK_PAGE_CHANGING(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_TOOLBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED wxEVT_TOOLBOOK_PAGE_CHANGED +#define wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING wxEVT_TOOLBOOK_PAGE_CHANGING + +#endif // wxUSE_TOOLBOOK + +#endif // _WX_TOOLBOOK_H_ diff --git a/wxmsw/include/wx-3.0/wx/tooltip.h b/wxmsw/include/wx-3.0/wx/tooltip.h new file mode 100644 index 00000000..0948e65e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/tooltip.h @@ -0,0 +1,38 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/tooltip.h +// Purpose: wxToolTip base header +// Author: Robert Roebling +// Modified by: +// Created: +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TOOLTIP_H_BASE_ +#define _WX_TOOLTIP_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_TOOLTIPS + +#if defined(__WXMSW__) +#include "wx/msw/tooltip.h" +#elif defined(__WXMOTIF__) +// #include "wx/motif/tooltip.h" +#elif defined(__WXGTK20__) +#include "wx/gtk/tooltip.h" +#elif defined(__WXGTK__) +#include "wx/gtk1/tooltip.h" +#elif defined(__WXMAC__) +#include "wx/osx/tooltip.h" +#elif defined(__WXCOCOA__) +#include "wx/cocoa/tooltip.h" +#elif defined(__WXPM__) +#include "wx/os2/tooltip.h" +#endif + +#endif + // wxUSE_TOOLTIPS + +#endif + // _WX_TOOLTIP_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/toplevel.h b/wxmsw/include/wx-3.0/wx/toplevel.h new file mode 100644 index 00000000..b36b30e6 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/toplevel.h @@ -0,0 +1,416 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/toplevel.h +// Purpose: declares wxTopLevelWindow class, the base class for all +// top level windows (such as frames and dialogs) +// Author: Vadim Zeitlin, Vaclav Slavik +// Modified by: +// Created: 06.08.01 +// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Vaclav Slavik <vaclav@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TOPLEVEL_BASE_H_ +#define _WX_TOPLEVEL_BASE_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/nonownedwnd.h" +#include "wx/iconbndl.h" +#include "wx/weakref.h" + +// the default names for various classes +extern WXDLLIMPEXP_DATA_CORE(const char) wxFrameNameStr[]; + +class WXDLLIMPEXP_FWD_CORE wxTopLevelWindowBase; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +/* + Summary of the bits used (some of them are defined in wx/frame.h and + wx/dialog.h and not here): + + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0| + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | \_ wxCENTRE + | | | | | | | | | | | | | | \____ wxFRAME_NO_TASKBAR + | | | | | | | | | | | | | \_______ wxFRAME_TOOL_WINDOW + | | | | | | | | | | | | \__________ wxFRAME_FLOAT_ON_PARENT + | | | | | | | | | | | \_____________ wxFRAME_SHAPED + | | | | | | | | | | \________________ wxDIALOG_NO_PARENT + | | | | | | | | | \___________________ wxRESIZE_BORDER + | | | | | | | | \______________________ wxTINY_CAPTION_VERT + | | | | | | | \_________________________ + | | | | | | \____________________________ wxMAXIMIZE_BOX + | | | | | \_______________________________ wxMINIMIZE_BOX + | | | | \__________________________________ wxSYSTEM_MENU + | | | \_____________________________________ wxCLOSE_BOX + | | \________________________________________ wxMAXIMIZE + | \___________________________________________ wxMINIMIZE + \______________________________________________ wxSTAY_ON_TOP + + + Notice that the 8 lower bits overlap with wxCENTRE and the button selection + bits (wxYES, wxOK wxNO, wxCANCEL, wxAPPLY, wxCLOSE and wxNO_DEFAULT) which + can be combined with the dialog style for several standard dialogs and + hence shouldn't overlap with any styles which can be used for the dialogs. + Additionally, wxCENTRE can be used with frames also. + */ + +// style common to both wxFrame and wxDialog +#define wxSTAY_ON_TOP 0x8000 +#define wxICONIZE 0x4000 +#define wxMINIMIZE wxICONIZE +#define wxMAXIMIZE 0x2000 +#define wxCLOSE_BOX 0x1000 // == wxHELP so can't be used with it + +#define wxSYSTEM_MENU 0x0800 +#define wxMINIMIZE_BOX 0x0400 +#define wxMAXIMIZE_BOX 0x0200 + +#define wxTINY_CAPTION 0x0080 // clashes with wxNO_DEFAULT +#define wxRESIZE_BORDER 0x0040 // == wxCLOSE + +#if WXWIN_COMPATIBILITY_2_8 + // HORIZ and VERT styles are equivalent anyhow so don't use different names + // for them + #define wxTINY_CAPTION_HORIZ wxTINY_CAPTION + #define wxTINY_CAPTION_VERT wxTINY_CAPTION +#endif + +#if WXWIN_COMPATIBILITY_2_6 + + // deprecated versions defined for compatibility reasons + #define wxRESIZE_BOX wxMAXIMIZE_BOX + #define wxTHICK_FRAME wxRESIZE_BORDER + + // obsolete styles, unused any more + #define wxDIALOG_MODAL 0 + #define wxDIALOG_MODELESS 0 + #define wxNO_3D 0 + #define wxUSER_COLOURS 0 + +#endif // WXWIN_COMPATIBILITY_2_6 + +// default style +// +// under Windows CE (at least when compiling with eVC 4) we should create +// top level windows without any styles at all for them to appear +// "correctly", i.e. as full screen windows with a "hide" button (same as +// "close" but round instead of squared and just hides the applications +// instead of closing it) in the title bar +#if defined(__WXWINCE__) + #if defined(__SMARTPHONE__) + #define wxDEFAULT_FRAME_STYLE (wxMAXIMIZE) + #elif defined(__WINCE_STANDARDSDK__) + #define wxDEFAULT_FRAME_STYLE (wxMAXIMIZE|wxCLOSE_BOX) + #else + #define wxDEFAULT_FRAME_STYLE (wxNO_BORDER) + #endif +#else // !__WXWINCE__ + #define wxDEFAULT_FRAME_STYLE \ + (wxSYSTEM_MENU | \ + wxRESIZE_BORDER | \ + wxMINIMIZE_BOX | \ + wxMAXIMIZE_BOX | \ + wxCLOSE_BOX | \ + wxCAPTION | \ + wxCLIP_CHILDREN) +#endif + + +// Dialogs are created in a special way +#define wxTOPLEVEL_EX_DIALOG 0x00000008 + +// Styles for ShowFullScreen +// (note that wxTopLevelWindow only handles wxFULLSCREEN_NOBORDER and +// wxFULLSCREEN_NOCAPTION; the rest is handled by wxTopLevelWindow) +enum +{ + wxFULLSCREEN_NOMENUBAR = 0x0001, + wxFULLSCREEN_NOTOOLBAR = 0x0002, + wxFULLSCREEN_NOSTATUSBAR = 0x0004, + wxFULLSCREEN_NOBORDER = 0x0008, + wxFULLSCREEN_NOCAPTION = 0x0010, + + wxFULLSCREEN_ALL = wxFULLSCREEN_NOMENUBAR | wxFULLSCREEN_NOTOOLBAR | + wxFULLSCREEN_NOSTATUSBAR | wxFULLSCREEN_NOBORDER | + wxFULLSCREEN_NOCAPTION +}; + +// Styles for RequestUserAttention +enum +{ + wxUSER_ATTENTION_INFO = 1, + wxUSER_ATTENTION_ERROR = 2 +}; + +// ---------------------------------------------------------------------------- +// wxTopLevelWindow: a top level (as opposed to child) window +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTopLevelWindowBase : public wxNonOwnedWindow +{ +public: + // construction + wxTopLevelWindowBase(); + virtual ~wxTopLevelWindowBase(); + + // top level wnd state + // -------------------- + + // maximize = true => maximize, otherwise - restore + virtual void Maximize(bool maximize = true) = 0; + + // undo Maximize() or Iconize() + virtual void Restore() = 0; + + // iconize = true => iconize, otherwise - restore + virtual void Iconize(bool iconize = true) = 0; + + // return true if the frame is maximized + virtual bool IsMaximized() const = 0; + + // return true if the frame is always maximized + // due to native guidelines or current policy + virtual bool IsAlwaysMaximized() const; + + // return true if the frame is iconized + virtual bool IsIconized() const = 0; + + // get the frame icon + wxIcon GetIcon() const; + + // get the frame icons + const wxIconBundle& GetIcons() const { return m_icons; } + + // set the frame icon: implemented in terms of SetIcons() + void SetIcon(const wxIcon& icon); + + // set the frame icons + virtual void SetIcons(const wxIconBundle& icons) { m_icons = icons; } + + // maximize the window to cover entire screen + virtual bool ShowFullScreen(bool show, long style = wxFULLSCREEN_ALL) = 0; + + // shows the window, but doesn't activate it. If the base code is being run, + // it means the port doesn't implement this method yet and so alert the user. + virtual void ShowWithoutActivating() { + wxFAIL_MSG("ShowWithoutActivating not implemented on this platform."); + } + + // return true if the frame is in fullscreen mode + virtual bool IsFullScreen() const = 0; + + // the title of the top level window: the text which the + // window shows usually at the top of the frame/dialog in dedicated bar + virtual void SetTitle(const wxString& title) = 0; + virtual wxString GetTitle() const = 0; + + // enable/disable close button [x] + virtual bool EnableCloseButton(bool WXUNUSED(enable) ) { return false; } + + // Attracts the users attention to this window if the application is + // inactive (should be called when a background event occurs) + virtual void RequestUserAttention(int flags = wxUSER_ATTENTION_INFO); + + // Is this the active frame (highlighted in the taskbar)? + // + // A TLW is active only if it contains the currently focused window. + virtual bool IsActive() { return IsDescendant(FindFocus()); } + + // this function may be overridden to return false to allow closing the + // application even when this top level window is still open + // + // notice that the window is still closed prior to the application exit and + // so it can still veto it even if it returns false from here + virtual bool ShouldPreventAppExit() const { return true; } + + +#if defined(__SMARTPHONE__) + virtual void SetLeftMenu(int id = wxID_ANY, const wxString& label = wxEmptyString, wxMenu *subMenu = NULL) = 0; + virtual void SetRightMenu(int id = wxID_ANY, const wxString& label = wxEmptyString, wxMenu *subMenu = NULL) = 0; +#endif // __SMARTPHONE__ + + // centre the window on screen: this is just a shortcut + void CentreOnScreen(int dir = wxBOTH) { DoCentre(dir | wxCENTRE_ON_SCREEN); } + void CenterOnScreen(int dir = wxBOTH) { CentreOnScreen(dir); } + + // Get the default size for a new top level window. This is used when + // creating a wxTLW under some platforms if no explicit size given. + static wxSize GetDefaultSize(); + + + // default item access: we have a permanent default item which is the one + // set by the user code but we may also have a temporary default item which + // would be chosen if the user pressed "Enter" now but the default action + // reverts to the "permanent" default as soon as this temporary default + // item loses focus + + // get the default item, temporary or permanent + wxWindow *GetDefaultItem() const + { return m_winTmpDefault ? m_winTmpDefault : m_winDefault; } + + // set the permanent default item, return the old default + wxWindow *SetDefaultItem(wxWindow *win) + { wxWindow *old = GetDefaultItem(); m_winDefault = win; return old; } + + // return the temporary default item, can be NULL + wxWindow *GetTmpDefaultItem() const { return m_winTmpDefault; } + + // set a temporary default item, SetTmpDefaultItem(NULL) should be called + // soon after a call to SetTmpDefaultItem(window), return the old default + wxWindow *SetTmpDefaultItem(wxWindow *win) + { wxWindow *old = GetDefaultItem(); m_winTmpDefault = win; return old; } + + // implementation only from now on + // ------------------------------- + + // override some base class virtuals + virtual bool Destroy(); + virtual bool IsTopLevel() const { return true; } + virtual bool IsTopNavigationDomain() const { return true; } + virtual bool IsVisible() const { return IsShown(); } + + // event handlers + void OnCloseWindow(wxCloseEvent& event); + void OnSize(wxSizeEvent& WXUNUSED(event)) { DoLayout(); } + + // Get rect to be used to center top-level children + virtual void GetRectForTopLevelChildren(int *x, int *y, int *w, int *h); + + // this should go away, but for now it's called from docview.cpp, + // so should be there for all platforms + void OnActivate(wxActivateEvent &WXUNUSED(event)) { } + + // do the window-specific processing after processing the update event + virtual void DoUpdateWindowUI(wxUpdateUIEvent& event) ; + + // a different API for SetSizeHints + virtual void SetMinSize(const wxSize& minSize); + virtual void SetMaxSize(const wxSize& maxSize); + + virtual void OSXSetModified(bool modified) { m_modified = modified; } + virtual bool OSXIsModified() const { return m_modified; } + + virtual void SetRepresentedFilename(const wxString& WXUNUSED(filename)) { } + +#if wxUSE_MENUS || wxUSE_TOOLBAR + // show help text for the currently selected menu or toolbar item + // (typically in the status bar) or hide it and restore the status bar text + // originally shown before the menu was opened if show == false + virtual void DoGiveHelp(const wxString& WXUNUSED(text), bool WXUNUSED(show)) {} +#endif + +protected: + // the frame client to screen translation should take account of the + // toolbar which may shift the origin of the client area + virtual void DoClientToScreen(int *x, int *y) const; + virtual void DoScreenToClient(int *x, int *y) const; + + // add support for wxCENTRE_ON_SCREEN + virtual void DoCentre(int dir); + + // no need to do client to screen translation to get our position in screen + // coordinates: this is already the case + virtual void DoGetScreenPosition(int *x, int *y) const + { + DoGetPosition(x, y); + } + + // test whether this window makes part of the frame + // (menubar, toolbar and statusbar are excluded from automatic layout) + virtual bool IsOneOfBars(const wxWindow *WXUNUSED(win)) const + { return false; } + + // check if we should exit the program after deleting this window + bool IsLastBeforeExit() const; + + // send the iconize event, return true if processed + bool SendIconizeEvent(bool iconized = true); + + // do TLW-specific layout: we resize our unique child to fill the entire + // client area + void DoLayout(); + + static int WidthDefault(int w) { return w == wxDefaultCoord ? GetDefaultSize().x : w; } + static int HeightDefault(int h) { return h == wxDefaultCoord ? GetDefaultSize().y : h; } + + + // the frame icon + wxIconBundle m_icons; + + // a default window (usually a button) or NULL + wxWindowRef m_winDefault; + + // a temporary override of m_winDefault, use the latter if NULL + wxWindowRef m_winTmpDefault; + + bool m_modified; + + wxDECLARE_NO_COPY_CLASS(wxTopLevelWindowBase); + DECLARE_EVENT_TABLE() +}; + + +// include the real class declaration +#if defined(__WXMSW__) + #include "wx/msw/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowMSW +#elif defined(__WXGTK20__) + #include "wx/gtk/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowGTK +#elif defined(__WXGTK__) + #include "wx/gtk1/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowGTK +#elif defined(__WXX11__) + #include "wx/x11/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowX11 +#elif defined(__WXDFB__) + #include "wx/dfb/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowDFB +#elif defined(__WXMAC__) + #include "wx/osx/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowMac +#elif defined(__WXCOCOA__) + #include "wx/cocoa/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowCocoa +#elif defined(__WXPM__) + #include "wx/os2/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowOS2 +#elif defined(__WXMOTIF__) + #include "wx/motif/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowMotif +#endif + +#ifdef __WXUNIVERSAL__ + #include "wx/univ/toplevel.h" +#else // !__WXUNIVERSAL__ + class WXDLLIMPEXP_CORE wxTopLevelWindow : public wxTopLevelWindowNative + { + public: + // construction + wxTopLevelWindow() { } + wxTopLevelWindow(wxWindow *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + : wxTopLevelWindowNative(parent, winid, title, + pos, size, style, name) + { + } + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxTopLevelWindow) + }; +#endif // __WXUNIVERSAL__/!__WXUNIVERSAL__ + +#endif // _WX_TOPLEVEL_BASE_H_ diff --git a/wxmsw/include/wx-3.0/wx/tracker.h b/wxmsw/include/wx-3.0/wx/tracker.h new file mode 100644 index 00000000..d8f27282 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/tracker.h @@ -0,0 +1,91 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/tracker.h +// Purpose: Support class for object lifetime tracking (wxWeakRef<T>) +// Author: Arne Steinarson +// Created: 28 Dec 07 +// Copyright: (c) 2007 Arne Steinarson +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TRACKER_H_ +#define _WX_TRACKER_H_ + +#include "wx/defs.h" + +class wxEventConnectionRef; + +// This class represents an object tracker and is stored in a linked list +// in the tracked object. It is only used in one of its derived forms. +class WXDLLIMPEXP_BASE wxTrackerNode +{ +public: + wxTrackerNode() : m_nxt(NULL) { } + virtual ~wxTrackerNode() { } + + virtual void OnObjectDestroy() = 0; + + virtual wxEventConnectionRef *ToEventConnection() { return NULL; } + +private: + wxTrackerNode *m_nxt; + + friend class wxTrackable; // For list access + friend class wxEvtHandler; // For list access +}; + +// Add-on base class for a trackable object. +class WXDLLIMPEXP_BASE wxTrackable +{ +public: + void AddNode(wxTrackerNode *prn) + { + prn->m_nxt = m_first; + m_first = prn; + } + + void RemoveNode(wxTrackerNode *prn) + { + for ( wxTrackerNode **pprn = &m_first; *pprn; pprn = &(*pprn)->m_nxt ) + { + if ( *pprn == prn ) + { + *pprn = prn->m_nxt; + return; + } + } + + wxFAIL_MSG( "removing invalid tracker node" ); + } + + wxTrackerNode *GetFirst() const { return m_first; } + +protected: + // this class is only supposed to be used as a base class but never be + // created nor destroyed directly so all ctors and dtor are protected + + wxTrackable() : m_first(NULL) { } + + // copy ctor and assignment operator intentionally do not copy m_first: the + // objects which track the original trackable shouldn't track the new copy + wxTrackable(const wxTrackable& WXUNUSED(other)) : m_first(NULL) { } + wxTrackable& operator=(const wxTrackable& WXUNUSED(other)) { return *this; } + + // dtor is not virtual: this class is not supposed to be used + // polymorphically and adding a virtual table to it would add unwanted + // overhead + ~wxTrackable() + { + // Notify all registered refs + while ( m_first ) + { + wxTrackerNode * const first = m_first; + m_first = first->m_nxt; + first->OnObjectDestroy(); + } + } + + wxTrackerNode *m_first; +}; + +#endif // _WX_TRACKER_H_ + diff --git a/wxmsw/include/wx-3.0/wx/translation.h b/wxmsw/include/wx-3.0/wx/translation.h new file mode 100644 index 00000000..187caf36 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/translation.h @@ -0,0 +1,323 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/translation.h +// Purpose: Internationalization and localisation for wxWidgets +// Author: Vadim Zeitlin, Vaclav Slavik, +// Michael N. Filippov <michael@idisys.iae.nsk.su> +// Created: 2010-04-23 +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// (c) 2010 Vaclav Slavik <vslavik@fastmail.fm> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TRANSLATION_H_ +#define _WX_TRANSLATION_H_ + +#include "wx/defs.h" +#include "wx/string.h" + +#if wxUSE_INTL + +#include "wx/buffer.h" +#include "wx/language.h" +#include "wx/hashmap.h" +#include "wx/strconv.h" +#include "wx/scopedptr.h" + +// ============================================================================ +// global decls +// ============================================================================ + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// gettext() style macros (notice that xgettext should be invoked with +// --keyword="_" --keyword="wxPLURAL:1,2" options +// to extract the strings from the sources) +#ifndef WXINTL_NO_GETTEXT_MACRO + #define _(s) wxGetTranslation((s)) + #define wxPLURAL(sing, plur, n) wxGetTranslation((sing), (plur), n) +#endif + +// another one which just marks the strings for extraction, but doesn't +// perform the translation (use -kwxTRANSLATE with xgettext!) +#define wxTRANSLATE(str) str + +// ---------------------------------------------------------------------------- +// forward decls +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxArrayString; +class WXDLLIMPEXP_FWD_BASE wxTranslationsLoader; +class WXDLLIMPEXP_FWD_BASE wxLocale; + +class wxPluralFormsCalculator; +wxDECLARE_SCOPED_PTR(wxPluralFormsCalculator, wxPluralFormsCalculatorPtr) + +// ---------------------------------------------------------------------------- +// wxMsgCatalog corresponds to one loaded message catalog. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMsgCatalog +{ +public: + // Ctor is protected, because CreateFromXXX functions must be used, + // but destruction should be unrestricted +#if !wxUSE_UNICODE + ~wxMsgCatalog(); +#endif + + // load the catalog from disk or from data; caller is responsible for + // deleting them if not NULL + static wxMsgCatalog *CreateFromFile(const wxString& filename, + const wxString& domain); + + static wxMsgCatalog *CreateFromData(const wxScopedCharBuffer& data, + const wxString& domain); + + // get name of the catalog + wxString GetDomain() const { return m_domain; } + + // get the translated string: returns NULL if not found + const wxString *GetString(const wxString& sz, unsigned n = UINT_MAX) const; + +protected: + wxMsgCatalog(const wxString& domain) + : m_pNext(NULL), m_domain(domain) +#if !wxUSE_UNICODE + , m_conv(NULL) +#endif + {} + +private: + // variable pointing to the next element in a linked list (or NULL) + wxMsgCatalog *m_pNext; + friend class wxTranslations; + + wxStringToStringHashMap m_messages; // all messages in the catalog + wxString m_domain; // name of the domain + +#if !wxUSE_UNICODE + // the conversion corresponding to this catalog charset if we installed it + // as the global one + wxCSConv *m_conv; +#endif + + wxPluralFormsCalculatorPtr m_pluralFormsCalculator; +}; + +// ---------------------------------------------------------------------------- +// wxTranslations: message catalogs +// ---------------------------------------------------------------------------- + +// this class allows to get translations for strings +class WXDLLIMPEXP_BASE wxTranslations +{ +public: + wxTranslations(); + ~wxTranslations(); + + // returns current translations object, may return NULL + static wxTranslations *Get(); + // sets current translations object (takes ownership; may be NULL) + static void Set(wxTranslations *t); + + // changes loader to non-default one; takes ownership of 'loader' + void SetLoader(wxTranslationsLoader *loader); + + void SetLanguage(wxLanguage lang); + void SetLanguage(const wxString& lang); + + // get languages available for this app + wxArrayString GetAvailableTranslations(const wxString& domain) const; + + // find best translation language for given domain + wxString GetBestTranslation(const wxString& domain, wxLanguage msgIdLanguage); + wxString GetBestTranslation(const wxString& domain, + const wxString& msgIdLanguage = "en"); + + // add standard wxWidgets catalog ("wxstd") + bool AddStdCatalog(); + + // add catalog with given domain name and language, looking it up via + // wxTranslationsLoader + bool AddCatalog(const wxString& domain); + bool AddCatalog(const wxString& domain, wxLanguage msgIdLanguage); +#if !wxUSE_UNICODE + bool AddCatalog(const wxString& domain, + wxLanguage msgIdLanguage, + const wxString& msgIdCharset); +#endif + + // check if the given catalog is loaded + bool IsLoaded(const wxString& domain) const; + + // access to translations + const wxString *GetTranslatedString(const wxString& origString, + const wxString& domain = wxEmptyString) const; + const wxString *GetTranslatedString(const wxString& origString, + unsigned n, + const wxString& domain = wxEmptyString) const; + + wxString GetHeaderValue(const wxString& header, + const wxString& domain = wxEmptyString) const; + + // this is hack to work around a problem with wxGetTranslation() which + // returns const wxString& and not wxString, so when it returns untranslated + // string, it needs to have a copy of it somewhere + static const wxString& GetUntranslatedString(const wxString& str); + +private: + // perform loading of the catalog via m_loader + bool LoadCatalog(const wxString& domain, const wxString& lang, const wxString& msgIdLang); + + // find catalog by name in a linked list, return NULL if !found + wxMsgCatalog *FindCatalog(const wxString& domain) const; + + // same as Set(), without taking ownership; only for wxLocale + static void SetNonOwned(wxTranslations *t); + friend class wxLocale; + +private: + wxString m_lang; + wxTranslationsLoader *m_loader; + + wxMsgCatalog *m_pMsgCat; // pointer to linked list of catalogs +}; + + +// abstraction of translations discovery and loading +class WXDLLIMPEXP_BASE wxTranslationsLoader +{ +public: + wxTranslationsLoader() {} + virtual ~wxTranslationsLoader() {} + + virtual wxMsgCatalog *LoadCatalog(const wxString& domain, + const wxString& lang) = 0; + + virtual wxArrayString GetAvailableTranslations(const wxString& domain) const = 0; +}; + + +// standard wxTranslationsLoader implementation, using filesystem +class WXDLLIMPEXP_BASE wxFileTranslationsLoader + : public wxTranslationsLoader +{ +public: + static void AddCatalogLookupPathPrefix(const wxString& prefix); + + virtual wxMsgCatalog *LoadCatalog(const wxString& domain, + const wxString& lang); + + virtual wxArrayString GetAvailableTranslations(const wxString& domain) const; +}; + + +#ifdef __WINDOWS__ +// loads translations from win32 resources +class WXDLLIMPEXP_BASE wxResourceTranslationsLoader + : public wxTranslationsLoader +{ +public: + virtual wxMsgCatalog *LoadCatalog(const wxString& domain, + const wxString& lang); + + virtual wxArrayString GetAvailableTranslations(const wxString& domain) const; + +protected: + // returns resource type to use for translations + virtual wxString GetResourceType() const { return "MOFILE"; } + + // returns module to load resources from + virtual WXHINSTANCE GetModule() const { return 0; } +}; +#endif // __WINDOWS__ + + +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +// get the translation of the string in the current locale +inline const wxString& wxGetTranslation(const wxString& str, + const wxString& domain = wxString()) +{ + wxTranslations *trans = wxTranslations::Get(); + const wxString *transStr = trans ? trans->GetTranslatedString(str, domain) + : NULL; + if ( transStr ) + return *transStr; + else + // NB: this function returns reference to a string, so we have to keep + // a copy of it somewhere + return wxTranslations::GetUntranslatedString(str); +} + +inline const wxString& wxGetTranslation(const wxString& str1, + const wxString& str2, + unsigned n, + const wxString& domain = wxString()) +{ + wxTranslations *trans = wxTranslations::Get(); + const wxString *transStr = trans ? trans->GetTranslatedString(str1, n, domain) + : NULL; + if ( transStr ) + return *transStr; + else + // NB: this function returns reference to a string, so we have to keep + // a copy of it somewhere + return n == 1 + ? wxTranslations::GetUntranslatedString(str1) + : wxTranslations::GetUntranslatedString(str2); +} + +#else // !wxUSE_INTL + +// the macros should still be defined - otherwise compilation would fail + +#if !defined(WXINTL_NO_GETTEXT_MACRO) + #if !defined(_) + #define _(s) (s) + #endif + #define wxPLURAL(sing, plur, n) ((n) == 1 ? (sing) : (plur)) +#endif + +#define wxTRANSLATE(str) str + +// NB: we use a template here in order to avoid using +// wxLocale::GetUntranslatedString() above, which would be required if +// we returned const wxString&; this way, the compiler should be able to +// optimize wxGetTranslation() away + +template<typename TString> +inline TString wxGetTranslation(TString str) + { return str; } + +template<typename TString, typename TDomain> +inline TString wxGetTranslation(TString str, TDomain WXUNUSED(domain)) + { return str; } + +template<typename TString, typename TDomain> +inline TString wxGetTranslation(TString str1, TString str2, size_t n) + { return n == 1 ? str1 : str2; } + +template<typename TString, typename TDomain> +inline TString wxGetTranslation(TString str1, TString str2, size_t n, + TDomain WXUNUSED(domain)) + { return n == 1 ? str1 : str2; } + +#endif // wxUSE_INTL/!wxUSE_INTL + +// define this one just in case it occurs somewhere (instead of preferred +// wxTRANSLATE) too +#if !defined(WXINTL_NO_GETTEXT_MACRO) + #if !defined(gettext_noop) + #define gettext_noop(str) (str) + #endif + #if !defined(N_) + #define N_(s) (s) + #endif +#endif + +#endif // _WX_TRANSLATION_H_ diff --git a/wxmsw/include/wx-3.0/wx/treebase.h b/wxmsw/include/wx-3.0/wx/treebase.h new file mode 100644 index 00000000..4efbf050 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/treebase.h @@ -0,0 +1,423 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/treebase.h +// Purpose: wxTreeCtrl base classes and types +// Author: Julian Smart et al +// Modified by: +// Created: 01/02/97 +// Copyright: (c) 1997,1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TREEBASE_H_ +#define _WX_TREEBASE_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_TREECTRL + +#include "wx/window.h" // for wxClientData +#include "wx/event.h" +#include "wx/dynarray.h" +#include "wx/itemid.h" + +#if WXWIN_COMPATIBILITY_2_6 + +// flags for deprecated `Expand(int action)', will be removed in next versions +enum +{ + wxTREE_EXPAND_EXPAND, + wxTREE_EXPAND_COLLAPSE, + wxTREE_EXPAND_COLLAPSE_RESET, + wxTREE_EXPAND_TOGGLE +}; + +#endif // WXWIN_COMPATIBILITY_2_6 + +// ---------------------------------------------------------------------------- +// wxTreeItemId identifies an element of the tree. It's opaque for the +// application and the only method which can be used by user code is IsOk(). +// ---------------------------------------------------------------------------- + +// This is a class and not a typedef because existing code may forward declare +// wxTreeItemId as a class and we don't want to break it without good reason. +class wxTreeItemId : public wxItemId<void*> +{ +public: + wxTreeItemId() : wxItemId<void*>() { } + wxTreeItemId(void* pItem) : wxItemId<void*>(pItem) { } +}; + +// ---------------------------------------------------------------------------- +// wxTreeItemData is some (arbitrary) user class associated with some item. The +// main advantage of having this class (compared to old untyped interface) is +// that wxTreeItemData's are destroyed automatically by the tree and, as this +// class has virtual dtor, it means that the memory will be automatically +// freed. OTOH, we don't just use wxObject instead of wxTreeItemData because +// the size of this class is critical: in any real application, each tree leaf +// will have wxTreeItemData associated with it and number of leaves may be +// quite big. +// +// Because the objects of this class are deleted by the tree, they should +// always be allocated on the heap! +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTreeItemData: public wxClientData +{ +friend class WXDLLIMPEXP_FWD_CORE wxTreeCtrl; +friend class WXDLLIMPEXP_FWD_CORE wxGenericTreeCtrl; +public: + // creation/destruction + // -------------------- + // default ctor + wxTreeItemData() { } + + // default copy ctor/assignment operator are ok + + // accessor: get the item associated with us + const wxTreeItemId& GetId() const { return m_pItem; } + void SetId(const wxTreeItemId& id) { m_pItem = id; } + +protected: + wxTreeItemId m_pItem; +}; + +typedef void *wxTreeItemIdValue; + +WX_DEFINE_EXPORTED_ARRAY_PTR(wxTreeItemIdValue, wxArrayTreeItemIdsBase); + +// this is a wrapper around the array class defined above which allow to wok +// with values of natural wxTreeItemId type instead of using wxTreeItemIdValue +// and does it without any loss of efficiency +class WXDLLIMPEXP_CORE wxArrayTreeItemIds : public wxArrayTreeItemIdsBase +{ +public: + void Add(const wxTreeItemId& id) + { wxArrayTreeItemIdsBase::Add(id.m_pItem); } + void Insert(const wxTreeItemId& id, size_t pos) + { wxArrayTreeItemIdsBase::Insert(id.m_pItem, pos); } + wxTreeItemId Item(size_t i) const + { return wxTreeItemId(wxArrayTreeItemIdsBase::Item(i)); } + wxTreeItemId operator[](size_t i) const { return Item(i); } +}; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// enum for different images associated with a treectrl item +enum wxTreeItemIcon +{ + wxTreeItemIcon_Normal, // not selected, not expanded + wxTreeItemIcon_Selected, // selected, not expanded + wxTreeItemIcon_Expanded, // not selected, expanded + wxTreeItemIcon_SelectedExpanded, // selected, expanded + wxTreeItemIcon_Max +}; + +// special values for the 'state' parameter of wxTreeCtrl::SetItemState() +static const int wxTREE_ITEMSTATE_NONE = -1; // not state (no display state image) +static const int wxTREE_ITEMSTATE_NEXT = -2; // cycle to the next state +static const int wxTREE_ITEMSTATE_PREV = -3; // cycle to the previous state + +// ---------------------------------------------------------------------------- +// wxTreeCtrl flags +// ---------------------------------------------------------------------------- + +#define wxTR_NO_BUTTONS 0x0000 // for convenience +#define wxTR_HAS_BUTTONS 0x0001 // draw collapsed/expanded btns +#define wxTR_NO_LINES 0x0004 // don't draw lines at all +#define wxTR_LINES_AT_ROOT 0x0008 // connect top-level nodes +#define wxTR_TWIST_BUTTONS 0x0010 // still used by wxTreeListCtrl + +#define wxTR_SINGLE 0x0000 // for convenience +#define wxTR_MULTIPLE 0x0020 // can select multiple items + +#if WXWIN_COMPATIBILITY_2_8 + #define wxTR_EXTENDED 0x0040 // deprecated, don't use +#endif // WXWIN_COMPATIBILITY_2_8 + +#define wxTR_HAS_VARIABLE_ROW_HEIGHT 0x0080 // what it says + +#define wxTR_EDIT_LABELS 0x0200 // can edit item labels +#define wxTR_ROW_LINES 0x0400 // put border around items +#define wxTR_HIDE_ROOT 0x0800 // don't display root node + +#define wxTR_FULL_ROW_HIGHLIGHT 0x2000 // highlight full horz space + +// make the default control appearance look more native-like depending on the +// platform +#if defined(__WXGTK20__) + #define wxTR_DEFAULT_STYLE (wxTR_HAS_BUTTONS | wxTR_NO_LINES) +#elif defined(__WXMAC__) + #define wxTR_DEFAULT_STYLE \ + (wxTR_HAS_BUTTONS | wxTR_NO_LINES | wxTR_FULL_ROW_HIGHLIGHT) +#else + #define wxTR_DEFAULT_STYLE (wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT) +#endif + +#if WXWIN_COMPATIBILITY_2_6 +// deprecated, don't use +#define wxTR_MAC_BUTTONS 0 +#define wxTR_AQUA_BUTTONS 0 +#endif // WXWIN_COMPATIBILITY_2_6 + + +// values for the `flags' parameter of wxTreeCtrl::HitTest() which determine +// where exactly the specified point is situated: + +static const int wxTREE_HITTEST_ABOVE = 0x0001; +static const int wxTREE_HITTEST_BELOW = 0x0002; +static const int wxTREE_HITTEST_NOWHERE = 0x0004; + // on the button associated with an item. +static const int wxTREE_HITTEST_ONITEMBUTTON = 0x0008; + // on the bitmap associated with an item. +static const int wxTREE_HITTEST_ONITEMICON = 0x0010; + // on the indent associated with an item. +static const int wxTREE_HITTEST_ONITEMINDENT = 0x0020; + // on the label (string) associated with an item. +static const int wxTREE_HITTEST_ONITEMLABEL = 0x0040; + // on the right of the label associated with an item. +static const int wxTREE_HITTEST_ONITEMRIGHT = 0x0080; + // on the label (string) associated with an item. +static const int wxTREE_HITTEST_ONITEMSTATEICON = 0x0100; + // on the left of the wxTreeCtrl. +static const int wxTREE_HITTEST_TOLEFT = 0x0200; + // on the right of the wxTreeCtrl. +static const int wxTREE_HITTEST_TORIGHT = 0x0400; + // on the upper part (first half) of the item. +static const int wxTREE_HITTEST_ONITEMUPPERPART = 0x0800; + // on the lower part (second half) of the item. +static const int wxTREE_HITTEST_ONITEMLOWERPART = 0x1000; + + // anywhere on the item +static const int wxTREE_HITTEST_ONITEM = wxTREE_HITTEST_ONITEMICON | + wxTREE_HITTEST_ONITEMLABEL; + +// tree ctrl default name +extern WXDLLIMPEXP_DATA_CORE(const char) wxTreeCtrlNameStr[]; + +// ---------------------------------------------------------------------------- +// wxTreeItemAttr: a structure containing the visual attributes of an item +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTreeItemAttr +{ +public: + // ctors + wxTreeItemAttr() { } + wxTreeItemAttr(const wxColour& colText, + const wxColour& colBack, + const wxFont& font) + : m_colText(colText), m_colBack(colBack), m_font(font) { } + + // setters + void SetTextColour(const wxColour& colText) { m_colText = colText; } + void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; } + void SetFont(const wxFont& font) { m_font = font; } + + // accessors + bool HasTextColour() const { return m_colText.IsOk(); } + bool HasBackgroundColour() const { return m_colBack.IsOk(); } + bool HasFont() const { return m_font.IsOk(); } + + const wxColour& GetTextColour() const { return m_colText; } + const wxColour& GetBackgroundColour() const { return m_colBack; } + const wxFont& GetFont() const { return m_font; } + +private: + wxColour m_colText, + m_colBack; + wxFont m_font; +}; + +// ---------------------------------------------------------------------------- +// wxTreeEvent is a special class for all events associated with tree controls +// +// NB: note that not all accessors make sense for all events, see the event +// descriptions below +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxTreeCtrlBase; + +class WXDLLIMPEXP_CORE wxTreeEvent : public wxNotifyEvent +{ +public: + wxTreeEvent(wxEventType commandType = wxEVT_NULL, int id = 0); + wxTreeEvent(wxEventType commandType, + wxTreeCtrlBase *tree, + const wxTreeItemId &item = wxTreeItemId()); + wxTreeEvent(const wxTreeEvent& event); + + virtual wxEvent *Clone() const { return new wxTreeEvent(*this); } + + // accessors + // get the item on which the operation was performed or the newly + // selected item for wxEVT_TREE_SEL_CHANGED/ING events + wxTreeItemId GetItem() const { return m_item; } + void SetItem(const wxTreeItemId& item) { m_item = item; } + + // for wxEVT_TREE_SEL_CHANGED/ING events, get the previously + // selected item + wxTreeItemId GetOldItem() const { return m_itemOld; } + void SetOldItem(const wxTreeItemId& item) { m_itemOld = item; } + + // the point where the mouse was when the drag operation started (for + // wxEVT_TREE_BEGIN_(R)DRAG events only) or click position + wxPoint GetPoint() const { return m_pointDrag; } + void SetPoint(const wxPoint& pt) { m_pointDrag = pt; } + + // keyboard data (for wxEVT_TREE_KEY_DOWN only) + const wxKeyEvent& GetKeyEvent() const { return m_evtKey; } + int GetKeyCode() const { return m_evtKey.GetKeyCode(); } + void SetKeyEvent(const wxKeyEvent& evt) { m_evtKey = evt; } + + // label (for EVT_TREE_{BEGIN|END}_LABEL_EDIT only) + const wxString& GetLabel() const { return m_label; } + void SetLabel(const wxString& label) { m_label = label; } + + // edit cancel flag (for EVT_TREE_{BEGIN|END}_LABEL_EDIT only) + bool IsEditCancelled() const { return m_editCancelled; } + void SetEditCanceled(bool editCancelled) { m_editCancelled = editCancelled; } + + // Set the tooltip for the item (for EVT\_TREE\_ITEM\_GETTOOLTIP events) + void SetToolTip(const wxString& toolTip) { m_label = toolTip; } + wxString GetToolTip() { return m_label; } + +private: + // not all of the members are used (or initialized) for all events + wxKeyEvent m_evtKey; + wxTreeItemId m_item, + m_itemOld; + wxPoint m_pointDrag; + wxString m_label; + bool m_editCancelled; + + friend class WXDLLIMPEXP_FWD_CORE wxTreeCtrl; + friend class WXDLLIMPEXP_FWD_CORE wxGenericTreeCtrl; + + DECLARE_DYNAMIC_CLASS(wxTreeEvent) +}; + +typedef void (wxEvtHandler::*wxTreeEventFunction)(wxTreeEvent&); + +// ---------------------------------------------------------------------------- +// tree control events and macros for handling them +// ---------------------------------------------------------------------------- + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_BEGIN_DRAG, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_BEGIN_RDRAG, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_BEGIN_LABEL_EDIT, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_END_LABEL_EDIT, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_DELETE_ITEM, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_GET_INFO, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_SET_INFO, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_EXPANDED, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_EXPANDING, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_COLLAPSED, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_COLLAPSING, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_SEL_CHANGED, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_SEL_CHANGING, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_KEY_DOWN, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_ACTIVATED, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_RIGHT_CLICK, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_MIDDLE_CLICK, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_END_DRAG, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_STATE_IMAGE_CLICK, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_GETTOOLTIP, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_MENU, wxTreeEvent ); + +#define wxTreeEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxTreeEventFunction, func) + +#define wx__DECLARE_TREEEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_TREE_ ## evt, id, wxTreeEventHandler(fn)) + +// GetItem() returns the item being dragged, GetPoint() the mouse coords +// +// if you call event.Allow(), the drag operation will start and a +// EVT_TREE_END_DRAG event will be sent when the drag is over. +#define EVT_TREE_BEGIN_DRAG(id, fn) wx__DECLARE_TREEEVT(BEGIN_DRAG, id, fn) +#define EVT_TREE_BEGIN_RDRAG(id, fn) wx__DECLARE_TREEEVT(BEGIN_RDRAG, id, fn) + +// GetItem() is the item on which the drop occurred (if any) and GetPoint() the +// current mouse coords +#define EVT_TREE_END_DRAG(id, fn) wx__DECLARE_TREEEVT(END_DRAG, id, fn) + +// GetItem() returns the itme whose label is being edited, GetLabel() returns +// the current item label for BEGIN and the would be new one for END. +// +// Vetoing BEGIN event means that label editing won't happen at all, +// vetoing END means that the new value is discarded and the old one kept +#define EVT_TREE_BEGIN_LABEL_EDIT(id, fn) wx__DECLARE_TREEEVT(BEGIN_LABEL_EDIT, id, fn) +#define EVT_TREE_END_LABEL_EDIT(id, fn) wx__DECLARE_TREEEVT(END_LABEL_EDIT, id, fn) + +// provide/update information about GetItem() item +#define EVT_TREE_GET_INFO(id, fn) wx__DECLARE_TREEEVT(GET_INFO, id, fn) +#define EVT_TREE_SET_INFO(id, fn) wx__DECLARE_TREEEVT(SET_INFO, id, fn) + +// GetItem() is the item being expanded/collapsed, the "ING" versions can use +#define EVT_TREE_ITEM_EXPANDED(id, fn) wx__DECLARE_TREEEVT(ITEM_EXPANDED, id, fn) +#define EVT_TREE_ITEM_EXPANDING(id, fn) wx__DECLARE_TREEEVT(ITEM_EXPANDING, id, fn) +#define EVT_TREE_ITEM_COLLAPSED(id, fn) wx__DECLARE_TREEEVT(ITEM_COLLAPSED, id, fn) +#define EVT_TREE_ITEM_COLLAPSING(id, fn) wx__DECLARE_TREEEVT(ITEM_COLLAPSING, id, fn) + +// GetOldItem() is the item which had the selection previously, GetItem() is +// the item which acquires selection +#define EVT_TREE_SEL_CHANGED(id, fn) wx__DECLARE_TREEEVT(SEL_CHANGED, id, fn) +#define EVT_TREE_SEL_CHANGING(id, fn) wx__DECLARE_TREEEVT(SEL_CHANGING, id, fn) + +// GetKeyCode() returns the key code +// NB: this is the only message for which GetItem() is invalid (you may get the +// item from GetSelection()) +#define EVT_TREE_KEY_DOWN(id, fn) wx__DECLARE_TREEEVT(KEY_DOWN, id, fn) + +// GetItem() returns the item being deleted, the associated data (if any) will +// be deleted just after the return of this event handler (if any) +#define EVT_TREE_DELETE_ITEM(id, fn) wx__DECLARE_TREEEVT(DELETE_ITEM, id, fn) + +// GetItem() returns the item that was activated (double click, enter, space) +#define EVT_TREE_ITEM_ACTIVATED(id, fn) wx__DECLARE_TREEEVT(ITEM_ACTIVATED, id, fn) + +// GetItem() returns the item for which the context menu shall be shown +#define EVT_TREE_ITEM_MENU(id, fn) wx__DECLARE_TREEEVT(ITEM_MENU, id, fn) + +// GetItem() returns the item that was clicked on +#define EVT_TREE_ITEM_RIGHT_CLICK(id, fn) wx__DECLARE_TREEEVT(ITEM_RIGHT_CLICK, id, fn) +#define EVT_TREE_ITEM_MIDDLE_CLICK(id, fn) wx__DECLARE_TREEEVT(ITEM_MIDDLE_CLICK, id, fn) + +// GetItem() returns the item whose state image was clicked on +#define EVT_TREE_STATE_IMAGE_CLICK(id, fn) wx__DECLARE_TREEEVT(STATE_IMAGE_CLICK, id, fn) + +// GetItem() is the item for which the tooltip is being requested +#define EVT_TREE_ITEM_GETTOOLTIP(id, fn) wx__DECLARE_TREEEVT(ITEM_GETTOOLTIP, id, fn) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_TREE_BEGIN_DRAG wxEVT_TREE_BEGIN_DRAG +#define wxEVT_COMMAND_TREE_BEGIN_RDRAG wxEVT_TREE_BEGIN_RDRAG +#define wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT wxEVT_TREE_BEGIN_LABEL_EDIT +#define wxEVT_COMMAND_TREE_END_LABEL_EDIT wxEVT_TREE_END_LABEL_EDIT +#define wxEVT_COMMAND_TREE_DELETE_ITEM wxEVT_TREE_DELETE_ITEM +#define wxEVT_COMMAND_TREE_GET_INFO wxEVT_TREE_GET_INFO +#define wxEVT_COMMAND_TREE_SET_INFO wxEVT_TREE_SET_INFO +#define wxEVT_COMMAND_TREE_ITEM_EXPANDED wxEVT_TREE_ITEM_EXPANDED +#define wxEVT_COMMAND_TREE_ITEM_EXPANDING wxEVT_TREE_ITEM_EXPANDING +#define wxEVT_COMMAND_TREE_ITEM_COLLAPSED wxEVT_TREE_ITEM_COLLAPSED +#define wxEVT_COMMAND_TREE_ITEM_COLLAPSING wxEVT_TREE_ITEM_COLLAPSING +#define wxEVT_COMMAND_TREE_SEL_CHANGED wxEVT_TREE_SEL_CHANGED +#define wxEVT_COMMAND_TREE_SEL_CHANGING wxEVT_TREE_SEL_CHANGING +#define wxEVT_COMMAND_TREE_KEY_DOWN wxEVT_TREE_KEY_DOWN +#define wxEVT_COMMAND_TREE_ITEM_ACTIVATED wxEVT_TREE_ITEM_ACTIVATED +#define wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK wxEVT_TREE_ITEM_RIGHT_CLICK +#define wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK wxEVT_TREE_ITEM_MIDDLE_CLICK +#define wxEVT_COMMAND_TREE_END_DRAG wxEVT_TREE_END_DRAG +#define wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK wxEVT_TREE_STATE_IMAGE_CLICK +#define wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP wxEVT_TREE_ITEM_GETTOOLTIP +#define wxEVT_COMMAND_TREE_ITEM_MENU wxEVT_TREE_ITEM_MENU + +#endif // wxUSE_TREECTRL + +#endif // _WX_TREEBASE_H_ diff --git a/wxmsw/include/wx-3.0/wx/treebook.h b/wxmsw/include/wx-3.0/wx/treebook.h new file mode 100644 index 00000000..bd593389 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/treebook.h @@ -0,0 +1,263 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/treebook.h +// Purpose: wxTreebook: wxNotebook-like control presenting pages in a tree +// Author: Evgeniy Tarassov, Vadim Zeitlin +// Modified by: +// Created: 2005-09-15 +// Copyright: (c) 2005 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TREEBOOK_H_ +#define _WX_TREEBOOK_H_ + +#include "wx/defs.h" + +#if wxUSE_TREEBOOK + +#include "wx/bookctrl.h" +#include "wx/containr.h" +#include "wx/treectrl.h" // for wxArrayTreeItemIds + +typedef wxWindow wxTreebookPage; + +class WXDLLIMPEXP_FWD_CORE wxTreeEvent; + +// ---------------------------------------------------------------------------- +// wxTreebook +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTreebook : public wxNavigationEnabled<wxBookCtrlBase> +{ +public: + // Constructors and such + // --------------------- + + // Default ctor doesn't create the control, use Create() afterwards + wxTreebook() + { + Init(); + } + + // This ctor creates the tree book control + wxTreebook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxBK_DEFAULT, + const wxString& name = wxEmptyString) + { + Init(); + + (void)Create(parent, id, pos, size, style, name); + } + + // Really creates the control + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxBK_DEFAULT, + const wxString& name = wxEmptyString); + + + // Page insertion operations + // ------------------------- + + // Notice that page pointer may be NULL in which case the next non NULL + // page (usually the first child page of a node) is shown when this page is + // selected + + // Inserts a new page just before the page indicated by page. + // The new page is placed on the same level as page. + virtual bool InsertPage(size_t pos, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = NO_IMAGE); + + // Inserts a new sub-page to the end of children of the page at given pos. + virtual bool InsertSubPage(size_t pos, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = NO_IMAGE); + + // Adds a new page at top level after all other pages. + virtual bool AddPage(wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = NO_IMAGE); + + // Adds a new child-page to the last top-level page inserted. + // Useful when constructing 1 level tree structure. + virtual bool AddSubPage(wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = NO_IMAGE); + + // Deletes the page and ALL its children. Could trigger page selection + // change in a case when selected page is removed. In that case its parent + // is selected (or the next page if no parent). + virtual bool DeletePage(size_t pos); + + + // Tree operations + // --------------- + + // Gets the page node state -- node is expanded or collapsed + virtual bool IsNodeExpanded(size_t pos) const; + + // Expands or collapses the page node. Returns the previous state. + // May generate page changing events (if selected page + // is under the collapsed branch, then parent is autoselected). + virtual bool ExpandNode(size_t pos, bool expand = true); + + // shortcut for ExpandNode(pos, false) + bool CollapseNode(size_t pos) { return ExpandNode(pos, false); } + + // get the parent page or wxNOT_FOUND if this is a top level page + int GetPageParent(size_t pos) const; + + // the tree control we use for showing the pages index tree + wxTreeCtrl* GetTreeCtrl() const { return (wxTreeCtrl*)m_bookctrl; } + + + // Standard operations inherited from wxBookCtrlBase + // ------------------------------------------------- + + virtual bool SetPageText(size_t n, const wxString& strText); + virtual wxString GetPageText(size_t n) const; + virtual int GetPageImage(size_t n) const; + virtual bool SetPageImage(size_t n, int imageId); + virtual int SetSelection(size_t n) { return DoSetSelection(n, SetSelection_SendEvent); } + virtual int ChangeSelection(size_t n) { return DoSetSelection(n); } + virtual int HitTest(const wxPoint& pt, long *flags = NULL) const; + virtual void SetImageList(wxImageList *imageList); + virtual void AssignImageList(wxImageList *imageList); + virtual bool DeleteAllPages(); + +protected: + // Implementation of a page removal. See DeletPage for comments. + wxTreebookPage *DoRemovePage(size_t pos); + + // This subclass of wxBookCtrlBase accepts NULL page pointers (empty pages) + virtual bool AllowNullPage() const { return true; } + + // event handlers + void OnTreeSelectionChange(wxTreeEvent& event); + void OnTreeNodeExpandedCollapsed(wxTreeEvent& event); + + // array of page ids and page windows + wxArrayTreeItemIds m_treeIds; + + // in the situation when m_selection page is not wxNOT_FOUND but page is + // NULL this is the first (sub)child that has a non-NULL page + int m_actualSelection; + +private: + // common part of all constructors + void Init(); + + // The real implementations of page insertion functions + // ------------------------------------------------------ + // All DoInsert/Add(Sub)Page functions add the page into : + // - the base class + // - the tree control + // - update the index/TreeItemId corespondance array + bool DoInsertPage(size_t pos, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = NO_IMAGE); + bool DoInsertSubPage(size_t pos, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = NO_IMAGE); + bool DoAddSubPage(wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = NO_IMAGE); + + // Sets selection in the tree control and updates the page being shown. + int DoSetSelection(size_t pos, int flags = 0); + + // Returns currently shown page. In a case when selected the node + // has empty (NULL) page finds first (sub)child with not-empty page. + wxTreebookPage *DoGetCurrentPage() const; + + // Does the selection update. Called from page insertion functions + // to update selection if the selected page was pushed by the newly inserted + void DoUpdateSelection(bool bSelect, int page); + + + // Operations on the internal private members of the class + // ------------------------------------------------------- + // Returns the page TreeItemId for the page. + // Or, if the page index is incorrect, a fake one (fakePage.IsOk() == false) + wxTreeItemId DoInternalGetPage(size_t pos) const; + + // Linear search for a page with the id specified. If no page + // found wxNOT_FOUND is returned. The function is used when we catch an event + // from m_tree (wxTreeCtrl) component. + int DoInternalFindPageById(wxTreeItemId page) const; + + // Updates page and wxTreeItemId correspondance. + void DoInternalAddPage(size_t newPos, wxWindow *page, wxTreeItemId pageId); + + // Removes the page from internal structure. + void DoInternalRemovePage(size_t pos) + { DoInternalRemovePageRange(pos, 0); } + + // Removes the page and all its children designated by subCount + // from internal structures of the control. + void DoInternalRemovePageRange(size_t pos, size_t subCount); + + // Returns internal number of pages which can be different from + // GetPageCount() while performing a page insertion or removal. + size_t DoInternalGetPageCount() const { return m_treeIds.GetCount(); } + + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxTreebook) +}; + + +// ---------------------------------------------------------------------------- +// treebook event class and related stuff +// ---------------------------------------------------------------------------- + +// wxTreebookEvent is obsolete and defined for compatibility only +#define wxTreebookEvent wxBookCtrlEvent +typedef wxBookCtrlEventFunction wxTreebookEventFunction; +#define wxTreebookEventHandler(func) wxBookCtrlEventHandler(func) + + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREEBOOK_PAGE_CHANGED, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREEBOOK_PAGE_CHANGING, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREEBOOK_NODE_COLLAPSED, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREEBOOK_NODE_EXPANDED, wxBookCtrlEvent ); + +#define EVT_TREEBOOK_PAGE_CHANGED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_TREEBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) + +#define EVT_TREEBOOK_PAGE_CHANGING(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_TREEBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) + +#define EVT_TREEBOOK_NODE_COLLAPSED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_TREEBOOK_NODE_COLLAPSED, winid, wxBookCtrlEventHandler(fn)) + +#define EVT_TREEBOOK_NODE_EXPANDED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_TREEBOOK_NODE_EXPANDED, winid, wxBookCtrlEventHandler(fn)) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED wxEVT_TREEBOOK_PAGE_CHANGED +#define wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING wxEVT_TREEBOOK_PAGE_CHANGING +#define wxEVT_COMMAND_TREEBOOK_NODE_COLLAPSED wxEVT_TREEBOOK_NODE_COLLAPSED +#define wxEVT_COMMAND_TREEBOOK_NODE_EXPANDED wxEVT_TREEBOOK_NODE_EXPANDED + + +#endif // wxUSE_TREEBOOK + +#endif // _WX_TREEBOOK_H_ diff --git a/wxmsw/include/wx-3.0/wx/treectrl.h b/wxmsw/include/wx-3.0/wx/treectrl.h new file mode 100644 index 00000000..89493c3b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/treectrl.h @@ -0,0 +1,477 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/treectrl.h +// Purpose: wxTreeCtrl base header +// Author: Karsten Ballueder +// Modified by: +// Created: +// Copyright: (c) Karsten Ballueder +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TREECTRL_H_BASE_ +#define _WX_TREECTRL_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_TREECTRL + +#include "wx/control.h" +#include "wx/treebase.h" +#include "wx/textctrl.h" // wxTextCtrl::ms_classinfo used through wxCLASSINFO macro + +class WXDLLIMPEXP_FWD_CORE wxImageList; + +// ---------------------------------------------------------------------------- +// wxTreeCtrlBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxTreeCtrlBase : public wxControl +{ +public: + wxTreeCtrlBase(); + virtual ~wxTreeCtrlBase(); + + // accessors + // --------- + + // get the total number of items in the control + virtual unsigned int GetCount() const = 0; + + // indent is the number of pixels the children are indented relative to + // the parents position. SetIndent() also redraws the control + // immediately. + virtual unsigned int GetIndent() const = 0; + virtual void SetIndent(unsigned int indent) = 0; + + // spacing is the number of pixels between the start and the Text + // (has no effect under wxMSW) + unsigned int GetSpacing() const { return m_spacing; } + void SetSpacing(unsigned int spacing) { m_spacing = spacing; } + + // image list: these functions allow to associate an image list with + // the control and retrieve it. Note that the control does _not_ delete + // the associated image list when it's deleted in order to allow image + // lists to be shared between different controls. + // + // The normal image list is for the icons which correspond to the + // normal tree item state (whether it is selected or not). + // Additionally, the application might choose to show a state icon + // which corresponds to an app-defined item state (for example, + // checked/unchecked) which are taken from the state image list. + wxImageList *GetImageList() const { return m_imageListNormal; } + wxImageList *GetStateImageList() const { return m_imageListState; } + + virtual void SetImageList(wxImageList *imageList) = 0; + virtual void SetStateImageList(wxImageList *imageList) = 0; + void AssignImageList(wxImageList *imageList) + { + SetImageList(imageList); + m_ownsImageListNormal = true; + } + void AssignStateImageList(wxImageList *imageList) + { + SetStateImageList(imageList); + m_ownsImageListState = true; + } + + + // Functions to work with tree ctrl items. Unfortunately, they can _not_ be + // member functions of wxTreeItem because they must know the tree the item + // belongs to for Windows implementation and storing the pointer to + // wxTreeCtrl in each wxTreeItem is just too much waste. + + // accessors + // --------- + + // retrieve items label + virtual wxString GetItemText(const wxTreeItemId& item) const = 0; + // get one of the images associated with the item (normal by default) + virtual int GetItemImage(const wxTreeItemId& item, + wxTreeItemIcon which = wxTreeItemIcon_Normal) const = 0; + // get the data associated with the item + virtual wxTreeItemData *GetItemData(const wxTreeItemId& item) const = 0; + + // get the item's text colour + virtual wxColour GetItemTextColour(const wxTreeItemId& item) const = 0; + + // get the item's background colour + virtual wxColour GetItemBackgroundColour(const wxTreeItemId& item) const = 0; + + // get the item's font + virtual wxFont GetItemFont(const wxTreeItemId& item) const = 0; + + // get the items state + int GetItemState(const wxTreeItemId& item) const + { + return DoGetItemState(item); + } + + // modifiers + // --------- + + // set items label + virtual void SetItemText(const wxTreeItemId& item, const wxString& text) = 0; + // set one of the images associated with the item (normal by default) + virtual void SetItemImage(const wxTreeItemId& item, + int image, + wxTreeItemIcon which = wxTreeItemIcon_Normal) = 0; + // associate some data with the item + virtual void SetItemData(const wxTreeItemId& item, wxTreeItemData *data) = 0; + + // force appearance of [+] button near the item. This is useful to + // allow the user to expand the items which don't have any children now + // - but instead add them only when needed, thus minimizing memory + // usage and loading time. + virtual void SetItemHasChildren(const wxTreeItemId& item, + bool has = true) = 0; + + // the item will be shown in bold + virtual void SetItemBold(const wxTreeItemId& item, bool bold = true) = 0; + + // the item will be shown with a drop highlight + virtual void SetItemDropHighlight(const wxTreeItemId& item, + bool highlight = true) = 0; + + // set the items text colour + virtual void SetItemTextColour(const wxTreeItemId& item, + const wxColour& col) = 0; + + // set the items background colour + virtual void SetItemBackgroundColour(const wxTreeItemId& item, + const wxColour& col) = 0; + + // set the items font (should be of the same height for all items) + virtual void SetItemFont(const wxTreeItemId& item, + const wxFont& font) = 0; + + // set the items state (special state values: wxTREE_ITEMSTATE_NONE/NEXT/PREV) + void SetItemState(const wxTreeItemId& item, int state); + + // item status inquiries + // --------------------- + + // is the item visible (it might be outside the view or not expanded)? + virtual bool IsVisible(const wxTreeItemId& item) const = 0; + // does the item has any children? + virtual bool ItemHasChildren(const wxTreeItemId& item) const = 0; + // same as above + bool HasChildren(const wxTreeItemId& item) const + { return ItemHasChildren(item); } + // is the item expanded (only makes sense if HasChildren())? + virtual bool IsExpanded(const wxTreeItemId& item) const = 0; + // is this item currently selected (the same as has focus)? + virtual bool IsSelected(const wxTreeItemId& item) const = 0; + // is item text in bold font? + virtual bool IsBold(const wxTreeItemId& item) const = 0; + // is the control empty? + bool IsEmpty() const; + + + // number of children + // ------------------ + + // if 'recursively' is false, only immediate children count, otherwise + // the returned number is the number of all items in this branch + virtual size_t GetChildrenCount(const wxTreeItemId& item, + bool recursively = true) const = 0; + + // navigation + // ---------- + + // wxTreeItemId.IsOk() will return false if there is no such item + + // get the root tree item + virtual wxTreeItemId GetRootItem() const = 0; + + // get the item currently selected (may return NULL if no selection) + virtual wxTreeItemId GetSelection() const = 0; + + // get the items currently selected, return the number of such item + // + // NB: this operation is expensive and can take a long time for a + // control with a lot of items (~ O(number of items)). + virtual size_t GetSelections(wxArrayTreeItemIds& selections) const = 0; + + // get the last item to be clicked when the control has wxTR_MULTIPLE + // equivalent to GetSelection() if not wxTR_MULTIPLE + virtual wxTreeItemId GetFocusedItem() const = 0; + + + // Clears the currently focused item + virtual void ClearFocusedItem() = 0; + // Sets the currently focused item. Item should be valid + virtual void SetFocusedItem(const wxTreeItemId& item) = 0; + + + // get the parent of this item (may return NULL if root) + virtual wxTreeItemId GetItemParent(const wxTreeItemId& item) const = 0; + + // for this enumeration function you must pass in a "cookie" parameter + // which is opaque for the application but is necessary for the library + // to make these functions reentrant (i.e. allow more than one + // enumeration on one and the same object simultaneously). Of course, + // the "cookie" passed to GetFirstChild() and GetNextChild() should be + // the same! + + // get the first child of this item + virtual wxTreeItemId GetFirstChild(const wxTreeItemId& item, + wxTreeItemIdValue& cookie) const = 0; + // get the next child + virtual wxTreeItemId GetNextChild(const wxTreeItemId& item, + wxTreeItemIdValue& cookie) const = 0; + // get the last child of this item - this method doesn't use cookies + virtual wxTreeItemId GetLastChild(const wxTreeItemId& item) const = 0; + + // get the next sibling of this item + virtual wxTreeItemId GetNextSibling(const wxTreeItemId& item) const = 0; + // get the previous sibling + virtual wxTreeItemId GetPrevSibling(const wxTreeItemId& item) const = 0; + + // get first visible item + virtual wxTreeItemId GetFirstVisibleItem() const = 0; + // get the next visible item: item must be visible itself! + // see IsVisible() and wxTreeCtrl::GetFirstVisibleItem() + virtual wxTreeItemId GetNextVisible(const wxTreeItemId& item) const = 0; + // get the previous visible item: item must be visible itself! + virtual wxTreeItemId GetPrevVisible(const wxTreeItemId& item) const = 0; + + // operations + // ---------- + + // add the root node to the tree + virtual wxTreeItemId AddRoot(const wxString& text, + int image = -1, int selImage = -1, + wxTreeItemData *data = NULL) = 0; + + // insert a new item in as the first child of the parent + wxTreeItemId PrependItem(const wxTreeItemId& parent, + const wxString& text, + int image = -1, int selImage = -1, + wxTreeItemData *data = NULL) + { + return DoInsertItem(parent, 0u, text, image, selImage, data); + } + + // insert a new item after a given one + wxTreeItemId InsertItem(const wxTreeItemId& parent, + const wxTreeItemId& idPrevious, + const wxString& text, + int image = -1, int selImage = -1, + wxTreeItemData *data = NULL) + { + return DoInsertAfter(parent, idPrevious, text, image, selImage, data); + } + + // insert a new item before the one with the given index + wxTreeItemId InsertItem(const wxTreeItemId& parent, + size_t pos, + const wxString& text, + int image = -1, int selImage = -1, + wxTreeItemData *data = NULL) + { + return DoInsertItem(parent, pos, text, image, selImage, data); + } + + // insert a new item in as the last child of the parent + wxTreeItemId AppendItem(const wxTreeItemId& parent, + const wxString& text, + int image = -1, int selImage = -1, + wxTreeItemData *data = NULL) + { + return DoInsertItem(parent, (size_t)-1, text, image, selImage, data); + } + + // delete this item and associated data if any + virtual void Delete(const wxTreeItemId& item) = 0; + // delete all children (but don't delete the item itself) + // NB: this won't send wxEVT_TREE_ITEM_DELETED events + virtual void DeleteChildren(const wxTreeItemId& item) = 0; + // delete all items from the tree + // NB: this won't send wxEVT_TREE_ITEM_DELETED events + virtual void DeleteAllItems() = 0; + + // expand this item + virtual void Expand(const wxTreeItemId& item) = 0; + // expand the item and all its children recursively + void ExpandAllChildren(const wxTreeItemId& item); + // expand all items + void ExpandAll(); + // collapse the item without removing its children + virtual void Collapse(const wxTreeItemId& item) = 0; + // collapse the item and all its children + void CollapseAllChildren(const wxTreeItemId& item); + // collapse all items + void CollapseAll(); + // collapse the item and remove all children + virtual void CollapseAndReset(const wxTreeItemId& item) = 0; + // toggles the current state + virtual void Toggle(const wxTreeItemId& item) = 0; + + // remove the selection from currently selected item (if any) + virtual void Unselect() = 0; + // unselect all items (only makes sense for multiple selection control) + virtual void UnselectAll() = 0; + // select this item + virtual void SelectItem(const wxTreeItemId& item, bool select = true) = 0; + // selects all (direct) children for given parent (only for + // multiselection controls) + virtual void SelectChildren(const wxTreeItemId& parent) = 0; + // unselect this item + void UnselectItem(const wxTreeItemId& item) { SelectItem(item, false); } + // toggle item selection + void ToggleItemSelection(const wxTreeItemId& item) + { + SelectItem(item, !IsSelected(item)); + } + + // make sure this item is visible (expanding the parent item and/or + // scrolling to this item if necessary) + virtual void EnsureVisible(const wxTreeItemId& item) = 0; + // scroll to this item (but don't expand its parent) + virtual void ScrollTo(const wxTreeItemId& item) = 0; + + // start editing the item label: this (temporarily) replaces the item + // with a one line edit control. The item will be selected if it hadn't + // been before. textCtrlClass parameter allows you to create an edit + // control of arbitrary user-defined class deriving from wxTextCtrl. + virtual wxTextCtrl *EditLabel(const wxTreeItemId& item, + wxClassInfo* textCtrlClass = wxCLASSINFO(wxTextCtrl)) = 0; + // returns the same pointer as StartEdit() if the item is being edited, + // NULL otherwise (it's assumed that no more than one item may be + // edited simultaneously) + virtual wxTextCtrl *GetEditControl() const = 0; + // end editing and accept or discard the changes to item label + virtual void EndEditLabel(const wxTreeItemId& item, + bool discardChanges = false) = 0; + + // Enable or disable beep when incremental match doesn't find any item. + // Only implemented in the generic version currently. + virtual void EnableBellOnNoMatch(bool WXUNUSED(on) = true) { } + + // sorting + // ------- + + // this function is called to compare 2 items and should return -1, 0 + // or +1 if the first item is less than, equal to or greater than the + // second one. The base class version performs alphabetic comparaison + // of item labels (GetText) + virtual int OnCompareItems(const wxTreeItemId& item1, + const wxTreeItemId& item2) + { + return wxStrcmp(GetItemText(item1), GetItemText(item2)); + } + + // sort the children of this item using OnCompareItems + // + // NB: this function is not reentrant and not MT-safe (FIXME)! + virtual void SortChildren(const wxTreeItemId& item) = 0; + + // items geometry + // -------------- + + // determine to which item (if any) belongs the given point (the + // coordinates specified are relative to the client area of tree ctrl) + // and, in the second variant, fill the flags parameter with a bitmask + // of wxTREE_HITTEST_xxx constants. + wxTreeItemId HitTest(const wxPoint& point) const + { int dummy; return DoTreeHitTest(point, dummy); } + wxTreeItemId HitTest(const wxPoint& point, int& flags) const + { return DoTreeHitTest(point, flags); } + + // get the bounding rectangle of the item (or of its label only) + virtual bool GetBoundingRect(const wxTreeItemId& item, + wxRect& rect, + bool textOnly = false) const = 0; + + + // implementation + // -------------- + + virtual bool ShouldInheritColours() const { return false; } + + // hint whether to calculate best size quickly or accurately + void SetQuickBestSize(bool q) { m_quickBestSize = q; } + bool GetQuickBestSize() const { return m_quickBestSize; } + +protected: + virtual wxSize DoGetBestSize() const; + + // common part of Get/SetItemState() + virtual int DoGetItemState(const wxTreeItemId& item) const = 0; + virtual void DoSetItemState(const wxTreeItemId& item, int state) = 0; + + // common part of Append/Prepend/InsertItem() + // + // pos is the position at which to insert the item or (size_t)-1 to append + // it to the end + virtual wxTreeItemId DoInsertItem(const wxTreeItemId& parent, + size_t pos, + const wxString& text, + int image, int selImage, + wxTreeItemData *data) = 0; + + // and this function implements overloaded InsertItem() taking wxTreeItemId + // (it can't be called InsertItem() as we'd have virtual function hiding + // problem in derived classes then) + virtual wxTreeItemId DoInsertAfter(const wxTreeItemId& parent, + const wxTreeItemId& idPrevious, + const wxString& text, + int image = -1, int selImage = -1, + wxTreeItemData *data = NULL) = 0; + + // real HitTest() implementation: again, can't be called just HitTest() + // because it's overloaded and so the non-virtual overload would be hidden + // (and can't be called DoHitTest() because this is already in wxWindow) + virtual wxTreeItemId DoTreeHitTest(const wxPoint& point, + int& flags) const = 0; + + + wxImageList *m_imageListNormal, // images for tree elements + *m_imageListState; // special images for app defined states + bool m_ownsImageListNormal, + m_ownsImageListState; + + // spacing between left border and the text + unsigned int m_spacing; + + // whether full or quick calculation is done in DoGetBestSize + bool m_quickBestSize; + + +private: + // Intercept Escape and Return keys to ensure that our in-place edit + // control always gets them before they're used for dialog navigation or + // anything else. + void OnCharHook(wxKeyEvent& event); + + + wxDECLARE_NO_COPY_CLASS(wxTreeCtrlBase); +}; + +// ---------------------------------------------------------------------------- +// include the platform-dependent wxTreeCtrl class +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/generic/treectlg.h" +#elif defined(__WXMSW__) + #include "wx/msw/treectrl.h" +#elif defined(__WXMOTIF__) + #include "wx/generic/treectlg.h" +#elif defined(__WXGTK__) + #include "wx/generic/treectlg.h" +#elif defined(__WXMAC__) + #include "wx/generic/treectlg.h" +#elif defined(__WXCOCOA__) + #include "wx/generic/treectlg.h" +#elif defined(__WXPM__) + #include "wx/generic/treectlg.h" +#endif + +#endif // wxUSE_TREECTRL + +#endif // _WX_TREECTRL_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/treelist.h b/wxmsw/include/wx-3.0/wx/treelist.h new file mode 100644 index 00000000..d06e35e8 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/treelist.h @@ -0,0 +1,576 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/treelist.h +// Purpose: wxTreeListCtrl class declaration. +// Author: Vadim Zeitlin +// Created: 2011-08-17 +// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TREELIST_H_ +#define _WX_TREELIST_H_ + +#include "wx/defs.h" + +#if wxUSE_TREELISTCTRL + +#include "wx/compositewin.h" +#include "wx/containr.h" +#include "wx/headercol.h" +#include "wx/itemid.h" +#include "wx/vector.h" +#include "wx/window.h" +#include "wx/withimages.h" + +class WXDLLIMPEXP_FWD_ADV wxDataViewCtrl; +class WXDLLIMPEXP_FWD_ADV wxDataViewEvent; + +extern WXDLLIMPEXP_DATA_ADV(const char) wxTreeListCtrlNameStr[]; + +class wxTreeListCtrl; +class wxTreeListModel; +class wxTreeListModelNode; + +// ---------------------------------------------------------------------------- +// Constants. +// ---------------------------------------------------------------------------- + +// wxTreeListCtrl styles. +// +// Notice that using wxTL_USER_3STATE implies wxTL_3STATE and wxTL_3STATE in +// turn implies wxTL_CHECKBOX. +enum +{ + wxTL_SINGLE = 0x0000, // This is the default anyhow. + wxTL_MULTIPLE = 0x0001, // Allow multiple selection. + wxTL_CHECKBOX = 0x0002, // Show checkboxes in the first column. + wxTL_3STATE = 0x0004, // Allow 3rd state in checkboxes. + wxTL_USER_3STATE = 0x0008, // Allow user to set 3rd state. + wxTL_NO_HEADER = 0x0010, // Column titles not visible. + + wxTL_DEFAULT_STYLE = wxTL_SINGLE, + wxTL_STYLE_MASK = wxTL_SINGLE | + wxTL_MULTIPLE | + wxTL_CHECKBOX | + wxTL_3STATE | + wxTL_USER_3STATE +}; + +// ---------------------------------------------------------------------------- +// wxTreeListItem: unique identifier of an item in wxTreeListCtrl. +// ---------------------------------------------------------------------------- + +// Make wxTreeListItem a forward-declarable class even though it's simple +// enough to possibly be declared as a simple typedef. +class wxTreeListItem : public wxItemId<wxTreeListModelNode*> +{ +public: + wxTreeListItem(wxTreeListModelNode* item = NULL) + : wxItemId<wxTreeListModelNode*>(item) + { + } +}; + +// Container of multiple items. +typedef wxVector<wxTreeListItem> wxTreeListItems; + +// Some special "items" that can be used with InsertItem(): +extern WXDLLIMPEXP_DATA_ADV(const wxTreeListItem) wxTLI_FIRST; +extern WXDLLIMPEXP_DATA_ADV(const wxTreeListItem) wxTLI_LAST; + +// ---------------------------------------------------------------------------- +// wxTreeListItemComparator: defines order of wxTreeListCtrl items. +// ---------------------------------------------------------------------------- + +class wxTreeListItemComparator +{ +public: + wxTreeListItemComparator() { } + + // The comparison function should return negative, null or positive value + // depending on whether the first item is less than, equal to or greater + // than the second one. The items should be compared using their values for + // the given column. + virtual int + Compare(wxTreeListCtrl* treelist, + unsigned column, + wxTreeListItem first, + wxTreeListItem second) = 0; + + // Although this class is not used polymorphically by wxWidgets itself, + // provide virtual dtor in case it's used like this in the user code. + virtual ~wxTreeListItemComparator() { } + +private: + wxDECLARE_NO_COPY_CLASS(wxTreeListItemComparator); +}; + +// ---------------------------------------------------------------------------- +// wxTreeListCtrl: a control combining wxTree- and wxListCtrl features. +// ---------------------------------------------------------------------------- + +// This control also provides easy to use high level interface. Although the +// implementation uses wxDataViewCtrl internally, this class is intentionally +// simpler than wxDataViewCtrl and doesn't provide all of its functionality. +// +// If you need extra features you can always use GetDataView() accessor to work +// with wxDataViewCtrl directly but doing this makes your unportable to possible +// future non-wxDataViewCtrl-based implementations of this class. + +class WXDLLIMPEXP_ADV wxTreeListCtrl + : public wxCompositeWindow< wxNavigationEnabled<wxWindow> >, + public wxWithImages +{ +public: + // Constructors and such + // --------------------- + + wxTreeListCtrl() { Init(); } + wxTreeListCtrl(wxWindow* parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTL_DEFAULT_STYLE, + const wxString& name = wxTreeListCtrlNameStr) + { + Init(); + + Create(parent, id, pos, size, style, name); + } + + bool Create(wxWindow* parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTL_DEFAULT_STYLE, + const wxString& name = wxTreeListCtrlNameStr); + + + virtual ~wxTreeListCtrl(); + + // Columns methods + // --------------- + + // Add a column with the given title and attributes, returns the index of + // the new column or -1 on failure. + int AppendColumn(const wxString& title, + int width = wxCOL_WIDTH_AUTOSIZE, + wxAlignment align = wxALIGN_LEFT, + int flags = wxCOL_RESIZABLE) + { + return DoInsertColumn(title, -1, width, align, flags); + } + + // Return the total number of columns. + unsigned GetColumnCount() const; + + // Delete the column with the given index, returns false if index is + // invalid or deleting the column failed for some other reason. + bool DeleteColumn(unsigned col); + + // Delete all columns. + void ClearColumns(); + + // Set column width to either the given value in pixels or to the value + // large enough to fit all of the items if width == wxCOL_WIDTH_AUTOSIZE. + void SetColumnWidth(unsigned col, int width); + + // Get the current width of the given column in pixels. + int GetColumnWidth(unsigned col) const; + + // Get the width appropriate for showing the given text. This is typically + // used as second argument for AppendColumn() or with SetColumnWidth(). + int WidthFor(const wxString& text) const; + + + // Item methods + // ------------ + + // Adding items. The parent and text of the first column of the new item + // must always be specified, the rest is optional. + // + // Each item can have two images: one used for closed state and another for + // opened one. Only the first one is ever used for the items that don't + // have children. And both are not set by default. + // + // It is also possible to associate arbitrary client data pointer with the + // new item. It will be deleted by the control when the item is deleted + // (either by an explicit DeleteItem() call or because the entire control + // is destroyed). + + wxTreeListItem AppendItem(wxTreeListItem parent, + const wxString& text, + int imageClosed = NO_IMAGE, + int imageOpened = NO_IMAGE, + wxClientData* data = NULL) + { + return DoInsertItem(parent, wxTLI_LAST, text, + imageClosed, imageOpened, data); + } + + wxTreeListItem InsertItem(wxTreeListItem parent, + wxTreeListItem previous, + const wxString& text, + int imageClosed = NO_IMAGE, + int imageOpened = NO_IMAGE, + wxClientData* data = NULL) + { + return DoInsertItem(parent, previous, text, + imageClosed, imageOpened, data); + } + + wxTreeListItem PrependItem(wxTreeListItem parent, + const wxString& text, + int imageClosed = NO_IMAGE, + int imageOpened = NO_IMAGE, + wxClientData* data = NULL) + { + return DoInsertItem(parent, wxTLI_FIRST, text, + imageClosed, imageOpened, data); + } + + // Deleting items. + void DeleteItem(wxTreeListItem item); + void DeleteAllItems(); + + + // Tree navigation + // --------------- + + // Return the (never shown) root item. + wxTreeListItem GetRootItem() const; + + // The parent item may be invalid for the root-level items. + wxTreeListItem GetItemParent(wxTreeListItem item) const; + + // Iterate over the given item children: start by calling GetFirstChild() + // and then call GetNextSibling() for as long as it returns valid item. + wxTreeListItem GetFirstChild(wxTreeListItem item) const; + wxTreeListItem GetNextSibling(wxTreeListItem item) const; + + // Return the first child of the root item, which is also the first item of + // the tree in depth-first traversal order. + wxTreeListItem GetFirstItem() const { return GetFirstChild(GetRootItem()); } + + // Get item after the given one in the depth-first tree-traversal order. + // Calling this function starting with the result of GetFirstItem() allows + // iterating over all items in the tree. + wxTreeListItem GetNextItem(wxTreeListItem item) const; + + + // Items attributes + // ---------------- + + const wxString& GetItemText(wxTreeListItem item, unsigned col = 0) const; + + // The convenience overload below sets the text for the first column. + void SetItemText(wxTreeListItem item, unsigned col, const wxString& text); + void SetItemText(wxTreeListItem item, const wxString& text) + { + SetItemText(item, 0, text); + } + + // By default the opened image is the same as the normal, closed one (if + // it's used at all). + void SetItemImage(wxTreeListItem item, int closed, int opened = NO_IMAGE); + + // Retrieve or set the data associated with the item. + wxClientData* GetItemData(wxTreeListItem item) const; + void SetItemData(wxTreeListItem item, wxClientData* data); + + + // Expanding and collapsing + // ------------------------ + + void Expand(wxTreeListItem item); + void Collapse(wxTreeListItem item); + bool IsExpanded(wxTreeListItem item) const; + + + // Selection handling + // ------------------ + + // This function can be used with single selection controls, use + // GetSelections() with the multi-selection ones. + wxTreeListItem GetSelection() const; + + // This one can be used with either single or multi-selection controls. + unsigned GetSelections(wxTreeListItems& selections) const; + + // In single selection mode Select() deselects any other selected items, in + // multi-selection case it adds to the selection. + void Select(wxTreeListItem item); + + // Can be used in multiple selection mode only, single selected item in the + // single selection mode can't be unselected. + void Unselect(wxTreeListItem item); + + // Return true if the item is selected, can be used in both single and + // multiple selection modes. + bool IsSelected(wxTreeListItem item) const; + + // Select or unselect all items, only valid in multiple selection mode. + void SelectAll(); + void UnselectAll(); + + + // Checkbox handling + // ----------------- + + // Methods in this section can only be used with the controls created with + // wxTL_CHECKBOX style. + + // Simple set, unset or query the checked state. + void CheckItem(wxTreeListItem item, wxCheckBoxState state = wxCHK_CHECKED); + void UncheckItem(wxTreeListItem item) { CheckItem(item, wxCHK_UNCHECKED); } + + // The same but do it recursively for this item itself and its children. + void CheckItemRecursively(wxTreeListItem item, + wxCheckBoxState state = wxCHK_CHECKED); + + // Update the parent of this item recursively: if this item and all its + // siblings are checked, the parent will become checked as well. If this + // item and all its siblings are unchecked, the parent will be unchecked. + // And if the siblings of this item are not all in the same state, the + // parent will be switched to indeterminate state. And then the same logic + // will be applied to the parents parent and so on recursively. + // + // This is typically called when the state of the given item has changed + // from EVT_TREELIST_ITEM_CHECKED() handler in the controls which have + // wxTL_3STATE flag. Notice that without this flag this function can't work + // as it would be unable to set the state of a parent with both checked and + // unchecked items so it's only allowed to call it when this flag is set. + void UpdateItemParentStateRecursively(wxTreeListItem item); + + // Return the current state. + wxCheckBoxState GetCheckedState(wxTreeListItem item) const; + + // Return true if all item children (if any) are in the given state. + bool AreAllChildrenInState(wxTreeListItem item, + wxCheckBoxState state) const; + + + + // Sorting. + // -------- + + // Sort by the given column, either in ascending (default) or descending + // sort order. + // + // By default, simple alphabetical sorting is done by this column contents + // but SetItemComparator() may be called to perform comparison in some + // other way. + void SetSortColumn(unsigned col, bool ascendingOrder = true); + + // If the control contents is sorted, return true and fill the output + // parameters with the column which is currently used for sorting and + // whether we sort using ascending or descending order. Otherwise, i.e. if + // the control contents is unsorted, simply return false. + bool GetSortColumn(unsigned* col, bool* ascendingOrder = NULL); + + // Set the object to use for comparing the items. It will be called when + // the control is being sorted because the user clicked on a sortable + // column. + // + // The provided pointer is stored by the control so the object it points to + // must have a life-time equal or greater to that of the control itself. In + // addition, the pointer can be NULL to stop using custom comparator and + // revert to the default alphabetical comparison. + void SetItemComparator(wxTreeListItemComparator* comparator); + + + // View window functions. + // ---------------------- + + // This control itself is entirely covered by the "view window" which is + // currently a wxDataViewCtrl but if you want to avoid relying on this to + // allow your code to work with later versions which might not be + // wxDataViewCtrl-based, use the first function only and only use the + // second one if you really need to call wxDataViewCtrl methods on it. + wxWindow* GetView() const; + wxDataViewCtrl* GetDataView() const { return m_view; } + +private: + // Common part of all ctors. + void Init(); + + // Pure virtual method inherited from wxCompositeWindow. + virtual wxWindowList GetCompositeWindowParts() const; + + // Implementation of AppendColumn(). + int DoInsertColumn(const wxString& title, + int pos, // May be -1 meaning "append". + int width, + wxAlignment align, + int flags); + + // Common part of {Append,Insert,Prepend}Item(). + wxTreeListItem DoInsertItem(wxTreeListItem parent, + wxTreeListItem previous, + const wxString& text, + int imageClosed, + int imageOpened, + wxClientData* data); + + // Send wxTreeListEvent corresponding to the given wxDataViewEvent for an + // item (as opposed for column-oriented events). + // + // Also updates the original event "skipped" and "vetoed" flags. + void SendItemEvent(wxEventType evt, wxDataViewEvent& event); + + // Send wxTreeListEvent corresponding to the given column wxDataViewEvent. + void SendColumnEvent(wxEventType evt, wxDataViewEvent& event); + + + // Called by wxTreeListModel when an item is toggled by the user. + void OnItemToggled(wxTreeListItem item, wxCheckBoxState stateOld); + + // Event handlers. + void OnSelectionChanged(wxDataViewEvent& event); + void OnItemExpanding(wxDataViewEvent& event); + void OnItemExpanded(wxDataViewEvent& event); + void OnItemActivated(wxDataViewEvent& event); + void OnItemContextMenu(wxDataViewEvent& event); + void OnColumnSorted(wxDataViewEvent& event); + void OnSize(wxSizeEvent& event); + + wxDECLARE_EVENT_TABLE(); + + + wxDataViewCtrl* m_view; + wxTreeListModel* m_model; + + wxTreeListItemComparator* m_comparator; + + + // It calls our inherited protected wxWithImages::GetImage() method. + friend class wxTreeListModel; + + wxDECLARE_NO_COPY_CLASS(wxTreeListCtrl); +}; + +// ---------------------------------------------------------------------------- +// wxTreeListEvent: event generated by wxTreeListCtrl. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxTreeListEvent : public wxNotifyEvent +{ +public: + // Default ctor is provided for wxRTTI needs only but should never be used. + wxTreeListEvent() { Init(); } + + // The item affected by the event. Valid for all events except + // column-specific ones such as COLUMN_SORTED. + wxTreeListItem GetItem() const { return m_item; } + + // The previous state of the item checkbox for ITEM_CHECKED events only. + wxCheckBoxState GetOldCheckedState() const { return m_oldCheckedState; } + + // The index of the column affected by the event. Currently only used by + // COLUMN_SORTED event. + unsigned GetColumn() const { return m_column; } + + virtual wxEvent* Clone() const { return new wxTreeListEvent(*this); } + +private: + // Common part of all ctors. + void Init() + { + m_column = static_cast<unsigned>(-1); + + m_oldCheckedState = wxCHK_UNDETERMINED; + } + + // Ctor is private, only wxTreeListCtrl can create events of this type. + wxTreeListEvent(wxEventType evtType, + wxTreeListCtrl* treelist, + wxTreeListItem item) + : wxNotifyEvent(evtType, treelist->GetId()), + m_item(item) + { + SetEventObject(treelist); + + Init(); + } + + // Set the checkbox state before this event for ITEM_CHECKED events. + void SetOldCheckedState(wxCheckBoxState state) + { + m_oldCheckedState = state; + } + + // Set the column affected by this event for COLUMN_SORTED events. + void SetColumn(unsigned column) + { + m_column = column; + } + + + const wxTreeListItem m_item; + + wxCheckBoxState m_oldCheckedState; + + unsigned m_column; + + friend class wxTreeListCtrl; + + wxDECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxTreeListEvent); +}; + +// Event types and event table macros. + +typedef void (wxEvtHandler::*wxTreeListEventFunction)(wxTreeListEvent&); + +#define wxTreeListEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxTreeListEventFunction, func) + +#define wxEVT_TREELIST_GENERIC(name, id, fn) \ + wx__DECLARE_EVT1(wxEVT_TREELIST_##name, id, wxTreeListEventHandler(fn)) + +#define wxDECLARE_TREELIST_EVENT(name) \ + wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, \ + wxEVT_TREELIST_##name, \ + wxTreeListEvent) + +wxDECLARE_TREELIST_EVENT(SELECTION_CHANGED); +#define EVT_TREELIST_SELECTION_CHANGED(id, fn) \ + wxEVT_TREELIST_GENERIC(SELECTION_CHANGED, id, fn) + +wxDECLARE_TREELIST_EVENT(ITEM_EXPANDING); +#define EVT_TREELIST_ITEM_EXPANDING(id, fn) \ + wxEVT_TREELIST_GENERIC(ITEM_EXPANDING, id, fn) + +wxDECLARE_TREELIST_EVENT(ITEM_EXPANDED); +#define EVT_TREELIST_ITEM_EXPANDED(id, fn) \ + wxEVT_TREELIST_GENERIC(ITEM_EXPANDED, id, fn) + +wxDECLARE_TREELIST_EVENT(ITEM_CHECKED); +#define EVT_TREELIST_ITEM_CHECKED(id, fn) \ + wxEVT_TREELIST_GENERIC(ITEM_CHECKED, id, fn) + +wxDECLARE_TREELIST_EVENT(ITEM_ACTIVATED); +#define EVT_TREELIST_ITEM_ACTIVATED(id, fn) \ + wxEVT_TREELIST_GENERIC(ITEM_ACTIVATED, id, fn) + +wxDECLARE_TREELIST_EVENT(ITEM_CONTEXT_MENU); +#define EVT_TREELIST_ITEM_CONTEXT_MENU(id, fn) \ + wxEVT_TREELIST_GENERIC(ITEM_CONTEXT_MENU, id, fn) + +wxDECLARE_TREELIST_EVENT(COLUMN_SORTED); +#define EVT_TREELIST_COLUMN_SORTED(id, fn) \ + wxEVT_TREELIST_GENERIC(COLUMN_SORTED, id, fn) + +#undef wxDECLARE_TREELIST_EVENT + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_TREELIST_SELECTION_CHANGED wxEVT_TREELIST_SELECTION_CHANGED +#define wxEVT_COMMAND_TREELIST_ITEM_EXPANDING wxEVT_TREELIST_ITEM_EXPANDING +#define wxEVT_COMMAND_TREELIST_ITEM_EXPANDED wxEVT_TREELIST_ITEM_EXPANDED +#define wxEVT_COMMAND_TREELIST_ITEM_CHECKED wxEVT_TREELIST_ITEM_CHECKED +#define wxEVT_COMMAND_TREELIST_ITEM_ACTIVATED wxEVT_TREELIST_ITEM_ACTIVATED +#define wxEVT_COMMAND_TREELIST_ITEM_CONTEXT_MENU wxEVT_TREELIST_ITEM_CONTEXT_MENU +#define wxEVT_COMMAND_TREELIST_COLUMN_SORTED wxEVT_TREELIST_COLUMN_SORTED + +#endif // wxUSE_TREELISTCTRL + +#endif // _WX_TREELIST_H_ diff --git a/wxmsw/include/wx-3.0/wx/txtstrm.h b/wxmsw/include/wx-3.0/wx/txtstrm.h new file mode 100644 index 00000000..90e6bbb2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/txtstrm.h @@ -0,0 +1,164 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/txtstrm.h +// Purpose: Text stream classes +// Author: Guilhem Lavaux +// Modified by: +// Created: 28/06/1998 +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TXTSTREAM_H_ +#define _WX_TXTSTREAM_H_ + +#include "wx/stream.h" +#include "wx/convauto.h" + +#if wxUSE_STREAMS + +class WXDLLIMPEXP_FWD_BASE wxTextInputStream; +class WXDLLIMPEXP_FWD_BASE wxTextOutputStream; + +typedef wxTextInputStream& (*__wxTextInputManip)(wxTextInputStream&); +typedef wxTextOutputStream& (*__wxTextOutputManip)(wxTextOutputStream&); + +WXDLLIMPEXP_BASE wxTextOutputStream &endl( wxTextOutputStream &stream ); + + +#define wxEOT wxT('\4') // the End-Of-Text control code (used only inside wxTextInputStream) + +// If you're scanning through a file using wxTextInputStream, you should check for EOF _before_ +// reading the next item (word / number), because otherwise the last item may get lost. +// You should however be prepared to receive an empty item (empty string / zero number) at the +// end of file, especially on Windows systems. This is unavoidable because most (but not all) files end +// with whitespace (i.e. usually a newline). +class WXDLLIMPEXP_BASE wxTextInputStream +{ +public: +#if wxUSE_UNICODE + wxTextInputStream(wxInputStream& s, + const wxString &sep=wxT(" \t"), + const wxMBConv& conv = wxConvAuto()); +#else + wxTextInputStream(wxInputStream& s, const wxString &sep=wxT(" \t")); +#endif + ~wxTextInputStream(); + + const wxInputStream& GetInputStream() const { return m_input; } + + wxUint32 Read32(int base = 10); // base may be between 2 and 36, inclusive, or the special 0 (= C format) + wxUint16 Read16(int base = 10); + wxUint8 Read8(int base = 10); + wxInt32 Read32S(int base = 10); + wxInt16 Read16S(int base = 10); + wxInt8 Read8S(int base = 10); + double ReadDouble(); + wxString ReadLine(); + wxString ReadWord(); + wxChar GetChar() { wxChar c = NextChar(); return (wxChar)(c != wxEOT ? c : 0); } + + wxString GetStringSeparators() const { return m_separators; } + void SetStringSeparators(const wxString &c) { m_separators = c; } + + // Operators + wxTextInputStream& operator>>(wxString& word); + wxTextInputStream& operator>>(char& c); +#if wxUSE_UNICODE && wxWCHAR_T_IS_REAL_TYPE + wxTextInputStream& operator>>(wchar_t& wc); +#endif // wxUSE_UNICODE + wxTextInputStream& operator>>(wxInt16& i); + wxTextInputStream& operator>>(wxInt32& i); + wxTextInputStream& operator>>(wxUint16& i); + wxTextInputStream& operator>>(wxUint32& i); + wxTextInputStream& operator>>(double& i); + wxTextInputStream& operator>>(float& f); + + wxTextInputStream& operator>>( __wxTextInputManip func) { return func(*this); } + +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( wxString ReadString() ); // use ReadLine or ReadWord instead +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + wxInputStream &m_input; + wxString m_separators; + char m_lastBytes[10]; // stores the bytes that were read for the last character + +#if wxUSE_UNICODE + wxMBConv *m_conv; +#endif + + bool EatEOL(const wxChar &c); + void UngetLast(); // should be used instead of wxInputStream::Ungetch() because of Unicode issues + // returns EOT (\4) if there is a stream error, or end of file + wxChar NextChar(); // this should be used instead of GetC() because of Unicode issues + wxChar NextNonSeparators(); + + wxDECLARE_NO_COPY_CLASS(wxTextInputStream); +}; + +typedef enum +{ + wxEOL_NATIVE, + wxEOL_UNIX, + wxEOL_MAC, + wxEOL_DOS +} wxEOL; + +class WXDLLIMPEXP_BASE wxTextOutputStream +{ +public: +#if wxUSE_UNICODE + wxTextOutputStream(wxOutputStream& s, + wxEOL mode = wxEOL_NATIVE, + const wxMBConv& conv = wxConvAuto()); +#else + wxTextOutputStream(wxOutputStream& s, wxEOL mode = wxEOL_NATIVE); +#endif + virtual ~wxTextOutputStream(); + + const wxOutputStream& GetOutputStream() const { return m_output; } + + void SetMode( wxEOL mode = wxEOL_NATIVE ); + wxEOL GetMode() { return m_mode; } + + void Write32(wxUint32 i); + void Write16(wxUint16 i); + void Write8(wxUint8 i); + virtual void WriteDouble(double d); + virtual void WriteString(const wxString& string); + + wxTextOutputStream& PutChar(wxChar c); + + void Flush(); + + wxTextOutputStream& operator<<(const wxString& string); + wxTextOutputStream& operator<<(char c); +#if wxUSE_UNICODE && wxWCHAR_T_IS_REAL_TYPE + wxTextOutputStream& operator<<(wchar_t wc); +#endif // wxUSE_UNICODE + wxTextOutputStream& operator<<(wxInt16 c); + wxTextOutputStream& operator<<(wxInt32 c); + wxTextOutputStream& operator<<(wxUint16 c); + wxTextOutputStream& operator<<(wxUint32 c); + wxTextOutputStream& operator<<(double f); + wxTextOutputStream& operator<<(float f); + + wxTextOutputStream& operator<<( __wxTextOutputManip func) { return func(*this); } + +protected: + wxOutputStream &m_output; + wxEOL m_mode; + +#if wxUSE_UNICODE + wxMBConv *m_conv; +#endif + + wxDECLARE_NO_COPY_CLASS(wxTextOutputStream); +}; + +#endif + // wxUSE_STREAMS + +#endif + // _WX_DATSTREAM_H_ diff --git a/wxmsw/include/wx-3.0/wx/typeinfo.h b/wxmsw/include/wx-3.0/wx/typeinfo.h new file mode 100644 index 00000000..a783af5d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/typeinfo.h @@ -0,0 +1,147 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/typeinfo.h +// Purpose: wxTypeId implementation +// Author: Jaakko Salli +// Created: 2009-11-19 +// Copyright: (c) wxWidgets Team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TYPEINFO_H_ +#define _WX_TYPEINFO_H_ + +// +// This file defines wxTypeId macro that should be used internally in +// wxWidgets instead of typeid(), for compatibility with builds that do +// not implement C++ RTTI. Also, type defining macros in this file are +// intended for internal use only at this time and may change in future +// versions. +// +// The reason why we need this simple RTTI system in addition to the older +// wxObject-based one is that the latter does not work in template +// classes. +// + +#include "wx/defs.h" + +#ifndef wxNO_RTTI + +// +// Let's trust that Visual C++ versions 9.0 and later implement C++ +// RTTI well enough, so we can use it and work around harmless memory +// leaks reported by the static run-time libraries. +// +#if wxCHECK_VISUALC_VERSION(9) + #define wxTRUST_CPP_RTTI 1 +#else + #define wxTRUST_CPP_RTTI 0 +#endif + +#include <typeinfo> +#include <string.h> + +#define _WX_DECLARE_TYPEINFO_CUSTOM(CLS, IDENTFUNC) +#define WX_DECLARE_TYPEINFO_INLINE(CLS) +#define WX_DECLARE_TYPEINFO(CLS) +#define WX_DEFINE_TYPEINFO(CLS) +#define WX_DECLARE_ABSTRACT_TYPEINFO(CLS) + +#if wxTRUST_CPP_RTTI + +#define wxTypeId typeid + +#else /* !wxTRUST_CPP_RTTI */ + +// +// For improved type-safety, let's make the check using class name +// comparison. Most modern compilers already do this, but we cannot +// rely on all supported compilers to work this well. However, in +// cases where we'd know that typeid() would be flawless (as such), +// wxTypeId could of course simply be defined as typeid. +// + +class wxTypeIdentifier +{ +public: + wxTypeIdentifier(const char* className) + { + m_className = className; + } + + bool operator==(const wxTypeIdentifier& other) + { + return strcmp(m_className, other.m_className) == 0; + } + + bool operator!=(const wxTypeIdentifier& other) + { + return strcmp(m_className, other.m_className) != 0; + } +private: + const char* m_className; +}; + +#define wxTypeId(OBJ) wxTypeIdentifier(typeid(OBJ).name()) + +#endif /* wxTRUST_CPP_RTTI/!wxTRUST_CPP_RTTI */ + +#else // if !wxNO_RTTI + +#define wxTRUST_CPP_RTTI 0 + +// +// When C++ RTTI is not available, we will have to make the type comparison +// using pointer to a dummy static member function. This will fail if +// declared type is used across DLL boundaries, although using +// WX_DECLARE_TYPEINFO() and WX_DEFINE_TYPEINFO() pair instead of +// WX_DECLARE_TYPEINFO_INLINE() should fix this. However, that approach is +// usually not possible when type info needs to be declared for a template +// class. +// + +typedef void (*wxTypeIdentifier)(); + +// Use this macro to declare type info with specified static function +// IDENTFUNC used as type identifier. Usually you should only use +// WX_DECLARE_TYPEINFO() or WX_DECLARE_TYPEINFO_INLINE() however. +#define _WX_DECLARE_TYPEINFO_CUSTOM(CLS, IDENTFUNC) \ +public: \ + virtual wxTypeIdentifier GetWxTypeId() const \ + { \ + return reinterpret_cast<wxTypeIdentifier> \ + (&IDENTFUNC); \ + } + +// Use this macro to declare type info with externally specified +// type identifier, defined with WX_DEFINE_TYPEINFO(). +#define WX_DECLARE_TYPEINFO(CLS) \ +private: \ + static CLS sm_wxClassInfo(); \ +_WX_DECLARE_TYPEINFO_CUSTOM(CLS, sm_wxClassInfo) + +// Use this macro to implement type identifier function required by +// WX_DECLARE_TYPEINFO(). +// NOTE: CLS is required to have default ctor. If it doesn't +// already, you should provide a private dummy one. +#define WX_DEFINE_TYPEINFO(CLS) \ +CLS CLS::sm_wxClassInfo() { return CLS(); } + +// Use this macro to declare type info fully inline in class. +// NOTE: CLS is required to have default ctor. If it doesn't +// already, you should provide a private dummy one. +#define WX_DECLARE_TYPEINFO_INLINE(CLS) \ +private: \ + static CLS sm_wxClassInfo() { return CLS(); } \ +_WX_DECLARE_TYPEINFO_CUSTOM(CLS, sm_wxClassInfo) + +#define wxTypeId(OBJ) (OBJ).GetWxTypeId() + +// Because abstract classes cannot be instantiated, we use +// this macro to define pure virtual type interface for them. +#define WX_DECLARE_ABSTRACT_TYPEINFO(CLS) \ +public: \ + virtual wxTypeIdentifier GetWxTypeId() const = 0; + +#endif // wxNO_RTTI/!wxNO_RTTI + +#endif // _WX_TYPEINFO_H_ diff --git a/wxmsw/include/wx-3.0/wx/types.h b/wxmsw/include/wx-3.0/wx/types.h new file mode 100644 index 00000000..2e585821 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/types.h @@ -0,0 +1,92 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/types.h +// Purpose: Type identifiers, used by resource system +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TYPESH__ +#define _WX_TYPESH__ + +// Types of objects +#define wxTYPE_ANY 0 +#define wxTYPE_OBJECT wxTYPE_ANY +#define wxTYPE_WINDOW 1 +#define wxTYPE_DIALOG_BOX 2 +#define wxTYPE_ITEM 3 +#define wxTYPE_PANEL 4 +#define wxTYPE_CANVAS 5 +#define wxTYPE_TEXT_WINDOW 6 +#define wxTYPE_FRAME 7 + +#define wxTYPE_BUTTON 8 +#define wxTYPE_TEXT 9 +#define wxTYPE_MESSAGE 10 +#define wxTYPE_CHOICE 11 +#define wxTYPE_LIST_BOX 12 +#define wxTYPE_SLIDER 13 +#define wxTYPE_CHECK_BOX 14 +#define wxTYPE_MENU 15 +#define wxTYPE_MENU_BAR 16 +#define wxTYPE_MULTI_TEXT 17 +#define wxTYPE_RADIO_BOX 18 +#define wxTYPE_GROUP_BOX 19 +#define wxTYPE_GAUGE 20 +#define wxTYPE_SCROLL_BAR 21 +#define wxTYPE_VIRT_LIST_BOX 22 +#define wxTYPE_COMBO_BOX 23 +#define wxTYPE_RADIO_BUTTON 24 + +#define wxTYPE_EVENT 25 +#define wxTYPE_DC 26 +#define wxTYPE_DC_CANVAS 27 +#define wxTYPE_DC_POSTSCRIPT 28 +#define wxTYPE_DC_PRINTER 29 +#define wxTYPE_DC_METAFILE 30 +#define wxTYPE_DC_MEMORY 31 +#define wxTYPE_MOUSE_EVENT 32 +#define wxTYPE_KEY_EVENT 33 +#define wxTYPE_COMMAND_EVENT 34 +#define wxTYPE_DC_PANEL 35 + +#define wxTYPE_PEN 40 +#define wxTYPE_BRUSH 41 +#define wxTYPE_FONT 42 +#define wxTYPE_ICON 42 +#define wxTYPE_BITMAP 43 +#define wxTYPE_METAFILE 44 +#define wxTYPE_TIMER 45 +#define wxTYPE_COLOUR 46 +#define wxTYPE_COLOURMAP 47 +#define wxTYPE_CURSOR 48 + +#define wxTYPE_DDE_CLIENT 60 +#define wxTYPE_DDE_SERVER 61 +#define wxTYPE_DDE_CONNECTION 62 + +#define wxTYPE_HELP_INSTANCE 63 + +#define wxTYPE_LIST 70 +#define wxTYPE_STRING_LIST 71 +#define wxTYPE_HASH_TABLE 72 +#define wxTYPE_NODE 73 +#define wxTYPE_APP 74 +#define wxTYPE_DATE 75 + +#define wxTYPE_ENHANCED_DIALOG 80 +#define wxTYPE_TOOLBAR 81 +#define wxTYPE_BUTTONBAR 82 + +#define wxTYPE_DATABASE 90 +#define wxTYPE_QUERY_FIELD 91 +#define wxTYPE_QUERY_COL 92 +#define wxTYPE_RECORDSET 93 + +#define wxTYPE_USER 500 + +#endif + // _WX_TYPESH__ + diff --git a/wxmsw/include/wx-3.0/wx/uiaction.h b/wxmsw/include/wx-3.0/wx/uiaction.h new file mode 100644 index 00000000..fb965235 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/uiaction.h @@ -0,0 +1,90 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/uiaction.h +// Purpose: wxUIActionSimulator interface +// Author: Kevin Ollivier, Steven Lamerton, Vadim Zeitlin +// Modified by: +// Created: 2010-03-06 +// Copyright: (c) Kevin Ollivier +// (c) 2010 Steven Lamerton +// (c) 2010 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UIACTIONSIMULATOR_H_ +#define _WX_UIACTIONSIMULATOR_H_ + +#include "wx/defs.h" + +#if wxUSE_UIACTIONSIMULATOR + +#include "wx/mousestate.h" // for wxMOUSE_BTN_XXX constants + +class WXDLLIMPEXP_CORE wxUIActionSimulator +{ +public: + wxUIActionSimulator() { } + + + // Default dtor, copy ctor and assignment operator are ok (even though the + // last two don't make much sense for this class). + + + // Mouse simulation + // ---------------- + + // Low level methods + bool MouseMove(long x, long y); + bool MouseMove(const wxPoint& point) { return MouseMove(point.x, point.y); } + + bool MouseDown(int button = wxMOUSE_BTN_LEFT); + bool MouseUp(int button = wxMOUSE_BTN_LEFT); + + // Higher level interface, use it if possible instead + bool MouseClick(int button = wxMOUSE_BTN_LEFT); + bool MouseDblClick(int button = wxMOUSE_BTN_LEFT); + bool MouseDragDrop(long x1, long y1, long x2, long y2, + int button = wxMOUSE_BTN_LEFT); + bool MouseDragDrop(const wxPoint& p1, const wxPoint& p2, + int button = wxMOUSE_BTN_LEFT) + { return MouseDragDrop(p1.x, p1.y, p2.x, p2.y, button); } + + // Keyboard simulation + // ------------------- + + // Low level methods for generating key presses and releases + bool KeyDown(int keycode, int modifiers = wxMOD_NONE) + { return Key(keycode, modifiers, true); } + + bool KeyUp(int keycode, int modifiers = wxMOD_NONE) + { return Key(keycode, modifiers, false); } + + // Higher level methods for generating both the key press and release for a + // single key or for all characters in the ASCII string "text" which can currently + // contain letters, digits and characters for the definition of numbers [+-., ]. + bool Char(int keycode, int modifiers = wxMOD_NONE); + + bool Text(const char *text); + +private: + // This is the common part of Key{Down,Up}() methods: while we keep them + // separate at public API level for consistency with Mouse{Down,Up}(), at + // implementation level it makes more sense to have them in a single + // function. + // + // It calls DoModifiers() to simulate pressing the modifier keys if + // necessary and then DoKey() for the key itself. + bool Key(int keycode, int modifiers, bool isDown); + + // Call DoKey() for all modifier keys whose bits are set in the parameter. + void SimulateModifiers(int modifier, bool isDown); + + + // The low-level port-specific function which really generates the key + // presses. It should generate exactly one key event with the given + // parameters. + bool DoKey(int keycode, int modifiers, bool isDown); +}; + +#endif // wxUSE_UIACTIONSIMULATOR + +#endif // _WX_UIACTIONSIMULATOR_H_ diff --git a/wxmsw/include/wx-3.0/wx/unichar.h b/wxmsw/include/wx-3.0/wx/unichar.h new file mode 100644 index 00000000..e9726943 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unichar.h @@ -0,0 +1,308 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unichar.h +// Purpose: wxUniChar and wxUniCharRef classes +// Author: Vaclav Slavik +// Created: 2007-03-19 +// Copyright: (c) 2007 REA Elektronik GmbH +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNICHAR_H_ +#define _WX_UNICHAR_H_ + +#include "wx/defs.h" +#include "wx/chartype.h" +#include "wx/stringimpl.h" + +class WXDLLIMPEXP_FWD_BASE wxUniCharRef; +class WXDLLIMPEXP_FWD_BASE wxString; + +// This class represents single Unicode character. It can be converted to +// and from char or wchar_t and implements commonly used character operations. +class WXDLLIMPEXP_BASE wxUniChar +{ +public: + // NB: this is not wchar_t on purpose, it needs to represent the entire + // Unicode code points range and wchar_t may be too small for that + // (e.g. on Win32 where wchar_t* is encoded in UTF-16) + typedef wxUint32 value_type; + + wxUniChar() : m_value(0) {} + + // Create the character from 8bit character value encoded in the current + // locale's charset. + wxUniChar(char c) { m_value = From8bit(c); } + wxUniChar(unsigned char c) { m_value = From8bit((char)c); } + +#define wxUNICHAR_DEFINE_CTOR(type) \ + wxUniChar(type c) { m_value = (value_type)c; } + wxDO_FOR_INT_TYPES(wxUNICHAR_DEFINE_CTOR) +#undef wxUNICHAR_DEFINE_CTOR + + wxUniChar(const wxUniCharRef& c); + + // Returns Unicode code point value of the character + value_type GetValue() const { return m_value; } + +#if wxUSE_UNICODE_UTF8 + // buffer for single UTF-8 character + struct Utf8CharBuffer + { + char data[5]; + operator const char*() const { return data; } + }; + + // returns the character encoded as UTF-8 + // (NB: implemented in stringops.cpp) + Utf8CharBuffer AsUTF8() const; +#endif // wxUSE_UNICODE_UTF8 + + // Returns true if the character is an ASCII character: + bool IsAscii() const { return m_value < 0x80; } + + // Returns true if the character is representable as a single byte in the + // current locale encoding and return this byte in output argument c (which + // must be non-NULL) + bool GetAsChar(char *c) const + { +#if wxUSE_UNICODE + if ( !IsAscii() ) + { +#if !wxUSE_UTF8_LOCALE_ONLY + if ( GetAsHi8bit(m_value, c) ) + return true; +#endif // !wxUSE_UTF8_LOCALE_ONLY + + return false; + } +#endif // wxUSE_UNICODE + + *c = wx_truncate_cast(char, m_value); + return true; + } + + // Conversions to char and wchar_t types: all of those are needed to be + // able to pass wxUniChars to verious standard narrow and wide character + // functions + operator char() const { return To8bit(m_value); } + operator unsigned char() const { return (unsigned char)To8bit(m_value); } + +#define wxUNICHAR_DEFINE_OPERATOR_PAREN(type) \ + operator type() const { return (type)m_value; } + wxDO_FOR_INT_TYPES(wxUNICHAR_DEFINE_OPERATOR_PAREN) +#undef wxUNICHAR_DEFINE_OPERATOR_PAREN + + // We need this operator for the "*p" part of expressions like "for ( + // const_iterator p = begin() + nStart; *p; ++p )". In this case, + // compilation would fail without it because the conversion to bool would + // be ambiguous (there are all these int types conversions...). (And adding + // operator unspecified_bool_type() would only makes the ambiguity worse.) + operator bool() const { return m_value != 0; } + bool operator!() const { return !((bool)*this); } + + // And this one is needed by some (not all, but not using ifdefs makes the + // code easier) compilers to parse "str[0] && *p" successfully + bool operator&&(bool v) const { return (bool)*this && v; } + + // Assignment operators: + wxUniChar& operator=(const wxUniChar& c) { if (&c != this) m_value = c.m_value; return *this; } + wxUniChar& operator=(const wxUniCharRef& c); + wxUniChar& operator=(char c) { m_value = From8bit(c); return *this; } + wxUniChar& operator=(unsigned char c) { m_value = From8bit((char)c); return *this; } + +#define wxUNICHAR_DEFINE_OPERATOR_EQUAL(type) \ + wxUniChar& operator=(type c) { m_value = (value_type)c; return *this; } + wxDO_FOR_INT_TYPES(wxUNICHAR_DEFINE_OPERATOR_EQUAL) +#undef wxUNICHAR_DEFINE_OPERATOR_EQUAL + + // Comparison operators: +#define wxDEFINE_UNICHAR_CMP_WITH_INT(T, op) \ + bool operator op(T c) const { return m_value op (value_type)c; } + + // define the given comparison operator for all the types +#define wxDEFINE_UNICHAR_OPERATOR(op) \ + bool operator op(const wxUniChar& c) const { return m_value op c.m_value; }\ + bool operator op(char c) const { return m_value op From8bit(c); } \ + bool operator op(unsigned char c) const { return m_value op From8bit((char)c); } \ + wxDO_FOR_INT_TYPES_1(wxDEFINE_UNICHAR_CMP_WITH_INT, op) + + wxFOR_ALL_COMPARISONS(wxDEFINE_UNICHAR_OPERATOR) + +#undef wxDEFINE_UNICHAR_OPERATOR +#undef wxDEFINE_UNCHAR_CMP_WITH_INT + + // this is needed for expressions like 'Z'-c + int operator-(const wxUniChar& c) const { return m_value - c.m_value; } + int operator-(char c) const { return m_value - From8bit(c); } + int operator-(unsigned char c) const { return m_value - From8bit((char)c); } + int operator-(wchar_t c) const { return m_value - (value_type)c; } + + +private: + // notice that we implement these functions inline for 7-bit ASCII + // characters purely for performance reasons + static value_type From8bit(char c) + { +#if wxUSE_UNICODE + if ( (unsigned char)c < 0x80 ) + return c; + + return FromHi8bit(c); +#else + return c; +#endif + } + + static char To8bit(value_type c) + { +#if wxUSE_UNICODE + if ( c < 0x80 ) + return wx_truncate_cast(char, c); + + return ToHi8bit(c); +#else + return wx_truncate_cast(char, c); +#endif + } + + // helpers of the functions above called to deal with non-ASCII chars + static value_type FromHi8bit(char c); + static char ToHi8bit(value_type v); + static bool GetAsHi8bit(value_type v, char *c); + +private: + value_type m_value; +}; + + +// Writeable reference to a character in wxString. +// +// This class can be used in the same way wxChar is used, except that changing +// its value updates the underlying string object. +class WXDLLIMPEXP_BASE wxUniCharRef +{ +private: + typedef wxStringImpl::iterator iterator; + + // create the reference +#if wxUSE_UNICODE_UTF8 + wxUniCharRef(wxString& str, iterator pos) : m_str(str), m_pos(pos) {} +#else + wxUniCharRef(iterator pos) : m_pos(pos) {} +#endif + +public: + // NB: we have to make this public, because we don't have wxString + // declaration available here and so can't declare wxString::iterator + // as friend; so at least don't use a ctor but a static function + // that must be used explicitly (this is more than using 'explicit' + // keyword on ctor!): +#if wxUSE_UNICODE_UTF8 + static wxUniCharRef CreateForString(wxString& str, iterator pos) + { return wxUniCharRef(str, pos); } +#else + static wxUniCharRef CreateForString(iterator pos) + { return wxUniCharRef(pos); } +#endif + + wxUniChar::value_type GetValue() const { return UniChar().GetValue(); } + +#if wxUSE_UNICODE_UTF8 + wxUniChar::Utf8CharBuffer AsUTF8() const { return UniChar().AsUTF8(); } +#endif // wxUSE_UNICODE_UTF8 + + bool IsAscii() const { return UniChar().IsAscii(); } + bool GetAsChar(char *c) const { return UniChar().GetAsChar(c); } + + // Assignment operators: +#if wxUSE_UNICODE_UTF8 + wxUniCharRef& operator=(const wxUniChar& c); +#else + wxUniCharRef& operator=(const wxUniChar& c) { *m_pos = c; return *this; } +#endif + + wxUniCharRef& operator=(const wxUniCharRef& c) + { if (&c != this) *this = c.UniChar(); return *this; } + +#define wxUNICHAR_REF_DEFINE_OPERATOR_EQUAL(type) \ + wxUniCharRef& operator=(type c) { return *this = wxUniChar(c); } + wxDO_FOR_CHAR_INT_TYPES(wxUNICHAR_REF_DEFINE_OPERATOR_EQUAL) +#undef wxUNICHAR_REF_DEFINE_OPERATOR_EQUAL + + // Conversions to the same types as wxUniChar is convertible too: +#define wxUNICHAR_REF_DEFINE_OPERATOR_PAREN(type) \ + operator type() const { return UniChar(); } + wxDO_FOR_CHAR_INT_TYPES(wxUNICHAR_REF_DEFINE_OPERATOR_PAREN) +#undef wxUNICHAR_REF_DEFINE_OPERATOR_PAREN + + // see wxUniChar::operator bool etc. for explanation + operator bool() const { return (bool)UniChar(); } + bool operator!() const { return !UniChar(); } + bool operator&&(bool v) const { return UniChar() && v; } + +#define wxDEFINE_UNICHARREF_CMP_WITH_INT(T, op) \ + bool operator op(T c) const { return UniChar() op c; } + + // Comparison operators: +#define wxDEFINE_UNICHARREF_OPERATOR(op) \ + bool operator op(const wxUniCharRef& c) const { return UniChar() op c.UniChar(); }\ + bool operator op(const wxUniChar& c) const { return UniChar() op c; } \ + wxDO_FOR_CHAR_INT_TYPES_1(wxDEFINE_UNICHARREF_CMP_WITH_INT, op) + + wxFOR_ALL_COMPARISONS(wxDEFINE_UNICHARREF_OPERATOR) + +#undef wxDEFINE_UNICHARREF_OPERATOR +#undef wxDEFINE_UNICHARREF_CMP_WITH_INT + + // for expressions like c-'A': + int operator-(const wxUniCharRef& c) const { return UniChar() - c.UniChar(); } + int operator-(const wxUniChar& c) const { return UniChar() - c; } + int operator-(char c) const { return UniChar() - c; } + int operator-(unsigned char c) const { return UniChar() - c; } + int operator-(wchar_t c) const { return UniChar() - c; } + +private: +#if wxUSE_UNICODE_UTF8 + wxUniChar UniChar() const; +#else + wxUniChar UniChar() const { return *m_pos; } +#endif + + friend class WXDLLIMPEXP_FWD_BASE wxUniChar; + +private: + // reference to the string and pointer to the character in string +#if wxUSE_UNICODE_UTF8 + wxString& m_str; +#endif + iterator m_pos; +}; + +inline wxUniChar::wxUniChar(const wxUniCharRef& c) +{ + m_value = c.UniChar().m_value; +} + +inline wxUniChar& wxUniChar::operator=(const wxUniCharRef& c) +{ + m_value = c.UniChar().m_value; + return *this; +} + +// Comparison operators for the case when wxUniChar(Ref) is the second operand +// implemented in terms of member comparison functions + +wxDEFINE_COMPARISONS_BY_REV(char, const wxUniChar&) +wxDEFINE_COMPARISONS_BY_REV(char, const wxUniCharRef&) + +wxDEFINE_COMPARISONS_BY_REV(wchar_t, const wxUniChar&) +wxDEFINE_COMPARISONS_BY_REV(wchar_t, const wxUniCharRef&) + +wxDEFINE_COMPARISONS_BY_REV(const wxUniChar&, const wxUniCharRef&) + +// for expressions like c-'A': +inline int operator-(char c1, const wxUniCharRef& c2) { return -(c2 - c1); } +inline int operator-(const wxUniChar& c1, const wxUniCharRef& c2) { return -(c2 - c1); } +inline int operator-(wchar_t c1, const wxUniCharRef& c2) { return -(c2 - c1); } + +#endif /* _WX_UNICHAR_H_ */ diff --git a/wxmsw/include/wx-3.0/wx/unix/app.h b/wxmsw/include/wx-3.0/wx/unix/app.h new file mode 100644 index 00000000..f14df9ec --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/app.h @@ -0,0 +1,73 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/app.h +// Purpose: wxAppConsole implementation for Unix +// Author: Lukasz Michalski +// Created: 28/01/2005 +// Copyright: (c) Lukasz Michalski +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +//Ensure that sigset_t is being defined +#include <signal.h> + +class wxFDIODispatcher; +class wxFDIOHandler; +class wxWakeUpPipe; + +// wxApp subclass implementing event processing for console applications +class WXDLLIMPEXP_BASE wxAppConsole : public wxAppConsoleBase +{ +public: + wxAppConsole(); + virtual ~wxAppConsole(); + + // override base class initialization + virtual bool Initialize(int& argc, wxChar** argv); + + + // Unix-specific: Unix signal handling + // ----------------------------------- + + // type of the function which can be registered as signal handler: notice + // that it isn't really a signal handler, i.e. it's not subject to the + // usual signal handlers constraints, because it is called later from + // CheckSignal() and not when the signal really occurs + typedef void (*SignalHandler)(int); + + // Set signal handler for the given signal, SIG_DFL or SIG_IGN can be used + // instead of a function pointer + // + // Return true if handler was installed, false on error + bool SetSignalHandler(int signal, SignalHandler handler); + + // Check if any Unix signals arrived since the last call and execute + // handlers for them + void CheckSignal(); + + // Register the signal wake up pipe with the given dispatcher. + // + // This is used by wxExecute(wxEXEC_NOEVENTS) implementation only. + // + // The pointer to the handler used for processing events on this descriptor + // is returned so that it can be deleted when we no longer needed it. + wxFDIOHandler* RegisterSignalWakeUpPipe(wxFDIODispatcher& dispatcher); + +private: + // signal handler set up by SetSignalHandler() for all signals we handle, + // it just adds the signal to m_signalsCaught -- the real processing is + // done later, when CheckSignal() is called + static void HandleSignal(int signal); + + + // signals for which HandleSignal() had been called (reset from + // CheckSignal()) + sigset_t m_signalsCaught; + + // the signal handlers + WX_DECLARE_HASH_MAP(int, SignalHandler, wxIntegerHash, wxIntegerEqual, SignalHandlerHash); + SignalHandlerHash m_signalHandlerHash; + + // pipe used for wake up signal handling: if a signal arrives while we're + // blocking for input, writing to this pipe triggers a call to our CheckSignal() + wxWakeUpPipe *m_signalWakeUpPipe; +}; diff --git a/wxmsw/include/wx-3.0/wx/unix/apptbase.h b/wxmsw/include/wx-3.0/wx/unix/apptbase.h new file mode 100644 index 00000000..6ce6f152 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/apptbase.h @@ -0,0 +1,67 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/apptbase.h +// Purpose: declaration of wxAppTraits for Unix systems +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.06.2003 +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_APPTBASE_H_ +#define _WX_UNIX_APPTBASE_H_ + +#include "wx/evtloop.h" +#include "wx/evtloopsrc.h" + +class wxExecuteData; +class wxFDIOManager; +class wxEventLoopSourcesManagerBase; + +// ---------------------------------------------------------------------------- +// wxAppTraits: the Unix version adds extra hooks needed by Unix code +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxAppTraits : public wxAppTraitsBase +{ +public: + // wxExecute() support methods + // --------------------------- + + // Wait for the process termination and return its exit code or -1 on error. + // + // Notice that this is only used when execData.flags contains wxEXEC_SYNC + // and does not contain wxEXEC_NOEVENTS, i.e. when we need to really wait + // until the child process exit and dispatch the events while doing it. + virtual int WaitForChild(wxExecuteData& execData); + +#if wxUSE_SOCKETS + // return a pointer to the object which should be used to integrate + // monitoring of the file descriptors to the event loop (currently this is + // used for the sockets only but should be used for arbitrary event loop + // sources in the future) + // + // this object may be different for the console and GUI applications + // + // the pointer is not deleted by the caller as normally it points to a + // static variable + virtual wxFDIOManager *GetFDIOManager(); +#endif // wxUSE_SOCKETS + +#if wxUSE_CONSOLE_EVENTLOOP + // Return a non-NULL pointer to the object responsible for managing the + // event loop sources in this kind of application. + virtual wxEventLoopSourcesManagerBase* GetEventLoopSourcesManager(); +#endif // wxUSE_CONSOLE_EVENTLOOP + +protected: + // Wait for the process termination by running the given event loop until + // this happens. + // + // This is used by the public WaitForChild() after creating the event loop + // of the appropriate kind. + int RunLoopUntilChildExit(wxExecuteData& execData, wxEventLoopBase& loop); +}; + +#endif // _WX_UNIX_APPTBASE_H_ + diff --git a/wxmsw/include/wx-3.0/wx/unix/apptrait.h b/wxmsw/include/wx-3.0/wx/unix/apptrait.h new file mode 100644 index 00000000..3fbe4d82 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/apptrait.h @@ -0,0 +1,94 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/apptrait.h +// Purpose: standard implementations of wxAppTraits for Unix +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.06.2003 +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_APPTRAIT_H_ +#define _WX_UNIX_APPTRAIT_H_ + +// ---------------------------------------------------------------------------- +// wxGUI/ConsoleAppTraits: must derive from wxAppTraits, not wxAppTraitsBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxConsoleAppTraits : public wxConsoleAppTraitsBase +{ +public: +#if wxUSE_CONSOLE_EVENTLOOP + virtual wxEventLoopBase *CreateEventLoop(); +#endif // wxUSE_CONSOLE_EVENTLOOP +#if wxUSE_TIMER + virtual wxTimerImpl *CreateTimerImpl(wxTimer *timer); +#endif +}; + +#if wxUSE_GUI + +// GTK+ and Motif integrate sockets and child processes monitoring directly in +// their main loop, the other Unix ports do it at wxEventLoop level and so use +// the non-GUI traits and don't need anything here +// +// TODO: Should we use XtAddInput() for wxX11 too? Or, vice versa, if there is +// no advantage in doing this compared to the generic way currently used +// by wxX11, should we continue to use GTK/Motif-specific stuff? +#if defined(__WXGTK__) || defined(__WXMOTIF__) + #define wxHAS_GUI_FDIOMANAGER + #define wxHAS_GUI_PROCESS_CALLBACKS +#endif // ports using wxFDIOManager + +#if defined(__WXMAC__) + #define wxHAS_GUI_PROCESS_CALLBACKS + #define wxHAS_GUI_SOCKET_MANAGER +#endif + +class WXDLLIMPEXP_CORE wxGUIAppTraits : public wxGUIAppTraitsBase +{ +public: + virtual wxEventLoopBase *CreateEventLoop(); + virtual int WaitForChild(wxExecuteData& execData); +#if wxUSE_TIMER + virtual wxTimerImpl *CreateTimerImpl(wxTimer *timer); +#endif +#if wxUSE_THREADS && defined(__WXGTK20__) + virtual void MutexGuiEnter(); + virtual void MutexGuiLeave(); +#endif + +#if (defined(__WXMAC__) || defined(__WXCOCOA__)) && wxUSE_STDPATHS + virtual wxStandardPaths& GetStandardPaths(); +#endif + virtual wxPortId GetToolkitVersion(int *majVer = NULL, int *minVer = NULL) const; + +#ifdef __WXGTK20__ + virtual wxString GetDesktopEnvironment() const; + virtual wxString GetStandardCmdLineOptions(wxArrayString& names, + wxArrayString& desc) const; +#endif // __WXGTK20____ + +#if defined(__WXGTK20__) + virtual bool ShowAssertDialog(const wxString& msg); +#endif + +#if wxUSE_SOCKETS + +#ifdef wxHAS_GUI_SOCKET_MANAGER + virtual wxSocketManager *GetSocketManager(); +#endif + +#ifdef wxHAS_GUI_FDIOMANAGER + virtual wxFDIOManager *GetFDIOManager(); +#endif + +#endif // wxUSE_SOCKETS + + virtual wxEventLoopSourcesManagerBase* GetEventLoopSourcesManager(); +}; + +#endif // wxUSE_GUI + +#endif // _WX_UNIX_APPTRAIT_H_ + diff --git a/wxmsw/include/wx-3.0/wx/unix/chkconf.h b/wxmsw/include/wx-3.0/wx/unix/chkconf.h new file mode 100644 index 00000000..b8a19041 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/chkconf.h @@ -0,0 +1,43 @@ +/* + * Name: wx/unix/chkconf.h + * Purpose: Unix-specific config settings consistency checks + * Author: Vadim Zeitlin + * Created: 2007-07-14 + * Copyright: (c) 2007 Vadim Zeitlin <vadim@wxwidgets.org> + * Licence: wxWindows licence + */ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#if wxUSE_CONSOLE_EVENTLOOP +# if !wxUSE_SELECT_DISPATCHER && !wxUSE_EPOLL_DISPATCHER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxSelect/EpollDispatcher needed for console event loop" +# else +# undef wxUSE_SELECT_DISPATCHER +# define wxUSE_SELECT_DISPATCHER 1 +# endif +# endif +#endif /* wxUSE_CONSOLE_EVENTLOOP */ + +#if wxUSE_FSWATCHER +# if !defined(wxHAS_INOTIFY) && !defined(wxHAS_KQUEUE) +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxFileSystemWatcher requires either inotify() or kqueue()" +# else +# undef wxUSE_FSWATCHER +# define wxUSE_FSWATCHER 0 +# endif +# endif +#endif /* wxUSE_FSWATCHER */ + +#if wxUSE_GSTREAMER +# if !wxUSE_THREADS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "GStreamer requires threads" +# else +# undef wxUSE_GSTREAMER +# define wxUSE_GSTREAMER 0 +# endif +# endif +#endif /* wxUSE_GSTREAMER */ diff --git a/wxmsw/include/wx-3.0/wx/unix/evtloop.h b/wxmsw/include/wx-3.0/wx/unix/evtloop.h new file mode 100644 index 00000000..2b91c723 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/evtloop.h @@ -0,0 +1,62 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/evtloop.h +// Purpose: declares wxEventLoop class +// Author: Lukasz Michalski (lm@zork.pl) +// Created: 2007-05-07 +// Copyright: (c) 2007 Lukasz Michalski +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_EVTLOOP_H_ +#define _WX_UNIX_EVTLOOP_H_ + +#if wxUSE_CONSOLE_EVENTLOOP + +// ---------------------------------------------------------------------------- +// wxConsoleEventLoop +// ---------------------------------------------------------------------------- + +class wxEventLoopSource; +class wxFDIODispatcher; +class wxWakeUpPipeMT; + +class WXDLLIMPEXP_BASE wxConsoleEventLoop +#ifdef __WXOSX__ +: public wxCFEventLoop +#else +: public wxEventLoopManual +#endif +{ +public: + // initialize the event loop, use IsOk() to check if we were successful + wxConsoleEventLoop(); + virtual ~wxConsoleEventLoop(); + + // implement base class pure virtuals + virtual bool Pending() const; + virtual bool Dispatch(); + virtual int DispatchTimeout(unsigned long timeout); + virtual void WakeUp(); + virtual bool IsOk() const { return m_dispatcher != NULL; } + virtual bool YieldFor(long WXUNUSED(eventsToProcess)) { return true; } + +protected: + virtual void OnNextIteration(); + +private: + // pipe used for wake up messages: when a child thread wants to wake up + // the event loop in the main thread it writes to this pipe + wxWakeUpPipeMT *m_wakeupPipe; + + // the event loop source used to monitor this pipe + wxEventLoopSource* m_wakeupSource; + + // either wxSelectDispatcher or wxEpollDispatcher + wxFDIODispatcher *m_dispatcher; + + wxDECLARE_NO_COPY_CLASS(wxConsoleEventLoop); +}; + +#endif // wxUSE_CONSOLE_EVENTLOOP + +#endif // _WX_UNIX_EVTLOOP_H_ diff --git a/wxmsw/include/wx-3.0/wx/unix/evtloopsrc.h b/wxmsw/include/wx-3.0/wx/unix/evtloopsrc.h new file mode 100644 index 00000000..4c2cfec1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/evtloopsrc.h @@ -0,0 +1,48 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/evtloopsrc.h +// Purpose: wxUnixEventLoopSource class +// Author: Vadim Zeitlin +// Created: 2009-10-21 +// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_EVTLOOPSRC_H_ +#define _WX_UNIX_EVTLOOPSRC_H_ + +class wxFDIODispatcher; +class wxFDIOHandler; + +// ---------------------------------------------------------------------------- +// wxUnixEventLoopSource: wxEventLoopSource for Unix-like toolkits using fds +// ---------------------------------------------------------------------------- + +class wxUnixEventLoopSource : public wxEventLoopSource +{ +public: + // dispatcher and fdioHandler are only used here to allow us to unregister + // from the event loop when we're destroyed + wxUnixEventLoopSource(wxFDIODispatcher *dispatcher, + wxFDIOHandler *fdioHandler, + int fd, + wxEventLoopSourceHandler *handler, + int flags) + : wxEventLoopSource(handler, flags), + m_dispatcher(dispatcher), + m_fdioHandler(fdioHandler), + m_fd(fd) + { + } + + virtual ~wxUnixEventLoopSource(); + +private: + wxFDIODispatcher * const m_dispatcher; + wxFDIOHandler * const m_fdioHandler; + const int m_fd; + + wxDECLARE_NO_COPY_CLASS(wxUnixEventLoopSource); +}; + +#endif // _WX_UNIX_EVTLOOPSRC_H_ + diff --git a/wxmsw/include/wx-3.0/wx/unix/execute.h b/wxmsw/include/wx-3.0/wx/unix/execute.h new file mode 100644 index 00000000..9756c00a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/execute.h @@ -0,0 +1,102 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/execute.h +// Purpose: private details of wxExecute() implementation +// Author: Vadim Zeitlin +// Copyright: (c) 1998 Robert Roebling, Julian Smart, Vadim Zeitlin +// (c) 2013 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_EXECUTE_H +#define _WX_UNIX_EXECUTE_H + +#include "wx/app.h" +#include "wx/hashmap.h" +#include "wx/process.h" + +#if wxUSE_STREAMS + #include "wx/unix/pipe.h" + #include "wx/private/streamtempinput.h" +#endif + +class wxEventLoopBase; + +// Information associated with a running child process. +class wxExecuteData +{ +public: + wxExecuteData() + { + flags = + pid = 0; + exitcode = -1; + + process = NULL; + + syncEventLoop = NULL; + +#if wxUSE_STREAMS + fdOut = + fdErr = wxPipe::INVALID_FD; +#endif // wxUSE_STREAMS + } + + // This must be called in the parent process as soon as fork() returns to + // update us with the effective child PID. It also ensures that we handle + // SIGCHLD to be able to detect when this PID exits, so wxTheApp must be + // available. + void OnStart(int pid); + + // Called when the child process exits. + void OnExit(int exitcode); + + // Return true if we should (or already did) redirect the child IO. + bool IsRedirected() const { return process && process->IsRedirected(); } + + + // wxExecute() flags + int flags; + + // the pid of the child process + int pid; + + // The exit code of the process, set once the child terminates. + int exitcode; + + // the associated process object or NULL + wxProcess *process; + + // Local event loop used to wait for the child process termination in + // synchronous execution case. We can't create it ourselves as its exact + // type depends on the application kind (console/GUI), so we rely on + // wxAppTraits setting up this pointer to point to the appropriate object. + wxEventLoopBase *syncEventLoop; + +#if wxUSE_STREAMS + // the input buffer bufOut is connected to stdout, this is why it is + // called bufOut and not bufIn + wxStreamTempInputBuffer bufOut, + bufErr; + + // the corresponding FDs, -1 if not redirected + int fdOut, + fdErr; +#endif // wxUSE_STREAMS + + +private: + // SIGCHLD signal handler that checks whether any of the currently running + // children have exited. + static void OnSomeChildExited(int sig); + + // All currently running child processes indexed by their PID. + // + // Notice that the container doesn't own its elements. + WX_DECLARE_HASH_MAP(int, wxExecuteData*, wxIntegerHash, wxIntegerEqual, + ChildProcessesData); + static ChildProcessesData ms_childProcesses; + + wxDECLARE_NO_COPY_CLASS(wxExecuteData); +}; + +#endif // _WX_UNIX_EXECUTE_H diff --git a/wxmsw/include/wx-3.0/wx/unix/fontutil.h b/wxmsw/include/wx-3.0/wx/unix/fontutil.h new file mode 100644 index 00000000..64cb3a3c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/fontutil.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/fontutil.h +// Purpose: font-related helper functions for Unix/X11 +// Author: Vadim Zeitlin +// Modified by: +// Created: 05.11.99 +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_FONTUTIL_H_ +#define _WX_UNIX_FONTUTIL_H_ + +#ifdef __X__ + typedef WXFontStructPtr wxNativeFont; +#elif defined(__WXGTK__) + typedef GdkFont *wxNativeFont; +#else + #error "Unsupported toolkit" +#endif + +// returns the handle of the nearest available font or 0 +extern wxNativeFont +wxLoadQueryNearestFont(int pointSize, + int family, + int style, + int weight, + bool underlined, + const wxString &facename, + wxFontEncoding encoding, + wxString* xFontName = NULL); + +// returns the font specified by the given XLFD +extern wxNativeFont wxLoadFont(const wxString& fontSpec); + +#endif // _WX_UNIX_FONTUTIL_H_ diff --git a/wxmsw/include/wx-3.0/wx/unix/fswatcher_inotify.h b/wxmsw/include/wx-3.0/wx/unix/fswatcher_inotify.h new file mode 100644 index 00000000..18819660 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/fswatcher_inotify.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/fswatcher_inotify.h +// Purpose: wxInotifyFileSystemWatcher +// Author: Bartosz Bekier +// Created: 2009-05-26 +// Copyright: (c) 2009 Bartosz Bekier <bartosz.bekier@gmail.com> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FSWATCHER_UNIX_H_ +#define _WX_FSWATCHER_UNIX_H_ + +#include "wx/defs.h" + +#if wxUSE_FSWATCHER + +class WXDLLIMPEXP_BASE wxInotifyFileSystemWatcher : + public wxFileSystemWatcherBase +{ +public: + wxInotifyFileSystemWatcher(); + + wxInotifyFileSystemWatcher(const wxFileName& path, + int events = wxFSW_EVENT_ALL); + + virtual ~wxInotifyFileSystemWatcher(); + + void OnDirDeleted(const wxString& path); + +protected: + bool Init(); +}; + +#endif + +#endif /* _WX_FSWATCHER_UNIX_H_ */ diff --git a/wxmsw/include/wx-3.0/wx/unix/fswatcher_kqueue.h b/wxmsw/include/wx-3.0/wx/unix/fswatcher_kqueue.h new file mode 100644 index 00000000..a324eb7e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/fswatcher_kqueue.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/fswatcher_kqueue.h +// Purpose: wxKqueueFileSystemWatcher +// Author: Bartosz Bekier +// Created: 2009-05-26 +// Copyright: (c) 2009 Bartosz Bekier <bartosz.bekier@gmail.com> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FSWATCHER_KQUEUE_H_ +#define _WX_FSWATCHER_KQUEUE_H_ + +#include "wx/defs.h" + +#if wxUSE_FSWATCHER + +class WXDLLIMPEXP_BASE wxKqueueFileSystemWatcher : + public wxFileSystemWatcherBase +{ +public: + wxKqueueFileSystemWatcher(); + + wxKqueueFileSystemWatcher(const wxFileName& path, + int events = wxFSW_EVENT_ALL); + + virtual ~wxKqueueFileSystemWatcher(); + +protected: + bool Init(); +}; + +#endif + +#endif /* _WX_FSWATCHER_OSX_H_ */ diff --git a/wxmsw/include/wx-3.0/wx/unix/glx11.h b/wxmsw/include/wx-3.0/wx/unix/glx11.h new file mode 100644 index 00000000..34ed4dd4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/glx11.h @@ -0,0 +1,164 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/glx11.h +// Purpose: class common for all X11-based wxGLCanvas implementations +// Author: Vadim Zeitlin +// Created: 2007-04-15 +// Copyright: (c) 2007 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_GLX11_H_ +#define _WX_UNIX_GLX11_H_ + +#include <GL/glx.h> + +// ---------------------------------------------------------------------------- +// wxGLContext +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_GL wxGLContext : public wxGLContextBase +{ +public: + wxGLContext(wxGLCanvas *win, const wxGLContext *other = NULL); + virtual ~wxGLContext(); + + virtual bool SetCurrent(const wxGLCanvas& win) const; + +private: + // attach context to the drawable or unset it (if NULL) + static bool MakeCurrent(GLXDrawable drawable, GLXContext context); + + GLXContext m_glContext; + + DECLARE_CLASS(wxGLContext) +}; + +// ---------------------------------------------------------------------------- +// wxGLCanvasX11 +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_GL wxGLCanvasX11 : public wxGLCanvasBase +{ +public: + // initialization and dtor + // ----------------------- + + // default ctor doesn't do anything, InitVisual() must be called + wxGLCanvasX11(); + + // initializes the XVisualInfo corresponding to the given attributes + bool InitVisual(const int *attribList); + + // frees XVisualInfo info + virtual ~wxGLCanvasX11(); + + + // implement wxGLCanvasBase methods + // -------------------------------- + + virtual bool SwapBuffers(); + + + // X11-specific methods + // -------------------- + + // return GLX version: 13 means 1.3 &c + static int GetGLXVersion(); + + // return true if multisample extension is available + static bool IsGLXMultiSampleAvailable(); + + // get the X11 handle of this window + virtual Window GetXWindow() const = 0; + + + // override some wxWindow methods + // ------------------------------ + + // return true only if the window is realized: OpenGL context can't be + // created until we are + virtual bool IsShownOnScreen() const; + + + // implementation only from now on + // ------------------------------- + + // get the GLXFBConfig/XVisualInfo we use + GLXFBConfig *GetGLXFBConfig() const { return m_fbc; } + XVisualInfo *GetXVisualInfo() const { return m_vi; } + + // initialize the global default GL visual, return false if matching visual + // not found + static bool InitDefaultVisualInfo(const int *attribList); + + // get the default GL X11 visual (may be NULL, shouldn't be freed by caller) + static XVisualInfo *GetDefaultXVisualInfo() { return ms_glVisualInfo; } + + // free the global GL visual, called by wxGLApp + static void FreeDefaultVisualInfo(); + + // initializes XVisualInfo (in any case) and, if supported, GLXFBConfig + // + // returns false if XVisualInfo couldn't be initialized, otherwise caller + // is responsible for freeing the pointers + static bool InitXVisualInfo(const int *attribList, + GLXFBConfig **pFBC, XVisualInfo **pXVisual); + +private: + // fills in glattrs with attributes defined by wxattrs which must be + // 0-terminated if it is non-NULL + // + // n is the max size of glattrs, false is returned if we overflow it, it + // should be at least 16 to accommodate the default attributes + static bool ConvertWXAttrsToGL(const int *wxattrs, int *glattrs, size_t n); + + + // this is only used if it's supported i.e. if GL >= 1.3 + GLXFBConfig *m_fbc; + + // used for all GL versions, obtained from GLXFBConfig for GL >= 1.3 + XVisualInfo *m_vi; + + // the global/default versions of the above + static GLXFBConfig *ms_glFBCInfo; + static XVisualInfo *ms_glVisualInfo; +}; + +// ---------------------------------------------------------------------------- +// wxGLApp +// ---------------------------------------------------------------------------- + +// this is used in wx/glcanvas.h, prevent it from defining a generic wxGLApp +#define wxGL_APP_DEFINED + +class WXDLLIMPEXP_GL wxGLApp : public wxGLAppBase +{ +public: + wxGLApp() : wxGLAppBase() { } + + // implement wxGLAppBase method + virtual bool InitGLVisual(const int *attribList) + { + return wxGLCanvasX11::InitDefaultVisualInfo(attribList); + } + + // and implement this wxGTK::wxApp method too + virtual void *GetXVisualInfo() + { + return wxGLCanvasX11::GetDefaultXVisualInfo(); + } + + // and override this wxApp method to clean up + virtual int OnExit() + { + wxGLCanvasX11::FreeDefaultVisualInfo(); + + return wxGLAppBase::OnExit(); + } + +private: + DECLARE_DYNAMIC_CLASS(wxGLApp) +}; + +#endif // _WX_UNIX_GLX11_H_ + diff --git a/wxmsw/include/wx-3.0/wx/unix/joystick.h b/wxmsw/include/wx-3.0/wx/unix/joystick.h new file mode 100644 index 00000000..ef7a5db2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/joystick.h @@ -0,0 +1,94 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/joystick.h +// Purpose: wxJoystick class +// Author: Guilhem Lavaux +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_JOYSTICK_H_ +#define _WX_UNIX_JOYSTICK_H_ + +#include "wx/event.h" + +class WXDLLIMPEXP_FWD_CORE wxJoystickThread; + +class WXDLLIMPEXP_ADV wxJoystick: public wxObject +{ + DECLARE_DYNAMIC_CLASS(wxJoystick) + public: + /* + * Public interface + */ + + wxJoystick(int joystick = wxJOYSTICK1); + virtual ~wxJoystick(); + + // Attributes + //////////////////////////////////////////////////////////////////////////// + + wxPoint GetPosition() const; + int GetPosition(unsigned axis) const; + bool GetButtonState(unsigned button) const; + int GetZPosition() const; + int GetButtonState() const; + int GetPOVPosition() const; + int GetPOVCTSPosition() const; + int GetRudderPosition() const; + int GetUPosition() const; + int GetVPosition() const; + int GetMovementThreshold() const; + void SetMovementThreshold(int threshold) ; + + // Capabilities + //////////////////////////////////////////////////////////////////////////// + + bool IsOk() const; // Checks that the joystick is functioning + static int GetNumberJoysticks() ; + int GetManufacturerId() const ; + int GetProductId() const ; + wxString GetProductName() const ; + int GetXMin() const; + int GetYMin() const; + int GetZMin() const; + int GetXMax() const; + int GetYMax() const; + int GetZMax() const; + int GetNumberButtons() const; + int GetNumberAxes() const; + int GetMaxButtons() const; + int GetMaxAxes() const; + int GetPollingMin() const; + int GetPollingMax() const; + int GetRudderMin() const; + int GetRudderMax() const; + int GetUMin() const; + int GetUMax() const; + int GetVMin() const; + int GetVMax() const; + + bool HasRudder() const; + bool HasZ() const; + bool HasU() const; + bool HasV() const; + bool HasPOV() const; + bool HasPOV4Dir() const; + bool HasPOVCTS() const; + + // Operations + //////////////////////////////////////////////////////////////////////////// + + // pollingFreq = 0 means that movement events are sent when above the threshold. + // If pollingFreq > 0, events are received every this many milliseconds. + bool SetCapture(wxWindow* win, int pollingFreq = 0); + bool ReleaseCapture(); + +protected: + int m_device; + int m_joystick; + wxJoystickThread* m_thread; +}; + +#endif // _WX_UNIX_JOYSTICK_H_ diff --git a/wxmsw/include/wx-3.0/wx/unix/mimetype.h b/wxmsw/include/wx-3.0/wx/unix/mimetype.h new file mode 100644 index 00000000..df76534a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/mimetype.h @@ -0,0 +1,173 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/mimetype.h +// Purpose: classes and functions to manage MIME types +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.09.98 +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence (part of wxExtra library) +///////////////////////////////////////////////////////////////////////////// + +#ifndef _MIMETYPE_IMPL_H +#define _MIMETYPE_IMPL_H + +#include "wx/mimetype.h" + +#if wxUSE_MIMETYPE + +class wxMimeTypeCommands; + +WX_DEFINE_ARRAY_PTR(wxMimeTypeCommands *, wxMimeCommandsArray); + +// this is the real wxMimeTypesManager for Unix +class WXDLLIMPEXP_BASE wxMimeTypesManagerImpl +{ +public: + // ctor and dtor + wxMimeTypesManagerImpl(); + virtual ~wxMimeTypesManagerImpl(); + + // load all data into memory - done when it is needed for the first time + void Initialize(int mailcapStyles = wxMAILCAP_ALL, + const wxString& extraDir = wxEmptyString); + + // and delete the data here + void ClearData(); + + // implement containing class functions + wxFileType *GetFileTypeFromExtension(const wxString& ext); + wxFileType *GetFileTypeFromMimeType(const wxString& mimeType); + + size_t EnumAllFileTypes(wxArrayString& mimetypes); + + void AddFallback(const wxFileTypeInfo& filetype); + + // add information about the given mimetype + void AddMimeTypeInfo(const wxString& mimetype, + const wxString& extensions, + const wxString& description); + void AddMailcapInfo(const wxString& strType, + const wxString& strOpenCmd, + const wxString& strPrintCmd, + const wxString& strTest, + const wxString& strDesc); + + // add a new record to the user .mailcap/.mime.types files + wxFileType *Associate(const wxFileTypeInfo& ftInfo); + // remove association + bool Unassociate(wxFileType *ft); + + // accessors + // get the string containing space separated extensions for the given + // file type + wxString GetExtension(size_t index) { return m_aExtensions[index]; } + +protected: + void InitIfNeeded(); + + wxArrayString m_aTypes, // MIME types + m_aDescriptions, // descriptions (just some text) + m_aExtensions, // space separated list of extensions + m_aIcons; // Icon filenames + + // verb=command pairs for this file type + wxMimeCommandsArray m_aEntries; + + // are we initialized? + bool m_initialized; + + wxString GetCommand(const wxString &verb, size_t nIndex) const; + + // Read XDG *.desktop file + void LoadXDGApp(const wxString& filename); + // Scan XDG directory + void LoadXDGAppsFilesFromDir(const wxString& dirname); + + // Load XDG globs files + void LoadXDGGlobs(const wxString& filename); + + // functions used to do associations + virtual int AddToMimeData(const wxString& strType, + const wxString& strIcon, + wxMimeTypeCommands *entry, + const wxArrayString& strExtensions, + const wxString& strDesc, + bool replaceExisting = true); + virtual bool DoAssociation(const wxString& strType, + const wxString& strIcon, + wxMimeTypeCommands *entry, + const wxArrayString& strExtensions, + const wxString& strDesc); + + // give it access to m_aXXX variables + friend class WXDLLIMPEXP_FWD_BASE wxFileTypeImpl; +}; + +class WXDLLIMPEXP_BASE wxFileTypeImpl +{ +public: + // initialization functions + // this is used to construct a list of mimetypes which match; + // if built with GetFileTypeFromMimetype index 0 has the exact match and + // index 1 the type / * match + // if built with GetFileTypeFromExtension, index 0 has the mimetype for + // the first extension found, index 1 for the second and so on + + void Init(wxMimeTypesManagerImpl *manager, size_t index) + { m_manager = manager; m_index.Add(index); } + + // accessors + bool GetExtensions(wxArrayString& extensions); + bool GetMimeType(wxString *mimeType) const + { *mimeType = m_manager->m_aTypes[m_index[0]]; return true; } + bool GetMimeTypes(wxArrayString& mimeTypes) const; + bool GetIcon(wxIconLocation *iconLoc) const; + + bool GetDescription(wxString *desc) const + { *desc = m_manager->m_aDescriptions[m_index[0]]; return true; } + + bool GetOpenCommand(wxString *openCmd, + const wxFileType::MessageParameters& params) const + { + *openCmd = GetExpandedCommand(wxT("open"), params); + return (! openCmd -> IsEmpty() ); + } + + bool GetPrintCommand(wxString *printCmd, + const wxFileType::MessageParameters& params) const + { + *printCmd = GetExpandedCommand(wxT("print"), params); + return (! printCmd -> IsEmpty() ); + } + + // return the number of commands defined for this file type, 0 if none + size_t GetAllCommands(wxArrayString *verbs, wxArrayString *commands, + const wxFileType::MessageParameters& params) const; + + + // remove the record for this file type + // probably a mistake to come here, use wxMimeTypesManager.Unassociate (ft) instead + bool Unassociate(wxFileType *ft) + { + return m_manager->Unassociate(ft); + } + + // set an arbitrary command, ask confirmation if it already exists and + // overwriteprompt is TRUE + bool SetCommand(const wxString& cmd, const wxString& verb, bool overwriteprompt = true); + bool SetDefaultIcon(const wxString& strIcon = wxEmptyString, int index = 0); + +private: + wxString + GetExpandedCommand(const wxString & verb, + const wxFileType::MessageParameters& params) const; + + wxMimeTypesManagerImpl *m_manager; + wxArrayInt m_index; // in the wxMimeTypesManagerImpl arrays +}; + +#endif // wxUSE_MIMETYPE + +#endif // _MIMETYPE_IMPL_H + + diff --git a/wxmsw/include/wx-3.0/wx/unix/pipe.h b/wxmsw/include/wx-3.0/wx/unix/pipe.h new file mode 100644 index 00000000..1bde4228 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/pipe.h @@ -0,0 +1,102 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/pipe.h +// Purpose: wxPipe class +// Author: Vadim Zeitlin +// Modified by: +// Created: 24.06.2003 (extracted from src/unix/utilsunx.cpp) +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_PIPE_H_ +#define _WX_UNIX_PIPE_H_ + +#include <unistd.h> +#include <fcntl.h> + +#include "wx/log.h" +#include "wx/intl.h" + +// ---------------------------------------------------------------------------- +// wxPipe: this class encapsulates pipe() system call +// ---------------------------------------------------------------------------- + +class wxPipe +{ +public: + // the symbolic names for the pipe ends + enum Direction + { + Read, + Write + }; + + enum + { + INVALID_FD = -1 + }; + + // default ctor doesn't do anything + wxPipe() { m_fds[Read] = m_fds[Write] = INVALID_FD; } + + // create the pipe, return TRUE if ok, FALSE on error + bool Create() + { + if ( pipe(m_fds) == -1 ) + { + wxLogSysError(wxGetTranslation("Pipe creation failed")); + + return false; + } + + return true; + } + + // switch the given end of the pipe to non-blocking IO + bool MakeNonBlocking(Direction which) + { + const int flags = fcntl(m_fds[which], F_GETFL, 0); + if ( flags == -1 ) + return false; + + return fcntl(m_fds[which], F_SETFL, flags | O_NONBLOCK) == 0; + } + + // return TRUE if we were created successfully + bool IsOk() const { return m_fds[Read] != INVALID_FD; } + + // return the descriptor for one of the pipe ends + int operator[](Direction which) const { return m_fds[which]; } + + // detach a descriptor, meaning that the pipe dtor won't close it, and + // return it + int Detach(Direction which) + { + int fd = m_fds[which]; + m_fds[which] = INVALID_FD; + + return fd; + } + + // close the pipe descriptors + void Close() + { + for ( size_t n = 0; n < WXSIZEOF(m_fds); n++ ) + { + if ( m_fds[n] != INVALID_FD ) + { + close(m_fds[n]); + m_fds[n] = INVALID_FD; + } + } + } + + // dtor closes the pipe descriptors + ~wxPipe() { Close(); } + +private: + int m_fds[2]; +}; + +#endif // _WX_UNIX_PIPE_H_ + diff --git a/wxmsw/include/wx-3.0/wx/unix/sound.h b/wxmsw/include/wx-3.0/wx/unix/sound.h new file mode 100644 index 00000000..76efeae3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/sound.h @@ -0,0 +1,160 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/sound.h +// Purpose: wxSound class +// Author: Julian Smart, Vaclav Slavik +// Modified by: +// Created: 25/10/98 +// Copyright: (c) Julian Smart, Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SOUND_H_ +#define _WX_SOUND_H_ + +#include "wx/defs.h" + +#if wxUSE_SOUND + +#include "wx/object.h" + +// ---------------------------------------------------------------------------- +// wxSound: simple audio playback class +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_ADV wxSoundBackend; +class WXDLLIMPEXP_FWD_ADV wxSound; +class WXDLLIMPEXP_FWD_BASE wxDynamicLibrary; + +/// Sound data, as loaded from .wav file: +class WXDLLIMPEXP_ADV wxSoundData +{ +public: + wxSoundData() : m_refCnt(1) {} + void IncRef(); + void DecRef(); + + // .wav header information: + unsigned m_channels; // num of channels (mono:1, stereo:2) + unsigned m_samplingRate; + unsigned m_bitsPerSample; // if 8, then m_data contains unsigned 8bit + // samples (wxUint8), if 16 then signed 16bit + // (wxInt16) + unsigned m_samples; // length in samples: + + // wave data: + size_t m_dataBytes; + wxUint8 *m_data; // m_dataBytes bytes of data + +private: + ~wxSoundData(); + unsigned m_refCnt; + wxUint8 *m_dataWithHeader; // ditto, but prefixed with .wav header + friend class wxSound; +}; + + +/// Simple sound class: +class WXDLLIMPEXP_ADV wxSound : public wxSoundBase +{ +public: + wxSound(); + wxSound(const wxString& fileName, bool isResource = false); + wxSound(size_t size, const void* data); + virtual ~wxSound(); + + // Create from resource or file + bool Create(const wxString& fileName, bool isResource = false); + // Create from data + bool Create(size_t size, const void* data); + + bool IsOk() const { return m_data != NULL; } + + // Stop playing any sound + static void Stop(); + + // Returns true if a sound is being played + static bool IsPlaying(); + + // for internal use + static void UnloadBackend(); + +protected: + bool DoPlay(unsigned flags) const; + + static void EnsureBackend(); + void Free(); + bool LoadWAV(const void* data, size_t length, bool copyData); + + static wxSoundBackend *ms_backend; +#if wxUSE_LIBSDL && wxUSE_PLUGINS + // FIXME - temporary, until we have plugins architecture + static wxDynamicLibrary *ms_backendSDL; +#endif + +private: + wxSoundData *m_data; +}; + + +// ---------------------------------------------------------------------------- +// wxSoundBackend: +// ---------------------------------------------------------------------------- + +// This is interface to sound playing implementation. There are multiple +// sound architectures in use on Unix platforms and wxWidgets can use several +// of them for playback, depending on their availability at runtime; hence +// the need for backends. This class is for use by wxWidgets and people writing +// additional backends only, it is _not_ for use by applications! + +// Structure that holds playback status information +struct wxSoundPlaybackStatus +{ + // playback is in progress + bool m_playing; + // main thread called wxSound::Stop() + bool m_stopRequested; +}; + +// Audio backend interface +class WXDLLIMPEXP_ADV wxSoundBackend +{ +public: + virtual ~wxSoundBackend() {} + + // Returns the name of the backend (e.g. "Open Sound System") + virtual wxString GetName() const = 0; + + // Returns priority (higher priority backends are tried first) + virtual int GetPriority() const = 0; + + // Checks if the backend's audio system is available and the backend can + // be used for playback + virtual bool IsAvailable() const = 0; + + // Returns true if the backend is capable of playing sound asynchronously. + // If false, then wxWidgets creates a playback thread and handles async + // playback, otherwise it is left up to the backend (will usually be more + // effective). + virtual bool HasNativeAsyncPlayback() const = 0; + + // Plays the sound. flags are same flags as those passed to wxSound::Play. + // The function should periodically check the value of + // status->m_stopRequested and terminate if it is set to true (it may + // be modified by another thread) + virtual bool Play(wxSoundData *data, unsigned flags, + volatile wxSoundPlaybackStatus *status) = 0; + + // Stops playback (if something is played). + virtual void Stop() = 0; + + // Returns true if the backend is playing anything at the moment. + // (This method is never called for backends that don't support async + // playback.) + virtual bool IsPlaying() const = 0; +}; + + +#endif // wxUSE_SOUND + +#endif // _WX_SOUND_H_ + diff --git a/wxmsw/include/wx-3.0/wx/unix/stackwalk.h b/wxmsw/include/wx-3.0/wx/unix/stackwalk.h new file mode 100644 index 00000000..e9974193 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/stackwalk.h @@ -0,0 +1,98 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/stackwalk.h +// Purpose: declaration of wxStackWalker for Unix +// Author: Vadim Zeitlin +// Modified by: +// Created: 2005-01-19 +// Copyright: (c) 2005 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_STACKWALK_H_ +#define _WX_UNIX_STACKWALK_H_ + +// ---------------------------------------------------------------------------- +// wxStackFrame +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStackFrame : public wxStackFrameBase +{ + friend class wxStackWalker; + +public: + // arguments are the stack depth of this frame, its address and the return + // value of backtrace_symbols() for it + // + // NB: we don't copy syminfo pointer so it should have lifetime at least as + // long as ours + wxStackFrame(size_t level = 0, void *address = NULL, const char *syminfo = NULL) + : wxStackFrameBase(level, address) + { + m_syminfo = syminfo; + } + +protected: + virtual void OnGetName(); + + // optimized for the 2 step initialization done by wxStackWalker + void Set(const wxString &name, const wxString &filename, const char* syminfo, + size_t level, size_t numLine, void *address) + { + m_level = level; + m_name = name; + m_filename = filename; + m_syminfo = syminfo; + + m_line = numLine; + m_address = address; + } + +private: + const char *m_syminfo; +}; + +// ---------------------------------------------------------------------------- +// wxStackWalker +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStackWalker : public wxStackWalkerBase +{ +public: + // we need the full path to the program executable to be able to use + // addr2line, normally we can retrieve it from wxTheApp but if wxTheApp + // doesn't exist or doesn't have the correct value, the path may be given + // explicitly + wxStackWalker(const char *argv0 = NULL) + { + ms_exepath = wxString::FromAscii(argv0); + } + + ~wxStackWalker() + { + FreeStack(); + } + + virtual void Walk(size_t skip = 1, size_t maxDepth = wxSTACKWALKER_MAX_DEPTH); +#if wxUSE_ON_FATAL_EXCEPTION + virtual void WalkFromException(size_t maxDepth = wxSTACKWALKER_MAX_DEPTH) { Walk(2, maxDepth); } +#endif // wxUSE_ON_FATAL_EXCEPTION + + static const wxString& GetExePath() { return ms_exepath; } + + + // these two may be used to save the stack at some point (fast operation) + // and then process it later (slow operation) + void SaveStack(size_t maxDepth); + void ProcessFrames(size_t skip); + void FreeStack(); + +private: + int InitFrames(wxStackFrame *arr, size_t n, void **addresses, char **syminfo); + + static wxString ms_exepath; + static void *ms_addresses[]; + static char **ms_symbols; + static int m_depth; +}; + +#endif // _WX_UNIX_STACKWALK_H_ diff --git a/wxmsw/include/wx-3.0/wx/unix/stdpaths.h b/wxmsw/include/wx-3.0/wx/unix/stdpaths.h new file mode 100644 index 00000000..2f111992 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/stdpaths.h @@ -0,0 +1,63 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/stdpaths.h +// Purpose: wxStandardPaths for Unix systems +// Author: Vadim Zeitlin +// Modified by: +// Created: 2004-10-19 +// Copyright: (c) 2004 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_STDPATHS_H_ +#define _WX_UNIX_STDPATHS_H_ + +// ---------------------------------------------------------------------------- +// wxStandardPaths +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStandardPaths : public wxStandardPathsBase +{ +public: + // tries to determine the installation prefix automatically (Linux only right + // now) and returns /usr/local if it failed + void DetectPrefix(); + + // set the program installation directory which is /usr/local by default + // + // under some systems (currently only Linux) the program directory can be + // determined automatically but for portable programs you should always set + // it explicitly + void SetInstallPrefix(const wxString& prefix); + + // get the program installation prefix + // + // if the prefix had been previously by SetInstallPrefix, returns that + // value, otherwise calls DetectPrefix() + wxString GetInstallPrefix() const; + + + // implement base class pure virtuals + virtual wxString GetExecutablePath() const; + virtual wxString GetConfigDir() const; + virtual wxString GetUserConfigDir() const; + virtual wxString GetDataDir() const; + virtual wxString GetLocalDataDir() const; + virtual wxString GetUserDataDir() const; + virtual wxString GetPluginsDir() const; + virtual wxString GetLocalizedResourcesDir(const wxString& lang, + ResourceCat category) const; +#ifndef __VMS + virtual wxString GetDocumentsDir() const; +#endif + +protected: + // Ctor is protected, use wxStandardPaths::Get() instead of instantiating + // objects of this class directly. + wxStandardPaths() { } + +private: + wxString m_prefix; +}; + +#endif // _WX_UNIX_STDPATHS_H_ + diff --git a/wxmsw/include/wx-3.0/wx/unix/taskbarx11.h b/wxmsw/include/wx-3.0/wx/unix/taskbarx11.h new file mode 100644 index 00000000..02a92009 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/taskbarx11.h @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////////////////// +// File: wx/unix/taskbarx11.h +// Purpose: Defines wxTaskBarIcon class for most common X11 desktops +// Author: Vaclav Slavik +// Modified by: +// Created: 04/04/2003 +// Copyright: (c) Vaclav Slavik, 2003 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_TASKBAR_H_ +#define _WX_UNIX_TASKBAR_H_ + +class WXDLLIMPEXP_FWD_ADV wxTaskBarIconArea; + +class WXDLLIMPEXP_ADV wxTaskBarIcon: public wxTaskBarIconBase +{ +public: + wxTaskBarIcon(); + virtual ~wxTaskBarIcon(); + + // Accessors: + bool IsOk() const; + bool IsIconInstalled() const; + + // Operations: + bool SetIcon(const wxIcon& icon, const wxString& tooltip = wxEmptyString); + bool RemoveIcon(); + bool PopupMenu(wxMenu *menu); + +protected: + wxTaskBarIconArea *m_iconWnd; + +private: + void OnDestroy(wxWindowDestroyEvent&); + + DECLARE_DYNAMIC_CLASS(wxTaskBarIcon) +}; + +#endif // _WX_UNIX_TASKBAR_H_ diff --git a/wxmsw/include/wx-3.0/wx/unix/tls.h b/wxmsw/include/wx-3.0/wx/unix/tls.h new file mode 100644 index 00000000..ce61e6ff --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/tls.h @@ -0,0 +1,65 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/tls.h +// Purpose: Pthreads implementation of wxTlsValue<> +// Author: Vadim Zeitlin +// Created: 2008-08-08 +// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_TLS_H_ +#define _WX_UNIX_TLS_H_ + +#include <pthread.h> + +// ---------------------------------------------------------------------------- +// wxTlsKey is a helper class encapsulating the TLS value index +// ---------------------------------------------------------------------------- + +class wxTlsKey +{ +public: + // ctor allocates a new key and possibly registering a destructor function + // for it + wxTlsKey(wxTlsDestructorFunction destructor) + { + m_destructor = destructor; + if ( pthread_key_create(&m_key, destructor) != 0 ) + m_key = 0; + } + + // return true if the key was successfully allocated + bool IsOk() const { return m_key != 0; } + + // get the key value, there is no error return + void *Get() const + { + return pthread_getspecific(m_key); + } + + // change the key value, return true if ok + bool Set(void *value) + { + void *old = Get(); + if ( old ) + m_destructor(old); + + return pthread_setspecific(m_key, value) == 0; + } + + // free the key + ~wxTlsKey() + { + if ( IsOk() ) + pthread_key_delete(m_key); + } + +private: + wxTlsDestructorFunction m_destructor; + pthread_key_t m_key; + + wxDECLARE_NO_COPY_CLASS(wxTlsKey); +}; + +#endif // _WX_UNIX_TLS_H_ + diff --git a/wxmsw/include/wx-3.0/wx/unix/utilsx11.h b/wxmsw/include/wx-3.0/wx/unix/utilsx11.h new file mode 100644 index 00000000..29898372 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/unix/utilsx11.h @@ -0,0 +1,78 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/utilsx11.h +// Purpose: Miscellaneous X11 functions +// Author: Mattia Barbon, Vaclav Slavik, Vadim Zeitlin +// Modified by: +// Created: 25.03.02 +// Copyright: (c) wxWidgets team +// (c) 2010 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_UTILSX11_H_ +#define _WX_UNIX_UTILSX11_H_ + +#include "wx/defs.h" +#include "wx/gdicmn.h" + +#include <X11/Xlib.h> + +// NB: Content of this header is for wxWidgets' private use! It is not +// part of public API and may be modified or even disappear in the future! + +#if defined(__WXMOTIF__) || defined(__WXGTK__) || defined(__WXX11__) + +#if defined(__WXGTK__) +typedef void WXDisplay; +typedef void* WXWindow; +#endif +typedef unsigned long WXKeySym; + +int wxCharCodeXToWX(WXKeySym keySym); +WXKeySym wxCharCodeWXToX(int id); + +class wxIconBundle; + +void wxSetIconsX11( WXDisplay* display, WXWindow window, + const wxIconBundle& ib ); + + +enum wxX11FullScreenMethod +{ + wxX11_FS_AUTODETECT = 0, + wxX11_FS_WMSPEC, + wxX11_FS_KDE, + wxX11_FS_GENERIC +}; + +wxX11FullScreenMethod wxGetFullScreenMethodX11(WXDisplay* display, + WXWindow rootWindow); + +void wxSetFullScreenStateX11(WXDisplay* display, WXWindow rootWindow, + WXWindow window, bool show, wxRect *origSize, + wxX11FullScreenMethod method); + + +// Class wrapping X11 Display: it opens it in ctor and closes it in dtor. +class wxX11Display +{ +public: + wxX11Display() { m_dpy = XOpenDisplay(NULL); } + ~wxX11Display() { if ( m_dpy ) XCloseDisplay(m_dpy); } + + operator Display *() const { return m_dpy; } + + // Using DefaultRootWindow() with an object of wxX11Display class doesn't + // compile because it is a macro which tries to cast wxX11Display so + // provide a convenient helper. + Window DefaultRoot() const { return DefaultRootWindow(m_dpy); } + +private: + Display *m_dpy; + + wxDECLARE_NO_COPY_CLASS(wxX11Display); +}; + +#endif // __WXMOTIF__, __WXGTK__, __WXX11__ + +#endif // _WX_UNIX_UTILSX11_H_ diff --git a/wxmsw/include/wx-3.0/wx/uri.h b/wxmsw/include/wx-3.0/wx/uri.h new file mode 100644 index 00000000..758bd72e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/uri.h @@ -0,0 +1,187 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/uri.h +// Purpose: wxURI - Class for parsing URIs +// Author: Ryan Norton +// Vadim Zeitlin (UTF-8 URI support, many other changes) +// Created: 07/01/2004 +// Copyright: (c) 2004 Ryan Norton +// 2008 Vadim Zeitlin +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_URI_H_ +#define _WX_URI_H_ + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/string.h" +#include "wx/arrstr.h" + +// Host Type that the server component can be +enum wxURIHostType +{ + wxURI_REGNAME, // Host is a normal register name (www.mysite.com etc.) + wxURI_IPV4ADDRESS, // Host is a version 4 ip address (192.168.1.100) + wxURI_IPV6ADDRESS, // Host is a version 6 ip address [aa:aa:aa:aa::aa:aa]:5050 + wxURI_IPVFUTURE // Host is a future ip address (wxURI is unsure what kind) +}; + +// Component Flags +enum wxURIFieldType +{ + wxURI_SCHEME = 1, + wxURI_USERINFO = 2, + wxURI_SERVER = 4, + wxURI_PORT = 8, + wxURI_PATH = 16, + wxURI_QUERY = 32, + wxURI_FRAGMENT = 64 +}; + +// Miscellaneous other flags +enum wxURIFlags +{ + wxURI_STRICT = 1 +}; + + +// Generic class for parsing URIs. +// +// See RFC 3986 +class WXDLLIMPEXP_BASE wxURI : public wxObject +{ +public: + wxURI(); + wxURI(const wxString& uri); + + // default copy ctor, assignment operator and dtor are ok + + bool Create(const wxString& uri); + + wxURI& operator=(const wxString& string) + { + Create(string); + return *this; + } + + bool operator==(const wxURI& uri) const; + + // various accessors + + bool HasScheme() const { return (m_fields & wxURI_SCHEME) != 0; } + bool HasUserInfo() const { return (m_fields & wxURI_USERINFO) != 0; } + bool HasServer() const { return (m_fields & wxURI_SERVER) != 0; } + bool HasPort() const { return (m_fields & wxURI_PORT) != 0; } + bool HasPath() const { return (m_fields & wxURI_PATH) != 0; } + bool HasQuery() const { return (m_fields & wxURI_QUERY) != 0; } + bool HasFragment() const { return (m_fields & wxURI_FRAGMENT) != 0; } + + const wxString& GetScheme() const { return m_scheme; } + const wxString& GetPath() const { return m_path; } + const wxString& GetQuery() const { return m_query; } + const wxString& GetFragment() const { return m_fragment; } + const wxString& GetPort() const { return m_port; } + const wxString& GetUserInfo() const { return m_userinfo; } + const wxString& GetServer() const { return m_server; } + wxURIHostType GetHostType() const { return m_hostType; } + + // these functions only work if the user information part of the URI is in + // the usual (but insecure and hence explicitly recommended against by the + // RFC) "user:password" form + wxString GetUser() const; + wxString GetPassword() const; + + + // combine all URI components into a single string + // + // BuildURI() returns the real URI suitable for use with network libraries, + // for example, while BuildUnescapedURI() returns a string suitable to be + // shown to the user. + wxString BuildURI() const { return DoBuildURI(&wxURI::Nothing); } + wxString BuildUnescapedURI() const { return DoBuildURI(&wxURI::Unescape); } + + // the escaped URI should contain only ASCII characters, including possible + // escape sequences + static wxString Unescape(const wxString& escapedURI); + + + void Resolve(const wxURI& base, int flags = wxURI_STRICT); + bool IsReference() const; + +protected: + void Clear(); + + // common part of BuildURI() and BuildUnescapedURI() + wxString DoBuildURI(wxString (*funcDecode)(const wxString&)) const; + + // function which returns its argument unmodified, this is used by + // BuildURI() to tell DoBuildURI() that nothing needs to be done with the + // URI components + static wxString Nothing(const wxString& value) { return value; } + + bool Parse(const char* uri); + + const char* ParseAuthority (const char* uri); + const char* ParseScheme (const char* uri); + const char* ParseUserInfo (const char* uri); + const char* ParseServer (const char* uri); + const char* ParsePort (const char* uri); + const char* ParsePath (const char* uri); + const char* ParseQuery (const char* uri); + const char* ParseFragment (const char* uri); + + + static bool ParseH16(const char*& uri); + static bool ParseIPv4address(const char*& uri); + static bool ParseIPv6address(const char*& uri); + static bool ParseIPvFuture(const char*& uri); + + // should be called with i pointing to '%', returns the encoded character + // following it or -1 if invalid and advances i past it (so that it points + // to the last character consumed on return) + static int DecodeEscape(wxString::const_iterator& i); + + // append next character pointer to by p to the string in an escaped form + // and advance p past it + // + // if the next character is '%' and it's followed by 2 hex digits, they are + // not escaped (again) by this function, this allows to keep (backwards- + // compatible) ambiguity about the input format to wxURI::Create(): it can + // be either already escaped or not + void AppendNextEscaped(wxString& s, const char *& p); + + // convert hexadecimal digit to its value; return -1 if c isn't valid + static int CharToHex(char c); + + // split an URI path string in its component segments (including empty and + // "." ones, no post-processing is done) + static wxArrayString SplitInSegments(const wxString& path); + + // various URI grammar helpers + static bool IsUnreserved(char c); + static bool IsReserved(char c); + static bool IsGenDelim(char c); + static bool IsSubDelim(char c); + static bool IsHex(char c); + static bool IsAlpha(char c); + static bool IsDigit(char c); + static bool IsEndPath(char c); + + wxString m_scheme; + wxString m_path; + wxString m_query; + wxString m_fragment; + + wxString m_userinfo; + wxString m_server; + wxString m_port; + + wxURIHostType m_hostType; + + size_t m_fields; + + DECLARE_DYNAMIC_CLASS(wxURI) +}; + +#endif // _WX_URI_H_ + diff --git a/wxmsw/include/wx-3.0/wx/url.h b/wxmsw/include/wx-3.0/wx/url.h new file mode 100644 index 00000000..572cae8b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/url.h @@ -0,0 +1,116 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/url.h +// Purpose: URL parser +// Author: Guilhem Lavaux +// Modified by: Ryan Norton +// Created: 20/07/1997 +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_URL_H +#define _WX_URL_H + +#include "wx/defs.h" + +#if wxUSE_URL + +#include "wx/uri.h" +#include "wx/protocol/protocol.h" + +#if wxUSE_PROTOCOL_HTTP + #include "wx/protocol/http.h" +#endif + +typedef enum { + wxURL_NOERR = 0, + wxURL_SNTXERR, + wxURL_NOPROTO, + wxURL_NOHOST, + wxURL_NOPATH, + wxURL_CONNERR, + wxURL_PROTOERR +} wxURLError; + +#if wxUSE_URL_NATIVE +class WXDLLIMPEXP_FWD_NET wxURL; + +class WXDLLIMPEXP_NET wxURLNativeImp : public wxObject +{ +public: + virtual ~wxURLNativeImp() { } + virtual wxInputStream *GetInputStream(wxURL *owner) = 0; +}; +#endif // wxUSE_URL_NATIVE + +class WXDLLIMPEXP_NET wxURL : public wxURI +{ +public: + wxURL(const wxString& sUrl = wxEmptyString); + wxURL(const wxURI& uri); + wxURL(const wxURL& url); + virtual ~wxURL(); + + wxURL& operator = (const wxString& url); + wxURL& operator = (const wxURI& uri); + wxURL& operator = (const wxURL& url); + + wxProtocol& GetProtocol() { return *m_protocol; } + wxURLError GetError() const { return m_error; } + wxString GetURL() const { return m_url; } + + wxURLError SetURL(const wxString &url) + { *this = url; return m_error; } + + bool IsOk() const + { return m_error == wxURL_NOERR; } + + wxInputStream *GetInputStream(); + +#if wxUSE_PROTOCOL_HTTP + static void SetDefaultProxy(const wxString& url_proxy); + void SetProxy(const wxString& url_proxy); +#endif // wxUSE_PROTOCOL_HTTP + +protected: + static wxProtoInfo *ms_protocols; + +#if wxUSE_PROTOCOL_HTTP + static wxHTTP *ms_proxyDefault; + static bool ms_useDefaultProxy; + wxHTTP *m_proxy; + bool m_useProxy; +#endif // wxUSE_PROTOCOL_HTTP + +#if wxUSE_URL_NATIVE + friend class wxURLNativeImp; + // pointer to a native URL implementation object + wxURLNativeImp *m_nativeImp; + // Creates on the heap and returns a native + // implementation object for the current platform. + static wxURLNativeImp *CreateNativeImpObject(); +#endif // wxUSE_URL_NATIVE + + wxProtoInfo *m_protoinfo; + wxProtocol *m_protocol; + + wxURLError m_error; + wxString m_url; + + void Init(const wxString&); + bool ParseURL(); + void CleanData(); + void Free(); + bool FetchProtocol(); + + friend class wxProtoInfo; + friend class wxURLModule; + +private: + DECLARE_DYNAMIC_CLASS(wxURL) +}; + +#endif // wxUSE_URL + +#endif // _WX_URL_H + diff --git a/wxmsw/include/wx-3.0/wx/ustring.h b/wxmsw/include/wx-3.0/wx/ustring.h new file mode 100644 index 00000000..7c58fddd --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/ustring.h @@ -0,0 +1,749 @@ + +// Name: wx/ustring.h +// Purpose: 32-bit string (UCS-4) +// Author: Robert Roebling +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_USTRING_H_ +#define _WX_USTRING_H_ + +#include "wx/defs.h" +#include "wx/string.h" + +#include <string> + +#if SIZEOF_WCHAR_T == 2 +typedef wxWCharBuffer wxU16CharBuffer; +typedef wxScopedWCharBuffer wxScopedU16CharBuffer; +#else +typedef wxCharTypeBuffer<wxChar16> wxU16CharBuffer; +typedef wxScopedCharTypeBuffer<wxChar16> wxScopedU16CharBuffer; +#endif + +#if SIZEOF_WCHAR_T == 4 +typedef wxWCharBuffer wxU32CharBuffer; +typedef wxScopedWCharBuffer wxScopedU32CharBuffer; +#else +typedef wxCharTypeBuffer<wxChar32> wxU32CharBuffer; +typedef wxScopedCharTypeBuffer<wxChar32> wxScopedU32CharBuffer; +#endif + +#ifdef __VISUALC__ + // "non dll-interface class 'std::basic_string<wxChar32>' used as base + // interface for dll-interface class 'wxString'" -- this is OK in our case + // (and warning is unavoidable anyhow) + #pragma warning(push) + #pragma warning(disable:4275) +#endif + +class WXDLLIMPEXP_BASE wxUString: public std::basic_string<wxChar32> +{ +public: + wxUString() { } + + wxUString( const wxChar32 *str ) { assign(str); } + wxUString( const wxScopedU32CharBuffer &buf ) { assign(buf); } + + wxUString( const char *str ) { assign(str); } + wxUString( const wxScopedCharBuffer &buf ) { assign(buf); } + wxUString( const char *str, const wxMBConv &conv ) { assign(str,conv); } + wxUString( const wxScopedCharBuffer &buf, const wxMBConv &conv ) { assign(buf,conv); } + + wxUString( const wxChar16 *str ) { assign(str); } + wxUString( const wxScopedU16CharBuffer &buf ) { assign(buf); } + + wxUString( const wxCStrData *cstr ) { assign(cstr); } + wxUString( const wxString &str ) { assign(str); } + + wxUString( char ch ) { assign(ch); } + wxUString( wxChar16 ch ) { assign(ch); } + wxUString( wxChar32 ch ) { assign(ch); } + wxUString( wxUniChar ch ) { assign(ch); } + wxUString( wxUniCharRef ch ) { assign(ch); } + wxUString( size_type n, char ch ) { assign(n,ch); } + wxUString( size_type n, wxChar16 ch ) { assign(n,ch); } + wxUString( size_type n, wxChar32 ch ) { assign(n,ch); } + wxUString( size_type n, wxUniChar ch ) { assign(n,ch); } + wxUString( size_type n, wxUniCharRef ch ) { assign(n,ch); } + + // static construction + + static wxUString FromAscii( const char *str, size_type n ) + { + wxUString ret; + ret.assignFromAscii( str, n ); + return ret; + } + + static wxUString FromAscii( const char *str ) + { + wxUString ret; + ret.assignFromAscii( str ); + return ret; + } + + static wxUString FromUTF8( const char *str, size_type n ) + { + wxUString ret; + ret.assignFromUTF8( str, n ); + return ret; + } + + static wxUString FromUTF8( const char *str ) + { + wxUString ret; + ret.assignFromUTF8( str ); + return ret; + } + + static wxUString FromUTF16( const wxChar16 *str, size_type n ) + { + wxUString ret; + ret.assignFromUTF16( str, n ); + return ret; + } + + static wxUString FromUTF16( const wxChar16 *str ) + { + wxUString ret; + ret.assignFromUTF16( str ); + return ret; + } + + // assign from encoding + + wxUString &assignFromAscii( const char *str ); + wxUString &assignFromAscii( const char *str, size_type n ); + wxUString &assignFromUTF8( const char *str ); + wxUString &assignFromUTF8( const char *str, size_type n ); + wxUString &assignFromUTF16( const wxChar16* str ); + wxUString &assignFromUTF16( const wxChar16* str, size_type n ); + wxUString &assignFromCString( const char* str ); + wxUString &assignFromCString( const char* str, const wxMBConv &conv ); + + // conversions + + wxScopedCharBuffer utf8_str() const; + wxScopedU16CharBuffer utf16_str() const; + +#if SIZEOF_WCHAR_T == 2 + wxScopedWCharBuffer wc_str() const + { + return utf16_str(); + } +#else + wchar_t *wc_str() const + { + return (wchar_t*) c_str(); + } +#endif + + operator wxString() const + { +#if wxUSE_UNICODE_UTF8 + return wxString::FromUTF8( utf8_str() ); +#else +#if SIZEOF_WCHAR_T == 2 + return wxString( utf16_str() ); +#else + return wxString( c_str() ); +#endif +#endif + } + +#if wxUSE_UNICODE_UTF8 + wxScopedCharBuffer wx_str() + { + return utf8_str(); + } +#else +#if SIZEOF_WCHAR_T == 2 + wxScopedWCharBuffer wx_str() + { + return utf16_str(); + } +#else + const wchar_t* wx_str() + { + return c_str(); + } +#endif +#endif + + // assign + + wxUString &assign( const wxChar32* str ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->assign( str ); + } + + wxUString &assign( const wxChar32* str, size_type n ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->assign( str, n ); + } + + wxUString &assign( const wxUString &str ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->assign( str ); + } + + wxUString &assign( const wxUString &str, size_type pos, size_type n ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->assign( str, pos, n ); + } + + // FIXME-VC6: VC 6.0 stl does not support all types of assign functions + #ifdef __VISUALC6__ + wxUString &assign( wxChar32 ch ) + { + wxChar32 chh[1]; + chh[0] = ch; + std::basic_string<wxChar32> *base = this; + return (wxUString &)base->assign(chh); + } + + wxUString &assign( size_type n, wxChar32 ch ) + { + wxU32CharBuffer buffer(n); + wxChar32 *p = buffer.data(); + size_type i; + for (i = 0; i < n; i++) + { + *p = ch; + p++; + } + + std::basic_string<wxChar32> *base = this; + return (wxUString &)base->assign(buffer.data()); + } + #else + wxUString &assign( wxChar32 ch ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->assign( (size_type) 1, ch ); + } + + wxUString &assign( size_type n, wxChar32 ch ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->assign( n, ch ); + } + #endif // __VISUALC6__ + + wxUString &assign( const wxScopedU32CharBuffer &buf ) + { + return assign( buf.data() ); + } + + wxUString &assign( const char *str ) + { + return assignFromCString( str ); + } + + wxUString &assign( const wxScopedCharBuffer &buf ) + { + return assignFromCString( buf.data() ); + } + + wxUString &assign( const char *str, const wxMBConv &conv ) + { + return assignFromCString( str, conv ); + } + + wxUString &assign( const wxScopedCharBuffer &buf, const wxMBConv &conv ) + { + return assignFromCString( buf.data(), conv ); + } + + wxUString &assign( const wxChar16 *str ) + { + return assignFromUTF16( str ); + } + + wxUString &assign( const wxScopedU16CharBuffer &buf ) + { + return assignFromUTF16( buf.data() ); + } + + wxUString &assign( const wxCStrData *cstr ) + { +#if SIZEOF_WCHAR_T == 2 + return assignFromUTF16( cstr->AsWChar() ); +#else + return assign( cstr->AsWChar() ); +#endif + } + + wxUString &assign( const wxString &str ) + { +#if wxUSE_UNICODE_UTF8 + return assignFromUTF8( str.wx_str() ); +#else + #if SIZEOF_WCHAR_T == 2 + return assignFromUTF16( str.wc_str() ); + #else + return assign( str.wc_str() ); + #endif +#endif + } + + wxUString &assign( char ch ) + { + char buf[2]; + buf[0] = ch; + buf[1] = 0; + return assignFromCString( buf ); + } + + wxUString &assign( size_type n, char ch ) + { + wxCharBuffer buffer(n); + char *p = buffer.data(); + size_type i; + for (i = 0; i < n; i++) + { + *p = ch; + p++; + } + return assignFromCString( buffer.data() ); + } + + wxUString &assign( wxChar16 ch ) + { + wxChar16 buf[2]; + buf[0] = ch; + buf[1] = 0; + return assignFromUTF16( buf ); + } + + wxUString &assign( size_type n, wxChar16 ch ) + { + wxU16CharBuffer buffer(n); + wxChar16 *p = buffer.data(); + size_type i; + for (i = 0; i < n; i++) + { + *p = ch; + p++; + } + return assignFromUTF16( buffer.data() ); + } + + wxUString &assign( wxUniChar ch ) + { + return assign( (wxChar32) ch.GetValue() ); + } + + wxUString &assign( size_type n, wxUniChar ch ) + { + return assign( n, (wxChar32) ch.GetValue() ); + } + + wxUString &assign( wxUniCharRef ch ) + { + return assign( (wxChar32) ch.GetValue() ); + } + + wxUString &assign( size_type n, wxUniCharRef ch ) + { + return assign( n, (wxChar32) ch.GetValue() ); + } + + // append [STL overload] + + wxUString &append( const wxUString &s ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->append( s ); + } + + wxUString &append( const wxUString &s, size_type pos, size_type n ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->append( s, pos, n ); + } + + wxUString &append( const wxChar32* s ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->append( s ); + } + + wxUString &append( const wxChar32* s, size_type n ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->append( s, n ); + } + + // FIXME-VC6: VC 6.0 stl does not support all types of append functions + #ifdef __VISUALC6__ + wxUString &append( size_type n, wxChar32 c ) + { + wxU32CharBuffer buffer(n); + wxChar32 *p = buffer.data(); + size_type i; + for (i = 0; i < n; i++) + { + *p = c; + p++; + } + + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->append(buffer.data()); + } + #else + wxUString &append( size_type n, wxChar32 c ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->append( n, c ); + } + #endif // __VISUALC6__ + + wxUString &append( wxChar32 c ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->append( 1, c ); + } + + // append [wx overload] + + wxUString &append( const wxScopedU16CharBuffer &buf ) + { + return append( buf.data() ); + } + + wxUString &append( const wxScopedU32CharBuffer &buf ) + { + return append( buf.data() ); + } + + wxUString &append( const char *str ) + { + return append( wxUString( str ) ); + } + + wxUString &append( const wxScopedCharBuffer &buf ) + { + return append( wxUString( buf ) ); + } + + wxUString &append( const wxChar16 *str ) + { + return append( wxUString( str ) ); + } + + wxUString &append( const wxString &str ) + { + return append( wxUString( str ) ); + } + + wxUString &append( const wxCStrData *cstr ) + { + return append( wxUString( cstr ) ); + } + + wxUString &append( char ch ) + { + char buf[2]; + buf[0] = ch; + buf[1] = 0; + return append( buf ); + } + + wxUString &append( wxChar16 ch ) + { + wxChar16 buf[2]; + buf[0] = ch; + buf[1] = 0; + return append( buf ); + } + + wxUString &append( wxUniChar ch ) + { + return append( (size_type) 1, (wxChar32) ch.GetValue() ); + } + + wxUString &append( wxUniCharRef ch ) + { + return append( (size_type) 1, (wxChar32) ch.GetValue() ); + } + + + // insert [STL overloads] + + wxUString &insert( size_type pos, const wxUString &s ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->insert( pos, s ); + } + + wxUString &insert( size_type pos, const wxUString &s, size_type pos1, size_type n ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->insert( pos, s, pos1, n ); + } + + wxUString &insert( size_type pos, const wxChar32 *s ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->insert( pos, s ); + } + + wxUString &insert( size_type pos, const wxChar32 *s, size_type n ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->insert( pos, s, n ); + } + + wxUString &insert( size_type pos, size_type n, wxChar32 c ) + { + std::basic_string<wxChar32> *base = this; + return (wxUString &) base->insert( pos, n, c ); + } + + + // insert [STL overloads] + + wxUString &insert( size_type n, const char *s ) + { + return insert( n, wxUString( s ) ); + } + + wxUString &insert( size_type n, const wxChar16 *s ) + { + return insert( n, wxUString( s ) ); + } + + wxUString &insert( size_type n, const wxScopedCharBuffer &buf ) + { + return insert( n, wxUString( buf ) ); + } + + wxUString &insert( size_type n, const wxScopedU16CharBuffer &buf ) + { + return insert( n, wxUString( buf ) ); + } + + wxUString &insert( size_type n, const wxScopedU32CharBuffer &buf ) + { + return insert( n, buf.data() ); + } + + wxUString &insert( size_type n, const wxString &s ) + { + return insert( n, wxUString( s ) ); + } + + wxUString &insert( size_type n, const wxCStrData *cstr ) + { + return insert( n, wxUString( cstr ) ); + } + + wxUString &insert( size_type n, char ch ) + { + char buf[2]; + buf[0] = ch; + buf[1] = 0; + return insert( n, buf ); + } + + wxUString &insert( size_type n, wchar_t ch ) + { + wchar_t buf[2]; + buf[0] = ch; + buf[1] = 0; + return insert( n, buf ); + } + + // insert iterator + + iterator insert( iterator it, wxChar32 ch ) + { + std::basic_string<wxChar32> *base = this; + return base->insert( it, ch ); + } + + void insert(iterator it, const_iterator first, const_iterator last) + { + std::basic_string<wxChar32> *base = this; + base->insert( it, first, last ); + } + + + // operator = + wxUString& operator=(const wxString& s) + { return assign( s ); } + wxUString& operator=(const wxCStrData* s) + { return assign( s ); } + wxUString& operator=(const char *s) + { return assign( s ); } + wxUString& operator=(const wxChar16 *s) + { return assign( s ); } + wxUString& operator=(const wxChar32 *s) + { return assign( s ); } + wxUString& operator=(const wxScopedCharBuffer &s) + { return assign( s ); } + wxUString& operator=(const wxScopedU16CharBuffer &s) + { return assign( s ); } + wxUString& operator=(const wxScopedU32CharBuffer &s) + { return assign( s ); } + wxUString& operator=(const char ch) + { return assign( ch ); } + wxUString& operator=(const wxChar16 ch) + { return assign( ch ); } + wxUString& operator=(const wxChar32 ch) + { return assign( ch ); } + wxUString& operator=(const wxUniChar ch) + { return assign( ch ); } + wxUString& operator=(const wxUniCharRef ch) + { return assign( ch ); } + + // operator += + wxUString& operator+=(const wxUString& s) + { return append( s ); } + wxUString& operator+=(const wxString& s) + { return append( s ); } + wxUString& operator+=(const wxCStrData* s) + { return append( s ); } + wxUString& operator+=(const char *s) + { return append( s ); } + wxUString& operator+=(const wxChar16 *s) + { return append( s ); } + wxUString& operator+=(const wxChar32 *s) + { return append( s ); } + wxUString& operator+=(const wxScopedCharBuffer &s) + { return append( s ); } + wxUString& operator+=(const wxScopedU16CharBuffer &s) + { return append( s ); } + wxUString& operator+=(const wxScopedU32CharBuffer &s) + { return append( s ); } + wxUString& operator+=(const char ch) + { return append( ch ); } + wxUString& operator+=(const wxChar16 ch) + { return append( ch ); } + wxUString& operator+=(const wxChar32 ch) + { return append( ch ); } + wxUString& operator+=(const wxUniChar ch) + { return append( ch ); } + wxUString& operator+=(const wxUniCharRef ch) + { return append( ch ); } + +}; + +#ifdef __VISUALC__ + #pragma warning(pop) +#endif + +inline wxUString operator+(const wxUString &s1, const wxUString &s2) + { wxUString ret( s1 ); ret.append( s2 ); return ret; } +inline wxUString operator+(const wxUString &s1, const char *s2) + { return s1 + wxUString(s2); } +inline wxUString operator+(const wxUString &s1, const wxString &s2) + { return s1 + wxUString(s2); } +inline wxUString operator+(const wxUString &s1, const wxCStrData *s2) + { return s1 + wxUString(s2); } +inline wxUString operator+(const wxUString &s1, const wxChar16* s2) + { return s1 + wxUString(s2); } +inline wxUString operator+(const wxUString &s1, const wxChar32 *s2) + { return s1 + wxUString(s2); } +inline wxUString operator+(const wxUString &s1, const wxScopedCharBuffer &s2) + { return s1 + wxUString(s2); } +inline wxUString operator+(const wxUString &s1, const wxScopedU16CharBuffer &s2) + { return s1 + wxUString(s2); } +inline wxUString operator+(const wxUString &s1, const wxScopedU32CharBuffer &s2) + { return s1 + wxUString(s2); } +inline wxUString operator+(const wxUString &s1, char s2) + { return s1 + wxUString(s2); } +inline wxUString operator+(const wxUString &s1, wxChar32 s2) + { wxUString ret( s1 ); ret.append( s2 ); return ret; } +inline wxUString operator+(const wxUString &s1, wxChar16 s2) + { wxUString ret( s1 ); ret.append( (wxChar32) s2 ); return ret; } +inline wxUString operator+(const wxUString &s1, wxUniChar s2) + { wxUString ret( s1 ); ret.append( (wxChar32) s2.GetValue() ); return ret; } +inline wxUString operator+(const wxUString &s1, wxUniCharRef s2) + { wxUString ret( s1 ); ret.append( (wxChar32) s2.GetValue() ); return ret; } + +inline wxUString operator+(const char *s1, const wxUString &s2) + { return wxUString(s1) + s2; } +inline wxUString operator+(const wxString &s1, const wxUString &s2) + { return wxUString(s1) + s2; } +inline wxUString operator+(const wxCStrData *s1, const wxUString &s2) + { return wxUString(s1) + s2; } +inline wxUString operator+(const wxChar16* s1, const wxUString &s2) + { return wxUString(s1) + s2; } +inline wxUString operator+(const wxChar32 *s1, const wxUString &s2) + { return wxUString(s1) + s2; } +inline wxUString operator+(const wxScopedCharBuffer &s1, const wxUString &s2) + { return wxUString(s1) + s2; } +inline wxUString operator+(const wxScopedU16CharBuffer &s1, const wxUString &s2) + { return wxUString(s1) + s2; } +inline wxUString operator+(const wxScopedU32CharBuffer &s1, const wxUString &s2) + { return wxUString(s1) + s2; } +inline wxUString operator+(char s1, const wxUString &s2) + { return wxUString(s1) + s2; } +inline wxUString operator+(wxChar32 s1, const wxUString &s2 ) + { return wxUString(s1) + s2; } +inline wxUString operator+(wxChar16 s1, const wxUString &s2) + { return wxUString(s1) + s2; } +inline wxUString operator+(wxUniChar s1, const wxUString &s2) + { return wxUString(s1) + s2; } +inline wxUString operator+(wxUniCharRef s1, const wxUString &s2) + { return wxUString(s1) + s2; } + + +inline bool operator==(const wxUString& s1, const wxUString& s2) + { return s1.compare( s2 ) == 0; } +inline bool operator!=(const wxUString& s1, const wxUString& s2) + { return s1.compare( s2 ) != 0; } +inline bool operator< (const wxUString& s1, const wxUString& s2) + { return s1.compare( s2 ) < 0; } +inline bool operator> (const wxUString& s1, const wxUString& s2) + { return s1.compare( s2 ) > 0; } +inline bool operator<=(const wxUString& s1, const wxUString& s2) + { return s1.compare( s2 ) <= 0; } +inline bool operator>=(const wxUString& s1, const wxUString& s2) + { return s1.compare( s2 ) >= 0; } + +#define wxUSTRING_COMP_OPERATORS( T ) \ +inline bool operator==(const wxUString& s1, T s2) \ + { return s1.compare( wxUString(s2) ) == 0; } \ +inline bool operator!=(const wxUString& s1, T s2) \ + { return s1.compare( wxUString(s2) ) != 0; } \ +inline bool operator< (const wxUString& s1, T s2) \ + { return s1.compare( wxUString(s2) ) < 0; } \ +inline bool operator> (const wxUString& s1, T s2) \ + { return s1.compare( wxUString(s2) ) > 0; } \ +inline bool operator<=(const wxUString& s1, T s2) \ + { return s1.compare( wxUString(s2) ) <= 0; } \ +inline bool operator>=(const wxUString& s1, T s2) \ + { return s1.compare( wxUString(s2) ) >= 0; } \ +\ +inline bool operator==(T s2, const wxUString& s1) \ + { return s1.compare( wxUString(s2) ) == 0; } \ +inline bool operator!=(T s2, const wxUString& s1) \ + { return s1.compare( wxUString(s2) ) != 0; } \ +inline bool operator< (T s2, const wxUString& s1) \ + { return s1.compare( wxUString(s2) ) > 0; } \ +inline bool operator> (T s2, const wxUString& s1) \ + { return s1.compare( wxUString(s2) ) < 0; } \ +inline bool operator<=(T s2, const wxUString& s1) \ + { return s1.compare( wxUString(s2) ) >= 0; } \ +inline bool operator>=(T s2, const wxUString& s1) \ + { return s1.compare( wxUString(s2) ) <= 0; } + +wxUSTRING_COMP_OPERATORS( const wxString & ) +wxUSTRING_COMP_OPERATORS( const char * ) +wxUSTRING_COMP_OPERATORS( const wxChar16 * ) +wxUSTRING_COMP_OPERATORS( const wxChar32 * ) +wxUSTRING_COMP_OPERATORS( const wxScopedCharBuffer & ) +wxUSTRING_COMP_OPERATORS( const wxScopedU16CharBuffer & ) +wxUSTRING_COMP_OPERATORS( const wxScopedU32CharBuffer & ) +wxUSTRING_COMP_OPERATORS( const wxCStrData * ) + +#endif // _WX_USTRING_H_ diff --git a/wxmsw/include/wx-3.0/wx/utils.h b/wxmsw/include/wx-3.0/wx/utils.h new file mode 100644 index 00000000..92701eae --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/utils.h @@ -0,0 +1,847 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/utils.h +// Purpose: Miscellaneous utilities +// Author: Julian Smart +// Modified by: +// Created: 29/01/98 +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UTILS_H_ +#define _WX_UTILS_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/object.h" +#include "wx/list.h" +#include "wx/filefn.h" +#include "wx/hashmap.h" +#include "wx/versioninfo.h" +#include "wx/meta/implicitconversion.h" + +#if wxUSE_GUI + #include "wx/gdicmn.h" + #include "wx/mousestate.h" +#endif + +class WXDLLIMPEXP_FWD_BASE wxArrayString; +class WXDLLIMPEXP_FWD_BASE wxArrayInt; + +// need this for wxGetDiskSpace() as we can't, unfortunately, forward declare +// wxLongLong +#include "wx/longlong.h" + +// needed for wxOperatingSystemId, wxLinuxDistributionInfo +#include "wx/platinfo.h" + +#ifdef __WATCOMC__ + #include <direct.h> +#elif defined(__X__) + #include <dirent.h> + #include <unistd.h> +#endif + +#include <stdio.h> + +// ---------------------------------------------------------------------------- +// Forward declaration +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxProcess; +class WXDLLIMPEXP_FWD_CORE wxFrame; +class WXDLLIMPEXP_FWD_CORE wxWindow; +class wxWindowList; +class WXDLLIMPEXP_FWD_CORE wxEventLoop; + +// ---------------------------------------------------------------------------- +// Arithmetic functions +// ---------------------------------------------------------------------------- + +template<typename T1, typename T2> +inline typename wxImplicitConversionType<T1,T2>::value +wxMax(T1 a, T2 b) +{ + typedef typename wxImplicitConversionType<T1,T2>::value ResultType; + + // Cast both operands to the same type before comparing them to avoid + // warnings about signed/unsigned comparisons from some compilers: + return static_cast<ResultType>(a) > static_cast<ResultType>(b) ? a : b; +} + +template<typename T1, typename T2> +inline typename wxImplicitConversionType<T1,T2>::value +wxMin(T1 a, T2 b) +{ + typedef typename wxImplicitConversionType<T1,T2>::value ResultType; + + return static_cast<ResultType>(a) < static_cast<ResultType>(b) ? a : b; +} + +template<typename T1, typename T2, typename T3> +inline typename wxImplicitConversionType3<T1,T2,T3>::value +wxClip(T1 a, T2 b, T3 c) +{ + typedef typename wxImplicitConversionType3<T1,T2,T3>::value ResultType; + + if ( static_cast<ResultType>(a) < static_cast<ResultType>(b) ) + return b; + + if ( static_cast<ResultType>(a) > static_cast<ResultType>(c) ) + return c; + + return a; +} + +// ---------------------------------------------------------------------------- +// wxMemorySize +// ---------------------------------------------------------------------------- + +// wxGetFreeMemory can return huge amount of memory on 32-bit platforms as well +// so to always use long long for its result type on all platforms which +// support it +#if wxUSE_LONGLONG + typedef wxLongLong wxMemorySize; +#else + typedef long wxMemorySize; +#endif + +// ---------------------------------------------------------------------------- +// String functions (deprecated, use wxString) +// ---------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_8 +// A shorter way of using strcmp +wxDEPRECATED_INLINE(inline bool wxStringEq(const char *s1, const char *s2), + return wxCRT_StrcmpA(s1, s2) == 0; ) + +#if wxUSE_UNICODE +wxDEPRECATED_INLINE(inline bool wxStringEq(const wchar_t *s1, const wchar_t *s2), + return wxCRT_StrcmpW(s1, s2) == 0; ) +#endif // wxUSE_UNICODE + +#endif // WXWIN_COMPATIBILITY_2_8 + +// ---------------------------------------------------------------------------- +// Miscellaneous functions +// ---------------------------------------------------------------------------- + +// Sound the bell +WXDLLIMPEXP_CORE void wxBell(); + +#if wxUSE_MSGDLG +// Show wxWidgets information +WXDLLIMPEXP_CORE void wxInfoMessageBox(wxWindow* parent); +#endif // wxUSE_MSGDLG + +WXDLLIMPEXP_CORE wxVersionInfo wxGetLibraryVersionInfo(); + +// Get OS description as a user-readable string +WXDLLIMPEXP_BASE wxString wxGetOsDescription(); + +// Get OS version +WXDLLIMPEXP_BASE wxOperatingSystemId wxGetOsVersion(int *majorVsn = NULL, + int *minorVsn = NULL); + +// Get platform endianness +WXDLLIMPEXP_BASE bool wxIsPlatformLittleEndian(); + +// Get platform architecture +WXDLLIMPEXP_BASE bool wxIsPlatform64Bit(); + +#ifdef __LINUX__ +// Get linux-distro informations +WXDLLIMPEXP_BASE wxLinuxDistributionInfo wxGetLinuxDistributionInfo(); +#endif + +// Return a string with the current date/time +WXDLLIMPEXP_BASE wxString wxNow(); + +// Return path where wxWidgets is installed (mostly useful in Unices) +WXDLLIMPEXP_BASE const wxChar *wxGetInstallPrefix(); +// Return path to wxWin data (/usr/share/wx/%{version}) (Unices) +WXDLLIMPEXP_BASE wxString wxGetDataDir(); + +#if wxUSE_GUI + +// Get the state of a key (true if pressed, false if not) +// This is generally most useful getting the state of +// the modifier or toggle keys. +WXDLLIMPEXP_CORE bool wxGetKeyState(wxKeyCode key); + +// Don't synthesize KeyUp events holding down a key and producing +// KeyDown events with autorepeat. On by default and always on +// in wxMSW. +WXDLLIMPEXP_CORE bool wxSetDetectableAutoRepeat( bool flag ); + +// Returns the current state of the mouse position, buttons and modifers +WXDLLIMPEXP_CORE wxMouseState wxGetMouseState(); + +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// wxPlatform +// ---------------------------------------------------------------------------- + +/* + * Class to make it easier to specify platform-dependent values + * + * Examples: + * long val = wxPlatform::If(wxMac, 1).ElseIf(wxGTK, 2).ElseIf(stPDA, 5).Else(3); + * wxString strVal = wxPlatform::If(wxMac, wxT("Mac")).ElseIf(wxMSW, wxT("MSW")).Else(wxT("Other")); + * + * A custom platform symbol: + * + * #define stPDA 100 + * #ifdef __WXWINCE__ + * wxPlatform::AddPlatform(stPDA); + * #endif + * + * long windowStyle = wxCAPTION | (long) wxPlatform::IfNot(stPDA, wxRESIZE_BORDER); + * + */ + +class WXDLLIMPEXP_BASE wxPlatform +{ +public: + wxPlatform() { Init(); } + wxPlatform(const wxPlatform& platform) { Copy(platform); } + void operator = (const wxPlatform& platform) { if (&platform != this) Copy(platform); } + void Copy(const wxPlatform& platform); + + // Specify an optional default value + wxPlatform(int defValue) { Init(); m_longValue = (long)defValue; } + wxPlatform(long defValue) { Init(); m_longValue = defValue; } + wxPlatform(const wxString& defValue) { Init(); m_stringValue = defValue; } + wxPlatform(double defValue) { Init(); m_doubleValue = defValue; } + + static wxPlatform If(int platform, long value); + static wxPlatform IfNot(int platform, long value); + wxPlatform& ElseIf(int platform, long value); + wxPlatform& ElseIfNot(int platform, long value); + wxPlatform& Else(long value); + + static wxPlatform If(int platform, int value) { return If(platform, (long)value); } + static wxPlatform IfNot(int platform, int value) { return IfNot(platform, (long)value); } + wxPlatform& ElseIf(int platform, int value) { return ElseIf(platform, (long) value); } + wxPlatform& ElseIfNot(int platform, int value) { return ElseIfNot(platform, (long) value); } + wxPlatform& Else(int value) { return Else((long) value); } + + static wxPlatform If(int platform, double value); + static wxPlatform IfNot(int platform, double value); + wxPlatform& ElseIf(int platform, double value); + wxPlatform& ElseIfNot(int platform, double value); + wxPlatform& Else(double value); + + static wxPlatform If(int platform, const wxString& value); + static wxPlatform IfNot(int platform, const wxString& value); + wxPlatform& ElseIf(int platform, const wxString& value); + wxPlatform& ElseIfNot(int platform, const wxString& value); + wxPlatform& Else(const wxString& value); + + long GetInteger() const { return m_longValue; } + const wxString& GetString() const { return m_stringValue; } + double GetDouble() const { return m_doubleValue; } + + operator int() const { return (int) GetInteger(); } + operator long() const { return GetInteger(); } + operator double() const { return GetDouble(); } + operator const wxString&() const { return GetString(); } + + static void AddPlatform(int platform); + static bool Is(int platform); + static void ClearPlatforms(); + +private: + + void Init() { m_longValue = 0; m_doubleValue = 0.0; } + + long m_longValue; + double m_doubleValue; + wxString m_stringValue; + static wxArrayInt* sm_customPlatforms; +}; + +/// Function for testing current platform +inline bool wxPlatformIs(int platform) { return wxPlatform::Is(platform); } + +// ---------------------------------------------------------------------------- +// Window ID management +// ---------------------------------------------------------------------------- + +// Ensure subsequent IDs don't clash with this one +WXDLLIMPEXP_BASE void wxRegisterId(int id); + +// Return the current ID +WXDLLIMPEXP_BASE int wxGetCurrentId(); + +// Generate a unique ID +WXDLLIMPEXP_BASE int wxNewId(); + +// ---------------------------------------------------------------------------- +// Various conversions +// ---------------------------------------------------------------------------- + +// Convert 2-digit hex number to decimal +WXDLLIMPEXP_BASE int wxHexToDec(const wxString& buf); + +// Convert 2-digit hex number to decimal +inline int wxHexToDec(const char* buf) +{ + int firstDigit, secondDigit; + + if (buf[0] >= 'A') + firstDigit = buf[0] - 'A' + 10; + else + firstDigit = buf[0] - '0'; + + if (buf[1] >= 'A') + secondDigit = buf[1] - 'A' + 10; + else + secondDigit = buf[1] - '0'; + + return (firstDigit & 0xF) * 16 + (secondDigit & 0xF ); +} + + +// Convert decimal integer to 2-character hex string +WXDLLIMPEXP_BASE void wxDecToHex(int dec, wxChar *buf); +WXDLLIMPEXP_BASE void wxDecToHex(int dec, char* ch1, char* ch2); +WXDLLIMPEXP_BASE wxString wxDecToHex(int dec); + +// ---------------------------------------------------------------------------- +// Process management +// ---------------------------------------------------------------------------- + +// NB: for backwards compatibility reasons the values of wxEXEC_[A]SYNC *must* +// be 0 and 1, don't change! + +enum +{ + // execute the process asynchronously + wxEXEC_ASYNC = 0, + + // execute it synchronously, i.e. wait until it finishes + wxEXEC_SYNC = 1, + + // under Windows, don't hide the child even if it's IO is redirected (this + // is done by default) + wxEXEC_SHOW_CONSOLE = 2, + + // deprecated synonym for wxEXEC_SHOW_CONSOLE, use the new name as it's + // more clear + wxEXEC_NOHIDE = wxEXEC_SHOW_CONSOLE, + + // under Unix, if the process is the group leader then passing wxKILL_CHILDREN to wxKill + // kills all children as well as pid + // under Windows (NT family only), sets the CREATE_NEW_PROCESS_GROUP flag, + // which allows to target Ctrl-Break signal to the spawned process. + // applies to console processes only. + wxEXEC_MAKE_GROUP_LEADER = 4, + + // by default synchronous execution disables all program windows to avoid + // that the user interacts with the program while the child process is + // running, you can use this flag to prevent this from happening + wxEXEC_NODISABLE = 8, + + // by default, the event loop is run while waiting for synchronous execution + // to complete and this flag can be used to simply block the main process + // until the child process finishes + wxEXEC_NOEVENTS = 16, + + // under Windows, hide the console of the child process if it has one, even + // if its IO is not redirected + wxEXEC_HIDE_CONSOLE = 32, + + // convenient synonym for flags given system()-like behaviour + wxEXEC_BLOCK = wxEXEC_SYNC | wxEXEC_NOEVENTS +}; + +// Map storing environment variables. +typedef wxStringToStringHashMap wxEnvVariableHashMap; + +// Used to pass additional parameters for child process to wxExecute(). Could +// be extended with other fields later. +struct wxExecuteEnv +{ + wxString cwd; // If empty, CWD is not changed. + wxEnvVariableHashMap env; // If empty, environment is unchanged. +}; + +// Execute another program. +// +// If flags contain wxEXEC_SYNC, return -1 on failure and the exit code of the +// process if everything was ok. Otherwise (i.e. if wxEXEC_ASYNC), return 0 on +// failure and the PID of the launched process if ok. +WXDLLIMPEXP_BASE long wxExecute(const wxString& command, + int flags = wxEXEC_ASYNC, + wxProcess *process = NULL, + const wxExecuteEnv *env = NULL); +WXDLLIMPEXP_BASE long wxExecute(char **argv, + int flags = wxEXEC_ASYNC, + wxProcess *process = NULL, + const wxExecuteEnv *env = NULL); +#if wxUSE_UNICODE +WXDLLIMPEXP_BASE long wxExecute(wchar_t **argv, + int flags = wxEXEC_ASYNC, + wxProcess *process = NULL, + const wxExecuteEnv *env = NULL); +#endif // wxUSE_UNICODE + +// execute the command capturing its output into an array line by line, this is +// always synchronous +WXDLLIMPEXP_BASE long wxExecute(const wxString& command, + wxArrayString& output, + int flags = 0, + const wxExecuteEnv *env = NULL); + +// also capture stderr (also synchronous) +WXDLLIMPEXP_BASE long wxExecute(const wxString& command, + wxArrayString& output, + wxArrayString& error, + int flags = 0, + const wxExecuteEnv *env = NULL); + +#if defined(__WINDOWS__) && wxUSE_IPC +// ask a DDE server to execute the DDE request with given parameters +WXDLLIMPEXP_BASE bool wxExecuteDDE(const wxString& ddeServer, + const wxString& ddeTopic, + const wxString& ddeCommand); +#endif // __WINDOWS__ && wxUSE_IPC + +enum wxSignal +{ + wxSIGNONE = 0, // verify if the process exists under Unix + wxSIGHUP, + wxSIGINT, + wxSIGQUIT, + wxSIGILL, + wxSIGTRAP, + wxSIGABRT, + wxSIGIOT = wxSIGABRT, // another name + wxSIGEMT, + wxSIGFPE, + wxSIGKILL, + wxSIGBUS, + wxSIGSEGV, + wxSIGSYS, + wxSIGPIPE, + wxSIGALRM, + wxSIGTERM + + // further signals are different in meaning between different Unix systems +}; + +enum wxKillError +{ + wxKILL_OK, // no error + wxKILL_BAD_SIGNAL, // no such signal + wxKILL_ACCESS_DENIED, // permission denied + wxKILL_NO_PROCESS, // no such process + wxKILL_ERROR // another, unspecified error +}; + +enum wxKillFlags +{ + wxKILL_NOCHILDREN = 0, // don't kill children + wxKILL_CHILDREN = 1 // kill children +}; + +enum wxShutdownFlags +{ + wxSHUTDOWN_FORCE = 1,// can be combined with other flags (MSW-only) + wxSHUTDOWN_POWEROFF = 2,// power off the computer + wxSHUTDOWN_REBOOT = 4,// shutdown and reboot + wxSHUTDOWN_LOGOFF = 8 // close session (currently MSW-only) +}; + +// Shutdown or reboot the PC +WXDLLIMPEXP_BASE bool wxShutdown(int flags = wxSHUTDOWN_POWEROFF); + +// send the given signal to the process (only NONE and KILL are supported under +// Windows, all others mean TERM), return 0 if ok and -1 on error +// +// return detailed error in rc if not NULL +WXDLLIMPEXP_BASE int wxKill(long pid, + wxSignal sig = wxSIGTERM, + wxKillError *rc = NULL, + int flags = wxKILL_NOCHILDREN); + +// Execute a command in an interactive shell window (always synchronously) +// If no command then just the shell +WXDLLIMPEXP_BASE bool wxShell(const wxString& command = wxEmptyString); + +// As wxShell(), but must give a (non interactive) command and its output will +// be returned in output array +WXDLLIMPEXP_BASE bool wxShell(const wxString& command, wxArrayString& output); + +// Sleep for nSecs seconds +WXDLLIMPEXP_BASE void wxSleep(int nSecs); + +// Sleep for a given amount of milliseconds +WXDLLIMPEXP_BASE void wxMilliSleep(unsigned long milliseconds); + +// Sleep for a given amount of microseconds +WXDLLIMPEXP_BASE void wxMicroSleep(unsigned long microseconds); + +#if WXWIN_COMPATIBILITY_2_8 +// Sleep for a given amount of milliseconds (old, bad name), use wxMilliSleep +wxDEPRECATED( WXDLLIMPEXP_BASE void wxUsleep(unsigned long milliseconds) ); +#endif + +// Get the process id of the current process +WXDLLIMPEXP_BASE unsigned long wxGetProcessId(); + +// Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX) +WXDLLIMPEXP_BASE wxMemorySize wxGetFreeMemory(); + +#if wxUSE_ON_FATAL_EXCEPTION + +// should wxApp::OnFatalException() be called? +WXDLLIMPEXP_BASE bool wxHandleFatalExceptions(bool doit = true); + +#endif // wxUSE_ON_FATAL_EXCEPTION + +// ---------------------------------------------------------------------------- +// Environment variables +// ---------------------------------------------------------------------------- + +// returns true if variable exists (value may be NULL if you just want to check +// for this) +WXDLLIMPEXP_BASE bool wxGetEnv(const wxString& var, wxString *value); + +// set the env var name to the given value, return true on success +WXDLLIMPEXP_BASE bool wxSetEnv(const wxString& var, const wxString& value); + +// remove the env var from environment +WXDLLIMPEXP_BASE bool wxUnsetEnv(const wxString& var); + +#if WXWIN_COMPATIBILITY_2_8 +inline bool wxSetEnv(const wxString& var, const char *value) + { return wxSetEnv(var, wxString(value)); } +inline bool wxSetEnv(const wxString& var, const wchar_t *value) + { return wxSetEnv(var, wxString(value)); } +template<typename T> +inline bool wxSetEnv(const wxString& var, const wxScopedCharTypeBuffer<T>& value) + { return wxSetEnv(var, wxString(value)); } +inline bool wxSetEnv(const wxString& var, const wxCStrData& value) + { return wxSetEnv(var, wxString(value)); } + +// this one is for passing NULL directly - don't use it, use wxUnsetEnv instead +wxDEPRECATED( inline bool wxSetEnv(const wxString& var, int value) ); +inline bool wxSetEnv(const wxString& var, int value) +{ + wxASSERT_MSG( value == 0, "using non-NULL integer as string?" ); + + wxUnusedVar(value); // fix unused parameter warning in release build + + return wxUnsetEnv(var); +} +#endif // WXWIN_COMPATIBILITY_2_8 + +// Retrieve the complete environment by filling specified map. +// Returns true on success or false if an error occurred. +WXDLLIMPEXP_BASE bool wxGetEnvMap(wxEnvVariableHashMap *map); + +// ---------------------------------------------------------------------------- +// Network and username functions. +// ---------------------------------------------------------------------------- + +// NB: "char *" functions are deprecated, use wxString ones! + +// Get eMail address +WXDLLIMPEXP_BASE bool wxGetEmailAddress(wxChar *buf, int maxSize); +WXDLLIMPEXP_BASE wxString wxGetEmailAddress(); + +// Get hostname. +WXDLLIMPEXP_BASE bool wxGetHostName(wxChar *buf, int maxSize); +WXDLLIMPEXP_BASE wxString wxGetHostName(); + +// Get FQDN +WXDLLIMPEXP_BASE wxString wxGetFullHostName(); +WXDLLIMPEXP_BASE bool wxGetFullHostName(wxChar *buf, int maxSize); + +// Get user ID e.g. jacs (this is known as login name under Unix) +WXDLLIMPEXP_BASE bool wxGetUserId(wxChar *buf, int maxSize); +WXDLLIMPEXP_BASE wxString wxGetUserId(); + +// Get user name e.g. Julian Smart +WXDLLIMPEXP_BASE bool wxGetUserName(wxChar *buf, int maxSize); +WXDLLIMPEXP_BASE wxString wxGetUserName(); + +// Get current Home dir and copy to dest (returns pstr->c_str()) +WXDLLIMPEXP_BASE wxString wxGetHomeDir(); +WXDLLIMPEXP_BASE const wxChar* wxGetHomeDir(wxString *pstr); + +// Get the user's (by default use the current user name) home dir, +// return empty string on error +WXDLLIMPEXP_BASE wxString wxGetUserHome(const wxString& user = wxEmptyString); + + +#if wxUSE_LONGLONG + typedef wxLongLong wxDiskspaceSize_t; +#else + typedef long wxDiskspaceSize_t; +#endif + +// get number of total/free bytes on the disk where path belongs +WXDLLIMPEXP_BASE bool wxGetDiskSpace(const wxString& path, + wxDiskspaceSize_t *pTotal = NULL, + wxDiskspaceSize_t *pFree = NULL); + + + +typedef int (*wxSortCallback)(const void* pItem1, + const void* pItem2, + const void* user_data); + + +WXDLLIMPEXP_BASE void wxQsort(void* pbase, size_t total_elems, + size_t size, wxSortCallback cmp, + const void* user_data); + + +#if wxUSE_GUI // GUI only things from now on + +// ---------------------------------------------------------------------------- +// Launch default browser +// ---------------------------------------------------------------------------- + +// flags for wxLaunchDefaultBrowser +enum +{ + wxBROWSER_NEW_WINDOW = 0x01, + wxBROWSER_NOBUSYCURSOR = 0x02 +}; + +// Launch url in the user's default internet browser +WXDLLIMPEXP_CORE bool wxLaunchDefaultBrowser(const wxString& url, int flags = 0); + +// Launch document in the user's default application +WXDLLIMPEXP_CORE bool wxLaunchDefaultApplication(const wxString& path, int flags = 0); + +// ---------------------------------------------------------------------------- +// Menu accelerators related things +// ---------------------------------------------------------------------------- + +// flags for wxStripMenuCodes +enum +{ + // strip '&' characters + wxStrip_Mnemonics = 1, + + // strip everything after '\t' + wxStrip_Accel = 2, + + // strip everything (this is the default) + wxStrip_All = wxStrip_Mnemonics | wxStrip_Accel +}; + +// strip mnemonics and/or accelerators from the label +WXDLLIMPEXP_CORE wxString +wxStripMenuCodes(const wxString& str, int flags = wxStrip_All); + +#if WXWIN_COMPATIBILITY_2_6 +// obsolete and deprecated version, do not use, use the above overload instead +wxDEPRECATED( + WXDLLIMPEXP_CORE wxChar* wxStripMenuCodes(const wxChar *in, wxChar *out = NULL) +); + +#if wxUSE_ACCEL +class WXDLLIMPEXP_FWD_CORE wxAcceleratorEntry; + +// use wxAcceleratorEntry::Create() or FromString() methods instead +wxDEPRECATED( + WXDLLIMPEXP_CORE wxAcceleratorEntry *wxGetAccelFromString(const wxString& label) +); +#endif // wxUSE_ACCEL + +#endif // WXWIN_COMPATIBILITY_2_6 + +// ---------------------------------------------------------------------------- +// Window search +// ---------------------------------------------------------------------------- + +// Returns menu item id or wxNOT_FOUND if none. +WXDLLIMPEXP_CORE int wxFindMenuItemId(wxFrame *frame, const wxString& menuString, const wxString& itemString); + +// Find the wxWindow at the given point. wxGenericFindWindowAtPoint +// is always present but may be less reliable than a native version. +WXDLLIMPEXP_CORE wxWindow* wxGenericFindWindowAtPoint(const wxPoint& pt); +WXDLLIMPEXP_CORE wxWindow* wxFindWindowAtPoint(const wxPoint& pt); + +// NB: this function is obsolete, use wxWindow::FindWindowByLabel() instead +// +// Find the window/widget with the given title or label. +// Pass a parent to begin the search from, or NULL to look through +// all windows. +WXDLLIMPEXP_CORE wxWindow* wxFindWindowByLabel(const wxString& title, wxWindow *parent = NULL); + +// NB: this function is obsolete, use wxWindow::FindWindowByName() instead +// +// Find window by name, and if that fails, by label. +WXDLLIMPEXP_CORE wxWindow* wxFindWindowByName(const wxString& name, wxWindow *parent = NULL); + +// ---------------------------------------------------------------------------- +// Message/event queue helpers +// ---------------------------------------------------------------------------- + +// Yield to other apps/messages and disable user input +WXDLLIMPEXP_CORE bool wxSafeYield(wxWindow *win = NULL, bool onlyIfNeeded = false); + +// Enable or disable input to all top level windows +WXDLLIMPEXP_CORE void wxEnableTopLevelWindows(bool enable = true); + +// Check whether this window wants to process messages, e.g. Stop button +// in long calculations. +WXDLLIMPEXP_CORE bool wxCheckForInterrupt(wxWindow *wnd); + +// Consume all events until no more left +WXDLLIMPEXP_CORE void wxFlushEvents(); + +// a class which disables all windows (except, may be, the given one) in its +// ctor and enables them back in its dtor +class WXDLLIMPEXP_CORE wxWindowDisabler +{ +public: + // this ctor conditionally disables all windows: if the argument is false, + // it doesn't do anything + wxWindowDisabler(bool disable = true); + + // ctor disables all windows except winToSkip + wxWindowDisabler(wxWindow *winToSkip); + + // dtor enables back all windows disabled by the ctor + ~wxWindowDisabler(); + +private: + // disable all windows except the given one (used by both ctors) + void DoDisable(wxWindow *winToSkip = NULL); + +#if defined(__WXOSX__) && wxOSX_USE_COCOA + wxEventLoop* m_modalEventLoop; +#endif + wxWindowList *m_winDisabled; + bool m_disabled; + + wxDECLARE_NO_COPY_CLASS(wxWindowDisabler); +}; + +// ---------------------------------------------------------------------------- +// Cursors +// ---------------------------------------------------------------------------- + +// Set the cursor to the busy cursor for all windows +WXDLLIMPEXP_CORE void wxBeginBusyCursor(const wxCursor *cursor = wxHOURGLASS_CURSOR); + +// Restore cursor to normal +WXDLLIMPEXP_CORE void wxEndBusyCursor(); + +// true if we're between the above two calls +WXDLLIMPEXP_CORE bool wxIsBusy(); + +// Convenience class so we can just create a wxBusyCursor object on the stack +class WXDLLIMPEXP_CORE wxBusyCursor +{ +public: + wxBusyCursor(const wxCursor* cursor = wxHOURGLASS_CURSOR) + { wxBeginBusyCursor(cursor); } + ~wxBusyCursor() + { wxEndBusyCursor(); } + + // FIXME: These two methods are currently only implemented (and needed?) + // in wxGTK. BusyCursor handling should probably be moved to + // common code since the wxGTK and wxMSW implementations are very + // similar except for wxMSW using HCURSOR directly instead of + // wxCursor.. -- RL. + static const wxCursor &GetStoredCursor(); + static const wxCursor GetBusyCursor(); +}; + +void WXDLLIMPEXP_CORE wxGetMousePosition( int* x, int* y ); + +// ---------------------------------------------------------------------------- +// X11 Display access +// ---------------------------------------------------------------------------- + +#if defined(__X__) || defined(__WXGTK__) + +#ifdef __WXGTK__ + WXDLLIMPEXP_CORE void *wxGetDisplay(); +#endif + +#ifdef __X__ + WXDLLIMPEXP_CORE WXDisplay *wxGetDisplay(); + WXDLLIMPEXP_CORE bool wxSetDisplay(const wxString& display_name); + WXDLLIMPEXP_CORE wxString wxGetDisplayName(); +#endif // X or GTK+ + +// use this function instead of the functions above in implementation code +inline struct _XDisplay *wxGetX11Display() +{ + return (_XDisplay *)wxGetDisplay(); +} + +#endif // X11 || wxGTK + +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// wxYield(): these functions are obsolete, please use wxApp methods instead! +// ---------------------------------------------------------------------------- + +// avoid redeclaring this function here if it had been already declated by +// wx/app.h, this results in warnings from g++ with -Wredundant-decls +#ifndef wx_YIELD_DECLARED +#define wx_YIELD_DECLARED + +// Yield to other apps/messages +WXDLLIMPEXP_CORE bool wxYield(); + +#endif // wx_YIELD_DECLARED + +// Like wxYield, but fails silently if the yield is recursive. +WXDLLIMPEXP_CORE bool wxYieldIfNeeded(); + +// ---------------------------------------------------------------------------- +// Windows resources access +// ---------------------------------------------------------------------------- + +// Windows only: get user-defined resource from the .res file. +#ifdef __WINDOWS__ + // default resource type for wxLoadUserResource() + extern WXDLLIMPEXP_DATA_BASE(const wxChar*) wxUserResourceStr; + + // Return the pointer to the resource data. This pointer is read-only, use + // the overload below if you need to modify the data. + // + // Notice that the resource type can be either a real string or an integer + // produced by MAKEINTRESOURCE(). In particular, any standard resource type, + // i.e any RT_XXX constant, could be passed here. + // + // Returns true on success, false on failure. Doesn't log an error message + // if the resource is not found (because this could be expected) but does + // log one if any other error occurs. + WXDLLIMPEXP_BASE bool + wxLoadUserResource(const void **outData, + size_t *outLen, + const wxString& resourceName, + const wxChar* resourceType = wxUserResourceStr, + WXHINSTANCE module = 0); + + // This function allocates a new buffer and makes a copy of the resource + // data, remember to delete[] the buffer. And avoid using it entirely if + // the overload above can be used. + // + // Returns NULL on failure. + WXDLLIMPEXP_BASE char* + wxLoadUserResource(const wxString& resourceName, + const wxChar* resourceType = wxUserResourceStr, + int* pLen = NULL, + WXHINSTANCE module = 0); +#endif // __WINDOWS__ + +#endif + // _WX_UTILSH__ diff --git a/wxmsw/include/wx-3.0/wx/valgen.h b/wxmsw/include/wx-3.0/wx/valgen.h new file mode 100644 index 00000000..c24142e7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/valgen.h @@ -0,0 +1,94 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/valgen.h +// Purpose: wxGenericValidator class +// Author: Kevin Smith +// Created: Jan 22 1999 +// Copyright: (c) 1999 Julian Smart (assigned from Kevin) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VALGENH__ +#define _WX_VALGENH__ + +#include "wx/validate.h" + +#if wxUSE_VALIDATORS + +class WXDLLIMPEXP_FWD_BASE wxDateTime; +class WXDLLIMPEXP_FWD_BASE wxFileName; + +// ---------------------------------------------------------------------------- +// wxGenericValidator performs data transfer between many standard controls and +// variables of the type corresponding to their values. +// +// It doesn't do any validation so its name is a slight misnomer. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGenericValidator: public wxValidator +{ +public: + // Different constructors: each of them creates a validator which can only + // be used with some controls, the comments before each constructor + // indicate which ones: + // wxCheckBox, wxRadioButton, wx(Bitmap)ToggleButton + wxGenericValidator(bool* val); + // wxChoice, wxGauge, wxRadioBox, wxScrollBar, wxSlider, wxSpinButton + wxGenericValidator(int* val); + // wxComboBox, wxTextCtrl, wxButton, wxStaticText (read-only) + wxGenericValidator(wxString* val); + // wxListBox, wxCheckListBox + wxGenericValidator(wxArrayInt* val); +#if wxUSE_DATETIME + // wxDatePickerCtrl + wxGenericValidator(wxDateTime* val); +#endif // wxUSE_DATETIME + // wxTextCtrl + wxGenericValidator(wxFileName* val); + // wxTextCtrl + wxGenericValidator(float* val); + // wxTextCtrl + wxGenericValidator(double* val); + + wxGenericValidator(const wxGenericValidator& copyFrom); + + virtual ~wxGenericValidator(){} + + // Make a clone of this validator (or return NULL) - currently necessary + // if you're passing a reference to a validator. + // Another possibility is to always pass a pointer to a new validator + // (so the calling code can use a copy constructor of the relevant class). + virtual wxObject *Clone() const { return new wxGenericValidator(*this); } + bool Copy(const wxGenericValidator& val); + + // Called when the value in the window must be validated: this is not used + // by this class + virtual bool Validate(wxWindow * WXUNUSED(parent)) { return true; } + + // Called to transfer data to the window + virtual bool TransferToWindow(); + + // Called to transfer data to the window + virtual bool TransferFromWindow(); + +protected: + void Initialize(); + + bool* m_pBool; + int* m_pInt; + wxString* m_pString; + wxArrayInt* m_pArrayInt; +#if wxUSE_DATETIME + wxDateTime* m_pDateTime; +#endif // wxUSE_DATETIME + wxFileName* m_pFileName; + float* m_pFloat; + double* m_pDouble; + +private: + DECLARE_CLASS(wxGenericValidator) + wxDECLARE_NO_ASSIGN_CLASS(wxGenericValidator); +}; + +#endif // wxUSE_VALIDATORS + +#endif // _WX_VALGENH__ diff --git a/wxmsw/include/wx-3.0/wx/validate.h b/wxmsw/include/wx-3.0/wx/validate.h new file mode 100644 index 00000000..0adf3bf4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/validate.h @@ -0,0 +1,115 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/validate.h +// Purpose: wxValidator class +// Author: Julian Smart +// Modified by: +// Created: 29/01/98 +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VALIDATE_H_ +#define _WX_VALIDATE_H_ + +#include "wx/defs.h" + +#if wxUSE_VALIDATORS + +#include "wx/event.h" + +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxWindowBase; + +/* + A validator has up to three purposes: + + 1) To validate the data in the window that's associated + with the validator. + 2) To transfer data to and from the window. + 3) To filter input, using its role as a wxEvtHandler + to intercept e.g. OnChar. + + Note that wxValidator and derived classes use reference counting. +*/ + +class WXDLLIMPEXP_CORE wxValidator : public wxEvtHandler +{ +public: + wxValidator(); + wxValidator(const wxValidator& other) + : wxEvtHandler() + , m_validatorWindow(other.m_validatorWindow) + { + } + virtual ~wxValidator(); + + // Make a clone of this validator (or return NULL) - currently necessary + // if you're passing a reference to a validator. + // Another possibility is to always pass a pointer to a new validator + // (so the calling code can use a copy constructor of the relevant class). + virtual wxObject *Clone() const + { return NULL; } + bool Copy(const wxValidator& val) + { m_validatorWindow = val.m_validatorWindow; return true; } + + // Called when the value in the window must be validated. + // This function can pop up an error message. + virtual bool Validate(wxWindow *WXUNUSED(parent)) { return false; } + + // Called to transfer data to the window + virtual bool TransferToWindow() { return false; } + + // Called to transfer data from the window + virtual bool TransferFromWindow() { return false; } + + // accessors + wxWindow *GetWindow() const { return (wxWindow *)m_validatorWindow; } + void SetWindow(wxWindowBase *win) { m_validatorWindow = win; } + + // validators beep by default if invalid key is pressed, this function + // allows to change this + static void SuppressBellOnError(bool suppress = true) + { ms_isSilent = suppress; } + + // test if beep is currently disabled + static bool IsSilent() { return ms_isSilent; } + + // this function is deprecated because it handled its parameter + // unnaturally: it disabled the bell when it was true, not false as could + // be expected; use SuppressBellOnError() instead +#if WXWIN_COMPATIBILITY_2_8 + static wxDEPRECATED_INLINE( + void SetBellOnError(bool doIt = true), + ms_isSilent = doIt; + ) +#endif + +protected: + wxWindowBase *m_validatorWindow; + +private: + static bool ms_isSilent; + + DECLARE_DYNAMIC_CLASS(wxValidator) + wxDECLARE_NO_ASSIGN_CLASS(wxValidator); +}; + +extern WXDLLIMPEXP_DATA_CORE(const wxValidator) wxDefaultValidator; + +#define wxVALIDATOR_PARAM(val) val + +#else // !wxUSE_VALIDATORS + // wxWidgets is compiled without support for wxValidator, but we still + // want to be able to pass wxDefaultValidator to the functions which take + // a wxValidator parameter to avoid using "#if wxUSE_VALIDATORS" + // everywhere + class WXDLLIMPEXP_FWD_CORE wxValidator; + #define wxDefaultValidator (*reinterpret_cast<wxValidator*>(NULL)) + + // this macro allows to avoid warnings about unused parameters when + // wxUSE_VALIDATORS == 0 + #define wxVALIDATOR_PARAM(val) +#endif // wxUSE_VALIDATORS/!wxUSE_VALIDATORS + +#endif // _WX_VALIDATE_H_ + diff --git a/wxmsw/include/wx-3.0/wx/valnum.h b/wxmsw/include/wx-3.0/wx/valnum.h new file mode 100644 index 00000000..2fbfe607 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/valnum.h @@ -0,0 +1,463 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/valnum.h +// Purpose: Numeric validator classes. +// Author: Vadim Zeitlin based on the submission of Fulvio Senore +// Created: 2010-11-06 +// Copyright: (c) 2010 wxWidgets team +// (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VALNUM_H_ +#define _WX_VALNUM_H_ + +#include "wx/defs.h" + +#if wxUSE_VALIDATORS + +#include "wx/validate.h" + +#include <limits> + +// Bit masks used for numeric validator styles. +enum wxNumValidatorStyle +{ + wxNUM_VAL_DEFAULT = 0x0, + wxNUM_VAL_THOUSANDS_SEPARATOR = 0x1, + wxNUM_VAL_ZERO_AS_BLANK = 0x2, + wxNUM_VAL_NO_TRAILING_ZEROES = 0x4 +}; + +// ---------------------------------------------------------------------------- +// Base class for all numeric validators. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxNumValidatorBase : public wxValidator +{ +public: + // Change the validator style. Usually it's specified during construction. + void SetStyle(int style) { m_style = style; } + + + // Override base class method to not do anything but always return success: + // we don't need this as we do our validation on the fly here. + virtual bool Validate(wxWindow * WXUNUSED(parent)) { return true; } + +protected: + wxNumValidatorBase(int style) + { + m_style = style; + } + + wxNumValidatorBase(const wxNumValidatorBase& other) : wxValidator() + { + m_style = other.m_style; + } + + bool HasFlag(wxNumValidatorStyle style) const + { + return (m_style & style) != 0; + } + + // Get the text entry of the associated control. Normally shouldn't ever + // return NULL (and will assert if it does return it) but the caller should + // still test the return value for safety. + wxTextEntry *GetTextEntry() const; + + // Convert wxNUM_VAL_THOUSANDS_SEPARATOR and wxNUM_VAL_NO_TRAILING_ZEROES + // bits of our style to the corresponding wxNumberFormatter::Style values. + int GetFormatFlags() const; + + // Return true if pressing a '-' key is acceptable for the current control + // contents and insertion point. This is meant to be called from the + // derived class IsCharOk() implementation. + bool IsMinusOk(const wxString& val, int pos) const; + + // Return the string which would result from inserting the given character + // at the specified position. + wxString GetValueAfterInsertingChar(wxString val, int pos, wxChar ch) const + { + val.insert(pos, ch); + return val; + } + +private: + // Check whether the specified character can be inserted in the control at + // the given position in the string representing the current controls + // contents. + // + // Notice that the base class checks for '-' itself so it's never passed to + // this function. + virtual bool IsCharOk(const wxString& val, int pos, wxChar ch) const = 0; + + // NormalizeString the contents of the string if it's a valid number, return + // empty string otherwise. + virtual wxString NormalizeString(const wxString& s) const = 0; + + + // Event handlers. + void OnChar(wxKeyEvent& event); + void OnKillFocus(wxFocusEvent& event); + + + // Determine the current insertion point and text in the associated control. + void GetCurrentValueAndInsertionPoint(wxString& val, int& pos) const; + + + // Combination of wxVAL_NUM_XXX values. + int m_style; + + + wxDECLARE_EVENT_TABLE(); + + wxDECLARE_NO_ASSIGN_CLASS(wxNumValidatorBase); +}; + +namespace wxPrivate +{ + +// This is a helper class used by wxIntegerValidator and wxFloatingPointValidator +// below that implements Transfer{To,From}Window() adapted to the type of the +// variable. +// +// The template argument B is the name of the base class which must derive from +// wxNumValidatorBase and define LongestValueType type and {To,As}String() +// methods i.e. basically be one of wx{Integer,Number}ValidatorBase classes. +// +// The template argument T is just the type handled by the validator that will +// inherit from this one. +template <class B, typename T> +class wxNumValidator : public B +{ +public: + typedef B BaseValidator; + typedef T ValueType; + + typedef typename BaseValidator::LongestValueType LongestValueType; + + // FIXME-VC6: This compiler fails to compile the assert below with a + // nonsensical error C2248: "'LongestValueType' : cannot access protected + // typedef declared in class 'wxIntegerValidatorBase'" so just disable the + // check for it. +#ifndef __VISUALC6__ + wxCOMPILE_TIME_ASSERT + ( + sizeof(ValueType) <= sizeof(LongestValueType), + UnsupportedType + ); +#endif // __VISUALC6__ + + void SetMin(ValueType min) + { + this->DoSetMin(min); + } + + void SetMax(ValueType max) + { + this->DoSetMax(max); + } + + void SetRange(ValueType min, ValueType max) + { + SetMin(min); + SetMax(max); + } + + virtual bool TransferToWindow() + { + if ( m_value ) + { + wxTextEntry * const control = BaseValidator::GetTextEntry(); + if ( !control ) + return false; + + control->SetValue(NormalizeValue(*m_value)); + } + + return true; + } + + virtual bool TransferFromWindow() + { + if ( m_value ) + { + wxTextEntry * const control = BaseValidator::GetTextEntry(); + if ( !control ) + return false; + + const wxString s(control->GetValue()); + LongestValueType value; + if ( s.empty() && BaseValidator::HasFlag(wxNUM_VAL_ZERO_AS_BLANK) ) + value = 0; + else if ( !BaseValidator::FromString(s, &value) ) + return false; + + if ( !this->IsInRange(value) ) + return false; + + *m_value = static_cast<ValueType>(value); + } + + return true; + } + +protected: + wxNumValidator(ValueType *value, int style) + : BaseValidator(style), + m_value(value) + { + } + + // Implement wxNumValidatorBase virtual method which is the same for + // both integer and floating point numbers. + virtual wxString NormalizeString(const wxString& s) const + { + LongestValueType value; + return BaseValidator::FromString(s, &value) ? NormalizeValue(value) + : wxString(); + } + +private: + // Just a helper which is a common part of TransferToWindow() and + // NormalizeString(): returns string representation of a number honouring + // wxNUM_VAL_ZERO_AS_BLANK flag. + wxString NormalizeValue(LongestValueType value) const + { + wxString s; + if ( value != 0 || !BaseValidator::HasFlag(wxNUM_VAL_ZERO_AS_BLANK) ) + s = this->ToString(value); + + return s; + } + + + ValueType * const m_value; + + wxDECLARE_NO_ASSIGN_CLASS(wxNumValidator); +}; + +} // namespace wxPrivate + +// ---------------------------------------------------------------------------- +// Validators for integer numbers. +// ---------------------------------------------------------------------------- + +// Base class for integer numbers validator. This class contains all non +// type-dependent code of wxIntegerValidator<> and always works with values of +// type LongestValueType. It is not meant to be used directly, please use +// wxIntegerValidator<> only instead. +class WXDLLIMPEXP_CORE wxIntegerValidatorBase : public wxNumValidatorBase +{ +protected: + // Define the type we use here, it should be the maximal-sized integer type + // we support to make it possible to base wxIntegerValidator<> for any type + // on it. +#ifdef wxLongLong_t + typedef wxLongLong_t LongestValueType; +#else + typedef long LongestValueType; +#endif + + wxIntegerValidatorBase(int style) + : wxNumValidatorBase(style) + { + wxASSERT_MSG( !(style & wxNUM_VAL_NO_TRAILING_ZEROES), + "This style doesn't make sense for integers." ); + } + + wxIntegerValidatorBase(const wxIntegerValidatorBase& other) + : wxNumValidatorBase(other) + { + m_min = other.m_min; + m_max = other.m_max; + } + + // Provide methods for wxNumValidator use. + wxString ToString(LongestValueType value) const; + static bool FromString(const wxString& s, LongestValueType *value); + + void DoSetMin(LongestValueType min) { m_min = min; } + void DoSetMax(LongestValueType max) { m_max = max; } + + bool IsInRange(LongestValueType value) const + { + return m_min <= value && value <= m_max; + } + + // Implement wxNumValidatorBase pure virtual method. + virtual bool IsCharOk(const wxString& val, int pos, wxChar ch) const; + +private: + // Minimal and maximal values accepted (inclusive). + LongestValueType m_min, m_max; + + wxDECLARE_NO_ASSIGN_CLASS(wxIntegerValidatorBase); +}; + +// Validator for integer numbers. It can actually work with any integer type +// (short, int or long and long long if supported) and their unsigned versions +// as well. +template <typename T> +class wxIntegerValidator + : public wxPrivate::wxNumValidator<wxIntegerValidatorBase, T> +{ +public: + typedef T ValueType; + + typedef + wxPrivate::wxNumValidator<wxIntegerValidatorBase, T> Base; + + // Ctor for an integer validator. + // + // Sets the range appropriately for the type, including setting 0 as the + // minimal value for the unsigned types. + wxIntegerValidator(ValueType *value = NULL, int style = wxNUM_VAL_DEFAULT) + : Base(value, style) + { + this->DoSetMin(std::numeric_limits<ValueType>::min()); + this->DoSetMax(std::numeric_limits<ValueType>::max()); + } + + virtual wxObject *Clone() const { return new wxIntegerValidator(*this); } + +private: + wxDECLARE_NO_ASSIGN_CLASS(wxIntegerValidator); +}; + +// Helper function for creating integer validators which allows to avoid +// explicitly specifying the type as it deduces it from its parameter. +template <typename T> +inline wxIntegerValidator<T> +wxMakeIntegerValidator(T *value, int style = wxNUM_VAL_DEFAULT) +{ + return wxIntegerValidator<T>(value, style); +} + +// ---------------------------------------------------------------------------- +// Validators for floating point numbers. +// ---------------------------------------------------------------------------- + +// Similar to wxIntegerValidatorBase, this class is not meant to be used +// directly, only wxFloatingPointValidator<> should be used in the user code. +class WXDLLIMPEXP_CORE wxFloatingPointValidatorBase : public wxNumValidatorBase +{ +public: + // Set precision i.e. the number of digits shown (and accepted on input) + // after the decimal point. By default this is set to the maximal precision + // supported by the type handled by the validator. + void SetPrecision(unsigned precision) { m_precision = precision; } + +protected: + // Notice that we can't use "long double" here because it's not supported + // by wxNumberFormatter yet, so restrict ourselves to just double (and + // float). + typedef double LongestValueType; + + wxFloatingPointValidatorBase(int style) + : wxNumValidatorBase(style) + { + } + + wxFloatingPointValidatorBase(const wxFloatingPointValidatorBase& other) + : wxNumValidatorBase(other) + { + m_precision = other.m_precision; + + m_min = other.m_min; + m_max = other.m_max; + } + + // Provide methods for wxNumValidator use. + wxString ToString(LongestValueType value) const; + static bool FromString(const wxString& s, LongestValueType *value); + + void DoSetMin(LongestValueType min) { m_min = min; } + void DoSetMax(LongestValueType max) { m_max = max; } + + bool IsInRange(LongestValueType value) const + { + return m_min <= value && value <= m_max; + } + + // Implement wxNumValidatorBase pure virtual method. + virtual bool IsCharOk(const wxString& val, int pos, wxChar ch) const; + +private: + // Maximum number of decimals digits after the decimal separator. + unsigned m_precision; + + // Minimal and maximal values accepted (inclusive). + LongestValueType m_min, m_max; + + wxDECLARE_NO_ASSIGN_CLASS(wxFloatingPointValidatorBase); +}; + +// Validator for floating point numbers. It can be used with float, double or +// long double values. +template <typename T> +class wxFloatingPointValidator + : public wxPrivate::wxNumValidator<wxFloatingPointValidatorBase, T> +{ +public: + typedef T ValueType; + typedef wxPrivate::wxNumValidator<wxFloatingPointValidatorBase, T> Base; + + // Ctor using implicit (maximal) precision for this type. + wxFloatingPointValidator(ValueType *value = NULL, + int style = wxNUM_VAL_DEFAULT) + : Base(value, style) + { + DoSetMinMax(); + + this->SetPrecision(std::numeric_limits<ValueType>::digits10); + } + + // Ctor specifying an explicit precision. + wxFloatingPointValidator(int precision, + ValueType *value = NULL, + int style = wxNUM_VAL_DEFAULT) + : Base(value, style) + { + DoSetMinMax(); + + this->SetPrecision(precision); + } + + virtual wxObject *Clone() const + { + return new wxFloatingPointValidator(*this); + } + +private: + void DoSetMinMax() + { + // NB: Do not use min(), it's not the smallest representable value for + // the floating point types but rather the smallest representable + // positive value. + this->DoSetMin(-std::numeric_limits<ValueType>::max()); + this->DoSetMax( std::numeric_limits<ValueType>::max()); + } +}; + +// Helper similar to wxMakeIntValidator(). +// +// NB: Unfortunately we can't just have a wxMakeNumericValidator() which would +// return either wxIntegerValidator<> or wxFloatingPointValidator<> so we +// do need two different functions. +template <typename T> +inline wxFloatingPointValidator<T> +wxMakeFloatingPointValidator(T *value, int style = wxNUM_VAL_DEFAULT) +{ + return wxFloatingPointValidator<T>(value, style); +} + +template <typename T> +inline wxFloatingPointValidator<T> +wxMakeFloatingPointValidator(int precision, T *value, int style = wxNUM_VAL_DEFAULT) +{ + return wxFloatingPointValidator<T>(precision, value, style); +} + +#endif // wxUSE_VALIDATORS + +#endif // _WX_VALNUM_H_ diff --git a/wxmsw/include/wx-3.0/wx/valtext.h b/wxmsw/include/wx-3.0/wx/valtext.h new file mode 100644 index 00000000..93f5dd61 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/valtext.h @@ -0,0 +1,108 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/valtext.h +// Purpose: wxTextValidator class +// Author: Julian Smart +// Modified by: Francesco Montorsi +// Created: 29/01/98 +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VALTEXT_H_ +#define _WX_VALTEXT_H_ + +#include "wx/defs.h" + +#if wxUSE_VALIDATORS && (wxUSE_TEXTCTRL || wxUSE_COMBOBOX) + +class WXDLLIMPEXP_FWD_CORE wxTextEntry; + +#include "wx/validate.h" + +enum wxTextValidatorStyle +{ + wxFILTER_NONE = 0x0, + wxFILTER_EMPTY = 0x1, + wxFILTER_ASCII = 0x2, + wxFILTER_ALPHA = 0x4, + wxFILTER_ALPHANUMERIC = 0x8, + wxFILTER_DIGITS = 0x10, + wxFILTER_NUMERIC = 0x20, + wxFILTER_INCLUDE_LIST = 0x40, + wxFILTER_INCLUDE_CHAR_LIST = 0x80, + wxFILTER_EXCLUDE_LIST = 0x100, + wxFILTER_EXCLUDE_CHAR_LIST = 0x200 +}; + +class WXDLLIMPEXP_CORE wxTextValidator: public wxValidator +{ +public: + wxTextValidator(long style = wxFILTER_NONE, wxString *val = NULL); + wxTextValidator(const wxTextValidator& val); + + virtual ~wxTextValidator(){} + + // Make a clone of this validator (or return NULL) - currently necessary + // if you're passing a reference to a validator. + // Another possibility is to always pass a pointer to a new validator + // (so the calling code can use a copy constructor of the relevant class). + virtual wxObject *Clone() const { return new wxTextValidator(*this); } + bool Copy(const wxTextValidator& val); + + // Called when the value in the window must be validated. + // This function can pop up an error message. + virtual bool Validate(wxWindow *parent); + + // Called to transfer data to the window + virtual bool TransferToWindow(); + + // Called to transfer data from the window + virtual bool TransferFromWindow(); + + // Filter keystrokes + void OnChar(wxKeyEvent& event); + + // ACCESSORS + inline long GetStyle() const { return m_validatorStyle; } + void SetStyle(long style); + + wxTextEntry *GetTextEntry(); + + void SetCharIncludes(const wxString& chars); + void SetIncludes(const wxArrayString& includes) { m_includes = includes; } + inline wxArrayString& GetIncludes() { return m_includes; } + + void SetCharExcludes(const wxString& chars); + void SetExcludes(const wxArrayString& excludes) { m_excludes = excludes; } + inline wxArrayString& GetExcludes() { return m_excludes; } + + bool HasFlag(wxTextValidatorStyle style) const + { return (m_validatorStyle & style) != 0; } + +protected: + + // returns true if all characters of the given string are present in m_includes + bool ContainsOnlyIncludedCharacters(const wxString& val) const; + + // returns true if at least one character of the given string is present in m_excludes + bool ContainsExcludedCharacters(const wxString& val) const; + + // returns the error message if the contents of 'val' are invalid + virtual wxString IsValid(const wxString& val) const; + +protected: + long m_validatorStyle; + wxString* m_stringValue; + wxArrayString m_includes; + wxArrayString m_excludes; + +private: + wxDECLARE_NO_ASSIGN_CLASS(wxTextValidator); + DECLARE_DYNAMIC_CLASS(wxTextValidator) + DECLARE_EVENT_TABLE() +}; + +#endif + // wxUSE_VALIDATORS && (wxUSE_TEXTCTRL || wxUSE_COMBOBOX) + +#endif // _WX_VALTEXT_H_ diff --git a/wxmsw/include/wx-3.0/wx/variant.h b/wxmsw/include/wx-3.0/wx/variant.h new file mode 100644 index 00000000..39adc729 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/variant.h @@ -0,0 +1,582 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/variant.h +// Purpose: wxVariant class, container for any type +// Author: Julian Smart +// Modified by: +// Created: 10/09/98 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VARIANT_H_ +#define _WX_VARIANT_H_ + +#include "wx/defs.h" + +#if wxUSE_VARIANT + +#include "wx/object.h" +#include "wx/string.h" +#include "wx/arrstr.h" +#include "wx/list.h" +#include "wx/cpp.h" +#include "wx/longlong.h" + +#if wxUSE_DATETIME + #include "wx/datetime.h" +#endif // wxUSE_DATETIME + +#include "wx/iosfwrap.h" + +class wxAny; + +/* + * wxVariantData stores the actual data in a wxVariant object, + * to allow it to store any type of data. + * Derive from this to provide custom data handling. + * + * NB: When you construct a wxVariantData, it will have refcount + * of one. Refcount will not be further increased when + * it is passed to wxVariant. This simulates old common + * scenario where wxVariant took ownership of wxVariantData + * passed to it. + * If you create wxVariantData for other reasons than passing + * it to wxVariant, technically you are not required to call + * DecRef() before deleting it. + * + * TODO: in order to replace wxPropertyValue, we would need + * to consider adding constructors that take pointers to C++ variables, + * or removing that functionality from the wxProperty library. + * Essentially wxPropertyValue takes on some of the wxValidator functionality + * by storing pointers and not just actual values, allowing update of C++ data + * to be handled automatically. Perhaps there's another way of doing this without + * overloading wxVariant with unnecessary functionality. + */ + +class WXDLLIMPEXP_BASE wxVariantData : public wxObjectRefData +{ + friend class wxVariant; +public: + wxVariantData() { } + + // Override these to provide common functionality + virtual bool Eq(wxVariantData& data) const = 0; + +#if wxUSE_STD_IOSTREAM + virtual bool Write(wxSTD ostream& WXUNUSED(str)) const { return false; } +#endif + virtual bool Write(wxString& WXUNUSED(str)) const { return false; } +#if wxUSE_STD_IOSTREAM + virtual bool Read(wxSTD istream& WXUNUSED(str)) { return false; } +#endif + virtual bool Read(wxString& WXUNUSED(str)) { return false; } + // What type is it? Return a string name. + virtual wxString GetType() const = 0; + // If it based on wxObject return the ClassInfo. + virtual wxClassInfo* GetValueClassInfo() { return NULL; } + + // Implement this to make wxVariant::UnShare work. Returns + // a copy of the data. + virtual wxVariantData* Clone() const { return NULL; } + +#if wxUSE_ANY + // Converts value to wxAny, if possible. Return true if successful. + virtual bool GetAsAny(wxAny* WXUNUSED(any)) const { return false; } +#endif + +protected: + // Protected dtor should make some incompatible code + // break more louder. That is, they should do data->DecRef() + // instead of delete data. + virtual ~wxVariantData() { } +}; + +/* + * wxVariant can store any kind of data, but has some basic types + * built in. + */ + +class WXDLLIMPEXP_FWD_BASE wxVariant; + +WX_DECLARE_LIST_WITH_DECL(wxVariant, wxVariantList, class WXDLLIMPEXP_BASE); + +class WXDLLIMPEXP_BASE wxVariant: public wxObject +{ +public: + wxVariant(); + + wxVariant(const wxVariant& variant); + wxVariant(wxVariantData* data, const wxString& name = wxEmptyString); +#if wxUSE_ANY + wxVariant(const wxAny& any); +#endif + virtual ~wxVariant(); + + // generic assignment + void operator= (const wxVariant& variant); + + // Assignment using data, e.g. + // myVariant = new wxStringVariantData("hello"); + void operator= (wxVariantData* variantData); + + bool operator== (const wxVariant& variant) const; + bool operator!= (const wxVariant& variant) const; + + // Sets/gets name + inline void SetName(const wxString& name) { m_name = name; } + inline const wxString& GetName() const { return m_name; } + + // Tests whether there is data + bool IsNull() const; + + // For compatibility with wxWidgets <= 2.6, this doesn't increase + // reference count. + wxVariantData* GetData() const + { + return (wxVariantData*) m_refData; + } + void SetData(wxVariantData* data) ; + + // make a 'clone' of the object + void Ref(const wxVariant& clone) { wxObject::Ref(clone); } + + // ensure that the data is exclusive to this variant, and not shared + bool Unshare(); + + // Make NULL (i.e. delete the data) + void MakeNull(); + + // Delete data and name + void Clear(); + + // Returns a string representing the type of the variant, + // e.g. "string", "bool", "stringlist", "list", "double", "long" + wxString GetType() const; + + bool IsType(const wxString& type) const; + bool IsValueKindOf(const wxClassInfo* type) const; + + // write contents to a string (e.g. for debugging) + wxString MakeString() const; + +#if wxUSE_ANY + wxAny GetAny() const; +#endif + + // double + wxVariant(double val, const wxString& name = wxEmptyString); + bool operator== (double value) const; + bool operator!= (double value) const; + void operator= (double value) ; + inline operator double () const { return GetDouble(); } + inline double GetReal() const { return GetDouble(); } + double GetDouble() const; + + // long + wxVariant(long val, const wxString& name = wxEmptyString); + wxVariant(int val, const wxString& name = wxEmptyString); + wxVariant(short val, const wxString& name = wxEmptyString); + bool operator== (long value) const; + bool operator!= (long value) const; + void operator= (long value) ; + inline operator long () const { return GetLong(); } + inline long GetInteger() const { return GetLong(); } + long GetLong() const; + + // bool + wxVariant(bool val, const wxString& name = wxEmptyString); + bool operator== (bool value) const; + bool operator!= (bool value) const; + void operator= (bool value) ; + inline operator bool () const { return GetBool(); } + bool GetBool() const ; + + // wxDateTime +#if wxUSE_DATETIME + wxVariant(const wxDateTime& val, const wxString& name = wxEmptyString); + bool operator== (const wxDateTime& value) const; + bool operator!= (const wxDateTime& value) const; + void operator= (const wxDateTime& value) ; + inline operator wxDateTime () const { return GetDateTime(); } + wxDateTime GetDateTime() const; +#endif + + // wxString + wxVariant(const wxString& val, const wxString& name = wxEmptyString); + // these overloads are necessary to prevent the compiler from using bool + // version instead of wxString one: + wxVariant(const char* val, const wxString& name = wxEmptyString); + wxVariant(const wchar_t* val, const wxString& name = wxEmptyString); + wxVariant(const wxCStrData& val, const wxString& name = wxEmptyString); + wxVariant(const wxScopedCharBuffer& val, const wxString& name = wxEmptyString); + wxVariant(const wxScopedWCharBuffer& val, const wxString& name = wxEmptyString); + + bool operator== (const wxString& value) const; + bool operator!= (const wxString& value) const; + wxVariant& operator=(const wxString& value); + // these overloads are necessary to prevent the compiler from using bool + // version instead of wxString one: + wxVariant& operator=(const char* value) + { return *this = wxString(value); } + wxVariant& operator=(const wchar_t* value) + { return *this = wxString(value); } + wxVariant& operator=(const wxCStrData& value) + { return *this = value.AsString(); } + template<typename T> + wxVariant& operator=(const wxScopedCharTypeBuffer<T>& value) + { return *this = value.data(); } + + inline operator wxString () const { return MakeString(); } + wxString GetString() const; + +#if wxUSE_STD_STRING + wxVariant(const std::string& val, const wxString& name = wxEmptyString); + bool operator==(const std::string& value) const + { return operator==(wxString(value)); } + bool operator!=(const std::string& value) const + { return operator!=(wxString(value)); } + wxVariant& operator=(const std::string& value) + { return operator=(wxString(value)); } + operator std::string() const { return (operator wxString()).ToStdString(); } + + wxVariant(const wxStdWideString& val, const wxString& name = wxEmptyString); + bool operator==(const wxStdWideString& value) const + { return operator==(wxString(value)); } + bool operator!=(const wxStdWideString& value) const + { return operator!=(wxString(value)); } + wxVariant& operator=(const wxStdWideString& value) + { return operator=(wxString(value)); } + operator wxStdWideString() const { return (operator wxString()).ToStdWstring(); } +#endif // wxUSE_STD_STRING + + // wxUniChar + wxVariant(const wxUniChar& val, const wxString& name = wxEmptyString); + wxVariant(const wxUniCharRef& val, const wxString& name = wxEmptyString); + wxVariant(char val, const wxString& name = wxEmptyString); + wxVariant(wchar_t val, const wxString& name = wxEmptyString); + bool operator==(const wxUniChar& value) const; + bool operator==(const wxUniCharRef& value) const { return *this == wxUniChar(value); } + bool operator==(char value) const { return *this == wxUniChar(value); } + bool operator==(wchar_t value) const { return *this == wxUniChar(value); } + bool operator!=(const wxUniChar& value) const { return !(*this == value); } + bool operator!=(const wxUniCharRef& value) const { return !(*this == value); } + bool operator!=(char value) const { return !(*this == value); } + bool operator!=(wchar_t value) const { return !(*this == value); } + wxVariant& operator=(const wxUniChar& value); + wxVariant& operator=(const wxUniCharRef& value) { return *this = wxUniChar(value); } + wxVariant& operator=(char value) { return *this = wxUniChar(value); } + wxVariant& operator=(wchar_t value) { return *this = wxUniChar(value); } + operator wxUniChar() const { return GetChar(); } + operator char() const { return GetChar(); } + operator wchar_t() const { return GetChar(); } + wxUniChar GetChar() const; + + // wxArrayString + wxVariant(const wxArrayString& val, const wxString& name = wxEmptyString); + bool operator== (const wxArrayString& value) const; + bool operator!= (const wxArrayString& value) const; + void operator= (const wxArrayString& value); + operator wxArrayString () const { return GetArrayString(); } + wxArrayString GetArrayString() const; + + // void* + wxVariant(void* ptr, const wxString& name = wxEmptyString); + bool operator== (void* value) const; + bool operator!= (void* value) const; + void operator= (void* value); + operator void* () const { return GetVoidPtr(); } + void* GetVoidPtr() const; + + // wxObject* + wxVariant(wxObject* ptr, const wxString& name = wxEmptyString); + bool operator== (wxObject* value) const; + bool operator!= (wxObject* value) const; + void operator= (wxObject* value); + wxObject* GetWxObjectPtr() const; + +#if wxUSE_LONGLONG + // wxLongLong + wxVariant(wxLongLong, const wxString& name = wxEmptyString); + bool operator==(wxLongLong value) const; + bool operator!=(wxLongLong value) const; + void operator=(wxLongLong value); + operator wxLongLong() const { return GetLongLong(); } + wxLongLong GetLongLong() const; + + // wxULongLong + wxVariant(wxULongLong, const wxString& name = wxEmptyString); + bool operator==(wxULongLong value) const; + bool operator!=(wxULongLong value) const; + void operator=(wxULongLong value); + operator wxULongLong() const { return GetULongLong(); } + wxULongLong GetULongLong() const; +#endif + + // ------------------------------ + // list operations + // ------------------------------ + + wxVariant(const wxVariantList& val, const wxString& name = wxEmptyString); // List of variants + bool operator== (const wxVariantList& value) const; + bool operator!= (const wxVariantList& value) const; + void operator= (const wxVariantList& value) ; + // Treat a list variant as an array + wxVariant operator[] (size_t idx) const; + wxVariant& operator[] (size_t idx) ; + wxVariantList& GetList() const ; + + // Return the number of elements in a list + size_t GetCount() const; + + // Make empty list + void NullList(); + + // Append to list + void Append(const wxVariant& value); + + // Insert at front of list + void Insert(const wxVariant& value); + + // Returns true if the variant is a member of the list + bool Member(const wxVariant& value) const; + + // Deletes the nth element of the list + bool Delete(size_t item); + + // Clear list + void ClearList(); + +public: + // Type conversion + bool Convert(long* value) const; + bool Convert(bool* value) const; + bool Convert(double* value) const; + bool Convert(wxString* value) const; + bool Convert(wxUniChar* value) const; + bool Convert(char* value) const; + bool Convert(wchar_t* value) const; +#if wxUSE_DATETIME + bool Convert(wxDateTime* value) const; +#endif // wxUSE_DATETIME +#if wxUSE_LONGLONG + bool Convert(wxLongLong* value) const; + bool Convert(wxULongLong* value) const; + #ifdef wxLongLong_t + bool Convert(wxLongLong_t* value) const + { + wxLongLong temp; + if ( !Convert(&temp) ) + return false; + *value = temp.GetValue(); + return true; + } + bool Convert(wxULongLong_t* value) const + { + wxULongLong temp; + if ( !Convert(&temp) ) + return false; + *value = temp.GetValue(); + return true; + } + #endif // wxLongLong_t +#endif // wxUSE_LONGLONG + +// Attributes +protected: + virtual wxObjectRefData *CreateRefData() const; + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + + wxString m_name; + +private: + DECLARE_DYNAMIC_CLASS(wxVariant) +}; + + +// +// wxVariant <-> wxAny conversion code +// +#if wxUSE_ANY + +#include "wx/any.h" + +// In order to convert wxAny to wxVariant, we need to be able to associate +// wxAnyValueType with a wxVariantData factory function. +typedef wxVariantData* (*wxVariantDataFactory)(const wxAny& any); + +// Actual Any-to-Variant registration must be postponed to a time when all +// global variables have been initialized. Hence this arrangement. +// wxAnyToVariantRegistration instances are kept in global scope and +// wxAnyValueTypeGlobals in any.cpp will use their data when the time is +// right. +class WXDLLIMPEXP_BASE wxAnyToVariantRegistration +{ +public: + wxAnyToVariantRegistration(wxVariantDataFactory factory); + virtual ~wxAnyToVariantRegistration(); + + virtual wxAnyValueType* GetAssociatedType() = 0; + wxVariantDataFactory GetFactory() const { return m_factory; } +private: + wxVariantDataFactory m_factory; +}; + +template<typename T> +class wxAnyToVariantRegistrationImpl : public wxAnyToVariantRegistration +{ +public: + wxAnyToVariantRegistrationImpl(wxVariantDataFactory factory) + : wxAnyToVariantRegistration(factory) + { + } + + virtual wxAnyValueType* GetAssociatedType() + { + return wxAnyValueTypeImpl<T>::GetInstance(); + } +private: +}; + +#define DECLARE_WXANY_CONVERSION() \ +virtual bool GetAsAny(wxAny* any) const; \ +static wxVariantData* VariantDataFactory(const wxAny& any); + +#define _REGISTER_WXANY_CONVERSION(T, CLASSNAME, FUNC) \ +static wxAnyToVariantRegistrationImpl<T> \ + gs_##CLASSNAME##AnyToVariantRegistration = \ + wxAnyToVariantRegistrationImpl<T>(&FUNC); + +#define REGISTER_WXANY_CONVERSION(T, CLASSNAME) \ +_REGISTER_WXANY_CONVERSION(T, CLASSNAME, CLASSNAME::VariantDataFactory) + +#define IMPLEMENT_TRIVIAL_WXANY_CONVERSION(T, CLASSNAME) \ +bool CLASSNAME::GetAsAny(wxAny* any) const \ +{ \ + *any = m_value; \ + return true; \ +} \ +wxVariantData* CLASSNAME::VariantDataFactory(const wxAny& any) \ +{ \ + return new CLASSNAME(wxANY_AS(any, T)); \ +} \ +REGISTER_WXANY_CONVERSION(T, CLASSNAME) + +#else // if !wxUSE_ANY + +#define DECLARE_WXANY_CONVERSION() +#define REGISTER_WXANY_CONVERSION(T, CLASSNAME) +#define IMPLEMENT_TRIVIAL_WXANY_CONVERSION(T, CLASSNAME) + +#endif // wxUSE_ANY/!wxUSE_ANY + + +#define DECLARE_VARIANT_OBJECT(classname) \ + DECLARE_VARIANT_OBJECT_EXPORTED(classname, wxEMPTY_PARAMETER_VALUE) + +#define DECLARE_VARIANT_OBJECT_EXPORTED(classname,expdecl) \ +expdecl classname& operator << ( classname &object, const wxVariant &variant ); \ +expdecl wxVariant& operator << ( wxVariant &variant, const classname &object ); + +#define IMPLEMENT_VARIANT_OBJECT(classname) \ + IMPLEMENT_VARIANT_OBJECT_EXPORTED(classname, wxEMPTY_PARAMETER_VALUE) + +#define IMPLEMENT_VARIANT_OBJECT_EXPORTED_NO_EQ(classname,expdecl) \ +class classname##VariantData: public wxVariantData \ +{ \ +public:\ + classname##VariantData() {} \ + classname##VariantData( const classname &value ) { m_value = value; } \ +\ + classname &GetValue() { return m_value; } \ +\ + virtual bool Eq(wxVariantData& data) const; \ +\ + virtual wxString GetType() const; \ + virtual wxClassInfo* GetValueClassInfo(); \ +\ + virtual wxVariantData* Clone() const { return new classname##VariantData(m_value); } \ +\ + DECLARE_WXANY_CONVERSION() \ +protected:\ + classname m_value; \ +};\ +\ +wxString classname##VariantData::GetType() const\ +{\ + return m_value.GetClassInfo()->GetClassName();\ +}\ +\ +wxClassInfo* classname##VariantData::GetValueClassInfo()\ +{\ + return m_value.GetClassInfo();\ +}\ +\ +expdecl classname& operator << ( classname &value, const wxVariant &variant )\ +{\ + wxASSERT( variant.GetType() == #classname );\ + \ + classname##VariantData *data = (classname##VariantData*) variant.GetData();\ + value = data->GetValue();\ + return value;\ +}\ +\ +expdecl wxVariant& operator << ( wxVariant &variant, const classname &value )\ +{\ + classname##VariantData *data = new classname##VariantData( value );\ + variant.SetData( data );\ + return variant;\ +} \ +IMPLEMENT_TRIVIAL_WXANY_CONVERSION(classname, classname##VariantData) + +// implements a wxVariantData-derived class using for the Eq() method the +// operator== which must have been provided by "classname" +#define IMPLEMENT_VARIANT_OBJECT_EXPORTED(classname,expdecl) \ +IMPLEMENT_VARIANT_OBJECT_EXPORTED_NO_EQ(classname,wxEMPTY_PARAMETER_VALUE expdecl) \ +\ +bool classname##VariantData::Eq(wxVariantData& data) const \ +{\ + wxASSERT( GetType() == data.GetType() );\ +\ + classname##VariantData & otherData = (classname##VariantData &) data;\ +\ + return otherData.m_value == m_value;\ +}\ + + +// implements a wxVariantData-derived class using for the Eq() method a shallow +// comparison (through wxObject::IsSameAs function) +#define IMPLEMENT_VARIANT_OBJECT_SHALLOWCMP(classname) \ + IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(classname, wxEMPTY_PARAMETER_VALUE) +#define IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(classname,expdecl) \ +IMPLEMENT_VARIANT_OBJECT_EXPORTED_NO_EQ(classname,wxEMPTY_PARAMETER_VALUE expdecl) \ +\ +bool classname##VariantData::Eq(wxVariantData& data) const \ +{\ + wxASSERT( GetType() == data.GetType() );\ +\ + classname##VariantData & otherData = (classname##VariantData &) data;\ +\ + return (otherData.m_value.IsSameAs(m_value));\ +}\ + + +// Since we want type safety wxVariant we need to fetch and dynamic_cast +// in a seemingly safe way so the compiler can check, so we define +// a dynamic_cast /wxDynamicCast analogue. + +#define wxGetVariantCast(var,classname) \ + ((classname*)(var.IsValueKindOf(&classname::ms_classInfo) ?\ + var.GetWxObjectPtr() : NULL)); + +// Replacement for using wxDynamicCast on a wxVariantData object +#ifndef wxNO_RTTI + #define wxDynamicCastVariantData(data, classname) dynamic_cast<classname*>(data) +#endif + +#define wxStaticCastVariantData(data, classname) static_cast<classname*>(data) + +extern wxVariant WXDLLIMPEXP_BASE wxNullVariant; + +#endif // wxUSE_VARIANT + +#endif // _WX_VARIANT_H_ diff --git a/wxmsw/include/wx-3.0/wx/vector.h b/wxmsw/include/wx-3.0/wx/vector.h new file mode 100644 index 00000000..dffb19fc --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/vector.h @@ -0,0 +1,584 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/vector.h +// Purpose: STL vector clone +// Author: Lindsay Mathieson +// Modified by: Vaclav Slavik - make it a template +// Created: 30.07.2001 +// Copyright: (c) 2001 Lindsay Mathieson <lindsay@mathieson.org>, +// 2007 Vaclav Slavik <vslavik@fastmail.fm> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VECTOR_H_ +#define _WX_VECTOR_H_ + +#include "wx/defs.h" + +#if wxUSE_STD_CONTAINERS + +#include <vector> +#include <algorithm> + +#define wxVector std::vector +template<typename T> +inline void wxVectorSort(wxVector<T>& v) +{ + std::sort(v.begin(), v.end()); +} + +#else // !wxUSE_STD_CONTAINERS + +#include "wx/scopeguard.h" +#include "wx/meta/movable.h" +#include "wx/meta/if.h" + +#include "wx/beforestd.h" +#include <new> // for placement new +#include "wx/afterstd.h" + +// wxQsort is declared in wx/utils.h, but can't include that file here, +// it indirectly includes this file. Just lovely... +typedef int (*wxSortCallback)(const void* pItem1, + const void* pItem2, + const void* user_data); +WXDLLIMPEXP_BASE void wxQsort(void* pbase, size_t total_elems, + size_t size, wxSortCallback cmp, + const void* user_data); + +namespace wxPrivate +{ + +// These templates encapsulate memory operations for use by wxVector; there are +// two implementations, both in generic way for any C++ types and as an +// optimized version for "movable" types that uses realloc() and memmove(). + +// version for movable types: +template<typename T> +struct wxVectorMemOpsMovable +{ + static void Free(T* array) + { free(array); } + + static T* Realloc(T* old, size_t newCapacity, size_t WXUNUSED(occupiedSize)) + { return (T*)realloc(old, newCapacity * sizeof(T)); } + + static void MemmoveBackward(T* dest, T* source, size_t count) + { memmove(dest, source, count * sizeof(T)); } + + static void MemmoveForward(T* dest, T* source, size_t count) + { memmove(dest, source, count * sizeof(T)); } +}; + +// generic version for non-movable types: +template<typename T> +struct wxVectorMemOpsGeneric +{ + static void Free(T* array) + { ::operator delete(array); } + + static T* Realloc(T* old, size_t newCapacity, size_t occupiedSize) + { + T *mem = (T*)::operator new(newCapacity * sizeof(T)); + for ( size_t i = 0; i < occupiedSize; i++ ) + { + ::new(mem + i) T(old[i]); + old[i].~T(); + } + ::operator delete(old); + return mem; + } + + static void MemmoveBackward(T* dest, T* source, size_t count) + { + wxASSERT( dest < source ); + T* destptr = dest; + T* sourceptr = source; + for ( size_t i = count; i > 0; --i, ++destptr, ++sourceptr ) + { + ::new(destptr) T(*sourceptr); + sourceptr->~T(); + } + } + + static void MemmoveForward(T* dest, T* source, size_t count) + { + wxASSERT( dest > source ); + T* destptr = dest + count - 1; + T* sourceptr = source + count - 1; + for ( size_t i = count; i > 0; --i, --destptr, --sourceptr ) + { + ::new(destptr) T(*sourceptr); + sourceptr->~T(); + } + } +}; + + +} // namespace wxPrivate + +template<typename T> +class wxVector +{ +private: + // This cryptic expression means "typedef Ops to wxVectorMemOpsMovable if + // type T is movable type, otherwise to wxVectorMemOpsGeneric". + // + // Note that we use typedef instead of privately deriving from this (which + // would allowed us to omit "Ops::" prefixes below) to keep VC6 happy, + // it can't compile code that derives from wxIf<...>::value. + // + // Note that bcc needs the extra parentheses for non-type template + // arguments to compile this expression. + typedef typename wxIf< (wxIsMovable<T>::value), + wxPrivate::wxVectorMemOpsMovable<T>, + wxPrivate::wxVectorMemOpsGeneric<T> >::value + Ops; + +public: + typedef size_t size_type; + typedef size_t difference_type; + typedef T value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type* iterator; + typedef const value_type* const_iterator; + typedef value_type& reference; + typedef const value_type& const_reference; + + class reverse_iterator + { + public: + reverse_iterator() : m_ptr(NULL) { } + wxEXPLICIT reverse_iterator(iterator it) : m_ptr(it) { } + reverse_iterator(const reverse_iterator& it) : m_ptr(it.m_ptr) { } + + reference operator*() const { return *m_ptr; } + pointer operator->() const { return m_ptr; } + + iterator base() const { return m_ptr; } + + reverse_iterator& operator++() + { --m_ptr; return *this; } + reverse_iterator operator++(int) + { reverse_iterator tmp = *this; --m_ptr; return tmp; } + reverse_iterator& operator--() + { ++m_ptr; return *this; } + reverse_iterator operator--(int) + { reverse_iterator tmp = *this; ++m_ptr; return tmp; } + + reverse_iterator operator+(difference_type n) const + { return reverse_iterator(m_ptr - n); } + reverse_iterator& operator+=(difference_type n) + { m_ptr -= n; return *this; } + reverse_iterator operator-(difference_type n) const + { return reverse_iterator(m_ptr + n); } + reverse_iterator& operator-=(difference_type n) + { m_ptr += n; return *this; } + + reference operator[](difference_type n) const + { return *(*this + n); } + + bool operator ==(const reverse_iterator& it) const + { return m_ptr == it.m_ptr; } + bool operator !=(const reverse_iterator& it) const + { return m_ptr != it.m_ptr; } + + private: + value_type *m_ptr; + + friend class const_reverse_iterator; + }; + + class const_reverse_iterator + { + public: + const_reverse_iterator() : m_ptr(NULL) { } + wxEXPLICIT const_reverse_iterator(const_iterator it) : m_ptr(it) { } + const_reverse_iterator(const reverse_iterator& it) : m_ptr(it.m_ptr) { } + const_reverse_iterator(const const_reverse_iterator& it) : m_ptr(it.m_ptr) { } + + const_reference operator*() const { return *m_ptr; } + const_pointer operator->() const { return m_ptr; } + + const_iterator base() const { return m_ptr; } + + const_reverse_iterator& operator++() + { --m_ptr; return *this; } + const_reverse_iterator operator++(int) + { const_reverse_iterator tmp = *this; --m_ptr; return tmp; } + const_reverse_iterator& operator--() + { ++m_ptr; return *this; } + const_reverse_iterator operator--(int) + { const_reverse_iterator tmp = *this; ++m_ptr; return tmp; } + + const_reverse_iterator operator+(difference_type n) const + { return const_reverse_iterator(m_ptr - n); } + const_reverse_iterator& operator+=(difference_type n) + { m_ptr -= n; return *this; } + const_reverse_iterator operator-(difference_type n) const + { return const_reverse_iterator(m_ptr + n); } + const_reverse_iterator& operator-=(difference_type n) + { m_ptr += n; return *this; } + + const_reference operator[](difference_type n) const + { return *(*this + n); } + + bool operator ==(const const_reverse_iterator& it) const + { return m_ptr == it.m_ptr; } + bool operator !=(const const_reverse_iterator& it) const + { return m_ptr != it.m_ptr; } + + protected: + const value_type *m_ptr; + }; + + wxVector() : m_size(0), m_capacity(0), m_values(NULL) {} + + wxVector(size_type p_size) + : m_size(0), m_capacity(0), m_values(NULL) + { + reserve(p_size); + for ( size_t n = 0; n < p_size; n++ ) + push_back(value_type()); + } + + wxVector(size_type p_size, const value_type& v) + : m_size(0), m_capacity(0), m_values(NULL) + { + reserve(p_size); + for ( size_t n = 0; n < p_size; n++ ) + push_back(v); + } + + wxVector(const wxVector& c) : m_size(0), m_capacity(0), m_values(NULL) + { + Copy(c); + } + + template <class InputIterator> + wxVector(InputIterator first, InputIterator last) + : m_size(0), m_capacity(0), m_values(NULL) + { + assign(first, last); + } + + ~wxVector() + { + clear(); + } + + void assign(size_type p_size, const value_type& v) + { + clear(); + reserve(p_size); + for ( size_t n = 0; n < p_size; n++ ) + push_back(v); + } + + template <class InputIterator> + void assign(InputIterator first, InputIterator last) + { + clear(); + + // Notice that it would be nice to call reserve() here but we can't do + // it for arbitrary input iterators, we should have a dispatch on + // iterator type and call it if possible. + + for ( InputIterator it = first; it != last; ++it ) + push_back(*it); + } + + void swap(wxVector& v) + { + wxSwap(m_size, v.m_size); + wxSwap(m_capacity, v.m_capacity); + wxSwap(m_values, v.m_values); + } + + void clear() + { + // call destructors of stored objects: + for ( size_type i = 0; i < m_size; i++ ) + { + m_values[i].~T(); + } + + Ops::Free(m_values); + m_values = NULL; + m_size = + m_capacity = 0; + } + + void reserve(size_type n) + { + if ( n <= m_capacity ) + return; + + // increase the size twice, unless we're already too big or unless + // more is requested + // + // NB: casts to size_type are needed to suppress warnings about + // mixing enumeral and non-enumeral type in conditional expression + const size_type increment = m_size > 0 + ? m_size < ALLOC_MAX_SIZE + ? m_size + : (size_type)ALLOC_MAX_SIZE + : (size_type)ALLOC_INITIAL_SIZE; + if ( m_capacity + increment > n ) + n = m_capacity + increment; + + m_values = Ops::Realloc(m_values, n * sizeof(value_type), m_size); + m_capacity = n; + } + + void resize(size_type n) + { + if ( n < m_size ) + Shrink(n); + else if ( n > m_size ) + Extend(n, value_type()); + } + + void resize(size_type n, const value_type& v) + { + if ( n < m_size ) + Shrink(n); + else if ( n > m_size ) + Extend(n, v); + } + + size_type size() const + { + return m_size; + } + + size_type capacity() const + { + return m_capacity; + } + + bool empty() const + { + return size() == 0; + } + + wxVector& operator=(const wxVector& vb) + { + if (this != &vb) + { + clear(); + Copy(vb); + } + return *this; + } + + void push_back(const value_type& v) + { + reserve(size() + 1); + + // use placement new to initialize new object in preallocated place in + // m_values and store 'v' in it: + void* const place = m_values + m_size; + ::new(place) value_type(v); + + // only increase m_size if the ctor didn't throw an exception; notice + // that if it _did_ throw, everything is OK, because we only increased + // vector's capacity so far and possibly written some data to + // uninitialized memory at the end of m_values + m_size++; + } + + void pop_back() + { + erase(end() - 1); + } + + const value_type& at(size_type idx) const + { + wxASSERT(idx < m_size); + return m_values[idx]; + } + + value_type& at(size_type idx) + { + wxASSERT(idx < m_size); + return m_values[idx]; + } + + const value_type& operator[](size_type idx) const { return at(idx); } + value_type& operator[](size_type idx) { return at(idx); } + const value_type& front() const { return at(0); } + value_type& front() { return at(0); } + const value_type& back() const { return at(size() - 1); } + value_type& back() { return at(size() - 1); } + + const_iterator begin() const { return m_values; } + iterator begin() { return m_values; } + const_iterator end() const { return m_values + size(); } + iterator end() { return m_values + size(); } + + reverse_iterator rbegin() { return reverse_iterator(end() - 1); } + reverse_iterator rend() { return reverse_iterator(begin() - 1); } + + const_reverse_iterator rbegin() const { return const_reverse_iterator(end() - 1); } + const_reverse_iterator rend() const { return const_reverse_iterator(begin() - 1); } + + iterator insert(iterator it, const value_type& v = value_type()) + { + // NB: this must be done before reserve(), because reserve() + // invalidates iterators! + const size_t idx = it - begin(); + const size_t after = end() - it; + + reserve(size() + 1); + + // the place where the new element is going to be inserted + value_type * const place = m_values + idx; + + // unless we're inserting at the end, move following elements out of + // the way: + if ( after > 0 ) + Ops::MemmoveForward(place + 1, place, after); + + // if the ctor called below throws an exception, we need to move all + // the elements back to their original positions in m_values + wxScopeGuard moveBack = wxMakeGuard( + Ops::MemmoveBackward, place, place + 1, after); + if ( !after ) + moveBack.Dismiss(); + + // use placement new to initialize new object in preallocated place in + // m_values and store 'v' in it: + ::new(place) value_type(v); + + // now that we did successfully add the new element, increment the size + // and disable moving the items back + moveBack.Dismiss(); + m_size++; + + return begin() + idx; + } + + iterator erase(iterator it) + { + return erase(it, it + 1); + } + + iterator erase(iterator first, iterator last) + { + if ( first == last ) + return first; + wxASSERT( first < end() && last <= end() ); + + const size_type idx = first - begin(); + const size_type count = last - first; + const size_type after = end() - last; + + // erase elements by calling their destructors: + for ( iterator i = first; i < last; ++i ) + i->~T(); + + // once that's done, move following elements over to the freed space: + if ( after > 0 ) + { + Ops::MemmoveBackward(m_values + idx, m_values + idx + count, after); + } + + m_size -= count; + + return begin() + idx; + } + +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED( size_type erase(size_type n) ); +#endif // WXWIN_COMPATIBILITY_2_8 + +private: + // VC6 can't compile static const int members + enum { ALLOC_INITIAL_SIZE = 16 }; + enum { ALLOC_MAX_SIZE = 4096 }; + + void Copy(const wxVector& vb) + { + reserve(vb.size()); + + for ( const_iterator i = vb.begin(); i != vb.end(); ++i ) + push_back(*i); + } + +private: + void Shrink(size_type n) + { + for ( size_type i = n; i < m_size; i++ ) + m_values[i].~T(); + m_size = n; + } + + void Extend(size_type n, const value_type& v) + { + reserve(n); + for ( size_type i = m_size; i < n; i++ ) + push_back(v); + } + + size_type m_size, + m_capacity; + value_type *m_values; +}; + +#if WXWIN_COMPATIBILITY_2_8 +template<typename T> +inline typename wxVector<T>::size_type wxVector<T>::erase(size_type n) +{ + erase(begin() + n); + return n; +} +#endif // WXWIN_COMPATIBILITY_2_8 + + + +namespace wxPrivate +{ + +// This is a helper for the wxVectorSort function, and should not be used +// directly in user's code. +template<typename T> +struct wxVectorComparator +{ + static int + Compare(const void* pitem1, const void* pitem2, const void* ) + { + const T& item1 = *reinterpret_cast<const T*>(pitem1); + const T& item2 = *reinterpret_cast<const T*>(pitem2); + + if (item1 < item2) + return -1; + else if (item2 < item1) + return 1; + else + return 0; + } +}; + +} // namespace wxPrivate + + + +template<typename T> +void wxVectorSort(wxVector<T>& v) +{ + wxQsort(v.begin(), v.size(), sizeof(T), + wxPrivate::wxVectorComparator<T>::Compare, NULL); +} + + + +#endif // wxUSE_STD_CONTAINERS/!wxUSE_STD_CONTAINERS + +#if WXWIN_COMPATIBILITY_2_8 + #define WX_DECLARE_VECTORBASE(obj, cls) typedef wxVector<obj> cls + #define _WX_DECLARE_VECTOR(obj, cls, exp) WX_DECLARE_VECTORBASE(obj, cls) + #define WX_DECLARE_VECTOR(obj, cls) WX_DECLARE_VECTORBASE(obj, cls) +#endif // WXWIN_COMPATIBILITY_2_8 + +#endif // _WX_VECTOR_H_ diff --git a/wxmsw/include/wx-3.0/wx/version.h b/wxmsw/include/wx-3.0/wx/version.h new file mode 100644 index 00000000..da3b44c7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/version.h @@ -0,0 +1,90 @@ +/* + * Name: wx/version.h + * Purpose: wxWidgets version numbers + * Author: Julian Smart + * Modified by: Ryan Norton (Converted to C) + * Created: 29/01/98 + * Copyright: (c) 1998 Julian Smart + * Licence: wxWindows licence + */ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_VERSION_H_ +#define _WX_VERSION_H_ + +#include "wx/cpp.h" /* for wxSTRINGIZE */ + +/* the constants below must be changed with each new version */ +/* ---------------------------------------------------------------------------- */ + +/* + Don't forget to update WX_CURRENT, WX_REVISION and WX_AGE in + build/bakefiles/version.bkl and regenerate the makefiles when you change + this! + */ + +/* NB: this file is parsed by automatic tools so don't change its format! */ +#define wxMAJOR_VERSION 3 +#define wxMINOR_VERSION 0 +#define wxRELEASE_NUMBER 0 +#define wxSUBRELEASE_NUMBER 0 +#define wxVERSION_STRING wxT("wxWidgets 3.0.0") + +/* nothing to update below this line when updating the version */ +/* ---------------------------------------------------------------------------- */ + +/* Users can pre-define wxABI_VERSION to a lower value in their + * makefile/project settings to compile code that will be binary compatible + * with earlier versions of the ABI within the same minor version (between + * minor versions binary compatibility breaks anyway). The default is the + * version of wxWidgets being used. A single number with two decimal digits + * for each component, e.g. 20601 for 2.6.1 */ +#ifndef wxABI_VERSION +#define wxABI_VERSION ( wxMAJOR_VERSION * 10000 + wxMINOR_VERSION * 100 + 99 ) +#endif + +/* helpers for wxVERSION_NUM_XXX */ +#define wxMAKE_VERSION_STRING(x, y, z) \ + wxSTRINGIZE(x) wxSTRINGIZE(y) wxSTRINGIZE(z) +#define wxMAKE_VERSION_DOT_STRING(x, y, z) \ + wxSTRINGIZE(x) "." wxSTRINGIZE(y) "." wxSTRINGIZE(z) + +#define wxMAKE_VERSION_STRING_T(x, y, z) \ + wxSTRINGIZE_T(x) wxSTRINGIZE_T(y) wxSTRINGIZE_T(z) +#define wxMAKE_VERSION_DOT_STRING_T(x, y, z) \ + wxSTRINGIZE_T(x) wxT(".") wxSTRINGIZE_T(y) wxT(".") wxSTRINGIZE_T(z) + +/* these are used by src/msw/version.rc and should always be ASCII, not Unicode */ +#define wxVERSION_NUM_STRING \ + wxMAKE_VERSION_STRING(wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER) +#define wxVERSION_NUM_DOT_STRING \ + wxMAKE_VERSION_DOT_STRING(wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER) + +/* those are Unicode-friendly */ +#define wxVERSION_NUM_STRING_T \ + wxMAKE_VERSION_STRING_T(wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER) +#define wxVERSION_NUM_DOT_STRING_T \ + wxMAKE_VERSION_DOT_STRING_T(wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER) + +/* some more defines, not really sure if they're [still] useful */ +#define wxVERSION_NUMBER ( (wxMAJOR_VERSION * 1000) + (wxMINOR_VERSION * 100) + wxRELEASE_NUMBER ) +#define wxBETA_NUMBER 0 +#define wxVERSION_FLOAT ( wxMAJOR_VERSION + (wxMINOR_VERSION/10.0) + (wxRELEASE_NUMBER/100.0) + (wxBETA_NUMBER/10000.0) ) + +/* check if the current version is at least major.minor.release */ +#define wxCHECK_VERSION(major,minor,release) \ + (wxMAJOR_VERSION > (major) || \ + (wxMAJOR_VERSION == (major) && wxMINOR_VERSION > (minor)) || \ + (wxMAJOR_VERSION == (major) && wxMINOR_VERSION == (minor) && wxRELEASE_NUMBER >= (release))) + +/* the same but check the subrelease also */ +#define wxCHECK_VERSION_FULL(major,minor,release,subrel) \ + (wxCHECK_VERSION(major, minor, release) && \ + ((major) != wxMAJOR_VERSION || \ + (minor) != wxMINOR_VERSION || \ + (release) != wxRELEASE_NUMBER || \ + (subrel) <= wxSUBRELEASE_NUMBER)) + +#endif /* _WX_VERSION_H_ */ + diff --git a/wxmsw/include/wx-3.0/wx/versioninfo.h b/wxmsw/include/wx-3.0/wx/versioninfo.h new file mode 100644 index 00000000..79469111 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/versioninfo.h @@ -0,0 +1,77 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/versioninfo.h +// Purpose: declaration of wxVersionInfo class +// Author: Troels K +// Created: 2010-11-22 +// Copyright: (c) 2010 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VERSIONINFO_H_ +#define _WX_VERSIONINFO_H_ + +#include "wx/string.h" + +// ---------------------------------------------------------------------------- +// wxVersionInfo: represents version information +// ---------------------------------------------------------------------------- + +class wxVersionInfo +{ +public: + wxVersionInfo(const wxString& name = wxString(), + int major = 0, + int minor = 0, + int micro = 0, + const wxString& description = wxString(), + const wxString& copyright = wxString()) + { + m_name = name; + m_major = major; + m_minor = minor; + m_micro = micro; + m_description = description; + m_copyright = copyright; + } + + // Default copy ctor, assignment operator and dtor are ok. + + + const wxString& GetName() const { return m_name; } + + int GetMajor() const { return m_major; } + int GetMinor() const { return m_minor; } + int GetMicro() const { return m_micro; } + + wxString ToString() const + { + return HasDescription() ? GetDescription() : GetVersionString(); + } + + wxString GetVersionString() const + { + wxString str; + str << m_name << ' ' << GetMajor() << '.' << GetMinor(); + if ( GetMicro() ) + str << '.' << GetMicro(); + + return str; + } + + bool HasDescription() const { return !m_description.empty(); } + const wxString& GetDescription() const { return m_description; } + + bool HasCopyright() const { return !m_copyright.empty(); } + const wxString& GetCopyright() const { return m_copyright; } + +private: + wxString m_name, + m_description, + m_copyright; + + int m_major, + m_minor, + m_micro; +}; + +#endif // _WX_VERSIONINFO_H_ diff --git a/wxmsw/include/wx-3.0/wx/vidmode.h b/wxmsw/include/wx-3.0/wx/vidmode.h new file mode 100644 index 00000000..550bb3b4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/vidmode.h @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/vidmode.h +// Purpose: declares wxVideoMode class used by both wxDisplay and wxApp +// Author: Vadim Zeitlin +// Modified by: +// Created: 27.09.2003 (extracted from wx/display.h) +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VMODE_H_ +#define _WX_VMODE_H_ + +// ---------------------------------------------------------------------------- +// wxVideoMode: a simple struct containing video mode parameters for a display +// ---------------------------------------------------------------------------- + +struct WXDLLIMPEXP_CORE wxVideoMode +{ + wxVideoMode(int width = 0, int height = 0, int depth = 0, int freq = 0) + { + w = width; + h = height; + + bpp = depth; + + refresh = freq; + } + + // default copy ctor and assignment operator are ok + + bool operator==(const wxVideoMode& m) const + { + return w == m.w && h == m.h && bpp == m.bpp && refresh == m.refresh; + } + bool operator!=(const wxVideoMode& mode) const + { + return !operator==(mode); + } + + // returns true if this mode matches the other one in the sense that all + // non zero fields of the other mode have the same value in this one + // (except for refresh which is allowed to have a greater value) + bool Matches(const wxVideoMode& other) const + { + return (!other.w || w == other.w) && + (!other.h || h == other.h) && + (!other.bpp || bpp == other.bpp) && + (!other.refresh || refresh >= other.refresh); + } + + // trivial accessors + int GetWidth() const { return w; } + int GetHeight() const { return h; } + int GetDepth() const { return bpp; } + int GetRefresh() const { return refresh; } + + // returns true if the object has been initialized + bool IsOk() const { return w && h; } + + + // the screen size in pixels (e.g. 640*480), 0 means unspecified + int w, h; + + // bits per pixel (e.g. 32), 1 is monochrome and 0 means unspecified/known + int bpp; + + // refresh frequency in Hz, 0 means unspecified/unknown + int refresh; +}; + +#endif // _WX_VMODE_H_ + diff --git a/wxmsw/include/wx-3.0/wx/vlbox.h b/wxmsw/include/wx-3.0/wx/vlbox.h new file mode 100644 index 00000000..19811105 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/vlbox.h @@ -0,0 +1,311 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/vlbox.h +// Purpose: wxVListBox is a virtual listbox with lines of variable height +// Author: Vadim Zeitlin +// Modified by: +// Created: 31.05.03 +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VLBOX_H_ +#define _WX_VLBOX_H_ + +#include "wx/vscroll.h" // base class +#include "wx/bitmap.h" + +class WXDLLIMPEXP_FWD_CORE wxSelectionStore; +extern WXDLLIMPEXP_DATA_CORE(const char) wxVListBoxNameStr[]; + +// ---------------------------------------------------------------------------- +// wxVListBox +// ---------------------------------------------------------------------------- + +/* + This class has two main differences from a regular listbox: it can have an + arbitrarily huge number of items because it doesn't store them itself but + uses OnDrawItem() callback to draw them and its items can have variable + height as determined by OnMeasureItem(). + + It emits the same events as wxListBox and the same event macros may be used + with it. + */ +class WXDLLIMPEXP_CORE wxVListBox : public wxVScrolledWindow +{ +public: + // constructors and such + // --------------------- + + // default constructor, you must call Create() later + wxVListBox() { Init(); } + + // normal constructor which calls Create() internally + wxVListBox(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxVListBoxNameStr) + { + Init(); + + (void)Create(parent, id, pos, size, style, name); + } + + // really creates the control and sets the initial number of items in it + // (which may be changed later with SetItemCount()) + // + // the only special style which may be specified here is wxLB_MULTIPLE + // + // returns true on success or false if the control couldn't be created + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxVListBoxNameStr); + + // dtor does some internal cleanup (deletes m_selStore if any) + virtual ~wxVListBox(); + + + // accessors + // --------- + + // get the number of items in the control + size_t GetItemCount() const { return GetRowCount(); } + + // does this control use multiple selection? + bool HasMultipleSelection() const { return m_selStore != NULL; } + + // get the currently selected item or wxNOT_FOUND if there is no selection + // + // this method is only valid for the single selection listboxes + int GetSelection() const + { + wxASSERT_MSG( !HasMultipleSelection(), + wxT("GetSelection() can't be used with wxLB_MULTIPLE") ); + + return m_current; + } + + // is this item the current one? + bool IsCurrent(size_t item) const { return item == (size_t)m_current; } + #ifdef __WXUNIVERSAL__ + bool IsCurrent() const { return wxVScrolledWindow::IsCurrent(); } + #endif + + // is this item selected? + bool IsSelected(size_t item) const; + + // get the number of the selected items (maybe 0) + // + // this method is valid for both single and multi selection listboxes + size_t GetSelectedCount() const; + + // get the first selected item, returns wxNOT_FOUND if none + // + // cookie is an opaque parameter which should be passed to + // GetNextSelected() later + // + // this method is only valid for the multi selection listboxes + int GetFirstSelected(unsigned long& cookie) const; + + // get next selection item, return wxNOT_FOUND if no more + // + // cookie must be the same parameter that was passed to GetFirstSelected() + // before + // + // this method is only valid for the multi selection listboxes + int GetNextSelected(unsigned long& cookie) const; + + // get the margins around each item + wxPoint GetMargins() const { return m_ptMargins; } + + // get the background colour of selected cells + const wxColour& GetSelectionBackground() const { return m_colBgSel; } + + // get the item rect, returns empty rect if the item is not visible + wxRect GetItemRect(size_t n) const; + + // operations + // ---------- + + // set the number of items to be shown in the control + // + // this is just a synonym for wxVScrolledWindow::SetRowCount() + virtual void SetItemCount(size_t count); + + // delete all items from the control + void Clear() { SetItemCount(0); } + + // set the selection to the specified item, if it is wxNOT_FOUND the + // selection is unset + // + // this function is only valid for the single selection listboxes + void SetSelection(int selection); + + // selects or deselects the specified item which must be valid (i.e. not + // equal to wxNOT_FOUND) + // + // return true if the items selection status has changed or false + // otherwise + // + // this function is only valid for the multiple selection listboxes + bool Select(size_t item, bool select = true); + + // selects the items in the specified range whose end points may be given + // in any order + // + // return true if any items selection status has changed, false otherwise + // + // this function is only valid for the single selection listboxes + bool SelectRange(size_t from, size_t to); + + // toggle the selection of the specified item (must be valid) + // + // this function is only valid for the multiple selection listboxes + void Toggle(size_t item) { Select(item, !IsSelected(item)); } + + // select all items in the listbox + // + // the return code indicates if any items were affected by this operation + // (true) or if nothing has changed (false) + bool SelectAll() { return DoSelectAll(true); } + + // unselect all items in the listbox + // + // the return code has the same meaning as for SelectAll() + bool DeselectAll() { return DoSelectAll(false); } + + // set the margins: horizontal margin is the distance between the window + // border and the item contents while vertical margin is half of the + // distance between items + // + // by default both margins are 0 + void SetMargins(const wxPoint& pt); + void SetMargins(wxCoord x, wxCoord y) { SetMargins(wxPoint(x, y)); } + + // change the background colour of the selected cells + void SetSelectionBackground(const wxColour& col); + + // refreshes only the selected items + void RefreshSelected(); + + + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + +protected: + virtual wxBorder GetDefaultBorder() const { return wxBORDER_THEME; } + + // the derived class must implement this function to actually draw the item + // with the given index on the provided DC + virtual void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const = 0; + + // the derived class must implement this method to return the height of the + // specified item + virtual wxCoord OnMeasureItem(size_t n) const = 0; + + // this method may be used to draw separators between the lines; note that + // the rectangle may be modified, typically to deflate it a bit before + // passing to OnDrawItem() + // + // the base class version doesn't do anything + virtual void OnDrawSeparator(wxDC& dc, wxRect& rect, size_t n) const; + + // this method is used to draw the items background and, maybe, a border + // around it + // + // the base class version implements a reasonable default behaviour which + // consists in drawing the selected item with the standard background + // colour and drawing a border around the item if it is either selected or + // current + virtual void OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const; + + // we implement OnGetRowHeight() in terms of OnMeasureItem() because this + // allows us to add borders to the items easily + // + // this function is not supposed to be overridden by the derived classes + virtual wxCoord OnGetRowHeight(size_t line) const; + + + // event handlers + void OnPaint(wxPaintEvent& event); + void OnKeyDown(wxKeyEvent& event); + void OnLeftDown(wxMouseEvent& event); + void OnLeftDClick(wxMouseEvent& event); + void OnSetOrKillFocus(wxFocusEvent& event); + void OnSize(wxSizeEvent& event); + + // common part of all ctors + void Init(); + + // send the wxEVT_LISTBOX event + void SendSelectedEvent(); + virtual void InitEvent(wxCommandEvent& event, int n); + + // common implementation of SelectAll() and DeselectAll() + bool DoSelectAll(bool select); + + // change the current item (in single selection listbox it also implicitly + // changes the selection); current may be wxNOT_FOUND in which case there + // will be no current item any more + // + // return true if the current item changed, false otherwise + bool DoSetCurrent(int current); + + // flags for DoHandleItemClick + enum + { + ItemClick_Shift = 1, // item shift-clicked + ItemClick_Ctrl = 2, // ctrl + ItemClick_Kbd = 4 // item selected from keyboard + }; + + // common part of keyboard and mouse handling processing code + void DoHandleItemClick(int item, int flags); + + // paint the background of the given item using the provided colour if it's + // valid, otherwise just return false and do nothing (this is used by + // OnDrawBackground()) + bool DoDrawSolidBackground(const wxColour& col, + wxDC& dc, + const wxRect& rect, + size_t n) const; + +private: + // the current item or wxNOT_FOUND + // + // if m_selStore == NULL this is also the selected item, otherwise the + // selections are managed by m_selStore + int m_current; + + // the anchor of the selection for the multiselection listboxes: + // shift-clicking an item extends the selection from m_anchor to the item + // clicked, for example + // + // always wxNOT_FOUND for single selection listboxes + int m_anchor; + + // the object managing our selected items if not NULL + wxSelectionStore *m_selStore; + + // margins + wxPoint m_ptMargins; + + // the selection bg colour + wxColour m_colBgSel; + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxVListBox); + DECLARE_ABSTRACT_CLASS(wxVListBox) +}; + +#endif // _WX_VLBOX_H_ + diff --git a/wxmsw/include/wx-3.0/wx/vms_x_fix.h b/wxmsw/include/wx-3.0/wx/vms_x_fix.h new file mode 100644 index 00000000..8d34abd7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/vms_x_fix.h @@ -0,0 +1,1213 @@ +/*************************************************************************** + * * + * Author : Jouk Jansen (joukj@hrem.stm.tudelft.nl) * + * * + * Last revision : 7 October 2005 * + * * + * Repair definitions of Runtime library functions when compiling with * + * /name=(as_is) on OpenVMS * + * * + ***************************************************************************/ + +#ifndef VMS_X_FIX +#define VMS_X_FIX + +#define decw$_select DECW$_SELECT +#define DtSaverGetWindows DTSAVERGETWINDOWS +#define MrmFetchWidget MRMFETCHWIDGET +#define MrmInitialize MRMINITIALIZE +#define MrmOpenHierarchy MRMOPENHIERARCHY +#define MrmRegisterNames MRMREGISTERNAMES +#define XAddExtension XADDEXTENSION +#define XAddHosts XADDHOSTS +#define XAllocClassHint XALLOCCLASSHINT +#define XAllocColor XALLOCCOLOR +#define XAllocColorCells XALLOCCOLORCELLS +#define XAllocIconSize XALLOCICONSIZE +#define XAllocNamedColor XALLOCNAMEDCOLOR +#define XAllocSizeHints XALLOCSIZEHINTS +#define XAllocStandardColormap XALLOCSTANDARDCOLORMAP +#define XAllocWMHints XALLOCWMHINTS +#define XAllowEvents XALLOWEVENTS +#define XAutoRepeatOff XAUTOREPEATOFF +#define XAutoRepeatOn XAUTOREPEATON +#define XBaseFontNameListOfFontSet XBASEFONTNAMELISTOFFONTSET +#define XBell XBELL +#define XBitmapPad XBITMAPPAD +#define XBlackPixel XBLACKPIXEL +#define XBlackPixelOfScreen XBLACKPIXELOFSCREEN +#define XCellsOfScreen XCELLSOFSCREEN +#define XChangeActivePointerGrab XCHANGEACTIVEPOINTERGRAB +#define XChangeGC XCHANGEGC +#define XChangeKeyboardControl XCHANGEKEYBOARDCONTROL +#define XChangePointerControl XCHANGEPOINTERCONTROL +#define XChangeProperty XCHANGEPROPERTY +#define XChangeWindowAttributes XCHANGEWINDOWATTRIBUTES +#define XCheckIfEvent XCHECKIFEVENT +#define XCheckMaskEvent XCHECKMASKEVENT +#define XCheckTypedEvent XCHECKTYPEDEVENT +#define XCheckTypedWindowEvent XCHECKTYPEDWINDOWEVENT +#define XCheckWindowEvent XCHECKWINDOWEVENT +#define XClearArea XCLEARAREA +#define XClearWindow XCLEARWINDOW +#define XClipBox XCLIPBOX +#define XCloseDisplay XCLOSEDISPLAY +#define XCloseIM XCLOSEIM +#define XConfigureWindow XCONFIGUREWINDOW +#define XConvertSelection XCONVERTSELECTION +#define XCopyArea XCOPYAREA +#define XCopyColormapAndFree XCOPYCOLORMAPANDFREE +#define XCopyGC XCOPYGC +#define XCopyPlane XCOPYPLANE +#define XCreateBitmapFromData XCREATEBITMAPFROMDATA +#define XCreateColormap XCREATECOLORMAP +#define XCreateFontCursor XCREATEFONTCURSOR +#define XCreateFontSet XCREATEFONTSET +#define XCreateGC XCREATEGC +#define XCreateGlyphCursor XCREATEGLYPHCURSOR +#define XCreateIC XCREATEIC +#define XCreateImage XCREATEIMAGE +#define XCreatePixmap XCREATEPIXMAP +#define XCreatePixmapCursor XCREATEPIXMAPCURSOR +#define XCreatePixmapFromBitmapData XCREATEPIXMAPFROMBITMAPDATA +#define XCreateRegion XCREATEREGION +#define XCreateSimpleWindow XCREATESIMPLEWINDOW +#define XCreateWindow XCREATEWINDOW +#define XDefaultColormap XDEFAULTCOLORMAP +#define XDefaultColormapOfScreen XDEFAULTCOLORMAPOFSCREEN +#define XDefaultDepth XDEFAULTDEPTH +#define XDefaultDepthOfScreen XDEFAULTDEPTHOFSCREEN +#define XDefaultGC XDEFAULTGC +#define XDefaultRootWindow XDEFAULTROOTWINDOW +#define XDefaultScreen XDEFAULTSCREEN +#define XDefaultScreenOfDisplay XDEFAULTSCREENOFDISPLAY +#define XDefaultVisual XDEFAULTVISUAL +#define XDefaultVisualOfScreen XDEFAULTVISUALOFSCREEN +#define XDefineCursor XDEFINECURSOR +#define XDeleteContext XDELETECONTEXT +#define XDeleteProperty XDELETEPROPERTY +#define XDestroyIC XDESTROYIC +#define XDestroyRegion XDESTROYREGION +#define XDestroySubwindows XDESTROYSUBWINDOWS +#define XDestroyWindow XDESTROYWINDOW +#define XDisableAccessControl XDISABLEACCESSCONTROL +#define XDisplayCells XDISPLAYCELLS +#define XDisplayHeight XDISPLAYHEIGHT +#define XDisplayKeycodes XDISPLAYKEYCODES +#define XDisplayName XDISPLAYNAME +#define XDisplayOfIM XDISPLAYOFIM +#define XDisplayOfScreen XDISPLAYOFSCREEN +#define XDisplayString XDISPLAYSTRING +#define XDisplayWidth XDISPLAYWIDTH +#define XDoesBackingStore XDOESBACKINGSTORE +#define XDrawArc XDRAWARC +#define XDrawArcs XDRAWARCS +#define XDrawImageString XDRAWIMAGESTRING +#define XDrawImageString16 XDRAWIMAGESTRING16 +#define XDrawLine XDRAWLINE +#define XDrawLines XDRAWLINES +#define XDrawPoint XDRAWPOINT +#define XDrawPoints XDRAWPOINTS +#define XDrawRectangle XDRAWRECTANGLE +#define XDrawRectangles XDRAWRECTANGLES +#define XDrawSegments XDRAWSEGMENTS +#define XDrawString XDRAWSTRING +#define XDrawString16 XDRAWSTRING16 +#define XDrawText XDRAWTEXT +#define XDrawText16 XDRAWTEXT16 +#define XESetCloseDisplay XESETCLOSEDISPLAY +#define XEmptyRegion XEMPTYREGION +#define XEnableAccessControl XENABLEACCESSCONTROL +#define XEqualRegion XEQUALREGION +#define XEventsQueued XEVENTSQUEUED +#define XExtendedMaxRequestSize XEXTENDEDMAXREQUESTSIZE +#define XExtentsOfFontSet XEXTENTSOFFONTSET +#define XFetchBuffer XFETCHBUFFER +#define XFetchBytes XFETCHBYTES +#define XFetchName XFETCHNAME +#define XFillArc XFILLARC +#define XFillArcs XFILLARCS +#define XFillPolygon XFILLPOLYGON +#define XFillRectangle XFILLRECTANGLE +#define XFillRectangles XFILLRECTANGLES +#define XFilterEvent XFILTEREVENT +#define XFindContext XFINDCONTEXT +#define XFlush XFLUSH +#define XFontsOfFontSet XFONTSOFFONTSET +#define XForceScreenSaver XFORCESCREENSAVER +#define XFree XFREE +#define XFreeColormap XFREECOLORMAP +#define XFreeColors XFREECOLORS +#define XFreeCursor XFREECURSOR +#define XFreeDeviceList XFREEDEVICELIST +#define XFreeDeviceState XFREEDEVICESTATE +#define XFreeFont XFREEFONT +#define XFreeFontInfo XFREEFONTINFO +#define XFreeFontNames XFREEFONTNAMES +#define XFreeFontSet XFREEFONTSET +#define XFreeGC XFREEGC +#define XFreeModifiermap XFREEMODIFIERMAP +#define XFreePixmap XFREEPIXMAP +#define XFreeStringList XFREESTRINGLIST +#define XGContextFromGC XGCONTEXTFROMGC +#define XGeometry XGEOMETRY +#define XGetAtomName XGETATOMNAME +#define XGetCommand XGETCOMMAND +#define XGetDefault XGETDEFAULT +#define XGetErrorDatabaseText XGETERRORDATABASETEXT +#define XGetErrorText XGETERRORTEXT +#define XGetExtensionVersion XGETEXTENSIONVERSION +#define XGetFontProperty XGETFONTPROPERTY +#define XGetGCValues XGETGCVALUES +#define XGetGeometry XGETGEOMETRY +#define XGetICValues XGETICVALUES +#define XGetIMValues XGETIMVALUES +#define XGetIconName XGETICONNAME +#define XGetIconSizes XGETICONSIZES +#define XGetImage XGETIMAGE +#define XGetInputFocus XGETINPUTFOCUS +#define XGetKeyboardControl XGETKEYBOARDCONTROL +#define XGetKeyboardMapping XGETKEYBOARDMAPPING +#define XGetModifierMapping XGETMODIFIERMAPPING +#define XGetMotionEvents XGETMOTIONEVENTS +#define XGetNormalHints XGETNORMALHINTS +#define XGetPointerMapping XGETPOINTERMAPPING +#define XGetRGBColormaps XGETRGBCOLORMAPS +#define XGetScreenSaver XGETSCREENSAVER +#define XGetSelectionOwner XGETSELECTIONOWNER +#define XGetStandardColormap XGETSTANDARDCOLORMAP +#define XGetSubImage XGETSUBIMAGE +#define XGetTextProperty XGETTEXTPROPERTY +#define XGetVisualInfo XGETVISUALINFO +#define XGetWMColormapWindows XGETWMCOLORMAPWINDOWS +#define XGetWMHints XGETWMHINTS +#define XGetWMIconName XGETWMICONNAME +#define XGetWMName XGETWMNAME +#define XGetWMNormalHints XGETWMNORMALHINTS +#define XGetWindowAttributes XGETWINDOWATTRIBUTES +#define XGetWindowProperty XGETWINDOWPROPERTY +#define XGrabButton XGRABBUTTON +#define XGrabKeyboard XGRABKEYBOARD +#define XGrabPointer XGRABPOINTER +#define XGrabServer XGRABSERVER +#define XHeightMMOfScreen XHEIGHTMMOFSCREEN +#define XHeightOfScreen XHEIGHTOFSCREEN +#define XIconifyWindow XICONIFYWINDOW +#define XIfEvent XIFEVENT +#define XInitExtension XINITEXTENSION +#define XInitImage XINITIMAGE +#define XInstallColormap XINSTALLCOLORMAP +#define XInternAtom XINTERNATOM +#define XInternAtoms XINTERNATOMS +#define XIntersectRegion XINTERSECTREGION +#define XKeycodeToKeysym XKEYCODETOKEYSYM +#define XKeysymToKeycode XKEYSYMTOKEYCODE +#define XKeysymToString XKEYSYMTOSTRING +#define XKillClient XKILLCLIENT +#define XListDepths XLISTDEPTHS +#define XListFonts XLISTFONTS +#define XListFontsWithInfo XLISTFONTSWITHINFO +#define XListHosts XLISTHOSTS +#define XListInputDevices XLISTINPUTDEVICES +#define XListInstalledColormaps XLISTINSTALLEDCOLORMAPS +#define XListPixmapFormats XLISTPIXMAPFORMATS +#define XListProperties XLISTPROPERTIES +#define XLoadFont XLOADFONT +#define XLoadQueryFont XLOADQUERYFONT +#define XLookupColor XLOOKUPCOLOR +#define XLookupKeysym XLOOKUPKEYSYM +#define XLookupString XLOOKUPSTRING +#define XLowerWindow XLOWERWINDOW +#define XMapRaised XMAPRAISED +#define XMapSubwindows XMAPSUBWINDOWS +#define XMapWindow XMAPWINDOW +#define XMatchVisualInfo XMATCHVISUALINFO +#define XMaxRequestSize XMAXREQUESTSIZE +#define XMissingExtension XMISSINGEXTENSION +#define XMoveResizeWindow XMOVERESIZEWINDOW +#define XMoveWindow XMOVEWINDOW +#define XNextEvent XNEXTEVENT +#define XNextRequest XNEXTREQUEST +#define XNoOp XNOOP +#define XOffsetRegion XOFFSETREGION +#define XOpenDevice XOPENDEVICE +#define XOpenDisplay XOPENDISPLAY +#define XOpenIM XOPENIM +#define XParseColor XPARSECOLOR +#define XParseGeometry XPARSEGEOMETRY +#define XPeekEvent XPEEKEVENT +#define XPeekIfEvent XPEEKIFEVENT +#define XPending XPENDING +#define XPointInRegion XPOINTINREGION +#define XPolygonRegion XPOLYGONREGION +#define XPutBackEvent XPUTBACKEVENT +#define XPutImage XPUTIMAGE +#define XQLength XQLENGTH +#define XQueryBestCursor XQUERYBESTCURSOR +#define XQueryBestStipple XQUERYBESTSTIPPLE +#define XQueryColor XQUERYCOLOR +#define XQueryColors XQUERYCOLORS +#define XQueryDeviceState XQUERYDEVICESTATE +#define XQueryExtension XQUERYEXTENSION +#define XQueryFont XQUERYFONT +#define XQueryKeymap XQUERYKEYMAP +#define XQueryPointer XQUERYPOINTER +#define XQueryTree XQUERYTREE +#define XRaiseWindow XRAISEWINDOW +#define XReadBitmapFile XREADBITMAPFILE +#define XRecolorCursor XRECOLORCURSOR +#define XReconfigureWMWindow XRECONFIGUREWMWINDOW +#define XRectInRegion XRECTINREGION +#define XRefreshKeyboardMapping XREFRESHKEYBOARDMAPPING +#define XRemoveHosts XREMOVEHOSTS +#define XReparentWindow XREPARENTWINDOW +#define XResetScreenSaver XRESETSCREENSAVER +#define XResizeWindow XRESIZEWINDOW +#define XResourceManagerString XRESOURCEMANAGERSTRING +#define XRestackWindows XRESTACKWINDOWS +#define XRotateBuffers XROTATEBUFFERS +#define XRootWindow XROOTWINDOW +#define XRootWindowOfScreen XROOTWINDOWOFSCREEN +#define XSaveContext XSAVECONTEXT +#define XScreenNumberOfScreen XSCREENNUMBEROFSCREEN +#define XScreenOfDisplay XSCREENOFDISPLAY +#define XSelectAsyncEvent XSELECTASYNCEVENT +#define XSelectAsyncInput XSELECTASYNCINPUT +#define XSelectExtensionEvent XSELECTEXTENSIONEVENT +#define XSelectInput XSELECTINPUT +#define XSendEvent XSENDEVENT +#define XServerVendor XSERVERVENDOR +#define XSetArcMode XSETARCMODE +#define XSetBackground XSETBACKGROUND +#define XSetClassHint XSETCLASSHINT +#define XSetClipMask XSETCLIPMASK +#define XSetClipOrigin XSETCLIPORIGIN +#define XSetClipRectangles XSETCLIPRECTANGLES +#define XSetCloseDownMode XSETCLOSEDOWNMODE +#define XSetCommand XSETCOMMAND +#define XSetDashes XSETDASHES +#define XSetErrorHandler XSETERRORHANDLER +#define XSetFillRule XSETFILLRULE +#define XSetFillStyle XSETFILLSTYLE +#define XSetFont XSETFONT +#define XSetForeground XSETFOREGROUND +#define XSetFunction XSETFUNCTION +#define XSetGraphicsExposures XSETGRAPHICSEXPOSURES +#define XSetICFocus XSETICFOCUS +#define XSetICValues XSETICVALUES +#define XSetIOErrorHandler XSETIOERRORHANDLER +#define XSetIconName XSETICONNAME +#define XSetInputFocus XSETINPUTFOCUS +#define XSetLineAttributes XSETLINEATTRIBUTES +#define XSetLocaleModifiers XSETLOCALEMODIFIERS +#define XSetNormalHints XSETNORMALHINTS +#define XSetPlaneMask XSETPLANEMASK +#define XSetRegion XSETREGION +#define XSetRGBColormaps XSETRGBCOLORMAPS +#define XSetScreenSaver XSETSCREENSAVER +#define XSetSelectionOwner XSETSELECTIONOWNER +#define XSetStandardProperties XSETSTANDARDPROPERTIES +#define XSetState XSETSTATE +#define XSetStipple XSETSTIPPLE +#define XSetSubwindowMode XSETSUBWINDOWMODE +#define XSetTSOrigin XSETTSORIGIN +#define XSetTextProperty XSETTEXTPROPERTY +#define XSetTile XSETTILE +#define XSetTransientForHint XSETTRANSIENTFORHINT +#define XSetWMClientMachine XSETWMCLIENTMACHINE +#define XSetWMColormapWindows XSETWMCOLORMAPWINDOWS +#define XSetWMHints XSETWMHINTS +#define XSetWMIconName XSETWMICONNAME +#define XSetWMName XSETWMNAME +#define XSetWMNormalHints XSETWMNORMALHINTS +#define XSetWMProperties XSETWMPROPERTIES +#define XSetWMProtocols XSETWMPROTOCOLS +#define XSetWMSizeHints XSETWMSIZEHINTS +#define XSetWindowBackground XSETWINDOWBACKGROUND +#define XSetWindowBackgroundPixmap XSETWINDOWBACKGROUNDPIXMAP +#define XSetWindowBorder XSETWINDOWBORDER +#define XSetWindowBorderPixmap XSETWINDOWBORDERPIXMAP +#define XSetWindowBorderWidth XSETWINDOWBORDERWIDTH +#define XSetWindowColormap XSETWINDOWCOLORMAP +#define XShapeCombineMask XSHAPECOMBINEMASK +#define XShapeCombineRectangles XSHAPECOMBINERECTANGLES +#define XShapeGetRectangles XSHAPEGETRECTANGLES +#define XShapeQueryExtension XSHAPEQUERYEXTENSION +#define XShmAttach XSHMATTACH +#define XShmCreateImage XSHMCREATEIMAGE +#define XShmCreatePixmap XSHMCREATEPIXMAP +#define XShmDetach XSHMDETACH +#define XShmGetEventBase XSHMGETEVENTBASE +#define XShmPutImage XSHMPUTIMAGE +#define XShmQueryExtension XSHMQUERYEXTENSION +#define XShmQueryVersion XSHMQUERYVERSION +#define XShrinkRegion XSHRINKREGION +#define XStoreBuffer XSTOREBUFFER +#define XStoreBytes XSTOREBYTES +#define XStoreColor XSTORECOLOR +#define XStoreColors XSTORECOLORS +#define XStoreName XSTORENAME +#define XStringListToTextProperty XSTRINGLISTTOTEXTPROPERTY +#define XStringToKeysym XSTRINGTOKEYSYM +#define XSubtractRegion XSUBTRACTREGION +#define XSupportsLocale XSUPPORTSLOCALE +#define XSync XSYNC +#define XSynchronize XSYNCHRONIZE +#define XTextExtents XTEXTEXTENTS +#define XTextExtents16 XTEXTEXTENTS16 +#define XTextPropertyToStringList XTEXTPROPERTYTOSTRINGLIST +#define XTextWidth XTEXTWIDTH +#define XTextWidth16 XTEXTWIDTH16 +#define XTranslateCoordinates XTRANSLATECOORDINATES +#define XUndefineCursor XUNDEFINECURSOR +#define XUngrabButton XUNGRABBUTTON +#define XUngrabKeyboard XUNGRABKEYBOARD +#define XUngrabPointer XUNGRABPOINTER +#define XUngrabServer XUNGRABSERVER +#define XUninstallColormap XUNINSTALLCOLORMAP +#define XUnionRectWithRegion XUNIONRECTWITHREGION +#define XUnionRegion XUNIONREGION +#define XUniqueContext XUNIQUECONTEXT +#define XUnmapWindow XUNMAPWINDOW +#define XUnsetICFocus XUNSETICFOCUS +#define XVaCreateNestedList XVACREATENESTEDLIST +#define XVisualIDFromVisual XVISUALIDFROMVISUAL +#define XWMGeometry XWMGEOMETRY +#define XWarpPointer XWARPPOINTER +#define XWhitePixel XWHITEPIXEL +#define XWhitePixelOfScreen XWHITEPIXELOFSCREEN +#define XWidthMMOfScreen XWIDTHMMOFSCREEN +#define XWidthOfScreen XWIDTHOFSCREEN +#define XWindowEvent XWINDOWEVENT +#define XWithdrawWindow XWITHDRAWWINDOW +#define XXorRegion XXORREGION +#define XcmsQueryColor XCMSQUERYCOLOR +#define XdbeAllocateBackBufferName XDBEALLOCATEBACKBUFFERNAME +#define XdbeFreeVisualInfo XDBEFREEVISUALINFO +#define XdbeGetVisualInfo XDBEGETVISUALINFO +#define XdbeQueryExtension XDBEQUERYEXTENSION +#define XdbeSwapBuffers XDBESWAPBUFFERS +#define XextAddDisplay XEXTADDDISPLAY +#define XextFindDisplay XEXTFINDDISPLAY +#define XextRemoveDisplay XEXTREMOVEDISPLAY +#define XkbSetDetectableAutoRepeat XKBSETDETECTABLEAUTOREPEAT +#define XmActivateProtocol XMACTIVATEPROTOCOL +#define XmAddProtocolCallback XMADDPROTOCOLCALLBACK +#define XmAddProtocols XMADDPROTOCOLS +#define XmChangeColor XMCHANGECOLOR +#define XmClipboardCopy XMCLIPBOARDCOPY +#define XmClipboardCopyByName XMCLIPBOARDCOPYBYNAME +#define XmClipboardEndCopy XMCLIPBOARDENDCOPY +#define XmClipboardEndRetrieve XMCLIPBOARDENDRETRIEVE +#define XmClipboardInquireCount XMCLIPBOARDINQUIRECOUNT +#define XmClipboardInquireFormat XMCLIPBOARDINQUIREFORMAT +#define XmClipboardInquireLength XMCLIPBOARDINQUIRELENGTH +#define XmClipboardLock XMCLIPBOARDLOCK +#define XmClipboardRetrieve XMCLIPBOARDRETRIEVE +#define XmClipboardStartCopy XMCLIPBOARDSTARTCOPY +#define XmClipboardStartRetrieve XMCLIPBOARDSTARTRETRIEVE +#define XmClipboardUnlock XMCLIPBOARDUNLOCK +#define XmCommandError XMCOMMANDERROR +#define XmCommandGetChild XMCOMMANDGETCHILD +#define XmCommandSetValue XMCOMMANDSETVALUE +#define XmCreateArrowButton XMCREATEARROWBUTTON +#define XmCreateArrowButtonGadget XMCREATEARROWBUTTONGADGET +#define XmCreateBulletinBoardDialog XMCREATEBULLETINBOARDDIALOG +#define XmCreateCascadeButton XMCREATECASCADEBUTTON +#define XmCreateCascadeButtonGadget XMCREATECASCADEBUTTONGADGET +#define XmCreateDialogShell XMCREATEDIALOGSHELL +#define XmCreateDragIcon XMCREATEDRAGICON +#define XmCreateDrawingArea XMCREATEDRAWINGAREA +#define XmCreateDrawnButton XMCREATEDRAWNBUTTON +#define XmCreateErrorDialog XMCREATEERRORDIALOG +#define XmCreateFileSelectionBox XMCREATEFILESELECTIONBOX +#define XmCreateFileSelectionDialog XMCREATEFILESELECTIONDIALOG +#define XmCreateForm XMCREATEFORM +#define XmCreateFormDialog XMCREATEFORMDIALOG +#define XmCreateFrame XMCREATEFRAME +#define XmCreateInformationDialog XMCREATEINFORMATIONDIALOG +#define XmCreateLabel XMCREATELABEL +#define XmCreateLabelGadget XMCREATELABELGADGET +#define XmCreateList XMCREATELIST +#define XmCreateMainWindow XMCREATEMAINWINDOW +#define XmCreateMenuBar XMCREATEMENUBAR +#define XmCreateMessageBox XMCREATEMESSAGEBOX +#define XmCreateMessageDialog XMCREATEMESSAGEDIALOG +#define XmCreateOptionMenu XMCREATEOPTIONMENU +#define XmCreatePanedWindow XMCREATEPANEDWINDOW +#define XmCreatePopupMenu XMCREATEPOPUPMENU +#define XmCreatePromptDialog XMCREATEPROMPTDIALOG +#define XmCreatePulldownMenu XMCREATEPULLDOWNMENU +#define XmCreatePushButton XMCREATEPUSHBUTTON +#define XmCreatePushButtonGadget XMCREATEPUSHBUTTONGADGET +#define XmCreateQuestionDialog XMCREATEQUESTIONDIALOG +#define XmCreateRadioBox XMCREATERADIOBOX +#define XmCreateRowColumn XMCREATEROWCOLUMN +#define XmCreateScale XMCREATESCALE +#define XmCreateScrollBar XMCREATESCROLLBAR +#define XmCreateScrolledList XMCREATESCROLLEDLIST +#define XmCreateScrolledText XMCREATESCROLLEDTEXT +#define XmCreateScrolledWindow XMCREATESCROLLEDWINDOW +#define XmCreateSelectionDialog XMCREATESELECTIONDIALOG +#define XmCreateSeparator XMCREATESEPARATOR +#define XmCreateSeparatorGadget XMCREATESEPARATORGADGET +#define XmCreateTemplateDialog XMCREATETEMPLATEDIALOG +#define XmCreateText XMCREATETEXT +#define XmCreateTextField XMCREATETEXTFIELD +#define XmCreateToggleButton XMCREATETOGGLEBUTTON +#define XmCreateToggleButtonGadget XMCREATETOGGLEBUTTONGADGET +#define XmCreateWarningDialog XMCREATEWARNINGDIALOG +#define XmCvtCTToXmString XMCVTCTTOXMSTRING +#define XmDestroyPixmap XMDESTROYPIXMAP +#define XmDragStart XMDRAGSTART +#define XmDropSiteRegister XMDROPSITEREGISTER +#define XmDropSiteUnregister XMDROPSITEUNREGISTER +#define XmDropSiteUpdate XMDROPSITEUPDATE +#define XmDropTransferStart XMDROPTRANSFERSTART +#define XmFileSelectionBoxGetChild XMFILESELECTIONBOXGETCHILD +#define XmFileSelectionDoSearch XMFILESELECTIONDOSEARCH +#define XmFontListAppendEntry XMFONTLISTAPPENDENTRY +#define XmFontListCopy XMFONTLISTCOPY +#define XmFontListCreate XMFONTLISTCREATE +#define XmFontListEntryCreate XMFONTLISTENTRYCREATE +#define XmFontListEntryFree XMFONTLISTENTRYFREE +#define XmFontListEntryGetFont XMFONTLISTENTRYGETFONT +#define XmFontListEntryGetTag XMFONTLISTENTRYGETTAG +#define XmFontListEntryLoad XMFONTLISTENTRYLOAD +#define XmFontListFree XMFONTLISTFREE +#define XmFontListFreeFontContext XMFONTLISTFREEFONTCONTEXT +#define XmFontListGetNextFont XMFONTLISTGETNEXTFONT +#define XmFontListInitFontContext XMFONTLISTINITFONTCONTEXT +#define XmFontListNextEntry XMFONTLISTNEXTENTRY +#define XmGetColors XMGETCOLORS +#define XmGetColorCalculation XMGETCOLORCALCULATION +#define XmGetFocusWidget XMGETFOCUSWIDGET +#define XmGetMenuCursor XMGETMENUCURSOR +#define XmGetPixmap XMGETPIXMAP +#define XmGetPixmapByDepth XMGETPIXMAPBYDEPTH +#define XmGetTearOffControl XMGETTEAROFFCONTROL +#define XmGetXmDisplay XMGETXMDISPLAY +#define XmImMbLookupString XMIMMBLOOKUPSTRING +#define XmImRegister XMIMREGISTER +#define XmImSetFocusValues XMIMSETFOCUSVALUES +#define XmImSetValues XMIMSETVALUES +#define XmImUnregister XMIMUNREGISTER +#define XmImUnsetFocus XMIMUNSETFOCUS +#define XmInstallImage XMINSTALLIMAGE +#define XmInternAtom XMINTERNATOM +#define XmIsMotifWMRunning XMISMOTIFWMRUNNING +#define XmListAddItem XMLISTADDITEM +#define XmListAddItemUnselected XMLISTADDITEMUNSELECTED +#define XmListAddItems XMLISTADDITEMS +#define XmListAddItemsUnselected XMLISTADDITEMSUNSELECTED +#define XmListDeleteAllItems XMLISTDELETEALLITEMS +#define XmListDeleteItem XMLISTDELETEITEM +#define XmListDeleteItemsPos XMLISTDELETEITEMSPOS +#define XmListDeletePos XMLISTDELETEPOS +#define XmListDeselectAllItems XMLISTDESELECTALLITEMS +#define XmListDeselectPos XMLISTDESELECTPOS +#define XmListGetKbdItemPos XMLISTGETKBDITEMPOS +#define XmListGetMatchPos XMLISTGETMATCHPOS +#define XmListGetSelectedPos XMLISTGETSELECTEDPOS +#define XmListItemExists XMLISTITEMEXISTS +#define XmListItemPos XMLISTITEMPOS +#define XmListPosSelected XMLISTPOSSELECTED +#define XmListReplaceItems XMLISTREPLACEITEMS +#define XmListReplaceItemsPos XMLISTREPLACEITEMSPOS +#define XmListSelectItem XMLISTSELECTITEM +#define XmListSelectPos XMLISTSELECTPOS +#define XmListSetBottomPos XMLISTSETBOTTOMPOS +#define XmListSetItem XMLISTSETITEM +#define XmListSetKbdItemPos XMLISTSETKBDITEMPOS +#define XmListSetPos XMLISTSETPOS +#define XmMainWindowSetAreas XMMAINWINDOWSETAREAS +#define XmMenuPosition XMMENUPOSITION +#define XmMessageBoxGetChild XMMESSAGEBOXGETCHILD +#define XmOptionButtonGadget XMOPTIONBUTTONGADGET +#define XmOptionLabelGadget XMOPTIONLABELGADGET +#define XmProcessTraversal XMPROCESSTRAVERSAL +#define XmQmotif XMQMOTIF +#define XmRemoveProtocolCallback XMREMOVEPROTOCOLCALLBACK +#define XmRemoveProtocols XMREMOVEPROTOCOLS +#define XmRemoveTabGroup XMREMOVETABGROUP +#define XmRepTypeGetId XMREPTYPEGETID +#define XmRepTypeGetRecord XMREPTYPEGETRECORD +#define XmRepTypeInstallTearOffModelCon XMREPTYPEINSTALLTEAROFFMODELCON +#define XmRepTypeRegister XMREPTYPEREGISTER +#define XmRepTypeValidValue XMREPTYPEVALIDVALUE +#define XmScrollBarGetValues XMSCROLLBARGETVALUES +#define XmScrollBarSetValues XMSCROLLBARSETVALUES +#define XmScrolledWindowSetAreas XMSCROLLEDWINDOWSETAREAS +#define XmSelectionBoxGetChild XMSELECTIONBOXGETCHILD +#define XmSetColorCalculation XMSETCOLORCALCULATION +#define XmStringByteCompare XMSTRINGBYTECOMPARE +#define XmStringCompare XMSTRINGCOMPARE +#define XmStringConcat XMSTRINGCONCAT +#define XmStringCopy XMSTRINGCOPY +#define XmStringCreate XMSTRINGCREATE +#define XmStringCreateLocalized XMSTRINGCREATELOCALIZED +#define XmStringCreateLtoR XMSTRINGCREATELTOR +#define XmStringCreateSimple XMSTRINGCREATESIMPLE +#define XmStringDraw XMSTRINGDRAW +#define XmStringDrawUnderline XMSTRINGDRAWUNDERLINE +#define XmStringExtent XMSTRINGEXTENT +#define XmStringFree XMSTRINGFREE +#define XmStringFreeContext XMSTRINGFREECONTEXT +#define XmStringGetLtoR XMSTRINGGETLTOR +#define XmStringGetNextComponent XMSTRINGGETNEXTCOMPONENT +#define XmStringGetNextSegment XMSTRINGGETNEXTSEGMENT +#define XmStringInitContext XMSTRINGINITCONTEXT +#define XmStringLength XMSTRINGLENGTH +#define XmStringLtoRCreate XMSTRINGLTORCREATE +#define XmStringNConcat XMSTRINGNCONCAT +#define XmStringSegmentCreate XMSTRINGSEGMENTCREATE +#define XmStringSeparatorCreate XMSTRINGSEPARATORCREATE +#define XmStringWidth XMSTRINGWIDTH +#define XmTextClearSelection XMTEXTCLEARSELECTION +#define XmTextCopy XMTEXTCOPY +#define XmTextCut XMTEXTCUT +#define XmTextFieldClearSelection XMTEXTFIELDCLEARSELECTION +#define XmTextFieldCopy XMTEXTFIELDCOPY +#define XmTextFieldCut XMTEXTFIELDCUT +#define XmTextFieldGetEditable XMTEXTFIELDGETEDITABLE +#define XmTextFieldGetInsertionPosition XMTEXTFIELDGETINSERTIONPOSITION +#define XmTextFieldGetLastPosition XMTEXTFIELDGETLASTPOSITION +#define XmTextFieldGetMaxLength XMTEXTFIELDGETMAXLENGTH +#define XmTextFieldGetSelection XMTEXTFIELDGETSELECTION +#define XmTextFieldGetSelectionPosition XMTEXTFIELDGETSELECTIONPOSITION +#define XmTextFieldGetString XMTEXTFIELDGETSTRING +#define XmTextFieldInsert XMTEXTFIELDINSERT +#define XmTextFieldPaste XMTEXTFIELDPASTE +#define XmTextFieldRemove XMTEXTFIELDREMOVE +#define XmTextFieldReplace XMTEXTFIELDREPLACE +#define XmTextFieldSetAddMode XMTEXTFIELDSETADDMODE +#define XmTextFieldSetHighlight XMTEXTFIELDSETHIGHLIGHT +#define XmTextFieldSetInsertionPosition XMTEXTFIELDSETINSERTIONPOSITION +#define XmTextFieldSetMaxLength XMTEXTFIELDSETMAXLENGTH +#define XmTextFieldSetSelection XMTEXTFIELDSETSELECTION +#define XmTextFieldSetString XMTEXTFIELDSETSTRING +#define XmTextFieldShowPosition XMTEXTFIELDSHOWPOSITION +#define XmTextGetCursorPosition XMTEXTGETCURSORPOSITION +#define XmTextGetEditable XMTEXTGETEDITABLE +#define XmTextGetInsertionPosition XMTEXTGETINSERTIONPOSITION +#define XmTextGetLastPosition XMTEXTGETLASTPOSITION +#define XmTextGetMaxLength XMTEXTGETMAXLENGTH +#define XmTextGetSelection XMTEXTGETSELECTION +#define XmTextGetSelectionPosition XMTEXTGETSELECTIONPOSITION +#define XmTextGetString XMTEXTGETSTRING +#define XmTextInsert XMTEXTINSERT +#define XmTextPaste XMTEXTPASTE +#define XmTextPosToXY XMTEXTPOSTOXY +#define XmTextRemove XMTEXTREMOVE +#define XmTextReplace XMTEXTREPLACE +#define XmTextSetCursorPosition XMTEXTSETCURSORPOSITION +#define XmTextSetEditable XMTEXTSETEDITABLE +#define XmTextSetHighlight XMTEXTSETHIGHLIGHT +#define XmTextSetInsertionPosition XMTEXTSETINSERTIONPOSITION +#define XmTextSetSelection XMTEXTSETSELECTION +#define XmTextSetString XMTEXTSETSTRING +#define XmTextSetTopCharacter XMTEXTSETTOPCHARACTER +#define XmTextShowPosition XMTEXTSHOWPOSITION +#define XmToggleButtonGadgetGetState XMTOGGLEBUTTONGADGETGETSTATE +#define XmToggleButtonGadgetSetState XMTOGGLEBUTTONGADGETSETSTATE +#define XmToggleButtonGetState XMTOGGLEBUTTONGETSTATE +#define XmToggleButtonSetState XMTOGGLEBUTTONSETSTATE +#define XmUninstallImage XMUNINSTALLIMAGE +#define XmUpdateDisplay XMUPDATEDISPLAY +#define XmVaCreateSimpleRadioBox XMVACREATESIMPLERADIOBOX +#define XmbDrawString XMBDRAWSTRING +#define XmbLookupString XMBLOOKUPSTRING +#define XmbResetIC XMBRESETIC +#define XmbSetWMProperties XMBSETWMPROPERTIES +#define XmbTextEscapement XMBTEXTESCAPEMENT +#define XmbTextExtents XMBTEXTEXTENTS +#define XmbTextListToTextProperty XMBTEXTLISTTOTEXTPROPERTY +#define XmbTextPropertyToTextList XMBTEXTPROPERTYTOTEXTLIST +#define XmbufCreateBuffers XMBUFCREATEBUFFERS +#define XmbufDestroyBuffers XMBUFDESTROYBUFFERS +#define XmbufDisplayBuffers XMBUFDISPLAYBUFFERS +#define XmbufQueryExtension XMBUFQUERYEXTENSION +#define Xmemory_free XMEMORY_FREE +#define Xmemory_malloc XMEMORY_MALLOC +#define XmuClientWindow XMUCLIENTWINDOW +#define XmuConvertStandardSelection XMUCONVERTSTANDARDSELECTION +#define XmuCvtStringToBitmap XMUCVTSTRINGTOBITMAP +#define XmuInternAtom XMUINTERNATOM +#define XmuInternStrings XMUINTERNSTRINGS +#define XmuLookupStandardColormap XMULOOKUPSTANDARDCOLORMAP +#define XmuPrintDefaultErrorMessage XMUPRINTDEFAULTERRORMESSAGE +#define XrmCombineDatabase XRMCOMBINEDATABASE +#define XrmCombineFileDatabase XRMCOMBINEFILEDATABASE +#define XrmDestroyDatabase XRMDESTROYDATABASE +#define XrmGetDatabase XRMGETDATABASE +#define XrmGetFileDatabase XRMGETFILEDATABASE +#define XrmGetResource XRMGETRESOURCE +#define XrmGetStringDatabase XRMGETSTRINGDATABASE +#define XrmInitialize XRMINITIALIZE +#define XrmMergeDatabases XRMMERGEDATABASES +#define XrmParseCommand XRMPARSECOMMAND +#define XrmPermStringToQuark XRMPERMSTRINGTOQUARK +#define XrmPutFileDatabase XRMPUTFILEDATABASE +#define XrmPutLineResource XRMPUTLINERESOURCE +#define XrmPutStringResource XRMPUTSTRINGRESOURCE +#define XrmQGetResource XRMQGETRESOURCE +#define XrmQPutStringResource XRMQPUTSTRINGRESOURCE +#define XrmQuarkToString XRMQUARKTOSTRING +#define XrmSetDatabase XRMSETDATABASE +#define XrmStringToBindingQuarkList XRMSTRINGTOBINDINGQUARKLIST +#define XrmStringToQuark XRMSTRINGTOQUARK +#define XtAddCallback XTADDCALLBACK +#define XtAddCallbacks XTADDCALLBACKS +#define XtAddConverter XTADDCONVERTER +#define XtAddEventHandler XTADDEVENTHANDLER +#define XtAddExposureToRegion XTADDEXPOSURETOREGION +#define XtAddGrab XTADDGRAB +#define XtAddRawEventHandler XTADDRAWEVENTHANDLER +#define XtAllocateGC XTALLOCATEGC +#define XtAppAddActions XTAPPADDACTIONS +#define XtAppAddInput XTAPPADDINPUT +#define XtAppAddTimeOut XTAPPADDTIMEOUT +#define XtAppAddWorkProc XTAPPADDWORKPROC +#define XtAppCreateShell XTAPPCREATESHELL +#define XtAppError XTAPPERROR +#define XtAppErrorMsg XTAPPERRORMSG +#define XtAppInitialize XTAPPINITIALIZE +#define XtAppMainLoop XTAPPMAINLOOP +#define XtAppNextEvent XTAPPNEXTEVENT +#define XtAppPeekEvent XTAPPPEEKEVENT +#define XtAppPending XTAPPPENDING +#define XtAppProcessEvent XTAPPPROCESSEVENT +#define XtAppSetErrorHandler XTAPPSETERRORHANDLER +#define XtAppSetFallbackResources XTAPPSETFALLBACKRESOURCES +#define XtAppSetTypeConverter XTAPPSETTYPECONVERTER +#define XtAppSetWarningHandler XTAPPSETWARNINGHANDLER +#define XtAppWarningMsg XTAPPWARNINGMSG +#define XtAppSetWarningMsgHandler XTAPPSETWARNINGMSGHANDLER +#define XtAppWarning XTAPPWARNING +#define XtAugmentTranslations XTAUGMENTTRANSLATIONS +#define XtCallActionProc XTCALLACTIONPROC +#define XtCallCallbackList XTCALLCALLBACKLIST +#define XtCallCallbacks XTCALLCALLBACKS +#define XtCallConverter XTCALLCONVERTER +#define XtCalloc XTCALLOC +#ifndef NOXTDISPLAY +#define XtClass XTCLASS +#endif +#define XtCloseDisplay XTCLOSEDISPLAY +#define XtConfigureWidget XTCONFIGUREWIDGET +#define XtConvert XTCONVERT +#define XtConvertAndStore XTCONVERTANDSTORE +#define XtCreateApplicationContext XTCREATEAPPLICATIONCONTEXT +#define XtCreateManagedWidget XTCREATEMANAGEDWIDGET +#define XtCreatePopupShell XTCREATEPOPUPSHELL +#define XtCreateWidget XTCREATEWIDGET +#define XtCreateWindow XTCREATEWINDOW +#define XtCvtStringToFont XTCVTSTRINGTOFONT +#define XtDatabase XTDATABASE +#define XtDestroyApplicationContext XTDESTROYAPPLICATIONCONTEXT +#define XtDestroyWidget XTDESTROYWIDGET +#define XtDisownSelection XTDISOWNSELECTION +#define XtDispatchEvent XTDISPATCHEVENT +#ifndef NOXTDISPLAY +#define XtDisplay XTDISPLAY +#endif +#define XtDisplayOfObject XTDISPLAYOFOBJECT +#define XtDisplayStringConvWarning XTDISPLAYSTRINGCONVWARNING +#define XtDisplayToApplicationContext XTDISPLAYTOAPPLICATIONCONTEXT +#define XtError XTERROR +#define XtErrorMsg XTERRORMSG +#define XtFree XTFREE +#define XtGetActionKeysym XTGETACTIONKEYSYM +#define XtGetActionList XTGETACTIONLIST +#define XtGetApplicationNameAndClass XTGETAPPLICATIONNAMEANDCLASS +#define XtGetApplicationResources XTGETAPPLICATIONRESOURCES +#define XtGetClassExtension XTGETCLASSEXTENSION +#define XtGetConstraintResourceList XTGETCONSTRAINTRESOURCELIST +#define XtGetGC XTGETGC +#define XtGetMultiClickTime XTGETMULTICLICKTIME +#define XtGetResourceList XTGETRESOURCELIST +#define XtGetSelectionValue XTGETSELECTIONVALUE +#define XtGetSelectionValues XTGETSELECTIONVALUES +#define XtGetSubresources XTGETSUBRESOURCES +#define XtGetValues XTGETVALUES +#define XtGrabButton XTGRABBUTTON +#define XtGrabKeyboard XTGRABKEYBOARD +#define XtGrabPointer XTGRABPOINTER +#define XtHasCallbacks XTHASCALLBACKS +#define XtInitialize XTINITIALIZE +#define XtInitializeWidgetClass XTINITIALIZEWIDGETCLASS +#define XtInsertEventHandler XTINSERTEVENTHANDLER +#define XtInsertRawEventHandler XTINSERTRAWEVENTHANDLER +#define XtInstallAccelerators XTINSTALLACCELERATORS +#define XtIsManaged XTISMANAGED +#define XtIsObject XTISOBJECT +#ifndef NOXTDISPLAY +#define XtIsRealized XTISREALIZED +#endif +#define XtIsSensitive XTISSENSITIVE +#define XtIsSubclass XTISSUBCLASS +#define XtLastTimestampProcessed XTLASTTIMESTAMPPROCESSED +#define XtMainLoop XTMAINLOOP +#define XtMakeGeometryRequest XTMAKEGEOMETRYREQUEST +#define XtMakeResizeRequest XTMAKERESIZEREQUEST +#define XtMalloc XTMALLOC +#define XtManageChild XTMANAGECHILD +#define XtManageChildren XTMANAGECHILDREN +#define XtMergeArgLists XTMERGEARGLISTS +#define XtMoveWidget XTMOVEWIDGET +#define XtName XTNAME +#define XtNameToWidget XTNAMETOWIDGET +#define XtOpenApplication XTOPENAPPLICATION +#define XtOpenDisplay XTOPENDISPLAY +#define XtOverrideTranslations XTOVERRIDETRANSLATIONS +#define XtOwnSelection XTOWNSELECTION +#ifndef NOXTDISPLAY +#define XtParent XTPARENT +#endif +#define XtParseAcceleratorTable XTPARSEACCELERATORTABLE +#define XtParseTranslationTable XTPARSETRANSLATIONTABLE +#define XtPopdown XTPOPDOWN +#define XtPopup XTPOPUP +#define XtPopupSpringLoaded XTPOPUPSPRINGLOADED +#define XtQueryGeometry XTQUERYGEOMETRY +#define XtRealizeWidget XTREALIZEWIDGET +#define XtRealloc XTREALLOC +#define XtRegisterDrawable _XTREGISTERWINDOW +#define XtRegisterGrabAction XTREGISTERGRABACTION +#define XtReleaseGC XTRELEASEGC +#define XtRemoveAllCallbacks XTREMOVEALLCALLBACKS +#define XtRemoveCallback XTREMOVECALLBACK +#define XtRemoveEventHandler XTREMOVEEVENTHANDLER +#define XtRemoveGrab XTREMOVEGRAB +#define XtRemoveInput XTREMOVEINPUT +#define XtRemoveTimeOut XTREMOVETIMEOUT +#define XtRemoveWorkProc XTREMOVEWORKPROC +#define XtResizeWidget XTRESIZEWIDGET +#define XtResolvePathname XTRESOLVEPATHNAME +#ifndef NOXTDISPLAY +#define XtScreen XTSCREEN +#endif +#define XtScreenDatabase XTSCREENDATABASE +#define XtScreenOfObject XTSCREENOFOBJECT +#define XtSessionReturnToken XTSESSIONRETURNTOKEN +#define XtSetErrorHandler XTSETERRORHANDLER +#define XtSetKeyboardFocus XTSETKEYBOARDFOCUS +#define XtSetLanguageProc XTSETLANGUAGEPROC +#define XtSetMappedWhenManaged XTSETMAPPEDWHENMANAGED +#define XtSetSensitive XTSETSENSITIVE +#define XtSetTypeConverter XTSETTYPECONVERTER +#define XtSetValues XTSETVALUES +#define XtShellStrings XTSHELLSTRINGS +#define XtStringConversionWarning XTSTRINGCONVERSIONWARNING +#define XtStrings XTSTRINGS +#define XtToolkitInitialize XTTOOLKITINITIALIZE +#define XtTranslateCoords XTTRANSLATECOORDS +#define XtTranslateKeycode XTTRANSLATEKEYCODE +#define XtUngrabButton XTUNGRABBUTTON +#define XtUngrabKeyboard XTUNGRABKEYBOARD +#define XtUngrabPointer XTUNGRABPOINTER +#define XtUnmanageChild XTUNMANAGECHILD +#define XtUnmanageChildren XTUNMANAGECHILDREN +#define XtUnrealizeWidget XTUNREALIZEWIDGET +#define XtUnregisterDrawable _XTUNREGISTERWINDOW +#define XtVaCreateManagedWidget XTVACREATEMANAGEDWIDGET +#define XtVaCreatePopupShell XTVACREATEPOPUPSHELL +#define XtVaCreateWidget XTVACREATEWIDGET +#define XtVaGetApplicationResources XTVAGETAPPLICATIONRESOURCES +#define XtVaGetValues XTVAGETVALUES +#define XtVaSetValues XTVASETVALUES +#define XtWarning XTWARNING +#define XtWarningMsg XTWARNINGMSG +#define XtWidgetToApplicationContext XTWIDGETTOAPPLICATIONCONTEXT +#ifndef NOXTDISPLAY +#define XtWindow XTWINDOW +#endif +#define XtWindowOfObject XTWINDOWOFOBJECT +#define XtWindowToWidget XTWINDOWTOWIDGET +#define XwcDrawImageString XWCDRAWIMAGESTRING +#define XwcDrawString XWCDRAWSTRING +#define XwcFreeStringList XWCFREESTRINGLIST +#define XwcTextEscapement XWCTEXTESCAPEMENT +#define XwcTextExtents XWCTEXTEXTENTS +#define XwcTextListToTextProperty XWCTEXTLISTTOTEXTPROPERTY +#define XwcLookupString XWCLOOKUPSTRING +#define XwcTextPropertyToTextList XWCTEXTPROPERTYTOTEXTLIST +#define _XAllocTemp _XALLOCTEMP +#define _XDeqAsyncHandler _XDEQASYNCHANDLER +#define _XEatData _XEATDATA +#define _XFlush _XFLUSH +#define _XFreeTemp _XFREETEMP +#define _XGetAsyncReply _XGETASYNCREPLY +#define _XInitImageFuncPtrs _XINITIMAGEFUNCPTRS +#define _XRead _XREAD +#define _XReadPad _XREADPAD +#define _XRegisterFilterByType _XREGISTERFILTERBYTYPE +#define _XReply _XREPLY +#define _XSend _XSEND +#define _XUnregisterFilter _XUNREGISTERFILTER +#define _XVIDtoVisual _XVIDTOVISUAL +#define _XmBottomShadowColorDefault _XMBOTTOMSHADOWCOLORDEFAULT +#define _XmClearBorder _XMCLEARBORDER +#define _XmConfigureObject _XMCONFIGUREOBJECT +#define _XmDestroyParentCallback _XMDESTROYPARENTCALLBACK +#define _XmDrawArrow _XMDRAWARROW +#define _XmDrawShadows _XMDRAWSHADOWS +#define _XmFontListGetDefaultFont _XMFONTLISTGETDEFAULTFONT +#define _XmFromHorizontalPixels _XMFROMHORIZONTALPIXELS +#define _XmFromVerticalPixels _XMFROMVERTICALPIXELS +#define _XmGetClassExtensionPtr _XMGETCLASSEXTENSIONPTR +#define _XmGetDefaultFontList _XMGETDEFAULTFONTLIST +#define _XmGetTextualDragIcon _XMGETTEXTUALDRAGICON +#define _XmGetWidgetExtData _XMGETWIDGETEXTDATA +#define _XmGrabKeyboard _XMGRABKEYBOARD +#define _XmGrabPointer _XMGRABPOINTER +#define _XmInheritClass _XMINHERITCLASS +#define _XmInputForGadget _XMINPUTFORGADGET +#define _XmInputInGadget _XMINPUTINGADGET +#define _XmMakeGeometryRequest _XMMAKEGEOMETRYREQUEST +#define _XmMenuPopDown _XMMENUPOPDOWN +#define _XmMoveObject _XMMOVEOBJECT +#define _XmNavigChangeManaged _XMNAVIGCHANGEMANAGED +#define _XmOSBuildFileList _XMOSBUILDFILELIST +#define _XmOSFileCompare _XMOSFILECOMPARE +#define _XmOSFindPatternPart _XMOSFINDPATTERNPART +#define _XmOSQualifyFileSpec _XMOSQUALIFYFILESPEC +#define _XmPostPopupMenu _XMPOSTPOPUPMENU +#define _XmPrimitiveEnter _XMPRIMITIVEENTER +#define _XmPrimitiveLeave _XMPRIMITIVELEAVE +#define _XmRedisplayGadgets _XMREDISPLAYGADGETS +#define _XmShellIsExclusive _XMSHELLISEXCLUSIVE +#define _XmStringDraw _XMSTRINGDRAW +#define _XmStringGetTextConcat _XMSTRINGGETTEXTCONCAT +#define _XmStrings _XMSTRINGS +#define _XmToHorizontalPixels _XMTOHORIZONTALPIXELS +#define _XmToVerticalPixels _XMTOVERTICALPIXELS +#define _XmTopShadowColorDefault _XMTOPSHADOWCOLORDEFAULT +#define _Xm_fastPtr _XM_FASTPTR +#define _XtCheckSubclassFlag _XTCHECKSUBCLASSFLAG +#define _XtCopyFromArg _XTCOPYFROMARG +#define _XtCountVaList _XTCOUNTVALIST +#define _XtInherit _XTINHERIT +#define _XtInheritTranslations _XTINHERITTRANSLATIONS +#define _XtIsSubclassOf _XTISSUBCLASSOF +#define _XtVaToArgList _XTVATOARGLIST +#define applicationShellWidgetClass APPLICATIONSHELLWIDGETCLASS +#define cli$dcl_parse CLI$DCL_PARSE +#define cli$get_value CLI$GET_VALUE +#define cli$present CLI$PRESENT +#define compositeClassRec COMPOSITECLASSREC +#define compositeWidgetClass COMPOSITEWIDGETCLASS +#define constraintClassRec CONSTRAINTCLASSREC +#define constraintWidgetClass CONSTRAINTWIDGETCLASS +#define coreWidgetClass COREWIDGETCLASS +#define exe$getspi EXE$GETSPI +#define lbr$close LBR$CLOSE +#define lbr$get_header LBR$GET_HEADER +#define lbr$get_index LBR$GET_INDEX +#define lbr$get_record LBR$GET_RECORD +#define lbr$ini_control LBR$INI_CONTROL +#define lbr$lookup_key LBR$LOOKUP_KEY +#define lbr$open LBR$OPEN +#define lbr$output_help LBR$OUTPUT_HELP +#define lib$add_times LIB$ADD_TIMES +#define lib$addx LIB$ADDX +#define lib$create_dir LIB$CREATE_DIR +#define lib$create_vm_zone LIB$CREATE_VM_ZONE +#define lib$cvt_from_internal_time LIB$CVT_FROM_INTERNAL_TIME +#define lib$cvt_htb LIB$CVT_HTB +#define lib$cvt_vectim LIB$CVT_VECTIM +#define lib$day LIB$DAY +#define lib$day_of_week LIB$DAY_OF_WEEK +#define lib$delete_symbol LIB$DELETE_SYMBOL +#define lib$delete_vm_zone LIB$DELETE_VM_ZONE +#define lib$disable_ctrl LIB$DISABLE_CTRL +#define lib$ediv LIB$EDIV +#define lib$emul LIB$EMUL +#define lib$enable_ctrl LIB$ENABLE_CTRL +#define lib$find_vm_zone LIB$FIND_VM_ZONE +#define lib$format_date_time LIB$FORMAT_DATE_TIME +#define lib$free_timer LIB$FREE_TIMER +#define lib$free_vm LIB$FREE_VM +#define lib$get_ef LIB$GET_EF +#define lib$get_foreign LIB$GET_FOREIGN +#define lib$get_input LIB$GET_INPUT +#define lib$get_users_language LIB$GET_USERS_LANGUAGE +#define lib$get_vm LIB$GET_VM +#define lib$get_symbol LIB$GET_SYMBOL +#define lib$getdvi LIB$GETDVI +#define lib$init_date_time_context LIB$INIT_DATE_TIME_CONTEXT +#define lib$init_timer LIB$INIT_TIMER +#define lib$find_file LIB$FIND_FILE +#define lib$find_file_end LIB$FIND_FILE_END +#define lib$find_image_symbol LIB$FIND_IMAGE_SYMBOL +#define lib$mult_delta_time LIB$MULT_DELTA_TIME +#define lib$put_output LIB$PUT_OUTPUT +#define lib$rename_file LIB$RENAME_FILE +#define lib$reset_vm_zone LIB$RESET_VM_ZONE +#define lib$set_symbol LIB$SET_SYMBOL +#define lib$sfree1_dd LIB$SFREE1_DD +#define lib$show_vm LIB$SHOW_VM +#define lib$show_vm_zone LIB$SHOW_VM_ZONE +#define lib$spawn LIB$SPAWN +#define lib$stat_timer LIB$STAT_TIMER +#define lib$subx LIB$SUBX +#define lib$sub_times LIB$SUB_TIMES +#define lib$wait LIB$WAIT +#define mail$send_add_address MAIL$SEND_ADD_ADDRESS +#define mail$send_add_attribute MAIL$SEND_ADD_ATTRIBUTE +#define mail$send_add_bodypart MAIL$SEND_ADD_BODYPART +#define mail$send_begin MAIL$SEND_BEGIN +#define mail$send_end MAIL$SEND_END +#define mail$send_message MAIL$SEND_MESSAGE +#define ncs$convert NCS$CONVERT +#define ncs$get_cf NCS$GET_CF +#define objectClass OBJECTCLASS +#define objectClassRec OBJECTCLASSREC +#define overrideShellClassRec OVERRIDESHELLCLASSREC +#define overrideShellWidgetClass OVERRIDESHELLWIDGETCLASS +#define pthread_attr_create PTHREAD_ATTR_CREATE +#define pthread_attr_delete PTHREAD_ATTR_DELETE +#define pthread_attr_destroy PTHREAD_ATTR_DESTROY +#define pthread_attr_getdetach_np PTHREAD_ATTR_GETDETACH_NP +#define pthread_attr_getguardsize_np PTHREAD_ATTR_GETGUARDSIZE_NP +#define pthread_attr_getinheritsched PTHREAD_ATTR_GETINHERITSCHED +#define pthread_attr_getprio PTHREAD_ATTR_GETPRIO +#define pthread_attr_getsched PTHREAD_ATTR_GETSCHED +#define pthread_attr_getschedparam PTHREAD_ATTR_GETSCHEDPARAM +#define pthread_attr_getschedpolicy PTHREAD_ATTR_GETSCHEDPOLICY +#define pthread_attr_getstacksize PTHREAD_ATTR_GETSTACKSIZE +#define pthread_attr_init PTHREAD_ATTR_INIT +#define pthread_attr_setdetach_np PTHREAD_ATTR_SETDETACH_NP +#define pthread_attr_setdetachstate PTHREAD_ATTR_SETDETACHSTATE +#define pthread_attr_setguardsize_np PTHREAD_ATTR_SETGUARDSIZE_NP +#define pthread_attr_setinheritsched PTHREAD_ATTR_SETINHERITSCHED +#define pthread_attr_setprio PTHREAD_ATTR_SETPRIO +#define pthread_attr_setsched PTHREAD_ATTR_SETSCHED +#define pthread_attr_setschedparam PTHREAD_ATTR_SETSCHEDPARAM +#define pthread_attr_setschedpolicy PTHREAD_ATTR_SETSCHEDPOLICY +#ifndef pthread_attr_setscope +# define pthread_attr_setscope PTHREAD_ATTR_SETSCOPE +#endif +#define pthread_attr_setstacksize PTHREAD_ATTR_SETSTACKSIZE +#define pthread_cancel PTHREAD_CANCEL +#define pthread_cancel_e PTHREAD_CANCEL_E +#define pthread_cond_broadcast PTHREAD_COND_BROADCAST +#define pthread_cond_destroy PTHREAD_COND_DESTROY +#define pthread_cond_init PTHREAD_COND_INIT +#define pthread_cond_sig_preempt_int_np PTHREAD_COND_SIG_PREEMPT_INT_NP +#define pthread_cond_signal PTHREAD_COND_SIGNAL +#define pthread_cond_signal_int_np PTHREAD_COND_SIGNAL_INT_NP +#define pthread_cond_timedwait PTHREAD_COND_TIMEDWAIT +#define pthread_cond_wait PTHREAD_COND_WAIT +#define pthread_condattr_create PTHREAD_CONDATTR_CREATE +#define pthread_condattr_delete PTHREAD_CONDATTR_DELETE +#define pthread_condattr_init PTHREAD_CONDATTR_INIT +#define pthread_create PTHREAD_CREATE +#define pthread_delay_np PTHREAD_DELAY_NP +#define pthread_detach PTHREAD_DETACH +#define pthread_equal PTHREAD_EQUAL +#define pthread_exc_fetch_fp_np PTHREAD_EXC_FETCH_FP_NP +#define pthread_exc_handler_np PTHREAD_EXC_HANDLER_NP +#define pthread_exc_matches_np PTHREAD_EXC_MATCHES_NP +#define pthread_exc_pop_ctx_np PTHREAD_EXC_POP_CTX_NP +#define pthread_exc_push_ctx_np PTHREAD_EXC_PUSH_CTX_NP +#define pthread_exc_raise_np PTHREAD_EXC_RAISE_NP +#define pthread_exc_savecontext_np PTHREAD_EXC_SAVECONTEXT_NP +#define pthread_exit PTHREAD_EXIT +#define pthread_get_expiration_np PTHREAD_GET_EXPIRATION_NP +#define pthread_getprio PTHREAD_GETPRIO +#define pthread_getschedparam PTHREAD_GETSCHEDPARAM +#define pthread_getscheduler PTHREAD_GETSCHEDULER +#define pthread_getspecific PTHREAD_GETSPECIFIC +#define pthread_getunique_np PTHREAD_GETUNIQUE_NP +#define pthread_join PTHREAD_JOIN +#define pthread_join32 PTHREAD_JOIN32 +#define pthread_key_create PTHREAD_KEY_CREATE +#define pthread_key_delete PTHREAD_KEY_DELETE +#define pthread_keycreate PTHREAD_KEYCREATE +#define pthread_kill PTHREAD_KILL +#define pthread_lock_global_np PTHREAD_LOCK_GLOBAL_NP +#define pthread_mutex_destroy PTHREAD_MUTEX_DESTROY +#define pthread_mutex_init PTHREAD_MUTEX_INIT +#define pthread_mutex_lock PTHREAD_MUTEX_LOCK +#define pthread_mutex_trylock PTHREAD_MUTEX_TRYLOCK +#define pthread_mutex_unlock PTHREAD_MUTEX_UNLOCK +#define pthread_mutexattr_create PTHREAD_MUTEXATTR_CREATE +#define pthread_mutexattr_delete PTHREAD_MUTEXATTR_DELETE +#define pthread_mutexattr_destroy PTHREAD_MUTEXATTR_DESTROY +#define pthread_mutexattr_getkind_np PTHREAD_MUTEXATTR_GETKIND_NP +#define pthread_mutexattr_init PTHREAD_MUTEXATTR_INIT +#define pthread_mutexattr_setkind_np PTHREAD_MUTEXATTR_SETKIND_NP +#define pthread_mutexattr_settype_np PTHREAD_MUTEXATTR_SETTYPE_NP +#define pthread_once PTHREAD_ONCE +#define pthread_resume_np PTHREAD_RESUME_NP +#define pthread_self PTHREAD_SELF +#define pthread_setasynccancel PTHREAD_SETASYNCCANCEL +#define pthread_setcancel PTHREAD_SETCANCEL +#define pthread_setcancelstate PTHREAD_SETCANCELSTATE +#define pthread_setcanceltype PTHREAD_SETCANCELTYPE +#define pthread_setprio PTHREAD_SETPRIO +#define pthread_setschedparam PTHREAD_SETSCHEDPARAM +#define pthread_setscheduler PTHREAD_SETSCHEDULER +#define pthread_setspecific PTHREAD_SETSPECIFIC +#define pthread_suspend_np PTHREAD_SUSPEND_NP +#define pthread_testcancel PTHREAD_TESTCANCEL +#define pthread_unlock_global_np PTHREAD_UNLOCK_GLOBAL_NP +#define pthread_yield PTHREAD_YIELD +#define pthread_yield_np PTHREAD_YIELD_NP +#define rectObjClass RECTOBJCLASS +#define rectObjClassRec RECTOBJCLASSREC +#define sessionShellWidgetClass SESSIONSHELLWIDGETCLASS +#define shellWidgetClass SHELLWIDGETCLASS +#define shmat SHMAT +#define shmctl SHMCTL +#define shmdt SHMDT +#define shmget SHMGET +#define smg$create_key_table SMG$CREATE_KEY_TABLE +#define smg$create_virtual_keyboard SMG$CREATE_VIRTUAL_KEYBOARD +#define smg$read_composed_line SMG$READ_COMPOSED_LINE +#define sys$add_ident SYS$ADD_IDENT +#define sys$asctoid SYS$ASCTOID +#define sys$assign SYS$ASSIGN +#define sys$bintim SYS$BINTIM +#define sys$cancel SYS$CANCEL +#define sys$cantim SYS$CANTIM +#define sys$check_access SYS$CHECK_ACCESS +#define sys$close SYS$CLOSE +#define sys$connect SYS$CONNECT +#define sys$create SYS$CREATE +#define sys$create_user_profile SYS$CREATE_USER_PROFILE +#define sys$crembx SYS$CREMBX +#define sys$creprc SYS$CREPRC +#define sys$crmpsc SYS$CRMPSC +#define sys$dassgn SYS$DASSGN +#define sys$dclast SYS$DCLAST +#define sys$dclexh SYS$DCLEXH +#define sys$delprc SYS$DELPRC +#define sys$deq SYS$DEQ +#define sys$dgblsc SYS$DGBLSC +#define sys$display SYS$DISPLAY +#define sys$enq SYS$ENQ +#define sys$enqw SYS$ENQW +#define sys$erase SYS$ERASE +#define sys$fao SYS$FAO +#define sys$faol SYS$FAOL +#define sys$find_held SYS$FIND_HELD +#define sys$finish_rdb SYS$FINISH_RDB +#define sys$flush SYS$FLUSH +#define sys$forcex SYS$FORCEX +#define sys$get SYS$GET +#define sys$get_security SYS$GET_SECURITY +#define sys$getdviw SYS$GETDVIW +#define sys$getjpi SYS$GETJPI +#define sys$getjpiw SYS$GETJPIW +#define sys$getlkiw SYS$GETLKIW +#define sys$getmsg SYS$GETMSG +#define sys$getsyi SYS$GETSYI +#define sys$getsyiw SYS$GETSYIW +#define sys$gettim SYS$GETTIM +#define sys$getuai SYS$GETUAI +#define sys$grantid SYS$GRANTID +#define sys$hash_password SYS$HASH_PASSWORD +#define sys$hiber SYS$HIBER +#define sys$mgblsc SYS$MGBLSC +#define sys$numtim SYS$NUMTIM +#define sys$open SYS$OPEN +#define sys$parse SYS$PARSE +#define sys$parse_acl SYS$PARSE_ACL +#define sys$parse_acl SYS$PARSE_ACL +#define sys$persona_assume SYS$PERSONA_ASSUME +#define sys$persona_create SYS$PERSONA_CREATE +#define sys$persona_delete SYS$PERSONA_DELETE +#define sys$process_scan SYS$PROCESS_SCAN +#define sys$put SYS$PUT +#define sys$qio SYS$QIO +#define sys$qiow SYS$QIOW +#define sys$read SYS$READ +#define sys$resched SYS$RESCHED +#define sys$rewind SYS$REWIND +#define sys$search SYS$SEARCH +#define sys$set_security SYS$SET_SECURITY +#define sys$setast SYS$SETAST +#define sys$setef SYS$SETEF +#define sys$setimr SYS$SETIMR +#define sys$setpri SYS$SETPRI +#define sys$setprn SYS$SETPRN +#define sys$setprv SYS$SETPRV +#define sys$setswm SYS$SETSWM +#define sys$setuai SYS$SETUAI +#define sys$sndopr SYS$SNDOPR +#define sys$synch SYS$SYNCH +#define sys$trnlnm SYS$TRNLNM +#define sys$update SYS$UPDATE +#define sys$wake SYS$WAKE +#define sys$write SYS$WRITE +#define topLevelShellClassRec TOPLEVELSHELLCLASSREC +#define topLevelShellWidgetClass TOPLEVELSHELLWIDGETCLASS +#define transientShellWidgetClass TRANSIENTSHELLWIDGETCLASS +#define vendorShellClassRec VENDORSHELLCLASSREC +#define vendorShellWidgetClass VENDORSHELLWIDGETCLASS +#define widgetClass WIDGETCLASS +#define widgetClassRec WIDGETCLASSREC +#define wmShellClassRec WMSHELLCLASSREC +#define wmShellWidgetClass WMSHELLWIDGETCLASS +#define x$soft_ast_lib_lock X$SOFT_AST_LIB_LOCK +#define x$soft_ast_lock_depth X$SOFT_AST_LOCK_DEPTH +#define x$soft_reenable_asts X$SOFT_REENABLE_ASTS +#define xmArrowButtonWidgetClass XMARROWBUTTONWIDGETCLASS +#define xmBulletinBoardWidgetClass XMBULLETINBOARDWIDGETCLASS +#define xmCascadeButtonClassRec XMCASCADEBUTTONCLASSREC +#define xmCascadeButtonGadgetClass XMCASCADEBUTTONGADGETCLASS +#define xmCascadeButtonWidgetClass XMCASCADEBUTTONWIDGETCLASS +#define xmCommandWidgetClass XMCOMMANDWIDGETCLASS +#define xmDialogShellWidgetClass XMDIALOGSHELLWIDGETCLASS +#define xmDrawingAreaWidgetClass XMDRAWINGAREAWIDGETCLASS +#define xmDrawnButtonWidgetClass XMDRAWNBUTTONWIDGETCLASS +#define xmFileSelectionBoxWidgetClass XMFILESELECTIONBOXWIDGETCLASS +#define xmFormWidgetClass XMFORMWIDGETCLASS +#define xmFrameWidgetClass XMFRAMEWIDGETCLASS +#define xmGadgetClass XMGADGETCLASS +#define xmLabelGadgetClass XMLABELGADGETCLASS +#define xmLabelWidgetClass XMLABELWIDGETCLASS +#define xmListWidgetClass XMLISTWIDGETCLASS +#define xmMainWindowWidgetClass XMMAINWINDOWWIDGETCLASS +#define xmManagerClassRec XMMANAGERCLASSREC +#define xmManagerWidgetClass XMMANAGERWIDGETCLASS +#define xmMenuShellWidgetClass XMMENUSHELLWIDGETCLASS +#define xmMessageBoxWidgetClass XMMESSAGEBOXWIDGETCLASS +#define xmPrimitiveClassRec XMPRIMITIVECLASSREC +#define xmPrimitiveWidgetClass XMPRIMITIVEWIDGETCLASS +#define xmPushButtonClassRec XMPUSHBUTTONCLASSREC +#define xmPushButtonGadgetClass XMPUSHBUTTONGADGETCLASS +#define xmPushButtonWidgetClass XMPUSHBUTTONWIDGETCLASS +#define xmRowColumnWidgetClass XMROWCOLUMNWIDGETCLASS +#define xmSashWidgetClass XMSASHWIDGETCLASS +#define xmScaleWidgetClass XMSCALEWIDGETCLASS +#define xmScrollBarWidgetClass XMSCROLLBARWIDGETCLASS +#define xmScrolledWindowClassRec XMSCROLLEDWINDOWCLASSREC +#define xmScrolledWindowWidgetClass XMSCROLLEDWINDOWWIDGETCLASS +#define xmSeparatorGadgetClass XMSEPARATORGADGETCLASS +#define xmSeparatorWidgetClass XMSEPARATORWIDGETCLASS +#define xmTextFieldWidgetClass XMTEXTFIELDWIDGETCLASS +#define xmTextWidgetClass XMTEXTWIDGETCLASS +#define xmToggleButtonGadgetClass XMTOGGLEBUTTONGADGETCLASS +#define xmToggleButtonWidgetClass XMTOGGLEBUTTONWIDGETCLASS + +#if (__VMS_VER < 80200000) +# define SetReqLen(req,n,badlen) \ + if ((req->length + n) > (unsigned)65535) { \ + n = badlen; \ + req->length += n; \ + } else \ + req->length += n +#endif + +#ifdef __cplusplus +extern "C" { +#endif +extern void XtFree(char*); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/wxmsw/include/wx-3.0/wx/volume.h b/wxmsw/include/wx-3.0/wx/volume.h new file mode 100644 index 00000000..fd6a8370 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/volume.h @@ -0,0 +1,145 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/volume.h +// Purpose: wxFSVolume - encapsulates system volume information +// Author: George Policello +// Modified by: +// Created: 28 Jan 02 +// Copyright: (c) 2002 George Policello +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// wxFSVolume represents a volume/drive in a file system +// ---------------------------------------------------------------------------- + +#ifndef _WX_FSVOLUME_H_ +#define _WX_FSVOLUME_H_ + +#include "wx/defs.h" + +#if wxUSE_FSVOLUME + +#include "wx/arrstr.h" + +// the volume flags +enum wxFSVolumeFlags +{ + // is the volume mounted? + wxFS_VOL_MOUNTED = 0x0001, + + // is the volume removable (floppy, CD, ...)? + wxFS_VOL_REMOVABLE = 0x0002, + + // read only? (otherwise read write) + wxFS_VOL_READONLY = 0x0004, + + // network resources + wxFS_VOL_REMOTE = 0x0008 +}; + +// the volume types +enum wxFSVolumeKind +{ + wxFS_VOL_FLOPPY, + wxFS_VOL_DISK, + wxFS_VOL_CDROM, + wxFS_VOL_DVDROM, + wxFS_VOL_NETWORK, + wxFS_VOL_OTHER, + wxFS_VOL_MAX +}; + +class WXDLLIMPEXP_BASE wxFSVolumeBase +{ +public: + // return the array containing the names of the volumes + // + // only the volumes with the flags such that + // (flags & flagsSet) == flagsSet && !(flags & flagsUnset) + // are returned (by default, all mounted ones) + static wxArrayString GetVolumes(int flagsSet = wxFS_VOL_MOUNTED, + int flagsUnset = 0); + + // stop execution of GetVolumes() called previously (should be called from + // another thread, of course) + static void CancelSearch(); + + // create the volume object with this name (should be one of those returned + // by GetVolumes()). + wxFSVolumeBase(); + wxFSVolumeBase(const wxString& name); + bool Create(const wxString& name); + + // accessors + // --------- + + // is this a valid volume? + bool IsOk() const; + + // kind of this volume? + wxFSVolumeKind GetKind() const; + + // flags of this volume? + int GetFlags() const; + + // can we write to this volume? + bool IsWritable() const { return !(GetFlags() & wxFS_VOL_READONLY); } + + // get the name of the volume and the name which should be displayed to the + // user + wxString GetName() const { return m_volName; } + wxString GetDisplayName() const { return m_dispName; } + + // TODO: operatios (Mount(), Unmount(), Eject(), ...)? + +protected: + // the internal volume name + wxString m_volName; + + // the volume name as it is displayed to the user + wxString m_dispName; + + // have we been initialized correctly? + bool m_isOk; +}; + +#if wxUSE_GUI + +#include "wx/icon.h" +#include "wx/iconbndl.h" // only for wxIconArray + +enum wxFSIconType +{ + wxFS_VOL_ICO_SMALL = 0, + wxFS_VOL_ICO_LARGE, + wxFS_VOL_ICO_SEL_SMALL, + wxFS_VOL_ICO_SEL_LARGE, + wxFS_VOL_ICO_MAX +}; + +// wxFSVolume adds GetIcon() to wxFSVolumeBase +class WXDLLIMPEXP_CORE wxFSVolume : public wxFSVolumeBase +{ +public: + wxFSVolume() : wxFSVolumeBase() { InitIcons(); } + wxFSVolume(const wxString& name) : wxFSVolumeBase(name) { InitIcons(); } + + wxIcon GetIcon(wxFSIconType type) const; + +private: + void InitIcons(); + + // the different icons for this volume (created on demand) + wxIconArray m_icons; +}; + +#else // !wxUSE_GUI + +// wxFSVolume is the same thing as wxFSVolume in wxBase +typedef wxFSVolumeBase wxFSVolume; + +#endif // wxUSE_GUI/!wxUSE_GUI + +#endif // wxUSE_FSVOLUME + +#endif // _WX_FSVOLUME_H_ diff --git a/wxmsw/include/wx-3.0/wx/vscroll.h b/wxmsw/include/wx-3.0/wx/vscroll.h new file mode 100644 index 00000000..2312d78f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/vscroll.h @@ -0,0 +1,871 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/vscroll.h +// Purpose: Variable scrolled windows (wx[V/H/HV]ScrolledWindow) +// Author: Vadim Zeitlin +// Modified by: Brad Anderson, Bryan Petty +// Created: 30.05.03 +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VSCROLL_H_ +#define _WX_VSCROLL_H_ + +#include "wx/panel.h" +#include "wx/position.h" +#include "wx/scrolwin.h" + +class WXDLLIMPEXP_FWD_CORE wxVarScrollHelperEvtHandler; + + +// Using the same techniques as the wxScrolledWindow class | +// hierarchy, the wx[V/H/HV]ScrolledWindow classes are slightly | +// more complex (compare with the diagram outlined in | +// scrolwin.h) for the purpose of reducing code duplication | +// through the use of mix-in classes. | +// | +// wxAnyScrollHelperBase | +// | | +// | | +// | | +// V | +// wxVarScrollHelperBase | +// / \ | +// / \ | +// V V | +// wxVarHScrollHelper wxVarVScrollHelper | +// | \ / | | +// | \ / | | +// | V V | | +// | wxVarHVScrollHelper | | +// | | | | +// | | V | +// | wxPanel | wxVarVScrollLegacyAdaptor | +// | / \ \ | | | +// | / \ `-----|----------. | | +// | / \ | \ | | +// | / \ | \ | | +// V V \ | V V | +// wxHScrolledWindow \ | wxVScrolledWindow | +// V V | +// wxHVScrolledWindow | +// | +// | +// Border added to suppress GCC multi-line comment warnings ->| + + +// =========================================================================== +// wxVarScrollHelperBase +// =========================================================================== + +// Provides all base common scroll calculations needed for either orientation, +// automatic scrollbar functionality, saved scroll positions, functionality +// for changing the target window to be scrolled, as well as defining all +// required virtual functions that need to be implemented for any orientation +// specific work. + +class WXDLLIMPEXP_CORE wxVarScrollHelperBase : public wxAnyScrollHelperBase +{ +public: + // constructors and such + // --------------------- + + wxVarScrollHelperBase(wxWindow *winToScroll); + virtual ~wxVarScrollHelperBase(); + + // operations + // ---------- + + // with physical scrolling on, the device origin is changed properly when + // a wxPaintDC is prepared, children are actually moved and laid out + // properly, and the contents of the window (pixels) are actually moved + void EnablePhysicalScrolling(bool scrolling = true) + { m_physicalScrolling = scrolling; } + + // wxNOT_FOUND if none, i.e. if it is below the last item + int VirtualHitTest(wxCoord coord) const; + + // recalculate all our parameters and redisplay all units + virtual void RefreshAll(); + + // accessors + // --------- + + // get the first currently visible unit + size_t GetVisibleBegin() const { return m_unitFirst; } + + // get the last currently visible unit + size_t GetVisibleEnd() const + { return m_unitFirst + m_nUnitsVisible; } + + // is this unit currently visible? + bool IsVisible(size_t unit) const + { return unit >= m_unitFirst && unit < GetVisibleEnd(); } + + // translate between scrolled and unscrolled coordinates + int CalcScrolledPosition(int coord) const + { return DoCalcScrolledPosition(coord); } + int CalcUnscrolledPosition(int coord) const + { return DoCalcUnscrolledPosition(coord); } + + virtual int DoCalcScrolledPosition(int coord) const; + virtual int DoCalcUnscrolledPosition(int coord) const; + + // update the thumb size shown by the scrollbar + virtual void UpdateScrollbar(); + void RemoveScrollbar(); + + // Normally the wxScrolledWindow will scroll itself, but in some rare + // occasions you might want it to scroll [part of] another window (e.g. a + // child of it in order to scroll only a portion the area between the + // scrollbars (spreadsheet: only cell area will move). + virtual void SetTargetWindow(wxWindow *target); + + // change the DC origin according to the scroll position. To properly + // forward calls to wxWindow::Layout use WX_FORWARD_TO_SCROLL_HELPER() + // derived class + virtual void DoPrepareDC(wxDC& dc); + + // the methods to be called from the window event handlers + void HandleOnScroll(wxScrollWinEvent& event); + void HandleOnSize(wxSizeEvent& event); +#if wxUSE_MOUSEWHEEL + void HandleOnMouseWheel(wxMouseEvent& event); +#endif // wxUSE_MOUSEWHEEL + + // these functions must be overidden in the derived class to return + // orientation specific data (e.g. the width for vertically scrolling + // derivatives in the case of GetOrientationTargetSize()) + virtual int GetOrientationTargetSize() const = 0; + virtual int GetNonOrientationTargetSize() const = 0; + virtual wxOrientation GetOrientation() const = 0; + +protected: + // all *Unit* functions are protected to be exposed by + // wxVarScrollHelperBase implementations (with appropriate names) + + // get the number of units this window contains (previously set by + // SetUnitCount()) + size_t GetUnitCount() const { return m_unitMax; } + + // set the number of units the helper contains: the derived class must + // provide the sizes for all units with indices up to the one given here + // in its OnGetUnitSize() + void SetUnitCount(size_t count); + + // redraw the specified unit + virtual void RefreshUnit(size_t unit); + + // redraw all units in the specified range (inclusive) + virtual void RefreshUnits(size_t from, size_t to); + + // scroll to the specified unit: it will become the first visible unit in + // the window + // + // return true if we scrolled the window, false if nothing was done + bool DoScrollToUnit(size_t unit); + + // scroll by the specified number of units/pages + virtual bool DoScrollUnits(int units); + virtual bool DoScrollPages(int pages); + + // this function must be overridden in the derived class and it should + // return the size of the given unit in pixels + virtual wxCoord OnGetUnitSize(size_t n) const = 0; + + // this function doesn't have to be overridden but it may be useful to do + // it if calculating the units' sizes is a relatively expensive operation + // as it gives the user code a possibility to calculate several of them at + // once + // + // OnGetUnitsSizeHint() is normally called just before OnGetUnitSize() but + // you shouldn't rely on the latter being called for all units in the + // interval specified here. It is also possible that OnGetUnitHeight() will + // be called for the units outside of this interval, so this is really just + // a hint, not a promise. + // + // finally note that unitMin is inclusive, while unitMax is exclusive, as + // usual + virtual void OnGetUnitsSizeHint(size_t WXUNUSED(unitMin), + size_t WXUNUSED(unitMax)) const + { } + + // when the number of units changes, we try to estimate the total size + // of all units which is a rather expensive operation in terms of unit + // access, so if the user code may estimate the average size + // better/faster than we do, it should override this function to implement + // its own logic + // + // this function should return the best guess for the total size it may + // make + virtual wxCoord EstimateTotalSize() const { return DoEstimateTotalSize(); } + + wxCoord DoEstimateTotalSize() const; + + // find the index of the unit we need to show to fit the specified unit on + // the opposite side either fully or partially (depending on fullyVisible) + size_t FindFirstVisibleFromLast(size_t last, + bool fullyVisible = false) const; + + // get the total size of the units between unitMin (inclusive) and + // unitMax (exclusive) + wxCoord GetUnitsSize(size_t unitMin, size_t unitMax) const; + + // get the offset of the first visible unit + wxCoord GetScrollOffset() const + { return GetUnitsSize(0, GetVisibleBegin()); } + + // get the size of the target window + wxSize GetTargetSize() const { return m_targetWindow->GetClientSize(); } + + void GetTargetSize(int *w, int *h) + { + wxSize size = GetTargetSize(); + if ( w ) + *w = size.x; + if ( h ) + *h = size.y; + } + + // calculate the new scroll position based on scroll event type + size_t GetNewScrollPosition(wxScrollWinEvent& event) const; + + // replacement implementation of wxWindow::Layout virtual method. To + // properly forward calls to wxWindow::Layout use + // WX_FORWARD_TO_SCROLL_HELPER() derived class + bool ScrollLayout(); + +#ifdef __WXMAC__ + // queue mac window update after handling scroll event + virtual void UpdateMacScrollWindow() { } +#endif // __WXMAC__ + + // change the target window + void DoSetTargetWindow(wxWindow *target); + + // delete the event handler we installed + void DeleteEvtHandler(); + + // helper function abstracting the orientation test: with vertical + // orientation, it assigns the first value to x and the second one to y, + // with horizontal orientation it reverses them, i.e. the first value is + // assigned to y and the second one to x + void AssignOrient(wxCoord& x, wxCoord& y, wxCoord first, wxCoord second); + + // similar to "oriented assignment" above but does "oriented increment": + // for vertical orientation, y is incremented by the given value and x if + // left unchanged, for horizontal orientation x is incremented + void IncOrient(wxCoord& x, wxCoord& y, wxCoord inc); + +private: + // the total number of (logical) units + size_t m_unitMax; + + // the total (estimated) size + wxCoord m_sizeTotal; + + // the first currently visible unit + size_t m_unitFirst; + + // the number of currently visible units (including the last, possibly only + // partly, visible one) + size_t m_nUnitsVisible; + + // accumulated mouse wheel rotation +#if wxUSE_MOUSEWHEEL + int m_sumWheelRotation; +#endif + + // do child scrolling (used in DoPrepareDC()) + bool m_physicalScrolling; + + // handler injected into target window to forward some useful events to us + wxVarScrollHelperEvtHandler *m_handler; +}; + + + +// =========================================================================== +// wxVarVScrollHelper +// =========================================================================== + +// Provides public API functions targeted for vertical-specific scrolling, +// wrapping the functionality of wxVarScrollHelperBase. + +class WXDLLIMPEXP_CORE wxVarVScrollHelper : public wxVarScrollHelperBase +{ +public: + // constructors and such + // --------------------- + + // ctor must be given the associated window + wxVarVScrollHelper(wxWindow *winToScroll) + : wxVarScrollHelperBase(winToScroll) + { + } + + // operators + + void SetRowCount(size_t rowCount) { SetUnitCount(rowCount); } + bool ScrollToRow(size_t row) { return DoScrollToUnit(row); } + + virtual bool ScrollRows(int rows) + { return DoScrollUnits(rows); } + virtual bool ScrollRowPages(int pages) + { return DoScrollPages(pages); } + + virtual void RefreshRow(size_t row) + { RefreshUnit(row); } + virtual void RefreshRows(size_t from, size_t to) + { RefreshUnits(from, to); } + + // accessors + + size_t GetRowCount() const { return GetUnitCount(); } + size_t GetVisibleRowsBegin() const { return GetVisibleBegin(); } + size_t GetVisibleRowsEnd() const { return GetVisibleEnd(); } + bool IsRowVisible(size_t row) const { return IsVisible(row); } + + virtual int GetOrientationTargetSize() const + { return GetTargetWindow()->GetClientSize().y; } + virtual int GetNonOrientationTargetSize() const + { return GetTargetWindow()->GetClientSize().x; } + virtual wxOrientation GetOrientation() const { return wxVERTICAL; } + +protected: + // this function must be overridden in the derived class and it should + // return the size of the given row in pixels + virtual wxCoord OnGetRowHeight(size_t n) const = 0; + wxCoord OnGetUnitSize(size_t n) const { return OnGetRowHeight(n); } + + virtual void OnGetRowsHeightHint(size_t WXUNUSED(rowMin), + size_t WXUNUSED(rowMax)) const { } + + // forward calls to OnGetRowsHeightHint() + virtual void OnGetUnitsSizeHint(size_t unitMin, size_t unitMax) const + { OnGetRowsHeightHint(unitMin, unitMax); } + + // again, if not overridden, it will fall back on default method + virtual wxCoord EstimateTotalHeight() const + { return DoEstimateTotalSize(); } + + // forward calls to EstimateTotalHeight() + virtual wxCoord EstimateTotalSize() const { return EstimateTotalHeight(); } + + wxCoord GetRowsHeight(size_t rowMin, size_t rowMax) const + { return GetUnitsSize(rowMin, rowMax); } +}; + + + +// =========================================================================== +// wxVarHScrollHelper +// =========================================================================== + +// Provides public API functions targeted for horizontal-specific scrolling, +// wrapping the functionality of wxVarScrollHelperBase. + +class WXDLLIMPEXP_CORE wxVarHScrollHelper : public wxVarScrollHelperBase +{ +public: + // constructors and such + // --------------------- + + // ctor must be given the associated window + wxVarHScrollHelper(wxWindow *winToScroll) + : wxVarScrollHelperBase(winToScroll) + { + } + + // operators + + void SetColumnCount(size_t columnCount) + { SetUnitCount(columnCount); } + + bool ScrollToColumn(size_t column) + { return DoScrollToUnit(column); } + virtual bool ScrollColumns(int columns) + { return DoScrollUnits(columns); } + virtual bool ScrollColumnPages(int pages) + { return DoScrollPages(pages); } + + virtual void RefreshColumn(size_t column) + { RefreshUnit(column); } + virtual void RefreshColumns(size_t from, size_t to) + { RefreshUnits(from, to); } + + // accessors + + size_t GetColumnCount() const + { return GetUnitCount(); } + size_t GetVisibleColumnsBegin() const + { return GetVisibleBegin(); } + size_t GetVisibleColumnsEnd() const + { return GetVisibleEnd(); } + bool IsColumnVisible(size_t column) const + { return IsVisible(column); } + + + virtual int GetOrientationTargetSize() const + { return GetTargetWindow()->GetClientSize().x; } + virtual int GetNonOrientationTargetSize() const + { return GetTargetWindow()->GetClientSize().y; } + virtual wxOrientation GetOrientation() const { return wxHORIZONTAL; } + +protected: + // this function must be overridden in the derived class and it should + // return the size of the given column in pixels + virtual wxCoord OnGetColumnWidth(size_t n) const = 0; + wxCoord OnGetUnitSize(size_t n) const { return OnGetColumnWidth(n); } + + virtual void OnGetColumnsWidthHint(size_t WXUNUSED(columnMin), + size_t WXUNUSED(columnMax)) const + { } + + // forward calls to OnGetColumnsWidthHint() + virtual void OnGetUnitsSizeHint(size_t unitMin, size_t unitMax) const + { OnGetColumnsWidthHint(unitMin, unitMax); } + + // again, if not overridden, it will fall back on default method + virtual wxCoord EstimateTotalWidth() const { return DoEstimateTotalSize(); } + + // forward calls to EstimateTotalWidth() + virtual wxCoord EstimateTotalSize() const { return EstimateTotalWidth(); } + + wxCoord GetColumnsWidth(size_t columnMin, size_t columnMax) const + { return GetUnitsSize(columnMin, columnMax); } +}; + + + +// =========================================================================== +// wxVarHVScrollHelper +// =========================================================================== + +// Provides public API functions targeted at functions with similar names in +// both wxVScrollHelper and wxHScrollHelper so class scope doesn't need to be +// specified (since we are using multiple inheritance). It also provides +// functions to make changing values for both orientations at the same time +// easier. + +class WXDLLIMPEXP_CORE wxVarHVScrollHelper : public wxVarVScrollHelper, + public wxVarHScrollHelper +{ +public: + // constructors and such + // --------------------- + + // ctor must be given the associated window + wxVarHVScrollHelper(wxWindow *winToScroll) + : wxVarVScrollHelper(winToScroll), wxVarHScrollHelper(winToScroll) { } + + // operators + // --------- + + // set the number of units the window contains for each axis: the derived + // class must provide the widths and heights for all units with indices up + // to each of the one given here in its OnGetColumnWidth() and + // OnGetRowHeight() + void SetRowColumnCount(size_t rowCount, size_t columnCount); + + + // with physical scrolling on, the device origin is changed properly when + // a wxPaintDC is prepared, children are actually moved and laid out + // properly, and the contents of the window (pixels) are actually moved + void EnablePhysicalScrolling(bool vscrolling = true, bool hscrolling = true) + { + wxVarVScrollHelper::EnablePhysicalScrolling(vscrolling); + wxVarHScrollHelper::EnablePhysicalScrolling(hscrolling); + } + + // scroll to the specified row/column: it will become the first visible + // cell in the window + // + // return true if we scrolled the window, false if nothing was done + bool ScrollToRowColumn(size_t row, size_t column); + bool ScrollToRowColumn(const wxPosition &pos) + { return ScrollToRowColumn(pos.GetRow(), pos.GetColumn()); } + + // redraw the specified cell + virtual void RefreshRowColumn(size_t row, size_t column); + virtual void RefreshRowColumn(const wxPosition &pos) + { RefreshRowColumn(pos.GetRow(), pos.GetColumn()); } + + // redraw the specified regions (inclusive). If the target window for + // both orientations is the same the rectangle of cells is refreshed; if + // the target windows differ the entire client size opposite the + // orientation direction is refreshed between the specified limits + virtual void RefreshRowsColumns(size_t fromRow, size_t toRow, + size_t fromColumn, size_t toColumn); + virtual void RefreshRowsColumns(const wxPosition& from, + const wxPosition& to) + { + RefreshRowsColumns(from.GetRow(), to.GetRow(), + from.GetColumn(), to.GetColumn()); + } + + // locate the virtual position from the given device coordinates + wxPosition VirtualHitTest(wxCoord x, wxCoord y) const; + wxPosition VirtualHitTest(const wxPoint &pos) const + { return VirtualHitTest(pos.x, pos.y); } + + // change the DC origin according to the scroll position. To properly + // forward calls to wxWindow::Layout use WX_FORWARD_TO_SCROLL_HELPER() + // derived class. We use this version to call both base classes' + // DoPrepareDC() + virtual void DoPrepareDC(wxDC& dc); + + // replacement implementation of wxWindow::Layout virtual method. To + // properly forward calls to wxWindow::Layout use + // WX_FORWARD_TO_SCROLL_HELPER() derived class. We use this version to + // call both base classes' ScrollLayout() + bool ScrollLayout(); + + // accessors + // --------- + + // get the number of units this window contains (previously set by + // Set[Column/Row/RowColumn/Unit]Count()) + wxSize GetRowColumnCount() const; + + // get the first currently visible units + wxPosition GetVisibleBegin() const; + wxPosition GetVisibleEnd() const; + + // is this cell currently visible? + bool IsVisible(size_t row, size_t column) const; + bool IsVisible(const wxPosition &pos) const + { return IsVisible(pos.GetRow(), pos.GetColumn()); } +}; + + + +#if WXWIN_COMPATIBILITY_2_8 + +// =========================================================================== +// wxVarVScrollLegacyAdaptor +// =========================================================================== + +// Provides backwards compatible API for applications originally built using +// wxVScrolledWindow in 2.6 or 2.8. Originally, wxVScrolledWindow referred +// to scrolling "lines". We use "units" in wxVarScrollHelperBase to avoid +// implying any orientation (since the functions are used for both horizontal +// and vertical scrolling in derived classes). And in the new +// wxVScrolledWindow and wxHScrolledWindow classes, we refer to them as +// "rows" and "columns", respectively. This is to help clear some confusion +// in not only those classes, but also in wxHVScrolledWindow where functions +// are inherited from both. + +class WXDLLIMPEXP_CORE wxVarVScrollLegacyAdaptor : public wxVarVScrollHelper +{ +public: + // constructors and such + // --------------------- + wxVarVScrollLegacyAdaptor(wxWindow *winToScroll) + : wxVarVScrollHelper(winToScroll) + { + } + + // accessors + // --------- + + // this is the same as GetVisibleRowsBegin(), exists to match + // GetLastVisibleLine() and for backwards compatibility only + wxDEPRECATED( size_t GetFirstVisibleLine() const ); + + // get the last currently visible line + // + // this function is unsafe as it returns (size_t)-1 (i.e. a huge positive + // number) if the control is empty, use GetVisibleRowsEnd() instead, this + // one is kept for backwards compatibility + wxDEPRECATED( size_t GetLastVisibleLine() const ); + + // "line" to "unit" compatibility functions + // ---------------------------------------- + + // get the number of lines this window contains (set by SetLineCount()) + wxDEPRECATED( size_t GetLineCount() const ); + + // set the number of lines the helper contains: the derived class must + // provide the sizes for all lines with indices up to the one given here + // in its OnGetLineHeight() + wxDEPRECATED( void SetLineCount(size_t count) ); + + // redraw the specified line + wxDEPRECATED( virtual void RefreshLine(size_t line) ); + + // redraw all lines in the specified range (inclusive) + wxDEPRECATED( virtual void RefreshLines(size_t from, size_t to) ); + + // scroll to the specified line: it will become the first visible line in + // the window + // + // return true if we scrolled the window, false if nothing was done + wxDEPRECATED( bool ScrollToLine(size_t line) ); + + // scroll by the specified number of lines/pages + wxDEPRECATED( virtual bool ScrollLines(int lines) ); + wxDEPRECATED( virtual bool ScrollPages(int pages) ); + +protected: + // unless the code has been updated to override OnGetRowHeight() instead, + // this function must be overridden in the derived class and it should + // return the height of the given row in pixels + wxDEPRECATED_BUT_USED_INTERNALLY( + virtual wxCoord OnGetLineHeight(size_t n) const ); + + // forwards the calls from base class pure virtual function to pure virtual + // OnGetLineHeight instead (backwards compatible name) + // note that we don't need to forward OnGetUnitSize() as it is already + // forwarded to OnGetRowHeight() in wxVarVScrollHelper + virtual wxCoord OnGetRowHeight(size_t n) const; + + // this function doesn't have to be overridden but it may be useful to do + // it if calculating the lines heights is a relatively expensive operation + // as it gives the user code a possibility to calculate several of them at + // once + // + // OnGetLinesHint() is normally called just before OnGetLineHeight() but you + // shouldn't rely on the latter being called for all lines in the interval + // specified here. It is also possible that OnGetLineHeight() will be + // called for the lines outside of this interval, so this is really just a + // hint, not a promise. + // + // finally note that lineMin is inclusive, while lineMax is exclusive, as + // usual + wxDEPRECATED_BUT_USED_INTERNALLY( virtual void OnGetLinesHint( + size_t lineMin, size_t lineMax) const ); + + // forwards the calls from base class pure virtual function to pure virtual + // OnGetLinesHint instead (backwards compatible name) + void OnGetRowsHeightHint(size_t rowMin, size_t rowMax) const; +}; + +#else // !WXWIN_COMPATIBILITY_2_8 + +// shortcut to avoid checking compatibility modes later +// remove this and all references to wxVarVScrollLegacyAdaptor once +// wxWidgets 2.6 and 2.8 compatibility is removed +typedef wxVarVScrollHelper wxVarVScrollLegacyAdaptor; + +#endif // WXWIN_COMPATIBILITY_2_8/!WXWIN_COMPATIBILITY_2_8 + + +// this macro must be used in declaration of wxVarScrollHelperBase-derived +// classes +#define WX_FORWARD_TO_VAR_SCROLL_HELPER() \ +public: \ + virtual void PrepareDC(wxDC& dc) { DoPrepareDC(dc); } \ + virtual bool Layout() { return ScrollLayout(); } + + + +// =========================================================================== +// wxVScrolledWindow +// =========================================================================== + +// In the name of this class, "V" may stand for "variable" because it can be +// used for scrolling rows of variable heights; "virtual", because it is not +// necessary to know the heights of all rows in advance -- only those which +// are shown on the screen need to be measured; or even "vertical", because +// this class only supports scrolling vertically. + +// In any case, this is a generalization of the wxScrolledWindow class which +// can be only used when all rows have the same heights. It lacks some other +// wxScrolledWindow features however, notably it can't scroll only a rectangle +// of the window and not its entire client area. + +class WXDLLIMPEXP_CORE wxVScrolledWindow : public wxPanel, + public wxVarVScrollLegacyAdaptor +{ +public: + // constructors and such + // --------------------- + + // default ctor, you must call Create() later + wxVScrolledWindow() : wxVarVScrollLegacyAdaptor(this) { } + + // normal ctor, no need to call Create() after this one + // + // note that wxVSCROLL is always automatically added to our style, there is + // no need to specify it explicitly + wxVScrolledWindow(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr) + : wxVarVScrollLegacyAdaptor(this) + { + (void)Create(parent, id, pos, size, style, name); + } + + // same as the previous ctor but returns status code: true if ok + // + // just as with the ctor above, wxVSCROLL style is always used, there is no + // need to specify it + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr) + { + return wxPanel::Create(parent, id, pos, size, style | wxVSCROLL, name); + } + +#if WXWIN_COMPATIBILITY_2_8 + // Make sure we prefer our version of HitTest rather than wxWindow's + // These functions should no longer be masked in favor of VirtualHitTest() + int HitTest(wxCoord WXUNUSED(x), wxCoord y) const + { return wxVarVScrollHelper::VirtualHitTest(y); } + int HitTest(const wxPoint& pt) const + { return HitTest(pt.x, pt.y); } +#endif // WXWIN_COMPATIBILITY_2_8 + + WX_FORWARD_TO_VAR_SCROLL_HELPER() + +#ifdef __WXMAC__ +protected: + virtual void UpdateMacScrollWindow() { Update(); } +#endif // __WXMAC__ + +private: + wxDECLARE_NO_COPY_CLASS(wxVScrolledWindow); + DECLARE_ABSTRACT_CLASS(wxVScrolledWindow) +}; + + + +// =========================================================================== +// wxHScrolledWindow +// =========================================================================== + +// In the name of this class, "H" stands for "horizontal" because it can be +// used for scrolling columns of variable widths. It is not necessary to know +// the widths of all columns in advance -- only those which are shown on the +// screen need to be measured. + +// This is a generalization of the wxScrolledWindow class which can be only +// used when all columns have the same width. It lacks some other +// wxScrolledWindow features however, notably it can't scroll only a rectangle +// of the window and not its entire client area. + +class WXDLLIMPEXP_CORE wxHScrolledWindow : public wxPanel, + public wxVarHScrollHelper +{ +public: + // constructors and such + // --------------------- + + // default ctor, you must call Create() later + wxHScrolledWindow() : wxVarHScrollHelper(this) { } + + // normal ctor, no need to call Create() after this one + // + // note that wxHSCROLL is always automatically added to our style, there is + // no need to specify it explicitly + wxHScrolledWindow(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr) + : wxVarHScrollHelper(this) + { + (void)Create(parent, id, pos, size, style, name); + } + + // same as the previous ctor but returns status code: true if ok + // + // just as with the ctor above, wxHSCROLL style is always used, there is no + // need to specify it + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr) + { + return wxPanel::Create(parent, id, pos, size, style | wxHSCROLL, name); + } + + WX_FORWARD_TO_VAR_SCROLL_HELPER() + +#ifdef __WXMAC__ +protected: + virtual void UpdateMacScrollWindow() { Update(); } +#endif // __WXMAC__ + +private: + wxDECLARE_NO_COPY_CLASS(wxHScrolledWindow); + DECLARE_ABSTRACT_CLASS(wxHScrolledWindow) +}; + + + +// =========================================================================== +// wxHVScrolledWindow +// =========================================================================== + +// This window inherits all functionality of both vertical and horizontal +// scrolled windows automatically handling everything needed to scroll both +// axis simultaneously. + +class WXDLLIMPEXP_CORE wxHVScrolledWindow : public wxPanel, + public wxVarHVScrollHelper +{ +public: + // constructors and such + // --------------------- + + // default ctor, you must call Create() later + wxHVScrolledWindow() + : wxPanel(), + wxVarHVScrollHelper(this) { } + + // normal ctor, no need to call Create() after this one + // + // note that wxVSCROLL and wxHSCROLL are always automatically added to our + // style, there is no need to specify them explicitly + wxHVScrolledWindow(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr) + : wxPanel(), + wxVarHVScrollHelper(this) + { + (void)Create(parent, id, pos, size, style, name); + } + + // same as the previous ctor but returns status code: true if ok + // + // just as with the ctor above, wxVSCROLL and wxHSCROLL styles are always + // used, there is no need to specify them + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr) + { + return wxPanel::Create(parent, id, pos, size, + style | wxVSCROLL | wxHSCROLL, name); + } + + WX_FORWARD_TO_VAR_SCROLL_HELPER() + +#ifdef __WXMAC__ +protected: + virtual void UpdateMacScrollWindow() { Update(); } +#endif // __WXMAC__ + +private: + wxDECLARE_NO_COPY_CLASS(wxHVScrolledWindow); + DECLARE_ABSTRACT_CLASS(wxHVScrolledWindow) +}; + +#endif // _WX_VSCROLL_H_ + diff --git a/wxmsw/include/wx-3.0/wx/weakref.h b/wxmsw/include/wx-3.0/wx/weakref.h new file mode 100644 index 00000000..b692f037 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/weakref.h @@ -0,0 +1,352 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/weakref.h +// Purpose: wxWeakRef - Generic weak references for wxWidgets +// Author: Arne Steinarson +// Created: 27 Dec 07 +// Copyright: (c) 2007 Arne Steinarson +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WEAKREF_H_ +#define _WX_WEAKREF_H_ + +#include "wx/tracker.h" + + +// Some compilers (VC6, Borland, g++ < 3.3) have problem with template specialization. +// However, this is only used for optimization purposes (a smaller wxWeakRef pointer) +// (and the corner case of wxWeakRef<wxObject>). So for those compilers, we can fall +// back to the non-optimal case, where we use the same type of weak ref (static one) +// in all cases. See defs.h for various setting these defines depending on compiler. + +#if !defined(HAVE_PARTIAL_SPECIALIZATION) || \ + !defined(HAVE_TEMPLATE_OVERLOAD_RESOLUTION) || \ + (defined(__GNUC__) && !wxCHECK_GCC_VERSION(3, 3)) + #define USE_ONLY_STATIC_WEAKREF +#endif + + +#ifndef USE_ONLY_STATIC_WEAKREF + +// Avoid including this for simpler compilers +#include "wx/meta/convertible.h" +#include "wx/meta/int2type.h" + +template <class T> +struct wxIsStaticTrackable +{ + enum { value = wxConvertibleTo<T, wxTrackable>::value }; +}; + +#endif // !USE_ONLY_STATIC_WEAKREF + + +// Weak ref implementation when T has wxTrackable as a known base class +template <class T> +class wxWeakRefStatic : public wxTrackerNode +{ +public: + wxWeakRefStatic() : m_pobj(NULL) { } + + void Release() + { + // Release old object if any + if ( m_pobj ) + { + // Remove ourselves from object tracker list + wxTrackable *pt = static_cast<wxTrackable*>(m_pobj); + pt->RemoveNode(this); + m_pobj = NULL; + } + } + + virtual void OnObjectDestroy() + { + // Tracked object itself removes us from list of trackers + wxASSERT(m_pobj != NULL); + m_pobj = NULL; + } + +protected: + void Assign(T* pobj) + { + if ( m_pobj == pobj ) + return; + + Release(); + + // Now set new trackable object + if ( pobj ) + { + // Add ourselves to object tracker list + wxTrackable *pt = static_cast<wxTrackable*>(pobj); + pt->AddNode(this); + m_pobj = pobj; + } + } + + void AssignCopy(const wxWeakRefStatic& wr) + { + Assign( wr.m_pobj ); + } + + T *m_pobj; +}; + + + +#ifndef USE_ONLY_STATIC_WEAKREF + +template<class T,bool use_static> +struct wxWeakRefImpl; + +// Intermediate class, to select the static case above. +template <class T> +struct wxWeakRefImpl<T, true> : public wxWeakRefStatic<T> +{ + enum { value = 1 }; +}; + +// Weak ref implementation when T does not have wxTrackable as known base class +template<class T> +struct wxWeakRefImpl<T, false> : public wxTrackerNode +{ + void Release() + { + // Release old object if any + if ( m_pobj ) + { + // Remove ourselves from object tracker list + m_ptbase->RemoveNode(this); + m_pobj = NULL; + m_ptbase = NULL; + } + } + + virtual void OnObjectDestroy() + { + // Tracked object itself removes us from list of trackers + wxASSERT(m_pobj != NULL); + m_pobj = NULL; + m_ptbase = NULL; + } + +protected: + wxWeakRefImpl() : m_pobj(NULL), m_ptbase(NULL) { } + + // Assign receives most derived class here and can use that + template <class TDerived> + void Assign( TDerived* pobj ) + { + AssignHelper( pobj, wxInt2Type<wxIsStaticTrackable<TDerived>::value>() ); + } + + template <class TDerived> + void AssignHelper(TDerived* pobj, wxInt2Type<true>) + { + wxTrackable *ptbase = static_cast<wxTrackable*>(pobj); + DoAssign( pobj, ptbase ); + } + +#ifndef wxNO_RTTI + void AssignHelper(T* pobj, wxInt2Type<false>) + { + // A last way to get a trackable pointer + wxTrackable *ptbase = dynamic_cast<wxTrackable*>(pobj); + if ( ptbase ) + { + DoAssign( pobj, ptbase ); + } + else + { + wxFAIL_MSG( "Tracked class should inherit from wxTrackable" ); + + Release(); + } + } +#endif // RTTI enabled + + void AssignCopy(const wxWeakRefImpl& wr) + { + DoAssign(wr.m_pobj, wr.m_ptbase); + } + + void DoAssign( T* pobj, wxTrackable *ptbase ) { + if( m_pobj==pobj ) return; + Release(); + + // Now set new trackable object + if( pobj ) + { + // Add ourselves to object tracker list + wxASSERT( ptbase ); + ptbase->AddNode( this ); + m_pobj = pobj; + m_ptbase = ptbase; + } + } + + T *m_pobj; + wxTrackable *m_ptbase; +}; + +#endif // #ifndef USE_ONLY_STATIC_WEAKREF + + + +// A weak reference to an object of type T, where T has base wxTrackable +// (usually statically but if not dynamic_cast<> is tried). +template <class T> +class wxWeakRef : public +#ifdef USE_ONLY_STATIC_WEAKREF + wxWeakRefStatic<T> +#else + wxWeakRefImpl<T, wxIsStaticTrackable<T>::value != 0> +#endif +{ +public: + typedef T element_type; + + // Default ctor + wxWeakRef() { } + + // Enabling this ctor for VC6 results in mysterious compilation failures in + // wx/window.h when assigning wxWindow pointers (FIXME-VC6) +#ifndef __VISUALC6__ + // Ctor from the object of this type: this is needed as the template ctor + // below is not used by at least g++4 when a literal NULL is used + wxWeakRef(T *pobj) + { + this->Assign(pobj); + } +#endif // !__VISUALC6__ + + // When we have the full type here, static_cast<> will always work + // (or give a straight compiler error). + template <class TDerived> + wxWeakRef(TDerived* pobj) + { + this->Assign(pobj); + } + + // We need this copy ctor, since otherwise a default compiler (binary) copy + // happens (if embedded as an object member). + wxWeakRef(const wxWeakRef<T>& wr) + { + this->Assign(wr.get()); + } + + wxWeakRef<T>& operator=(const wxWeakRef<T>& wr) + { + this->AssignCopy(wr); + return *this; + } + + virtual ~wxWeakRef() { this->Release(); } + + // Smart pointer functions + T& operator*() const { return *this->m_pobj; } + T* operator->() const { return this->m_pobj; } + + T* get() const { return this->m_pobj; } + operator T*() const { return this->m_pobj; } +}; + + +#ifndef wxNO_RTTI + +// Weak ref implementation assign objects are queried for wxTrackable +// using dynamic_cast<> +template <class T> +class wxWeakRefDynamic : public wxTrackerNode +{ +public: + wxWeakRefDynamic() : m_pobj(NULL) { } + + wxWeakRefDynamic(T* pobj) : m_pobj(pobj) + { + Assign(pobj); + } + + wxWeakRefDynamic(const wxWeakRef<T>& wr) + { + Assign(wr.get()); + } + + virtual ~wxWeakRefDynamic() { Release(); } + + // Smart pointer functions + T& operator*() const { wxASSERT(m_pobj); return *m_pobj; } + T* operator->() const { wxASSERT(m_pobj); return m_pobj; } + + T* get() const { return m_pobj; } + operator T* () const { return m_pobj; } + + T* operator = (T* pobj) { Assign(pobj); return m_pobj; } + + // Assign from another weak ref, point to same object + T* operator = (const wxWeakRef<T> &wr) { Assign( wr.get() ); return m_pobj; } + + void Release() + { + // Release old object if any + if( m_pobj ) + { + // Remove ourselves from object tracker list + wxTrackable *pt = dynamic_cast<wxTrackable*>(m_pobj); + wxASSERT(pt); + pt->RemoveNode(this); + m_pobj = NULL; + } + } + + virtual void OnObjectDestroy() + { + wxASSERT_MSG(m_pobj, "tracked object should have removed us itself"); + + m_pobj = NULL; + } + +protected: + void Assign(T *pobj) + { + if ( m_pobj == pobj ) + return; + + Release(); + + // Now set new trackable object + if ( pobj ) + { + // Add ourselves to object tracker list + wxTrackable *pt = dynamic_cast<wxTrackable*>(pobj); + if ( pt ) + { + pt->AddNode(this); + m_pobj = pobj; + } + else + { + // If the object we want to track does not support wxTackable, then + // log a message and keep the NULL object pointer. + wxFAIL_MSG( "Tracked class should inherit from wxTrackable" ); + } + } + } + + T *m_pobj; +}; + +#endif // RTTI enabled + + +// Provide some basic types of weak references +class WXDLLIMPEXP_FWD_BASE wxEvtHandler; +class WXDLLIMPEXP_FWD_CORE wxWindow; + + +typedef wxWeakRef<wxEvtHandler> wxEvtHandlerRef; +typedef wxWeakRef<wxWindow> wxWindowRef; + +#endif // _WX_WEAKREF_H_ + diff --git a/wxmsw/include/wx-3.0/wx/webview.h b/wxmsw/include/wx-3.0/wx/webview.h new file mode 100644 index 00000000..25a235da --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/webview.h @@ -0,0 +1,304 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: webview.h +// Purpose: Common interface and events for web view component +// Author: Marianne Gagnon +// Copyright: (c) 2010 Marianne Gagnon, 2011 Steven Lamerton +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WEBVIEW_H_ +#define _WX_WEBVIEW_H_ + +#include "wx/defs.h" + +#if wxUSE_WEBVIEW + +#include "wx/control.h" +#include "wx/event.h" +#include "wx/sstream.h" +#include "wx/sharedptr.h" +#include "wx/vector.h" + +#if defined(__WXOSX__) + #include "wx/osx/webviewhistoryitem_webkit.h" +#elif defined(__WXGTK__) + #include "wx/gtk/webviewhistoryitem_webkit.h" +#elif defined(__WXMSW__) + #include "wx/msw/webviewhistoryitem_ie.h" +#else + #error "wxWebView not implemented on this platform." +#endif + +class wxFSFile; +class wxFileSystem; +class wxWebView; + +enum wxWebViewZoom +{ + wxWEBVIEW_ZOOM_TINY, + wxWEBVIEW_ZOOM_SMALL, + wxWEBVIEW_ZOOM_MEDIUM, + wxWEBVIEW_ZOOM_LARGE, + wxWEBVIEW_ZOOM_LARGEST +}; + +enum wxWebViewZoomType +{ + //Scales entire page, including images + wxWEBVIEW_ZOOM_TYPE_LAYOUT, + wxWEBVIEW_ZOOM_TYPE_TEXT +}; + +enum wxWebViewNavigationError +{ + wxWEBVIEW_NAV_ERR_CONNECTION, + wxWEBVIEW_NAV_ERR_CERTIFICATE, + wxWEBVIEW_NAV_ERR_AUTH, + wxWEBVIEW_NAV_ERR_SECURITY, + wxWEBVIEW_NAV_ERR_NOT_FOUND, + wxWEBVIEW_NAV_ERR_REQUEST, + wxWEBVIEW_NAV_ERR_USER_CANCELLED, + wxWEBVIEW_NAV_ERR_OTHER +}; + +enum wxWebViewReloadFlags +{ + //Default, may access cache + wxWEBVIEW_RELOAD_DEFAULT, + wxWEBVIEW_RELOAD_NO_CACHE +}; + +enum wxWebViewFindFlags +{ + wxWEBVIEW_FIND_WRAP = 0x0001, + wxWEBVIEW_FIND_ENTIRE_WORD = 0x0002, + wxWEBVIEW_FIND_MATCH_CASE = 0x0004, + wxWEBVIEW_FIND_HIGHLIGHT_RESULT = 0x0008, + wxWEBVIEW_FIND_BACKWARDS = 0x0010, + wxWEBVIEW_FIND_DEFAULT = 0 +}; + +//Base class for custom scheme handlers +class WXDLLIMPEXP_WEBVIEW wxWebViewHandler +{ +public: + wxWebViewHandler(const wxString& scheme) : m_scheme(scheme) {} + virtual ~wxWebViewHandler() {} + virtual wxString GetName() const { return m_scheme; } + virtual wxFSFile* GetFile(const wxString &uri) = 0; +private: + wxString m_scheme; +}; + +extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewNameStr[]; +extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewDefaultURLStr[]; +extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendDefault[]; +extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendIE[]; +extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendWebKit[]; + +class WXDLLIMPEXP_WEBVIEW wxWebViewFactory : public wxObject +{ +public: + virtual wxWebView* Create() = 0; + virtual wxWebView* Create(wxWindow* parent, + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxWebViewNameStr) = 0; +}; + +WX_DECLARE_STRING_HASH_MAP(wxSharedPtr<wxWebViewFactory>, wxStringWebViewFactoryMap); + +class WXDLLIMPEXP_WEBVIEW wxWebView : public wxControl +{ +public: + wxWebView() + { + m_showMenu = true; + } + + virtual ~wxWebView() {} + + virtual bool Create(wxWindow* parent, + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxWebViewNameStr) = 0; + + // Factory methods allowing the use of custom factories registered with + // RegisterFactory + static wxWebView* New(const wxString& backend = wxWebViewBackendDefault); + static wxWebView* New(wxWindow* parent, + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxString& backend = wxWebViewBackendDefault, + long style = 0, + const wxString& name = wxWebViewNameStr); + + static void RegisterFactory(const wxString& backend, + wxSharedPtr<wxWebViewFactory> factory); + + // General methods + virtual void EnableContextMenu(bool enable = true) + { + m_showMenu = enable; + } + virtual wxString GetCurrentTitle() const = 0; + virtual wxString GetCurrentURL() const = 0; + // TODO: handle choosing a frame when calling GetPageSource()? + virtual wxString GetPageSource() const = 0; + virtual wxString GetPageText() const = 0; + virtual bool IsBusy() const = 0; + virtual bool IsContextMenuEnabled() const { return m_showMenu; } + virtual bool IsEditable() const = 0; + virtual void LoadURL(const wxString& url) = 0; + virtual void Print() = 0; + virtual void RegisterHandler(wxSharedPtr<wxWebViewHandler> handler) = 0; + virtual void Reload(wxWebViewReloadFlags flags = wxWEBVIEW_RELOAD_DEFAULT) = 0; + virtual void RunScript(const wxString& javascript) = 0; + virtual void SetEditable(bool enable = true) = 0; + void SetPage(const wxString& html, const wxString& baseUrl) + { + DoSetPage(html, baseUrl); + } + void SetPage(wxInputStream& html, wxString baseUrl) + { + wxStringOutputStream stream; + stream.Write(html); + DoSetPage(stream.GetString(), baseUrl); + } + virtual void Stop() = 0; + + //History + virtual bool CanGoBack() const = 0; + virtual bool CanGoForward() const = 0; + virtual void GoBack() = 0; + virtual void GoForward() = 0; + virtual void ClearHistory() = 0; + virtual void EnableHistory(bool enable = true) = 0; + virtual wxVector<wxSharedPtr<wxWebViewHistoryItem> > GetBackwardHistory() = 0; + virtual wxVector<wxSharedPtr<wxWebViewHistoryItem> > GetForwardHistory() = 0; + virtual void LoadHistoryItem(wxSharedPtr<wxWebViewHistoryItem> item) = 0; + + //Zoom + virtual bool CanSetZoomType(wxWebViewZoomType type) const = 0; + virtual wxWebViewZoom GetZoom() const = 0; + virtual wxWebViewZoomType GetZoomType() const = 0; + virtual void SetZoom(wxWebViewZoom zoom) = 0; + virtual void SetZoomType(wxWebViewZoomType zoomType) = 0; + + //Selection + virtual void SelectAll() = 0; + virtual bool HasSelection() const = 0; + virtual void DeleteSelection() = 0; + virtual wxString GetSelectedText() const = 0; + virtual wxString GetSelectedSource() const = 0; + virtual void ClearSelection() = 0; + + //Clipboard functions + virtual bool CanCut() const = 0; + virtual bool CanCopy() const = 0; + virtual bool CanPaste() const = 0; + virtual void Cut() = 0; + virtual void Copy() = 0; + virtual void Paste() = 0; + + //Undo / redo functionality + virtual bool CanUndo() const = 0; + virtual bool CanRedo() const = 0; + virtual void Undo() = 0; + virtual void Redo() = 0; + + //Get the pointer to the underlying native engine. + virtual void* GetNativeBackend() const = 0; + //Find function + virtual long Find(const wxString& text, int flags = wxWEBVIEW_FIND_DEFAULT) = 0; + +protected: + virtual void DoSetPage(const wxString& html, const wxString& baseUrl) = 0; + +private: + static void InitFactoryMap(); + static wxStringWebViewFactoryMap::iterator FindFactory(const wxString &backend); + + bool m_showMenu; + static wxStringWebViewFactoryMap m_factoryMap; + + wxDECLARE_ABSTRACT_CLASS(wxWebView); +}; + +class WXDLLIMPEXP_WEBVIEW wxWebViewEvent : public wxNotifyEvent +{ +public: + wxWebViewEvent() {} + wxWebViewEvent(wxEventType type, int id, const wxString url, + const wxString target) + : wxNotifyEvent(type, id), m_url(url), m_target(target) + {} + + + const wxString& GetURL() const { return m_url; } + const wxString& GetTarget() const { return m_target; } + + virtual wxEvent* Clone() const { return new wxWebViewEvent(*this); } +private: + wxString m_url; + wxString m_target; + + wxDECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxWebViewEvent); +}; + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_NAVIGATING, wxWebViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_NAVIGATED, wxWebViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_LOADED, wxWebViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_ERROR, wxWebViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_NEWWINDOW, wxWebViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_TITLE_CHANGED, wxWebViewEvent ); + +typedef void (wxEvtHandler::*wxWebViewEventFunction) + (wxWebViewEvent&); + +#define wxWebViewEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxWebViewEventFunction, func) + +#define EVT_WEBVIEW_NAVIGATING(id, fn) \ + wx__DECLARE_EVT1(wxEVT_WEBVIEW_NAVIGATING, id, \ + wxWebViewEventHandler(fn)) + +#define EVT_WEBVIEW_NAVIGATED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_WEBVIEW_NAVIGATED, id, \ + wxWebViewEventHandler(fn)) + +#define EVT_WEBVIEW_LOADED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_WEBVIEW_LOADED, id, \ + wxWebViewEventHandler(fn)) + +#define EVT_WEBVIEW_ERROR(id, fn) \ + wx__DECLARE_EVT1(wxEVT_WEBVIEW_ERROR, id, \ + wxWebViewEventHandler(fn)) + +#define EVT_WEBVIEW_NEWWINDOW(id, fn) \ + wx__DECLARE_EVT1(wxEVT_WEBVIEW_NEWWINDOW, id, \ + wxWebViewEventHandler(fn)) + +#define EVT_WEBVIEW_TITLE_CHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_WEBVIEW_TITLE_CHANGED, id, \ + wxWebViewEventHandler(fn)) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_WEBVIEW_NAVIGATING wxEVT_WEBVIEW_NAVIGATING +#define wxEVT_COMMAND_WEBVIEW_NAVIGATED wxEVT_WEBVIEW_NAVIGATED +#define wxEVT_COMMAND_WEBVIEW_LOADED wxEVT_WEBVIEW_LOADED +#define wxEVT_COMMAND_WEBVIEW_ERROR wxEVT_WEBVIEW_ERROR +#define wxEVT_COMMAND_WEBVIEW_NEWWINDOW wxEVT_WEBVIEW_NEWWINDOW +#define wxEVT_COMMAND_WEBVIEW_TITLE_CHANGED wxEVT_WEBVIEW_TITLE_CHANGED + +#endif // wxUSE_WEBVIEW + +#endif // _WX_WEBVIEW_H_ diff --git a/wxmsw/include/wx-3.0/wx/webviewarchivehandler.h b/wxmsw/include/wx-3.0/wx/webviewarchivehandler.h new file mode 100644 index 00000000..8b2eb199 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/webviewarchivehandler.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: webviewarchivehandler.h +// Purpose: Custom webview handler to allow archive browsing +// Author: Steven Lamerton +// Copyright: (c) 2011 Steven Lamerton +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WEBVIEW_FILE_HANDLER_H_ +#define _WX_WEBVIEW_FILE_HANDLER_H_ + +#include "wx/setup.h" + +#if wxUSE_WEBVIEW + +class wxFSFile; +class wxFileSystem; + +#include "wx/webview.h" + +//Loads from uris such as scheme:///C:/example/example.html or archives such as +//scheme:///C:/example/example.zip;protocol=zip/example.html + +class WXDLLIMPEXP_WEBVIEW wxWebViewArchiveHandler : public wxWebViewHandler +{ +public: + wxWebViewArchiveHandler(const wxString& scheme); + virtual ~wxWebViewArchiveHandler(); + virtual wxFSFile* GetFile(const wxString &uri); +private: + wxFileSystem* m_fileSystem; +}; + +#endif // wxUSE_WEBVIEW + +#endif // _WX_WEBVIEW_FILE_HANDLER_H_ diff --git a/wxmsw/include/wx-3.0/wx/webviewfshandler.h b/wxmsw/include/wx-3.0/wx/webviewfshandler.h new file mode 100644 index 00000000..ebdbbcb9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/webviewfshandler.h @@ -0,0 +1,37 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: webviewfshandler.h +// Purpose: Custom webview handler for virtual file system +// Author: Nick Matthews +// Copyright: (c) 2012 Steven Lamerton +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// Based on webviewarchivehandler.h file by Steven Lamerton + +#ifndef _WX_WEBVIEW_FS_HANDLER_H_ +#define _WX_WEBVIEW_FS_HANDLER_H_ + +#include "wx/setup.h" + +#if wxUSE_WEBVIEW + +class wxFSFile; +class wxFileSystem; + +#include "wx/webview.h" + +//Loads from uris such as scheme:example.html + +class WXDLLIMPEXP_WEBVIEW wxWebViewFSHandler : public wxWebViewHandler +{ +public: + wxWebViewFSHandler(const wxString& scheme); + virtual ~wxWebViewFSHandler(); + virtual wxFSFile* GetFile(const wxString &uri); +private: + wxFileSystem* m_fileSystem; +}; + +#endif // wxUSE_WEBVIEW + +#endif // _WX_WEBVIEW_FS_HANDLER_H_ diff --git a/wxmsw/include/wx-3.0/wx/wfstream.h b/wxmsw/include/wx-3.0/wx/wfstream.h new file mode 100644 index 00000000..613b4c27 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/wfstream.h @@ -0,0 +1,263 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/wfstream.h +// Purpose: File stream classes +// Author: Guilhem Lavaux +// Modified by: +// Created: 11/07/98 +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WXFSTREAM_H__ +#define _WX_WXFSTREAM_H__ + +#include "wx/defs.h" + +#if wxUSE_STREAMS + +#include "wx/object.h" +#include "wx/string.h" +#include "wx/stream.h" +#include "wx/file.h" +#include "wx/ffile.h" + +#if wxUSE_FILE + +// ---------------------------------------------------------------------------- +// wxFileStream using wxFile +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFileInputStream : public wxInputStream +{ +public: + wxFileInputStream(const wxString& ifileName); + wxFileInputStream(wxFile& file); + wxFileInputStream(int fd); + virtual ~wxFileInputStream(); + + wxFileOffset GetLength() const; + + bool Ok() const { return IsOk(); } + virtual bool IsOk() const; + bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; } + + wxFile* GetFile() const { return m_file; } + +protected: + wxFileInputStream(); + + size_t OnSysRead(void *buffer, size_t size); + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + wxFileOffset OnSysTell() const; + +protected: + wxFile *m_file; + bool m_file_destroy; + + wxDECLARE_NO_COPY_CLASS(wxFileInputStream); +}; + +class WXDLLIMPEXP_BASE wxFileOutputStream : public wxOutputStream +{ +public: + wxFileOutputStream(const wxString& fileName); + wxFileOutputStream(wxFile& file); + wxFileOutputStream(int fd); + virtual ~wxFileOutputStream(); + + void Sync(); + bool Close() { return m_file_destroy ? m_file->Close() : true; } + wxFileOffset GetLength() const; + + bool Ok() const { return IsOk(); } + virtual bool IsOk() const; + bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; } + + wxFile* GetFile() const { return m_file; } + +protected: + wxFileOutputStream(); + + size_t OnSysWrite(const void *buffer, size_t size); + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + wxFileOffset OnSysTell() const; + +protected: + wxFile *m_file; + bool m_file_destroy; + + wxDECLARE_NO_COPY_CLASS(wxFileOutputStream); +}; + +class WXDLLIMPEXP_BASE wxTempFileOutputStream : public wxOutputStream +{ +public: + wxTempFileOutputStream(const wxString& fileName); + virtual ~wxTempFileOutputStream(); + + bool Close() { return Commit(); } + WXDLLIMPEXP_INLINE_BASE virtual bool Commit() { return m_file->Commit(); } + WXDLLIMPEXP_INLINE_BASE virtual void Discard() { m_file->Discard(); } + + wxFileOffset GetLength() const { return m_file->Length(); } + bool IsSeekable() const { return true; } + +protected: + size_t OnSysWrite(const void *buffer, size_t size); + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode) + { return m_file->Seek(pos, mode); } + wxFileOffset OnSysTell() const { return m_file->Tell(); } + +private: + wxTempFile *m_file; + + wxDECLARE_NO_COPY_CLASS(wxTempFileOutputStream); +}; + +class WXDLLIMPEXP_BASE wxFileStream : public wxFileInputStream, + public wxFileOutputStream +{ +public: + wxFileStream(const wxString& fileName); + virtual bool IsOk() const; + + // override (some) virtual functions inherited from both classes to resolve + // ambiguities (this wouldn't be necessary if wxStreamBase were a virtual + // base class but it isn't) + + virtual bool IsSeekable() const + { + return wxFileInputStream::IsSeekable(); + } + + virtual wxFileOffset GetLength() const + { + return wxFileInputStream::GetLength(); + } + +protected: + virtual wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode) + { + return wxFileInputStream::OnSysSeek(pos, mode); + } + + virtual wxFileOffset OnSysTell() const + { + return wxFileInputStream::OnSysTell(); + } + +private: + wxDECLARE_NO_COPY_CLASS(wxFileStream); +}; + +#endif //wxUSE_FILE + +#if wxUSE_FFILE + +// ---------------------------------------------------------------------------- +// wxFFileStream using wxFFile +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFFileInputStream : public wxInputStream +{ +public: + wxFFileInputStream(const wxString& fileName, const wxString& mode = "rb"); + wxFFileInputStream(wxFFile& file); + wxFFileInputStream(FILE *file); + virtual ~wxFFileInputStream(); + + wxFileOffset GetLength() const; + + bool Ok() const { return IsOk(); } + virtual bool IsOk() const; + bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; } + + wxFFile* GetFile() const { return m_file; } + +protected: + wxFFileInputStream(); + + size_t OnSysRead(void *buffer, size_t size); + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + wxFileOffset OnSysTell() const; + +protected: + wxFFile *m_file; + bool m_file_destroy; + + wxDECLARE_NO_COPY_CLASS(wxFFileInputStream); +}; + +class WXDLLIMPEXP_BASE wxFFileOutputStream : public wxOutputStream +{ +public: + wxFFileOutputStream(const wxString& fileName, const wxString& mode = "wb"); + wxFFileOutputStream(wxFFile& file); + wxFFileOutputStream(FILE *file); + virtual ~wxFFileOutputStream(); + + void Sync(); + bool Close() { return m_file_destroy ? m_file->Close() : true; } + wxFileOffset GetLength() const; + + bool Ok() const { return IsOk(); } + virtual bool IsOk() const; + bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; } + + wxFFile* GetFile() const { return m_file; } + +protected: + wxFFileOutputStream(); + + size_t OnSysWrite(const void *buffer, size_t size); + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + wxFileOffset OnSysTell() const; + +protected: + wxFFile *m_file; + bool m_file_destroy; + + wxDECLARE_NO_COPY_CLASS(wxFFileOutputStream); +}; + +class WXDLLIMPEXP_BASE wxFFileStream : public wxFFileInputStream, + public wxFFileOutputStream +{ +public: + wxFFileStream(const wxString& fileName, const wxString& mode = "w+b"); + + // override some virtual functions to resolve ambiguities, just as in + // wxFileStream + + virtual bool IsOk() const; + + virtual bool IsSeekable() const + { + return wxFFileInputStream::IsSeekable(); + } + + virtual wxFileOffset GetLength() const + { + return wxFFileInputStream::GetLength(); + } + +protected: + virtual wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode) + { + return wxFFileInputStream::OnSysSeek(pos, mode); + } + + virtual wxFileOffset OnSysTell() const + { + return wxFFileInputStream::OnSysTell(); + } + +private: + wxDECLARE_NO_COPY_CLASS(wxFFileStream); +}; + +#endif //wxUSE_FFILE + +#endif // wxUSE_STREAMS + +#endif // _WX_WXFSTREAM_H__ diff --git a/wxmsw/include/wx-3.0/wx/window.h b/wxmsw/include/wx-3.0/wx/window.h new file mode 100644 index 00000000..fc37b819 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/window.h @@ -0,0 +1,2072 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/window.h +// Purpose: wxWindowBase class - the interface of wxWindow +// Author: Vadim Zeitlin +// Modified by: Ron Lee +// Created: 01/02/97 +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WINDOW_H_BASE_ +#define _WX_WINDOW_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers which we must include here +// ---------------------------------------------------------------------------- + +#include "wx/event.h" // the base class + +#include "wx/list.h" // defines wxWindowList + +#include "wx/cursor.h" // we have member variables of these classes +#include "wx/font.h" // so we can't do without them +#include "wx/colour.h" +#include "wx/region.h" +#include "wx/utils.h" +#include "wx/intl.h" + +#include "wx/validate.h" // for wxDefaultValidator (always include it) + +#if wxUSE_PALETTE + #include "wx/palette.h" +#endif // wxUSE_PALETTE + +#if wxUSE_ACCEL + #include "wx/accel.h" +#endif // wxUSE_ACCEL + +#if wxUSE_ACCESSIBILITY +#include "wx/access.h" +#endif + +// when building wxUniv/Foo we don't want the code for native menu use to be +// compiled in - it should only be used when building real wxFoo +#ifdef __WXUNIVERSAL__ + #define wxUSE_MENUS_NATIVE 0 +#else // !__WXUNIVERSAL__ + #define wxUSE_MENUS_NATIVE wxUSE_MENUS +#endif // __WXUNIVERSAL__/!__WXUNIVERSAL__ + + +// Define this macro if the corresponding operating system handles the state +// of children windows automatically when the parent is enabled/disabled. +// Otherwise wx itself must ensure that when the parent is disabled its +// children are disabled too, and their initial state is restored when the +// parent is enabled back. +#if defined(__WXMSW__) || defined(__WXPM__) + // must do everything ourselves + #undef wxHAS_NATIVE_ENABLED_MANAGEMENT +#else + #define wxHAS_NATIVE_ENABLED_MANAGEMENT +#endif + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxCaret; +class WXDLLIMPEXP_FWD_CORE wxControl; +class WXDLLIMPEXP_FWD_CORE wxCursor; +class WXDLLIMPEXP_FWD_CORE wxDC; +class WXDLLIMPEXP_FWD_CORE wxDropTarget; +class WXDLLIMPEXP_FWD_CORE wxLayoutConstraints; +class WXDLLIMPEXP_FWD_CORE wxSizer; +class WXDLLIMPEXP_FWD_CORE wxToolTip; +class WXDLLIMPEXP_FWD_CORE wxWindowBase; +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxScrollHelper; + +#if wxUSE_ACCESSIBILITY +class WXDLLIMPEXP_FWD_CORE wxAccessible; +#endif + +// ---------------------------------------------------------------------------- +// helper stuff used by wxWindow +// ---------------------------------------------------------------------------- + +// struct containing all the visual attributes of a control +struct WXDLLIMPEXP_CORE wxVisualAttributes +{ + // the font used for control label/text inside it + wxFont font; + + // the foreground colour + wxColour colFg; + + // the background colour, may be wxNullColour if the controls background + // colour is not solid + wxColour colBg; +}; + +// different window variants, on platforms like eg mac uses different +// rendering sizes +enum wxWindowVariant +{ + wxWINDOW_VARIANT_NORMAL, // Normal size + wxWINDOW_VARIANT_SMALL, // Smaller size (about 25 % smaller than normal) + wxWINDOW_VARIANT_MINI, // Mini size (about 33 % smaller than normal) + wxWINDOW_VARIANT_LARGE, // Large size (about 25 % larger than normal) + wxWINDOW_VARIANT_MAX +}; + +#if wxUSE_SYSTEM_OPTIONS + #define wxWINDOW_DEFAULT_VARIANT wxT("window-default-variant") +#endif + +// valid values for Show/HideWithEffect() +enum wxShowEffect +{ + wxSHOW_EFFECT_NONE, + wxSHOW_EFFECT_ROLL_TO_LEFT, + wxSHOW_EFFECT_ROLL_TO_RIGHT, + wxSHOW_EFFECT_ROLL_TO_TOP, + wxSHOW_EFFECT_ROLL_TO_BOTTOM, + wxSHOW_EFFECT_SLIDE_TO_LEFT, + wxSHOW_EFFECT_SLIDE_TO_RIGHT, + wxSHOW_EFFECT_SLIDE_TO_TOP, + wxSHOW_EFFECT_SLIDE_TO_BOTTOM, + wxSHOW_EFFECT_BLEND, + wxSHOW_EFFECT_EXPAND, + wxSHOW_EFFECT_MAX +}; + +// flags for SendSizeEvent() +enum +{ + wxSEND_EVENT_POST = 1 +}; + +// ---------------------------------------------------------------------------- +// (pseudo)template list classes +// ---------------------------------------------------------------------------- + +WX_DECLARE_LIST_3(wxWindow, wxWindowBase, wxWindowList, wxWindowListNode, class WXDLLIMPEXP_CORE); + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +extern WXDLLIMPEXP_DATA_CORE(wxWindowList) wxTopLevelWindows; + +// declared here for compatibility only, main declaration is in wx/app.h +extern WXDLLIMPEXP_DATA_BASE(wxList) wxPendingDelete; + +// ---------------------------------------------------------------------------- +// wxWindowBase is the base class for all GUI controls/widgets, this is the public +// interface of this class. +// +// Event handler: windows have themselves as their event handlers by default, +// but their event handlers could be set to another object entirely. This +// separation can reduce the amount of derivation required, and allow +// alteration of a window's functionality (e.g. by a resource editor that +// temporarily switches event handlers). +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxWindowBase : public wxEvtHandler +{ +public: + // creating the window + // ------------------- + + // default ctor, initializes everything which can be initialized before + // Create() + wxWindowBase() ; + + virtual ~wxWindowBase(); + + // deleting the window + // ------------------- + + // ask the window to close itself, return true if the event handler + // honoured our request + bool Close( bool force = false ); + + // the following functions delete the C++ objects (the window itself + // or its children) as well as the GUI windows and normally should + // never be used directly + + // delete window unconditionally (dangerous!), returns true if ok + virtual bool Destroy(); + // delete all children of this window, returns true if ok + bool DestroyChildren(); + + // is the window being deleted? + bool IsBeingDeleted() const; + + // window attributes + // ----------------- + + // label is just the same as the title (but for, e.g., buttons it + // makes more sense to speak about labels), title access + // is available from wxTLW classes only (frames, dialogs) + virtual void SetLabel(const wxString& label) = 0; + virtual wxString GetLabel() const = 0; + + // the window name is used for ressource setting in X, it is not the + // same as the window title/label + virtual void SetName( const wxString &name ) { m_windowName = name; } + virtual wxString GetName() const { return m_windowName; } + + // sets the window variant, calls internally DoSetVariant if variant + // has changed + void SetWindowVariant(wxWindowVariant variant); + wxWindowVariant GetWindowVariant() const { return m_windowVariant; } + + + // get or change the layout direction (LTR or RTL) for this window, + // wxLayout_Default is returned if layout direction is not supported + virtual wxLayoutDirection GetLayoutDirection() const + { return wxLayout_Default; } + virtual void SetLayoutDirection(wxLayoutDirection WXUNUSED(dir)) + { } + + // mirror coordinates for RTL layout if this window uses it and if the + // mirroring is not done automatically like Win32 + virtual wxCoord AdjustForLayoutDirection(wxCoord x, + wxCoord width, + wxCoord widthTotal) const; + + + // window id uniquely identifies the window among its siblings unless + // it is wxID_ANY which means "don't care" + void SetId( wxWindowID winid ) { m_windowId = winid; } + wxWindowID GetId() const { return m_windowId; } + + // generate a unique id (or count of them consecutively), returns a + // valid id in the auto-id range or wxID_NONE if failed. If using + // autoid management, it will mark the id as reserved until it is + // used (by assigning it to a wxWindowIDRef) or unreserved. + static wxWindowID NewControlId(int count = 1) + { + return wxIdManager::ReserveId(count); + } + + // If an ID generated from NewControlId is not assigned to a wxWindowIDRef, + // it must be unreserved + static void UnreserveControlId(wxWindowID id, int count = 1) + { + wxIdManager::UnreserveId(id, count); + } + + + // moving/resizing + // --------------- + + // set the window size and/or position + void SetSize( int x, int y, int width, int height, + int sizeFlags = wxSIZE_AUTO ) + { DoSetSize(x, y, width, height, sizeFlags); } + + void SetSize( int width, int height ) + { DoSetSize( wxDefaultCoord, wxDefaultCoord, width, height, wxSIZE_USE_EXISTING ); } + + void SetSize( const wxSize& size ) + { SetSize( size.x, size.y); } + + void SetSize(const wxRect& rect, int sizeFlags = wxSIZE_AUTO) + { DoSetSize(rect.x, rect.y, rect.width, rect.height, sizeFlags); } + + void Move(int x, int y, int flags = wxSIZE_USE_EXISTING) + { DoSetSize(x, y, wxDefaultCoord, wxDefaultCoord, flags); } + + void Move(const wxPoint& pt, int flags = wxSIZE_USE_EXISTING) + { Move(pt.x, pt.y, flags); } + + void SetPosition(const wxPoint& pt) { Move(pt); } + + // Z-order + virtual void Raise() = 0; + virtual void Lower() = 0; + + // client size is the size of area available for subwindows + void SetClientSize( int width, int height ) + { DoSetClientSize(width, height); } + + void SetClientSize( const wxSize& size ) + { DoSetClientSize(size.x, size.y); } + + void SetClientSize(const wxRect& rect) + { SetClientSize( rect.width, rect.height ); } + + // get the window position (pointers may be NULL): notice that it is in + // client coordinates for child windows and screen coordinates for the + // top level ones, use GetScreenPosition() if you need screen + // coordinates for all kinds of windows + void GetPosition( int *x, int *y ) const { DoGetPosition(x, y); } + wxPoint GetPosition() const + { + int x, y; + DoGetPosition(&x, &y); + + return wxPoint(x, y); + } + + // get the window position in screen coordinates + void GetScreenPosition(int *x, int *y) const { DoGetScreenPosition(x, y); } + wxPoint GetScreenPosition() const + { + int x, y; + DoGetScreenPosition(&x, &y); + + return wxPoint(x, y); + } + + // get the window size (pointers may be NULL) + void GetSize( int *w, int *h ) const { DoGetSize(w, h); } + wxSize GetSize() const + { + int w, h; + DoGetSize(& w, & h); + return wxSize(w, h); + } + + void GetClientSize( int *w, int *h ) const { DoGetClientSize(w, h); } + wxSize GetClientSize() const + { + int w, h; + DoGetClientSize(&w, &h); + + return wxSize(w, h); + } + + // get the position and size at once + wxRect GetRect() const + { + int x, y, w, h; + GetPosition(&x, &y); + GetSize(&w, &h); + + return wxRect(x, y, w, h); + } + + wxRect GetScreenRect() const + { + int x, y, w, h; + GetScreenPosition(&x, &y); + GetSize(&w, &h); + + return wxRect(x, y, w, h); + } + + // get the origin of the client area of the window relative to the + // window top left corner (the client area may be shifted because of + // the borders, scrollbars, other decorations...) + virtual wxPoint GetClientAreaOrigin() const; + + // get the client rectangle in window (i.e. client) coordinates + wxRect GetClientRect() const + { + return wxRect(GetClientAreaOrigin(), GetClientSize()); + } + + // client<->window size conversion + virtual wxSize ClientToWindowSize(const wxSize& size) const; + virtual wxSize WindowToClientSize(const wxSize& size) const; + + // get the size best suited for the window (in fact, minimal + // acceptable size using which it will still look "nice" in + // most situations) + wxSize GetBestSize() const; + + void GetBestSize(int *w, int *h) const + { + wxSize s = GetBestSize(); + if ( w ) + *w = s.x; + if ( h ) + *h = s.y; + } + + // Determine the best size in the other direction if one of them is + // fixed. This is used with windows that can wrap their contents and + // returns input-independent best size for the others. + int GetBestHeight(int width) const; + int GetBestWidth(int height) const; + + + void SetScrollHelper( wxScrollHelper *sh ) { m_scrollHelper = sh; } + wxScrollHelper *GetScrollHelper() { return m_scrollHelper; } + + // reset the cached best size value so it will be recalculated the + // next time it is needed. + void InvalidateBestSize(); + void CacheBestSize(const wxSize& size) const + { wxConstCast(this, wxWindowBase)->m_bestSizeCache = size; } + + + // This function will merge the window's best size into the window's + // minimum size, giving priority to the min size components, and + // returns the results. + virtual wxSize GetEffectiveMinSize() const; + + wxDEPRECATED_MSG("use GetEffectiveMinSize() instead") + wxSize GetBestFittingSize() const; + wxDEPRECATED_MSG("use GetEffectiveMinSize() instead") + wxSize GetAdjustedMinSize() const; + + // A 'Smart' SetSize that will fill in default size values with 'best' + // size. Sets the minsize to what was passed in. + void SetInitialSize(const wxSize& size=wxDefaultSize); + + wxDEPRECATED_MSG("use SetInitialSize() instead") + void SetBestFittingSize(const wxSize& size=wxDefaultSize); + + + // the generic centre function - centers the window on parent by` + // default or on screen if it doesn't have parent or + // wxCENTER_ON_SCREEN flag is given + void Centre(int dir = wxBOTH) { DoCentre(dir); } + void Center(int dir = wxBOTH) { DoCentre(dir); } + + // centre with respect to the parent window + void CentreOnParent(int dir = wxBOTH) { DoCentre(dir); } + void CenterOnParent(int dir = wxBOTH) { CentreOnParent(dir); } + + // set window size to wrap around its children + virtual void Fit(); + + // set virtual size to satisfy children + virtual void FitInside(); + + + // SetSizeHints is actually for setting the size hints + // for the wxTLW for a Window Manager - hence the name - + // and it is therefore overridden in wxTLW to do that. + // In wxWindow(Base), it has (unfortunately) been abused + // to mean the same as SetMinSize() and SetMaxSize(). + + virtual void SetSizeHints( int minW, int minH, + int maxW = wxDefaultCoord, int maxH = wxDefaultCoord, + int incW = wxDefaultCoord, int incH = wxDefaultCoord ) + { DoSetSizeHints(minW, minH, maxW, maxH, incW, incH); } + + void SetSizeHints( const wxSize& minSize, + const wxSize& maxSize=wxDefaultSize, + const wxSize& incSize=wxDefaultSize) + { DoSetSizeHints(minSize.x, minSize.y, maxSize.x, maxSize.y, incSize.x, incSize.y); } + + +#if WXWIN_COMPATIBILITY_2_8 + // these are useless and do nothing since wxWidgets 2.9 + wxDEPRECATED( virtual void SetVirtualSizeHints( int minW, int minH, + int maxW = wxDefaultCoord, int maxH = wxDefaultCoord ) ); + wxDEPRECATED( void SetVirtualSizeHints( const wxSize& minSize, + const wxSize& maxSize=wxDefaultSize) ); +#endif // WXWIN_COMPATIBILITY_2_8 + + + // Call these to override what GetBestSize() returns. This + // method is only virtual because it is overridden in wxTLW + // as a different API for SetSizeHints(). + virtual void SetMinSize(const wxSize& minSize); + virtual void SetMaxSize(const wxSize& maxSize); + + // Like Set*Size, but for client, not window, size + virtual void SetMinClientSize(const wxSize& size) + { SetMinSize(ClientToWindowSize(size)); } + virtual void SetMaxClientSize(const wxSize& size) + { SetMaxSize(ClientToWindowSize(size)); } + + // Override these methods to impose restrictions on min/max size. + // The easier way is to call SetMinSize() and SetMaxSize() which + // will have the same effect. Doing both is non-sense. + virtual wxSize GetMinSize() const { return wxSize(m_minWidth, m_minHeight); } + virtual wxSize GetMaxSize() const { return wxSize(m_maxWidth, m_maxHeight); } + + // Like Get*Size, but for client, not window, size + virtual wxSize GetMinClientSize() const + { return WindowToClientSize(GetMinSize()); } + virtual wxSize GetMaxClientSize() const + { return WindowToClientSize(GetMaxSize()); } + + // Get the min and max values one by one + int GetMinWidth() const { return GetMinSize().x; } + int GetMinHeight() const { return GetMinSize().y; } + int GetMaxWidth() const { return GetMaxSize().x; } + int GetMaxHeight() const { return GetMaxSize().y; } + + + // Methods for accessing the virtual size of a window. For most + // windows this is just the client area of the window, but for + // some like scrolled windows it is more or less independent of + // the screen window size. You may override the DoXXXVirtual + // methods below for classes where that is the case. + + void SetVirtualSize( const wxSize &size ) { DoSetVirtualSize( size.x, size.y ); } + void SetVirtualSize( int x, int y ) { DoSetVirtualSize( x, y ); } + + wxSize GetVirtualSize() const { return DoGetVirtualSize(); } + void GetVirtualSize( int *x, int *y ) const + { + wxSize s( DoGetVirtualSize() ); + + if( x ) + *x = s.GetWidth(); + if( y ) + *y = s.GetHeight(); + } + + // Override these methods for windows that have a virtual size + // independent of their client size. eg. the virtual area of a + // wxScrolledWindow. + + virtual void DoSetVirtualSize( int x, int y ); + virtual wxSize DoGetVirtualSize() const; + + // Return the largest of ClientSize and BestSize (as determined + // by a sizer, interior children, or other means) + + virtual wxSize GetBestVirtualSize() const + { + wxSize client( GetClientSize() ); + wxSize best( GetBestSize() ); + + return wxSize( wxMax( client.x, best.x ), wxMax( client.y, best.y ) ); + } + + // returns the magnification of the content of this window + // eg 2.0 for a window on a retina screen + virtual double GetContentScaleFactor() const + { return 1.0; } + + // return the size of the left/right and top/bottom borders in x and y + // components of the result respectively + virtual wxSize GetWindowBorderSize() const; + + // wxSizer and friends use this to give a chance to a component to recalc + // its min size once one of the final size components is known. Override + // this function when that is useful (such as for wxStaticText which can + // stretch over several lines). Parameter availableOtherDir + // tells the item how much more space there is available in the opposite + // direction (-1 if unknown). + virtual bool + InformFirstDirection(int direction, int size, int availableOtherDir); + + // sends a size event to the window using its current size -- this has an + // effect of refreshing the window layout + // + // by default the event is sent, i.e. processed immediately, but if flags + // value includes wxSEND_EVENT_POST then it's posted, i.e. only schedule + // for later processing + virtual void SendSizeEvent(int flags = 0); + + // this is a safe wrapper for GetParent()->SendSizeEvent(): it checks that + // we have a parent window and it's not in process of being deleted + // + // this is used by controls such as tool/status bars changes to which must + // also result in parent re-layout + void SendSizeEventToParent(int flags = 0); + + // this is a more readable synonym for SendSizeEvent(wxSEND_EVENT_POST) + void PostSizeEvent() { SendSizeEvent(wxSEND_EVENT_POST); } + + // this is the same as SendSizeEventToParent() but using PostSizeEvent() + void PostSizeEventToParent() { SendSizeEventToParent(wxSEND_EVENT_POST); } + + // These functions should be used before repositioning the children of + // this window to reduce flicker or, in MSW case, even avoid display + // corruption in some situations (so they're more than just optimization). + // + // EndRepositioningChildren() should be called if and only if + // BeginRepositioningChildren() returns true. To ensure that this is always + // done automatically, use ChildrenRepositioningGuard class below. + virtual bool BeginRepositioningChildren() { return false; } + virtual void EndRepositioningChildren() { } + + // A simple helper which ensures that EndRepositioningChildren() is called + // from its dtor if and only if calling BeginRepositioningChildren() from + // the ctor returned true. + class ChildrenRepositioningGuard + { + public: + // Notice that window can be NULL here, for convenience. In this case + // this class simply doesn't do anything. + wxEXPLICIT ChildrenRepositioningGuard(wxWindowBase* win) + : m_win(win), + m_callEnd(win && win->BeginRepositioningChildren()) + { + } + + ~ChildrenRepositioningGuard() + { + if ( m_callEnd ) + m_win->EndRepositioningChildren(); + } + + private: + wxWindowBase* const m_win; + const bool m_callEnd; + + wxDECLARE_NO_COPY_CLASS(ChildrenRepositioningGuard); + }; + + + // window state + // ------------ + + // returns true if window was shown/hidden, false if the nothing was + // done (window was already shown/hidden) + virtual bool Show( bool show = true ); + bool Hide() { return Show(false); } + + // show or hide the window with a special effect, not implemented on + // most platforms (where it is the same as Show()/Hide() respectively) + // + // timeout specifies how long the animation should take, in ms, the + // default value of 0 means to use the default (system-dependent) value + virtual bool ShowWithEffect(wxShowEffect WXUNUSED(effect), + unsigned WXUNUSED(timeout) = 0) + { + return Show(); + } + + virtual bool HideWithEffect(wxShowEffect WXUNUSED(effect), + unsigned WXUNUSED(timeout) = 0) + { + return Hide(); + } + + // returns true if window was enabled/disabled, false if nothing done + virtual bool Enable( bool enable = true ); + bool Disable() { return Enable(false); } + + virtual bool IsShown() const { return m_isShown; } + // returns true if the window is really enabled and false otherwise, + // whether because it had been explicitly disabled itself or because + // its parent is currently disabled -- then this method returns false + // whatever is the intrinsic state of this window, use IsThisEnabled(0 + // to retrieve it. In other words, this relation always holds: + // + // IsEnabled() == IsThisEnabled() && parent.IsEnabled() + // + bool IsEnabled() const; + + // returns the internal window state independently of the parent(s) + // state, i.e. the state in which the window would be if all its + // parents were enabled (use IsEnabled() above to get the effective + // window state) + bool IsThisEnabled() const { return m_isEnabled; } + + // returns true if the window is visible, i.e. IsShown() returns true + // if called on it and all its parents up to the first TLW + virtual bool IsShownOnScreen() const; + + // get/set window style (setting style won't update the window and so + // is only useful for internal usage) + virtual void SetWindowStyleFlag( long style ) { m_windowStyle = style; } + virtual long GetWindowStyleFlag() const { return m_windowStyle; } + + // just some (somewhat shorter) synonyms + void SetWindowStyle( long style ) { SetWindowStyleFlag(style); } + long GetWindowStyle() const { return GetWindowStyleFlag(); } + + // check if the flag is set + bool HasFlag(int flag) const { return (m_windowStyle & flag) != 0; } + virtual bool IsRetained() const { return HasFlag(wxRETAINED); } + + // turn the flag on if it had been turned off before and vice versa, + // return true if the flag is currently turned on + bool ToggleWindowStyle(int flag); + + // extra style: the less often used style bits which can't be set with + // SetWindowStyleFlag() + virtual void SetExtraStyle(long exStyle) { m_exStyle = exStyle; } + long GetExtraStyle() const { return m_exStyle; } + + bool HasExtraStyle(int exFlag) const { return (m_exStyle & exFlag) != 0; } + +#if WXWIN_COMPATIBILITY_2_8 + // make the window modal (all other windows unresponsive) + wxDEPRECATED( virtual void MakeModal(bool modal = true) ); +#endif + + // (primitive) theming support + // --------------------------- + + virtual void SetThemeEnabled(bool enableTheme) { m_themeEnabled = enableTheme; } + virtual bool GetThemeEnabled() const { return m_themeEnabled; } + + + // focus and keyboard handling + // --------------------------- + + // set focus to this window + virtual void SetFocus() = 0; + + // set focus to this window as the result of a keyboard action + virtual void SetFocusFromKbd() { SetFocus(); } + + // return the window which currently has the focus or NULL + static wxWindow *FindFocus(); + + static wxWindow *DoFindFocus() /* = 0: implement in derived classes */; + + // return true if the window has focus (handles composite windows + // correctly - returns true if GetMainWindowOfCompositeControl() + // has focus) + virtual bool HasFocus() const; + + // can this window have focus in principle? + // + // the difference between AcceptsFocus[FromKeyboard]() and CanAcceptFocus + // [FromKeyboard]() is that the former functions are meant to be + // overridden in the derived classes to simply return false if the + // control can't have focus, while the latter are meant to be used by + // this class clients and take into account the current window state + virtual bool AcceptsFocus() const { return true; } + + // can this window or one of its children accept focus? + // + // usually it's the same as AcceptsFocus() but is overridden for + // container windows + virtual bool AcceptsFocusRecursively() const { return AcceptsFocus(); } + + // can this window be given focus by keyboard navigation? if not, the + // only way to give it focus (provided it accepts it at all) is to + // click it + virtual bool AcceptsFocusFromKeyboard() const { return AcceptsFocus(); } + + + // Can this window be focused right now, in its current state? This + // shouldn't be called at all if AcceptsFocus() returns false. + // + // It is a convenient helper for the various functions using it below + // but also a hook allowing to override the default logic for some rare + // cases (currently just wxRadioBox in wxMSW) when it's inappropriate. + virtual bool CanBeFocused() const { return IsShown() && IsEnabled(); } + + // can this window itself have focus? + bool IsFocusable() const { return AcceptsFocus() && CanBeFocused(); } + + // can this window have focus right now? + // + // if this method returns true, it means that calling SetFocus() will + // put focus either to this window or one of its children, if you need + // to know whether this window accepts focus itself, use IsFocusable() + bool CanAcceptFocus() const + { return AcceptsFocusRecursively() && CanBeFocused(); } + + // can this window be assigned focus from keyboard right now? + bool CanAcceptFocusFromKeyboard() const + { return AcceptsFocusFromKeyboard() && CanBeFocused(); } + + // call this when the return value of AcceptsFocus() changes + virtual void SetCanFocus(bool WXUNUSED(canFocus)) { } + + // navigates inside this window + bool NavigateIn(int flags = wxNavigationKeyEvent::IsForward) + { return DoNavigateIn(flags); } + + // navigates in the specified direction from this window, this is + // equivalent to GetParent()->NavigateIn() + bool Navigate(int flags = wxNavigationKeyEvent::IsForward) + { return m_parent && ((wxWindowBase *)m_parent)->DoNavigateIn(flags); } + + // this function will generate the appropriate call to Navigate() if the + // key event is one normally used for keyboard navigation and return true + // in this case + bool HandleAsNavigationKey(const wxKeyEvent& event); + + // move this window just before/after the specified one in tab order + // (the other window must be our sibling!) + void MoveBeforeInTabOrder(wxWindow *win) + { DoMoveInTabOrder(win, OrderBefore); } + void MoveAfterInTabOrder(wxWindow *win) + { DoMoveInTabOrder(win, OrderAfter); } + + + // parent/children relations + // ------------------------- + + // get the list of children + const wxWindowList& GetChildren() const { return m_children; } + wxWindowList& GetChildren() { return m_children; } + + // needed just for extended runtime + const wxWindowList& GetWindowChildren() const { return GetChildren() ; } + + // get the window before/after this one in the parents children list, + // returns NULL if this is the first/last window + wxWindow *GetPrevSibling() const { return DoGetSibling(OrderBefore); } + wxWindow *GetNextSibling() const { return DoGetSibling(OrderAfter); } + + // get the parent or the parent of the parent + wxWindow *GetParent() const { return m_parent; } + inline wxWindow *GetGrandParent() const; + + // is this window a top level one? + virtual bool IsTopLevel() const; + + // is this window a child or grand child of this one (inside the same + // TLW)? + bool IsDescendant(wxWindowBase* win) const; + + // it doesn't really change parent, use Reparent() instead + void SetParent( wxWindowBase *parent ); + // change the real parent of this window, return true if the parent + // was changed, false otherwise (error or newParent == oldParent) + virtual bool Reparent( wxWindowBase *newParent ); + + // implementation mostly + virtual void AddChild( wxWindowBase *child ); + virtual void RemoveChild( wxWindowBase *child ); + + // returns true if the child is in the client area of the window, i.e. is + // not scrollbar, toolbar etc. + virtual bool IsClientAreaChild(const wxWindow *WXUNUSED(child)) const + { return true; } + + // looking for windows + // ------------------- + + // find window among the descendants of this one either by id or by + // name (return NULL if not found) + wxWindow *FindWindow(long winid) const; + wxWindow *FindWindow(const wxString& name) const; + + // Find a window among any window (all return NULL if not found) + static wxWindow *FindWindowById( long winid, const wxWindow *parent = NULL ); + static wxWindow *FindWindowByName( const wxString& name, + const wxWindow *parent = NULL ); + static wxWindow *FindWindowByLabel( const wxString& label, + const wxWindow *parent = NULL ); + + // event handler stuff + // ------------------- + + // get the current event handler + wxEvtHandler *GetEventHandler() const { return m_eventHandler; } + + // replace the event handler (allows to completely subclass the + // window) + void SetEventHandler( wxEvtHandler *handler ); + + // push/pop event handler: allows to chain a custom event handler to + // alreasy existing ones + void PushEventHandler( wxEvtHandler *handler ); + wxEvtHandler *PopEventHandler( bool deleteHandler = false ); + + // find the given handler in the event handler chain and remove (but + // not delete) it from the event handler chain, return true if it was + // found and false otherwise (this also results in an assert failure so + // this function should only be called when the handler is supposed to + // be there) + bool RemoveEventHandler(wxEvtHandler *handler); + + // Process an event by calling GetEventHandler()->ProcessEvent(): this + // is a straightforward replacement for ProcessEvent() itself which + // shouldn't be used directly with windows as it doesn't take into + // account any event handlers associated with the window + bool ProcessWindowEvent(wxEvent& event) + { return GetEventHandler()->ProcessEvent(event); } + + // Call GetEventHandler()->ProcessEventLocally(): this should be used + // instead of calling ProcessEventLocally() directly on the window + // itself as this wouldn't take any pushed event handlers into account + // correctly + bool ProcessWindowEventLocally(wxEvent& event) + { return GetEventHandler()->ProcessEventLocally(event); } + + // Process an event by calling GetEventHandler()->ProcessEvent() and + // handling any exceptions thrown by event handlers. It's mostly useful + // when processing wx events when called from C code (e.g. in GTK+ + // callback) when the exception wouldn't correctly propagate to + // wxEventLoop. + bool HandleWindowEvent(wxEvent& event) const; + + // disable wxEvtHandler double-linked list mechanism: + virtual void SetNextHandler(wxEvtHandler *handler); + virtual void SetPreviousHandler(wxEvtHandler *handler); + + + // Watcom doesn't allow reducing access with using access declaration, see + // #10749 +#ifndef __WATCOMC__ +protected: + + // NOTE: we change the access specifier of the following wxEvtHandler functions + // so that the user won't be able to call them directly. + // Calling wxWindow::ProcessEvent in fact only works when there are NO + // event handlers pushed on the window. + // To ensure correct operation, instead of wxWindow::ProcessEvent + // you must always call wxWindow::GetEventHandler()->ProcessEvent() + // or HandleWindowEvent(). + // The same holds for all other wxEvtHandler functions. + + using wxEvtHandler::ProcessEvent; + using wxEvtHandler::ProcessEventLocally; +#if wxUSE_THREADS + using wxEvtHandler::ProcessThreadEvent; +#endif + using wxEvtHandler::SafelyProcessEvent; + using wxEvtHandler::ProcessPendingEvents; + using wxEvtHandler::AddPendingEvent; + using wxEvtHandler::QueueEvent; +#endif // __WATCOMC__ + +public: + + // validators + // ---------- + +#if wxUSE_VALIDATORS + // a window may have an associated validator which is used to control + // user input + virtual void SetValidator( const wxValidator &validator ); + virtual wxValidator *GetValidator() { return m_windowValidator; } +#endif // wxUSE_VALIDATORS + + + // dialog oriented functions + // ------------------------- + + // validate the correctness of input, return true if ok + virtual bool Validate(); + + // transfer data between internal and GUI representations + virtual bool TransferDataToWindow(); + virtual bool TransferDataFromWindow(); + + virtual void InitDialog(); + +#if wxUSE_ACCEL + // accelerators + // ------------ + virtual void SetAcceleratorTable( const wxAcceleratorTable& accel ) + { m_acceleratorTable = accel; } + wxAcceleratorTable *GetAcceleratorTable() + { return &m_acceleratorTable; } + +#endif // wxUSE_ACCEL + +#if wxUSE_HOTKEY + // hot keys (system wide accelerators) + // ----------------------------------- + + virtual bool RegisterHotKey(int hotkeyId, int modifiers, int keycode); + virtual bool UnregisterHotKey(int hotkeyId); +#endif // wxUSE_HOTKEY + + + // dialog units translations + // ------------------------- + + wxPoint ConvertPixelsToDialog( const wxPoint& pt ) const; + wxPoint ConvertDialogToPixels( const wxPoint& pt ) const; + wxSize ConvertPixelsToDialog( const wxSize& sz ) const + { + wxPoint pt(ConvertPixelsToDialog(wxPoint(sz.x, sz.y))); + + return wxSize(pt.x, pt.y); + } + + wxSize ConvertDialogToPixels( const wxSize& sz ) const + { + wxPoint pt(ConvertDialogToPixels(wxPoint(sz.x, sz.y))); + + return wxSize(pt.x, pt.y); + } + + // mouse functions + // --------------- + + // move the mouse to the specified position + virtual void WarpPointer(int x, int y) = 0; + + // start or end mouse capture, these functions maintain the stack of + // windows having captured the mouse and after calling ReleaseMouse() + // the mouse is not released but returns to the window which had had + // captured it previously (if any) + void CaptureMouse(); + void ReleaseMouse(); + + // get the window which currently captures the mouse or NULL + static wxWindow *GetCapture(); + + // does this window have the capture? + virtual bool HasCapture() const + { return (wxWindow *)this == GetCapture(); } + + // painting the window + // ------------------- + + // mark the specified rectangle (or the whole window) as "dirty" so it + // will be repainted + virtual void Refresh( bool eraseBackground = true, + const wxRect *rect = (const wxRect *) NULL ) = 0; + + // a less awkward wrapper for Refresh + void RefreshRect(const wxRect& rect, bool eraseBackground = true) + { + Refresh(eraseBackground, &rect); + } + + // repaint all invalid areas of the window immediately + virtual void Update() { } + + // clear the window background + virtual void ClearBackground(); + + // freeze the window: don't redraw it until it is thawed + void Freeze(); + + // thaw the window: redraw it after it had been frozen + void Thaw(); + + // return true if window had been frozen and not unthawed yet + bool IsFrozen() const { return m_freezeCount != 0; } + + // adjust DC for drawing on this window + virtual void PrepareDC( wxDC & WXUNUSED(dc) ) { } + + // return true if the window contents is double buffered by the system + virtual bool IsDoubleBuffered() const { return false; } + + // the update region of the window contains the areas which must be + // repainted by the program + const wxRegion& GetUpdateRegion() const { return m_updateRegion; } + wxRegion& GetUpdateRegion() { return m_updateRegion; } + + // get the update rectangleregion bounding box in client coords + wxRect GetUpdateClientRect() const; + + // these functions verify whether the given point/rectangle belongs to + // (or at least intersects with) the update region + virtual bool DoIsExposed( int x, int y ) const; + virtual bool DoIsExposed( int x, int y, int w, int h ) const; + + bool IsExposed( int x, int y ) const + { return DoIsExposed(x, y); } + bool IsExposed( int x, int y, int w, int h ) const + { return DoIsExposed(x, y, w, h); } + bool IsExposed( const wxPoint& pt ) const + { return DoIsExposed(pt.x, pt.y); } + bool IsExposed( const wxRect& rect ) const + { return DoIsExposed(rect.x, rect.y, rect.width, rect.height); } + + // colours, fonts and cursors + // -------------------------- + + // get the default attributes for the controls of this class: we + // provide a virtual function which can be used to query the default + // attributes of an existing control and a static function which can + // be used even when no existing object of the given class is + // available, but which won't return any styles specific to this + // particular control, of course (e.g. "Ok" button might have + // different -- bold for example -- font) + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // set/retrieve the window colours (system defaults are used by + // default): SetXXX() functions return true if colour was changed, + // SetDefaultXXX() reset the "m_inheritXXX" flag after setting the + // value to prevent it from being inherited by our children + virtual bool SetBackgroundColour(const wxColour& colour); + void SetOwnBackgroundColour(const wxColour& colour) + { + if ( SetBackgroundColour(colour) ) + m_inheritBgCol = false; + } + wxColour GetBackgroundColour() const; + bool InheritsBackgroundColour() const + { + return m_inheritBgCol; + } + bool UseBgCol() const + { + return m_hasBgCol; + } + + virtual bool SetForegroundColour(const wxColour& colour); + void SetOwnForegroundColour(const wxColour& colour) + { + if ( SetForegroundColour(colour) ) + m_inheritFgCol = false; + } + wxColour GetForegroundColour() const; + + // Set/get the background style. + virtual bool SetBackgroundStyle(wxBackgroundStyle style); + wxBackgroundStyle GetBackgroundStyle() const + { return m_backgroundStyle; } + + // returns true if the control has "transparent" areas such as a + // wxStaticText and wxCheckBox and the background should be adapted + // from a parent window + virtual bool HasTransparentBackground() { return false; } + + // Returns true if background transparency is supported for this + // window, i.e. if calling SetBackgroundStyle(wxBG_STYLE_TRANSPARENT) + // has a chance of succeeding. If reason argument is non-NULL, returns a + // user-readable explanation of why it isn't supported if the return + // value is false. + virtual bool IsTransparentBackgroundSupported(wxString* reason = NULL) const; + + // set/retrieve the font for the window (SetFont() returns true if the + // font really changed) + virtual bool SetFont(const wxFont& font) = 0; + void SetOwnFont(const wxFont& font) + { + if ( SetFont(font) ) + m_inheritFont = false; + } + wxFont GetFont() const; + + // set/retrieve the cursor for this window (SetCursor() returns true + // if the cursor was really changed) + virtual bool SetCursor( const wxCursor &cursor ); + const wxCursor& GetCursor() const { return m_cursor; } + +#if wxUSE_CARET + // associate a caret with the window + void SetCaret(wxCaret *caret); + // get the current caret (may be NULL) + wxCaret *GetCaret() const { return m_caret; } +#endif // wxUSE_CARET + + // get the (average) character size for the current font + virtual int GetCharHeight() const = 0; + virtual int GetCharWidth() const = 0; + + // get the width/height/... of the text using current or specified + // font + void GetTextExtent(const wxString& string, + int *x, int *y, + int *descent = NULL, + int *externalLeading = NULL, + const wxFont *font = NULL) const + { + DoGetTextExtent(string, x, y, descent, externalLeading, font); + } + + wxSize GetTextExtent(const wxString& string) const + { + wxCoord w, h; + GetTextExtent(string, &w, &h); + return wxSize(w, h); + } + + // client <-> screen coords + // ------------------------ + + // translate to/from screen/client coordinates (pointers may be NULL) + void ClientToScreen( int *x, int *y ) const + { DoClientToScreen(x, y); } + void ScreenToClient( int *x, int *y ) const + { DoScreenToClient(x, y); } + + // wxPoint interface to do the same thing + wxPoint ClientToScreen(const wxPoint& pt) const + { + int x = pt.x, y = pt.y; + DoClientToScreen(&x, &y); + + return wxPoint(x, y); + } + + wxPoint ScreenToClient(const wxPoint& pt) const + { + int x = pt.x, y = pt.y; + DoScreenToClient(&x, &y); + + return wxPoint(x, y); + } + + // test where the given (in client coords) point lies + wxHitTest HitTest(wxCoord x, wxCoord y) const + { return DoHitTest(x, y); } + + wxHitTest HitTest(const wxPoint& pt) const + { return DoHitTest(pt.x, pt.y); } + + // misc + // ---- + + // get the window border style from the given flags: this is different from + // simply doing flags & wxBORDER_MASK because it uses GetDefaultBorder() to + // translate wxBORDER_DEFAULT to something reasonable + wxBorder GetBorder(long flags) const; + + // get border for the flags of this window + wxBorder GetBorder() const { return GetBorder(GetWindowStyleFlag()); } + + // send wxUpdateUIEvents to this window, and children if recurse is true + virtual void UpdateWindowUI(long flags = wxUPDATE_UI_NONE); + + // do the window-specific processing after processing the update event + virtual void DoUpdateWindowUI(wxUpdateUIEvent& event) ; + +#if wxUSE_MENUS + // show popup menu at the given position, generate events for the items + // selected in it + bool PopupMenu(wxMenu *menu, const wxPoint& pos = wxDefaultPosition) + { return PopupMenu(menu, pos.x, pos.y); } + bool PopupMenu(wxMenu *menu, int x, int y); + + // simply return the id of the selected item or wxID_NONE without + // generating any events + int GetPopupMenuSelectionFromUser(wxMenu& menu, + const wxPoint& pos = wxDefaultPosition) + { return DoGetPopupMenuSelectionFromUser(menu, pos.x, pos.y); } + int GetPopupMenuSelectionFromUser(wxMenu& menu, int x, int y) + { return DoGetPopupMenuSelectionFromUser(menu, x, y); } +#endif // wxUSE_MENUS + + // override this method to return true for controls having multiple pages + virtual bool HasMultiplePages() const { return false; } + + + // scrollbars + // ---------- + + // can the window have the scrollbar in this orientation? + virtual bool CanScroll(int orient) const; + + // does the window have the scrollbar in this orientation? + bool HasScrollbar(int orient) const; + + // configure the window scrollbars + virtual void SetScrollbar( int orient, + int pos, + int thumbvisible, + int range, + bool refresh = true ) = 0; + virtual void SetScrollPos( int orient, int pos, bool refresh = true ) = 0; + virtual int GetScrollPos( int orient ) const = 0; + virtual int GetScrollThumb( int orient ) const = 0; + virtual int GetScrollRange( int orient ) const = 0; + + // scroll window to the specified position + virtual void ScrollWindow( int dx, int dy, + const wxRect* rect = NULL ) = 0; + + // scrolls window by line/page: note that not all controls support this + // + // return true if the position changed, false otherwise + virtual bool ScrollLines(int WXUNUSED(lines)) { return false; } + virtual bool ScrollPages(int WXUNUSED(pages)) { return false; } + + // convenient wrappers for ScrollLines/Pages + bool LineUp() { return ScrollLines(-1); } + bool LineDown() { return ScrollLines(1); } + bool PageUp() { return ScrollPages(-1); } + bool PageDown() { return ScrollPages(1); } + + // call this to always show one or both scrollbars, even if the window + // is big enough to not require them + virtual void AlwaysShowScrollbars(bool WXUNUSED(horz) = true, + bool WXUNUSED(vert) = true) + { + } + + // return true if AlwaysShowScrollbars() had been called before for the + // corresponding orientation + virtual bool IsScrollbarAlwaysShown(int WXUNUSED(orient)) const + { + return false; + } + + // context-sensitive help + // ---------------------- + + // these are the convenience functions wrapping wxHelpProvider methods + +#if wxUSE_HELP + // associate this help text with this window + void SetHelpText(const wxString& text); + +#if WXWIN_COMPATIBILITY_2_8 + // Associate this help text with all windows with the same id as this one. + // Don't use this, do wxHelpProvider::Get()->AddHelp(id, text); + wxDEPRECATED( void SetHelpTextForId(const wxString& text) ); +#endif // WXWIN_COMPATIBILITY_2_8 + + // get the help string associated with the given position in this window + // + // notice that pt may be invalid if event origin is keyboard or unknown + // and this method should return the global window help text then + virtual wxString GetHelpTextAtPoint(const wxPoint& pt, + wxHelpEvent::Origin origin) const; + // returns the position-independent help text + wxString GetHelpText() const + { + return GetHelpTextAtPoint(wxDefaultPosition, wxHelpEvent::Origin_Unknown); + } + +#else // !wxUSE_HELP + // silently ignore SetHelpText() calls + void SetHelpText(const wxString& WXUNUSED(text)) { } + void SetHelpTextForId(const wxString& WXUNUSED(text)) { } +#endif // wxUSE_HELP + + // tooltips + // -------- + +#if wxUSE_TOOLTIPS + // the easiest way to set a tooltip for a window is to use this method + void SetToolTip( const wxString &tip ); + // attach a tooltip to the window, pointer can be NULL to remove + // existing tooltip + void SetToolTip( wxToolTip *tip ) { DoSetToolTip(tip); } + // more readable synonym for SetToolTip(NULL) + void UnsetToolTip() { SetToolTip(NULL); } + // get the associated tooltip or NULL if none + wxToolTip* GetToolTip() const { return m_tooltip; } + wxString GetToolTipText() const; + + // Use the same tool tip as the given one (which can be NULL to indicate + // that no tooltip should be used) for this window. This is currently only + // used by wxCompositeWindow::DoSetToolTip() implementation and is not part + // of the public wx API. + // + // Returns true if tip was valid and we copied it or false if it was NULL + // and we reset our own tooltip too. + bool CopyToolTip(wxToolTip *tip); +#else // !wxUSE_TOOLTIPS + // make it much easier to compile apps in an environment + // that doesn't support tooltips, such as PocketPC + void SetToolTip(const wxString & WXUNUSED(tip)) { } + void UnsetToolTip() { } +#endif // wxUSE_TOOLTIPS/!wxUSE_TOOLTIPS + + // drag and drop + // ------------- +#if wxUSE_DRAG_AND_DROP + // set/retrieve the drop target associated with this window (may be + // NULL; it's owned by the window and will be deleted by it) + virtual void SetDropTarget( wxDropTarget *dropTarget ) = 0; + virtual wxDropTarget *GetDropTarget() const { return m_dropTarget; } + + // Accept files for dragging + virtual void DragAcceptFiles(bool accept) +#ifdef __WXMSW__ + // it does have common implementation but not for MSW which has its own + // native version of it + = 0 +#endif // __WXMSW__ + ; + +#endif // wxUSE_DRAG_AND_DROP + + // constraints and sizers + // ---------------------- +#if wxUSE_CONSTRAINTS + // set the constraints for this window or retrieve them (may be NULL) + void SetConstraints( wxLayoutConstraints *constraints ); + wxLayoutConstraints *GetConstraints() const { return m_constraints; } + + // implementation only + void UnsetConstraints(wxLayoutConstraints *c); + wxWindowList *GetConstraintsInvolvedIn() const + { return m_constraintsInvolvedIn; } + void AddConstraintReference(wxWindowBase *otherWin); + void RemoveConstraintReference(wxWindowBase *otherWin); + void DeleteRelatedConstraints(); + void ResetConstraints(); + + // these methods may be overridden for special layout algorithms + virtual void SetConstraintSizes(bool recurse = true); + virtual bool LayoutPhase1(int *noChanges); + virtual bool LayoutPhase2(int *noChanges); + virtual bool DoPhase(int phase); + + // these methods are virtual but normally won't be overridden + virtual void SetSizeConstraint(int x, int y, int w, int h); + virtual void MoveConstraint(int x, int y); + virtual void GetSizeConstraint(int *w, int *h) const ; + virtual void GetClientSizeConstraint(int *w, int *h) const ; + virtual void GetPositionConstraint(int *x, int *y) const ; + +#endif // wxUSE_CONSTRAINTS + + // when using constraints or sizers, it makes sense to update + // children positions automatically whenever the window is resized + // - this is done if autoLayout is on + void SetAutoLayout( bool autoLayout ) { m_autoLayout = autoLayout; } + bool GetAutoLayout() const { return m_autoLayout; } + + // lay out the window and its children + virtual bool Layout(); + + // sizers + void SetSizer(wxSizer *sizer, bool deleteOld = true ); + void SetSizerAndFit( wxSizer *sizer, bool deleteOld = true ); + + wxSizer *GetSizer() const { return m_windowSizer; } + + // Track if this window is a member of a sizer + void SetContainingSizer(wxSizer* sizer); + wxSizer *GetContainingSizer() const { return m_containingSizer; } + + // accessibility + // ---------------------- +#if wxUSE_ACCESSIBILITY + // Override to create a specific accessible object. + virtual wxAccessible* CreateAccessible(); + + // Sets the accessible object. + void SetAccessible(wxAccessible* accessible) ; + + // Returns the accessible object. + wxAccessible* GetAccessible() { return m_accessible; } + + // Returns the accessible object, creating if necessary. + wxAccessible* GetOrCreateAccessible() ; +#endif + + + // Set window transparency if the platform supports it + virtual bool SetTransparent(wxByte WXUNUSED(alpha)) { return false; } + virtual bool CanSetTransparent() { return false; } + + + // implementation + // -------------- + + // event handlers + void OnSysColourChanged( wxSysColourChangedEvent& event ); + void OnInitDialog( wxInitDialogEvent &event ); + void OnMiddleClick( wxMouseEvent& event ); +#if wxUSE_HELP + void OnHelp(wxHelpEvent& event); +#endif // wxUSE_HELP + + // virtual function for implementing internal idle + // behaviour + virtual void OnInternalIdle(); + + // Send idle event to window and all subwindows + // Returns true if more idle time is requested. + virtual bool SendIdleEvents(wxIdleEvent& event); + + // get the handle of the window for the underlying window system: this + // is only used for wxWin itself or for user code which wants to call + // platform-specific APIs + virtual WXWidget GetHandle() const = 0; + // associate the window with a new native handle + virtual void AssociateHandle(WXWidget WXUNUSED(handle)) { } + // dissociate the current native handle from the window + virtual void DissociateHandle() { } + +#if wxUSE_PALETTE + // Store the palette used by DCs in wxWindow so that the dcs can share + // a palette. And we can respond to palette messages. + wxPalette GetPalette() const { return m_palette; } + + // When palette is changed tell the DC to set the system palette to the + // new one. + void SetPalette(const wxPalette& pal); + + // return true if we have a specific palette + bool HasCustomPalette() const { return m_hasCustomPalette; } + + // return the first parent window with a custom palette or NULL + wxWindow *GetAncestorWithCustomPalette() const; +#endif // wxUSE_PALETTE + + // inherit the parents visual attributes if they had been explicitly set + // by the user (i.e. we don't inherit default attributes) and if we don't + // have our own explicitly set + virtual void InheritAttributes(); + + // returns false from here if this window doesn't want to inherit the + // parents colours even if InheritAttributes() would normally do it + // + // this just provides a simple way to customize InheritAttributes() + // behaviour in the most common case + virtual bool ShouldInheritColours() const { return false; } + + // returns true if the window can be positioned outside of parent's client + // area (normal windows can't, but e.g. menubar or statusbar can): + virtual bool CanBeOutsideClientArea() const { return false; } + + // returns true if the platform should explicitly apply a theme border. Currently + // used only by Windows + virtual bool CanApplyThemeBorder() const { return true; } + + // returns the main window of composite control; this is the window + // that FindFocus returns if the focus is in one of composite control's + // windows + virtual wxWindow *GetMainWindowOfCompositeControl() + { return (wxWindow*)this; } + + // If this function returns true, keyboard navigation events shouldn't + // escape from it. A typical example of such "navigation domain" is a top + // level window because pressing TAB in one of them must not transfer focus + // to a different top level window. But it's not limited to them, e.g. MDI + // children frames are not top level windows (and their IsTopLevel() + // returns false) but still are self-contained navigation domains as well. + virtual bool IsTopNavigationDomain() const { return false; } + + +protected: + // helper for the derived class Create() methods: the first overload, with + // validator parameter, should be used for child windows while the second + // one is used for top level ones + bool CreateBase(wxWindowBase *parent, + wxWindowID winid, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxPanelNameStr); + + bool CreateBase(wxWindowBase *parent, + wxWindowID winid, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name); + + // event handling specific to wxWindow + virtual bool TryBefore(wxEvent& event); + virtual bool TryAfter(wxEvent& event); + + enum WindowOrder + { + OrderBefore, // insert before the given window + OrderAfter // insert after the given window + }; + + // common part of GetPrev/NextSibling() + wxWindow *DoGetSibling(WindowOrder order) const; + + // common part of MoveBefore/AfterInTabOrder() + virtual void DoMoveInTabOrder(wxWindow *win, WindowOrder move); + + // implementation of Navigate() and NavigateIn() + virtual bool DoNavigateIn(int flags); + +#if wxUSE_CONSTRAINTS + // satisfy the constraints for the windows but don't set the window sizes + void SatisfyConstraints(); +#endif // wxUSE_CONSTRAINTS + + // Send the wxWindowDestroyEvent if not done yet and sets m_isBeingDeleted + // to true + void SendDestroyEvent(); + + // this method should be implemented to use operating system specific code + // to really enable/disable the widget, it will only be called when we + // really need to enable/disable window and so no additional checks on the + // widgets state are necessary + virtual void DoEnable(bool WXUNUSED(enable)) { } + + + // the window id - a number which uniquely identifies a window among + // its siblings unless it is wxID_ANY + wxWindowIDRef m_windowId; + + // the parent window of this window (or NULL) and the list of the children + // of this window + wxWindow *m_parent; + wxWindowList m_children; + + // the minimal allowed size for the window (no minimal size if variable(s) + // contain(s) wxDefaultCoord) + int m_minWidth, + m_minHeight, + m_maxWidth, + m_maxHeight; + + // event handler for this window: usually is just 'this' but may be + // changed with SetEventHandler() + wxEvtHandler *m_eventHandler; + +#if wxUSE_VALIDATORS + // associated validator or NULL if none + wxValidator *m_windowValidator; +#endif // wxUSE_VALIDATORS + +#if wxUSE_DRAG_AND_DROP + wxDropTarget *m_dropTarget; +#endif // wxUSE_DRAG_AND_DROP + + // visual window attributes + wxCursor m_cursor; + wxFont m_font; // see m_hasFont + wxColour m_backgroundColour, // m_hasBgCol + m_foregroundColour; // m_hasFgCol + +#if wxUSE_CARET + wxCaret *m_caret; +#endif // wxUSE_CARET + + // the region which should be repainted in response to paint event + wxRegion m_updateRegion; + +#if wxUSE_ACCEL + // the accelerator table for the window which translates key strokes into + // command events + wxAcceleratorTable m_acceleratorTable; +#endif // wxUSE_ACCEL + + // the tooltip for this window (may be NULL) +#if wxUSE_TOOLTIPS + wxToolTip *m_tooltip; +#endif // wxUSE_TOOLTIPS + + // constraints and sizers +#if wxUSE_CONSTRAINTS + // the constraints for this window or NULL + wxLayoutConstraints *m_constraints; + + // constraints this window is involved in + wxWindowList *m_constraintsInvolvedIn; +#endif // wxUSE_CONSTRAINTS + + // this window's sizer + wxSizer *m_windowSizer; + + // The sizer this window is a member of, if any + wxSizer *m_containingSizer; + + // Layout() window automatically when its size changes? + bool m_autoLayout:1; + + // window state + bool m_isShown:1; + bool m_isEnabled:1; + bool m_isBeingDeleted:1; + + // was the window colours/font explicitly changed by user? + bool m_hasBgCol:1; + bool m_hasFgCol:1; + bool m_hasFont:1; + + // and should it be inherited by children? + bool m_inheritBgCol:1; + bool m_inheritFgCol:1; + bool m_inheritFont:1; + + // window attributes + long m_windowStyle, + m_exStyle; + wxString m_windowName; + bool m_themeEnabled; + wxBackgroundStyle m_backgroundStyle; +#if wxUSE_PALETTE + wxPalette m_palette; + bool m_hasCustomPalette; +#endif // wxUSE_PALETTE + +#if wxUSE_ACCESSIBILITY + wxAccessible* m_accessible; +#endif + + // Virtual size (scrolling) + wxSize m_virtualSize; + + wxScrollHelper *m_scrollHelper; + + wxWindowVariant m_windowVariant ; + + // override this to change the default (i.e. used when no style is + // specified) border for the window class + virtual wxBorder GetDefaultBorder() const; + + // this allows you to implement standard control borders without + // repeating the code in different classes that are not derived from + // wxControl + virtual wxBorder GetDefaultBorderForControl() const { return wxBORDER_THEME; } + + // Get the default size for the new window if no explicit size given. TLWs + // have their own default size so this is just for non top-level windows. + static int WidthDefault(int w) { return w == wxDefaultCoord ? 20 : w; } + static int HeightDefault(int h) { return h == wxDefaultCoord ? 20 : h; } + + + // Used to save the results of DoGetBestSize so it doesn't need to be + // recalculated each time the value is needed. + wxSize m_bestSizeCache; + + wxDEPRECATED_MSG("use SetInitialSize() instead.") + void SetBestSize(const wxSize& size); + wxDEPRECATED_MSG("use SetInitialSize() instead.") + virtual void SetInitialBestSize(const wxSize& size); + + + + // more pure virtual functions + // --------------------------- + + // NB: we must have DoSomething() function when Something() is an overloaded + // method: indeed, we can't just have "virtual Something()" in case when + // the function is overloaded because then we'd have to make virtual all + // the variants (otherwise only the virtual function may be called on a + // pointer to derived class according to C++ rules) which is, in + // general, absolutely not needed. So instead we implement all + // overloaded Something()s in terms of DoSomething() which will be the + // only one to be virtual. + + // text extent + virtual void DoGetTextExtent(const wxString& string, + int *x, int *y, + int *descent = NULL, + int *externalLeading = NULL, + const wxFont *font = NULL) const = 0; + + // coordinates translation + virtual void DoClientToScreen( int *x, int *y ) const = 0; + virtual void DoScreenToClient( int *x, int *y ) const = 0; + + virtual wxHitTest DoHitTest(wxCoord x, wxCoord y) const; + + // capture/release the mouse, used by Capture/ReleaseMouse() + virtual void DoCaptureMouse() = 0; + virtual void DoReleaseMouse() = 0; + + // retrieve the position/size of the window + virtual void DoGetPosition(int *x, int *y) const = 0; + virtual void DoGetScreenPosition(int *x, int *y) const; + virtual void DoGetSize(int *width, int *height) const = 0; + virtual void DoGetClientSize(int *width, int *height) const = 0; + + // get the size which best suits the window: for a control, it would be + // the minimal size which doesn't truncate the control, for a panel - the + // same size as it would have after a call to Fit() + virtual wxSize DoGetBestSize() const; + + // this method can be overridden instead of DoGetBestSize() if it computes + // the best size of the client area of the window only, excluding borders + // (GetBorderSize() will be used to add them) + virtual wxSize DoGetBestClientSize() const { return wxDefaultSize; } + + // These two methods can be overridden to implement intelligent + // width-for-height and/or height-for-width best size determination for the + // window. By default the fixed best size is used. + virtual int DoGetBestClientHeight(int WXUNUSED(width)) const + { return wxDefaultCoord; } + virtual int DoGetBestClientWidth(int WXUNUSED(height)) const + { return wxDefaultCoord; } + + // this is the virtual function to be overridden in any derived class which + // wants to change how SetSize() or Move() works - it is called by all + // versions of these functions in the base class + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO) = 0; + + // same as DoSetSize() for the client size + virtual void DoSetClientSize(int width, int height) = 0; + + virtual void DoSetSizeHints( int minW, int minH, + int maxW, int maxH, + int incW, int incH ); + + // return the total size of the window borders, i.e. the sum of the widths + // of the left and the right border in the x component of the returned size + // and the sum of the heights of the top and bottom borders in the y one + // + // NB: this is currently only implemented properly for wxMSW, wxGTK and + // wxUniv and doesn't behave correctly in the presence of scrollbars in + // the other ports + virtual wxSize DoGetBorderSize() const; + + // move the window to the specified location and resize it: this is called + // from both DoSetSize() and DoSetClientSize() and would usually just + // reposition this window except for composite controls which will want to + // arrange themselves inside the given rectangle + // + // Important note: the coordinates passed to this method are in parent's + // *window* coordinates and not parent's client coordinates (as the values + // passed to DoSetSize and returned by DoGetPosition are)! + virtual void DoMoveWindow(int x, int y, int width, int height) = 0; + + // centre the window in the specified direction on parent, note that + // wxCENTRE_ON_SCREEN shouldn't be specified here, it only makes sense for + // TLWs + virtual void DoCentre(int dir); + +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip( wxToolTip *tip ); +#endif // wxUSE_TOOLTIPS + +#if wxUSE_MENUS + virtual bool DoPopupMenu(wxMenu *menu, int x, int y) = 0; +#endif // wxUSE_MENUS + + // Makes an adjustment to the window position to make it relative to the + // parents client area, e.g. if the parent is a frame with a toolbar, its + // (0, 0) is just below the toolbar + virtual void AdjustForParentClientOrigin(int& x, int& y, + int sizeFlags = 0) const; + + // implements the window variants + virtual void DoSetWindowVariant( wxWindowVariant variant ) ; + + + // really freeze/thaw the window (should have port-specific implementation) + virtual void DoFreeze() { } + virtual void DoThaw() { } + + + // Must be called when mouse capture is lost to send + // wxMouseCaptureLostEvent to windows on capture stack. + static void NotifyCaptureLost(); + +private: + // recursively call our own and our children DoEnable() when the + // enabled/disabled status changed because a parent window had been + // enabled/disabled + void NotifyWindowOnEnableChange(bool enabled); + +#if wxUSE_MENUS + // temporary event handlers used by GetPopupMenuSelectionFromUser() + void InternalOnPopupMenu(wxCommandEvent& event); + void InternalOnPopupMenuUpdate(wxUpdateUIEvent& event); + + // implementation of the public GetPopupMenuSelectionFromUser() method + int DoGetPopupMenuSelectionFromUser(wxMenu& menu, int x, int y); +#endif // wxUSE_MENUS + + // layout the window children when its size changes unless this was + // explicitly disabled with SetAutoLayout(false) + void InternalOnSize(wxSizeEvent& event); + + // base for dialog unit conversion, i.e. average character size + wxSize GetDlgUnitBase() const; + + + // number of Freeze() calls minus the number of Thaw() calls: we're frozen + // (i.e. not being updated) if it is positive + unsigned int m_freezeCount; + + + DECLARE_ABSTRACT_CLASS(wxWindowBase) + wxDECLARE_NO_COPY_CLASS(wxWindowBase); + DECLARE_EVENT_TABLE() +}; + + + +// Inlines for some deprecated methods +inline wxSize wxWindowBase::GetBestFittingSize() const +{ + return GetEffectiveMinSize(); +} + +inline void wxWindowBase::SetBestFittingSize(const wxSize& size) +{ + SetInitialSize(size); +} + +inline void wxWindowBase::SetBestSize(const wxSize& size) +{ + SetInitialSize(size); +} + +inline void wxWindowBase::SetInitialBestSize(const wxSize& size) +{ + SetInitialSize(size); +} + + +// ---------------------------------------------------------------------------- +// now include the declaration of wxWindow class +// ---------------------------------------------------------------------------- + +// include the declaration of the platform-specific class +#if defined(__WXMSW__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowMSW + #else // !wxUniv + #define wxWindowMSW wxWindow + #endif // wxUniv/!wxUniv + #include "wx/msw/window.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/window.h" +#elif defined(__WXGTK20__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowGTK + #else // !wxUniv + #define wxWindowGTK wxWindow + #endif // wxUniv + #include "wx/gtk/window.h" +#elif defined(__WXGTK__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowGTK + #else // !wxUniv + #define wxWindowGTK wxWindow + #endif // wxUniv + #include "wx/gtk1/window.h" +#elif defined(__WXX11__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowX11 + #else // !wxUniv + #define wxWindowX11 wxWindow + #endif // wxUniv + #include "wx/x11/window.h" +#elif defined(__WXDFB__) + #define wxWindowNative wxWindowDFB + #include "wx/dfb/window.h" +#elif defined(__WXMAC__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowMac + #else // !wxUniv + #define wxWindowMac wxWindow + #endif // wxUniv + #include "wx/osx/window.h" +#elif defined(__WXCOCOA__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowCocoa + #else // !wxUniv + #define wxWindowCocoa wxWindow + #endif // wxUniv + #include "wx/cocoa/window.h" +#elif defined(__WXPM__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowOS2 + #else // !wxUniv + #define wxWindowOS2 wxWindow + #endif // wxUniv/!wxUniv + #include "wx/os2/window.h" +#endif + +// for wxUniversal, we now derive the real wxWindow from wxWindow<platform>, +// for the native ports we already have defined it above +#if defined(__WXUNIVERSAL__) + #ifndef wxWindowNative + #error "wxWindowNative must be defined above!" + #endif + + #include "wx/univ/window.h" +#endif // wxUniv + +// ---------------------------------------------------------------------------- +// inline functions which couldn't be declared in the class body because of +// forward dependencies +// ---------------------------------------------------------------------------- + +inline wxWindow *wxWindowBase::GetGrandParent() const +{ + return m_parent ? m_parent->GetParent() : NULL; +} + +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +// Find the wxWindow at the current mouse position, also returning the mouse +// position. +extern WXDLLIMPEXP_CORE wxWindow* wxFindWindowAtPointer(wxPoint& pt); + +// Get the current mouse position. +extern WXDLLIMPEXP_CORE wxPoint wxGetMousePosition(); + +// get the currently active window of this application or NULL +extern WXDLLIMPEXP_CORE wxWindow *wxGetActiveWindow(); + +// get the (first) top level parent window +WXDLLIMPEXP_CORE wxWindow* wxGetTopLevelParent(wxWindow *win); + +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED_MSG("use wxWindow::NewControlId() instead") + inline wxWindowID NewControlId() { return wxWindowBase::NewControlId(); } +#endif // WXWIN_COMPATIBILITY_2_6 + +#if wxUSE_ACCESSIBILITY +// ---------------------------------------------------------------------------- +// accessible object for windows +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxWindowAccessible: public wxAccessible +{ +public: + wxWindowAccessible(wxWindow* win): wxAccessible(win) { if (win) win->SetAccessible(this); } + virtual ~wxWindowAccessible() {} + +// Overridables + + // Can return either a child object, or an integer + // representing the child element, starting from 1. + virtual wxAccStatus HitTest(const wxPoint& pt, int* childId, wxAccessible** childObject); + + // Returns the rectangle for this object (id = 0) or a child element (id > 0). + virtual wxAccStatus GetLocation(wxRect& rect, int elementId); + + // Navigates from fromId to toId/toObject. + virtual wxAccStatus Navigate(wxNavDir navDir, int fromId, + int* toId, wxAccessible** toObject); + + // Gets the name of the specified object. + virtual wxAccStatus GetName(int childId, wxString* name); + + // Gets the number of children. + virtual wxAccStatus GetChildCount(int* childCount); + + // Gets the specified child (starting from 1). + // If *child is NULL and return value is wxACC_OK, + // this means that the child is a simple element and + // not an accessible object. + virtual wxAccStatus GetChild(int childId, wxAccessible** child); + + // Gets the parent, or NULL. + virtual wxAccStatus GetParent(wxAccessible** parent); + + // Performs the default action. childId is 0 (the action for this object) + // or > 0 (the action for a child). + // Return wxACC_NOT_SUPPORTED if there is no default action for this + // window (e.g. an edit control). + virtual wxAccStatus DoDefaultAction(int childId); + + // Gets the default action for this object (0) or > 0 (the action for a child). + // Return wxACC_OK even if there is no action. actionName is the action, or the empty + // string if there is no action. + // The retrieved string describes the action that is performed on an object, + // not what the object does as a result. For example, a toolbar button that prints + // a document has a default action of "Press" rather than "Prints the current document." + virtual wxAccStatus GetDefaultAction(int childId, wxString* actionName); + + // Returns the description for this object or a child. + virtual wxAccStatus GetDescription(int childId, wxString* description); + + // Returns help text for this object or a child, similar to tooltip text. + virtual wxAccStatus GetHelpText(int childId, wxString* helpText); + + // Returns the keyboard shortcut for this object or child. + // Return e.g. ALT+K + virtual wxAccStatus GetKeyboardShortcut(int childId, wxString* shortcut); + + // Returns a role constant. + virtual wxAccStatus GetRole(int childId, wxAccRole* role); + + // Returns a state constant. + virtual wxAccStatus GetState(int childId, long* state); + + // Returns a localized string representing the value for the object + // or child. + virtual wxAccStatus GetValue(int childId, wxString* strValue); + + // Selects the object or child. + virtual wxAccStatus Select(int childId, wxAccSelectionFlags selectFlags); + + // Gets the window with the keyboard focus. + // If childId is 0 and child is NULL, no object in + // this subhierarchy has the focus. + // If this object has the focus, child should be 'this'. + virtual wxAccStatus GetFocus(int* childId, wxAccessible** child); + +#if wxUSE_VARIANT + // Gets a variant representing the selected children + // of this object. + // Acceptable values: + // - a null variant (IsNull() returns true) + // - a list variant (GetType() == wxT("list") + // - an integer representing the selected child element, + // or 0 if this object is selected (GetType() == wxT("long") + // - a "void*" pointer to a wxAccessible child object + virtual wxAccStatus GetSelections(wxVariant* selections); +#endif // wxUSE_VARIANT +}; + +#endif // wxUSE_ACCESSIBILITY + + +#endif // _WX_WINDOW_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/windowid.h b/wxmsw/include/wx-3.0/wx/windowid.h new file mode 100644 index 00000000..0c174b5f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/windowid.h @@ -0,0 +1,189 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/windowid.h +// Purpose: wxWindowID class - a class for managing window ids +// Author: Brian Vanderburg II +// Created: 2007-09-21 +// Copyright: (c) 2007 Brian Vanderburg II +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WINDOWID_H_ +#define _WX_WINDOWID_H_ + +// NB: do not include defs.h as we are included from it + +typedef int wxWindowID; + +// ---------------------------------------------------------------------------- +// wxWindowIDRef: reference counted id value +// ---------------------------------------------------------------------------- + +// A wxWindowIDRef object wraps an id value and marks it as (un)used as +// necessary. All ids returned from wxWindow::NewControlId() should be assigned +// to an instance of this class to ensure that the id is marked as being in +// use. +// +// This class is always defined but it is trivial if wxUSE_AUTOID_MANAGEMENT is +// off. +class WXDLLIMPEXP_CORE wxWindowIDRef +{ +public: + // default ctor + wxWindowIDRef() + { + m_id = wxID_NONE; + } + + // ctor taking id values + wxWindowIDRef(int id) + { + Init(id); + } + + wxWindowIDRef(long id) + { + Init(wxWindowID(id)); + } + + wxWindowIDRef(const wxWindowIDRef& id) + { + Init(id.m_id); + } + + // dtor + ~wxWindowIDRef() + { + Assign(wxID_NONE); + } + + // assignment + wxWindowIDRef& operator=(int id) + { + Assign(id); + return *this; + } + + wxWindowIDRef& operator=(long id) + { + Assign(wxWindowID(id)); + return *this; + } + + wxWindowIDRef& operator=(const wxWindowIDRef& id) + { + if (&id != this) + Assign(id.m_id); + return *this; + } + + // access to the stored id value + wxWindowID GetValue() const + { + return m_id; + } + + operator wxWindowID() const + { + return m_id; + } + +private: +#if wxUSE_AUTOID_MANAGEMENT + // common part of all ctors: call Assign() for our new id + void Init(wxWindowID id) + { + // m_id must be initialized before calling Assign() + m_id = wxID_NONE; + Assign(id); + } + + // increase reference count of id, decrease the one of m_id + void Assign(wxWindowID id); +#else // !wxUSE_AUTOID_MANAGEMENT + // trivial stubs for the functions above + void Init(wxWindowID id) + { + m_id = id; + } + + void Assign(wxWindowID id) + { + m_id = id; + } +#endif // wxUSE_AUTOID_MANAGEMENT/!wxUSE_AUTOID_MANAGEMENT + + + wxWindowID m_id; +}; + +// comparison operators +inline bool operator==(const wxWindowIDRef& lhs, const wxWindowIDRef& rhs) +{ + return lhs.GetValue() == rhs.GetValue(); +} + +inline bool operator==(const wxWindowIDRef& lhs, int rhs) +{ + return lhs.GetValue() == rhs; +} + +inline bool operator==(const wxWindowIDRef& lhs, long rhs) +{ + return lhs.GetValue() == rhs; +} + +inline bool operator==(int lhs, const wxWindowIDRef& rhs) +{ + return rhs == lhs; +} + +inline bool operator==(long lhs, const wxWindowIDRef& rhs) +{ + return rhs == lhs; +} + +inline bool operator!=(const wxWindowIDRef& lhs, const wxWindowIDRef& rhs) +{ + return !(lhs == rhs); +} + +inline bool operator!=(const wxWindowIDRef& lhs, int rhs) +{ + return !(lhs == rhs); +} + +inline bool operator!=(const wxWindowIDRef& lhs, long rhs) +{ + return !(lhs == rhs); +} + +inline bool operator!=(int lhs, const wxWindowIDRef& rhs) +{ + return !(lhs == rhs); +} + +inline bool operator!=(long lhs, const wxWindowIDRef& rhs) +{ + return !(lhs == rhs); +} + +// ---------------------------------------------------------------------------- +// wxIdManager +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxIdManager +{ +public: + // This returns an id value and not an wxWindowIDRef. The returned value + // should be assigned a.s.a.p to a wxWindowIDRef. The IDs are marked as + // reserved so that another call to ReserveId before assigning the id to a + // wxWindowIDRef will not use the same ID + static wxWindowID ReserveId(int count = 1); + + // This will release an unused reserved ID. This should only be called + // if the ID returned by ReserveId was NOT assigned to a wxWindowIDRef + // for some purpose, maybe an early return from a function + static void UnreserveId(wxWindowID id, int count = 1); +}; + +#endif // _WX_WINDOWID_H_ diff --git a/wxmsw/include/wx-3.0/wx/windowptr.h b/wxmsw/include/wx-3.0/wx/windowptr.h new file mode 100644 index 00000000..bebcf6ad --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/windowptr.h @@ -0,0 +1,63 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/windowptr.h +// Purpose: smart pointer for holding wxWindow instances +// Author: Vaclav Slavik +// Created: 2013-09-01 +// Copyright: (c) 2013 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WINDOWPTR_H_ +#define _WX_WINDOWPTR_H_ + +#include "wx/sharedptr.h" + +// ---------------------------------------------------------------------------- +// wxWindowPtr: A smart pointer with correct wxWindow destruction. +// ---------------------------------------------------------------------------- + +namespace wxPrivate +{ + +struct wxWindowDeleter +{ + void operator()(wxWindow *win) + { + win->Destroy(); + } +}; + +} // namespace wxPrivate + +template<typename T> +class wxWindowPtr : public wxSharedPtr<T> +{ +public: + typedef T element_type; + + wxEXPLICIT wxWindowPtr(element_type* win) + : wxSharedPtr<T>(win, wxPrivate::wxWindowDeleter()) + { + } + + wxWindowPtr() {} + wxWindowPtr(const wxWindowPtr& tocopy) : wxSharedPtr<T>(tocopy) {} + + wxWindowPtr& operator=(const wxWindowPtr& tocopy) + { + wxSharedPtr<T>::operator=(tocopy); + return *this; + } + + wxWindowPtr& operator=(element_type* win) + { + return operator=(wxWindowPtr(win)); + } + + void reset(T* ptr = NULL) + { + wxSharedPtr<T>::reset(ptr, wxPrivate::wxWindowDeleter()); + } +}; + +#endif // _WX_WINDOWPTR_H_ diff --git a/wxmsw/include/wx-3.0/wx/withimages.h b/wxmsw/include/wx-3.0/wx/withimages.h new file mode 100644 index 00000000..89120d3e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/withimages.h @@ -0,0 +1,96 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/withimages.h +// Purpose: Declaration of a simple wxWithImages class. +// Author: Vadim Zeitlin +// Created: 2011-08-17 +// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WITHIMAGES_H_ +#define _WX_WITHIMAGES_H_ + +#include "wx/defs.h" +#include "wx/icon.h" +#include "wx/imaglist.h" + +// ---------------------------------------------------------------------------- +// wxWithImages: mix-in class providing access to wxImageList. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxWithImages +{ +public: + enum + { + NO_IMAGE = -1 + }; + + wxWithImages() + { + m_imageList = NULL; + m_ownsImageList = false; + } + + virtual ~wxWithImages() + { + FreeIfNeeded(); + } + + // Sets the image list to use, it is *not* deleted by the control. + virtual void SetImageList(wxImageList* imageList) + { + FreeIfNeeded(); + m_imageList = imageList; + } + + // As SetImageList() but we will delete the image list ourselves. + void AssignImageList(wxImageList* imageList) + { + SetImageList(imageList); + m_ownsImageList = true; + } + + // Get pointer (may be NULL) to the associated image list. + wxImageList* GetImageList() const { return m_imageList; } + +protected: + // Return true if we have a valid image list. + bool HasImageList() const { return m_imageList != NULL; } + + // Return the image with the given index from the image list. + // + // If there is no image list or if index == NO_IMAGE, silently returns + // wxNullIcon. + wxIcon GetImage(int iconIndex) const + { + return m_imageList && iconIndex != NO_IMAGE + ? m_imageList->GetIcon(iconIndex) + : wxNullIcon; + } + +private: + // Free the image list if necessary, i.e. if we own it. + void FreeIfNeeded() + { + if ( m_ownsImageList ) + { + delete m_imageList; + m_imageList = NULL; + + // We don't own it any more. + m_ownsImageList = false; + } + } + + + // The associated image list or NULL. + wxImageList* m_imageList; + + // False by default, if true then we delete m_imageList. + bool m_ownsImageList; + + wxDECLARE_NO_COPY_CLASS(wxWithImages); +}; + +#endif // _WX_WITHIMAGES_H_ diff --git a/wxmsw/include/wx-3.0/wx/wizard.h b/wxmsw/include/wx-3.0/wx/wizard.h new file mode 100644 index 00000000..82dc438a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/wizard.h @@ -0,0 +1,337 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/wizard.h +// Purpose: wxWizard class: a GUI control presenting the user with a +// sequence of dialogs which allows to simply perform some task +// Author: Vadim Zeitlin (partly based on work by Ron Kuris and Kevin B. +// Smith) +// Modified by: Robert Cavanaugh +// Added capability to use .WXR resource files in Wizard pages +// Added wxWIZARD_HELP event +// Robert Vazan (sizers) +// Created: 15.08.99 +// Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WIZARD_H_ +#define _WX_WIZARD_H_ + +#include "wx/defs.h" + +#if wxUSE_WIZARDDLG + +// ---------------------------------------------------------------------------- +// headers and other simple declarations +// ---------------------------------------------------------------------------- + +#include "wx/dialog.h" // the base class +#include "wx/panel.h" // ditto +#include "wx/event.h" // wxEVT_XXX constants +#include "wx/bitmap.h" + +// Extended style to specify a help button +#define wxWIZARD_EX_HELPBUTTON 0x00000010 + +// Placement flags +#define wxWIZARD_VALIGN_TOP 0x01 +#define wxWIZARD_VALIGN_CENTRE 0x02 +#define wxWIZARD_VALIGN_BOTTOM 0x04 +#define wxWIZARD_HALIGN_LEFT 0x08 +#define wxWIZARD_HALIGN_CENTRE 0x10 +#define wxWIZARD_HALIGN_RIGHT 0x20 +#define wxWIZARD_TILE 0x40 + +// forward declarations +class WXDLLIMPEXP_FWD_ADV wxWizard; + +// ---------------------------------------------------------------------------- +// wxWizardPage is one of the wizards screen: it must know what are the +// following and preceding pages (which may be NULL for the first/last page). +// +// Other than GetNext/Prev() functions, wxWizardPage is just a panel and may be +// used as such (i.e. controls may be placed directly on it &c). +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxWizardPage : public wxPanel +{ +public: + wxWizardPage() { Init(); } + + // ctor accepts an optional bitmap which will be used for this page instead + // of the default one for this wizard (should be of the same size). Notice + // that no other parameters are needed because the wizard will resize and + // reposition the page anyhow + wxWizardPage(wxWizard *parent, + const wxBitmap& bitmap = wxNullBitmap); + + bool Create(wxWizard *parent, + const wxBitmap& bitmap = wxNullBitmap); + + // these functions are used by the wizard to show another page when the + // user chooses "Back" or "Next" button + virtual wxWizardPage *GetPrev() const = 0; + virtual wxWizardPage *GetNext() const = 0; + + // default GetBitmap() will just return m_bitmap which is ok in 99% of + // cases - override this method if you want to create the bitmap to be used + // dynamically or to do something even more fancy. It's ok to return + // wxNullBitmap from here - the default one will be used then. + virtual wxBitmap GetBitmap() const { return m_bitmap; } + +#if wxUSE_VALIDATORS + // Override the base functions to allow a validator to be assigned to this page. + virtual bool TransferDataToWindow() + { + return GetValidator() ? GetValidator()->TransferToWindow() + : wxPanel::TransferDataToWindow(); + } + + virtual bool TransferDataFromWindow() + { + return GetValidator() ? GetValidator()->TransferFromWindow() + : wxPanel::TransferDataFromWindow(); + } + + virtual bool Validate() + { + return GetValidator() ? GetValidator()->Validate(this) + : wxPanel::Validate(); + } +#endif // wxUSE_VALIDATORS + +protected: + // common part of ctors: + void Init(); + + wxBitmap m_bitmap; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxWizardPage) +}; + +// ---------------------------------------------------------------------------- +// wxWizardPageSimple just returns the pointers given to the ctor and is useful +// to create a simple wizard where the order of pages never changes. +// +// OTOH, it is also possible to dynamically decide which page to return (i.e. +// depending on the user's choices) as the wizard sample shows - in order to do +// this, you must derive from wxWizardPage directly. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxWizardPageSimple : public wxWizardPage +{ +public: + wxWizardPageSimple() { Init(); } + + // ctor takes the previous and next pages + wxWizardPageSimple(wxWizard *parent, + wxWizardPage *prev = NULL, + wxWizardPage *next = NULL, + const wxBitmap& bitmap = wxNullBitmap) + { + Create(parent, prev, next, bitmap); + } + + bool Create(wxWizard *parent = NULL, // let it be default ctor too + wxWizardPage *prev = NULL, + wxWizardPage *next = NULL, + const wxBitmap& bitmap = wxNullBitmap) + { + m_prev = prev; + m_next = next; + return wxWizardPage::Create(parent, bitmap); + } + + // the pointers may be also set later - but before starting the wizard + void SetPrev(wxWizardPage *prev) { m_prev = prev; } + void SetNext(wxWizardPage *next) { m_next = next; } + + // Convenience functions to make the pages follow each other without having + // to call their SetPrev() or SetNext() explicitly. + wxWizardPageSimple& Chain(wxWizardPageSimple* next) + { + SetNext(next); + next->SetPrev(this); + return *next; + } + + static void Chain(wxWizardPageSimple *first, wxWizardPageSimple *second) + { + wxCHECK_RET( first && second, + wxT("NULL passed to wxWizardPageSimple::Chain") ); + + first->SetNext(second); + second->SetPrev(first); + } + + // base class pure virtuals + virtual wxWizardPage *GetPrev() const; + virtual wxWizardPage *GetNext() const; + +private: + // common part of ctors: + void Init() + { + m_prev = m_next = NULL; + } + + // pointers are private, the derived classes shouldn't mess with them - + // just derive from wxWizardPage directly to implement different behaviour + wxWizardPage *m_prev, + *m_next; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxWizardPageSimple) +}; + +// ---------------------------------------------------------------------------- +// wxWizard +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxWizardBase : public wxDialog +{ +public: + /* + The derived class (i.e. the real wxWizard) has a ctor and Create() + function taking the following arguments: + + wxWizard(wxWindow *parent, + int id = wxID_ANY, + const wxString& title = wxEmptyString, + const wxBitmap& bitmap = wxNullBitmap, + const wxPoint& pos = wxDefaultPosition, + long style = wxDEFAULT_DIALOG_STYLE); + */ + wxWizardBase() { } + + // executes the wizard starting from the given page, returns true if it was + // successfully finished, false if user cancelled it + virtual bool RunWizard(wxWizardPage *firstPage) = 0; + + // get the current page (NULL if RunWizard() isn't running) + virtual wxWizardPage *GetCurrentPage() const = 0; + + // set the min size which should be available for the pages: a + // wizard will take into account the size of the bitmap (if any) + // itself and will never be less than some predefined fixed size + virtual void SetPageSize(const wxSize& size) = 0; + + // get the size available for the page + virtual wxSize GetPageSize() const = 0; + + // set the best size for the wizard, i.e. make it big enough to contain all + // of the pages starting from the given one + // + // this function may be called several times and possible with different + // pages in which case it will only increase the page size if needed (this + // may be useful if not all pages are accessible from the first one by + // default) + virtual void FitToPage(const wxWizardPage *firstPage) = 0; + + // Adding pages to page area sizer enlarges wizard + virtual wxSizer *GetPageAreaSizer() const = 0; + + // Set border around page area. Default is 0 if you add at least one + // page to GetPageAreaSizer and 5 if you don't. + virtual void SetBorder(int border) = 0; + + // the methods below may be overridden by the derived classes to provide + // custom logic for determining the pages order + + virtual bool HasNextPage(wxWizardPage *page) + { return page->GetNext() != NULL; } + + virtual bool HasPrevPage(wxWizardPage *page) + { return page->GetPrev() != NULL; } + + /// Override these functions to stop InitDialog from calling TransferDataToWindow + /// for _all_ pages when the wizard starts. Instead 'ShowPage' will call + /// TransferDataToWindow for the first page only. + bool TransferDataToWindow() { return true; } + bool TransferDataFromWindow() { return true; } + bool Validate() { return true; } + +private: + wxDECLARE_NO_COPY_CLASS(wxWizardBase); +}; + +// include the real class declaration +#include "wx/generic/wizard.h" + +// ---------------------------------------------------------------------------- +// wxWizardEvent class represents an event generated by the wizard: this event +// is first sent to the page itself and, if not processed there, goes up the +// window hierarchy as usual +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxWizardEvent : public wxNotifyEvent +{ +public: + wxWizardEvent(wxEventType type = wxEVT_NULL, + int id = wxID_ANY, + bool direction = true, + wxWizardPage* page = NULL); + + // for EVT_WIZARD_PAGE_CHANGING, return true if we're going forward or + // false otherwise and for EVT_WIZARD_PAGE_CHANGED return true if we came + // from the previous page and false if we returned from the next one + // (this function doesn't make sense for CANCEL events) + bool GetDirection() const { return m_direction; } + + wxWizardPage* GetPage() const { return m_page; } + + virtual wxEvent *Clone() const { return new wxWizardEvent(*this); } + +private: + bool m_direction; + wxWizardPage* m_page; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxWizardEvent) +}; + +// ---------------------------------------------------------------------------- +// macros for handling wxWizardEvents +// ---------------------------------------------------------------------------- + +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_WIZARD_PAGE_CHANGED, wxWizardEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_WIZARD_PAGE_CHANGING, wxWizardEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_WIZARD_CANCEL, wxWizardEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_WIZARD_HELP, wxWizardEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_WIZARD_FINISHED, wxWizardEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_WIZARD_PAGE_SHOWN, wxWizardEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_WIZARD_BEFORE_PAGE_CHANGED, wxWizardEvent ); + +typedef void (wxEvtHandler::*wxWizardEventFunction)(wxWizardEvent&); + +#define wxWizardEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxWizardEventFunction, func) + +#define wx__DECLARE_WIZARDEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_WIZARD_ ## evt, id, wxWizardEventHandler(fn)) + +// notifies that the page has just been changed (can't be vetoed) +#define EVT_WIZARD_PAGE_CHANGED(id, fn) wx__DECLARE_WIZARDEVT(PAGE_CHANGED, id, fn) + +// the user pressed "<Back" or "Next>" button and the page is going to be +// changed - unless the event handler vetoes the event +#define EVT_WIZARD_PAGE_CHANGING(id, fn) wx__DECLARE_WIZARDEVT(PAGE_CHANGING, id, fn) + +// Called before GetNext/GetPrev is called, so that the handler can change state that will be +// used when GetNext/GetPrev is called. PAGE_CHANGING is called too late to influence GetNext/GetPrev. +#define EVT_WIZARD_BEFORE_PAGE_CHANGED(id, fn) wx__DECLARE_WIZARDEVT(BEFORE_PAGE_CHANGED, id, fn) + +// the user pressed "Cancel" button and the wizard is going to be dismissed - +// unless the event handler vetoes the event +#define EVT_WIZARD_CANCEL(id, fn) wx__DECLARE_WIZARDEVT(CANCEL, id, fn) + +// the user pressed "Finish" button and the wizard is going to be dismissed - +#define EVT_WIZARD_FINISHED(id, fn) wx__DECLARE_WIZARDEVT(FINISHED, id, fn) + +// the user pressed "Help" button +#define EVT_WIZARD_HELP(id, fn) wx__DECLARE_WIZARDEVT(HELP, id, fn) + +// the page was just shown and laid out +#define EVT_WIZARD_PAGE_SHOWN(id, fn) wx__DECLARE_WIZARDEVT(PAGE_SHOWN, id, fn) + +#endif // wxUSE_WIZARDDLG + +#endif // _WX_WIZARD_H_ diff --git a/wxmsw/include/wx-3.0/wx/wrapsizer.h b/wxmsw/include/wx-3.0/wx/wrapsizer.h new file mode 100644 index 00000000..a4d61450 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/wrapsizer.h @@ -0,0 +1,99 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/wrapsizer.h +// Purpose: provide wrapping sizer for layout (wxWrapSizer) +// Author: Arne Steinarson +// Created: 2008-05-08 +// Copyright: (c) Arne Steinarson +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WRAPSIZER_H_ +#define _WX_WRAPSIZER_H_ + +#include "wx/sizer.h" + +// flags for wxWrapSizer +enum +{ + wxEXTEND_LAST_ON_EACH_LINE = 1, + // don't leave spacers in the beginning of a new row + wxREMOVE_LEADING_SPACES = 2, + + wxWRAPSIZER_DEFAULT_FLAGS = wxEXTEND_LAST_ON_EACH_LINE | + wxREMOVE_LEADING_SPACES +}; + +// ---------------------------------------------------------------------------- +// A box sizer that can wrap items on several lines when sum of widths exceed +// available line width. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxWrapSizer : public wxBoxSizer +{ +public: + wxWrapSizer(int orient = wxHORIZONTAL, int flags = wxWRAPSIZER_DEFAULT_FLAGS); + virtual ~wxWrapSizer(); + + // override base class virtual methods + virtual wxSize CalcMin(); + virtual void RecalcSizes(); + + virtual bool InformFirstDirection(int direction, + int size, + int availableOtherDir); + +protected: + // This method is called to decide if an item represents empty space or + // not. We do this to avoid having space-only items first or last on a + // wrapped line (left alignment). + // + // By default only spacers are considered to be empty items but a derived + // class may override this item if some other kind of sizer elements should + // be also considered empty for some reason. + virtual bool IsSpaceItem(wxSizerItem *item) const + { + return item->IsSpacer(); + } + + // helpers of CalcMin() + void CalcMinFromMinor(int totMinor); + void CalcMinFromMajor(int totMajor); + void CalcMinUsingCurrentLayout(); + void CalcMinFittingSize(const wxSize& szBoundary); + void CalcMaxSingleItemSize(); + + // temporarily change the proportion of the last item of the N-th row to + // extend to the end of line if the appropriate flag is set + void AdjustLastRowItemProp(size_t n, wxSizerItem *itemLast); + + // remove all the items from m_rows + void ClearRows(); + + // return the N-th row sizer from m_rows creating it if necessary + wxSizer *GetRowSizer(size_t n); + + // should be called after completion of each row + void FinishRow(size_t n, int rowMajor, int rowMinor, wxSizerItem *itemLast); + + + const int m_flags; // Flags specified in the ctor + + int m_dirInform; // Direction for size information + int m_availSize; // Size available in m_dirInform direction + int m_availableOtherDir; // Size available in the other direction + bool m_lastUsed; // Indicates whether value from InformFirst... has + // been used yet + + // The sizes below are computed by RecalcSizes(), i.e. they don't have + // valid values during the initial call to CalcMin() and they are only + // valid for the current layout (i.e. the current number of rows) + int m_minSizeMinor; // Min size in minor direction + int m_maxSizeMajor; // Size of longest row + int m_minItemMajor; // Size of smallest item in major direction + + wxBoxSizer m_rows; // Sizer containing multiple rows of our items + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxWrapSizer) +}; + +#endif // _WX_WRAPSIZER_H_ diff --git a/wxmsw/include/wx-3.0/wx/wupdlock.h b/wxmsw/include/wx-3.0/wx/wupdlock.h new file mode 100644 index 00000000..eb799a82 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/wupdlock.h @@ -0,0 +1,36 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/wupdlock.h +// Purpose: wxWindowUpdateLocker prevents window redrawing +// Author: Vadim Zeitlin +// Created: 2006-03-06 +// Copyright: (c) 2006 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WUPDLOCK_H_ +#define _WX_WUPDLOCK_H_ + +#include "wx/window.h" + +// ---------------------------------------------------------------------------- +// wxWindowUpdateLocker prevents updates to the window during its lifetime +// ---------------------------------------------------------------------------- + +class wxWindowUpdateLocker +{ +public: + // create an object preventing updates of the given window (which must have + // a lifetime at least as great as ours) + wxWindowUpdateLocker(wxWindow *win) : m_win(win) { win->Freeze(); } + + // dtor thaws the window to permit updates again + ~wxWindowUpdateLocker() { m_win->Thaw(); } + +private: + wxWindow *m_win; + + wxDECLARE_NO_COPY_CLASS(wxWindowUpdateLocker); +}; + +#endif // _WX_WUPDLOCK_H_ + diff --git a/wxmsw/include/wx-3.0/wx/wx.h b/wxmsw/include/wx-3.0/wx/wx.h new file mode 100644 index 00000000..9f6a42cb --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/wx.h @@ -0,0 +1,112 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/wx.h +// Purpose: wxWidgets central header including the most often used ones +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WX_H_ +#define _WX_WX_H_ + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/dynarray.h" +#include "wx/list.h" +#include "wx/hash.h" +#include "wx/string.h" +#include "wx/hashmap.h" +#include "wx/arrstr.h" +#include "wx/intl.h" +#include "wx/log.h" +#include "wx/event.h" +#include "wx/app.h" +#include "wx/utils.h" +#include "wx/stream.h" +#include "wx/memory.h" +#include "wx/math.h" +#include "wx/stopwatch.h" +#include "wx/timer.h" +#include "wx/module.h" +#include "wx/wxcrt.h" +#include "wx/wxcrtvararg.h" + +#if wxUSE_GUI + +#include "wx/window.h" +#include "wx/containr.h" +#include "wx/panel.h" +#include "wx/toplevel.h" +#include "wx/frame.h" +#include "wx/gdicmn.h" +#include "wx/gdiobj.h" +#include "wx/region.h" +#include "wx/bitmap.h" +#include "wx/image.h" +#include "wx/colour.h" +#include "wx/font.h" +#include "wx/dc.h" +#include "wx/dcclient.h" +#include "wx/dcmemory.h" +#include "wx/dcprint.h" +#include "wx/dcscreen.h" +#include "wx/button.h" +#include "wx/menuitem.h" +#include "wx/menu.h" +#include "wx/pen.h" +#include "wx/brush.h" +#include "wx/palette.h" +#include "wx/icon.h" +#include "wx/cursor.h" +#include "wx/dialog.h" +#include "wx/settings.h" +#include "wx/msgdlg.h" +#include "wx/dataobj.h" + +#include "wx/control.h" +#include "wx/ctrlsub.h" +#include "wx/bmpbuttn.h" +#include "wx/checkbox.h" +#include "wx/checklst.h" +#include "wx/choice.h" +#include "wx/scrolbar.h" +#include "wx/stattext.h" +#include "wx/statbmp.h" +#include "wx/statbox.h" +#include "wx/listbox.h" +#include "wx/radiobox.h" +#include "wx/radiobut.h" +#include "wx/textctrl.h" +#include "wx/slider.h" +#include "wx/gauge.h" +#include "wx/scrolwin.h" +#include "wx/dirdlg.h" +#include "wx/toolbar.h" +#include "wx/combobox.h" +#include "wx/layout.h" +#include "wx/sizer.h" +#include "wx/statusbr.h" +#include "wx/choicdlg.h" +#include "wx/textdlg.h" +#include "wx/filedlg.h" + +// this one is included by exactly one file (mdi.cpp) during wx build so even +// although we keep it here for the library users, don't include it to avoid +// bloating the PCH and (worse) rebuilding the entire library when it changes +// when building the library itself +#ifndef WXBUILDING + #include "wx/mdi.h" +#endif + +// always include, even if !wxUSE_VALIDATORS because we need wxDefaultValidator +#include "wx/validate.h" + +#if wxUSE_VALIDATORS + #include "wx/valtext.h" +#endif // wxUSE_VALIDATORS + +#endif // wxUSE_GUI + +#endif // _WX_WX_H_ diff --git a/wxmsw/include/wx-3.0/wx/wxchar.h b/wxmsw/include/wx-3.0/wx/wxchar.h new file mode 100644 index 00000000..597bbe15 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/wxchar.h @@ -0,0 +1,18 @@ +////////////////////////////////////////////////////////////////////////////// +// Name: wx/wxchar.h +// Purpose: Declarations common to wx char/wchar_t usage (wide chars) +// Author: Joel Farley, Ove KÃ¥ven +// Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee +// Created: 1998/06/12 +// Copyright: (c) 1998-2006 wxWidgets dev team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WXCHAR_H_ +#define _WX_WXCHAR_H_ + +// This header used to define CRT functions wrappers in wxWidgets 2.8. This is +// now done in (headers included by) wx/crt.h, so include it for compatibility: +#include "wx/crt.h" + +#endif /* _WX_WXCHAR_H_ */ diff --git a/wxmsw/include/wx-3.0/wx/wxcrt.h b/wxmsw/include/wx-3.0/wx/wxcrt.h new file mode 100644 index 00000000..dd579364 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/wxcrt.h @@ -0,0 +1,986 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/wxcrt.h +// Purpose: Type-safe ANSI and Unicode builds compatible wrappers for +// CRT functions +// Author: Joel Farley, Ove Kaaven +// Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee, Vaclav Slavik +// Created: 1998/06/12 +// Copyright: (c) 1998-2006 wxWidgets dev team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WXCRT_H_ +#define _WX_WXCRT_H_ + +#include "wx/wxcrtbase.h" +#include "wx/string.h" + +#ifndef __WX_SETUP_H__ +// For non-configure builds assume vsscanf is available, if not Visual C or DMC +#if !defined (__VISUALC__) && !defined (__DMC__) + #define HAVE_VSSCANF 1 +#endif +#endif + +// ============================================================================ +// misc functions +// ============================================================================ + +/* checks whether the passed in pointer is NULL and if the string is empty */ +inline bool wxIsEmpty(const char *s) { return !s || !*s; } +inline bool wxIsEmpty(const wchar_t *s) { return !s || !*s; } +inline bool wxIsEmpty(const wxScopedCharBuffer& s) { return wxIsEmpty(s.data()); } +inline bool wxIsEmpty(const wxScopedWCharBuffer& s) { return wxIsEmpty(s.data()); } +inline bool wxIsEmpty(const wxString& s) { return s.empty(); } +inline bool wxIsEmpty(const wxCStrData& s) { return s.AsString().empty(); } + + + +/* multibyte to wide char conversion functions and macros */ + +/* multibyte<->widechar conversion */ +WXDLLIMPEXP_BASE size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n); +WXDLLIMPEXP_BASE size_t wxWC2MB(char *buf, const wchar_t *psz, size_t n); + +#if wxUSE_UNICODE + #define wxMB2WX wxMB2WC + #define wxWX2MB wxWC2MB + #define wxWC2WX wxStrncpy + #define wxWX2WC wxStrncpy +#else + #define wxMB2WX wxStrncpy + #define wxWX2MB wxStrncpy + #define wxWC2WX wxWC2MB + #define wxWX2WC wxMB2WC +#endif + + +// RN: We could do the usual tricky compiler detection here, +// and use their variant (such as wmemchr, etc.). The problem +// is that these functions are quite rare, even though they are +// part of the current POSIX standard. In addition, most compilers +// (including even MSC) inline them just like we do right in their +// headers. +// +#include <string.h> + +#if wxUSE_UNICODE + //implement our own wmem variants + inline wxChar* wxTmemchr(const wxChar* s, wxChar c, size_t l) + { + for(;l && *s != c;--l, ++s) {} + + if(l) + return const_cast<wxChar*>(s); + return NULL; + } + + inline int wxTmemcmp(const wxChar* sz1, const wxChar* sz2, size_t len) + { + for(; *sz1 == *sz2 && len; --len, ++sz1, ++sz2) {} + + if(len) + return *sz1 < *sz2 ? -1 : *sz1 > *sz2; + else + return 0; + } + + inline wxChar* wxTmemcpy(wxChar* szOut, const wxChar* szIn, size_t len) + { + return (wxChar*) memcpy(szOut, szIn, len * sizeof(wxChar)); + } + + inline wxChar* wxTmemmove(wxChar* szOut, const wxChar* szIn, size_t len) + { + return (wxChar*) memmove(szOut, szIn, len * sizeof(wxChar)); + } + + inline wxChar* wxTmemset(wxChar* szOut, const wxChar cIn, size_t len) + { + wxChar* szRet = szOut; + + while (len--) + *szOut++ = cIn; + + return szRet; + } +#endif /* wxUSE_UNICODE */ + +// provide trivial wrappers for char* versions for both ANSI and Unicode builds +// (notice that these intentionally return "char *" and not "void *" unlike the +// standard memxxx() for symmetry with the wide char versions): +inline char* wxTmemchr(const char* s, char c, size_t len) + { return (char*)memchr(s, c, len); } +inline int wxTmemcmp(const char* sz1, const char* sz2, size_t len) + { return memcmp(sz1, sz2, len); } +inline char* wxTmemcpy(char* szOut, const char* szIn, size_t len) + { return (char*)memcpy(szOut, szIn, len); } +inline char* wxTmemmove(char* szOut, const char* szIn, size_t len) + { return (char*)memmove(szOut, szIn, len); } +inline char* wxTmemset(char* szOut, const char cIn, size_t len) + { return (char*)memset(szOut, cIn, len); } + + +// ============================================================================ +// wx wrappers for CRT functions in both char* and wchar_t* versions +// ============================================================================ + +// A few notes on implementation of these wrappers: +// +// We need both char* and wchar_t* versions of functions like wxStrlen() for +// compatibility with both ANSI and Unicode builds. +// +// This makes passing wxString or c_str()/mb_str()/wc_str() result to them +// ambiguous, so we need to provide overrides for that as well (in cases where +// it makes sense). +// +// We can do this without problems for some functions (wxStrlen()), but in some +// cases, we can't stay compatible with both ANSI and Unicode builds, e.g. for +// wxStrcpy(const wxString&), which can only return either char* or wchar_t*. +// In these cases, we preserve ANSI build compatibility by returning char*. + +// ---------------------------------------------------------------------------- +// locale functions +// ---------------------------------------------------------------------------- + +// NB: we can't provide const wchar_t* (= wxChar*) overload, because calling +// wxSetlocale(category, NULL) -- which is a common thing to do -- would be +// ambiguous +WXDLLIMPEXP_BASE char* wxSetlocale(int category, const char *locale); +inline char* wxSetlocale(int category, const wxScopedCharBuffer& locale) + { return wxSetlocale(category, locale.data()); } +inline char* wxSetlocale(int category, const wxString& locale) + { return wxSetlocale(category, locale.mb_str()); } +inline char* wxSetlocale(int category, const wxCStrData& locale) + { return wxSetlocale(category, locale.AsCharBuf()); } + +// ---------------------------------------------------------------------------- +// string functions +// ---------------------------------------------------------------------------- + +/* safe version of strlen() (returns 0 if passed NULL pointer) */ +// NB: these are defined in wxcrtbase.h, see the comment there +// inline size_t wxStrlen(const char *s) { return s ? strlen(s) : 0; } +// inline size_t wxStrlen(const wchar_t *s) { return s ? wxCRT_Strlen_(s) : 0; } +inline size_t wxStrlen(const wxScopedCharBuffer& s) { return wxStrlen(s.data()); } +inline size_t wxStrlen(const wxScopedWCharBuffer& s) { return wxStrlen(s.data()); } +inline size_t wxStrlen(const wxString& s) { return s.length(); } +inline size_t wxStrlen(const wxCStrData& s) { return s.AsString().length(); } + +// this is a function new in 2.9 so we don't care about backwards compatibility and +// so don't need to support wxScopedCharBuffer/wxScopedWCharBuffer overloads +#if defined(wxCRT_StrnlenA) +inline size_t wxStrnlen(const char *str, size_t maxlen) { return wxCRT_StrnlenA(str, maxlen); } +#else +inline size_t wxStrnlen(const char *str, size_t maxlen) +{ + size_t n; + for ( n = 0; n < maxlen; n++ ) + if ( !str[n] ) + break; + + return n; +} +#endif + +#if defined(wxCRT_StrnlenW) +inline size_t wxStrnlen(const wchar_t *str, size_t maxlen) { return wxCRT_StrnlenW(str, maxlen); } +#else +inline size_t wxStrnlen(const wchar_t *str, size_t maxlen) +{ + size_t n; + for ( n = 0; n < maxlen; n++ ) + if ( !str[n] ) + break; + + return n; +} +#endif + +// NB: these are defined in wxcrtbase.h, see the comment there +// inline char* wxStrdup(const char *s) { return wxStrdupA(s); } +// inline wchar_t* wxStrdup(const wchar_t *s) { return wxStrdupW(s); } +inline char* wxStrdup(const wxScopedCharBuffer& s) { return wxStrdup(s.data()); } +inline wchar_t* wxStrdup(const wxScopedWCharBuffer& s) { return wxStrdup(s.data()); } +inline char* wxStrdup(const wxString& s) { return wxStrdup(s.mb_str()); } +inline char* wxStrdup(const wxCStrData& s) { return wxStrdup(s.AsCharBuf()); } + +inline char *wxStrcpy(char *dest, const char *src) + { return wxCRT_StrcpyA(dest, src); } +inline wchar_t *wxStrcpy(wchar_t *dest, const wchar_t *src) + { return wxCRT_StrcpyW(dest, src); } +inline char *wxStrcpy(char *dest, const wxString& src) + { return wxCRT_StrcpyA(dest, src.mb_str()); } +inline char *wxStrcpy(char *dest, const wxCStrData& src) + { return wxCRT_StrcpyA(dest, src.AsCharBuf()); } +inline char *wxStrcpy(char *dest, const wxScopedCharBuffer& src) + { return wxCRT_StrcpyA(dest, src.data()); } +inline wchar_t *wxStrcpy(wchar_t *dest, const wxString& src) + { return wxCRT_StrcpyW(dest, src.wc_str()); } +inline wchar_t *wxStrcpy(wchar_t *dest, const wxCStrData& src) + { return wxCRT_StrcpyW(dest, src.AsWCharBuf()); } +inline wchar_t *wxStrcpy(wchar_t *dest, const wxScopedWCharBuffer& src) + { return wxCRT_StrcpyW(dest, src.data()); } +inline char *wxStrcpy(char *dest, const wchar_t *src) + { return wxCRT_StrcpyA(dest, wxConvLibc.cWC2MB(src)); } +inline wchar_t *wxStrcpy(wchar_t *dest, const char *src) + { return wxCRT_StrcpyW(dest, wxConvLibc.cMB2WC(src)); } + +inline char *wxStrncpy(char *dest, const char *src, size_t n) + { return wxCRT_StrncpyA(dest, src, n); } +inline wchar_t *wxStrncpy(wchar_t *dest, const wchar_t *src, size_t n) + { return wxCRT_StrncpyW(dest, src, n); } +inline char *wxStrncpy(char *dest, const wxString& src, size_t n) + { return wxCRT_StrncpyA(dest, src.mb_str(), n); } +inline char *wxStrncpy(char *dest, const wxCStrData& src, size_t n) + { return wxCRT_StrncpyA(dest, src.AsCharBuf(), n); } +inline char *wxStrncpy(char *dest, const wxScopedCharBuffer& src, size_t n) + { return wxCRT_StrncpyA(dest, src.data(), n); } +inline wchar_t *wxStrncpy(wchar_t *dest, const wxString& src, size_t n) + { return wxCRT_StrncpyW(dest, src.wc_str(), n); } +inline wchar_t *wxStrncpy(wchar_t *dest, const wxCStrData& src, size_t n) + { return wxCRT_StrncpyW(dest, src.AsWCharBuf(), n); } +inline wchar_t *wxStrncpy(wchar_t *dest, const wxScopedWCharBuffer& src, size_t n) + { return wxCRT_StrncpyW(dest, src.data(), n); } +inline char *wxStrncpy(char *dest, const wchar_t *src, size_t n) + { return wxCRT_StrncpyA(dest, wxConvLibc.cWC2MB(src), n); } +inline wchar_t *wxStrncpy(wchar_t *dest, const char *src, size_t n) + { return wxCRT_StrncpyW(dest, wxConvLibc.cMB2WC(src), n); } + +// this is a function new in 2.9 so we don't care about backwards compatibility and +// so don't need to support wchar_t/char overloads +inline size_t wxStrlcpy(char *dest, const char *src, size_t n) +{ + const size_t len = wxCRT_StrlenA(src); + + if ( n ) + { + if ( n-- > len ) + n = len; + wxCRT_StrncpyA(dest, src, n); + dest[n] = '\0'; + } + + return len; +} +inline size_t wxStrlcpy(wchar_t *dest, const wchar_t *src, size_t n) +{ + const size_t len = wxCRT_StrlenW(src); + if ( n ) + { + if ( n-- > len ) + n = len; + wxCRT_StrncpyW(dest, src, n); + dest[n] = L'\0'; + } + + return len; +} + +inline char *wxStrcat(char *dest, const char *src) + { return wxCRT_StrcatA(dest, src); } +inline wchar_t *wxStrcat(wchar_t *dest, const wchar_t *src) + { return wxCRT_StrcatW(dest, src); } +inline char *wxStrcat(char *dest, const wxString& src) + { return wxCRT_StrcatA(dest, src.mb_str()); } +inline char *wxStrcat(char *dest, const wxCStrData& src) + { return wxCRT_StrcatA(dest, src.AsCharBuf()); } +inline char *wxStrcat(char *dest, const wxScopedCharBuffer& src) + { return wxCRT_StrcatA(dest, src.data()); } +inline wchar_t *wxStrcat(wchar_t *dest, const wxString& src) + { return wxCRT_StrcatW(dest, src.wc_str()); } +inline wchar_t *wxStrcat(wchar_t *dest, const wxCStrData& src) + { return wxCRT_StrcatW(dest, src.AsWCharBuf()); } +inline wchar_t *wxStrcat(wchar_t *dest, const wxScopedWCharBuffer& src) + { return wxCRT_StrcatW(dest, src.data()); } +inline char *wxStrcat(char *dest, const wchar_t *src) + { return wxCRT_StrcatA(dest, wxConvLibc.cWC2MB(src)); } +inline wchar_t *wxStrcat(wchar_t *dest, const char *src) + { return wxCRT_StrcatW(dest, wxConvLibc.cMB2WC(src)); } + +inline char *wxStrncat(char *dest, const char *src, size_t n) + { return wxCRT_StrncatA(dest, src, n); } +inline wchar_t *wxStrncat(wchar_t *dest, const wchar_t *src, size_t n) + { return wxCRT_StrncatW(dest, src, n); } +inline char *wxStrncat(char *dest, const wxString& src, size_t n) + { return wxCRT_StrncatA(dest, src.mb_str(), n); } +inline char *wxStrncat(char *dest, const wxCStrData& src, size_t n) + { return wxCRT_StrncatA(dest, src.AsCharBuf(), n); } +inline char *wxStrncat(char *dest, const wxScopedCharBuffer& src, size_t n) + { return wxCRT_StrncatA(dest, src.data(), n); } +inline wchar_t *wxStrncat(wchar_t *dest, const wxString& src, size_t n) + { return wxCRT_StrncatW(dest, src.wc_str(), n); } +inline wchar_t *wxStrncat(wchar_t *dest, const wxCStrData& src, size_t n) + { return wxCRT_StrncatW(dest, src.AsWCharBuf(), n); } +inline wchar_t *wxStrncat(wchar_t *dest, const wxScopedWCharBuffer& src, size_t n) + { return wxCRT_StrncatW(dest, src.data(), n); } +inline char *wxStrncat(char *dest, const wchar_t *src, size_t n) + { return wxCRT_StrncatA(dest, wxConvLibc.cWC2MB(src), n); } +inline wchar_t *wxStrncat(wchar_t *dest, const char *src, size_t n) + { return wxCRT_StrncatW(dest, wxConvLibc.cMB2WC(src), n); } + + +#define WX_STR_DECL(name, T1, T2) name(T1 s1, T2 s2) +#define WX_STR_CALL(func, a1, a2) func(a1, a2) + +// This macro defines string function for all possible variants of arguments, +// except for those taking wxString or wxCStrData as second argument. +// Parameters: +// rettype - return type +// name - name of the (overloaded) function to define +// crtA - function to call for char* versions (takes two arguments) +// crtW - ditto for wchar_t* function +// forString - function to call when the *first* argument is wxString; +// the second argument can be any string type, so this is +// typically a template +#define WX_STR_FUNC_NO_INVERT(rettype, name, crtA, crtW, forString) \ + inline rettype WX_STR_DECL(name, const char *, const char *) \ + { return WX_STR_CALL(crtA, s1, s2); } \ + inline rettype WX_STR_DECL(name, const char *, const wchar_t *) \ + { return WX_STR_CALL(forString, wxString(s1), wxString(s2)); } \ + inline rettype WX_STR_DECL(name, const char *, const wxScopedCharBuffer&) \ + { return WX_STR_CALL(crtA, s1, s2.data()); } \ + inline rettype WX_STR_DECL(name, const char *, const wxScopedWCharBuffer&) \ + { return WX_STR_CALL(forString, wxString(s1), s2.data()); } \ + \ + inline rettype WX_STR_DECL(name, const wchar_t *, const wchar_t *) \ + { return WX_STR_CALL(crtW, s1, s2); } \ + inline rettype WX_STR_DECL(name, const wchar_t *, const char *) \ + { return WX_STR_CALL(forString, wxString(s1), wxString(s2)); } \ + inline rettype WX_STR_DECL(name, const wchar_t *, const wxScopedWCharBuffer&) \ + { return WX_STR_CALL(crtW, s1, s2.data()); } \ + inline rettype WX_STR_DECL(name, const wchar_t *, const wxScopedCharBuffer&) \ + { return WX_STR_CALL(forString, wxString(s1), s2.data()); } \ + \ + inline rettype WX_STR_DECL(name, const wxScopedCharBuffer&, const char *) \ + { return WX_STR_CALL(crtA, s1.data(), s2); } \ + inline rettype WX_STR_DECL(name, const wxScopedCharBuffer&, const wchar_t *) \ + { return WX_STR_CALL(forString, wxString(s1), wxString(s2)); } \ + inline rettype WX_STR_DECL(name, const wxScopedCharBuffer&, const wxScopedCharBuffer&)\ + { return WX_STR_CALL(crtA, s1.data(), s2.data()); } \ + inline rettype WX_STR_DECL(name, const wxScopedCharBuffer&, const wxScopedWCharBuffer&) \ + { return WX_STR_CALL(forString, wxString(s1), wxString(s2)); } \ + \ + inline rettype WX_STR_DECL(name, const wxScopedWCharBuffer&, const wchar_t *) \ + { return WX_STR_CALL(crtW, s1.data(), s2); } \ + inline rettype WX_STR_DECL(name, const wxScopedWCharBuffer&, const char *) \ + { return WX_STR_CALL(forString, wxString(s1), wxString(s2)); } \ + inline rettype WX_STR_DECL(name, const wxScopedWCharBuffer&, const wxScopedWCharBuffer&) \ + { return WX_STR_CALL(crtW, s1.data(), s2.data()); } \ + inline rettype WX_STR_DECL(name, const wxScopedWCharBuffer&, const wxScopedCharBuffer&) \ + { return WX_STR_CALL(forString, wxString(s1), wxString(s2)); } \ + \ + inline rettype WX_STR_DECL(name, const wxString&, const char*) \ + { return WX_STR_CALL(forString, s1, s2); } \ + inline rettype WX_STR_DECL(name, const wxString&, const wchar_t*) \ + { return WX_STR_CALL(forString, s1, s2); } \ + inline rettype WX_STR_DECL(name, const wxString&, const wxScopedCharBuffer&) \ + { return WX_STR_CALL(forString, s1, s2); } \ + inline rettype WX_STR_DECL(name, const wxString&, const wxScopedWCharBuffer&) \ + { return WX_STR_CALL(forString, s1, s2); } \ + inline rettype WX_STR_DECL(name, const wxString&, const wxString&) \ + { return WX_STR_CALL(forString, s1, s2); } \ + inline rettype WX_STR_DECL(name, const wxString&, const wxCStrData&) \ + { return WX_STR_CALL(forString, s1, s2); } \ + \ + inline rettype WX_STR_DECL(name, const wxCStrData&, const char*) \ + { return WX_STR_CALL(forString, s1.AsString(), s2); } \ + inline rettype WX_STR_DECL(name, const wxCStrData&, const wchar_t*) \ + { return WX_STR_CALL(forString, s1.AsString(), s2); } \ + inline rettype WX_STR_DECL(name, const wxCStrData&, const wxScopedCharBuffer&) \ + { return WX_STR_CALL(forString, s1.AsString(), s2); } \ + inline rettype WX_STR_DECL(name, const wxCStrData&, const wxScopedWCharBuffer&) \ + { return WX_STR_CALL(forString, s1.AsString(), s2); } \ + inline rettype WX_STR_DECL(name, const wxCStrData&, const wxString&) \ + { return WX_STR_CALL(forString, s1.AsString(), s2); } \ + inline rettype WX_STR_DECL(name, const wxCStrData&, const wxCStrData&) \ + { return WX_STR_CALL(forString, s1.AsString(), s2); } + +// This defines strcmp-like function, i.e. one returning the result of +// comparison; see WX_STR_FUNC_NO_INVERT for explanation of the arguments +#define WX_STRCMP_FUNC(name, crtA, crtW, forString) \ + WX_STR_FUNC_NO_INVERT(int, name, crtA, crtW, forString) \ + \ + inline int WX_STR_DECL(name, const char *, const wxCStrData&) \ + { return -WX_STR_CALL(forString, s2.AsString(), s1); } \ + inline int WX_STR_DECL(name, const char *, const wxString&) \ + { return -WX_STR_CALL(forString, s2, s1); } \ + \ + inline int WX_STR_DECL(name, const wchar_t *, const wxCStrData&) \ + { return -WX_STR_CALL(forString, s2.AsString(), s1); } \ + inline int WX_STR_DECL(name, const wchar_t *, const wxString&) \ + { return -WX_STR_CALL(forString, s2, s1); } \ + \ + inline int WX_STR_DECL(name, const wxScopedCharBuffer&, const wxCStrData&) \ + { return -WX_STR_CALL(forString, s2.AsString(), s1.data()); } \ + inline int WX_STR_DECL(name, const wxScopedCharBuffer&, const wxString&) \ + { return -WX_STR_CALL(forString, s2, s1.data()); } \ + \ + inline int WX_STR_DECL(name, const wxScopedWCharBuffer&, const wxCStrData&) \ + { return -WX_STR_CALL(forString, s2.AsString(), s1.data()); } \ + inline int WX_STR_DECL(name, const wxScopedWCharBuffer&, const wxString&) \ + { return -WX_STR_CALL(forString, s2, s1.data()); } + + +// This defines a string function that is *not* strcmp-like, i.e. doesn't +// return the result of comparison and so if the second argument is a string, +// it has to be converted to char* or wchar_t* +#define WX_STR_FUNC(rettype, name, crtA, crtW, forString) \ + WX_STR_FUNC_NO_INVERT(rettype, name, crtA, crtW, forString) \ + \ + inline rettype WX_STR_DECL(name, const char *, const wxCStrData&) \ + { return WX_STR_CALL(crtA, s1, s2.AsCharBuf()); } \ + inline rettype WX_STR_DECL(name, const char *, const wxString&) \ + { return WX_STR_CALL(crtA, s1, s2.mb_str()); } \ + \ + inline rettype WX_STR_DECL(name, const wchar_t *, const wxCStrData&) \ + { return WX_STR_CALL(crtW, s1, s2.AsWCharBuf()); } \ + inline rettype WX_STR_DECL(name, const wchar_t *, const wxString&) \ + { return WX_STR_CALL(crtW, s1, s2.wc_str()); } \ + \ + inline rettype WX_STR_DECL(name, const wxScopedCharBuffer&, const wxCStrData&) \ + { return WX_STR_CALL(crtA, s1.data(), s2.AsCharBuf()); } \ + inline rettype WX_STR_DECL(name, const wxScopedCharBuffer&, const wxString&) \ + { return WX_STR_CALL(crtA, s1.data(), s2.mb_str()); } \ + \ + inline rettype WX_STR_DECL(name, const wxScopedWCharBuffer&, const wxCStrData&) \ + { return WX_STR_CALL(crtW, s1.data(), s2.AsWCharBuf()); } \ + inline rettype WX_STR_DECL(name, const wxScopedWCharBuffer&, const wxString&) \ + { return WX_STR_CALL(crtW, s1.data(), s2.wc_str()); } + +template<typename T> +inline int wxStrcmp_String(const wxString& s1, const T& s2) + { return s1.compare(s2); } +WX_STRCMP_FUNC(wxStrcmp, wxCRT_StrcmpA, wxCRT_StrcmpW, wxStrcmp_String) + +template<typename T> +inline int wxStricmp_String(const wxString& s1, const T& s2) + { return s1.CmpNoCase(s2); } +WX_STRCMP_FUNC(wxStricmp, wxCRT_StricmpA, wxCRT_StricmpW, wxStricmp_String) + +#if defined(wxCRT_StrcollA) && defined(wxCRT_StrcollW) + +// GCC 3.4 and other compilers have a bug that causes it to fail compilation if +// the template's implementation uses overloaded function declared later (see +// the wxStrcoll() call in wxStrcoll_String<T>()), so we have to +// forward-declare the template and implement it below WX_STRCMP_FUNC. OTOH, +// this fails to compile with VC6, so don't do it for VC. It also causes +// problems with GCC visibility in newer GCC versions. +#if !(defined(__VISUALC__) || (wxCHECK_GCC_VERSION(3,5) && !wxCHECK_GCC_VERSION(4,7))) || defined(__clang__) + #define wxNEEDS_DECL_BEFORE_TEMPLATE +#endif + +#ifdef wxNEEDS_DECL_BEFORE_TEMPLATE +template<typename T> +inline int wxStrcoll_String(const wxString& s1, const T& s2); +WX_STRCMP_FUNC(wxStrcoll, wxCRT_StrcollA, wxCRT_StrcollW, wxStrcoll_String) +#endif // wxNEEDS_DECL_BEFORE_TEMPLATE + +template<typename T> +inline int wxStrcoll_String(const wxString& s1, const T& s2) +{ +#if wxUSE_UNICODE + // NB: strcoll() doesn't work correctly on UTF-8 strings, so we have to use + // wc_str() even if wxUSE_UNICODE_UTF8; the (const wchar_t*) cast is + // there just as optimization to avoid going through + // wxStrcoll<wxScopedWCharBuffer>: + return wxStrcoll((const wchar_t*)s1.wc_str(), s2); +#else + return wxStrcoll((const char*)s1.mb_str(), s2); +#endif +} + +#ifndef wxNEEDS_DECL_BEFORE_TEMPLATE +// this is exactly the same WX_STRCMP_FUNC line as above, insde the +// wxNEEDS_DECL_BEFORE_TEMPLATE case +WX_STRCMP_FUNC(wxStrcoll, wxCRT_StrcollA, wxCRT_StrcollW, wxStrcoll_String) +#endif + +#endif // defined(wxCRT_Strcoll[AW]) + +template<typename T> +inline size_t wxStrspn_String(const wxString& s1, const T& s2) +{ + size_t pos = s1.find_first_not_of(s2); + return pos == wxString::npos ? s1.length() : pos; +} +WX_STR_FUNC(size_t, wxStrspn, wxCRT_StrspnA, wxCRT_StrspnW, wxStrspn_String) + +template<typename T> +inline size_t wxStrcspn_String(const wxString& s1, const T& s2) +{ + size_t pos = s1.find_first_of(s2); + return pos == wxString::npos ? s1.length() : pos; +} +WX_STR_FUNC(size_t, wxStrcspn, wxCRT_StrcspnA, wxCRT_StrcspnW, wxStrcspn_String) + +#undef WX_STR_DECL +#undef WX_STR_CALL +#define WX_STR_DECL(name, T1, T2) name(T1 s1, T2 s2, size_t n) +#define WX_STR_CALL(func, a1, a2) func(a1, a2, n) + +template<typename T> +inline int wxStrncmp_String(const wxString& s1, const T& s2, size_t n) + { return s1.compare(0, n, s2, 0, n); } +WX_STRCMP_FUNC(wxStrncmp, wxCRT_StrncmpA, wxCRT_StrncmpW, wxStrncmp_String) + +template<typename T> +inline int wxStrnicmp_String(const wxString& s1, const T& s2, size_t n) + { return s1.substr(0, n).CmpNoCase(wxString(s2).substr(0, n)); } +WX_STRCMP_FUNC(wxStrnicmp, wxCRT_StrnicmpA, wxCRT_StrnicmpW, wxStrnicmp_String) + +#undef WX_STR_DECL +#undef WX_STR_CALL +#undef WX_STRCMP_FUNC +#undef WX_STR_FUNC +#undef WX_STR_FUNC_NO_INVERT + +#if defined(wxCRT_StrxfrmA) && defined(wxCRT_StrxfrmW) + +inline size_t wxStrxfrm(char *dest, const char *src, size_t n) + { return wxCRT_StrxfrmA(dest, src, n); } +inline size_t wxStrxfrm(wchar_t *dest, const wchar_t *src, size_t n) + { return wxCRT_StrxfrmW(dest, src, n); } +template<typename T> +inline size_t wxStrxfrm(T *dest, const wxScopedCharTypeBuffer<T>& src, size_t n) + { return wxStrxfrm(dest, src.data(), n); } +inline size_t wxStrxfrm(char *dest, const wxString& src, size_t n) + { return wxCRT_StrxfrmA(dest, src.mb_str(), n); } +inline size_t wxStrxfrm(wchar_t *dest, const wxString& src, size_t n) + { return wxCRT_StrxfrmW(dest, src.wc_str(), n); } +inline size_t wxStrxfrm(char *dest, const wxCStrData& src, size_t n) + { return wxCRT_StrxfrmA(dest, src.AsCharBuf(), n); } +inline size_t wxStrxfrm(wchar_t *dest, const wxCStrData& src, size_t n) + { return wxCRT_StrxfrmW(dest, src.AsWCharBuf(), n); } + +#endif // defined(wxCRT_Strxfrm[AW]) + +inline char *wxStrtok(char *str, const char *delim, char **saveptr) + { return wxCRT_StrtokA(str, delim, saveptr); } +inline wchar_t *wxStrtok(wchar_t *str, const wchar_t *delim, wchar_t **saveptr) + { return wxCRT_StrtokW(str, delim, saveptr); } +template<typename T> +inline T *wxStrtok(T *str, const wxScopedCharTypeBuffer<T>& delim, T **saveptr) + { return wxStrtok(str, delim.data(), saveptr); } +inline char *wxStrtok(char *str, const wxCStrData& delim, char **saveptr) + { return wxCRT_StrtokA(str, delim.AsCharBuf(), saveptr); } +inline wchar_t *wxStrtok(wchar_t *str, const wxCStrData& delim, wchar_t **saveptr) + { return wxCRT_StrtokW(str, delim.AsWCharBuf(), saveptr); } +inline char *wxStrtok(char *str, const wxString& delim, char **saveptr) + { return wxCRT_StrtokA(str, delim.mb_str(), saveptr); } +inline wchar_t *wxStrtok(wchar_t *str, const wxString& delim, wchar_t **saveptr) + { return wxCRT_StrtokW(str, delim.wc_str(), saveptr); } + +inline const char *wxStrstr(const char *haystack, const char *needle) + { return wxCRT_StrstrA(haystack, needle); } +inline const wchar_t *wxStrstr(const wchar_t *haystack, const wchar_t *needle) + { return wxCRT_StrstrW(haystack, needle); } +inline const char *wxStrstr(const char *haystack, const wxString& needle) + { return wxCRT_StrstrA(haystack, needle.mb_str()); } +inline const wchar_t *wxStrstr(const wchar_t *haystack, const wxString& needle) + { return wxCRT_StrstrW(haystack, needle.wc_str()); } +// these functions return char* pointer into the non-temporary conversion buffer +// used by c_str()'s implicit conversion to char*, for ANSI build compatibility +inline const char *wxStrstr(const wxString& haystack, const wxString& needle) + { return wxCRT_StrstrA(haystack.c_str(), needle.mb_str()); } +inline const char *wxStrstr(const wxCStrData& haystack, const wxString& needle) + { return wxCRT_StrstrA(haystack, needle.mb_str()); } +inline const char *wxStrstr(const wxCStrData& haystack, const wxCStrData& needle) + { return wxCRT_StrstrA(haystack, needle.AsCharBuf()); } +// if 'needle' is char/wchar_t, then the same is probably wanted as return value +inline const char *wxStrstr(const wxString& haystack, const char *needle) + { return wxCRT_StrstrA(haystack.c_str(), needle); } +inline const char *wxStrstr(const wxCStrData& haystack, const char *needle) + { return wxCRT_StrstrA(haystack, needle); } +inline const wchar_t *wxStrstr(const wxString& haystack, const wchar_t *needle) + { return wxCRT_StrstrW(haystack.c_str(), needle); } +inline const wchar_t *wxStrstr(const wxCStrData& haystack, const wchar_t *needle) + { return wxCRT_StrstrW(haystack, needle); } + +inline const char *wxStrchr(const char *s, char c) + { return wxCRT_StrchrA(s, c); } +inline const wchar_t *wxStrchr(const wchar_t *s, wchar_t c) + { return wxCRT_StrchrW(s, c); } +inline const char *wxStrrchr(const char *s, char c) + { return wxCRT_StrrchrA(s, c); } +inline const wchar_t *wxStrrchr(const wchar_t *s, wchar_t c) + { return wxCRT_StrrchrW(s, c); } +inline const char *wxStrchr(const char *s, const wxUniChar& uc) + { char c; return uc.GetAsChar(&c) ? wxCRT_StrchrA(s, c) : NULL; } +inline const wchar_t *wxStrchr(const wchar_t *s, const wxUniChar& c) + { return wxCRT_StrchrW(s, (wchar_t)c); } +inline const char *wxStrrchr(const char *s, const wxUniChar& uc) + { char c; return uc.GetAsChar(&c) ? wxCRT_StrrchrA(s, c) : NULL; } +inline const wchar_t *wxStrrchr(const wchar_t *s, const wxUniChar& c) + { return wxCRT_StrrchrW(s, (wchar_t)c); } +inline const char *wxStrchr(const char *s, const wxUniCharRef& uc) + { char c; return uc.GetAsChar(&c) ? wxCRT_StrchrA(s, c) : NULL; } +inline const wchar_t *wxStrchr(const wchar_t *s, const wxUniCharRef& c) + { return wxCRT_StrchrW(s, (wchar_t)c); } +inline const char *wxStrrchr(const char *s, const wxUniCharRef& uc) + { char c; return uc.GetAsChar(&c) ? wxCRT_StrrchrA(s, c) : NULL; } +inline const wchar_t *wxStrrchr(const wchar_t *s, const wxUniCharRef& c) + { return wxCRT_StrrchrW(s, (wchar_t)c); } +template<typename T> +inline const T* wxStrchr(const wxScopedCharTypeBuffer<T>& s, T c) + { return wxStrchr(s.data(), c); } +template<typename T> +inline const T* wxStrrchr(const wxScopedCharTypeBuffer<T>& s, T c) + { return wxStrrchr(s.data(), c); } +template<typename T> +inline const T* wxStrchr(const wxScopedCharTypeBuffer<T>& s, const wxUniChar& c) + { return wxStrchr(s.data(), (T)c); } +template<typename T> +inline const T* wxStrrchr(const wxScopedCharTypeBuffer<T>& s, const wxUniChar& c) + { return wxStrrchr(s.data(), (T)c); } +template<typename T> +inline const T* wxStrchr(const wxScopedCharTypeBuffer<T>& s, const wxUniCharRef& c) + { return wxStrchr(s.data(), (T)c); } +template<typename T> +inline const T* wxStrrchr(const wxScopedCharTypeBuffer<T>& s, const wxUniCharRef& c) + { return wxStrrchr(s.data(), (T)c); } +// these functions return char* pointer into the non-temporary conversion buffer +// used by c_str()'s implicit conversion to char*, for ANSI build compatibility +inline const char* wxStrchr(const wxString& s, char c) + { return wxCRT_StrchrA((const char*)s.c_str(), c); } +inline const char* wxStrrchr(const wxString& s, char c) + { return wxCRT_StrrchrA((const char*)s.c_str(), c); } +inline const char* wxStrchr(const wxString& s, int c) + { return wxCRT_StrchrA((const char*)s.c_str(), c); } +inline const char* wxStrrchr(const wxString& s, int c) + { return wxCRT_StrrchrA((const char*)s.c_str(), c); } +inline const char* wxStrchr(const wxString& s, const wxUniChar& uc) + { char c; return uc.GetAsChar(&c) ? wxCRT_StrchrA(s.c_str(), c) : NULL; } +inline const char* wxStrrchr(const wxString& s, const wxUniChar& uc) + { char c; return uc.GetAsChar(&c) ? wxCRT_StrrchrA(s.c_str(), c) : NULL; } +inline const char* wxStrchr(const wxString& s, const wxUniCharRef& uc) + { char c; return uc.GetAsChar(&c) ? wxCRT_StrchrA(s.c_str(), c) : NULL; } +inline const char* wxStrrchr(const wxString& s, const wxUniCharRef& uc) + { char c; return uc.GetAsChar(&c) ? wxCRT_StrrchrA(s.c_str(), c) : NULL; } +inline const wchar_t* wxStrchr(const wxString& s, wchar_t c) + { return wxCRT_StrchrW((const wchar_t*)s.c_str(), c); } +inline const wchar_t* wxStrrchr(const wxString& s, wchar_t c) + { return wxCRT_StrrchrW((const wchar_t*)s.c_str(), c); } +inline const char* wxStrchr(const wxCStrData& s, char c) + { return wxCRT_StrchrA(s.AsChar(), c); } +inline const char* wxStrrchr(const wxCStrData& s, char c) + { return wxCRT_StrrchrA(s.AsChar(), c); } +inline const char* wxStrchr(const wxCStrData& s, int c) + { return wxCRT_StrchrA(s.AsChar(), c); } +inline const char* wxStrrchr(const wxCStrData& s, int c) + { return wxCRT_StrrchrA(s.AsChar(), c); } +inline const char* wxStrchr(const wxCStrData& s, const wxUniChar& uc) + { char c; return uc.GetAsChar(&c) ? wxCRT_StrchrA(s, c) : NULL; } +inline const char* wxStrrchr(const wxCStrData& s, const wxUniChar& uc) + { char c; return uc.GetAsChar(&c) ? wxCRT_StrrchrA(s, c) : NULL; } +inline const char* wxStrchr(const wxCStrData& s, const wxUniCharRef& uc) + { char c; return uc.GetAsChar(&c) ? wxCRT_StrchrA(s, c) : NULL; } +inline const char* wxStrrchr(const wxCStrData& s, const wxUniCharRef& uc) + { char c; return uc.GetAsChar(&c) ? wxCRT_StrrchrA(s, c) : NULL; } +inline const wchar_t* wxStrchr(const wxCStrData& s, wchar_t c) + { return wxCRT_StrchrW(s.AsWChar(), c); } +inline const wchar_t* wxStrrchr(const wxCStrData& s, wchar_t c) + { return wxCRT_StrrchrW(s.AsWChar(), c); } + +inline const char *wxStrpbrk(const char *s, const char *accept) + { return wxCRT_StrpbrkA(s, accept); } +inline const wchar_t *wxStrpbrk(const wchar_t *s, const wchar_t *accept) + { return wxCRT_StrpbrkW(s, accept); } +inline const char *wxStrpbrk(const char *s, const wxString& accept) + { return wxCRT_StrpbrkA(s, accept.mb_str()); } +inline const char *wxStrpbrk(const char *s, const wxCStrData& accept) + { return wxCRT_StrpbrkA(s, accept.AsCharBuf()); } +inline const wchar_t *wxStrpbrk(const wchar_t *s, const wxString& accept) + { return wxCRT_StrpbrkW(s, accept.wc_str()); } +inline const wchar_t *wxStrpbrk(const wchar_t *s, const wxCStrData& accept) + { return wxCRT_StrpbrkW(s, accept.AsWCharBuf()); } +inline const char *wxStrpbrk(const wxString& s, const wxString& accept) + { return wxCRT_StrpbrkA(s.c_str(), accept.mb_str()); } +inline const char *wxStrpbrk(const wxString& s, const char *accept) + { return wxCRT_StrpbrkA(s.c_str(), accept); } +inline const wchar_t *wxStrpbrk(const wxString& s, const wchar_t *accept) + { return wxCRT_StrpbrkW(s.wc_str(), accept); } +inline const char *wxStrpbrk(const wxString& s, const wxCStrData& accept) + { return wxCRT_StrpbrkA(s.c_str(), accept.AsCharBuf()); } +inline const char *wxStrpbrk(const wxCStrData& s, const wxString& accept) + { return wxCRT_StrpbrkA(s.AsChar(), accept.mb_str()); } +inline const char *wxStrpbrk(const wxCStrData& s, const char *accept) + { return wxCRT_StrpbrkA(s.AsChar(), accept); } +inline const wchar_t *wxStrpbrk(const wxCStrData& s, const wchar_t *accept) + { return wxCRT_StrpbrkW(s.AsWChar(), accept); } +inline const char *wxStrpbrk(const wxCStrData& s, const wxCStrData& accept) + { return wxCRT_StrpbrkA(s.AsChar(), accept.AsCharBuf()); } +template <typename S, typename T> +inline const T *wxStrpbrk(const S& s, const wxScopedCharTypeBuffer<T>& accept) + { return wxStrpbrk(s, accept.data()); } + + +/* inlined non-const versions */ +template <typename T> +inline char *wxStrstr(char *haystack, T needle) + { return const_cast<char*>(wxStrstr(const_cast<const char*>(haystack), needle)); } +template <typename T> +inline wchar_t *wxStrstr(wchar_t *haystack, T needle) + { return const_cast<wchar_t*>(wxStrstr(const_cast<const wchar_t*>(haystack), needle)); } + +template <typename T> +inline char * wxStrchr(char *s, T c) + { return const_cast<char*>(wxStrchr(const_cast<const char*>(s), c)); } +template <typename T> +inline wchar_t * wxStrchr(wchar_t *s, T c) + { return (wchar_t *)wxStrchr((const wchar_t *)s, c); } +template <typename T> +inline char * wxStrrchr(char *s, T c) + { return const_cast<char*>(wxStrrchr(const_cast<const char*>(s), c)); } +template <typename T> +inline wchar_t * wxStrrchr(wchar_t *s, T c) + { return const_cast<wchar_t*>(wxStrrchr(const_cast<const wchar_t*>(s), c)); } + +template <typename T> +inline char * wxStrpbrk(char *s, T accept) + { return const_cast<char*>(wxStrpbrk(const_cast<const char*>(s), accept)); } +template <typename T> +inline wchar_t * wxStrpbrk(wchar_t *s, T accept) + { return const_cast<wchar_t*>(wxStrpbrk(const_cast<const wchar_t*>(s), accept)); } + + +// ---------------------------------------------------------------------------- +// stdio.h functions +// ---------------------------------------------------------------------------- + +// NB: using fn_str() for mode is a hack to get the same type (char*/wchar_t*) +// as needed, the conversion itself doesn't matter, it's ASCII +inline FILE *wxFopen(const wxString& path, const wxString& mode) + { return wxCRT_Fopen(path.fn_str(), mode.fn_str()); } +inline FILE *wxFreopen(const wxString& path, const wxString& mode, FILE *stream) + { return wxCRT_Freopen(path.fn_str(), mode.fn_str(), stream); } +inline int wxRemove(const wxString& path) + { return wxCRT_Remove(path.fn_str()); } +inline int wxRename(const wxString& oldpath, const wxString& newpath) + { return wxCRT_Rename(oldpath.fn_str(), newpath.fn_str()); } + +extern WXDLLIMPEXP_BASE int wxPuts(const wxString& s); +extern WXDLLIMPEXP_BASE int wxFputs(const wxString& s, FILE *stream); +extern WXDLLIMPEXP_BASE void wxPerror(const wxString& s); + +extern WXDLLIMPEXP_BASE int wxFputc(const wxUniChar& c, FILE *stream); + +#define wxPutc(c, stream) wxFputc(c, stream) +#define wxPutchar(c) wxFputc(c, stdout) +#define wxFputchar(c) wxPutchar(c) + +// NB: We only provide ANSI version of fgets() because fgetws() interprets the +// stream according to current locale, which is rarely what is desired. +inline char *wxFgets(char *s, int size, FILE *stream) + { return wxCRT_FgetsA(s, size, stream); } +// This version calls ANSI version and converts the string using wxConvLibc +extern WXDLLIMPEXP_BASE wchar_t *wxFgets(wchar_t *s, int size, FILE *stream); + +#define wxGets(s) wxGets_is_insecure_and_dangerous_use_wxFgets_instead + +// NB: We only provide ANSI versions of this for the same reasons as in the +// case of wxFgets() above +inline int wxFgetc(FILE *stream) { return wxCRT_FgetcA(stream); } +inline int wxUngetc(int c, FILE *stream) { return wxCRT_UngetcA(c, stream); } + +#define wxGetc(stream) wxFgetc(stream) +#define wxGetchar() wxFgetc(stdin) +#define wxFgetchar() wxGetchar() + +// ---------------------------------------------------------------------------- +// stdlib.h functions +// ---------------------------------------------------------------------------- + +#ifdef wxCRT_AtoiW +inline int wxAtoi(const wxString& str) { return wxCRT_AtoiW(str.wc_str()); } +#else +inline int wxAtoi(const wxString& str) { return wxCRT_AtoiA(str.mb_str()); } +#endif + +#ifdef wxCRT_AtolW +inline long wxAtol(const wxString& str) { return wxCRT_AtolW(str.wc_str()); } +#else +inline long wxAtol(const wxString& str) { return wxCRT_AtolA(str.mb_str()); } +#endif + +#ifdef wxCRT_AtofW +inline double wxAtof(const wxString& str) { return wxCRT_AtofW(str.wc_str()); } +#else +inline double wxAtof(const wxString& str) { return wxCRT_AtofA(str.mb_str()); } +#endif + +inline double wxStrtod(const char *nptr, char **endptr) + { return wxCRT_StrtodA(nptr, endptr); } +inline double wxStrtod(const wchar_t *nptr, wchar_t **endptr) + { return wxCRT_StrtodW(nptr, endptr); } +template<typename T> +inline double wxStrtod(const wxScopedCharTypeBuffer<T>& nptr, T **endptr) + { return wxStrtod(nptr.data(), endptr); } + +// We implement wxStrto*() like this so that the code compiles when NULL is +// passed in - - if we had just char** and wchar_t** overloads for 'endptr', it +// would be ambiguous. The solution is to use a template so that endptr can be +// any type: when NULL constant is used, the type will be int and we can handle +// that case specially. Otherwise, we infer the type that 'nptr' should be +// converted to from the type of 'endptr'. We need wxStrtoxCharType<T> template +// to make the code compile even for T=int (that's the case when it's not going +// to be ever used, but it still has to compile). +template<typename T> struct wxStrtoxCharType {}; +template<> struct wxStrtoxCharType<char**> +{ + typedef const char* Type; + static char** AsPointer(char **p) { return p; } +}; +template<> struct wxStrtoxCharType<wchar_t**> +{ + typedef const wchar_t* Type; + static wchar_t** AsPointer(wchar_t **p) { return p; } +}; +template<> struct wxStrtoxCharType<int> +{ + typedef const char* Type; /* this one is never used */ + static char** AsPointer(int WXUNUSED_UNLESS_DEBUG(p)) + { + wxASSERT_MSG( p == 0, "passing non-NULL int is invalid" ); + return NULL; + } +}; + +template<typename T> +inline double wxStrtod(const wxString& nptr, T endptr) +{ + if ( endptr == 0 ) + { + // when we don't care about endptr, use the string representation that + // doesn't require any conversion (it doesn't matter for this function + // even if its UTF-8): + return wxStrtod(nptr.wx_str(), (wxStringCharType**)NULL); + } + else + { + // note that it is important to use c_str() here and not mb_str() or + // wc_str(), because we store the pointer into (possibly converted) + // buffer in endptr and so it must be valid even when wxStrtod() returns + typedef typename wxStrtoxCharType<T>::Type CharType; + return wxStrtod((CharType)nptr.c_str(), + wxStrtoxCharType<T>::AsPointer(endptr)); + } +} +template<typename T> +inline double wxStrtod(const wxCStrData& nptr, T endptr) + { return wxStrtod(nptr.AsString(), endptr); } + + +#define WX_STRTOX_FUNC(rettype, name, implA, implW) \ + /* see wxStrtod() above for explanation of this code: */ \ + inline rettype name(const char *nptr, char **endptr, int base) \ + { return implA(nptr, endptr, base); } \ + inline rettype name(const wchar_t *nptr, wchar_t **endptr, int base) \ + { return implW(nptr, endptr, base); } \ + template<typename T> \ + inline rettype name(const wxScopedCharTypeBuffer<T>& nptr, T **endptr, int)\ + { return name(nptr.data(), endptr); } \ + template<typename T> \ + inline rettype name(const wxString& nptr, T endptr, int base) \ + { \ + if ( endptr == 0 ) \ + return name(nptr.wx_str(), (wxStringCharType**)NULL, base); \ + else \ + { \ + typedef typename wxStrtoxCharType<T>::Type CharType; \ + return name((CharType)nptr.c_str(), \ + wxStrtoxCharType<T>::AsPointer(endptr), \ + base); \ + } \ + } \ + template<typename T> \ + inline rettype name(const wxCStrData& nptr, T endptr, int base) \ + { return name(nptr.AsString(), endptr, base); } + +WX_STRTOX_FUNC(long, wxStrtol, wxCRT_StrtolA, wxCRT_StrtolW) +WX_STRTOX_FUNC(unsigned long, wxStrtoul, wxCRT_StrtoulA, wxCRT_StrtoulW) +#ifdef wxLongLong_t +WX_STRTOX_FUNC(wxLongLong_t, wxStrtoll, wxCRT_StrtollA, wxCRT_StrtollW) +WX_STRTOX_FUNC(wxULongLong_t, wxStrtoull, wxCRT_StrtoullA, wxCRT_StrtoullW) +#endif // wxLongLong_t + +#undef WX_STRTOX_FUNC + + +// there is no command interpreter under CE, hence no system() +#ifndef __WXWINCE__ + +// mingw32 doesn't provide _tsystem() even though it provides other stdlib.h +// functions in their wide versions +#ifdef wxCRT_SystemW +inline int wxSystem(const wxString& str) { return wxCRT_SystemW(str.wc_str()); } +#else +inline int wxSystem(const wxString& str) { return wxCRT_SystemA(str.mb_str()); } +#endif + +#endif // !__WXWINCE__/__WXWINCE__ + +inline char* wxGetenv(const char *name) { return wxCRT_GetenvA(name); } +inline wchar_t* wxGetenv(const wchar_t *name) { return wxCRT_GetenvW(name); } +inline char* wxGetenv(const wxString& name) { return wxCRT_GetenvA(name.mb_str()); } +inline char* wxGetenv(const wxCStrData& name) { return wxCRT_GetenvA(name.AsCharBuf()); } +inline char* wxGetenv(const wxScopedCharBuffer& name) { return wxCRT_GetenvA(name.data()); } +inline wchar_t* wxGetenv(const wxScopedWCharBuffer& name) { return wxCRT_GetenvW(name.data()); } + +// ---------------------------------------------------------------------------- +// time.h functions +// ---------------------------------------------------------------------------- + +inline size_t wxStrftime(char *s, size_t max, + const wxString& format, const struct tm *tm) + { return wxCRT_StrftimeA(s, max, format.mb_str(), tm); } + +inline size_t wxStrftime(wchar_t *s, size_t max, + const wxString& format, const struct tm *tm) + { return wxCRT_StrftimeW(s, max, format.wc_str(), tm); } + +// NB: we can't provide both char* and wchar_t* versions for obvious reasons +// and returning wxString wouldn't work either (it would be immediately +// destroyed and if assigned to char*/wchar_t*, the pointer would be +// invalid), so we only keep ASCII version, because the returned value +// is always ASCII anyway +#define wxAsctime asctime +#define wxCtime ctime + + +// ---------------------------------------------------------------------------- +// ctype.h functions +// ---------------------------------------------------------------------------- + +// FIXME-UTF8: we'd be better off implementing these ourselves, as the CRT +// version is locale-dependent +// FIXME-UTF8: these don't work when EOF is passed in because of wxUniChar, +// is this OK or not? + +inline bool wxIsalnum(const wxUniChar& c) { return wxCRT_IsalnumW(c) != 0; } +inline bool wxIsalpha(const wxUniChar& c) { return wxCRT_IsalphaW(c) != 0; } +inline bool wxIscntrl(const wxUniChar& c) { return wxCRT_IscntrlW(c) != 0; } +inline bool wxIsdigit(const wxUniChar& c) { return wxCRT_IsdigitW(c) != 0; } +inline bool wxIsgraph(const wxUniChar& c) { return wxCRT_IsgraphW(c) != 0; } +inline bool wxIslower(const wxUniChar& c) { return wxCRT_IslowerW(c) != 0; } +inline bool wxIsprint(const wxUniChar& c) { return wxCRT_IsprintW(c) != 0; } +inline bool wxIspunct(const wxUniChar& c) { return wxCRT_IspunctW(c) != 0; } +inline bool wxIsspace(const wxUniChar& c) { return wxCRT_IsspaceW(c) != 0; } +inline bool wxIsupper(const wxUniChar& c) { return wxCRT_IsupperW(c) != 0; } +inline bool wxIsxdigit(const wxUniChar& c) { return wxCRT_IsxdigitW(c) != 0; } + +inline wxUniChar wxTolower(const wxUniChar& c) { return wxCRT_TolowerW(c); } +inline wxUniChar wxToupper(const wxUniChar& c) { return wxCRT_ToupperW(c); } + +#if WXWIN_COMPATIBILITY_2_8 +// we had goofed and defined wxIsctrl() instead of (correct) wxIscntrl() in the +// initial versions of this header -- now it is too late to remove it so +// although we fixed the function/macro name above, still provide the +// backwards-compatible synonym. +wxDEPRECATED( inline int wxIsctrl(const wxUniChar& c) ); +inline int wxIsctrl(const wxUniChar& c) { return wxIscntrl(c); } +#endif // WXWIN_COMPATIBILITY_2_8 + +inline bool wxIsascii(const wxUniChar& c) { return c.IsAscii(); } + +#endif /* _WX_WXCRT_H_ */ diff --git a/wxmsw/include/wx-3.0/wx/wxcrtbase.h b/wxmsw/include/wx-3.0/wx/wxcrtbase.h new file mode 100644 index 00000000..1c3522ec --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/wxcrtbase.h @@ -0,0 +1,690 @@ +/* + * Name: wx/wxcrtbase.h + * Purpose: Type-safe ANSI and Unicode builds compatible wrappers for + * CRT functions + * Author: Joel Farley, Ove Kaaven + * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee + * Created: 1998/06/12 + * Copyright: (c) 1998-2006 wxWidgets dev team + * Licence: wxWindows licence + */ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_WXCRTBASE_H_ +#define _WX_WXCRTBASE_H_ + +/* ------------------------------------------------------------------------- + headers and missing declarations + ------------------------------------------------------------------------- */ + +#include "wx/chartype.h" + +/* + Standard headers we need here. + + NB: don't include any wxWidgets headers here because almost all of them + include this one! + + NB2: User code should include wx/crt.h instead of including this + header directly. + + */ + +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include <wctype.h> +#include <time.h> + +#if defined(__WINDOWS__) && !defined(__WXWINCE__) + #include <io.h> +#endif + +#if defined(HAVE_STRTOK_R) && defined(__DARWIN__) && defined(_MSL_USING_MW_C_HEADERS) && _MSL_USING_MW_C_HEADERS + char *strtok_r(char *, const char *, char **); +#endif + +/* + Using -std=c++{98,0x} option with mingw32 disables most of standard + library extensions, so we can't rely on the presence of common non-ANSI + functions, define a special symbol to test for this. Notice that this + doesn't need to be done for g++ under Linux where _GNU_SOURCE (which is + defined by default) still makes all common extensions available even in + ANSI mode. + */ +#if defined(__MINGW32__) && defined(__STRICT_ANSI__) + #define __WX_STRICT_ANSI_GCC__ +#endif + +/* + a few compilers don't have the (non standard but common) isascii function, + define it ourselves for them + */ +#ifndef isascii + #if defined(__WX_STRICT_ANSI_GCC__) + #define wxNEED_ISASCII + #elif defined(_WIN32_WCE) + #if _WIN32_WCE <= 211 + #define wxNEED_ISASCII + #endif + #endif +#endif /* isascii */ + +#ifdef wxNEED_ISASCII + inline int isascii(int c) { return (unsigned)c < 0x80; } +#endif + +#ifdef _WIN32_WCE + #if _WIN32_WCE <= 211 + #define isspace(c) ((c) == wxT(' ') || (c) == wxT('\t')) + #endif +#endif /* _WIN32_WCE */ + +/* string.h functions */ +#ifndef strdup + #if defined(__WXWINCE__) + #if _WIN32_WCE <= 211 + #define wxNEED_STRDUP + #endif + #endif +#endif /* strdup */ + +#ifdef wxNEED_STRDUP + WXDLLIMPEXP_BASE char *strdup(const char* s); +#endif + +/* missing functions in some WinCE versions */ +#ifdef _WIN32_WCE +#if (_WIN32_WCE < 300) +WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); +#endif +#endif /* _WIN32_WCE */ + + +/* ------------------------------------------------------------------------- + UTF-8 locale handling + ------------------------------------------------------------------------- */ + +#ifdef __cplusplus + #if wxUSE_UNICODE_UTF8 + /* flag indicating whether the current locale uses UTF-8 or not; must be + updated every time the locale is changed! */ + #if wxUSE_UTF8_LOCALE_ONLY + #define wxLocaleIsUtf8 true + #else + extern WXDLLIMPEXP_BASE bool wxLocaleIsUtf8; + #endif + /* function used to update the flag: */ + extern WXDLLIMPEXP_BASE void wxUpdateLocaleIsUtf8(); + #else /* !wxUSE_UNICODE_UTF8 */ + inline void wxUpdateLocaleIsUtf8() {} + #endif /* wxUSE_UNICODE_UTF8/!wxUSE_UNICODE_UTF8 */ +#endif /* __cplusplus */ + + +/* ------------------------------------------------------------------------- + string.h + ------------------------------------------------------------------------- */ + +#define wxCRT_StrcatA strcat +#define wxCRT_StrchrA strchr +#define wxCRT_StrcmpA strcmp +#define wxCRT_StrcpyA strcpy +#define wxCRT_StrcspnA strcspn +#define wxCRT_StrlenA strlen +#define wxCRT_StrncatA strncat +#define wxCRT_StrncmpA strncmp +#define wxCRT_StrncpyA strncpy +#define wxCRT_StrpbrkA strpbrk +#define wxCRT_StrrchrA strrchr +#define wxCRT_StrspnA strspn +#define wxCRT_StrstrA strstr + +#define wxCRT_StrcatW wcscat +#define wxCRT_StrchrW wcschr +#define wxCRT_StrcmpW wcscmp +#define wxCRT_StrcpyW wcscpy +#define wxCRT_StrcspnW wcscspn +#define wxCRT_StrncatW wcsncat +#define wxCRT_StrncmpW wcsncmp +#define wxCRT_StrncpyW wcsncpy +#define wxCRT_StrpbrkW wcspbrk +#define wxCRT_StrrchrW wcsrchr +#define wxCRT_StrspnW wcsspn +#define wxCRT_StrstrW wcsstr + +/* these functions are not defined under CE, at least in VC8 CRT */ +#if !defined(__WXWINCE__) + #define wxCRT_StrcollA strcoll + #define wxCRT_StrxfrmA strxfrm + + #define wxCRT_StrcollW wcscoll + #define wxCRT_StrxfrmW wcsxfrm +#endif /* __WXWINCE__ */ + +/* Almost all compilers have strdup(), but VC++ and MinGW call it _strdup(). + And it's not available in MinGW strict ANSI mode nor under Windows CE. */ +#if (defined(__VISUALC__) && __VISUALC__ >= 1400) + #define wxCRT_StrdupA _strdup +#elif defined(__MINGW32__) + #ifndef __WX_STRICT_ANSI_GCC__ + #define wxCRT_StrdupA _strdup + #endif +#elif !defined(__WXWINCE__) + #define wxCRT_StrdupA strdup +#endif + +/* most Windows compilers provide _wcsdup() */ +#if defined(__WINDOWS__) && \ + !(defined(__CYGWIN__) || defined(__WX_STRICT_ANSI_GCC__)) + #define wxCRT_StrdupW _wcsdup +#elif defined(HAVE_WCSDUP) + #define wxCRT_StrdupW wcsdup +#endif + +#ifdef wxHAVE_TCHAR_SUPPORT + /* we surely have wchar_t if we have TCHAR have wcslen() */ + #ifndef HAVE_WCSLEN + #define HAVE_WCSLEN + #endif +#endif /* wxHAVE_TCHAR_SUPPORT */ + +#ifdef HAVE_WCSLEN + #define wxCRT_StrlenW wcslen +#endif + +#define wxCRT_StrtodA strtod +#define wxCRT_StrtolA strtol +#define wxCRT_StrtoulA strtoul +#define wxCRT_StrtodW wcstod +#define wxCRT_StrtolW wcstol +#define wxCRT_StrtoulW wcstoul + +#ifdef __VISUALC__ + #if __VISUALC__ >= 1300 && !defined(__WXWINCE__) + #define wxCRT_StrtollA _strtoi64 + #define wxCRT_StrtoullA _strtoui64 + #define wxCRT_StrtollW _wcstoi64 + #define wxCRT_StrtoullW _wcstoui64 + #endif /* VC++ 7+ */ +#else + #ifdef HAVE_STRTOULL + #define wxCRT_StrtollA strtoll + #define wxCRT_StrtoullA strtoull + #endif /* HAVE_STRTOULL */ + #ifdef HAVE_WCSTOULL + /* assume that we have wcstoull(), which is also C99, too */ + #define wxCRT_StrtollW wcstoll + #define wxCRT_StrtoullW wcstoull + #endif /* HAVE_WCSTOULL */ +#endif + +/* + Only VC8 and later provide strnlen() and wcsnlen() functions under Windows + and it's also only available starting from Windows CE 6.0 only in CE build. + */ +#if wxCHECK_VISUALC_VERSION(8) && (!defined(_WIN32_WCE) || (_WIN32_WCE >= 0x600)) + #ifndef HAVE_STRNLEN + #define HAVE_STRNLEN + #endif + #ifndef HAVE_WCSNLEN + #define HAVE_WCSNLEN + #endif +#endif + +#ifdef HAVE_STRNLEN + #define wxCRT_StrnlenA strnlen +#endif + +#ifdef HAVE_WCSNLEN + #define wxCRT_StrnlenW wcsnlen +#endif + +/* define wxCRT_StricmpA/W and wxCRT_StrnicmpA/W for various compilers */ + +#if defined(__BORLANDC__) || defined(__WATCOMC__) || \ + defined(__VISAGECPP__) || \ + defined(__EMX__) || defined(__DJGPP__) + #define wxCRT_StricmpA stricmp + #define wxCRT_StrnicmpA strnicmp +#elif defined(__SYMANTEC__) || (defined(__VISUALC__) && !defined(__WXWINCE__)) + #define wxCRT_StricmpA _stricmp + #define wxCRT_StrnicmpA _strnicmp +#elif defined(__UNIX__) || (defined(__GNUWIN32__) && !defined(__WX_STRICT_ANSI_GCC__)) + #define wxCRT_StricmpA strcasecmp + #define wxCRT_StrnicmpA strncasecmp +/* #else -- use wxWidgets implementation */ +#endif + +#ifdef __VISUALC__ + #define wxCRT_StricmpW _wcsicmp + #define wxCRT_StrnicmpW _wcsnicmp +#elif defined(__UNIX__) + #ifdef HAVE_WCSCASECMP + #define wxCRT_StricmpW wcscasecmp + #endif + #ifdef HAVE_WCSNCASECMP + #define wxCRT_StrnicmpW wcsncasecmp + #endif +/* #else -- use wxWidgets implementation */ +#endif + +#ifdef HAVE_STRTOK_R + #define wxCRT_StrtokA(str, sep, last) strtok_r(str, sep, last) +#endif +/* FIXME-UTF8: detect and use wcstok() if available for wxCRT_StrtokW */ + +/* these are extern "C" because they are used by regex lib: */ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef wxCRT_StrlenW +WXDLLIMPEXP_BASE size_t wxCRT_StrlenW(const wchar_t *s); +#endif + +#ifndef wxCRT_StrncmpW +WXDLLIMPEXP_BASE int wxCRT_StrncmpW(const wchar_t *s1, const wchar_t *s2, size_t n); +#endif + +#ifdef __cplusplus +} +#endif + +/* FIXME-UTF8: remove this once we are Unicode only */ +#if wxUSE_UNICODE + #define wxCRT_StrlenNative wxCRT_StrlenW + #define wxCRT_StrncmpNative wxCRT_StrncmpW + #define wxCRT_ToupperNative wxCRT_ToupperW + #define wxCRT_TolowerNative wxCRT_TolowerW +#else + #define wxCRT_StrlenNative wxCRT_StrlenA + #define wxCRT_StrncmpNative wxCRT_StrncmpA + #define wxCRT_ToupperNative toupper + #define wxCRT_TolowerNative tolower +#endif + +#ifndef wxCRT_StrcatW +WXDLLIMPEXP_BASE wchar_t *wxCRT_StrcatW(wchar_t *dest, const wchar_t *src); +#endif + +#ifndef wxCRT_StrchrW +WXDLLIMPEXP_BASE const wchar_t *wxCRT_StrchrW(const wchar_t *s, wchar_t c); +#endif + +#ifndef wxCRT_StrcmpW +WXDLLIMPEXP_BASE int wxCRT_StrcmpW(const wchar_t *s1, const wchar_t *s2); +#endif + +#ifndef wxCRT_StrcollW +WXDLLIMPEXP_BASE int wxCRT_StrcollW(const wchar_t *s1, const wchar_t *s2); +#endif + +#ifndef wxCRT_StrcpyW +WXDLLIMPEXP_BASE wchar_t *wxCRT_StrcpyW(wchar_t *dest, const wchar_t *src); +#endif + +#ifndef wxCRT_StrcspnW +WXDLLIMPEXP_BASE size_t wxCRT_StrcspnW(const wchar_t *s, const wchar_t *reject); +#endif + +#ifndef wxCRT_StrncatW +WXDLLIMPEXP_BASE wchar_t *wxCRT_StrncatW(wchar_t *dest, const wchar_t *src, size_t n); +#endif + +#ifndef wxCRT_StrncpyW +WXDLLIMPEXP_BASE wchar_t *wxCRT_StrncpyW(wchar_t *dest, const wchar_t *src, size_t n); +#endif + +#ifndef wxCRT_StrpbrkW +WXDLLIMPEXP_BASE const wchar_t *wxCRT_StrpbrkW(const wchar_t *s, const wchar_t *accept); +#endif + +#ifndef wxCRT_StrrchrW +WXDLLIMPEXP_BASE const wchar_t *wxCRT_StrrchrW(const wchar_t *s, wchar_t c); +#endif + +#ifndef wxCRT_StrspnW +WXDLLIMPEXP_BASE size_t wxCRT_StrspnW(const wchar_t *s, const wchar_t *accept); +#endif + +#ifndef wxCRT_StrstrW +WXDLLIMPEXP_BASE const wchar_t *wxCRT_StrstrW(const wchar_t *haystack, const wchar_t *needle); +#endif + +#ifndef wxCRT_StrtodW +WXDLLIMPEXP_BASE double wxCRT_StrtodW(const wchar_t *nptr, wchar_t **endptr); +#endif + +#ifndef wxCRT_StrtolW +WXDLLIMPEXP_BASE long int wxCRT_StrtolW(const wchar_t *nptr, wchar_t **endptr, int base); +#endif + +#ifndef wxCRT_StrtoulW +WXDLLIMPEXP_BASE unsigned long int wxCRT_StrtoulW(const wchar_t *nptr, wchar_t **endptr, int base); +#endif + +#ifndef wxCRT_StrxfrmW +WXDLLIMPEXP_BASE size_t wxCRT_StrxfrmW(wchar_t *dest, const wchar_t *src, size_t n); +#endif + +#ifndef wxCRT_StrdupA +WXDLLIMPEXP_BASE char *wxCRT_StrdupA(const char *psz); +#endif + +#ifndef wxCRT_StrdupW +WXDLLIMPEXP_BASE wchar_t *wxCRT_StrdupW(const wchar_t *pwz); +#endif + +#ifndef wxCRT_StricmpA +WXDLLIMPEXP_BASE int wxCRT_StricmpA(const char *psz1, const char *psz2); +#endif + +#ifndef wxCRT_StricmpW +WXDLLIMPEXP_BASE int wxCRT_StricmpW(const wchar_t *psz1, const wchar_t *psz2); +#endif + +#ifndef wxCRT_StrnicmpA +WXDLLIMPEXP_BASE int wxCRT_StrnicmpA(const char *psz1, const char *psz2, size_t len); +#endif + +#ifndef wxCRT_StrnicmpW +WXDLLIMPEXP_BASE int wxCRT_StrnicmpW(const wchar_t *psz1, const wchar_t *psz2, size_t len); +#endif + +#ifndef wxCRT_StrtokA +WXDLLIMPEXP_BASE char *wxCRT_StrtokA(char *psz, const char *delim, char **save_ptr); +#endif + +#ifndef wxCRT_StrtokW +WXDLLIMPEXP_BASE wchar_t *wxCRT_StrtokW(wchar_t *psz, const wchar_t *delim, wchar_t **save_ptr); +#endif + +/* supply strtoll and strtoull, if needed */ +#ifdef wxLongLong_t + #ifndef wxCRT_StrtollA + WXDLLIMPEXP_BASE wxLongLong_t wxCRT_StrtollA(const char* nptr, + char** endptr, + int base); + WXDLLIMPEXP_BASE wxULongLong_t wxCRT_StrtoullA(const char* nptr, + char** endptr, + int base); + #endif + #ifndef wxCRT_StrtollW + WXDLLIMPEXP_BASE wxLongLong_t wxCRT_StrtollW(const wchar_t* nptr, + wchar_t** endptr, + int base); + WXDLLIMPEXP_BASE wxULongLong_t wxCRT_StrtoullW(const wchar_t* nptr, + wchar_t** endptr, + int base); + #endif +#endif /* wxLongLong_t */ + + +/* ------------------------------------------------------------------------- + stdio.h + ------------------------------------------------------------------------- */ + +#if defined(__UNIX__) || defined(__WXMAC__) + #define wxMBFILES 1 +#else + #define wxMBFILES 0 +#endif + + +/* these functions are only needed in the form used for filenames (i.e. char* + on Unix, wchar_t* on Windows), so we don't need to use A/W suffix: */ +#if wxMBFILES || !wxUSE_UNICODE /* ANSI filenames */ + + #define wxCRT_Fopen fopen + #define wxCRT_Freopen freopen + #define wxCRT_Remove remove + #define wxCRT_Rename rename + +#else /* Unicode filenames */ + /* special case: these functions are missing under Win9x with Unicows so we + have to implement them ourselves */ + #if wxUSE_UNICODE_MSLU || defined(__WX_STRICT_ANSI_GCC__) + WXDLLIMPEXP_BASE FILE* wxMSLU__wfopen(const wchar_t *name, const wchar_t *mode); + WXDLLIMPEXP_BASE FILE* wxMSLU__wfreopen(const wchar_t *name, const wchar_t *mode, FILE *stream); + WXDLLIMPEXP_BASE int wxMSLU__wrename(const wchar_t *oldname, const wchar_t *newname); + WXDLLIMPEXP_BASE int wxMSLU__wremove(const wchar_t *name); + #define wxCRT_Fopen wxMSLU__wfopen + #define wxCRT_Freopen wxMSLU__wfreopen + #define wxCRT_Remove wxMSLU__wremove + #define wxCRT_Rename wxMSLU__wrename + #else + /* WinCE CRT doesn't provide these functions so use our own */ + #ifdef __WXWINCE__ + WXDLLIMPEXP_BASE int wxCRT_Rename(const wchar_t *src, + const wchar_t *dst); + WXDLLIMPEXP_BASE int wxCRT_Remove(const wchar_t *path); + #else + #define wxCRT_Rename _wrename + #define wxCRT_Remove _wremove + #endif + #define wxCRT_Fopen _wfopen + #define wxCRT_Freopen _wfreopen + #endif + +#endif /* wxMBFILES/!wxMBFILES */ + +#define wxCRT_PutsA puts +#define wxCRT_FputsA fputs +#define wxCRT_FgetsA fgets +#define wxCRT_FputcA fputc +#define wxCRT_FgetcA fgetc +#define wxCRT_UngetcA ungetc + +#ifdef wxHAVE_TCHAR_SUPPORT + #define wxCRT_PutsW _putws + #define wxCRT_FputsW fputws + #define wxCRT_FputcW fputwc +#endif +#ifdef HAVE_FPUTWS + #define wxCRT_FputsW fputws +#endif +#ifdef HAVE_PUTWS + #define wxCRT_PutsW putws +#endif +#ifdef HAVE_FPUTWC + #define wxCRT_FputcW fputwc +#endif +#define wxCRT_FgetsW fgetws + +#ifndef wxCRT_PutsW +WXDLLIMPEXP_BASE int wxCRT_PutsW(const wchar_t *ws); +#endif + +#ifndef wxCRT_FputsW +WXDLLIMPEXP_BASE int wxCRT_FputsW(const wchar_t *ch, FILE *stream); +#endif + +#ifndef wxCRT_FputcW +WXDLLIMPEXP_BASE int wxCRT_FputcW(wchar_t wc, FILE *stream); +#endif + +/* + NB: tmpnam() is unsafe and thus is not wrapped! + Use other wxWidgets facilities instead: + wxFileName::CreateTempFileName, wxTempFile, or wxTempFileOutputStream +*/ +#define wxTmpnam(x) wxTmpnam_is_insecure_use_wxTempFile_instead + +/* FIXME-CE: provide our own perror() using ::GetLastError() */ +#ifndef __WXWINCE__ + +#define wxCRT_PerrorA perror +#ifdef wxHAVE_TCHAR_SUPPORT + #define wxCRT_PerrorW _wperror +#endif + +#endif /* !__WXWINCE__ */ + +/* ------------------------------------------------------------------------- + stdlib.h + ------------------------------------------------------------------------- */ + +/* there are no env vars at all under CE, so no _tgetenv neither */ +#ifdef __WXWINCE__ + /* can't define as inline function as this is a C file... */ + #define wxCRT_GetenvA(name) (name, NULL) + #define wxCRT_GetenvW(name) (name, NULL) +#else + #define wxCRT_GetenvA getenv + #ifdef _tgetenv + #define wxCRT_GetenvW _wgetenv + #endif +#endif + +#ifndef wxCRT_GetenvW +WXDLLIMPEXP_BASE wchar_t * wxCRT_GetenvW(const wchar_t *name); +#endif + + +#define wxCRT_SystemA system +/* mingw32 doesn't provide _tsystem() or _wsystem(): */ +#if defined(_tsystem) + #define wxCRT_SystemW _wsystem +#endif + +#define wxCRT_AtofA atof +#define wxCRT_AtoiA atoi +#define wxCRT_AtolA atol + +#if defined(wxHAVE_TCHAR_SUPPORT) && !defined(__WX_STRICT_ANSI_GCC__) + #define wxCRT_AtoiW _wtoi + #define wxCRT_AtolW _wtol + /* _wtof doesn't exist */ +#else +#ifndef __VMS + #define wxCRT_AtofW(s) wcstod(s, NULL) +#endif + #define wxCRT_AtolW(s) wcstol(s, NULL, 10) + /* wcstoi doesn't exist */ +#endif + +/* ------------------------------------------------------------------------- + time.h + ------------------------------------------------------------------------- */ + +#define wxCRT_StrftimeA strftime +#ifdef __SGI__ + /* + IRIX provides not one but two versions of wcsftime(): XPG4 one which + uses "const char*" for the third parameter and so can't be used and the + correct, XPG5, one. Unfortunately we can't just define _XOPEN_SOURCE + high enough to get XPG5 version as this undefines other symbols which + make other functions we use unavailable (see <standards.h> for gory + details). So just declare the XPG5 version ourselves, we're extremely + unlikely to ever be compiled on a system without it. But if we ever do, + a configure test would need to be added for it (and _MIPS_SYMBOL_PRESENT + should be used to check for its presence during run-time, i.e. it would + probably be simpler to just always use our own wxCRT_StrftimeW() below + if it does ever become a problem). + */ +#ifdef __cplusplus + extern "C" +#endif + size_t + _xpg5_wcsftime(wchar_t *, size_t, const wchar_t *, const struct tm * ); + #define wxCRT_StrftimeW _xpg5_wcsftime +#else + /* + Assume it's always available under non-Unix systems as this does seem + to be the case for now. And under Unix we trust configure to detect it + (except for SGI special case above). + */ + #if defined(HAVE_WCSFTIME) || !defined(__UNIX__) + #define wxCRT_StrftimeW wcsftime + #endif +#endif + +#ifndef wxCRT_StrftimeW +WXDLLIMPEXP_BASE size_t wxCRT_StrftimeW(wchar_t *s, size_t max, + const wchar_t *fmt, + const struct tm *tm); +#endif + + + +/* ------------------------------------------------------------------------- + ctype.h + ------------------------------------------------------------------------- */ + +#ifdef __WATCOMC__ + #define WXWCHAR_T_CAST(c) (wint_t)(c) +#else + #define WXWCHAR_T_CAST(c) c +#endif + +#define wxCRT_IsalnumW(c) iswalnum(WXWCHAR_T_CAST(c)) +#define wxCRT_IsalphaW(c) iswalpha(WXWCHAR_T_CAST(c)) +#define wxCRT_IscntrlW(c) iswcntrl(WXWCHAR_T_CAST(c)) +#define wxCRT_IsdigitW(c) iswdigit(WXWCHAR_T_CAST(c)) +#define wxCRT_IsgraphW(c) iswgraph(WXWCHAR_T_CAST(c)) +#define wxCRT_IslowerW(c) iswlower(WXWCHAR_T_CAST(c)) +#define wxCRT_IsprintW(c) iswprint(WXWCHAR_T_CAST(c)) +#define wxCRT_IspunctW(c) iswpunct(WXWCHAR_T_CAST(c)) +#define wxCRT_IsspaceW(c) iswspace(WXWCHAR_T_CAST(c)) +#define wxCRT_IsupperW(c) iswupper(WXWCHAR_T_CAST(c)) +#define wxCRT_IsxdigitW(c) iswxdigit(WXWCHAR_T_CAST(c)) + +#ifdef __GLIBC__ + #if defined(__GLIBC__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0) + /* /usr/include/wctype.h incorrectly declares translations */ + /* tables which provokes tons of compile-time warnings -- try */ + /* to correct this */ + #define wxCRT_TolowerW(wc) towctrans((wc), (wctrans_t)__ctype_tolower) + #define wxCRT_ToupperW(wc) towctrans((wc), (wctrans_t)__ctype_toupper) + #else /* !glibc 2.0 */ + #define wxCRT_TolowerW towlower + #define wxCRT_ToupperW towupper + #endif +#else /* !__GLIBC__ */ + /* There is a bug in VC6 C RTL: toxxx() functions dosn't do anything + with signed chars < 0, so "fix" it here. */ + #define wxCRT_TolowerW(c) towlower((wxUChar)(wxChar)(c)) + #define wxCRT_ToupperW(c) towupper((wxUChar)(wxChar)(c)) +#endif /* __GLIBC__/!__GLIBC__ */ + + + + + +/* ------------------------------------------------------------------------- + wx wrappers for CRT functions in both char* and wchar_t* versions + ------------------------------------------------------------------------- */ + +#ifdef __cplusplus + +/* NB: this belongs to wxcrt.h and not this header, but it makes life easier + * for buffer.h and stringimpl.h (both of which must be included before + * string.h, which is required by wxcrt.h) to have them here: */ + +/* safe version of strlen() (returns 0 if passed NULL pointer) */ +inline size_t wxStrlen(const char *s) { return s ? wxCRT_StrlenA(s) : 0; } +inline size_t wxStrlen(const wchar_t *s) { return s ? wxCRT_StrlenW(s) : 0; } +#ifndef wxWCHAR_T_IS_WXCHAR16 + WXDLLIMPEXP_BASE size_t wxStrlen(const wxChar16 *s ); +#endif +#ifndef wxWCHAR_T_IS_WXCHAR32 + WXDLLIMPEXP_BASE size_t wxStrlen(const wxChar32 *s ); +#endif +#define wxWcslen wxCRT_StrlenW + +#define wxStrdupA wxCRT_StrdupA +#define wxStrdupW wxCRT_StrdupW +inline char* wxStrdup(const char *s) { return wxCRT_StrdupA(s); } +inline wchar_t* wxStrdup(const wchar_t *s) { return wxCRT_StrdupW(s); } +#ifndef wxWCHAR_T_IS_WXCHAR16 + WXDLLIMPEXP_BASE wxChar16* wxStrdup(const wxChar16* s); +#endif +#ifndef wxWCHAR_T_IS_WXCHAR32 + WXDLLIMPEXP_BASE wxChar32* wxStrdup(const wxChar32* s); +#endif + +#endif /* __cplusplus */ + +#endif /* _WX_WXCRTBASE_H_ */ diff --git a/wxmsw/include/wx-3.0/wx/wxcrtvararg.h b/wxmsw/include/wx-3.0/wx/wxcrtvararg.h new file mode 100644 index 00000000..c3a306be --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/wxcrtvararg.h @@ -0,0 +1,486 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/wxcrtvararg.h +// Purpose: Type-safe ANSI and Unicode builds compatible wrappers for +// printf(), scanf() and related CRT functions +// Author: Joel Farley, Ove Kåven +// Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee +// Created: 2007-02-19 +// Copyright: (c) 2007 REA Elektronik GmbH +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WXCRTVARARG_H_ +#define _WX_WXCRTVARARG_H_ + +// NB: User code should include wx/crt.h instead of including this +// header directly. + +#include "wx/wxcrt.h" +#include "wx/strvararg.h" + +#include "wx/string.h" + +// ---------------------------------------------------------------------------- +// CRT functions aliases +// ---------------------------------------------------------------------------- + +/* Required for wxPrintf() etc */ +#include <stdarg.h> + +/* printf() family saga */ + +/* + For many old Unix systems [v]snprintf()/vsscanf() exists in the system + libraries but not in the headers, so we need to declare it ourselves to be + able to use it. + */ +#ifdef __UNIX__ + +#if defined(HAVE_VSNPRINTF) && !defined(HAVE_VSNPRINTF_DECL) +#ifdef __cplusplus + extern "C" +#else + extern +#endif + int vsnprintf(char *str, size_t size, const char *format, va_list ap); +#endif /* !HAVE_VSNPRINTF_DECL */ + +#if defined(HAVE_SNPRINTF) && !defined(HAVE_SNPRINTF_DECL) +#ifdef __cplusplus + extern "C" +#else + extern +#endif + int snprintf(char *str, size_t size, const char *format, ...); +#endif /* !HAVE_SNPRINTF_DECL */ + +#if defined(HAVE_VSSCANF) && !defined(HAVE_VSSCANF_DECL) +#ifdef __cplusplus + extern "C" +#else + extern +#endif + int vsscanf(const char *str, const char *format, va_list ap); +#endif /* !HAVE_VSSCANF_DECL */ + +/* Wrapper for vsnprintf if it's 3rd parameter is non-const. Note: the + * same isn't done for snprintf below, the builtin wxSnprintf_ is used + * instead since it's already a simple wrapper */ +#if defined __cplusplus && defined HAVE_BROKEN_VSNPRINTF_DECL + inline int wx_fixed_vsnprintf(char *str, size_t size, const char *format, va_list ap) + { + return vsnprintf(str, size, (char*)format, ap); + } +#endif + +#endif /* __UNIX__ */ + +/* + mingw32 normally uses MSVCRT which has non-standard vswprintf() and so + normally _vsnwprintf() is used instead, the only exception is when mingw32 + is used with STLPort which does have a standard vswprintf() starting from + version 5.1 which we can use. + */ +#ifdef __MINGW32__ + #if defined(_STLPORT_VERSION) && _STLPORT_VERSION >= 0x510 + #ifndef HAVE_VSWPRINTF + #define HAVE_VSWPRINTF + #endif + #elif defined(HAVE_VSWPRINTF) + /* can't use non-standard vswprintf() */ + #undef HAVE_VSWPRINTF + #endif +#endif /* __MINGW32__ */ + +#if defined(__WATCOMC__) + #define HAVE_VSWPRINTF 1 +#endif + +#if wxUSE_PRINTF_POS_PARAMS + /* + The systems where vsnprintf() supports positional parameters should + define the HAVE_UNIX98_PRINTF symbol. + + On systems which don't (e.g. Windows) we are forced to use + our wxVsnprintf() implementation. + */ + #if defined(HAVE_UNIX98_PRINTF) + #ifdef HAVE_VSWPRINTF + #define wxCRT_VsnprintfW vswprintf + #endif + #ifdef HAVE_BROKEN_VSNPRINTF_DECL + #define wxCRT_VsnprintfA wx_fixed_vsnprintf + #else + #define wxCRT_VsnprintfA vsnprintf + #endif + #else /* !HAVE_UNIX98_PRINTF */ + /* + The only compiler with positional parameters support under Windows + is VC++ 8.0 which provides a new xxprintf_p() functions family. + The 2003 PSDK includes a slightly earlier version of VC8 than the + main release and does not have the printf_p functions. + */ + #if defined _MSC_FULL_VER && _MSC_FULL_VER >= 140050727 && !defined __WXWINCE__ + #define wxCRT_VsnprintfA _vsprintf_p + #define wxCRT_VsnprintfW _vswprintf_p + #endif + #endif /* HAVE_UNIX98_PRINTF/!HAVE_UNIX98_PRINTF */ +#else /* !wxUSE_PRINTF_POS_PARAMS */ + /* + We always want to define safe snprintf() function to be used instead of + sprintf(). Some compilers already have it (or rather vsnprintf() which + we really need...), otherwise we implement it using our own printf() + code. + + We define function with a trailing underscore here because the real one + is a wrapper around it as explained below + */ + + #if defined(__VISUALC__) || \ + (defined(__BORLANDC__) && __BORLANDC__ >= 0x540) + #define wxCRT_VsnprintfA _vsnprintf + #define wxCRT_VsnprintfW _vsnwprintf + #else + #if defined(HAVE__VSNWPRINTF) + #define wxCRT_VsnprintfW _vsnwprintf + #elif defined(HAVE_VSWPRINTF) + #define wxCRT_VsnprintfW vswprintf + #elif defined(__WATCOMC__) + #define wxCRT_VsnprintfW _vsnwprintf + #endif + + #if defined(HAVE_VSNPRINTF) \ + || defined(__WATCOMC__) + #ifdef HAVE_BROKEN_VSNPRINTF_DECL + #define wxCRT_VsnprintfA wx_fixed_vsnprintf + #else + #define wxCRT_VsnprintfA vsnprintf + #endif + #endif + #endif +#endif /* wxUSE_PRINTF_POS_PARAMS/!wxUSE_PRINTF_POS_PARAMS */ + +#ifndef wxCRT_VsnprintfW + /* no (suitable) vsnprintf(), cook our own */ + WXDLLIMPEXP_BASE int + wxCRT_VsnprintfW(wchar_t *buf, size_t len, const wchar_t *format, va_list argptr); + #define wxUSE_WXVSNPRINTFW 1 +#else + #define wxUSE_WXVSNPRINTFW 0 +#endif + +#ifndef wxCRT_VsnprintfA + /* no (suitable) vsnprintf(), cook our own */ + WXDLLIMPEXP_BASE int + wxCRT_VsnprintfA(char *buf, size_t len, const char *format, va_list argptr); + #define wxUSE_WXVSNPRINTFA 1 +#else + #define wxUSE_WXVSNPRINTFA 0 +#endif + +// for wxString code, define wxUSE_WXVSNPRINTF to indicate that wx +// implementation is used no matter what (in UTF-8 build, either *A or *W +// version may be called): +#if !wxUSE_UNICODE + #define wxUSE_WXVSNPRINTF wxUSE_WXVSNPRINTFA +#elif wxUSE_UNICODE_WCHAR + #define wxUSE_WXVSNPRINTF wxUSE_WXVSNPRINTFW +#elif wxUSE_UTF8_LOCALE_ONLY + #define wxUSE_WXVSNPRINTF wxUSE_WXVSNPRINTFA +#else // UTF-8 under any locale + #define wxUSE_WXVSNPRINTF (wxUSE_WXVSNPRINTFA && wxUSE_WXVSNPRINTFW) +#endif + +#define wxCRT_FprintfA fprintf +#define wxCRT_PrintfA printf +#define wxCRT_VfprintfA vfprintf +#define wxCRT_VprintfA vprintf +#define wxCRT_VsprintfA vsprintf + +/* + In Unicode mode we need to have all standard functions such as wprintf() and + so on but not all systems have them so use our own implementations in this + case. + */ +#if wxUSE_UNICODE && !defined(wxHAVE_TCHAR_SUPPORT) && !defined(HAVE_WPRINTF) + #define wxNEED_WPRINTF +#endif +#if wxUSE_UNICODE && !defined(wxHAVE_TCHAR_SUPPORT) && !defined(HAVE_VSWSCANF) + #define wxNEED_VSWSCANF +#endif + + +#if defined(wxNEED_WPRINTF) + /* + we need to implement all wide character printf functions either because + we don't have them at all or because they don't have the semantics we + need + */ + int wxCRT_PrintfW( const wchar_t *format, ... ); + int wxCRT_FprintfW( FILE *stream, const wchar_t *format, ... ); + int wxCRT_VfprintfW( FILE *stream, const wchar_t *format, va_list ap ); + int wxCRT_VprintfW( const wchar_t *format, va_list ap ); + int wxCRT_VsprintfW( wchar_t *str, const wchar_t *format, va_list ap ); +#else /* !wxNEED_WPRINTF */ + #define wxCRT_FprintfW fwprintf + #define wxCRT_PrintfW wprintf + #define wxCRT_VfprintfW vfwprintf + #define wxCRT_VprintfW vwprintf + + #if defined(__WINDOWS__) && !defined(HAVE_VSWPRINTF) + // only non-standard vswprintf() without buffer size argument can be used here + #define wxCRT_VsprintfW vswprintf + #endif +#endif /* wxNEED_WPRINTF */ + + +/* Required for wxScanf() etc. */ +#define wxCRT_ScanfA scanf +#define wxCRT_SscanfA sscanf +#define wxCRT_FscanfA fscanf +#define wxCRT_VsscanfA vsscanf + +#if defined(wxNEED_WPRINTF) + int wxCRT_ScanfW(const wchar_t *format, ...); + int wxCRT_SscanfW(const wchar_t *str, const wchar_t *format, ...); + int wxCRT_FscanfW(FILE *stream, const wchar_t *format, ...); +#else + #define wxCRT_ScanfW wxVMS_USE_STD wscanf + #define wxCRT_SscanfW wxVMS_USE_STD swscanf + #define wxCRT_FscanfW wxVMS_USE_STD fwscanf +#endif +#ifdef wxNEED_VSWSCANF + int wxCRT_VsscanfW(const wchar_t *str, const wchar_t *format, va_list ap); +#else + #define wxCRT_VsscanfW wxVMS_USE_STD vswscanf +#endif + +// ---------------------------------------------------------------------------- +// user-friendly wrappers to CRT functions +// ---------------------------------------------------------------------------- + +#ifdef __WATCOMC__ + // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351 + #define wxPrintf wxPrintf_Impl + #define wxFprintf wxFprintf_Impl + #define wxSprintf wxSprintf_Impl + #define wxSnprintf wxSnprintf_Impl +#endif + + // FIXME-UTF8: remove this +#if wxUSE_UNICODE + #define wxCRT_PrintfNative wxCRT_PrintfW + #define wxCRT_FprintfNative wxCRT_FprintfW +#else + #define wxCRT_PrintfNative wxCRT_PrintfA + #define wxCRT_FprintfNative wxCRT_FprintfA +#endif + + +WX_DEFINE_VARARG_FUNC_SANS_N0(int, wxPrintf, 1, (const wxFormatString&), + wxCRT_PrintfNative, wxCRT_PrintfA) +inline int wxPrintf(const wxFormatString& s) +{ + return wxPrintf("%s", s.InputAsString()); +} + +WX_DEFINE_VARARG_FUNC_SANS_N0(int, wxFprintf, 2, (FILE*, const wxFormatString&), + wxCRT_FprintfNative, wxCRT_FprintfA) +inline int wxFprintf(FILE *f, const wxFormatString& s) +{ + return wxFprintf(f, "%s", s.InputAsString()); +} + +// va_list versions of printf functions simply forward to the respective +// CRT function; note that they assume that va_list was created using +// wxArgNormalizer<T>! +#if wxUSE_UNICODE_UTF8 + #if wxUSE_UTF8_LOCALE_ONLY + #define WX_VARARG_VFOO_IMPL(args, implW, implA) \ + return implA args + #else + #define WX_VARARG_VFOO_IMPL(args, implW, implA) \ + if ( wxLocaleIsUtf8 ) return implA args; \ + else return implW args + #endif +#elif wxUSE_UNICODE_WCHAR + #define WX_VARARG_VFOO_IMPL(args, implW, implA) \ + return implW args +#else // ANSI + #define WX_VARARG_VFOO_IMPL(args, implW, implA) \ + return implA args +#endif + +inline int +wxVprintf(const wxString& format, va_list ap) +{ + WX_VARARG_VFOO_IMPL((wxFormatString(format), ap), + wxCRT_VprintfW, wxCRT_VprintfA); +} + +inline int +wxVfprintf(FILE *f, const wxString& format, va_list ap) +{ + WX_VARARG_VFOO_IMPL((f, wxFormatString(format), ap), + wxCRT_VfprintfW, wxCRT_VfprintfA); +} + +#undef WX_VARARG_VFOO_IMPL + + +// wxSprintf() and friends have to be implemented in two forms, one for +// writing to char* buffer and one for writing to wchar_t*: + +#if !wxUSE_UTF8_LOCALE_ONLY +int WXDLLIMPEXP_BASE wxDoSprintfWchar(char *str, const wxChar *format, ...); +#endif +#if wxUSE_UNICODE_UTF8 +int WXDLLIMPEXP_BASE wxDoSprintfUtf8(char *str, const char *format, ...); +#endif +WX_DEFINE_VARARG_FUNC(int, wxSprintf, 2, (char*, const wxFormatString&), + wxDoSprintfWchar, wxDoSprintfUtf8) + +int WXDLLIMPEXP_BASE +wxVsprintf(char *str, const wxString& format, va_list argptr); + +#if !wxUSE_UTF8_LOCALE_ONLY +int WXDLLIMPEXP_BASE wxDoSnprintfWchar(char *str, size_t size, const wxChar *format, ...); +#endif +#if wxUSE_UNICODE_UTF8 +int WXDLLIMPEXP_BASE wxDoSnprintfUtf8(char *str, size_t size, const char *format, ...); +#endif +WX_DEFINE_VARARG_FUNC(int, wxSnprintf, 3, (char*, size_t, const wxFormatString&), + wxDoSnprintfWchar, wxDoSnprintfUtf8) + +int WXDLLIMPEXP_BASE +wxVsnprintf(char *str, size_t size, const wxString& format, va_list argptr); + +#if wxUSE_UNICODE + +#if !wxUSE_UTF8_LOCALE_ONLY +int WXDLLIMPEXP_BASE wxDoSprintfWchar(wchar_t *str, const wxChar *format, ...); +#endif +#if wxUSE_UNICODE_UTF8 +int WXDLLIMPEXP_BASE wxDoSprintfUtf8(wchar_t *str, const char *format, ...); +#endif +WX_DEFINE_VARARG_FUNC(int, wxSprintf, 2, (wchar_t*, const wxFormatString&), + wxDoSprintfWchar, wxDoSprintfUtf8) + +int WXDLLIMPEXP_BASE +wxVsprintf(wchar_t *str, const wxString& format, va_list argptr); + +#if !wxUSE_UTF8_LOCALE_ONLY +int WXDLLIMPEXP_BASE wxDoSnprintfWchar(wchar_t *str, size_t size, const wxChar *format, ...); +#endif +#if wxUSE_UNICODE_UTF8 +int WXDLLIMPEXP_BASE wxDoSnprintfUtf8(wchar_t *str, size_t size, const char *format, ...); +#endif +WX_DEFINE_VARARG_FUNC(int, wxSnprintf, 3, (wchar_t*, size_t, const wxFormatString&), + wxDoSnprintfWchar, wxDoSnprintfUtf8) + +int WXDLLIMPEXP_BASE +wxVsnprintf(wchar_t *str, size_t size, const wxString& format, va_list argptr); + +#endif // wxUSE_UNICODE + +#ifdef __WATCOMC__ + // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351 + // + // fortunately, OpenWatcom implements __VA_ARGS__, so we can provide macros + // that cast the format argument to wxString: + #undef wxPrintf + #undef wxFprintf + #undef wxSprintf + #undef wxSnprintf + + #define wxPrintf(fmt, ...) \ + wxPrintf_Impl(wxFormatString(fmt), __VA_ARGS__) + #define wxFprintf(f, fmt, ...) \ + wxFprintf_Impl(f, wxFormatString(fmt), __VA_ARGS__) + #define wxSprintf(s, fmt, ...) \ + wxSprintf_Impl(s, wxFormatString(fmt), __VA_ARGS__) + #define wxSnprintf(s, n, fmt, ...) \ + wxSnprintf_Impl(s, n, wxFormatString(fmt), __VA_ARGS__) +#endif // __WATCOMC__ + + +// We can't use wxArgNormalizer<T> for variadic arguments to wxScanf() etc. +// because they are writable, so instead of providing friendly template +// vararg-like functions, we just provide both char* and wchar_t* variants +// of these functions. The type of output variadic arguments for %s must match +// the type of 'str' and 'format' arguments. +// +// For compatibility with earlier wx versions, we also provide wxSscanf() +// version with the first argument (input string) wxString; for this version, +// the type of output string values is determined by the type of format string +// only. + +#define _WX_SCANFUNC_EXTRACT_ARGS_1(x) x +#define _WX_SCANFUNC_EXTRACT_ARGS_2(x,y) x, y +#define _WX_SCANFUNC_EXTRACT_ARGS(N, args) _WX_SCANFUNC_EXTRACT_ARGS_##N args + +#define _WX_VARARG_PASS_WRITABLE(i) a##i + +#define _WX_DEFINE_SCANFUNC(N, dummy1, name, impl, passfixed, numfixed, fixed)\ + template<_WX_VARARG_JOIN(N, _WX_VARARG_TEMPL)> \ + int name(_WX_SCANFUNC_EXTRACT_ARGS(numfixed, fixed), \ + _WX_VARARG_JOIN(N, _WX_VARARG_ARG)) \ + { \ + return impl(_WX_SCANFUNC_EXTRACT_ARGS(numfixed, passfixed), \ + _WX_VARARG_JOIN(N, _WX_VARARG_PASS_WRITABLE)); \ + } + +#define WX_DEFINE_SCANFUNC(name, numfixed, fixed, impl, passfixed) \ + _WX_VARARG_ITER(_WX_VARARG_MAX_ARGS, \ + _WX_DEFINE_SCANFUNC, \ + dummy1, name, impl, passfixed, numfixed, fixed) + +// this is needed to normalize the format string, see src/common/strvararg.cpp +// for more details +#ifdef __WINDOWS__ + #define wxScanfConvertFormatW(fmt) fmt +#else + const wxScopedWCharBuffer + WXDLLIMPEXP_BASE wxScanfConvertFormatW(const wchar_t *format); +#endif + +WX_DEFINE_SCANFUNC(wxScanf, 1, (const char *format), + wxCRT_ScanfA, (format)) +WX_DEFINE_SCANFUNC(wxScanf, 1, (const wchar_t *format), + wxCRT_ScanfW, (wxScanfConvertFormatW(format))) + +WX_DEFINE_SCANFUNC(wxFscanf, 2, (FILE *stream, const char *format), + wxCRT_FscanfA, (stream, format)) +WX_DEFINE_SCANFUNC(wxFscanf, 2, (FILE *stream, const wchar_t *format), + wxCRT_FscanfW, (stream, wxScanfConvertFormatW(format))) + +WX_DEFINE_SCANFUNC(wxSscanf, 2, (const char *str, const char *format), + wxCRT_SscanfA, (str, format)) +WX_DEFINE_SCANFUNC(wxSscanf, 2, (const wchar_t *str, const wchar_t *format), + wxCRT_SscanfW, (str, wxScanfConvertFormatW(format))) +WX_DEFINE_SCANFUNC(wxSscanf, 2, (const wxScopedCharBuffer& str, const char *format), + wxCRT_SscanfA, (str.data(), format)) +WX_DEFINE_SCANFUNC(wxSscanf, 2, (const wxScopedWCharBuffer& str, const wchar_t *format), + wxCRT_SscanfW, (str.data(), wxScanfConvertFormatW(format))) +WX_DEFINE_SCANFUNC(wxSscanf, 2, (const wxString& str, const char *format), + wxCRT_SscanfA, (str.mb_str(), format)) +WX_DEFINE_SCANFUNC(wxSscanf, 2, (const wxString& str, const wchar_t *format), + wxCRT_SscanfW, (str.wc_str(), wxScanfConvertFormatW(format))) +WX_DEFINE_SCANFUNC(wxSscanf, 2, (const wxCStrData& str, const char *format), + wxCRT_SscanfA, (str.AsCharBuf(), format)) +WX_DEFINE_SCANFUNC(wxSscanf, 2, (const wxCStrData& str, const wchar_t *format), + wxCRT_SscanfW, (str.AsWCharBuf(), wxScanfConvertFormatW(format))) + +// Visual C++ doesn't provide vsscanf() +#ifndef __VISUALC___ +int WXDLLIMPEXP_BASE wxVsscanf(const char *str, const char *format, va_list ap); +int WXDLLIMPEXP_BASE wxVsscanf(const wchar_t *str, const wchar_t *format, va_list ap); +int WXDLLIMPEXP_BASE wxVsscanf(const wxScopedCharBuffer& str, const char *format, va_list ap); +int WXDLLIMPEXP_BASE wxVsscanf(const wxScopedWCharBuffer& str, const wchar_t *format, va_list ap); +int WXDLLIMPEXP_BASE wxVsscanf(const wxString& str, const char *format, va_list ap); +int WXDLLIMPEXP_BASE wxVsscanf(const wxString& str, const wchar_t *format, va_list ap); +int WXDLLIMPEXP_BASE wxVsscanf(const wxCStrData& str, const char *format, va_list ap); +int WXDLLIMPEXP_BASE wxVsscanf(const wxCStrData& str, const wchar_t *format, va_list ap); +#endif // !__VISUALC__ + +#endif /* _WX_WXCRTVARARG_H_ */ diff --git a/wxmsw/include/wx-3.0/wx/wxhtml.h b/wxmsw/include/wx-3.0/wx/wxhtml.h new file mode 100644 index 00000000..9759dac0 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/wxhtml.h @@ -0,0 +1,21 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/wxhtml.h +// Purpose: wxHTML library for wxWidgets +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTML_H_ +#define _WX_HTML_H_ + +#include "wx/html/htmldefs.h" +#include "wx/html/htmltag.h" +#include "wx/html/htmlcell.h" +#include "wx/html/htmlpars.h" +#include "wx/html/htmlwin.h" +#include "wx/html/winpars.h" +#include "wx/filesys.h" +#include "wx/html/helpctrl.h" + +#endif // __WXHTML_H__ diff --git a/wxmsw/include/wx-3.0/wx/wxprec.h b/wxmsw/include/wx-3.0/wx/wxprec.h new file mode 100644 index 00000000..2b50dff4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/wxprec.h @@ -0,0 +1,60 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/wxprec.h +// Purpose: Includes the appropriate files for precompiled headers +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// compiler detection; includes setup.h +#include "wx/defs.h" + +// check if to use precompiled headers: do it for most Windows compilers unless +// explicitly disabled by defining NOPCH +#if defined(__VISUALC__) || \ + defined(__DMC__) || \ + defined(__VISAGECPP__) || \ + defined(__WATCOMC__) || \ + defined(__BORLANDC__) + + + // If user did not request NOCPH and we're not building using configure + // then assume user wants precompiled headers. + #if !defined(NOPCH) && !defined(__WX_SETUP_H__) + #define WX_PRECOMP + #endif +#endif + +// For some reason, this must be defined for common dialogs to work. +#ifdef __WATCOMC__ + #define INCLUDE_COMMDLG_H 1 +#endif + +#ifdef WX_PRECOMP + +// include "wx/chartype.h" first to ensure that UNICODE macro is correctly set +// _before_ including <windows.h> +#include "wx/chartype.h" + +// include standard Windows headers +#if defined(__WINDOWS__) + #include "wx/msw/wrapwin.h" + #include "wx/msw/private.h" +#endif +#if defined(__WXMSW__) + #include "wx/msw/wrapcctl.h" + #include "wx/msw/wrapcdlg.h" + #include "wx/msw/missing.h" +#endif + +// include <os2.h> +#ifdef __OS2__ +# include "wx/os2/private.h" +#endif + +// include the most common wx headers +#include "wx/wx.h" + +#endif // WX_PRECOMP diff --git a/wxmsw/include/wx-3.0/wx/xlocale.h b/wxmsw/include/wx-3.0/wx/xlocale.h new file mode 100644 index 00000000..6a01ad31 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xlocale.h @@ -0,0 +1,340 @@ +////////////////////////////////////////////////////////////////////////////// +// Name: wx/xlocale.h +// Purpose: Header to provide some xlocale wrappers +// Author: Brian Vanderburg II, Vadim Zeitlin +// Created: 2008-01-07 +// Copyright: (c) 2008 Brian Vanderburg II +// 2008 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/* + This header defines portable wrappers around xlocale foo_l() functions or + their MSVC proprietary _foo_l() equivalents when they are available and + implements these functions for the "C" locale [only] if they are not. This + allows the program running under the default user locale to still use "C" + locale for operations such as reading data from files where they are stored + using decimal point &c. + + TODO: Currently only the character classification and transformation + functions and number <-> string functions, are implemented, + we also need at least + - formatted IO: scanf_l(), printf_l() &c + - time: strftime_l(), strptime_l() + */ + +#ifndef _WX_XLOCALE_H_ +#define _WX_XLOCALE_H_ + +#include "wx/defs.h" // wxUSE_XLOCALE + +#if wxUSE_XLOCALE + +#include "wx/crt.h" // Includes wx/chartype.h, wx/wxcrt.h(wx/string.h) +#include "wx/intl.h" // wxLanguage + +// The platform-specific locale type +// If wxXLocale_t is not defined, then only "C" locale support is provided +#ifdef wxHAS_XLOCALE_SUPPORT + #if wxCHECK_VISUALC_VERSION(8) && !defined(__WXWINCE__) + typedef _locale_t wxXLocale_t; + #define wxXLOCALE_IDENT(name) _ ## name + #elif defined(HAVE_LOCALE_T) + #include <locale.h> + #include <xlocale.h> + #include <ctype.h> + #include <stdlib.h> + + #if wxUSE_UNICODE + #include <wctype.h> + #endif + + // Locale type and identifier name + typedef locale_t wxXLocale_t; + + #define wxXLOCALE_IDENT(name) name + #else + #error "Unknown xlocale support" + #endif +#endif // wxHAS_XLOCALE_SUPPORT + + +// wxXLocale is a wrapper around the native type representing a locale. +// +// It is not to be confused with wxLocale, which handles actually changing the +// locale, loading message catalogs, etc. This just stores a locale value. +// The similarity of names is unfortunate, but there doesn't seem to be any +// better alternative right now. Perhaps by wxWidgets 4.0 better naming could +// be used, or this class could become wxLocale (a wrapper for the value), and +// some other class could be used to load the language catalogs or something +// that would be clearer +#ifdef wxHAS_XLOCALE_SUPPORT + +class WXDLLIMPEXP_BASE wxXLocale +{ +public: + // Construct an uninitialized locale + wxXLocale() { m_locale = NULL; } + + // Construct from a symbolic language constant + wxXLocale(wxLanguage lang); + + // Construct from the given language string + wxXLocale(const char *loc) { Init(loc); } + + // Destroy the locale + ~wxXLocale() { Free(); } + + + // Get the global "C" locale object + static wxXLocale& GetCLocale(); + + // Check if the object represents a valid locale (notice that without + // wxHAS_XLOCALE_SUPPORT the only valid locale is the "C" one) + bool IsOk() const { return m_locale != NULL; } + + // Get the type + wxXLocale_t Get() const { return m_locale; } + + bool operator== (const wxXLocale& loc) const + { return m_locale == loc.m_locale; } + +private: + // Special ctor for the "C" locale, it's only used internally as the user + // code is supposed to use GetCLocale() + wxXLocale(struct wxXLocaleCTag * WXUNUSED(dummy)) { Init("C"); } + + // Create from the given language string (called from ctors) + void Init(const char *loc); + + // Free the locale if it's non-NULL + void Free(); + + + // The corresponding locale handle, NULL if invalid + wxXLocale_t m_locale; + + + // POSIX xlocale API provides a duplocale() function but MSVC locale API + // doesn't give us any means to copy a _locale_t object so we reduce the + // functionality to least common denominator here -- it shouldn't be a + // problem as copying the locale objects shouldn't be often needed + wxDECLARE_NO_COPY_CLASS(wxXLocale); +}; + +#else // !wxHAS_XLOCALE_SUPPORT + +// Skeleton version supporting only the "C" locale for the systems without +// xlocale support +class WXDLLIMPEXP_BASE wxXLocale +{ +public: + // Construct an uninitialized locale + wxXLocale() { m_isC = false; } + + // Construct from a symbolic language constant: unless the language is + // wxLANGUAGE_ENGLISH_US (which we suppose to be the same as "C" locale) + // the object will be invalid + wxXLocale(wxLanguage lang) + { + m_isC = lang == wxLANGUAGE_ENGLISH_US; + } + + // Construct from the given language string: unless the string is "C" or + // "POSIX" the object will be invalid + wxXLocale(const char *loc) + { + m_isC = loc && (strcmp(loc, "C") == 0 || strcmp(loc, "POSIX") == 0); + } + + // Default copy ctor, assignment operator and dtor are ok (or would be if + // we didn't use DECLARE_NO_COPY_CLASS() for consistency with the xlocale + // version) + + + // Get the global "C" locale object + static wxXLocale& GetCLocale(); + + // Check if the object represents a valid locale (notice that without + // wxHAS_XLOCALE_SUPPORT the only valid locale is the "C" one) + bool IsOk() const { return m_isC; } + +private: + // Special ctor for the "C" locale, it's only used internally as the user + // code is supposed to use GetCLocale() + wxXLocale(struct wxXLocaleCTag * WXUNUSED(dummy)) { m_isC = true; } + + // Without xlocale support this class can only represent "C" locale, if + // this is false the object is invalid + bool m_isC; + + + // although it's not a problem to copy the objects of this class, we use + // this macro in this implementation for consistency with the xlocale-based + // one which can't be copied when using MSVC locale API + wxDECLARE_NO_COPY_CLASS(wxXLocale); +}; + +#endif // wxHAS_XLOCALE_SUPPORT/!wxHAS_XLOCALE_SUPPORT + + +// A shorter synonym for the most commonly used locale object +#define wxCLocale (wxXLocale::GetCLocale()) +extern WXDLLIMPEXP_DATA_BASE(wxXLocale) wxNullXLocale; + +// Wrappers for various functions: +#ifdef wxHAS_XLOCALE_SUPPORT + + // ctype functions + #define wxCRT_Isalnum_lA wxXLOCALE_IDENT(isalnum_l) + #define wxCRT_Isalpha_lA wxXLOCALE_IDENT(isalpha_l) + #define wxCRT_Iscntrl_lA wxXLOCALE_IDENT(iscntrl_l) + #define wxCRT_Isdigit_lA wxXLOCALE_IDENT(isdigit_l) + #define wxCRT_Isgraph_lA wxXLOCALE_IDENT(isgraph_l) + #define wxCRT_Islower_lA wxXLOCALE_IDENT(islower_l) + #define wxCRT_Isprint_lA wxXLOCALE_IDENT(isprint_l) + #define wxCRT_Ispunct_lA wxXLOCALE_IDENT(ispunct_l) + #define wxCRT_Isspace_lA wxXLOCALE_IDENT(isspace_l) + #define wxCRT_Isupper_lA wxXLOCALE_IDENT(isupper_l) + #define wxCRT_Isxdigit_lA wxXLOCALE_IDENT(isxdigit_l) + #define wxCRT_Tolower_lA wxXLOCALE_IDENT(tolower_l) + #define wxCRT_Toupper_lA wxXLOCALE_IDENT(toupper_l) + + inline int wxIsalnum_l(char c, const wxXLocale& loc) + { return wxCRT_Isalnum_lA(static_cast<unsigned char>(c), loc.Get()); } + inline int wxIsalpha_l(char c, const wxXLocale& loc) + { return wxCRT_Isalpha_lA(static_cast<unsigned char>(c), loc.Get()); } + inline int wxIscntrl_l(char c, const wxXLocale& loc) + { return wxCRT_Iscntrl_lA(static_cast<unsigned char>(c), loc.Get()); } + inline int wxIsdigit_l(char c, const wxXLocale& loc) + { return wxCRT_Isdigit_lA(static_cast<unsigned char>(c), loc.Get()); } + inline int wxIsgraph_l(char c, const wxXLocale& loc) + { return wxCRT_Isgraph_lA(static_cast<unsigned char>(c), loc.Get()); } + inline int wxIslower_l(char c, const wxXLocale& loc) + { return wxCRT_Islower_lA(static_cast<unsigned char>(c), loc.Get()); } + inline int wxIsprint_l(char c, const wxXLocale& loc) + { return wxCRT_Isprint_lA(static_cast<unsigned char>(c), loc.Get()); } + inline int wxIspunct_l(char c, const wxXLocale& loc) + { return wxCRT_Ispunct_lA(static_cast<unsigned char>(c), loc.Get()); } + inline int wxIsspace_l(char c, const wxXLocale& loc) + { return wxCRT_Isspace_lA(static_cast<unsigned char>(c), loc.Get()); } + inline int wxIsupper_l(char c, const wxXLocale& loc) + { return wxCRT_Isupper_lA(static_cast<unsigned char>(c), loc.Get()); } + inline int wxIsxdigit_l(char c, const wxXLocale& loc) + { return wxCRT_Isxdigit_lA(static_cast<unsigned char>(c), loc.Get()); } + inline int wxTolower_l(char c, const wxXLocale& loc) + { return wxCRT_Tolower_lA(static_cast<unsigned char>(c), loc.Get()); } + inline int wxToupper_l(char c, const wxXLocale& loc) + { return wxCRT_Toupper_lA(static_cast<unsigned char>(c), loc.Get()); } + + + // stdlib functions for numeric <-> string conversion + // NOTE: GNU libc does not have ato[fil]_l functions; + // MSVC++8 does not have _strto[u]ll_l functions; + // thus we take the minimal set of functions provided in both environments: + + #define wxCRT_Strtod_lA wxXLOCALE_IDENT(strtod_l) + #define wxCRT_Strtol_lA wxXLOCALE_IDENT(strtol_l) + #define wxCRT_Strtoul_lA wxXLOCALE_IDENT(strtoul_l) + + inline double wxStrtod_lA(const char *c, char **endptr, const wxXLocale& loc) + { return wxCRT_Strtod_lA(c, endptr, loc.Get()); } + inline long wxStrtol_lA(const char *c, char **endptr, int base, const wxXLocale& loc) + { return wxCRT_Strtol_lA(c, endptr, base, loc.Get()); } + inline unsigned long wxStrtoul_lA(const char *c, char **endptr, int base, const wxXLocale& loc) + { return wxCRT_Strtoul_lA(c, endptr, base, loc.Get()); } + + #if wxUSE_UNICODE + + // ctype functions + #define wxCRT_Isalnum_lW wxXLOCALE_IDENT(iswalnum_l) + #define wxCRT_Isalpha_lW wxXLOCALE_IDENT(iswalpha_l) + #define wxCRT_Iscntrl_lW wxXLOCALE_IDENT(iswcntrl_l) + #define wxCRT_Isdigit_lW wxXLOCALE_IDENT(iswdigit_l) + #define wxCRT_Isgraph_lW wxXLOCALE_IDENT(iswgraph_l) + #define wxCRT_Islower_lW wxXLOCALE_IDENT(iswlower_l) + #define wxCRT_Isprint_lW wxXLOCALE_IDENT(iswprint_l) + #define wxCRT_Ispunct_lW wxXLOCALE_IDENT(iswpunct_l) + #define wxCRT_Isspace_lW wxXLOCALE_IDENT(iswspace_l) + #define wxCRT_Isupper_lW wxXLOCALE_IDENT(iswupper_l) + #define wxCRT_Isxdigit_lW wxXLOCALE_IDENT(iswxdigit_l) + #define wxCRT_Tolower_lW wxXLOCALE_IDENT(towlower_l) + #define wxCRT_Toupper_lW wxXLOCALE_IDENT(towupper_l) + + inline int wxIsalnum_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isalnum_lW(c, loc.Get()); } + inline int wxIsalpha_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isalpha_lW(c, loc.Get()); } + inline int wxIscntrl_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Iscntrl_lW(c, loc.Get()); } + inline int wxIsdigit_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isdigit_lW(c, loc.Get()); } + inline int wxIsgraph_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isgraph_lW(c, loc.Get()); } + inline int wxIslower_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Islower_lW(c, loc.Get()); } + inline int wxIsprint_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isprint_lW(c, loc.Get()); } + inline int wxIspunct_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Ispunct_lW(c, loc.Get()); } + inline int wxIsspace_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isspace_lW(c, loc.Get()); } + inline int wxIsupper_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isupper_lW(c, loc.Get()); } + inline int wxIsxdigit_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isxdigit_lW(c, loc.Get()); } + inline wchar_t wxTolower_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Tolower_lW(c, loc.Get()); } + inline wchar_t wxToupper_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Toupper_lW(c, loc.Get()); } + + + // stdlib functions for numeric <-> string conversion + // (see notes above about missing functions) + #define wxCRT_Strtod_lW wxXLOCALE_IDENT(wcstod_l) + #define wxCRT_Strtol_lW wxXLOCALE_IDENT(wcstol_l) + #define wxCRT_Strtoul_lW wxXLOCALE_IDENT(wcstoul_l) + + inline double wxStrtod_l(const wchar_t *c, wchar_t **endptr, const wxXLocale& loc) + { return wxCRT_Strtod_lW(c, endptr, loc.Get()); } + inline long wxStrtol_l(const wchar_t *c, wchar_t **endptr, int base, const wxXLocale& loc) + { return wxCRT_Strtol_lW(c, endptr, base, loc.Get()); } + inline unsigned long wxStrtoul_l(const wchar_t *c, wchar_t **endptr, int base, const wxXLocale& loc) + { return wxCRT_Strtoul_lW(c, endptr, base, loc.Get()); } + #else // !wxUSE_UNICODE + inline double wxStrtod_l(const char *c, char **endptr, const wxXLocale& loc) + { return wxCRT_Strtod_lA(c, endptr, loc.Get()); } + inline long wxStrtol_l(const char *c, char **endptr, int base, const wxXLocale& loc) + { return wxCRT_Strtol_lA(c, endptr, base, loc.Get()); } + inline unsigned long wxStrtoul_l(const char *c, char **endptr, int base, const wxXLocale& loc) + { return wxCRT_Strtoul_lA(c, endptr, base, loc.Get()); } + #endif // wxUSE_UNICODE +#else // !wxHAS_XLOCALE_SUPPORT + // ctype functions + int WXDLLIMPEXP_BASE wxIsalnum_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIsalpha_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIscntrl_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIsdigit_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIsgraph_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIslower_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIsprint_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIspunct_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIsspace_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIsupper_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIsxdigit_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxTolower_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxToupper_l(const wxUniChar& c, const wxXLocale& loc); + + // stdlib functions + double WXDLLIMPEXP_BASE wxStrtod_l(const wchar_t* str, wchar_t **endptr, const wxXLocale& loc); + double WXDLLIMPEXP_BASE wxStrtod_l(const char* str, char **endptr, const wxXLocale& loc); + long WXDLLIMPEXP_BASE wxStrtol_l(const wchar_t* str, wchar_t **endptr, int base, const wxXLocale& loc); + long WXDLLIMPEXP_BASE wxStrtol_l(const char* str, char **endptr, int base, const wxXLocale& loc); + unsigned long WXDLLIMPEXP_BASE wxStrtoul_l(const wchar_t* str, wchar_t **endptr, int base, const wxXLocale& loc); + unsigned long WXDLLIMPEXP_BASE wxStrtoul_l(const char* str, char **endptr, int base, const wxXLocale& loc); + +#endif // wxHAS_XLOCALE_SUPPORT/!wxHAS_XLOCALE_SUPPORT + +#endif // wxUSE_XLOCALE + +#endif // _WX_XLOCALE_H_ diff --git a/wxmsw/include/wx-3.0/wx/xml/xml.h b/wxmsw/include/wx-3.0/wx/xml/xml.h new file mode 100644 index 00000000..6187e12c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xml/xml.h @@ -0,0 +1,325 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xml/xml.h +// Purpose: wxXmlDocument - XML parser & data holder class +// Author: Vaclav Slavik +// Created: 2000/03/05 +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +#ifndef _WX_XML_H_ +#define _WX_XML_H_ + +#include "wx/defs.h" + +#if wxUSE_XML + +#include "wx/string.h" +#include "wx/object.h" +#include "wx/list.h" +#include "wx/versioninfo.h" + +#ifdef WXMAKINGDLL_XML + #define WXDLLIMPEXP_XML WXEXPORT +#elif defined(WXUSINGDLL) + #define WXDLLIMPEXP_XML WXIMPORT +#else // not making nor using DLL + #define WXDLLIMPEXP_XML +#endif + +class WXDLLIMPEXP_FWD_XML wxXmlNode; +class WXDLLIMPEXP_FWD_XML wxXmlAttribute; +class WXDLLIMPEXP_FWD_XML wxXmlDocument; +class WXDLLIMPEXP_FWD_XML wxXmlIOHandler; +class WXDLLIMPEXP_FWD_BASE wxInputStream; +class WXDLLIMPEXP_FWD_BASE wxOutputStream; + +// Represents XML node type. +enum wxXmlNodeType +{ + // note: values are synchronized with xmlElementType from libxml + wxXML_ELEMENT_NODE = 1, + wxXML_ATTRIBUTE_NODE = 2, + wxXML_TEXT_NODE = 3, + wxXML_CDATA_SECTION_NODE = 4, + wxXML_ENTITY_REF_NODE = 5, + wxXML_ENTITY_NODE = 6, + wxXML_PI_NODE = 7, + wxXML_COMMENT_NODE = 8, + wxXML_DOCUMENT_NODE = 9, + wxXML_DOCUMENT_TYPE_NODE = 10, + wxXML_DOCUMENT_FRAG_NODE = 11, + wxXML_NOTATION_NODE = 12, + wxXML_HTML_DOCUMENT_NODE = 13 +}; + + +// Represents node property(ies). +// Example: in <img src="hello.gif" id="3"/> "src" is property with value +// "hello.gif" and "id" is prop. with value "3". + +class WXDLLIMPEXP_XML wxXmlAttribute +{ +public: + wxXmlAttribute() : m_next(NULL) {} + wxXmlAttribute(const wxString& name, const wxString& value, + wxXmlAttribute *next = NULL) + : m_name(name), m_value(value), m_next(next) {} + virtual ~wxXmlAttribute() {} + + const wxString& GetName() const { return m_name; } + const wxString& GetValue() const { return m_value; } + wxXmlAttribute *GetNext() const { return m_next; } + + void SetName(const wxString& name) { m_name = name; } + void SetValue(const wxString& value) { m_value = value; } + void SetNext(wxXmlAttribute *next) { m_next = next; } + +private: + wxString m_name; + wxString m_value; + wxXmlAttribute *m_next; +}; + +#if WXWIN_COMPATIBILITY_2_8 + // NB: #define is used instead of typedef so that forward declarations + // continue to work + #define wxXmlProperty wxXmlAttribute +#endif + + +// Represents node in XML document. Node has name and may have content and +// attributes. Most common node types are wxXML_TEXT_NODE (name and attributes +// are irrelevant) and wxXML_ELEMENT_NODE (e.g. in <title>hi there is +// element with name="title", irrelevant content and one child (wxXML_TEXT_NODE +// with content="hi"). +// +// If wxUSE_UNICODE is 0, all strings are encoded in the encoding given to Load +// (default is UTF-8). + +class WXDLLIMPEXP_XML wxXmlNode +{ +public: + wxXmlNode() + : m_attrs(NULL), m_parent(NULL), m_children(NULL), m_next(NULL), + m_lineNo(-1), m_noConversion(false) + { + } + + wxXmlNode(wxXmlNode *parent, wxXmlNodeType type, + const wxString& name, const wxString& content = wxEmptyString, + wxXmlAttribute *attrs = NULL, wxXmlNode *next = NULL, + int lineNo = -1); + + virtual ~wxXmlNode(); + + // copy ctor & operator=. Note that this does NOT copy siblings + // and parent pointer, i.e. m_parent and m_next will be NULL + // after using copy ctor and are never unmodified by operator=. + // On the other hand, it DOES copy children and attributes. + wxXmlNode(const wxXmlNode& node); + wxXmlNode& operator=(const wxXmlNode& node); + + // user-friendly creation: + wxXmlNode(wxXmlNodeType type, const wxString& name, + const wxString& content = wxEmptyString, + int lineNo = -1); + virtual void AddChild(wxXmlNode *child); + virtual bool InsertChild(wxXmlNode *child, wxXmlNode *followingNode); + virtual bool InsertChildAfter(wxXmlNode *child, wxXmlNode *precedingNode); + virtual bool RemoveChild(wxXmlNode *child); + virtual void AddAttribute(const wxString& name, const wxString& value); + virtual bool DeleteAttribute(const wxString& name); + + // access methods: + wxXmlNodeType GetType() const { return m_type; } + const wxString& GetName() const { return m_name; } + const wxString& GetContent() const { return m_content; } + + bool IsWhitespaceOnly() const; + int GetDepth(wxXmlNode *grandparent = NULL) const; + + // Gets node content from wxXML_ENTITY_NODE + // The problem is, content is represented as + // wxXML_ENTITY_NODE name="tag", content="" + // |-- wxXML_TEXT_NODE or + // wxXML_CDATA_SECTION_NODE name="" content="content" + wxString GetNodeContent() const; + + wxXmlNode *GetParent() const { return m_parent; } + wxXmlNode *GetNext() const { return m_next; } + wxXmlNode *GetChildren() const { return m_children; } + + wxXmlAttribute *GetAttributes() const { return m_attrs; } + bool GetAttribute(const wxString& attrName, wxString *value) const; + wxString GetAttribute(const wxString& attrName, + const wxString& defaultVal = wxEmptyString) const; + bool HasAttribute(const wxString& attrName) const; + + int GetLineNumber() const { return m_lineNo; } + + void SetType(wxXmlNodeType type) { m_type = type; } + void SetName(const wxString& name) { m_name = name; } + void SetContent(const wxString& con) { m_content = con; } + + void SetParent(wxXmlNode *parent) { m_parent = parent; } + void SetNext(wxXmlNode *next) { m_next = next; } + void SetChildren(wxXmlNode *child) { m_children = child; } + + void SetAttributes(wxXmlAttribute *attr) { m_attrs = attr; } + virtual void AddAttribute(wxXmlAttribute *attr); + + // If true, don't do encoding conversion to improve efficiency - node content is ACII text + bool GetNoConversion() const { return m_noConversion; } + void SetNoConversion(bool noconversion) { m_noConversion = noconversion; } + +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED( inline wxXmlAttribute *GetProperties() const ); + wxDEPRECATED( inline bool GetPropVal(const wxString& propName, + wxString *value) const ); + wxDEPRECATED( inline wxString GetPropVal(const wxString& propName, + const wxString& defaultVal) const ); + wxDEPRECATED( inline bool HasProp(const wxString& propName) const ); + + wxDEPRECATED( inline void SetProperties(wxXmlAttribute *prop) ); +#endif // WXWIN_COMPATIBILITY_2_8 + + // The following three functions are backward compatibility, but because + // they were virtual, we must make it possible to override them. This + // is done by calling e.g. AddProperty() from AddAttribute(), so we have + // to keep AddProperty() even if 2.8 compatibility is off. To prevent + // old code from compiling in that case, we make them private and + // non-virtual. (This can be removed when WXWIN_COMPATIBILITY_2_8 is + // removed, we'll have just *Attribute versions then.) +#if WXWIN_COMPATIBILITY_2_8 + wxDEPRECATED_BUT_USED_INTERNALLY( + virtual void AddProperty(const wxString& name, const wxString& value) ); + wxDEPRECATED_BUT_USED_INTERNALLY( + virtual bool DeleteProperty(const wxString& name) ); + wxDEPRECATED_BUT_USED_INTERNALLY( + virtual void AddProperty(wxXmlAttribute *attr) ); +#else +private: + void AddProperty(const wxString& name, const wxString& value); + bool DeleteProperty(const wxString& name); + void AddProperty(wxXmlAttribute *attr); +#endif // WXWIN_COMPATIBILITY_2_8/!WXWIN_COMPATIBILITY_2_8 + +private: + wxXmlNodeType m_type; + wxString m_name; + wxString m_content; + wxXmlAttribute *m_attrs; + wxXmlNode *m_parent, *m_children, *m_next; + int m_lineNo; // line number in original file, or -1 + bool m_noConversion; // don't do encoding conversion - node is plain text + + void DoFree(); + void DoCopy(const wxXmlNode& node); +}; + +#if WXWIN_COMPATIBILITY_2_8 +inline wxXmlAttribute *wxXmlNode::GetProperties() const + { return GetAttributes(); } +inline bool wxXmlNode::GetPropVal(const wxString& propName, + wxString *value) const + { return GetAttribute(propName, value); } +inline wxString wxXmlNode::GetPropVal(const wxString& propName, + const wxString& defaultVal) const + { return GetAttribute(propName, defaultVal); } +inline bool wxXmlNode::HasProp(const wxString& propName) const + { return HasAttribute(propName); } +inline void wxXmlNode::SetProperties(wxXmlAttribute *prop) + { SetAttributes(prop); } +#endif // WXWIN_COMPATIBILITY_2_8 + + + +// special indentation value for wxXmlDocument::Save +#define wxXML_NO_INDENTATION (-1) + +// flags for wxXmlDocument::Load +enum wxXmlDocumentLoadFlag +{ + wxXMLDOC_NONE = 0, + wxXMLDOC_KEEP_WHITESPACE_NODES = 1 +}; + + +// This class holds XML data/document as parsed by XML parser. + +class WXDLLIMPEXP_XML wxXmlDocument : public wxObject +{ +public: + wxXmlDocument(); + wxXmlDocument(const wxString& filename, + const wxString& encoding = wxT("UTF-8")); + wxXmlDocument(wxInputStream& stream, + const wxString& encoding = wxT("UTF-8")); + virtual ~wxXmlDocument() { wxDELETE(m_docNode); } + + wxXmlDocument(const wxXmlDocument& doc); + wxXmlDocument& operator=(const wxXmlDocument& doc); + + // Parses .xml file and loads data. Returns TRUE on success, FALSE + // otherwise. + virtual bool Load(const wxString& filename, + const wxString& encoding = wxT("UTF-8"), int flags = wxXMLDOC_NONE); + virtual bool Load(wxInputStream& stream, + const wxString& encoding = wxT("UTF-8"), int flags = wxXMLDOC_NONE); + + // Saves document as .xml file. + virtual bool Save(const wxString& filename, int indentstep = 2) const; + virtual bool Save(wxOutputStream& stream, int indentstep = 2) const; + + bool IsOk() const { return GetRoot() != NULL; } + + // Returns root node of the document. + wxXmlNode *GetRoot() const; + // Returns the document node. + wxXmlNode *GetDocumentNode() const { return m_docNode; } + + + // Returns version of document (may be empty). + const wxString& GetVersion() const { return m_version; } + // Returns encoding of document (may be empty). + // Note: this is the encoding original file was saved in, *not* the + // encoding of in-memory representation! + const wxString& GetFileEncoding() const { return m_fileEncoding; } + + // Write-access methods: + wxXmlNode *DetachDocumentNode() { wxXmlNode *old=m_docNode; m_docNode=NULL; return old; } + void SetDocumentNode(wxXmlNode *node) { wxDELETE(m_docNode); m_docNode = node; } + wxXmlNode *DetachRoot(); + void SetRoot(wxXmlNode *node); + void SetVersion(const wxString& version) { m_version = version; } + void SetFileEncoding(const wxString& encoding) { m_fileEncoding = encoding; } + void AppendToProlog(wxXmlNode *node); + +#if !wxUSE_UNICODE + // Returns encoding of in-memory representation of the document + // (same as passed to Load or ctor, defaults to UTF-8). + // NB: this is meaningless in Unicode build where data are stored as wchar_t* + wxString GetEncoding() const { return m_encoding; } + void SetEncoding(const wxString& enc) { m_encoding = enc; } +#endif + + static wxVersionInfo GetLibraryVersionInfo(); + +private: + wxString m_version; + wxString m_fileEncoding; +#if !wxUSE_UNICODE + wxString m_encoding; +#endif + wxXmlNode *m_docNode; + + void DoCopy(const wxXmlDocument& doc); + + DECLARE_CLASS(wxXmlDocument) +}; + +#endif // wxUSE_XML + +#endif // _WX_XML_H_ diff --git a/wxmsw/include/wx-3.0/wx/xpmdecod.h b/wxmsw/include/wx-3.0/wx/xpmdecod.h new file mode 100644 index 00000000..68edc924 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xpmdecod.h @@ -0,0 +1,51 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xpmdecod.h +// Purpose: wxXPMDecoder, XPM reader for wxImage and wxBitmap +// Author: Vaclav Slavik +// Copyright: (c) 2001 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XPMDECOD_H_ +#define _WX_XPMDECOD_H_ + +#include "wx/defs.h" + +#if wxUSE_IMAGE && wxUSE_XPM + +class WXDLLIMPEXP_FWD_CORE wxImage; +class WXDLLIMPEXP_FWD_BASE wxInputStream; + +// -------------------------------------------------------------------------- +// wxXPMDecoder class +// -------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxXPMDecoder +{ +public: + // constructor, destructor, etc. + wxXPMDecoder() {} + ~wxXPMDecoder() {} + +#if wxUSE_STREAMS + // Is the stream XPM file? + // NOTE: this function modifies the current stream position + bool CanRead(wxInputStream& stream); + + // Read XPM file from the stream, parse it and create image from it + wxImage ReadFile(wxInputStream& stream); +#endif + + // Read directly from XPM data (as passed to wxBitmap ctor): + wxImage ReadData(const char* const* xpm_data); + +#ifdef __BORLANDC__ + // needed for Borland 5.5 + wxImage ReadData(char** xpm_data) + { return ReadData(const_cast(xpm_data)); } +#endif +}; + +#endif // wxUSE_IMAGE && wxUSE_XPM + +#endif // _WX_XPM_H_ diff --git a/wxmsw/include/wx-3.0/wx/xpmhand.h b/wxmsw/include/wx-3.0/wx/xpmhand.h new file mode 100644 index 00000000..0952748d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xpmhand.h @@ -0,0 +1,24 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xpmhand.h +// Purpose: XPM handler base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XPMHAND_H_BASE_ +#define _WX_XPMHAND_H_BASE_ + +// Only wxMSW and wxPM currently defines a separate XPM handler, since +// mostly Windows and Presentation Manager apps won't need XPMs. +#if defined(__WXMSW__) +#error xpmhand.h is no longer needed since wxImage now handles XPMs. +#endif +#if defined(__WXPM__) +#include "wx/os2/xpmhand.h" +#endif + +#endif + // _WX_XPMHAND_H_BASE_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_all.h b/wxmsw/include/wx-3.0/wx/xrc/xh_all.h new file mode 100644 index 00000000..0afe3dbb --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_all.h @@ -0,0 +1,79 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_all.h +// Purpose: includes all xh_*.h files +// Author: Vaclav Slavik +// Created: 2000/03/05 +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_ALL_H_ +#define _WX_XH_ALL_H_ + + +// Existing handlers: + +#include "wx/xrc/xh_animatctrl.h" +#include "wx/xrc/xh_bannerwindow.h" +#include "wx/xrc/xh_bmp.h" +#include "wx/xrc/xh_bmpbt.h" +#include "wx/xrc/xh_bmpcbox.h" +#include "wx/xrc/xh_bttn.h" +#include "wx/xrc/xh_cald.h" +#include "wx/xrc/xh_chckb.h" +#include "wx/xrc/xh_chckl.h" +#include "wx/xrc/xh_choic.h" +#include "wx/xrc/xh_choicbk.h" +#include "wx/xrc/xh_clrpicker.h" +#include "wx/xrc/xh_cmdlinkbn.h" +#include "wx/xrc/xh_collpane.h" +#include "wx/xrc/xh_combo.h" +#include "wx/xrc/xh_comboctrl.h" +#include "wx/xrc/xh_datectrl.h" +#include "wx/xrc/xh_dirpicker.h" +#include "wx/xrc/xh_dlg.h" +#include "wx/xrc/xh_editlbox.h" +#include "wx/xrc/xh_filectrl.h" +#include "wx/xrc/xh_filepicker.h" +#include "wx/xrc/xh_fontpicker.h" +#include "wx/xrc/xh_frame.h" +#include "wx/xrc/xh_gauge.h" +#include "wx/xrc/xh_gdctl.h" +#include "wx/xrc/xh_grid.h" +#include "wx/xrc/xh_html.h" +#include "wx/xrc/xh_htmllbox.h" +#include "wx/xrc/xh_hyperlink.h" +#include "wx/xrc/xh_listb.h" +#include "wx/xrc/xh_listc.h" +#include "wx/xrc/xh_listbk.h" +#include "wx/xrc/xh_mdi.h" +#include "wx/xrc/xh_menu.h" +#include "wx/xrc/xh_notbk.h" +#include "wx/xrc/xh_odcombo.h" +#include "wx/xrc/xh_panel.h" +#include "wx/xrc/xh_propdlg.h" +#include "wx/xrc/xh_radbt.h" +#include "wx/xrc/xh_radbx.h" +#include "wx/xrc/xh_scrol.h" +#include "wx/xrc/xh_scwin.h" +#include "wx/xrc/xh_sizer.h" +#include "wx/xrc/xh_slidr.h" +#include "wx/xrc/xh_spin.h" +#include "wx/xrc/xh_split.h" +#include "wx/xrc/xh_srchctrl.h" +#include "wx/xrc/xh_statbar.h" +#include "wx/xrc/xh_stbox.h" +#include "wx/xrc/xh_stbmp.h" +#include "wx/xrc/xh_sttxt.h" +#include "wx/xrc/xh_stlin.h" +#include "wx/xrc/xh_text.h" +#include "wx/xrc/xh_tglbtn.h" +#include "wx/xrc/xh_timectrl.h" +#include "wx/xrc/xh_toolb.h" +#include "wx/xrc/xh_toolbk.h" +#include "wx/xrc/xh_tree.h" +#include "wx/xrc/xh_treebk.h" +#include "wx/xrc/xh_unkwn.h" +#include "wx/xrc/xh_wizrd.h" + +#endif // _WX_XH_ALL_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_animatctrl.h b/wxmsw/include/wx-3.0/wx/xrc/xh_animatctrl.h new file mode 100644 index 00000000..cd618b5b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_animatctrl.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_animatctrl.h +// Purpose: XML resource handler for wxAnimationCtrl +// Author: Francesco Montorsi +// Created: 2006-10-15 +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_ANIMATIONCTRL_H_ +#define _WX_XH_ANIMATIONCTRL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_ANIMATIONCTRL + +class WXDLLIMPEXP_XRC wxAnimationCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxAnimationCtrlXmlHandler) + +public: + wxAnimationCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_ANIMATIONCTRL + +#endif // _WX_XH_ANIMATIONCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_auinotbk.h b/wxmsw/include/wx-3.0/wx/xrc/xh_auinotbk.h new file mode 100644 index 00000000..66aa234d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_auinotbk.h @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_auinotbk.h +// Purpose: XML resource handler for wxAuiNotebook +// Author: Steve Lamerton +// Created: 2009-06-12 +// Copyright: (c) 2009 Steve Lamerton +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XRC_XH_AUINOTEBOOK_H_ +#define _WX_XRC_XH_AUINOTEBOOK_H_ + +#include "wx/xrc/xmlres.h" + +class WXDLLIMPEXP_FWD_AUI wxAuiNotebook; + +#if wxUSE_XRC && wxUSE_AUI + +class WXDLLIMPEXP_AUI wxAuiNotebookXmlHandler : public wxXmlResourceHandler +{ +public: + wxAuiNotebookXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxAuiNotebook *m_notebook; + + wxDECLARE_DYNAMIC_CLASS(wxAuiNotebookXmlHandler); +}; + +#endif // wxUSE_XRC && wxUSE_AUI + +#endif // _WX_XRC_XH_AUINOTEBOOK_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_bannerwindow.h b/wxmsw/include/wx-3.0/wx/xrc/xh_bannerwindow.h new file mode 100644 index 00000000..1a570ebb --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_bannerwindow.h @@ -0,0 +1,30 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_bannerwindow.h +// Purpose: Declaration of wxBannerWindow XRC handler. +// Author: Vadim Zeitlin +// Created: 2011-08-16 +// Copyright: (c) 2011 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_BANNERWINDOW_H_ +#define _WX_XH_BANNERWINDOW_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_BANNERWINDOW + +class WXDLLIMPEXP_XRC wxBannerWindowXmlHandler : public wxXmlResourceHandler +{ +public: + wxBannerWindowXmlHandler(); + + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + + wxDECLARE_DYNAMIC_CLASS(wxBannerWindowXmlHandler); +}; + +#endif // wxUSE_XRC && wxUSE_BANNERWINDOW + +#endif // _WX_XH_BANNERWINDOW_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_bmp.h b/wxmsw/include/wx-3.0/wx/xrc/xh_bmp.h new file mode 100644 index 00000000..ddc8cba4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_bmp.h @@ -0,0 +1,39 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_bmp.h +// Purpose: XML resource handler for wxBitmap and wxIcon +// Author: Vaclav Slavik +// Created: 2000/09/00 +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_BMP_H_ +#define _WX_XH_BMP_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +class WXDLLIMPEXP_XRC wxBitmapXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxBitmapXmlHandler) + +public: + wxBitmapXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +class WXDLLIMPEXP_XRC wxIconXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxIconXmlHandler) + +public: + wxIconXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC + +#endif // _WX_XH_BMP_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_bmpbt.h b/wxmsw/include/wx-3.0/wx/xrc/xh_bmpbt.h new file mode 100644 index 00000000..7fcc100d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_bmpbt.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_bmpbt.h +// Purpose: XML resource handler for bitmap buttons +// Author: Brian Gavin +// Created: 2000/03/05 +// Copyright: (c) 2000 Brian Gavin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_BMPBT_H_ +#define _WX_XH_BMPBT_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_BMPBUTTON + +class WXDLLIMPEXP_XRC wxBitmapButtonXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxBitmapButtonXmlHandler) + +public: + wxBitmapButtonXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_BMPBUTTON + +#endif // _WX_XH_BMPBT_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_bmpcbox.h b/wxmsw/include/wx-3.0/wx/xrc/xh_bmpcbox.h new file mode 100644 index 00000000..2e3e548c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_bmpcbox.h @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_bmpcbox.h +// Purpose: XML resource handler for wxBitmapComboBox +// Author: Jaakko Salli +// Created: Sep-10-2006 +// Copyright: (c) 2006 Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_BMPCBOX_H_ +#define _WX_XH_BMPCBOX_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_BITMAPCOMBOBOX + +class WXDLLIMPEXP_FWD_ADV wxBitmapComboBox; + +class WXDLLIMPEXP_XRC wxBitmapComboBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxBitmapComboBoxXmlHandler) + +public: + wxBitmapComboBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + wxBitmapComboBox* m_combobox; + bool m_isInside; +}; + +#endif // wxUSE_XRC && wxUSE_BITMAPCOMBOBOX + +#endif // _WX_XH_BMPCBOX_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_bttn.h b/wxmsw/include/wx-3.0/wx/xrc/xh_bttn.h new file mode 100644 index 00000000..bc82924b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_bttn.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_bttn.h +// Purpose: XML resource handler for buttons +// Author: Vaclav Slavik +// Created: 2000/03/05 +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_BTTN_H_ +#define _WX_XH_BTTN_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_BUTTON + +class WXDLLIMPEXP_XRC wxButtonXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxButtonXmlHandler) + +public: + wxButtonXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_BUTTON + +#endif // _WX_XH_BTTN_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_cald.h b/wxmsw/include/wx-3.0/wx/xrc/xh_cald.h new file mode 100644 index 00000000..4507738a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_cald.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_cald.h +// Purpose: XML resource handler for wxCalendarCtrl +// Author: Brian Gavin +// Created: 2000/09/09 +// Copyright: (c) 2000 Brian Gavin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_CALD_H_ +#define _WX_XH_CALD_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_CALENDARCTRL + +class WXDLLIMPEXP_XRC wxCalendarCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxCalendarCtrlXmlHandler) + +public: + wxCalendarCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_CALENDARCTRL + +#endif // _WX_XH_CALD_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_chckb.h b/wxmsw/include/wx-3.0/wx/xrc/xh_chckb.h new file mode 100644 index 00000000..dba1dae4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_chckb.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_chckb.h +// Purpose: XML resource handler for wxCheckBox +// Author: Bob Mitchell +// Created: 2000/03/21 +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_CHCKB_H_ +#define _WX_XH_CHCKB_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_CHECKBOX + +class WXDLLIMPEXP_XRC wxCheckBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxCheckBoxXmlHandler) + +public: + wxCheckBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_CHECKBOX + +#endif // _WX_XH_CHECKBOX_H_ + diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_chckl.h b/wxmsw/include/wx-3.0/wx/xrc/xh_chckl.h new file mode 100644 index 00000000..19725dde --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_chckl.h @@ -0,0 +1,33 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_chckl.h +// Purpose: XML resource handler for wxCheckListBox +// Author: Bob Mitchell +// Created: 2000/03/21 +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_CHCKL_H_ +#define _WX_XH_CHCKL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_CHECKLISTBOX + +class WXDLLIMPEXP_XRC wxCheckListBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxCheckListBoxXmlHandler) + +public: + wxCheckListBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideBox; + wxArrayString strList; +}; + +#endif // wxUSE_XRC && wxUSE_CHECKLISTBOX + +#endif // _WX_XH_CHECKLIST_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_choic.h b/wxmsw/include/wx-3.0/wx/xrc/xh_choic.h new file mode 100644 index 00000000..e7115f80 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_choic.h @@ -0,0 +1,33 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_choic.h +// Purpose: XML resource handler for wxChoice +// Author: Bob Mitchell +// Created: 2000/03/21 +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_CHOIC_H_ +#define _WX_XH_CHOIC_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_CHOICE + +class WXDLLIMPEXP_XRC wxChoiceXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxChoiceXmlHandler) + +public: + wxChoiceXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideBox; + wxArrayString strList; +}; + +#endif // wxUSE_XRC && wxUSE_CHOICE + +#endif // _WX_XH_CHOIC_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_choicbk.h b/wxmsw/include/wx-3.0/wx/xrc/xh_choicbk.h new file mode 100644 index 00000000..20c5346e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_choicbk.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_choicbk.h +// Purpose: XML resource handler for wxChoicebook +// Author: Vaclav Slavik +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_CHOICEBK_H_ +#define _WX_XH_CHOICEBK_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_CHOICEBOOK + +class WXDLLIMPEXP_FWD_CORE wxChoicebook; + +class WXDLLIMPEXP_XRC wxChoicebookXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxChoicebookXmlHandler) + +public: + wxChoicebookXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxChoicebook *m_choicebook; +}; + +#endif // wxUSE_XRC && wxUSE_CHOICEBOOK + +#endif // _WX_XH_CHOICEBK_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_clrpicker.h b/wxmsw/include/wx-3.0/wx/xrc/xh_clrpicker.h new file mode 100644 index 00000000..9925ba0c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_clrpicker.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_clrpicker.h +// Purpose: XML resource handler for wxColourPickerCtrl +// Author: Francesco Montorsi +// Created: 2006-04-17 +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_CLRPICKERCTRL_H_ +#define _WX_XH_CLRPICKERCTRL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_COLOURPICKERCTRL + +class WXDLLIMPEXP_XRC wxColourPickerCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxColourPickerCtrlXmlHandler) + +public: + wxColourPickerCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_COLOURPICKERCTRL + +#endif // _WX_XH_CLRPICKERCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_cmdlinkbn.h b/wxmsw/include/wx-3.0/wx/xrc/xh_cmdlinkbn.h new file mode 100644 index 00000000..8f45960f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_cmdlinkbn.h @@ -0,0 +1,31 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_cmdlinkbn.h +// Purpose: XML resource handler for command link buttons +// Author: Kinaou Herve +// Created: 2010-10-20 +// Copyright: (c) 2010 wxWidgets development team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_CMDLINKBN_H_ +#define _WX_XH_CMDLINKBN_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_COMMANDLINKBUTTON + +class WXDLLIMPEXP_XRC wxCommandLinkButtonXmlHandler : public wxXmlResourceHandler +{ +public: + wxCommandLinkButtonXmlHandler(); + + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + wxDECLARE_DYNAMIC_CLASS(wxCommandLinkButtonXmlHandler); +}; + +#endif // wxUSE_XRC && wxUSE_COMMANDLINKBUTTON + +#endif // _WX_XH_CMDLINKBN_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_collpane.h b/wxmsw/include/wx-3.0/wx/xrc/xh_collpane.h new file mode 100644 index 00000000..f93c2371 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_collpane.h @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_collpane.h +// Purpose: XML resource handler for wxCollapsiblePane +// Author: Francesco Montorsi +// Created: 2006-10-27 +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_COLLPANE_H_ +#define _WX_XH_COLLPANE_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_COLLPANE + +class WXDLLIMPEXP_FWD_CORE wxCollapsiblePane; + +class WXDLLIMPEXP_XRC wxCollapsiblePaneXmlHandler : public wxXmlResourceHandler +{ +public: + wxCollapsiblePaneXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxCollapsiblePane *m_collpane; + + DECLARE_DYNAMIC_CLASS(wxCollapsiblePaneXmlHandler) +}; + +#endif // wxUSE_XRC && wxUSE_COLLPANE + +#endif // _WX_XH_COLLPANE_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_combo.h b/wxmsw/include/wx-3.0/wx/xrc/xh_combo.h new file mode 100644 index 00000000..df688a33 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_combo.h @@ -0,0 +1,33 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_combo.h +// Purpose: XML resource handler for wxComboBox +// Author: Bob Mitchell +// Created: 2000/03/21 +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_COMBO_H_ +#define _WX_XH_COMBO_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_COMBOBOX + +class WXDLLIMPEXP_XRC wxComboBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxComboBoxXmlHandler) + +public: + wxComboBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideBox; + wxArrayString strList; +}; + +#endif // wxUSE_XRC && wxUSE_COMBOBOX + +#endif // _WX_XH_COMBO_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_comboctrl.h b/wxmsw/include/wx-3.0/wx/xrc/xh_comboctrl.h new file mode 100644 index 00000000..a11c0276 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_comboctrl.h @@ -0,0 +1,31 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_comboctrl.h +// Purpose: XML resource handler for wxComboBox +// Author: Jaakko Salli +// Created: 2009/01/25 +// Copyright: (c) 2009 Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_COMBOCTRL_H_ +#define _WX_XH_COMBOCTRL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_COMBOCTRL + +class WXDLLIMPEXP_XRC wxComboCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxComboCtrlXmlHandler) + +public: + wxComboCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: +}; + +#endif // wxUSE_XRC && wxUSE_COMBOCTRL + +#endif // _WX_XH_COMBOCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_datectrl.h b/wxmsw/include/wx-3.0/wx/xrc/xh_datectrl.h new file mode 100644 index 00000000..e13c5c36 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_datectrl.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_datectrl.h +// Purpose: XML resource handler for wxDatePickerCtrl +// Author: Vaclav Slavik +// Created: 2005-02-07 +// Copyright: (c) 2005 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_DATECTRL_H_ +#define _WX_XH_DATECTRL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_DATEPICKCTRL + +class WXDLLIMPEXP_XRC wxDateCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxDateCtrlXmlHandler) + +public: + wxDateCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_DATEPICKCTRL + +#endif // _WX_XH_DATECTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_dirpicker.h b/wxmsw/include/wx-3.0/wx/xrc/xh_dirpicker.h new file mode 100644 index 00000000..b77540e3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_dirpicker.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_dirpicker.h +// Purpose: XML resource handler for wxDirPickerCtrl +// Author: Francesco Montorsi +// Created: 2006-04-17 +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_DIRPICKERCTRL_H_ +#define _WX_XH_DIRPICKERCTRL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_DIRPICKERCTRL + +class WXDLLIMPEXP_XRC wxDirPickerCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxDirPickerCtrlXmlHandler) + +public: + wxDirPickerCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_DIRPICKERCTRL + +#endif // _WX_XH_DIRPICKERCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_dlg.h b/wxmsw/include/wx-3.0/wx/xrc/xh_dlg.h new file mode 100644 index 00000000..903f6431 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_dlg.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_dlg.h +// Purpose: XML resource handler for dialogs +// Author: Vaclav Slavik +// Created: 2000/03/05 +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_DLG_H_ +#define _WX_XH_DLG_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +class WXDLLIMPEXP_XRC wxDialogXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxDialogXmlHandler) + +public: + wxDialogXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC + +#endif // _WX_XH_DLG_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_editlbox.h b/wxmsw/include/wx-3.0/wx/xrc/xh_editlbox.h new file mode 100644 index 00000000..0baa85df --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_editlbox.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_editlbox.h +// Purpose: declaration of wxEditableListBox XRC handler +// Author: Vadim Zeitlin +// Created: 2009-06-04 +// Copyright: (c) 2009 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XRC_XH_EDITLBOX_H_ +#define _WX_XRC_XH_EDITLBOX_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_EDITABLELISTBOX + +// ---------------------------------------------------------------------------- +// wxEditableListBoxXmlHandler: XRC handler for wxEditableListBox +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_XRC wxEditableListBoxXmlHandler : public wxXmlResourceHandler +{ +public: + wxEditableListBoxXmlHandler(); + + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideBox; + wxArrayString m_items; + + DECLARE_DYNAMIC_CLASS(wxEditableListBoxXmlHandler) +}; + +#endif // wxUSE_XRC && wxUSE_EDITABLELISTBOX + +#endif // _WX_XRC_XH_EDITLBOX_H_ + diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_filectrl.h b/wxmsw/include/wx-3.0/wx/xrc/xh_filectrl.h new file mode 100644 index 00000000..97f9984f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_filectrl.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_filectrl.h +// Purpose: XML resource handler for wxFileCtrl +// Author: Kinaou Hervé +// Created: 2009-05-11 +// Copyright: (c) 2009 wxWidgets development team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_FILECTRL_H_ +#define _WX_XH_FILECTRL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_FILECTRL + +class WXDLLIMPEXP_XRC wxFileCtrlXmlHandler : public wxXmlResourceHandler +{ +public: + wxFileCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + DECLARE_DYNAMIC_CLASS(wxFileCtrlXmlHandler) +}; + +#endif // wxUSE_XRC && wxUSE_FILECTRL + +#endif // _WX_XH_FILEPICKERCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_filepicker.h b/wxmsw/include/wx-3.0/wx/xrc/xh_filepicker.h new file mode 100644 index 00000000..31ab0a4c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_filepicker.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_filepicker.h +// Purpose: XML resource handler for wxFilePickerCtrl +// Author: Francesco Montorsi +// Created: 2006-04-17 +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_FILEPICKERCTRL_H_ +#define _WX_XH_FILEPICKERCTRL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_FILEPICKERCTRL + +class WXDLLIMPEXP_XRC wxFilePickerCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxFilePickerCtrlXmlHandler) + +public: + wxFilePickerCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_FILEPICKERCTRL + +#endif // _WX_XH_FILEPICKERCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_fontpicker.h b/wxmsw/include/wx-3.0/wx/xrc/xh_fontpicker.h new file mode 100644 index 00000000..481adfb7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_fontpicker.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_fontpicker.h +// Purpose: XML resource handler for wxFontPickerCtrl +// Author: Francesco Montorsi +// Created: 2006-04-17 +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_FONTPICKERCTRL_H_ +#define _WX_XH_FONTPICKERCTRL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_FONTPICKERCTRL + +class WXDLLIMPEXP_XRC wxFontPickerCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxFontPickerCtrlXmlHandler) + +public: + wxFontPickerCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_FONTPICKERCTRL + +#endif // _WX_XH_FONTPICKERCTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_frame.h b/wxmsw/include/wx-3.0/wx/xrc/xh_frame.h new file mode 100644 index 00000000..16ee6aa4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_frame.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_frame.h +// Purpose: XML resource handler for wxFrame +// Author: Vaclav Slavik & Aleks. +// Created: 2000/03/05 +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_FRAME_H_ +#define _WX_XH_FRAME_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +class WXDLLIMPEXP_XRC wxFrameXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxFrameXmlHandler) + +public: + wxFrameXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC + +#endif // _WX_XH_FRAME_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_gauge.h b/wxmsw/include/wx-3.0/wx/xrc/xh_gauge.h new file mode 100644 index 00000000..26eaa5b0 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_gauge.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_gauge.h +// Purpose: XML resource handler for wxGauge +// Author: Bob Mitchell +// Created: 2000/03/21 +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_GAUGE_H_ +#define _WX_XH_GAUGE_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_GAUGE + +class WXDLLIMPEXP_XRC wxGaugeXmlHandler : public wxXmlResourceHandler +{ +public: + wxGaugeXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + + DECLARE_DYNAMIC_CLASS(wxGaugeXmlHandler) +}; + +#endif // wxUSE_XRC && wxUSE_GAUGE + +#endif // _WX_XH_GAUGE_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_gdctl.h b/wxmsw/include/wx-3.0/wx/xrc/xh_gdctl.h new file mode 100644 index 00000000..bc746690 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_gdctl.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_gdctl.h +// Purpose: XML resource handler for wxGenericDirCtrl +// Author: Markus Greither +// Created: 2002/01/20 +// Copyright: (c) 2002 Markus Greither +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_GDCTL_H_ +#define _WX_XH_GDCTL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_DIRDLG + +class WXDLLIMPEXP_XRC wxGenericDirCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxGenericDirCtrlXmlHandler) + +public: + wxGenericDirCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_DIRDLG + +#endif // _WX_XH_GDCTL_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_grid.h b/wxmsw/include/wx-3.0/wx/xrc/xh_grid.h new file mode 100644 index 00000000..3d627057 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_grid.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_grid.h +// Purpose: XML resource handler for wxGrid +// Author: Agron Selimaj +// Created: 2005/08/11 +// Copyright: (c) 2005 Agron Selimaj, Freepour Controls Inc. +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_GRD_H_ +#define _WX_XH_GRD_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_GRID + +class WXDLLIMPEXP_XRC wxGridXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxGridXmlHandler) + +public: + wxGridXmlHandler(); + + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_GRID + +#endif // _WX_XH_GRD_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_html.h b/wxmsw/include/wx-3.0/wx/xrc/xh_html.h new file mode 100644 index 00000000..2c08a4b9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_html.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_html.h +// Purpose: XML resource handler for wxHtmlWindow +// Author: Bob Mitchell +// Created: 2000/03/21 +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_HTML_H_ +#define _WX_XH_HTML_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_HTML + +class WXDLLIMPEXP_XRC wxHtmlWindowXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxHtmlWindowXmlHandler) + +public: + wxHtmlWindowXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_HTML + +#endif // _WX_XH_HTML_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_htmllbox.h b/wxmsw/include/wx-3.0/wx/xrc/xh_htmllbox.h new file mode 100644 index 00000000..fb3539d9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_htmllbox.h @@ -0,0 +1,33 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_htmllbox.h +// Purpose: XML resource handler for wxSimpleHtmlListBox +// Author: Francesco Montorsi +// Created: 2006/10/21 +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_SIMPLEHTMLLISTBOX_H_ +#define _WX_XH_SIMPLEHTMLLISTBOX_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_HTML + +class WXDLLIMPEXP_XRC wxSimpleHtmlListBoxXmlHandler : public wxXmlResourceHandler +{ +public: + wxSimpleHtmlListBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideBox; + wxArrayString strList; + + DECLARE_DYNAMIC_CLASS(wxSimpleHtmlListBoxXmlHandler) +}; + +#endif // wxUSE_XRC && wxUSE_HTML + +#endif // _WX_XH_SIMPLEHTMLLISTBOX_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_hyperlink.h b/wxmsw/include/wx-3.0/wx/xrc/xh_hyperlink.h new file mode 100644 index 00000000..4793668e --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_hyperlink.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_hyperlink.h +// Purpose: Hyperlink control (wxAdv) +// Author: David Norris +// Modified by: Ryan Norton, Francesco Montorsi +// Created: 04/02/2005 +// Copyright: (c) 2005 David Norris +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_HYPERLINKH__ +#define _WX_XH_HYPERLINKH__ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_HYPERLINKCTRL + +class WXDLLIMPEXP_XRC wxHyperlinkCtrlXmlHandler : public wxXmlResourceHandler +{ + // Register with wxWindows' dynamic class subsystem. + DECLARE_DYNAMIC_CLASS(wxHyperlinkCtrlXmlHandler) + +public: + // Constructor. + wxHyperlinkCtrlXmlHandler(); + + // Creates the control and returns a pointer to it. + virtual wxObject *DoCreateResource(); + + // Returns true if we know how to create a control for the given node. + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_HYPERLINKCTRL + +#endif // _WX_XH_HYPERLINKH__ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_listb.h b/wxmsw/include/wx-3.0/wx/xrc/xh_listb.h new file mode 100644 index 00000000..c73c993d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_listb.h @@ -0,0 +1,33 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_listb.h +// Purpose: XML resource handler for wxListbox +// Author: Bob Mitchell & Vaclav Slavik +// Created: 2000/07/29 +// Copyright: (c) 2000 Bob Mitchell & Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_LISTB_H_ +#define _WX_XH_LISTB_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_LISTBOX + +class WXDLLIMPEXP_XRC wxListBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxListBoxXmlHandler) + +public: + wxListBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideBox; + wxArrayString strList; +}; + +#endif // wxUSE_XRC && wxUSE_LISTBOX + +#endif // _WX_XH_LISTB_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_listbk.h b/wxmsw/include/wx-3.0/wx/xrc/xh_listbk.h new file mode 100644 index 00000000..7aa2e0b2 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_listbk.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_listbk.h +// Purpose: XML resource handler for wxListbook +// Author: Vaclav Slavik +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_LISTBK_H_ +#define _WX_XH_LISTBK_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_LISTBOOK + +class WXDLLIMPEXP_FWD_CORE wxListbook; + +class WXDLLIMPEXP_XRC wxListbookXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxListbookXmlHandler) + +public: + wxListbookXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxListbook *m_listbook; +}; + +#endif // wxUSE_XRC && wxUSE_LISTBOOK + +#endif // _WX_XH_LISTBK_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_listc.h b/wxmsw/include/wx-3.0/wx/xrc/xh_listc.h new file mode 100644 index 00000000..b2b927e1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_listc.h @@ -0,0 +1,45 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_listc.h +// Purpose: XML resource handler for wxListCtrl +// Author: Brian Gavin +// Created: 2000/09/09 +// Copyright: (c) 2000 Brian Gavin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_LISTC_H_ +#define _WX_XH_LISTC_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_LISTCTRL + +class WXDLLIMPEXP_FWD_CORE wxListCtrl; +class WXDLLIMPEXP_FWD_CORE wxListItem; + +class WXDLLIMPEXP_XRC wxListCtrlXmlHandler : public wxXmlResourceHandler +{ +public: + wxListCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + // handlers for wxListCtrl itself and its listcol and listitem children + wxListCtrl *HandleListCtrl(); + void HandleListCol(); + void HandleListItem(); + + // common part to HandleList{Col,Item}() + void HandleCommonItemAttrs(wxListItem& item); + + // gets the items image index in the corresponding image list (normal if + // which is wxIMAGE_LIST_NORMAL or small if it is wxIMAGE_LIST_SMALL) + long GetImageIndex(wxListCtrl *listctrl, int which); + + DECLARE_DYNAMIC_CLASS(wxListCtrlXmlHandler) +}; + +#endif // wxUSE_XRC && wxUSE_LISTCTRL + +#endif // _WX_XH_LISTC_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_mdi.h b/wxmsw/include/wx-3.0/wx/xrc/xh_mdi.h new file mode 100644 index 00000000..66343183 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_mdi.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_mdi.h +// Purpose: XML resource handler for wxMDI +// Author: David M. Falkinder & Vaclav Slavik +// Created: 14/02/2005 +// Copyright: (c) 2005 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_MDI_H_ +#define _WX_XH_MDI_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_MDI + +class WXDLLIMPEXP_FWD_CORE wxWindow; + +class WXDLLIMPEXP_XRC wxMdiXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxMdiXmlHandler) + +public: + wxMdiXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + wxWindow *CreateFrame(); +}; + +#endif // wxUSE_XRC && wxUSE_MDI + +#endif // _WX_XH_MDI_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_menu.h b/wxmsw/include/wx-3.0/wx/xrc/xh_menu.h new file mode 100644 index 00000000..b06fee39 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_menu.h @@ -0,0 +1,42 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_menu.h +// Purpose: XML resource handler for menus/menubars +// Author: Vaclav Slavik +// Created: 2000/03/05 +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_MENU_H_ +#define _WX_XH_MENU_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_MENUS + +class WXDLLIMPEXP_XRC wxMenuXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxMenuXmlHandler) + +public: + wxMenuXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideMenu; +}; + +class WXDLLIMPEXP_XRC wxMenuBarXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxMenuBarXmlHandler) + +public: + wxMenuBarXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_MENUS + +#endif // _WX_XH_MENU_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_notbk.h b/wxmsw/include/wx-3.0/wx/xrc/xh_notbk.h new file mode 100644 index 00000000..aa24fc87 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_notbk.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_notbk.h +// Purpose: XML resource handler for wxNotebook +// Author: Vaclav Slavik +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_NOTBK_H_ +#define _WX_XH_NOTBK_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_NOTEBOOK + +class WXDLLIMPEXP_FWD_CORE wxNotebook; + +class WXDLLIMPEXP_XRC wxNotebookXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxNotebookXmlHandler) + +public: + wxNotebookXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxNotebook *m_notebook; +}; + +#endif // wxUSE_XRC && wxUSE_NOTEBOOK + +#endif // _WX_XH_NOTBK_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_odcombo.h b/wxmsw/include/wx-3.0/wx/xrc/xh_odcombo.h new file mode 100644 index 00000000..d639f410 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_odcombo.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_odcombo.h +// Purpose: XML resource handler for wxOwnerDrawnComboBox +// Author: Alex Bligh - based on wx/xrc/xh_combo.h +// Created: 2006/06/19 +// Copyright: (c) 2006 Alex Bligh +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_ODCOMBO_H_ +#define _WX_XH_ODCOMBO_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_ODCOMBOBOX + +class WXDLLIMPEXP_XRC wxOwnerDrawnComboBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxOwnerDrawnComboBoxXmlHandler) + +public: + wxOwnerDrawnComboBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideBox; + wxArrayString strList; +}; + +#endif // wxUSE_XRC && wxUSE_ODCOMBOBOX + +#endif // _WX_XH_ODCOMBO_H_ + diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_panel.h b/wxmsw/include/wx-3.0/wx/xrc/xh_panel.h new file mode 100644 index 00000000..d5ee1a45 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_panel.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_panel.h +// Purpose: XML resource handler for wxPanel +// Author: Vaclav Slavik +// Created: 2000/03/05 +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_PANEL_H_ +#define _WX_XH_PANEL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +class WXDLLIMPEXP_XRC wxPanelXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxPanelXmlHandler) + +public: + wxPanelXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC + +#endif // _WX_XH_PANEL_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_propdlg.h b/wxmsw/include/wx-3.0/wx/xrc/xh_propdlg.h new file mode 100644 index 00000000..0be363f6 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_propdlg.h @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_propdlg.h +// Purpose: XML resource handler for wxPropertySheetDialog +// Author: Sander Berents +// Created: 2007/07/12 +// Copyright: (c) 2007 Sander Berents +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_PROPDLG_H_ +#define _WX_XH_PROPDLG_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +class WXDLLIMPEXP_FWD_ADV wxPropertySheetDialog; + +class WXDLLIMPEXP_XRC wxPropertySheetDialogXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxPropertySheetDialogXmlHandler) + +public: + wxPropertySheetDialogXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxPropertySheetDialog *m_dialog; +}; + +#endif // wxUSE_XRC + +#endif // _WX_XH_PROPDLG_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_radbt.h b/wxmsw/include/wx-3.0/wx/xrc/xh_radbt.h new file mode 100644 index 00000000..7d21f99a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_radbt.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_radbt.h +// Purpose: XML resource handler for wxRadioButton +// Author: Bob Mitchell +// Created: 2000/03/21 +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_RADBT_H_ +#define _WX_XH_RADBT_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_RADIOBTN + +class WXDLLIMPEXP_XRC wxRadioButtonXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxRadioButtonXmlHandler) + +public: + wxRadioButtonXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_RADIOBOX + +#endif // _WX_XH_RADBT_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_radbx.h b/wxmsw/include/wx-3.0/wx/xrc/xh_radbx.h new file mode 100644 index 00000000..5df1ac1a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_radbx.h @@ -0,0 +1,49 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_radbx.h +// Purpose: XML resource handler for wxRadioBox +// Author: Bob Mitchell +// Created: 2000/03/21 +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_RADBX_H_ +#define _WX_XH_RADBX_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_RADIOBOX + +class WXDLLIMPEXP_XRC wxRadioBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxRadioBoxXmlHandler) + +public: + wxRadioBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideBox; + + // the items labels + wxArrayString m_labels; + +#if wxUSE_TOOLTIPS + // the items tooltips + wxArrayString m_tooltips; +#endif // wxUSE_TOOLTIPS + + // the item help text + wxArrayString m_helptexts; + wxArrayInt m_helptextSpecified; + + // if the corresponding array element is 1, the radiobox item is + // disabled/hidden + wxArrayInt m_isEnabled, + m_isShown; +}; + +#endif // wxUSE_XRC && wxUSE_RADIOBOX + +#endif // _WX_XH_RADBX_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_ribbon.h b/wxmsw/include/wx-3.0/wx/xrc/xh_ribbon.h new file mode 100644 index 00000000..b9737c82 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_ribbon.h @@ -0,0 +1,47 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_ribbon.h +// Purpose: XML resource handler for wxRibbon related classes +// Author: Armel Asselin +// Created: 2010-04-23 +// Copyright: (c) 2010 Armel Asselin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XRC_XH_RIBBON_H_ +#define _WX_XRC_XH_RIBBON_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_RIBBON + +class WXDLLIMPEXP_FWD_RIBBON wxRibbonControl; + +class WXDLLIMPEXP_RIBBON wxRibbonXmlHandler : public wxXmlResourceHandler +{ +public: + wxRibbonXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + const wxClassInfo *m_isInside; + + bool IsRibbonControl (wxXmlNode *node); + + wxObject* Handle_buttonbar(); + wxObject* Handle_button(); + wxObject* Handle_control(); + wxObject* Handle_page(); + wxObject* Handle_gallery(); + wxObject* Handle_galleryitem(); + wxObject* Handle_panel(); + wxObject* Handle_bar(); + + void Handle_RibbonArtProvider(wxRibbonControl *control); + + wxDECLARE_DYNAMIC_CLASS(wxRibbonXmlHandler); +}; + +#endif // wxUSE_XRC && wxUSE_RIBBON + +#endif // _WX_XRC_XH_RIBBON_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_richtext.h b/wxmsw/include/wx-3.0/wx/xrc/xh_richtext.h new file mode 100644 index 00000000..1c52cbbc --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_richtext.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_richtext.h +// Purpose: XML resource handler for wxRichTextCtrl +// Author: Julian Smart +// Created: 2006-11-08 +// Copyright: (c) 2006 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_RICHTEXT_H_ +#define _WX_XH_RICHTEXT_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_RICHTEXT + +class WXDLLIMPEXP_RICHTEXT wxRichTextCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxRichTextCtrlXmlHandler) + +public: + wxRichTextCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_RICHTEXT + +#endif // _WX_XH_RICHTEXT_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_scrol.h b/wxmsw/include/wx-3.0/wx/xrc/xh_scrol.h new file mode 100644 index 00000000..0599c5a9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_scrol.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_scrol.h +// Purpose: XML resource handler for wxScrollBar +// Author: Brian Gavin +// Created: 2000/09/09 +// Copyright: (c) 2000 Brian Gavin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_SCROL_H_ +#define _WX_XH_SCROL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_SCROLLBAR + +class WXDLLIMPEXP_XRC wxScrollBarXmlHandler : public wxXmlResourceHandler +{ +public: + wxScrollBarXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + + DECLARE_DYNAMIC_CLASS(wxScrollBarXmlHandler) +}; + +#endif // wxUSE_XRC && wxUSE_SCROLLBAR + +#endif // _WX_XH_SCROL_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_scwin.h b/wxmsw/include/wx-3.0/wx/xrc/xh_scwin.h new file mode 100644 index 00000000..c2e37001 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_scwin.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_scwin.h +// Purpose: XML resource handler for wxScrolledWindow +// Author: Vaclav Slavik +// Created: 2002/10/18 +// Copyright: (c) 2002 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_SCWIN_H_ +#define _WX_XH_SCWIN_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +class WXDLLIMPEXP_XRC wxScrolledWindowXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxScrolledWindowXmlHandler) + +public: + wxScrolledWindowXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC + +#endif // _WX_XH_SCWIN_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_sizer.h b/wxmsw/include/wx-3.0/wx/xrc/xh_sizer.h new file mode 100644 index 00000000..e04947a1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_sizer.h @@ -0,0 +1,83 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_sizer.h +// Purpose: XML resource handler for wxBoxSizer +// Author: Vaclav Slavik +// Created: 2000/04/24 +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_SIZER_H_ +#define _WX_XH_SIZER_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +#include "wx/sizer.h" +#include "wx/gbsizer.h" + +class WXDLLIMPEXP_XRC wxSizerXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxSizerXmlHandler) + +public: + wxSizerXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +protected: + virtual wxSizer* DoCreateSizer(const wxString& name); + virtual bool IsSizerNode(wxXmlNode *node) const; + +private: + bool m_isInside; + bool m_isGBS; + + wxSizer *m_parentSizer; + + + wxObject* Handle_sizeritem(); + wxObject* Handle_spacer(); + wxObject* Handle_sizer(); + wxSizer* Handle_wxBoxSizer(); +#if wxUSE_STATBOX + wxSizer* Handle_wxStaticBoxSizer(); +#endif + wxSizer* Handle_wxGridSizer(); + wxFlexGridSizer* Handle_wxFlexGridSizer(); + wxGridBagSizer* Handle_wxGridBagSizer(); + wxSizer* Handle_wxWrapSizer(); + + bool ValidateGridSizerChildren(); + void SetFlexibleMode(wxFlexGridSizer* fsizer); + void SetGrowables(wxFlexGridSizer* fsizer, const wxChar* param, bool rows); + wxGBPosition GetGBPos(const wxString& param); + wxGBSpan GetGBSpan(const wxString& param); + wxSizerItem* MakeSizerItem(); + void SetSizerItemAttributes(wxSizerItem* sitem); + void AddSizerItem(wxSizerItem* sitem); +}; + +#if wxUSE_BUTTON + +class WXDLLIMPEXP_XRC wxStdDialogButtonSizerXmlHandler + : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxStdDialogButtonSizerXmlHandler) + +public: + wxStdDialogButtonSizerXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxStdDialogButtonSizer *m_parentSizer; +}; + +#endif // wxUSE_BUTTON + +#endif // wxUSE_XRC + +#endif // _WX_XH_SIZER_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_slidr.h b/wxmsw/include/wx-3.0/wx/xrc/xh_slidr.h new file mode 100644 index 00000000..0e209089 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_slidr.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_slidr.h +// Purpose: XML resource handler for wxSlider +// Author: Bob Mitchell +// Created: 2000/03/21 +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_SLIDR_H_ +#define _WX_XH_SLIDR_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_SLIDER + +class WXDLLIMPEXP_XRC wxSliderXmlHandler : public wxXmlResourceHandler +{ +public: + wxSliderXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + + DECLARE_DYNAMIC_CLASS(wxSliderXmlHandler) +}; + +#endif // wxUSE_XRC && wxUSE_SLIDER + +#endif // _WX_XH_SLIDR_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_spin.h b/wxmsw/include/wx-3.0/wx/xrc/xh_spin.h new file mode 100644 index 00000000..7525ba4c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_spin.h @@ -0,0 +1,48 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_spin.h +// Purpose: XML resource handler for wxSpinButton and wxSpinCtrl +// Author: Bob Mitchell +// Created: 2000/03/21 +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_SPIN_H_ +#define _WX_XH_SPIN_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +#if wxUSE_SPINBTN + +class WXDLLIMPEXP_XRC wxSpinButtonXmlHandler : public wxXmlResourceHandler +{ +public: + wxSpinButtonXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + + DECLARE_DYNAMIC_CLASS(wxSpinButtonXmlHandler) +}; + +#endif // wxUSE_SPINBTN + + +#if wxUSE_SPINCTRL + +class WXDLLIMPEXP_XRC wxSpinCtrlXmlHandler : public wxXmlResourceHandler +{ +public: + wxSpinCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + + DECLARE_DYNAMIC_CLASS(wxSpinCtrlXmlHandler) +}; + +#endif // wxUSE_SPINCTRL + +#endif // wxUSE_XRC + +#endif // _WX_XH_SPIN_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_split.h b/wxmsw/include/wx-3.0/wx/xrc/xh_split.h new file mode 100644 index 00000000..7f682dd7 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_split.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_split.h +// Purpose: XRC resource for wxSplitterWindow +// Author: panga@freemail.hu, Vaclav Slavik +// Created: 2003/01/26 +// Copyright: (c) 2003 panga@freemail.hu, Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_SPLIT_H_ +#define _WX_XH_SPLIT_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_SPLITTER + +class WXDLLIMPEXP_XRC wxSplitterWindowXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxSplitterWindowXmlHandler) + +public: + wxSplitterWindowXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_SPLITTER + +#endif // _WX_XH_SPLIT_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_srchctrl.h b/wxmsw/include/wx-3.0/wx/xrc/xh_srchctrl.h new file mode 100644 index 00000000..82f93538 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_srchctrl.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_srchctl.h +// Purpose: XRC resource handler for wxSearchCtrl +// Author: Sander Berents +// Created: 2007/07/12 +// Copyright: (c) 2007 Sander Berents +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_SRCH_H_ +#define _WX_XH_SRCH_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_SEARCHCTRL + +class WXDLLIMPEXP_XRC wxSearchCtrlXmlHandler : public wxXmlResourceHandler +{ +public: + wxSearchCtrlXmlHandler(); + + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + + DECLARE_DYNAMIC_CLASS(wxSearchCtrlXmlHandler) +}; + +#endif // wxUSE_XRC && wxUSE_SEARCHCTRL + +#endif // _WX_XH_SRCH_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_statbar.h b/wxmsw/include/wx-3.0/wx/xrc/xh_statbar.h new file mode 100644 index 00000000..58c4ff4b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_statbar.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_statbar.h +// Purpose: XML resource handler for wxStatusBar +// Author: Brian Ravnsgaard Riis +// Created: 2004/01/21 +// Copyright: (c) 2004 Brian Ravnsgaard Riis +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_STATBAR_H_ +#define _WX_XH_STATBAR_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_STATUSBAR + +class WXDLLIMPEXP_XRC wxStatusBarXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxStatusBarXmlHandler) + +public: + wxStatusBarXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_STATUSBAR + +#endif // _WX_XH_STATBAR_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_stbmp.h b/wxmsw/include/wx-3.0/wx/xrc/xh_stbmp.h new file mode 100644 index 00000000..42a564fc --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_stbmp.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_stbmp.h +// Purpose: XML resource handler for wxStaticBitmap +// Author: Vaclav Slavik +// Created: 2000/04/22 +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_STBMP_H_ +#define _WX_XH_STBMP_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_STATBMP + +class WXDLLIMPEXP_XRC wxStaticBitmapXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxStaticBitmapXmlHandler) + +public: + wxStaticBitmapXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_STATBMP + +#endif // _WX_XH_STBMP_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_stbox.h b/wxmsw/include/wx-3.0/wx/xrc/xh_stbox.h new file mode 100644 index 00000000..43f6c25a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_stbox.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_stbox.h +// Purpose: XML resource handler for wxStaticBox +// Author: Brian Gavin +// Created: 2000/09/00 +// Copyright: (c) 2000 Brian Gavin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_STBOX_H_ +#define _WX_XH_STBOX_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_STATBOX + +class WXDLLIMPEXP_XRC wxStaticBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxStaticBoxXmlHandler) + +public: + wxStaticBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_STATBOX + +#endif // _WX_XH_STBOX_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_stlin.h b/wxmsw/include/wx-3.0/wx/xrc/xh_stlin.h new file mode 100644 index 00000000..9efa3cb8 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_stlin.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_stlin.h +// Purpose: XML resource handler for wxStaticLine +// Author: Vaclav Slavik +// Created: 2000/09/00 +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_STLIN_H_ +#define _WX_XH_STLIN_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_STATLINE + +class WXDLLIMPEXP_XRC wxStaticLineXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxStaticLineXmlHandler) + +public: + wxStaticLineXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_STATLINE + +#endif // _WX_XH_STLIN_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_sttxt.h b/wxmsw/include/wx-3.0/wx/xrc/xh_sttxt.h new file mode 100644 index 00000000..4d99ec25 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_sttxt.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_sttxt.h +// Purpose: XML resource handler for wxStaticText +// Author: Bob Mitchell +// Created: 2000/03/21 +// Copyright: (c) 2000 Bob Mitchell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_STTXT_H_ +#define _WX_XH_STTXT_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_STATTEXT + +class WXDLLIMPEXP_XRC wxStaticTextXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxStaticTextXmlHandler) + +public: + wxStaticTextXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_STATTEXT + +#endif // _WX_XH_STTXT_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_text.h b/wxmsw/include/wx-3.0/wx/xrc/xh_text.h new file mode 100644 index 00000000..9a7649d3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_text.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_text.h +// Purpose: XML resource handler for wxTextCtrl +// Author: Aleksandras Gluchovas +// Created: 2000/03/21 +// Copyright: (c) 2000 Aleksandras Gluchovas +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_TEXT_H_ +#define _WX_XH_TEXT_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_TEXTCTRL + +class WXDLLIMPEXP_XRC wxTextCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxTextCtrlXmlHandler) + +public: + wxTextCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_TEXTCTRL + +#endif // _WX_XH_TEXT_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_tglbtn.h b/wxmsw/include/wx-3.0/wx/xrc/xh_tglbtn.h new file mode 100644 index 00000000..6c6c9a2c --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_tglbtn.h @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_tglbtn.h +// Purpose: XML resource handler for wxToggleButton +// Author: Julian Smart +// Created: 2004-08-30 +// Copyright: (c) 2004 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_TGLBTN_H_ +#define _WX_XH_TGLBTN_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_TOGGLEBTN + +class WXDLLIMPEXP_XRC wxToggleButtonXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxToggleButtonXmlHandler) + +public: + wxToggleButtonXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +protected: + virtual void DoCreateToggleButton(wxObject *control); +#if !defined(__WXUNIVERSAL__) && !defined(__WXMOTIF__) && !defined(__WXPM__) && !(defined(__WXGTK__) && !defined(__WXGTK20__)) + virtual void DoCreateBitmapToggleButton(wxObject *control); +#endif +}; + +#endif // wxUSE_XRC && wxUSE_TOGGLEBTN + +#endif // _WX_XH_TGLBTN_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_timectrl.h b/wxmsw/include/wx-3.0/wx/xrc/xh_timectrl.h new file mode 100644 index 00000000..d04b1bf1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_timectrl.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_timectrl.h +// Purpose: XML resource handler for wxTimePickerCtrl +// Author: Vadim Zeitlin +// Created: 2011-09-22 +// Copyright: (c) 2011 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_TIMECTRL_H_ +#define _WX_XH_TIMECTRL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_TIMEPICKCTRL + +class WXDLLIMPEXP_XRC wxTimeCtrlXmlHandler : public wxXmlResourceHandler +{ +public: + wxTimeCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + wxDECLARE_DYNAMIC_CLASS(wxTimeCtrlXmlHandler); +}; + +#endif // wxUSE_XRC && wxUSE_TIMEPICKCTRL + +#endif // _WX_XH_TIMECTRL_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_toolb.h b/wxmsw/include/wx-3.0/wx/xrc/xh_toolb.h new file mode 100644 index 00000000..6b936dcb --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_toolb.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_toolb.h +// Purpose: XML resource handler for wxToolBar +// Author: Vaclav Slavik +// Created: 2000/08/11 +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_TOOLB_H_ +#define _WX_XH_TOOLB_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_TOOLBAR + +class WXDLLIMPEXP_FWD_CORE wxToolBar; + +class WXDLLIMPEXP_XRC wxToolBarXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxToolBarXmlHandler) + +public: + wxToolBarXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxToolBar *m_toolbar; + wxSize m_toolSize; +}; + +#endif // wxUSE_XRC && wxUSE_TOOLBAR + +#endif // _WX_XH_TOOLB_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_toolbk.h b/wxmsw/include/wx-3.0/wx/xrc/xh_toolbk.h new file mode 100644 index 00000000..16aa174d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_toolbk.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_toolbk.h +// Purpose: XML resource handler for wxToolbook +// Author: Andrea Zanellato +// Created: 2009/12/12 +// Copyright: (c) 2010 wxWidgets development team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_TOOLBK_H_ +#define _WX_XH_TOOLBK_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_TOOLBOOK + +class WXDLLIMPEXP_FWD_CORE wxToolbook; + +class WXDLLIMPEXP_XRC wxToolbookXmlHandler : public wxXmlResourceHandler +{ +public: + wxToolbookXmlHandler(); + + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxToolbook *m_toolbook; + + wxDECLARE_DYNAMIC_CLASS(wxToolbookXmlHandler); +}; + +#endif // wxUSE_XRC && wxUSE_TOOLBOOK + +#endif // _WX_XH_TOOLBK_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_tree.h b/wxmsw/include/wx-3.0/wx/xrc/xh_tree.h new file mode 100644 index 00000000..aa1b633b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_tree.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_tree.h +// Purpose: XML resource handler for wxTreeCtrl +// Author: Brian Gavin +// Created: 2000/09/09 +// Copyright: (c) 2000 Brian Gavin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_TREE_H_ +#define _WX_XH_TREE_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_TREECTRL + +class WXDLLIMPEXP_XRC wxTreeCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxTreeCtrlXmlHandler) + +public: + wxTreeCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_TREECTRL + +#endif // _WX_XH_TREE_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_treebk.h b/wxmsw/include/wx-3.0/wx/xrc/xh_treebk.h new file mode 100644 index 00000000..f5f11342 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_treebk.h @@ -0,0 +1,83 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_treebk.h +// Purpose: XML resource handler for wxTreebook +// Author: Evgeniy Tarassov +// Created: 2005/09/28 +// Copyright: (c) 2005 TT-Solutions +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_TREEBK_H_ +#define _WX_XH_TREEBK_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_TREEBOOK + +class WXDLLIMPEXP_FWD_CORE wxTreebook; +#include "wx/dynarray.h" + +WX_DEFINE_USER_EXPORTED_ARRAY_SIZE_T(size_t, wxArrayTbkPageIndexes, + class WXDLLIMPEXP_XRC); + +// --------------------------------------------------------------------- +// wxTreebookXmlHandler class +// --------------------------------------------------------------------- +// Resource xml structure have to be almost the "same" as for wxNotebook +// except the additional (size_t)depth parameter for treebookpage nodes +// which indicates the depth of the page in the tree. +// There is only one logical constraint on this parameter : +// it cannot be greater than the previous page depth plus one +class WXDLLIMPEXP_XRC wxTreebookXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxTreebookXmlHandler) + +public: + wxTreebookXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + wxTreebook *m_tbk; + wxArrayTbkPageIndexes m_treeContext; + bool m_isInside; +}; + + +// Example: +// ------- +// Label +// \--First +// | \--Second +// \--Third +// +// +// ... +// +// +// +// +// 0 +// +// +// +// +// 1 +// +// +// +// +// 2 +// +// +// +// +// 1 +// +// +// ... +// + +#endif // wxUSE_XRC && wxUSE_TREEBOOK + +#endif // _WX_XH_TREEBK_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_unkwn.h b/wxmsw/include/wx-3.0/wx/xrc/xh_unkwn.h new file mode 100644 index 00000000..e417b4d3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_unkwn.h @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_unkwn.h +// Purpose: XML resource handler for unknown widget +// Author: Vaclav Slavik +// Created: 2000/03/05 +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_UNKWN_H_ +#define _WX_XH_UNKWN_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +class WXDLLIMPEXP_XRC wxUnknownWidgetXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxUnknownWidgetXmlHandler) + +public: + wxUnknownWidgetXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC + +#endif // _WX_XH_UNKWN_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xh_wizrd.h b/wxmsw/include/wx-3.0/wx/xrc/xh_wizrd.h new file mode 100644 index 00000000..486cf5d9 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xh_wizrd.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_wizrd.h +// Purpose: XML resource handler for wxWizard +// Author: Vaclav Slavik +// Created: 2003/03/02 +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_WIZRD_H_ +#define _WX_XH_WIZRD_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_WIZARDDLG + +class WXDLLIMPEXP_FWD_ADV wxWizard; +class WXDLLIMPEXP_FWD_ADV wxWizardPageSimple; + +class WXDLLIMPEXP_XRC wxWizardXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxWizardXmlHandler) + +public: + wxWizardXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + wxWizard *m_wizard; + wxWizardPageSimple *m_lastSimplePage; +}; + +#endif // wxUSE_XRC && wxUSE_WIZARDDLG + +#endif // _WX_XH_WIZRD_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xmlres.h b/wxmsw/include/wx-3.0/wx/xrc/xmlres.h new file mode 100644 index 00000000..8924bcc3 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xmlres.h @@ -0,0 +1,647 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xmlres.h +// Purpose: XML resources +// Author: Vaclav Slavik +// Created: 2000/03/05 +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XMLRES_H_ +#define _WX_XMLRES_H_ + +#include "wx/defs.h" + +#if wxUSE_XRC + +#include "wx/string.h" +#include "wx/dynarray.h" +#include "wx/arrstr.h" +#include "wx/datetime.h" +#include "wx/list.h" +#include "wx/gdicmn.h" +#include "wx/filesys.h" +#include "wx/bitmap.h" +#include "wx/icon.h" +#include "wx/artprov.h" +#include "wx/colour.h" +#include "wx/vector.h" + +#include "wx/xrc/xmlreshandler.h" + +class WXDLLIMPEXP_FWD_BASE wxFileName; + +class WXDLLIMPEXP_FWD_CORE wxIconBundle; +class WXDLLIMPEXP_FWD_CORE wxImageList; +class WXDLLIMPEXP_FWD_CORE wxMenu; +class WXDLLIMPEXP_FWD_CORE wxMenuBar; +class WXDLLIMPEXP_FWD_CORE wxDialog; +class WXDLLIMPEXP_FWD_CORE wxPanel; +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxFrame; +class WXDLLIMPEXP_FWD_CORE wxToolBar; + +class WXDLLIMPEXP_FWD_XML wxXmlDocument; +class WXDLLIMPEXP_FWD_XML wxXmlNode; +class WXDLLIMPEXP_FWD_XRC wxXmlSubclassFactory; +class wxXmlSubclassFactories; +class wxXmlResourceModule; +class wxXmlResourceDataRecords; + +// These macros indicate current version of XML resources (this information is +// encoded in root node of XRC file as "version" property). +// +// Rules for increasing version number: +// - change it only if you made incompatible change to the format. Addition +// of new attribute to control handler is _not_ incompatible change, because +// older versions of the library may ignore it. +// - if you change version number, follow these steps: +// - set major, minor and release numbers to respective version numbers of +// the wxWidgets library (see wx/version.h) +// - reset revision to 0 unless the first three are same as before, +// in which case you should increase revision by one +#define WX_XMLRES_CURRENT_VERSION_MAJOR 2 +#define WX_XMLRES_CURRENT_VERSION_MINOR 5 +#define WX_XMLRES_CURRENT_VERSION_RELEASE 3 +#define WX_XMLRES_CURRENT_VERSION_REVISION 0 +#define WX_XMLRES_CURRENT_VERSION_STRING wxT("2.5.3.0") + +#define WX_XMLRES_CURRENT_VERSION \ + (WX_XMLRES_CURRENT_VERSION_MAJOR * 256*256*256 + \ + WX_XMLRES_CURRENT_VERSION_MINOR * 256*256 + \ + WX_XMLRES_CURRENT_VERSION_RELEASE * 256 + \ + WX_XMLRES_CURRENT_VERSION_REVISION) + +enum wxXmlResourceFlags +{ + wxXRC_USE_LOCALE = 1, + wxXRC_NO_SUBCLASSING = 2, + wxXRC_NO_RELOADING = 4 +}; + +// This class holds XML resources from one or more .xml files +// (or derived forms, either binary or zipped -- see manual for +// details). +class WXDLLIMPEXP_XRC wxXmlResource : public wxObject +{ +public: + // Constructor. + // Flags: wxXRC_USE_LOCALE + // translatable strings will be translated via _() + // using the given domain if specified + // wxXRC_NO_SUBCLASSING + // subclass property of object nodes will be ignored + // (useful for previews in XRC editors) + // wxXRC_NO_RELOADING + // don't check the modification time of the XRC files and + // reload them if they have changed on disk + wxXmlResource(int flags = wxXRC_USE_LOCALE, + const wxString& domain = wxEmptyString); + + // Constructor. + // Flags: wxXRC_USE_LOCALE + // translatable strings will be translated via _() + // using the given domain if specified + // wxXRC_NO_SUBCLASSING + // subclass property of object nodes will be ignored + // (useful for previews in XRC editors) + wxXmlResource(const wxString& filemask, int flags = wxXRC_USE_LOCALE, + const wxString& domain = wxEmptyString); + + // Destructor. + virtual ~wxXmlResource(); + + // Loads resources from XML files that match given filemask. + // This method understands wxFileSystem URLs if wxUSE_FILESYS. + bool Load(const wxString& filemask); + + // Loads resources from single XRC file. + bool LoadFile(const wxFileName& file); + + // Loads all XRC files from a directory. + bool LoadAllFiles(const wxString& dirname); + + // Unload resource from the given XML file (wildcards not allowed) + bool Unload(const wxString& filename); + + // Initialize handlers for all supported controls/windows. This will + // make the executable quite big because it forces linking against + // most of the wxWidgets library. + void InitAllHandlers(); + + // Initialize only a specific handler (or custom handler). Convention says + // that handler name is equal to the control's name plus 'XmlHandler', for + // example wxTextCtrlXmlHandler, wxHtmlWindowXmlHandler. The XML resource + // compiler (xmlres) can create include file that contains initialization + // code for all controls used within the resource. + void AddHandler(wxXmlResourceHandler *handler); + + // Add a new handler at the beginning of the handler list + void InsertHandler(wxXmlResourceHandler *handler); + + // Removes all handlers + void ClearHandlers(); + + // Registers subclasses factory for use in XRC. This function is not meant + // for public use, please see the comment above wxXmlSubclassFactory + // definition. + static void AddSubclassFactory(wxXmlSubclassFactory *factory); + + // Loads menu from resource. Returns NULL on failure. + wxMenu *LoadMenu(const wxString& name); + + // Loads menubar from resource. Returns NULL on failure. + wxMenuBar *LoadMenuBar(wxWindow *parent, const wxString& name); + + // Loads menubar from resource. Returns NULL on failure. + wxMenuBar *LoadMenuBar(const wxString& name) { return LoadMenuBar(NULL, name); } + +#if wxUSE_TOOLBAR + // Loads a toolbar. + wxToolBar *LoadToolBar(wxWindow *parent, const wxString& name); +#endif + + // Loads a dialog. dlg points to parent window (if any). + wxDialog *LoadDialog(wxWindow *parent, const wxString& name); + + // Loads a dialog. dlg points to parent window (if any). This form + // is used to finish creation of already existing instance (main reason + // for this is that you may want to use derived class with new event table) + // Example (typical usage): + // MyDialog dlg; + // wxTheXmlResource->LoadDialog(&dlg, mainFrame, "my_dialog"); + // dlg->ShowModal(); + bool LoadDialog(wxDialog *dlg, wxWindow *parent, const wxString& name); + + // Loads a panel. panel points to parent window (if any). + wxPanel *LoadPanel(wxWindow *parent, const wxString& name); + + // Loads a panel. panel points to parent window (if any). This form + // is used to finish creation of already existing instance. + bool LoadPanel(wxPanel *panel, wxWindow *parent, const wxString& name); + + // Loads a frame. + wxFrame *LoadFrame(wxWindow* parent, const wxString& name); + bool LoadFrame(wxFrame* frame, wxWindow *parent, const wxString& name); + + // Load an object from the resource specifying both the resource name and + // the classname. This lets you load nonstandard container windows. + wxObject *LoadObject(wxWindow *parent, const wxString& name, + const wxString& classname) + { + return DoLoadObject(parent, name, classname, false /* !recursive */); + } + + // Load an object from the resource specifying both the resource name and + // the classname. This form lets you finish the creation of an existing + // instance. + bool LoadObject(wxObject *instance, + wxWindow *parent, + const wxString& name, + const wxString& classname) + { + return DoLoadObject(instance, parent, name, classname, false); + } + + // These versions of LoadObject() look for the object with the given name + // recursively (breadth first) and can be used to instantiate an individual + // control defined anywhere in an XRC file. No check is done that the name + // is unique, it's up to the caller to ensure this. + wxObject *LoadObjectRecursively(wxWindow *parent, + const wxString& name, + const wxString& classname) + { + return DoLoadObject(parent, name, classname, true /* recursive */); + } + + bool LoadObjectRecursively(wxObject *instance, + wxWindow *parent, + const wxString& name, + const wxString& classname) + { + return DoLoadObject(instance, parent, name, classname, true); + } + + // Loads a bitmap resource from a file. + wxBitmap LoadBitmap(const wxString& name); + + // Loads an icon resource from a file. + wxIcon LoadIcon(const wxString& name); + + // Attaches an unknown control to the given panel/window/dialog. + // Unknown controls are used in conjunction with . + bool AttachUnknownControl(const wxString& name, wxWindow *control, + wxWindow *parent = NULL); + + // Returns a numeric ID that is equivalent to the string ID used in an XML + // resource. If an unknown str_id is requested (i.e. other than wxID_XXX + // or integer), a new record is created which associates the given string + // with a number. If value_if_not_found == wxID_NONE, the number is obtained via + // wxWindow::NewControlId(). Otherwise value_if_not_found is used. + // Macro XRCID(name) is provided for convenient use in event tables. + static int GetXRCID(const wxString& str_id, int value_if_not_found = wxID_NONE) + { return DoGetXRCID(str_id.mb_str(), value_if_not_found); } + + // version for internal use only + static int DoGetXRCID(const char *str_id, int value_if_not_found = wxID_NONE); + + + // Find the string ID with the given numeric value, returns an empty string + // if no such ID is found. + // + // Notice that unlike GetXRCID(), which is fast, this operation is slow as + // it checks all the IDs used in XRC. + static wxString FindXRCIDById(int numId); + + + // Returns version information (a.b.c.d = d+ 256*c + 256^2*b + 256^3*a). + long GetVersion() const { return m_version; } + + // Compares resources version to argument. Returns -1 if resources version + // is less than the argument, +1 if greater and 0 if they equal. + int CompareVersion(int major, int minor, int release, int revision) const + { + long diff = GetVersion() - + (major*256*256*256 + minor*256*256 + release*256 + revision); + if ( diff < 0 ) + return -1; + else if ( diff > 0 ) + return +1; + else + return 0; + } + + //// Singleton accessors. + + // Gets the global resources object or creates one if none exists. + static wxXmlResource *Get(); + + // Sets the global resources object and returns a pointer to the previous one (may be NULL). + static wxXmlResource *Set(wxXmlResource *res); + + // Returns flags, which may be a bitlist of wxXRC_USE_LOCALE and wxXRC_NO_SUBCLASSING. + int GetFlags() const { return m_flags; } + // Set flags after construction. + void SetFlags(int flags) { m_flags = flags; } + + // Get/Set the domain to be passed to the translation functions, defaults + // to empty string (no domain). + const wxString& GetDomain() const { return m_domain; } + void SetDomain(const wxString& domain); + + + // This function returns the wxXmlNode containing the definition of the + // object with the given name or NULL. + // + // It can be used to access additional information defined in the XRC file + // and not used by wxXmlResource itself. + const wxXmlNode *GetResourceNode(const wxString& name) const + { return GetResourceNodeAndLocation(name, wxString(), true); } + +protected: + // reports input error at position 'context' + void ReportError(const wxXmlNode *context, const wxString& message); + + // override this in derived class to customize errors reporting + virtual void DoReportError(const wxString& xrcFile, const wxXmlNode *position, + const wxString& message); + + // Load the contents of a single file and returns its contents as a new + // wxXmlDocument (which will be owned by caller) on success or NULL. + wxXmlDocument *DoLoadFile(const wxString& file); + + // Scans the resources list for unloaded files and loads them. Also reloads + // files that have been modified since last loading. + bool UpdateResources(); + + + // Common implementation of GetResourceNode() and FindResource(): searches + // all top-level or all (if recursive == true) nodes if all loaded XRC + // files and returns the node, if found, as well as the path of the file it + // was found in if path is non-NULL + wxXmlNode *GetResourceNodeAndLocation(const wxString& name, + const wxString& classname, + bool recursive = false, + wxString *path = NULL) const; + + + // Note that these functions are used outside of wxWidgets itself, e.g. + // there are several known cases of inheriting from wxXmlResource just to + // be able to call FindResource() so we keep them for compatibility even if + // their names are not really consistent with GetResourceNode() public + // function and FindResource() is also non-const because it changes the + // current path of m_curFileSystem to ensure that relative paths work + // correctly when CreateResFromNode() is called immediately afterwards + // (something const public function intentionally does not do) + + // Returns the node containing the resource with the given name and class + // name unless it's empty (then any class matches) or NULL if not found. + wxXmlNode *FindResource(const wxString& name, const wxString& classname, + bool recursive = false); + + // Helper function used by FindResource() to look under the given node. + wxXmlNode *DoFindResource(wxXmlNode *parent, const wxString& name, + const wxString& classname, bool recursive) const; + + // Creates a resource from information in the given node + // (Uses only 'handlerToUse' if != NULL) + wxObject *CreateResFromNode(wxXmlNode *node, wxObject *parent, + wxObject *instance = NULL, + wxXmlResourceHandler *handlerToUse = NULL) + { + return node ? DoCreateResFromNode(*node, parent, instance, handlerToUse) + : NULL; + } + + // Helper of Load() and Unload(): returns the URL corresponding to the + // given file if it's indeed a file, otherwise returns the original string + // unmodified + static wxString ConvertFileNameToURL(const wxString& filename); + + // loading resources from archives is impossible without wxFileSystem +#if wxUSE_FILESYSTEM + // Another helper: detect if the filename is a ZIP or XRS file + static bool IsArchive(const wxString& filename); +#endif // wxUSE_FILESYSTEM + +private: + wxXmlResourceDataRecords& Data() { return *m_data; } + const wxXmlResourceDataRecords& Data() const { return *m_data; } + + // the real implementation of CreateResFromNode(): this should be only + // called if node is non-NULL + wxObject *DoCreateResFromNode(wxXmlNode& node, + wxObject *parent, + wxObject *instance, + wxXmlResourceHandler *handlerToUse = NULL); + + // common part of LoadObject() and LoadObjectRecursively() + wxObject *DoLoadObject(wxWindow *parent, + const wxString& name, + const wxString& classname, + bool recursive); + bool DoLoadObject(wxObject *instance, + wxWindow *parent, + const wxString& name, + const wxString& classname, + bool recursive); + +private: + long m_version; + + int m_flags; + wxVector m_handlers; + wxXmlResourceDataRecords *m_data; +#if wxUSE_FILESYSTEM + wxFileSystem m_curFileSystem; + wxFileSystem& GetCurFileSystem() { return m_curFileSystem; } +#endif + + // domain to pass to translation functions, if any. + wxString m_domain; + + friend class wxXmlResourceHandlerImpl; + friend class wxXmlResourceModule; + friend class wxIdRangeManager; + friend class wxIdRange; + + static wxXmlSubclassFactories *ms_subclassFactories; + + // singleton instance: + static wxXmlResource *ms_instance; +}; + + +// This macro translates string identifier (as used in XML resource, +// e.g. ...) to integer id that is needed by +// wxWidgets event tables. +// Example: +// BEGIN_EVENT_TABLE(MyFrame, wxFrame) +// EVT_MENU(XRCID("quit"), MyFrame::OnQuit) +// EVT_MENU(XRCID("about"), MyFrame::OnAbout) +// EVT_MENU(XRCID("new"), MyFrame::OnNew) +// EVT_MENU(XRCID("open"), MyFrame::OnOpen) +// END_EVENT_TABLE() + +#define XRCID(str_id) \ + wxXmlResource::DoGetXRCID(str_id) + + +// This macro returns pointer to particular control in dialog +// created using XML resources. You can use it to set/get values from +// controls. +// Example: +// wxDialog dlg; +// wxXmlResource::Get()->LoadDialog(&dlg, mainFrame, "my_dialog"); +// XRCCTRL(dlg, "my_textctrl", wxTextCtrl)->SetValue(wxT("default value")); + +#define XRCCTRL(window, id, type) \ + (wxStaticCast((window).FindWindow(XRCID(id)), type)) + +// This macro returns pointer to sizer item +// Example: +// +// +// 400, 300 +// +// +// wxSizerItem* item = XRCSIZERITEM(*this, "area") + +#define XRCSIZERITEM(window, id) \ + ((window).GetSizer() ? (window).GetSizer()->GetItemById(XRCID(id)) : NULL) + + +// wxXmlResourceHandlerImpl is the back-end of the wxXmlResourceHander class to +// really implementing all its functionality. It is defined in the "xrc" +// library unlike wxXmlResourceHandler itself which is defined in "core" to +// allow inheriting from it in the code from the other libraries too. + +class WXDLLIMPEXP_XRC wxXmlResourceHandlerImpl : public wxXmlResourceHandlerImplBase +{ +public: + // Constructor. + wxXmlResourceHandlerImpl(wxXmlResourceHandler *handler); + + // Destructor. + virtual ~wxXmlResourceHandlerImpl() {} + + // Creates an object (menu, dialog, control, ...) from an XML node. + // Should check for validity. + // parent is a higher-level object (usually window, dialog or panel) + // that is often necessary to create the resource. + // If instance is non-NULL it should not create a new instance via 'new' but + // should rather use this one, and call its Create method. + wxObject *CreateResource(wxXmlNode *node, wxObject *parent, + wxObject *instance); + + + // --- Handy methods: + + // Returns true if the node has a property class equal to classname, + // e.g. . + bool IsOfClass(wxXmlNode *node, const wxString& classname) const; + + // Gets node content from wxXML_ENTITY_NODE + // The problem is, content is represented as + // wxXML_ENTITY_NODE name="tag", content="" + // |-- wxXML_TEXT_NODE or + // wxXML_CDATA_SECTION_NODE name="" content="content" + wxString GetNodeContent(const wxXmlNode *node); + + // Check to see if a parameter exists. + bool HasParam(const wxString& param); + + // Finds the node or returns NULL. + wxXmlNode *GetParamNode(const wxString& param); + + // Finds the parameter value or returns the empty string. + wxString GetParamValue(const wxString& param); + + // Returns the parameter value from given node. + wxString GetParamValue(const wxXmlNode* node); + + // Gets style flags from text in form "flag | flag2| flag3 |..." + // Only understands flags added with AddStyle + int GetStyle(const wxString& param = wxT("style"), int defaults = 0); + + // Gets text from param and does some conversions: + // - replaces \n, \r, \t by respective chars (according to C syntax) + // - replaces _ by & and __ by _ (needed for _File => &File because of XML) + // - calls wxGetTranslations (unless disabled in wxXmlResource) + wxString GetText(const wxString& param, bool translate = true); + + // Returns the XRCID. + int GetID(); + + // Returns the resource name. + wxString GetName(); + + // Gets a bool flag (1, t, yes, on, true are true, everything else is false). + bool GetBool(const wxString& param, bool defaultv = false); + + // Gets an integer value from the parameter. + long GetLong(const wxString& param, long defaultv = 0); + + // Gets a float value from the parameter. + float GetFloat(const wxString& param, float defaultv = 0); + + // Gets colour in HTML syntax (#RRGGBB). + wxColour GetColour(const wxString& param, const wxColour& defaultv = wxNullColour); + + // Gets the size (may be in dialog units). + wxSize GetSize(const wxString& param = wxT("size"), + wxWindow *windowToUse = NULL); + + // Gets the position (may be in dialog units). + wxPoint GetPosition(const wxString& param = wxT("pos")); + + // Gets a dimension (may be in dialog units). + wxCoord GetDimension(const wxString& param, wxCoord defaultv = 0, + wxWindow *windowToUse = NULL); + + // Gets a direction, complains if the value is invalid. + wxDirection GetDirection(const wxString& param, wxDirection dirDefault = wxLEFT); + + // Gets a bitmap. + wxBitmap GetBitmap(const wxString& param = wxT("bitmap"), + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize); + + // Gets a bitmap from an XmlNode. + wxBitmap GetBitmap(const wxXmlNode* node, + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize); + + // Gets an icon. + wxIcon GetIcon(const wxString& param = wxT("icon"), + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize); + + // Gets an icon from an XmlNode. + wxIcon GetIcon(const wxXmlNode* node, + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize); + + // Gets an icon bundle. + wxIconBundle GetIconBundle(const wxString& param, + const wxArtClient& defaultArtClient = wxART_OTHER); + + // Gets an image list. + wxImageList *GetImageList(const wxString& param = wxT("imagelist")); + +#if wxUSE_ANIMATIONCTRL + // Gets an animation. + wxAnimation* GetAnimation(const wxString& param = wxT("animation")); +#endif + + // Gets a font. + wxFont GetFont(const wxString& param = wxT("font"), wxWindow* parent = NULL); + + // Gets the value of a boolean attribute (only "0" and "1" are valid values) + bool GetBoolAttr(const wxString& attr, bool defaultv); + + + // Sets common window options. + void SetupWindow(wxWindow *wnd); + + // Creates children. + void CreateChildren(wxObject *parent, bool this_hnd_only = false); + + // Helper function. + void CreateChildrenPrivately(wxObject *parent, wxXmlNode *rootnode = NULL); + + // Creates a resource from a node. + wxObject *CreateResFromNode(wxXmlNode *node, + wxObject *parent, wxObject *instance = NULL); + + // helper +#if wxUSE_FILESYSTEM + wxFileSystem& GetCurFileSystem(); +#endif + + // reports input error at position 'context' + void ReportError(wxXmlNode *context, const wxString& message); + // reports input error at m_node + void ReportError(const wxString& message); + // reports input error when parsing parameter with given name + void ReportParamError(const wxString& param, const wxString& message); +}; + + +// Programmer-friendly macros for writing XRC handlers: + +#define XRC_MAKE_INSTANCE(variable, classname) \ + classname *variable = NULL; \ + if (m_instance) \ + variable = wxStaticCast(m_instance, classname); \ + if (!variable) \ + variable = new classname; + + +// FIXME -- remove this $%^#$%#$@# as soon as Ron checks his changes in!! +WXDLLIMPEXP_XRC void wxXmlInitResourceModule(); + + +// This class is used to create instances of XRC "object" nodes with "subclass" +// property. It is _not_ supposed to be used by XRC users, you should instead +// register your subclasses via wxWidgets' RTTI mechanism. This class is useful +// only for language bindings developer who need a way to implement subclassing +// in wxWidgets ports that don't support wxRTTI (e.g. wxPython). +class WXDLLIMPEXP_XRC wxXmlSubclassFactory +{ +public: + // Try to create instance of given class and return it, return NULL on + // failure: + virtual wxObject *Create(const wxString& className) = 0; + virtual ~wxXmlSubclassFactory() {} +}; + + +/* ------------------------------------------------------------------------- + Backward compatibility macros. Do *NOT* use, they may disappear in future + versions of the XRC library! + ------------------------------------------------------------------------- */ + +#endif // wxUSE_XRC + +#endif // _WX_XMLRES_H_ diff --git a/wxmsw/include/wx-3.0/wx/xrc/xmlreshandler.h b/wxmsw/include/wx-3.0/wx/xrc/xmlreshandler.h new file mode 100644 index 00000000..7aa12b7b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xrc/xmlreshandler.h @@ -0,0 +1,389 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xmlreshandler.cpp +// Purpose: XML resource handler +// Author: Steven Lamerton +// Created: 2011/01/26 +// RCS-ID: $id$ +// Copyright: (c) 2011 Steven Lamerton +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XRC_XMLRESHANDLER_H_ +#define _WX_XRC_XMLRESHANDLER_H_ + +#include "wx/defs.h" + +#if wxUSE_XRC + +#include "wx/string.h" +#include "wx/artprov.h" +#include "wx/colour.h" +#include "wx/filesys.h" +#include "wx/imaglist.h" +#include "wx/window.h" + +class WXDLLIMPEXP_FWD_ADV wxAnimation; + +class WXDLLIMPEXP_FWD_XML wxXmlNode; +class WXDLLIMPEXP_FWD_XML wxXmlResource; + +class WXDLLIMPEXP_FWD_CORE wxXmlResourceHandler; + +// Helper macro used by the classes derived from wxXmlResourceHandler but also +// by wxXmlResourceHandler implementation itself. +#define XRC_ADD_STYLE(style) AddStyle(wxT(#style), style) + +// Abstract base class for the implementation object used by +// wxXmlResourceHandlerImpl. The real implementation is in +// wxXmlResourceHandlerImpl class in the "xrc" library while this class is in +// the "core" itself -- but it is so small that it doesn't matter. + +class WXDLLIMPEXP_CORE wxXmlResourceHandlerImplBase : public wxObject +{ +public: + // Constructor. + wxXmlResourceHandlerImplBase(wxXmlResourceHandler *handler) + : m_handler(handler) + {} + + // Destructor. + virtual ~wxXmlResourceHandlerImplBase() {} + + virtual wxObject *CreateResource(wxXmlNode *node, wxObject *parent, + wxObject *instance) = 0; + virtual bool IsOfClass(wxXmlNode *node, const wxString& classname) const = 0; + virtual wxString GetNodeContent(const wxXmlNode *node) = 0; + virtual bool HasParam(const wxString& param) = 0; + virtual wxXmlNode *GetParamNode(const wxString& param) = 0; + virtual wxString GetParamValue(const wxString& param) = 0; + virtual wxString GetParamValue(const wxXmlNode* node) = 0; + virtual int GetStyle(const wxString& param = wxT("style"), int defaults = 0) = 0; + virtual wxString GetText(const wxString& param, bool translate = true) = 0; + virtual int GetID() = 0; + virtual wxString GetName() = 0; + virtual bool GetBool(const wxString& param, bool defaultv = false) = 0; + virtual long GetLong(const wxString& param, long defaultv = 0) = 0; + virtual float GetFloat(const wxString& param, float defaultv = 0) = 0; + virtual wxColour GetColour(const wxString& param, + const wxColour& defaultv = wxNullColour) = 0; + virtual wxSize GetSize(const wxString& param = wxT("size"), + wxWindow *windowToUse = NULL) = 0; + virtual wxPoint GetPosition(const wxString& param = wxT("pos")) = 0; + virtual wxCoord GetDimension(const wxString& param, wxCoord defaultv = 0, + wxWindow *windowToUse = NULL) = 0; + virtual wxDirection GetDirection(const wxString& param, wxDirection dir = wxLEFT) = 0; + virtual wxBitmap GetBitmap(const wxString& param = wxT("bitmap"), + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) = 0; + virtual wxBitmap GetBitmap(const wxXmlNode* node, + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) = 0; + virtual wxIcon GetIcon(const wxString& param = wxT("icon"), + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) = 0; + virtual wxIcon GetIcon(const wxXmlNode* node, + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) = 0; + virtual wxIconBundle GetIconBundle(const wxString& param, + const wxArtClient& defaultArtClient = wxART_OTHER) = 0; + virtual wxImageList *GetImageList(const wxString& param = wxT("imagelist")) = 0; + +#if wxUSE_ANIMATIONCTRL + virtual wxAnimation* GetAnimation(const wxString& param = wxT("animation")) = 0; +#endif + + virtual wxFont GetFont(const wxString& param = wxT("font"), wxWindow* parent = NULL) = 0; + virtual bool GetBoolAttr(const wxString& attr, bool defaultv) = 0; + virtual void SetupWindow(wxWindow *wnd) = 0; + virtual void CreateChildren(wxObject *parent, bool this_hnd_only = false) = 0; + virtual void CreateChildrenPrivately(wxObject *parent, + wxXmlNode *rootnode = NULL) = 0; + virtual wxObject *CreateResFromNode(wxXmlNode *node, wxObject *parent, + wxObject *instance = NULL) = 0; + +#if wxUSE_FILESYSTEM + virtual wxFileSystem& GetCurFileSystem() = 0; +#endif + virtual void ReportError(wxXmlNode *context, const wxString& message) = 0; + virtual void ReportError(const wxString& message) = 0; + virtual void ReportParamError(const wxString& param, const wxString& message) = 0; + + wxXmlResourceHandler* GetHandler() { return m_handler; } + +protected: + wxXmlResourceHandler *m_handler; +}; + +// Base class for all XRC handlers. +// +// Notice that this class is defined in the core library itself and so can be +// used as the base class by classes in any GUI library. However to actually be +// usable, it needs to be registered with wxXmlResource which implies linking +// the application with the xrc library. +// +// Also note that all the methods forwarding to GetImpl() are documented only +// in wxXmlResourceHandlerImpl in wx/xrc/xmlres.h to avoid duplication. + +class WXDLLIMPEXP_CORE wxXmlResourceHandler : public wxObject +{ +public: + // Constructor creates an unusable object, before anything can be done with + // it, SetImpl() needs to be called as done by wxXmlResource::AddHandler(). + wxXmlResourceHandler() + { + m_node = NULL; + m_parent = + m_instance = NULL; + m_parentAsWindow = NULL; + m_resource = NULL; + + m_impl = NULL; + } + + // This should be called exactly once. + void SetImpl(wxXmlResourceHandlerImplBase* impl) + { + wxASSERT_MSG( !m_impl, wxS("Should be called exactly once") ); + + m_impl = impl; + } + + + // Destructor. + virtual ~wxXmlResourceHandler() + { + delete m_impl; + } + + wxObject *CreateResource(wxXmlNode *node, wxObject *parent, + wxObject *instance) + { + return GetImpl()->CreateResource(node, parent, instance); + } + + // This one is called from CreateResource after variables + // were filled. + virtual wxObject *DoCreateResource() = 0; + + // Returns true if it understands this node and can create + // a resource from it, false otherwise. + virtual bool CanHandle(wxXmlNode *node) = 0; + + + void SetParentResource(wxXmlResource *res) + { + m_resource = res; + } + + + // These methods are not forwarded to wxXmlResourceHandlerImpl because they + // are called from the derived classes ctors and so before SetImpl() can be + // called. + + // Add a style flag (e.g. wxMB_DOCKABLE) to the list of flags + // understood by this handler. + void AddStyle(const wxString& name, int value); + + // Add styles common to all wxWindow-derived classes. + void AddWindowStyles(); + +protected: + // Everything else is simply forwarded to wxXmlResourceHandlerImpl. + void ReportError(wxXmlNode *context, const wxString& message) + { + GetImpl()->ReportError(context, message); + } + void ReportError(const wxString& message) + { + GetImpl()->ReportError(message); + } + void ReportParamError(const wxString& param, const wxString& message) + { + GetImpl()->ReportParamError(param, message); + } + + bool IsOfClass(wxXmlNode *node, const wxString& classname) const + { + return GetImpl()->IsOfClass(node, classname); + } + wxString GetNodeContent(const wxXmlNode *node) + { + return GetImpl()->GetNodeContent(node); + } + bool HasParam(const wxString& param) + { + return GetImpl()->HasParam(param); + } + + wxXmlNode *GetParamNode(const wxString& param) + { + return GetImpl()->GetParamNode(param); + } + wxString GetParamValue(const wxString& param) + { + return GetImpl()->GetParamValue(param); + } + wxString GetParamValue(const wxXmlNode* node) + { + return GetImpl()->GetParamValue(node); + } + int GetStyle(const wxString& param = wxT("style"), int defaults = 0) + { + return GetImpl()->GetStyle(param, defaults); + } + wxString GetText(const wxString& param, bool translate = true) + { + return GetImpl()->GetText(param, translate); + } + int GetID() const + { + return GetImpl()->GetID(); + } + wxString GetName() + { + return GetImpl()->GetName(); + } + bool GetBool(const wxString& param, bool defaultv = false) + { + return GetImpl()->GetBool(param, defaultv); + } + long GetLong(const wxString& param, long defaultv = 0) + { + return GetImpl()->GetLong(param, defaultv); + } + float GetFloat(const wxString& param, float defaultv = 0) + { + return GetImpl()->GetFloat(param, defaultv); + } + wxColour GetColour(const wxString& param, + const wxColour& defaultv = wxNullColour) + { + return GetImpl()->GetColour(param, defaultv); + } + wxSize GetSize(const wxString& param = wxT("size"), + wxWindow *windowToUse = NULL) + { + return GetImpl()->GetSize(param, windowToUse); + } + wxPoint GetPosition(const wxString& param = wxT("pos")) + { + return GetImpl()->GetPosition(param); + } + wxCoord GetDimension(const wxString& param, wxCoord defaultv = 0, + wxWindow *windowToUse = NULL) + { + return GetImpl()->GetDimension(param, defaultv, windowToUse); + } + wxDirection GetDirection(const wxString& param, wxDirection dir = wxLEFT) + { + return GetImpl()->GetDirection(param, dir); + } + wxBitmap GetBitmap(const wxString& param = wxT("bitmap"), + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) + { + return GetImpl()->GetBitmap(param, defaultArtClient, size); + } + wxBitmap GetBitmap(const wxXmlNode* node, + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) + { + return GetImpl()->GetBitmap(node, defaultArtClient, size); + } + wxIcon GetIcon(const wxString& param = wxT("icon"), + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) + { + return GetImpl()->GetIcon(param, defaultArtClient, size); + } + wxIcon GetIcon(const wxXmlNode* node, + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) + { + return GetImpl()->GetIcon(node, defaultArtClient, size); + } + wxIconBundle GetIconBundle(const wxString& param, + const wxArtClient& defaultArtClient = wxART_OTHER) + { + return GetImpl()->GetIconBundle(param, defaultArtClient); + } + wxImageList *GetImageList(const wxString& param = wxT("imagelist")) + { + return GetImpl()->GetImageList(param); + } + +#if wxUSE_ANIMATIONCTRL + wxAnimation* GetAnimation(const wxString& param = wxT("animation")) + { + return GetImpl()->GetAnimation(param); + } +#endif + + wxFont GetFont(const wxString& param = wxT("font"), + wxWindow* parent = NULL) + { + return GetImpl()->GetFont(param, parent); + } + bool GetBoolAttr(const wxString& attr, bool defaultv) + { + return GetImpl()->GetBoolAttr(attr, defaultv); + } + void SetupWindow(wxWindow *wnd) + { + GetImpl()->SetupWindow(wnd); + } + void CreateChildren(wxObject *parent, bool this_hnd_only = false) + { + GetImpl()->CreateChildren(parent, this_hnd_only); + } + void CreateChildrenPrivately(wxObject *parent, wxXmlNode *rootnode = NULL) + { + GetImpl()->CreateChildrenPrivately(parent, rootnode); + } + wxObject *CreateResFromNode(wxXmlNode *node, + wxObject *parent, wxObject *instance = NULL) + { + return GetImpl()->CreateResFromNode(node, parent, instance); + } + +#if wxUSE_FILESYSTEM + wxFileSystem& GetCurFileSystem() + { + return GetImpl()->GetCurFileSystem(); + } +#endif + + // Variables (filled by CreateResource) + wxXmlNode *m_node; + wxString m_class; + wxObject *m_parent, *m_instance; + wxWindow *m_parentAsWindow; + wxXmlResource *m_resource; + + // provide method access to those member variables + wxXmlResource* GetResource() const { return m_resource; } + wxXmlNode* GetNode() const { return m_node; } + wxString GetClass() const { return m_class; } + wxObject* GetParent() const { return m_parent; } + wxObject* GetInstance() const { return m_instance; } + wxWindow* GetParentAsWindow() const { return m_parentAsWindow; } + + + wxArrayString m_styleNames; + wxArrayInt m_styleValues; + + friend class wxXmlResourceHandlerImpl; + +private: + // This is supposed to never return NULL because SetImpl() should have been + // called. + wxXmlResourceHandlerImplBase* GetImpl() const; + + wxXmlResourceHandlerImplBase *m_impl; + + wxDECLARE_ABSTRACT_CLASS(wxXmlResourceHandler); +}; + +#endif // wxUSE_XRC + +#endif // _WX_XRC_XMLRESHANDLER_H_ diff --git a/wxmsw/include/wx-3.0/wx/xti.h b/wxmsw/include/wx-3.0/wx/xti.h new file mode 100644 index 00000000..75f594f4 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xti.h @@ -0,0 +1,469 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xti.h +// Purpose: runtime metadata information (extended class info) +// Author: Stefan Csomor +// Modified by: Francesco Montorsi +// Created: 27/07/03 +// Copyright: (c) 1997 Julian Smart +// (c) 2003 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XTIH__ +#define _WX_XTIH__ + +// We want to support properties, event sources and events sinks through +// explicit declarations, using templates and specialization to make the +// effort as painless as possible. +// +// This means we have the following domains : +// +// - Type Information for categorizing built in types as well as custom types +// this includes information about enums, their values and names +// - Type safe value storage : a kind of wxVariant, called right now wxAny +// which will be merged with wxVariant +// - Property Information and Property Accessors providing access to a class' +// values and exposed event delegates +// - Information about event handlers +// - extended Class Information for accessing all these + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_EXTENDED_RTTI + +class WXDLLIMPEXP_FWD_BASE wxAny; +class WXDLLIMPEXP_FWD_BASE wxAnyList; +class WXDLLIMPEXP_FWD_BASE wxObject; +class WXDLLIMPEXP_FWD_BASE wxString; +class WXDLLIMPEXP_FWD_BASE wxClassInfo; +class WXDLLIMPEXP_FWD_BASE wxHashTable; +class WXDLLIMPEXP_FWD_BASE wxObject; +class WXDLLIMPEXP_FWD_BASE wxPluginLibrary; +class WXDLLIMPEXP_FWD_BASE wxHashTable; +class WXDLLIMPEXP_FWD_BASE wxHashTable_Node; + +class WXDLLIMPEXP_FWD_BASE wxStringToAnyHashMap; +class WXDLLIMPEXP_FWD_BASE wxPropertyInfoMap; +class WXDLLIMPEXP_FWD_BASE wxPropertyAccessor; +class WXDLLIMPEXP_FWD_BASE wxObjectAllocatorAndCreator; +class WXDLLIMPEXP_FWD_BASE wxObjectAllocator; + + +#define wx_dynamic_cast(t, x) dynamic_cast(x) + +#include "wx/xtitypes.h" +#include "wx/xtihandler.h" + +// ---------------------------------------------------------------------------- +// wxClassInfo +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxObjectFunctor +{ +public: + virtual ~wxObjectFunctor(); + + // Invoke the actual event handler: + virtual void operator()(const wxObject *) = 0; +}; + +class WXDLLIMPEXP_FWD_BASE wxPropertyInfo; +class WXDLLIMPEXP_FWD_BASE wxHandlerInfo; + +typedef wxObject *(*wxObjectConstructorFn)(void); +typedef wxPropertyInfo *(*wxPropertyInfoFn)(void); +typedef wxHandlerInfo *(*wxHandlerInfoFn)(void); +typedef void (*wxVariantToObjectConverter)( const wxAny &data, wxObjectFunctor* fn ); +typedef wxObject* (*wxVariantToObjectPtrConverter) ( const wxAny& data); +typedef wxAny (*wxObjectToVariantConverter)( wxObject* ); + +WXDLLIMPEXP_BASE wxString wxAnyGetAsString( const wxAny& data); +WXDLLIMPEXP_BASE const wxObject* wxAnyGetAsObjectPtr( const wxAny& data); + +class WXDLLIMPEXP_BASE wxObjectWriter; +class WXDLLIMPEXP_BASE wxObjectWriterCallback; + +typedef bool (*wxObjectStreamingCallback) ( const wxObject *, wxObjectWriter *, \ + wxObjectWriterCallback *, const wxStringToAnyHashMap & ); + + + +class WXDLLIMPEXP_BASE wxClassInfo +{ + friend class WXDLLIMPEXP_BASE wxPropertyInfo; + friend class /* WXDLLIMPEXP_BASE */ wxHandlerInfo; + friend wxObject *wxCreateDynamicObject(const wxString& name); + +public: + wxClassInfo(const wxClassInfo **_Parents, + const wxChar *_UnitName, + const wxChar *_ClassName, + int size, + wxObjectConstructorFn ctor, + wxPropertyInfoFn _Props, + wxHandlerInfoFn _Handlers, + wxObjectAllocatorAndCreator* _Constructor, + const wxChar ** _ConstructorProperties, + const int _ConstructorPropertiesCount, + wxVariantToObjectPtrConverter _PtrConverter1, + wxVariantToObjectConverter _Converter2, + wxObjectToVariantConverter _Converter3, + wxObjectStreamingCallback _streamingCallback = NULL) : + m_className(_ClassName), + m_objectSize(size), + m_objectConstructor(ctor), + m_next(sm_first), + m_firstPropertyFn(_Props), + m_firstHandlerFn(_Handlers), + m_firstProperty(NULL), + m_firstHandler(NULL), + m_firstInited(false), + m_parents(_Parents), + m_unitName(_UnitName), + m_constructor(_Constructor), + m_constructorProperties(_ConstructorProperties), + m_constructorPropertiesCount(_ConstructorPropertiesCount), + m_variantOfPtrToObjectConverter(_PtrConverter1), + m_variantToObjectConverter(_Converter2), + m_objectToVariantConverter(_Converter3), + m_streamingCallback(_streamingCallback) + { + sm_first = this; + Register(); + } + + wxClassInfo(const wxChar *_UnitName, const wxChar *_ClassName, + const wxClassInfo **_Parents) : + m_className(_ClassName), + m_objectSize(0), + m_objectConstructor(NULL), + m_next(sm_first), + m_firstPropertyFn(NULL), + m_firstHandlerFn(NULL), + m_firstProperty(NULL), + m_firstHandler(NULL), + m_firstInited(true), + m_parents(_Parents), + m_unitName(_UnitName), + m_constructor(NULL), + m_constructorProperties(NULL), + m_constructorPropertiesCount(0), + m_variantOfPtrToObjectConverter(NULL), + m_variantToObjectConverter(NULL), + m_objectToVariantConverter(NULL), + m_streamingCallback(NULL) + { + sm_first = this; + Register(); + } + + // ctor compatible with old RTTI system + wxClassInfo(const wxChar *_ClassName, + const wxClassInfo *_Parent1, + const wxClassInfo *_Parent2, + int size, + wxObjectConstructorFn ctor) : + m_className(_ClassName), + m_objectSize(size), + m_objectConstructor(ctor), + m_next(sm_first), + m_firstPropertyFn(NULL), + m_firstHandlerFn(NULL), + m_firstProperty(NULL), + m_firstHandler(NULL), + m_firstInited(true), + m_parents(NULL), + m_unitName(NULL), + m_constructor(NULL), + m_constructorProperties(NULL), + m_constructorPropertiesCount(0), + m_variantOfPtrToObjectConverter(NULL), + m_variantToObjectConverter(NULL), + m_objectToVariantConverter(NULL), + m_streamingCallback(NULL) + { + sm_first = this; + m_parents[0] = _Parent1; + m_parents[1] = _Parent2; + m_parents[2] = NULL; + Register(); + } + + virtual ~wxClassInfo(); + + // allocates an instance of this class, this object does not have to be + // initialized or fully constructed as this call will be followed by a call to Create + virtual wxObject *AllocateObject() const + { return m_objectConstructor ? (*m_objectConstructor)() : 0; } + + // 'old naming' for AllocateObject staying here for backward compatibility + wxObject *CreateObject() const { return AllocateObject(); } + + // direct construction call for classes that cannot construct instances via alloc/create + wxObject *ConstructObject(int ParamCount, wxAny *Params) const; + + bool NeedsDirectConstruction() const; + + const wxChar *GetClassName() const + { return m_className; } + const wxChar *GetBaseClassName1() const + { return m_parents[0] ? m_parents[0]->GetClassName() : NULL; } + const wxChar *GetBaseClassName2() const + { return (m_parents[0] && m_parents[1]) ? m_parents[1]->GetClassName() : NULL; } + + const wxClassInfo *GetBaseClass1() const + { return m_parents[0]; } + const wxClassInfo *GetBaseClass2() const + { return m_parents[0] ? m_parents[1] : NULL; } + + const wxChar *GetIncludeName() const + { return m_unitName; } + const wxClassInfo **GetParents() const + { return m_parents; } + int GetSize() const + { return m_objectSize; } + bool IsDynamic() const + { return (NULL != m_objectConstructor); } + + wxObjectConstructorFn GetConstructor() const + { return m_objectConstructor; } + const wxClassInfo *GetNext() const + { return m_next; } + + // statics: + + static void CleanUp(); + static wxClassInfo *FindClass(const wxString& className); + static const wxClassInfo *GetFirst() + { return sm_first; } + + + // Climb upwards through inheritance hierarchy. + // Dual inheritance is catered for. + + bool IsKindOf(const wxClassInfo *info) const; + + wxDECLARE_CLASS_INFO_ITERATORS(); + + // if there is a callback registered with that class it will be called + // before this object will be written to disk, it can veto streaming out + // this object by returning false, if this class has not registered a + // callback, the search will go up the inheritance tree if no callback has + // been registered true will be returned by default + bool BeforeWriteObject( const wxObject *obj, wxObjectWriter *streamer, + wxObjectWriterCallback *writercallback, const wxStringToAnyHashMap &metadata) const; + + // gets the streaming callback from this class or any superclass + wxObjectStreamingCallback GetStreamingCallback() const; + + // returns the first property + wxPropertyInfo* GetFirstProperty() const + { EnsureInfosInited(); return m_firstProperty; } + + // returns the first handler + wxHandlerInfo* GetFirstHandler() const + { EnsureInfosInited(); return m_firstHandler; } + + // Call the Create upon an instance of the class, in the end the object is fully + // initialized + virtual bool Create (wxObject *object, int ParamCount, wxAny *Params) const; + + // get number of parameters for constructor + virtual int GetCreateParamCount() const + { return m_constructorPropertiesCount; } + + // get n-th constructor parameter + virtual const wxChar* GetCreateParamName(int n) const + { return m_constructorProperties[n]; } + + // Runtime access to objects for simple properties (get/set) by property + // name and variant data + virtual void SetProperty (wxObject *object, const wxChar *propertyName, + const wxAny &value) const; + virtual wxAny GetProperty (wxObject *object, const wxChar *propertyName) const; + + // Runtime access to objects for collection properties by property name + virtual wxAnyList GetPropertyCollection(wxObject *object, + const wxChar *propertyName) const; + virtual void AddToPropertyCollection(wxObject *object, const wxChar *propertyName, + const wxAny& value) const; + + // we must be able to cast variants to wxObject pointers, templates seem + // not to be suitable + void CallOnAny( const wxAny &data, wxObjectFunctor* functor ) const; + + wxObject* AnyToObjectPtr( const wxAny &data) const; + + wxAny ObjectPtrToAny( wxObject *object ) const; + + // find property by name + virtual const wxPropertyInfo *FindPropertyInfo (const wxChar *PropertyName) const; + + // find handler by name + virtual const wxHandlerInfo *FindHandlerInfo (const wxChar *handlerName) const; + + // find property by name + virtual wxPropertyInfo *FindPropertyInfoInThisClass (const wxChar *PropertyName) const; + + // find handler by name + virtual wxHandlerInfo *FindHandlerInfoInThisClass (const wxChar *handlerName) const; + + // puts all the properties of this class and its superclasses in the map, + // as long as there is not yet an entry with the same name (overriding mechanism) + void GetProperties( wxPropertyInfoMap &map ) const; + +private: + const wxChar *m_className; + int m_objectSize; + wxObjectConstructorFn m_objectConstructor; + + // class info object live in a linked list: + // pointers to its head and the next element in it + + static wxClassInfo *sm_first; + wxClassInfo *m_next; + + static wxHashTable *sm_classTable; + + wxPropertyInfoFn m_firstPropertyFn; + wxHandlerInfoFn m_firstHandlerFn; + + +protected: + void EnsureInfosInited() const + { + if ( !m_firstInited) + { + if ( m_firstPropertyFn != NULL) + m_firstProperty = (*m_firstPropertyFn)(); + if ( m_firstHandlerFn != NULL) + m_firstHandler = (*m_firstHandlerFn)(); + m_firstInited = true; + } + } + mutable wxPropertyInfo* m_firstProperty; + mutable wxHandlerInfo* m_firstHandler; + +private: + mutable bool m_firstInited; + + const wxClassInfo** m_parents; + const wxChar* m_unitName; + + wxObjectAllocatorAndCreator* m_constructor; + const wxChar ** m_constructorProperties; + const int m_constructorPropertiesCount; + wxVariantToObjectPtrConverter m_variantOfPtrToObjectConverter; + wxVariantToObjectConverter m_variantToObjectConverter; + wxObjectToVariantConverter m_objectToVariantConverter; + wxObjectStreamingCallback m_streamingCallback; + + const wxPropertyAccessor *FindAccessor (const wxChar *propertyName) const; + +protected: + // registers the class + void Register(); + void Unregister(); + + DECLARE_NO_COPY_CLASS(wxClassInfo) +}; + +WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxString& name); + +// ---------------------------------------------------------------------------- +// wxDynamicClassInfo +// ---------------------------------------------------------------------------- + +// this object leads to having a pure runtime-instantiation + +class WXDLLIMPEXP_BASE wxDynamicClassInfo : public wxClassInfo +{ + friend class WXDLLIMPEXP_BASE wxDynamicObject; + +public: + wxDynamicClassInfo( const wxChar *_UnitName, const wxChar *_ClassName, + const wxClassInfo* superClass ); + virtual ~wxDynamicClassInfo(); + + // constructs a wxDynamicObject with an instance + virtual wxObject *AllocateObject() const; + + // Call the Create method for a class + virtual bool Create (wxObject *object, int ParamCount, wxAny *Params) const; + + // get number of parameters for constructor + virtual int GetCreateParamCount() const; + + // get i-th constructor parameter + virtual const wxChar* GetCreateParamName(int i) const; + + // Runtime access to objects by property name, and variant data + virtual void SetProperty (wxObject *object, const wxChar *PropertyName, + const wxAny &Value) const; + virtual wxAny GetProperty (wxObject *object, const wxChar *PropertyName) const; + + // adds a property to this class at runtime + void AddProperty( const wxChar *propertyName, const wxTypeInfo* typeInfo ); + + // removes an existing runtime-property + void RemoveProperty( const wxChar *propertyName ); + + // renames an existing runtime-property + void RenameProperty( const wxChar *oldPropertyName, const wxChar *newPropertyName ); + + // as a handler to this class at runtime + void AddHandler( const wxChar *handlerName, wxObjectEventFunction address, + const wxClassInfo* eventClassInfo ); + + // removes an existing runtime-handler + void RemoveHandler( const wxChar *handlerName ); + + // renames an existing runtime-handler + void RenameHandler( const wxChar *oldHandlerName, const wxChar *newHandlerName ); + +private: + struct wxDynamicClassInfoInternal; + wxDynamicClassInfoInternal* m_data; +}; + +// ---------------------------------------------------------------------------- +// wxDECLARE class macros +// ---------------------------------------------------------------------------- + +#define _DECLARE_DYNAMIC_CLASS(name) \ + public: \ + static wxClassInfo ms_classInfo; \ + static const wxClassInfo* ms_classParents[]; \ + static wxPropertyInfo* GetPropertiesStatic(); \ + static wxHandlerInfo* GetHandlersStatic(); \ + static wxClassInfo *GetClassInfoStatic() \ + { return &name::ms_classInfo; } \ + virtual wxClassInfo *GetClassInfo() const \ + { return &name::ms_classInfo; } + +#define wxDECLARE_DYNAMIC_CLASS(name) \ + static wxObjectAllocatorAndCreator* ms_constructor; \ + static const wxChar * ms_constructorProperties[]; \ + static const int ms_constructorPropertiesCount; \ + _DECLARE_DYNAMIC_CLASS(name) + +#define wxDECLARE_DYNAMIC_CLASS_NO_ASSIGN(name) \ + wxDECLARE_NO_ASSIGN_CLASS(name); \ + wxDECLARE_DYNAMIC_CLASS(name) + +#define wxDECLARE_DYNAMIC_CLASS_NO_COPY(name) \ + wxDECLARE_NO_COPY_CLASS(name); \ + wxDECLARE_DYNAMIC_CLASS(name) + +#define wxDECLARE_CLASS(name) \ + wxDECLARE_DYNAMIC_CLASS(name) + +#define wxDECLARE_ABSTRACT_CLASS(name) _DECLARE_DYNAMIC_CLASS(name) +#define wxCLASSINFO(name) (&name::ms_classInfo) + +#endif // wxUSE_EXTENDED_RTTI +#endif // _WX_XTIH__ diff --git a/wxmsw/include/wx-3.0/wx/xti2.h b/wxmsw/include/wx-3.0/wx/xti2.h new file mode 100644 index 00000000..16e5f212 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xti2.h @@ -0,0 +1,293 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/wxt2.h +// Purpose: runtime metadata information (extended class info) +// Author: Stefan Csomor +// Modified by: Francesco Montorsi +// Created: 27/07/03 +// Copyright: (c) 1997 Julian Smart +// (c) 2003 Stefan Csomor +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XTI2H__ +#define _WX_XTI2H__ + +// ---------------------------------------------------------------------------- +// second part of xti headers, is included from object.h +// ---------------------------------------------------------------------------- + +#if wxUSE_EXTENDED_RTTI + +// ---------------------------------------------------------------------------- +// wxDynamicObject class, its instances connect to a 'super class instance' +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxDynamicObject : public wxObject +{ + friend class WXDLLIMPEXP_FWD_BASE wxDynamicClassInfo ; +public: + // instantiates this object with an instance of its superclass + wxDynamicObject(wxObject* superClassInstance, const wxDynamicClassInfo *info) ; + virtual ~wxDynamicObject(); + + void SetProperty (const wxChar *propertyName, const wxAny &value); + wxAny GetProperty (const wxChar *propertyName) const ; + + // get the runtime identity of this object + wxClassInfo *GetClassInfo() const + { +#ifdef _MSC_VER + return (wxClassInfo*) m_classInfo; +#else + wxDynamicClassInfo *nonconst = const_cast(m_classInfo); + return static_cast(nonconst); +#endif + } + + wxObject* GetSuperClassInstance() const + { + return m_superClassInstance ; + } +private : + // removes an existing runtime-property + void RemoveProperty( const wxChar *propertyName ) ; + + // renames an existing runtime-property + void RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName ) ; + + wxObject *m_superClassInstance ; + const wxDynamicClassInfo *m_classInfo; + struct wxDynamicObjectInternal; + wxDynamicObjectInternal *m_data; +}; + +// ---------------------------------------------------------------------------- +// String conversion templates supporting older compilers +// ---------------------------------------------------------------------------- + +#if wxUSE_FUNC_TEMPLATE_POINTER +# define wxTO_STRING(type) wxToStringConverter +# define wxTO_STRING_IMP(type) +# define wxFROM_STRING(type) wxFromStringConverter +# define wxFROM_STRING_IMP(type) +#else +# define wxTO_STRING(type) ToString##type +# define wxTO_STRING_IMP(type) \ + inline void ToString##type( const wxAny& data, wxString &result ) \ +{ wxToStringConverter(data, result); } + +# define wxFROM_STRING(type) FromString##type +# define wxFROM_STRING_IMP(type) \ + inline void FromString##type( const wxString& data, wxAny &result ) \ +{ wxFromStringConverter(data, result); } +#endif + +#include "wx/xtiprop.h" +#include "wx/xtictor.h" + +// ---------------------------------------------------------------------------- +// wxIMPLEMENT class macros for concrete classes +// ---------------------------------------------------------------------------- + +// Single inheritance with one base class + +#define _DEFAULT_CONSTRUCTOR(name) \ +wxObject* wxConstructorFor##name() \ +{ return new name; } + +#define _DEFAULT_CONVERTERS(name) \ +wxObject* wxVariantOfPtrToObjectConverter##name ( const wxAny &data ) \ +{ return data.As( (name**)NULL ); } \ + wxAny wxObjectToVariantConverter##name ( wxObject *data ) \ +{ return wxAny( wx_dynamic_cast(name*, data) ); } + +#define _TYPEINFO_CLASSES(n, toString, fromString ) \ + wxClassTypeInfo s_typeInfo##n(wxT_OBJECT, &n::ms_classInfo, \ + toString, fromString, typeid(n).name()); \ + wxClassTypeInfo s_typeInfoPtr##n(wxT_OBJECT_PTR, &n::ms_classInfo, \ + toString, fromString, typeid(n*).name()); + +#define _IMPLEMENT_DYNAMIC_CLASS(name, basename, unit, callback) \ + _DEFAULT_CONSTRUCTOR(name) \ + _DEFAULT_CONVERTERS(name) \ + \ + const wxClassInfo* name::ms_classParents[] = \ +{ &basename::ms_classInfo, NULL }; \ + wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \ + wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name, \ + name::GetPropertiesStatic, name::GetHandlersStatic, name::ms_constructor, \ + name::ms_constructorProperties, name::ms_constructorPropertiesCount, \ + wxVariantOfPtrToObjectConverter##name, NULL, wxObjectToVariantConverter##name, \ + callback); + +#define _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY(name, basename, unit, callback ) \ + _DEFAULT_CONSTRUCTOR(name) \ + _DEFAULT_CONVERTERS(name) \ + void wxVariantToObjectConverter##name ( const wxAny &data, wxObjectFunctor* fn ) \ + { name o = wxANY_AS(data, name); (*fn)( &o ); } \ + \ + const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo,NULL }; \ + wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \ + wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name, \ + name::GetPropertiesStatic,name::GetHandlersStatic,name::ms_constructor, \ + name::ms_constructorProperties, name::ms_constructorPropertiesCount, \ + wxVariantOfPtrToObjectConverter##name, wxVariantToObjectConverter##name, \ + wxObjectToVariantConverter##name, callback); + +#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename ) \ + _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename, "", NULL ) \ + _TYPEINFO_CLASSES(name, NULL, NULL) \ + const wxPropertyInfo *name::GetPropertiesStatic() \ +{ return (wxPropertyInfo*) NULL; } \ + const wxHandlerInfo *name::GetHandlersStatic() \ +{ return (wxHandlerInfo*) NULL; } \ + wxCONSTRUCTOR_DUMMY( name ) + +#define wxIMPLEMENT_DYNAMIC_CLASS( name, basename ) \ + _IMPLEMENT_DYNAMIC_CLASS( name, basename, "", NULL ) \ + _TYPEINFO_CLASSES(name, NULL, NULL) \ + wxPropertyInfo *name::GetPropertiesStatic() \ +{ return (wxPropertyInfo*) NULL; } \ + wxHandlerInfo *name::GetHandlersStatic() \ +{ return (wxHandlerInfo*) NULL; } \ + wxCONSTRUCTOR_DUMMY( name ) + +#define wxIMPLEMENT_DYNAMIC_CLASS_XTI( name, basename, unit ) \ + _IMPLEMENT_DYNAMIC_CLASS( name, basename, unit, NULL ) \ + _TYPEINFO_CLASSES(name, NULL, NULL) + +#define wxIMPLEMENT_DYNAMIC_CLASS_XTI_CALLBACK( name, basename, unit, callback )\ + _IMPLEMENT_DYNAMIC_CLASS( name, basename, unit, &callback ) \ + _TYPEINFO_CLASSES(name, NULL, NULL) + +#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY_XTI( name, basename, unit ) \ + _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename, unit, NULL ) \ + _TYPEINFO_CLASSES(name, NULL, NULL) + +#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY_AND_STREAMERS_XTI( name, basename, \ + unit, toString, \ + fromString ) \ + _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename, unit, NULL ) \ + _TYPEINFO_CLASSES(name, toString, fromString) + +// this is for classes that do not derive from wxObject, there are no creators for these + +#define wxIMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_NO_BASE_XTI( name, unit ) \ + const wxClassInfo* name::ms_classParents[] = { NULL }; \ + wxClassInfo name::ms_classInfo(name::ms_classParents, wxEmptyString, \ + wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) 0, \ + name::GetPropertiesStatic,name::GetHandlersStatic, 0, 0, \ + 0, 0, 0 ); \ + _TYPEINFO_CLASSES(name, NULL, NULL) + +// this is for subclasses that still do not derive from wxObject + +#define wxIMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_XTI( name, basename, unit ) \ + const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo, NULL }; \ + wxClassInfo name::ms_classInfo(name::ms_classParents, wxEmptyString, \ + wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) 0, \ + name::GetPropertiesStatic,name::GetHandlersStatic, 0, 0, \ + 0, 0, 0 ); \ + _TYPEINFO_CLASSES(name, NULL, NULL) + + +// Multiple inheritance with two base classes + +#define _IMPLEMENT_DYNAMIC_CLASS2(name, basename, basename2, unit, callback) \ + _DEFAULT_CONSTRUCTOR(name) \ + _DEFAULT_CONVERTERS(name) \ + \ + const wxClassInfo* name::ms_classParents[] = \ +{ &basename::ms_classInfo,&basename2::ms_classInfo, NULL }; \ + wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \ + wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name, \ + name::GetPropertiesStatic,name::GetHandlersStatic,name::ms_constructor, \ + name::ms_constructorProperties, name::ms_constructorPropertiesCount, \ + wxVariantOfPtrToObjectConverter##name, NULL, wxObjectToVariantConverter##name, \ + callback); + +#define wxIMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2) \ + _IMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2, "", NULL) \ + _TYPEINFO_CLASSES(name, NULL, NULL) \ + wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL; } \ + wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL; } \ + wxCONSTRUCTOR_DUMMY( name ) + +#define wxIMPLEMENT_DYNAMIC_CLASS2_XTI( name, basename, basename2, unit) \ + _IMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2, unit, NULL) \ + _TYPEINFO_CLASSES(name, NULL, NULL) + + + +// ---------------------------------------------------------------------------- +// wxIMPLEMENT class macros for abstract classes +// ---------------------------------------------------------------------------- + +// Single inheritance with one base class + +#define _IMPLEMENT_ABSTRACT_CLASS(name, basename) \ + _DEFAULT_CONVERTERS(name) \ + \ + const wxClassInfo* name::ms_classParents[] = \ +{ &basename::ms_classInfo,NULL }; \ + wxClassInfo name::ms_classInfo(name::ms_classParents, wxEmptyString, \ + wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) 0, \ + name::GetPropertiesStatic,name::GetHandlersStatic, 0, 0, \ + 0, wxVariantOfPtrToObjectConverter##name,0, \ + wxObjectToVariantConverter##name); \ + _TYPEINFO_CLASSES(name, NULL, NULL) + +#define wxIMPLEMENT_ABSTRACT_CLASS( name, basename ) \ + _IMPLEMENT_ABSTRACT_CLASS( name, basename ) \ + wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL; } \ + wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL; } + +// Multiple inheritance with two base classes + +#define wxIMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \ + wxClassInfo name::ms_classInfo(wxT(#name), wxT(#basename1), \ + wxT(#basename2), (int) sizeof(name), \ + (wxObjectConstructorFn) 0); + +// templated streaming, every type that can be converted to wxString +// must have their specialization for these methods + +template +void wxStringReadValue( const wxString &s, T &data ); + +template +void wxStringWriteValue( wxString &s, const T &data); + +template +void wxToStringConverter( const wxAny &v, wxString &s ) +{ wxStringWriteValue(s, wxANY_AS(v, T)); } + +template +void wxFromStringConverter( const wxString &s, wxAny &v) +{ T d; wxStringReadValue(s, d); v = wxAny(d); } + +// -------------------------------------------------------------------------- +// Collection Support +// -------------------------------------------------------------------------- + +template void wxListCollectionToAnyList( + const collection_t& coll, wxAnyList &value ) +{ + for ( iter current = coll.GetFirst(); current; + current = current->GetNext() ) + { + value.Append( new wxAny(current->GetData()) ); + } +} + +template void wxArrayCollectionToVariantArray( + const collection_t& coll, wxAnyList &value ) +{ + for( size_t i = 0; i < coll.GetCount(); i++ ) + { + value.Append( new wxAny(coll[i]) ); + } +} + +#endif + +#endif // _WX_XTIH2__ diff --git a/wxmsw/include/wx-3.0/wx/xtictor.h b/wxmsw/include/wx-3.0/wx/xtictor.h new file mode 100644 index 00000000..6969463f --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xtictor.h @@ -0,0 +1,509 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xtictor.h +// Purpose: XTI constructors +// Author: Stefan Csomor +// Modified by: Francesco Montorsi +// Created: 27/07/03 +// Copyright: (c) 1997 Julian Smart +// (c) 2003 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _XTICTOR_H_ +#define _XTICTOR_H_ + +#include "wx/defs.h" + +#if wxUSE_EXTENDED_RTTI + +#include "wx/xti.h" + +// ---------------------------------------------------------------------------- +// Constructor Bridges +// ---------------------------------------------------------------------------- + +// A constructor bridge allows to call a ctor with an arbitrary number +// or parameters during runtime +class WXDLLIMPEXP_BASE wxObjectAllocatorAndCreator +{ +public: + virtual ~wxObjectAllocatorAndCreator() { } + virtual bool Create(wxObject * &o, wxAny *args) = 0; +}; + +// a direct constructor bridge calls the operator new for this class and +// passes all params to the constructor. Needed for classes that cannot be +// instantiated using alloc-create semantics +class WXDLLIMPEXP_BASE wxObjectAllocator : public wxObjectAllocatorAndCreator +{ +public: + virtual bool Create(wxObject * &o, wxAny *args) = 0; +}; + + +// ---------------------------------------------------------------------------- +// Constructor Bridges for all Numbers of Params +// ---------------------------------------------------------------------------- + +// no params + +template +struct wxObjectAllocatorAndCreator_0 : public wxObjectAllocatorAndCreator +{ + bool Create(wxObject * &o, wxAny *) + { + Class *obj = wx_dynamic_cast(Class*, o); + return obj->Create(); + } +}; + +struct wxObjectAllocatorAndCreator_Dummy : public wxObjectAllocatorAndCreator +{ + bool Create(wxObject *&, wxAny *) + { + return true; + } +}; + +#define wxCONSTRUCTOR_0(klass) \ + wxObjectAllocatorAndCreator_0 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = { NULL }; \ + const int klass::ms_constructorPropertiesCount = 0; + +#define wxCONSTRUCTOR_DUMMY(klass) \ + wxObjectAllocatorAndCreator_Dummy constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = { NULL }; \ + const int klass::ms_constructorPropertiesCount = 0; + +// direct constructor version + +template +struct wxDirectConstructorBridge_0 : public wxObjectAllocator +{ + bool Create(wxObject * &o, wxAny *args) + { + o = new Class( ); + return o != NULL; + } +}; + +#define wxDIRECT_CONSTRUCTOR_0(klass) \ + wxDirectConstructorBridge_0 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = { NULL }; \ + const int klass::ms_constructorPropertiesCount = 0; + + +// 1 param + +template +struct wxObjectAllocatorAndCreator_1 : public wxObjectAllocatorAndCreator +{ + bool Create(wxObject * &o, wxAny *args) + { + Class *obj = wx_dynamic_cast(Class*, o); + return obj->Create( + (args[0]).As(static_cast(NULL)) + ); + } +}; + +#define wxCONSTRUCTOR_1(klass,t0,v0) \ + wxObjectAllocatorAndCreator_1 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) }; \ + const int klass::ms_constructorPropertiesCount = 1; + +// direct constructor version + +template +struct wxDirectConstructorBridge_1 : public wxObjectAllocator +{ + bool Create(wxObject * &o, wxAny *args) + { + o = new Class( + (args[0]).As(static_cast(NULL)) + ); + return o != NULL; + } +}; + +#define wxDIRECT_CONSTRUCTOR_1(klass,t0,v0) \ + wxDirectConstructorBridge_1 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) }; \ + const int klass::ms_constructorPropertiesCount = 1; + + +// 2 params + +template +struct wxObjectAllocatorAndCreator_2 : public wxObjectAllocatorAndCreator +{ + bool Create(wxObject * &o, wxAny *args) + { + Class *obj = wx_dynamic_cast(Class*, o); + return obj->Create( + (args[0]).As(static_cast(NULL)), + (args[1]).As(static_cast(NULL)) + ); + } +}; + +#define wxCONSTRUCTOR_2(klass,t0,v0,t1,v1) \ + wxObjectAllocatorAndCreator_2 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0), wxT(#v1) }; \ + const int klass::ms_constructorPropertiesCount = 2; + +// direct constructor version + +template +struct wxDirectConstructorBridge_2 : public wxObjectAllocator +{ + bool Create(wxObject * &o, wxAny *args) + { + o = new Class( + (args[0]).As(static_cast(NULL)), + (args[1]).As(static_cast(NULL)) + ); + return o != NULL; + } +}; + +#define wxDIRECT_CONSTRUCTOR_2(klass,t0,v0,t1,v1) \ + wxDirectConstructorBridge_2 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0), wxT(#v1) }; \ + const int klass::ms_constructorPropertiesCount = 2; + + +// 3 params + +template +struct wxObjectAllocatorAndCreator_3 : public wxObjectAllocatorAndCreator +{ + bool Create(wxObject * &o, wxAny *args) + { + Class *obj = wx_dynamic_cast(Class*, o); + return obj->Create( + (args[0]).As(static_cast(NULL)), + (args[1]).As(static_cast(NULL)), + (args[2]).As(static_cast(NULL)) + ); + } +}; + +#define wxCONSTRUCTOR_3(klass,t0,v0,t1,v1,t2,v2) \ + wxObjectAllocatorAndCreator_3 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0), wxT(#v1), wxT(#v2) }; \ + const int klass::ms_constructorPropertiesCount = 3; + +// direct constructor version + +template +struct wxDirectConstructorBridge_3 : public wxObjectAllocator +{ + bool Create(wxObject * &o, wxAny *args) + { + o = new Class( + (args[0]).As(static_cast(NULL)), + (args[1]).As(static_cast(NULL)), + (args[2]).As(static_cast(NULL)) + ); + return o != NULL; + } +}; + +#define wxDIRECT_CONSTRUCTOR_3(klass,t0,v0,t1,v1,t2,v2) \ + wxDirectConstructorBridge_3 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0), wxT(#v1), wxT(#v2) }; \ + const int klass::ms_constructorPropertiesCount = 3; + + +// 4 params + +template +struct wxObjectAllocatorAndCreator_4 : public wxObjectAllocatorAndCreator +{ + bool Create(wxObject * &o, wxAny *args) + { + Class *obj = wx_dynamic_cast(Class*, o); + return obj->Create( + (args[0]).As(static_cast(NULL)), + (args[1]).As(static_cast(NULL)), + (args[2]).As(static_cast(NULL)), + (args[3]).As(static_cast(NULL)) + ); + } +}; + +#define wxCONSTRUCTOR_4(klass,t0,v0,t1,v1,t2,v2,t3,v3) \ + wxObjectAllocatorAndCreator_4 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = \ + { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3) }; \ + const int klass::ms_constructorPropertiesCount = 4; + +// direct constructor version + +template +struct wxDirectConstructorBridge_4 : public wxObjectAllocator +{ + bool Create(wxObject * &o, wxAny *args) + { + o = new Class( + (args[0]).As(static_cast(NULL)), + (args[1]).As(static_cast(NULL)), + (args[2]).As(static_cast(NULL)), + (args[3]).As(static_cast(NULL)) + ); + return o != NULL; + } +}; + +#define wxDIRECT_CONSTRUCTOR_4(klass,t0,v0,t1,v1,t2,v2,t3,v3) \ + wxDirectConstructorBridge_4 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = \ + { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3) }; \ + const int klass::ms_constructorPropertiesCount = 4; + + +// 5 params + +template +struct wxObjectAllocatorAndCreator_5 : public wxObjectAllocatorAndCreator +{ + bool Create(wxObject * &o, wxAny *args) + { + Class *obj = wx_dynamic_cast(Class*, o); + return obj->Create( + (args[0]).As(static_cast(NULL)), + (args[1]).As(static_cast(NULL)), + (args[2]).As(static_cast(NULL)), + (args[3]).As(static_cast(NULL)), + (args[4]).As(static_cast(NULL)) + ); + } +}; + +#define wxCONSTRUCTOR_5(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4) \ + wxObjectAllocatorAndCreator_5 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = \ + { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3), wxT(#v4) }; \ + const int klass::ms_constructorPropertiesCount = 5; + +// direct constructor version + +template +struct wxDirectConstructorBridge_5 : public wxObjectAllocator +{ + bool Create(wxObject * &o, wxAny *args) + { + o = new Class( + (args[0]).As(static_cast(NULL)), + (args[1]).As(static_cast(NULL)), + (args[2]).As(static_cast(NULL)), + (args[3]).As(static_cast(NULL)), + (args[4]).As(static_cast(NULL)) + ); + return o != NULL; + } +}; + +#define wxDIRECT_CONSTRUCTOR_5(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4) \ + wxDirectConstructorBridge_5 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = \ + { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3), wxT(#v4) }; \ + const int klass::ms_constructorPropertiesCount = 5; + + +// 6 params + +template +struct wxObjectAllocatorAndCreator_6 : public wxObjectAllocatorAndCreator +{ + bool Create(wxObject * &o, wxAny *args) + { + Class *obj = wx_dynamic_cast(Class*, o); + return obj->Create( + (args[0]).As(static_cast(NULL)), + (args[1]).As(static_cast(NULL)), + (args[2]).As(static_cast(NULL)), + (args[3]).As(static_cast(NULL)), + (args[4]).As(static_cast(NULL)), + (args[5]).As(static_cast(NULL)) + ); + } +}; + +#define wxCONSTRUCTOR_6(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5) \ + wxObjectAllocatorAndCreator_6 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = \ + { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3), wxT(#v4), wxT(#v5) }; \ + const int klass::ms_constructorPropertiesCount = 6; + +// direct constructor version + +template +struct wxDirectConstructorBridge_6 : public wxObjectAllocator +{ + bool Create(wxObject * &o, wxAny *args) + { + o = new Class( + (args[0]).As(static_cast(NULL)), + (args[1]).As(static_cast(NULL)), + (args[2]).As(static_cast(NULL)), + (args[3]).As(static_cast(NULL)), + (args[4]).As(static_cast(NULL)), + (args[5]).As(static_cast(NULL)) + ); + return o != NULL; + } +}; + +#define wxDIRECT_CONSTRUCTOR_6(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5) \ + wxDirectConstructorBridge_6 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0), wxT(#v1), \ + wxT(#v2), wxT(#v3), wxT(#v4), wxT(#v5) }; \ + const int klass::ms_constructorPropertiesCount = 6; + + +// 7 params + +template +struct wxObjectAllocatorAndCreator_7 : public wxObjectAllocatorAndCreator +{ + bool Create(wxObject * &o, wxAny *args) + { + Class *obj = wx_dynamic_cast(Class*, o); + return obj->Create( + (args[0]).As(static_cast(NULL)), + (args[1]).As(static_cast(NULL)), + (args[2]).As(static_cast(NULL)), + (args[3]).As(static_cast(NULL)), + (args[4]).As(static_cast(NULL)), + (args[5]).As(static_cast(NULL)), + (args[6]).As(static_cast(NULL)) + ); + } +}; + +#define wxCONSTRUCTOR_7(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6) \ + wxObjectAllocatorAndCreator_7 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0), wxT(#v1), \ + wxT(#v2), wxT(#v3), wxT(#v4), wxT(#v5), wxT(#v6) }; \ + const int klass::ms_constructorPropertiesCount = 7; + +// direct constructor version + +template +struct wxDirectConstructorBridge_7 : public wxObjectAllocator +{ + bool Create(wxObject * &o, wxAny *args) + { + o = new Class( + (args[0]).As(static_cast(NULL)), + (args[1]).As(static_cast(NULL)), + (args[2]).As(static_cast(NULL)), + (args[3]).As(static_cast(NULL)), + (args[4]).As(static_cast(NULL)), + (args[5]).As(static_cast(NULL)), + (args[6]).As(static_cast(NULL)) + ); + return o != NULL; + } +}; + +#define wxDIRECT_CONSTRUCTOR_7(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6) \ + wxDirectConstructorBridge_7 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = \ + { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3), wxT(#v4), wxT(#v5), wxT(#v6) }; \ + const int klass::ms_constructorPropertiesCount = 7; + + +// 8 params + +template +struct wxObjectAllocatorAndCreator_8 : public wxObjectAllocatorAndCreator +{ + bool Create(wxObject * &o, wxAny *args) + { + Class *obj = wx_dynamic_cast(Class*, o); + return obj->Create( + (args[0]).As(static_cast(NULL)), + (args[1]).As(static_cast(NULL)), + (args[2]).As(static_cast(NULL)), + (args[3]).As(static_cast(NULL)), + (args[4]).As(static_cast(NULL)), + (args[5]).As(static_cast(NULL)), + (args[6]).As(static_cast(NULL)), + (args[7]).As(static_cast(NULL)) + ); + } +}; + +#define wxCONSTRUCTOR_8(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6,t7,v7) \ + wxObjectAllocatorAndCreator_8 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = \ + { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3), wxT(#v4), wxT(#v5), wxT(#v6), wxT(#v7) }; \ + const int klass::ms_constructorPropertiesCount = 8; + +// direct constructor version + +template +struct wxDirectConstructorBridge_8 : public wxObjectAllocator +{ + bool Create(wxObject * &o, wxAny *args) + { + o = new Class( + (args[0]).As(static_cast(NULL)), + (args[1]).As(static_cast(NULL)), + (args[2]).As(static_cast(NULL)), + (args[3]).As(static_cast(NULL)), + (args[4]).As(static_cast(NULL)), + (args[5]).As(static_cast(NULL)), + (args[6]).As(static_cast(NULL)), + (args[7]).As(static_cast(NULL)) + ); + return o != NULL; + } +}; + +#define wxDIRECT_CONSTRUCTOR_8(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6,t7,v7) \ + wxDirectConstructorBridge_8 constructor##klass; \ + wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \ + const wxChar *klass::ms_constructorProperties[] = \ + { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3), wxT(#v4), wxT(#v5), wxT(#v6), wxT(#v7) }; \ + const int klass::ms_constructorPropertiesCount = 8; + +#endif // wxUSE_EXTENDED_RTTI +#endif // _XTICTOR_H_ diff --git a/wxmsw/include/wx-3.0/wx/xtihandler.h b/wxmsw/include/wx-3.0/wx/xtihandler.h new file mode 100644 index 00000000..c63ddb3a --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xtihandler.h @@ -0,0 +1,112 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xtihandler.h +// Purpose: XTI handlers +// Author: Stefan Csomor +// Modified by: Francesco Montorsi +// Created: 27/07/03 +// Copyright: (c) 1997 Julian Smart +// (c) 2003 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _XTIHANDLER_H_ +#define _XTIHANDLER_H_ + +#include "wx/defs.h" + +#if wxUSE_EXTENDED_RTTI + +#include "wx/xti.h" + +// copied from event.h which cannot be included at this place + +class WXDLLIMPEXP_FWD_BASE wxEvent; + +#ifdef __VISUALC__ +#define wxMSVC_FWD_MULTIPLE_BASES __multiple_inheritance +#else +#define wxMSVC_FWD_MULTIPLE_BASES +#endif + +class WXDLLIMPEXP_FWD_BASE wxMSVC_FWD_MULTIPLE_BASES wxEvtHandler; +typedef void (wxEvtHandler::*wxEventFunction)(wxEvent&); +typedef wxEventFunction wxObjectEventFunction; + +// ---------------------------------------------------------------------------- +// Handler Info +// +// this describes an event sink +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxHandlerInfo +{ + friend class WXDLLIMPEXP_BASE wxDynamicClassInfo; + +public: + wxHandlerInfo(wxHandlerInfo* &iter, + wxClassInfo* itsClass, + const wxString& name, + wxObjectEventFunction address, + const wxClassInfo* eventClassInfo) : + m_eventFunction(address), + m_name(name), + m_eventClassInfo(eventClassInfo), + m_itsClass(itsClass) + { + Insert(iter); + } + + ~wxHandlerInfo() + { Remove(); } + + // return the name of this handler + const wxString& GetName() const { return m_name; } + + // return the class info of the event + const wxClassInfo *GetEventClassInfo() const { return m_eventClassInfo; } + + // get the handler function pointer + wxObjectEventFunction GetEventFunction() const { return m_eventFunction; } + + // returns NULL if this is the last handler of this class + wxHandlerInfo* GetNext() const { return m_next; } + + // return the class this property is declared in + const wxClassInfo* GetDeclaringClass() const { return m_itsClass; } + +private: + + // inserts this handler at the end of the linked chain which begins + // with "iter" handler. + void Insert(wxHandlerInfo* &iter); + + // removes this handler from the linked chain of the m_itsClass handlers. + void Remove(); + + wxObjectEventFunction m_eventFunction; + wxString m_name; + const wxClassInfo* m_eventClassInfo; + wxHandlerInfo* m_next; + wxClassInfo* m_itsClass; +}; + +#define wxHANDLER(name,eventClassType) \ + static wxHandlerInfo _handlerInfo##name( first, class_t::GetClassInfoStatic(), \ + wxT(#name), (wxObjectEventFunction) (wxEventFunction) &name, \ + wxCLASSINFO( eventClassType ) ); + +#define wxBEGIN_HANDLERS_TABLE(theClass) \ + wxHandlerInfo *theClass::GetHandlersStatic() \ + { \ + typedef theClass class_t; \ + static wxHandlerInfo* first = NULL; + +#define wxEND_HANDLERS_TABLE() \ + return first; } + +#define wxEMPTY_HANDLERS_TABLE(theClass) \ + wxBEGIN_HANDLERS_TABLE(theClass) \ + wxEND_HANDLERS_TABLE() + +#endif // wxUSE_EXTENDED_RTTI +#endif // _XTIHANDLER_H_ diff --git a/wxmsw/include/wx-3.0/wx/xtiprop.h b/wxmsw/include/wx-3.0/wx/xtiprop.h new file mode 100644 index 00000000..18626f29 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xtiprop.h @@ -0,0 +1,560 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xtiprop.h +// Purpose: XTI properties +// Author: Stefan Csomor +// Modified by: Francesco Montorsi +// Created: 27/07/03 +// Copyright: (c) 1997 Julian Smart +// (c) 2003 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _XTIPROP_H_ +#define _XTIPROP_H_ + +#include "wx/defs.h" + +#if wxUSE_EXTENDED_RTTI + +#include "wx/xti.h" +#include "wx/any.h" + +/* +class WXDLLIMPEXP_BASE wxObject; +class WXDLLIMPEXP_BASE wxClassInfo; +class WXDLLIMPEXP_BASE wxDynamicClassInfo; +*/ +class WXDLLIMPEXP_BASE wxHashTable; +class WXDLLIMPEXP_BASE wxHashTable_Node; +class WXDLLIMPEXP_BASE wxEvent; +class WXDLLIMPEXP_BASE wxEvtHandler; + +// ---------------------------------------------------------------------------- +// Property Accessors +// +// wxPropertySetter/Getter/CollectionGetter/CollectionAdder are all property +// accessors which are managed by wxPropertyAccessor class which in turn is +// handled by wxPropertyInfo. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxPropertySetter +{ +public: + wxPropertySetter( const wxString name ) { m_name = name; } + virtual ~wxPropertySetter() {} + + virtual void Set( wxObject *object, const wxAny &variantValue ) const = 0; + const wxString& GetName() const { return m_name; } + +private: + wxString m_name; +}; + +class WXDLLIMPEXP_BASE wxPropertyGetter +{ +public: + wxPropertyGetter( const wxString name ) { m_name = name; } + virtual ~wxPropertyGetter() {} + + virtual void Get( const wxObject *object, wxAny& result) const = 0; + const wxString& GetName() const { return m_name; } + +private: + wxString m_name; +}; + +class WXDLLIMPEXP_BASE wxPropertyCollectionGetter +{ +public: + wxPropertyCollectionGetter( const wxString name ) { m_name = name; } + virtual ~wxPropertyCollectionGetter() {} + + virtual void Get( const wxObject *object, wxAnyList& result) const = 0; + const wxString& GetName() const { return m_name; } + +private: + wxString m_name; +}; + +template void WXDLLIMPEXP_BASE \ + wxCollectionToVariantArray( const coll_t& coll, wxAnyList& result ); + +class WXDLLIMPEXP_BASE wxPropertyCollectionAdder +{ +public: + wxPropertyCollectionAdder( const wxString name ) { m_name = name; } + virtual ~wxPropertyCollectionAdder() {} + + virtual void Add( wxObject *object, const wxAny &variantValue ) const= 0; + const wxString& GetName() const { return m_name; } + +private: + wxString m_name; +}; + +#define wxPROPERTY_SETTER( property, Klass, valueType, setterMethod ) \ +class wxPropertySetter##property : public wxPropertySetter \ +{ \ +public: \ + wxINFUNC_CLASS_TYPE_FIX(Klass) \ + wxPropertySetter##property() : wxPropertySetter( wxT(#setterMethod) ) {} \ + virtual ~wxPropertySetter##property() {} \ + \ + void Set( wxObject *object, const wxAny &variantValue ) const \ + { \ + Klass *obj = dynamic_cast(object); \ + valueType tempobj; \ + if ( variantValue.GetAs(&tempobj) ) \ + obj->setterMethod(tempobj); \ + else \ + obj->setterMethod(*wxANY_AS(variantValue, valueType*)); \ + } \ +}; + +#define wxPROPERTY_GETTER( property, Klass, valueType, gettermethod ) \ +class wxPropertyGetter##property : public wxPropertyGetter \ +{ \ +public: \ + wxINFUNC_CLASS_TYPE_FIX(Klass) \ + wxPropertyGetter##property() : wxPropertyGetter( wxT(#gettermethod) ) {} \ + virtual ~wxPropertyGetter##property() {} \ + \ + void Get( const wxObject *object, wxAny &result) const \ + { \ + const Klass *obj = dynamic_cast(object); \ + result = wxAny( obj->gettermethod() ); \ + } \ +}; + +#define wxPROPERTY_COLLECTION_ADDER( property, Klass, valueType, addermethod ) \ +class wxPropertyCollectionAdder##property : public wxPropertyCollectionAdder \ +{ \ +public: \ + wxINFUNC_CLASS_TYPE_FIX(Klass) \ + wxPropertyCollectionAdder##property() : wxPropertyCollectionAdder( wxT(#addermethod) ) {} \ + virtual ~wxPropertyCollectionAdder##property() {} \ + \ + void Add( wxObject *object, const wxAny &variantValue ) const \ + { \ + Klass *obj = dynamic_cast(object); \ + valueType tempobj; \ + if ( variantValue.GetAs(&tempobj) ) \ + obj->addermethod(tempobj); \ + else \ + obj->addermethod(*wxANY_AS(variantValue, valueType*)); \ + } \ +}; + +#define wxPROPERTY_COLLECTION_GETTER( property, Klass, valueType, gettermethod ) \ +class wxPropertyCollectionGetter##property : public wxPropertyCollectionGetter \ +{ \ +public: \ + wxINFUNC_CLASS_TYPE_FIX(Klass) \ + wxPropertyCollectionGetter##property() : wxPropertyCollectionGetter( wxT(#gettermethod) ) {} \ + virtual ~wxPropertyCollectionGetter##property() {} \ + \ + void Get( const wxObject *object, wxAnyList &result) const \ + { \ + const Klass *obj = dynamic_cast(object); \ + wxCollectionToVariantArray( obj->gettermethod(), result ); \ + } \ +}; + +class WXDLLIMPEXP_BASE wxPropertyAccessor +{ +public: + wxPropertyAccessor( wxPropertySetter *setter, wxPropertyGetter *getter, + wxPropertyCollectionAdder *adder, wxPropertyCollectionGetter *collectionGetter ) + { m_setter = setter; m_getter = getter; m_adder = adder; + m_collectionGetter = collectionGetter; } + + virtual ~wxPropertyAccessor() {} + + // Setting a simple property (non-collection) + virtual void SetProperty(wxObject *object, const wxAny &value) const + { + if ( m_setter ) + m_setter->Set( object, value ); + else + wxLogError( wxGetTranslation("SetProperty called w/o valid setter") ); + } + + // Getting a simple property (non-collection) + virtual void GetProperty(const wxObject *object, wxAny &result) const + { + if ( m_getter ) + m_getter->Get( object, result ); + else + wxLogError( wxGetTranslation("GetProperty called w/o valid getter") ); + } + + // Adding an element to a collection property + virtual void AddToPropertyCollection(wxObject *object, const wxAny &value) const + { + if ( m_adder ) + m_adder->Add( object, value ); + else + wxLogError( wxGetTranslation("AddToPropertyCollection called w/o valid adder") ); + } + + // Getting a collection property + virtual void GetPropertyCollection( const wxObject *obj, wxAnyList &result) const + { + if ( m_collectionGetter ) + m_collectionGetter->Get( obj, result); + else + wxLogError( wxGetTranslation("GetPropertyCollection called w/o valid collection getter") ); + } + + virtual bool HasSetter() const { return m_setter != NULL; } + virtual bool HasCollectionGetter() const { return m_collectionGetter != NULL; } + virtual bool HasGetter() const { return m_getter != NULL; } + virtual bool HasAdder() const { return m_adder != NULL; } + + virtual const wxString& GetCollectionGetterName() const + { return m_collectionGetter->GetName(); } + virtual const wxString& GetGetterName() const + { return m_getter->GetName(); } + virtual const wxString& GetSetterName() const + { return m_setter->GetName(); } + virtual const wxString& GetAdderName() const + { return m_adder->GetName(); } + +protected: + wxPropertySetter *m_setter; + wxPropertyCollectionAdder *m_adder; + wxPropertyGetter *m_getter; + wxPropertyCollectionGetter* m_collectionGetter; +}; + +class WXDLLIMPEXP_BASE wxGenericPropertyAccessor : public wxPropertyAccessor +{ +public: + wxGenericPropertyAccessor( const wxString &propName ); + virtual ~wxGenericPropertyAccessor(); + + void RenameProperty( const wxString& WXUNUSED_UNLESS_DEBUG(oldName), + const wxString& newName ) + { + wxASSERT( oldName == m_propertyName ); m_propertyName = newName; + } + + virtual bool HasSetter() const { return true; } + virtual bool HasGetter() const { return true; } + virtual bool HasAdder() const { return false; } + virtual bool HasCollectionGetter() const { return false; } + + virtual const wxString& GetGetterName() const + { return m_getterName; } + virtual const wxString& GetSetterName() const + { return m_setterName; } + + virtual void SetProperty(wxObject *object, const wxAny &value) const; + virtual void GetProperty(const wxObject *object, wxAny &value) const; + + // Adding an element to a collection property + virtual void AddToPropertyCollection(wxObject *WXUNUSED(object), + const wxAny &WXUNUSED(value)) const + { + wxLogError( wxGetTranslation("AddToPropertyCollection called on a generic accessor") ); + } + + // Getting a collection property + virtual void GetPropertyCollection( const wxObject *WXUNUSED(obj), + wxAnyList &WXUNUSED(result)) const + { + wxLogError ( wxGetTranslation("GetPropertyCollection called on a generic accessor") ); + } + +private: + struct wxGenericPropertyAccessorInternal; + wxGenericPropertyAccessorInternal* m_data; + wxString m_propertyName; + wxString m_setterName; + wxString m_getterName; +}; + +typedef long wxPropertyInfoFlags; +enum +{ + // will be removed in future releases + wxPROP_DEPRECATED = 0x00000001, + + // object graph property, will be streamed with priority (after constructor properties) + wxPROP_OBJECT_GRAPH = 0x00000002, + + // this will only be streamed out and in as enum/set, the internal representation + // is still a long + wxPROP_ENUM_STORE_LONG = 0x00000004, + + // don't stream out this property, needed eg to avoid streaming out children + // that are always created by their parents + wxPROP_DONT_STREAM = 0x00000008 +}; + + +// ---------------------------------------------------------------------------- +// Property Support +// +// wxPropertyInfo is used to inquire of the property by name. It doesn't +// provide access to the property, only information about it. If you +// want access, look at wxPropertyAccessor. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxPropertyInfo +{ + friend class /* WXDLLIMPEXP_BASE */ wxDynamicClassInfo; + +public: + wxPropertyInfo(wxPropertyInfo* &iter, + wxClassInfo* itsClass, + const wxString& name, + const wxString& typeName, + wxPropertyAccessor *accessor, + wxAny dv, + wxPropertyInfoFlags flags = 0, + const wxString& helpString = wxEmptyString, + const wxString& groupString = wxEmptyString) : + m_itsClass(itsClass), + m_name(name), + m_typeInfo(NULL), + m_typeName(typeName), + m_collectionElementTypeInfo(NULL), + m_accessor(accessor), + m_defaultValue(dv), + m_flags(flags), + m_helpString(helpString), + m_groupString(groupString) + { + Insert(iter); + } + + wxPropertyInfo(wxPropertyInfo* &iter, + wxClassInfo* itsClass, + const wxString& name, + wxEventSourceTypeInfo* type, + wxPropertyAccessor *accessor, + wxAny dv, + wxPropertyInfoFlags flags = 0, + const wxString& helpString = wxEmptyString, + const wxString& groupString = wxEmptyString) : + m_itsClass(itsClass), + m_name(name), + m_typeInfo(type), + m_collectionElementTypeInfo(NULL), + m_accessor(accessor), + m_defaultValue(dv), + m_flags(flags), + m_helpString(helpString), + m_groupString(groupString) + { + Insert(iter); + } + + wxPropertyInfo(wxPropertyInfo* &iter, + wxClassInfo* itsClass, const wxString& name, + const wxString& collectionTypeName, + const wxString& elementTypeName, + wxPropertyAccessor *accessor, + wxPropertyInfoFlags flags = 0, + const wxString& helpString = wxEmptyString, + const wxString& groupString = wxEmptyString) : + m_itsClass(itsClass), + m_name(name), + m_typeInfo(NULL), + m_typeName(collectionTypeName), + m_collectionElementTypeInfo(NULL), + m_collectionElementTypeName(elementTypeName), + m_accessor(accessor), + m_flags(flags), + m_helpString(helpString), + m_groupString(groupString) + { + Insert(iter); + } + + ~wxPropertyInfo() + { Remove(); } + + // return the class this property is declared in + const wxClassInfo* GetDeclaringClass() const { return m_itsClass; } + + // return the name of this property + const wxString& GetName() const { return m_name; } + + // returns the flags of this property + wxPropertyInfoFlags GetFlags() const { return m_flags; } + + // returns the short help string of this property + const wxString& GetHelpString() const { return m_helpString; } + + // returns the group string of this property + const wxString& GetGroupString() const { return m_groupString; } + + // return the element type info of this property (for collections, otherwise NULL) + const wxTypeInfo * GetCollectionElementTypeInfo() const + { + if ( m_collectionElementTypeInfo == NULL ) + m_collectionElementTypeInfo = wxTypeInfo::FindType(m_collectionElementTypeName); + return m_collectionElementTypeInfo; + } + + // return the type info of this property + const wxTypeInfo * GetTypeInfo() const + { + if ( m_typeInfo == NULL ) + m_typeInfo = wxTypeInfo::FindType(m_typeName); + return m_typeInfo; + } + + // return the accessor for this property + wxPropertyAccessor* GetAccessor() const { return m_accessor; } + + // returns NULL if this is the last property of this class + wxPropertyInfo* GetNext() const { return m_next; } + + // returns the default value of this property, its kind may be wxT_VOID if it is not valid + wxAny GetDefaultValue() const { return m_defaultValue; } + +private: + + // inserts this property at the end of the linked chain which begins + // with "iter" property. + void Insert(wxPropertyInfo* &iter); + + // removes this property from the linked chain of the m_itsClass properties. + void Remove(); + + wxClassInfo* m_itsClass; + wxString m_name; + mutable wxTypeInfo* m_typeInfo; + wxString m_typeName; + mutable wxTypeInfo* m_collectionElementTypeInfo; + wxString m_collectionElementTypeName; + wxPropertyAccessor* m_accessor; + wxAny m_defaultValue; + wxPropertyInfoFlags m_flags; + wxString m_helpString; + wxString m_groupString; + wxPropertyInfo* m_next; + + // FIXME: what's this comment about?? + // string representation of the default value + // to be assigned by the designer to the property + // when the component is dropped on the container. +}; + +// stl is giving problems when forwarding declarations, therefore we define it as a subclass + +WX_DECLARE_STRING_HASH_MAP_WITH_DECL( wxPropertyInfo*, wxPropertyInfoMapBase, + class WXDLLIMPEXP_BASE ); + +class WXDLLIMPEXP_BASE wxPropertyInfoMap : public wxPropertyInfoMapBase { +}; + +WX_DECLARE_STRING_HASH_MAP_WITH_DECL( wxAny, wxStringToAnyHashMapBase, + class WXDLLIMPEXP_BASE ); + +class WXDLLIMPEXP_FWD_BASE wxStringToAnyHashMap : public wxStringToAnyHashMapBase { +}; + +#define wxBEGIN_PROPERTIES_TABLE(theClass) \ + wxPropertyInfo *theClass::GetPropertiesStatic() \ + { \ + typedef theClass class_t; \ + static wxPropertyInfo* first = NULL; + +#define wxEND_PROPERTIES_TABLE() \ + return first; } + +#define wxHIDE_PROPERTY( pname ) \ + static wxPropertyInfo _propertyInfo##pname( first, class_t::GetClassInfoStatic(), \ + wxT(#pname), typeid(void).name(), NULL, wxAny(), wxPROP_DONT_STREAM, \ + wxEmptyString, wxEmptyString ); + +#define wxPROPERTY( pname, type, setter, getter, defaultValue, flags, help, group) \ + wxPROPERTY_SETTER( pname, class_t, type, setter ) \ + static wxPropertySetter##pname _setter##pname; \ + wxPROPERTY_GETTER( pname, class_t, type, getter ) \ + static wxPropertyGetter##pname _getter##pname; \ + static wxPropertyAccessor _accessor##pname( &_setter##pname, \ + &_getter##pname, NULL, NULL ); \ + static wxPropertyInfo _propertyInfo##pname( first, class_t::GetClassInfoStatic(), \ + wxT(#pname), typeid(type).name(), &_accessor##pname, \ + wxAny(defaultValue), flags, group, help ); + +#define wxPROPERTY_FLAGS( pname, flags, type, setter, getter,defaultValue, \ + pflags, help, group) \ + wxPROPERTY_SETTER( pname, class_t, type, setter ) \ + static wxPropertySetter##pname _setter##pname; \ + wxPROPERTY_GETTER( pname, class_t, type, getter ) \ + static wxPropertyGetter##pname _getter##pname; \ + static wxPropertyAccessor _accessor##pname( &_setter##pname, \ + &_getter##pname, NULL, NULL ); \ + static wxPropertyInfo _propertyInfo##pname( first, class_t::GetClassInfoStatic(), \ + wxT(#pname), typeid(flags).name(), &_accessor##pname, \ + wxAny(defaultValue), wxPROP_ENUM_STORE_LONG | pflags, help, group ); + +#define wxREADONLY_PROPERTY( pname, type, getter,defaultValue, flags, help, group) \ + wxPROPERTY_GETTER( pname, class_t, type, getter ) \ + static wxPropertyGetter##pname _getter##pname; \ + static wxPropertyAccessor _accessor##pname( NULL, &_getter##pname, NULL, NULL ); \ + static wxPropertyInfo _propertyInfo##pname( first, class_t::GetClassInfoStatic(), \ + wxT(#pname), typeid(type).name(),&_accessor##pname, \ + wxAny(defaultValue), flags, help, group ); + +#define wxREADONLY_PROPERTY_FLAGS( pname, flags, type, getter,defaultValue, \ + pflags, help, group) \ + wxPROPERTY_GETTER( pname, class_t, type, getter ) \ + static wxPropertyGetter##pname _getter##pname; \ + static wxPropertyAccessor _accessor##pname( NULL, &_getter##pname, NULL, NULL ); \ + static wxPropertyInfo _propertyInfo##pname( first, class_t::GetClassInfoStatic(), \ + wxT(#pname), typeid(flags).name(),&_accessor##pname, \ + wxAny(defaultValue), wxPROP_ENUM_STORE_LONG | pflags, help, group ); + +#define wxPROPERTY_COLLECTION( pname, colltype, addelemtype, adder, getter, \ + flags, help, group ) \ + wxPROPERTY_COLLECTION_ADDER( pname, class_t, addelemtype, adder ) \ + static wxPropertyCollectionAdder##pname _adder##pname; \ + wxPROPERTY_COLLECTION_GETTER( pname, class_t, colltype, getter ) \ + static wxPropertyCollectionGetter##pname _collectionGetter##pname; \ + static wxPropertyAccessor _accessor##pname( NULL, NULL,&_adder##pname, \ + &_collectionGetter##pname ); \ + static wxPropertyInfo _propertyInfo##pname( first, class_t::GetClassInfoStatic(), \ + wxT(#pname), typeid(colltype).name(),typeid(addelemtype).name(), \ + &_accessor##pname, flags, help, group ); + +#define wxREADONLY_PROPERTY_COLLECTION( pname, colltype, addelemtype, getter, \ + flags, help, group) \ + wxPROPERTY_COLLECTION_GETTER( pname, class_t, colltype, getter ) \ + static wxPropertyCollectionGetter##pname _collectionGetter##pname; \ + static wxPropertyAccessor _accessor##pname( NULL, NULL, NULL, \ + &_collectionGetter##pname ); \ + static wxPropertyInfo _propertyInfo##pname( first,class_t::GetClassInfoStatic(), \ + wxT(#pname), typeid(colltype).name(),typeid(addelemtype).name(), \ + &_accessor##pname, flags, help, group ); + +#define wxEVENT_PROPERTY( name, eventType, eventClass ) \ + static wxEventSourceTypeInfo _typeInfo##name( eventType, wxCLASSINFO( eventClass ) ); \ + static wxPropertyInfo _propertyInfo##name( first,class_t::GetClassInfoStatic(), \ + wxT(#name), &_typeInfo##name, NULL, wxAny() ); + +#define wxEVENT_RANGE_PROPERTY( name, eventType, lastEventType, eventClass ) \ + static wxEventSourceTypeInfo _typeInfo##name( eventType, lastEventType, \ + wxCLASSINFO( eventClass ) ); \ + static wxPropertyInfo _propertyInfo##name( first, class_t::GetClassInfoStatic(), \ + wxT(#name), &_typeInfo##name, NULL, wxAny() ); + +// ---------------------------------------------------------------------------- +// Implementation Helper for Simple Properties +// ---------------------------------------------------------------------------- + +#define wxIMPLEMENT_PROPERTY(name, type) \ +private: \ + type m_##name; \ +public: \ + void Set##name( type const & p) { m_##name = p; } \ + type const & Get##name() const { return m_##name; } + +#endif // wxUSE_EXTENDED_RTTI +#endif // _XTIPROP_H_ diff --git a/wxmsw/include/wx-3.0/wx/xtistrm.h b/wxmsw/include/wx-3.0/wx/xtistrm.h new file mode 100644 index 00000000..0621ead1 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xtistrm.h @@ -0,0 +1,408 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xtistrm.h +// Purpose: streaming runtime metadata information (extended class info) +// Author: Stefan Csomor +// Modified by: +// Created: 27/07/03 +// Copyright: (c) 2003 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XTISTRMH__ +#define _WX_XTISTRMH__ + +#include "wx/defs.h" + +#if wxUSE_EXTENDED_RTTI + +#include "wx/object.h" + +const int wxInvalidObjectID = -2; +const int wxNullObjectID = -3; + +// Filer contains the interfaces for streaming objects in and out of XML, +// rendering them either to objects in memory, or to code. Note: We +// consider the process of generating code to be one of *depersisting* the +// object from xml, *not* of persisting the object to code from an object +// in memory. This distinction can be confusing, and should be kept +// in mind when looking at the property streamers and callback interfaces +// listed below. + + +// ---------------------------------------------------------------------------- +// wxObjectWriterCallback +// +// This class will be asked during the streaming-out process about every single +// property or object instance. It can veto streaming out by returning false +// or modify the value before it is streamed-out. +// ---------------------------------------------------------------------------- + +/* + class WXDLLIMPEXP_BASE wxClassInfo; + class WXDLLIMPEXP_BASE wxAnyList; + class WXDLLIMPEXP_BASE wxPropertyInfo; + class WXDLLIMPEXP_BASE wxAny; + class WXDLLIMPEXP_BASE wxHandlerInfo; + */ + +class WXDLLIMPEXP_BASE wxObjectWriter; +class WXDLLIMPEXP_BASE wxObjectReader; + +class WXDLLIMPEXP_BASE wxObjectWriterCallback +{ +public: + virtual ~wxObjectWriterCallback() {} + + // will be called before an object is written, may veto by returning false + virtual bool BeforeWriteObject( wxObjectWriter *WXUNUSED(writer), + const wxObject *WXUNUSED(object), + const wxClassInfo *WXUNUSED(classInfo), + const wxStringToAnyHashMap &WXUNUSED(metadata)) + { return true; } + + // will be called after this object has been written, may be + // needed for adjusting stacks + virtual void AfterWriteObject( wxObjectWriter *WXUNUSED(writer), + const wxObject *WXUNUSED(object), + const wxClassInfo *WXUNUSED(classInfo) ) + {} + + // will be called before a property gets written, may change the value, + // eg replace a concrete wxSize by wxSize( wxDefaultCoord, wxDefaultCoord ) + // or veto writing that property at all by returning false + virtual bool BeforeWriteProperty( wxObjectWriter *WXUNUSED(writer), + const wxObject *WXUNUSED(object), + const wxPropertyInfo *WXUNUSED(propInfo), + const wxAny &WXUNUSED(value) ) + { return true; } + + // will be called before a property gets written, may change the value, + // eg replace a concrete wxSize by wxSize( wxDefaultCoord, wxDefaultCoord ) + // or veto writing that property at all by returning false + virtual bool BeforeWriteProperty( wxObjectWriter *WXUNUSED(writer), + const wxObject *WXUNUSED(object), + const wxPropertyInfo *WXUNUSED(propInfo), + const wxAnyList &WXUNUSED(value) ) + { return true; } + + // will be called after a property has been written out, may be needed + // for adjusting stacks + virtual void AfterWriteProperty( wxObjectWriter *WXUNUSED(writer), + const wxPropertyInfo *WXUNUSED(propInfo) ) + {} + + // will be called before this delegate gets written + virtual bool BeforeWriteDelegate( wxObjectWriter *WXUNUSED(writer), + const wxObject *WXUNUSED(object), + const wxClassInfo* WXUNUSED(classInfo), + const wxPropertyInfo *WXUNUSED(propInfo), + const wxObject *&WXUNUSED(eventSink), + const wxHandlerInfo* &WXUNUSED(handlerInfo) ) + { return true; } + + virtual void AfterWriteDelegate( wxObjectWriter *WXUNUSED(writer), + const wxObject *WXUNUSED(object), + const wxClassInfo* WXUNUSED(classInfo), + const wxPropertyInfo *WXUNUSED(propInfo), + const wxObject *&WXUNUSED(eventSink), + const wxHandlerInfo* &WXUNUSED(handlerInfo) ) + { } +}; + +class WXDLLIMPEXP_BASE wxObjectWriterFunctor: public wxObjectFunctor +{ +}; + +class WXDLLIMPEXP_BASE wxObjectWriter: public wxObject +{ + friend class wxObjectWriterFunctor; +public: + wxObjectWriter(); + virtual ~wxObjectWriter(); + + // with this call you start writing out a new top-level object + void WriteObject(const wxObject *object, const wxClassInfo *classInfo, + wxObjectWriterCallback *writercallback, const wxString &name, + const wxStringToAnyHashMap &metadata); + + // Managing the object identity table a.k.a context + // + // these methods make sure that no object gets written twice, + // because sometimes multiple calls to the WriteObject will be + // made without wanting to have duplicate objects written, the + // object identity table will be reset manually + virtual void ClearObjectContext(); + + // gets the object Id for a passed in object in the context + int GetObjectID(const wxObject *obj); + + // returns true if this object has already been written in this context + bool IsObjectKnown( const wxObject *obj ); + + // + // streaming callbacks + // + // these callbacks really write out the values in the stream format + + // begins writing out a new toplevel entry which has the indicated unique name + virtual void DoBeginWriteTopLevelEntry( const wxString &name ) = 0; + + // ends writing out a new toplevel entry which has the indicated unique name + virtual void DoEndWriteTopLevelEntry( const wxString &name ) = 0; + + // start of writing an object having the passed in ID + virtual void DoBeginWriteObject(const wxObject *object, const wxClassInfo *classInfo, + int objectID, const wxStringToAnyHashMap &metadata ) = 0; + + // end of writing an toplevel object name param is used for unique + // identification within the container + virtual void DoEndWriteObject(const wxObject *object, + const wxClassInfo *classInfo, int objectID ) = 0; + + // writes a simple property in the stream format + virtual void DoWriteSimpleType( const wxAny &value ) = 0; + + // start of writing a complex property into the stream ( + virtual void DoBeginWriteProperty( const wxPropertyInfo *propInfo ) = 0; + + // end of writing a complex property into the stream + virtual void DoEndWriteProperty( const wxPropertyInfo *propInfo ) = 0; + + virtual void DoBeginWriteElement() = 0; + virtual void DoEndWriteElement() = 0; + // insert an object reference to an already written object + virtual void DoWriteRepeatedObject( int objectID ) = 0; + + // insert a null reference + virtual void DoWriteNullObject() = 0; + + // writes a delegate in the stream format + virtual void DoWriteDelegate( const wxObject *object, const wxClassInfo* classInfo, + const wxPropertyInfo *propInfo, const wxObject *eventSink, + int sinkObjectID, const wxClassInfo* eventSinkClassInfo, + const wxHandlerInfo* handlerIndo ) = 0; + + void WriteObject(const wxObject *object, const wxClassInfo *classInfo, + wxObjectWriterCallback *writercallback, bool isEmbedded, const wxStringToAnyHashMap &metadata ); + +protected: + struct wxObjectWriterInternal; + wxObjectWriterInternal* m_data; + + struct wxObjectWriterInternalPropertiesData; + + void WriteAllProperties( const wxObject * obj, const wxClassInfo* ci, + wxObjectWriterCallback *writercallback, + wxObjectWriterInternalPropertiesData * data ); + + void WriteOneProperty( const wxObject *obj, const wxClassInfo* ci, + const wxPropertyInfo* pi, wxObjectWriterCallback *writercallback, + wxObjectWriterInternalPropertiesData *data ); + + + void FindConnectEntry(const wxEvtHandler * evSource, + const wxEventSourceTypeInfo* dti, const wxObject* &sink, + const wxHandlerInfo *&handler); +}; + + +/* +Streaming callbacks for depersisting XML to code, or running objects +*/ + +class WXDLLIMPEXP_BASE wxObjectReaderCallback; + +/* +wxObjectReader handles streaming in a class from a arbitrary format. +While walking through it issues calls out to interfaces to readercallback +the guts from the underlying storage format. +*/ + +class WXDLLIMPEXP_BASE wxObjectReader: public wxObject +{ +public: + wxObjectReader(); + virtual ~wxObjectReader(); + + // the only thing wxObjectReader knows about is the class info by object ID + wxClassInfo *GetObjectClassInfo(int objectID); + bool HasObjectClassInfo( int objectID ); + void SetObjectClassInfo(int objectID, wxClassInfo* classInfo); + + // Reads the component the reader is pointed at from the underlying format. + // The return value is the root object ID, which can + // then be used to ask the depersister about that object + // if there was a problem you will get back wxInvalidObjectID and the current + // error log will carry the problems encoutered + virtual int ReadObject( const wxString &name, wxObjectReaderCallback *readercallback ) = 0; + +private: + struct wxObjectReaderInternal; + wxObjectReaderInternal *m_data; +}; + +// This abstract class matches the allocate-init/create model of creation of objects. +// At runtime, these will create actual instances, and manipulate them. +// When generating code, these will just create statements of C++ +// code to create the objects. + +class WXDLLIMPEXP_BASE wxObjectReaderCallback +{ +public: + virtual ~wxObjectReaderCallback() {} + + // allocate the new object on the heap, that object will have the passed in ID + virtual void AllocateObject(int objectID, wxClassInfo *classInfo, + wxStringToAnyHashMap &metadata) = 0; + + // initialize the already allocated object having the ID objectID with the Create method + // creation parameters which are objects are having their Ids passed in objectIDValues + // having objectId <> wxInvalidObjectID + + virtual void CreateObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, + wxAny *VariantValues, + int *objectIDValues, + const wxClassInfo **objectClassInfos, + wxStringToAnyHashMap &metadata) = 0; + + // construct the new object on the heap, that object will have the passed in ID + // (for objects that don't support allocate-create type of creation) + // creation parameters which are objects are having their Ids passed in + // objectIDValues having objectId <> wxInvalidObjectID + + virtual void ConstructObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, + wxAny *VariantValues, + int *objectIDValues, + const wxClassInfo **objectClassInfos, + wxStringToAnyHashMap &metadata) = 0; + + // destroy the heap-allocated object having the ID objectID, this may be used + // if an object is embedded in another object and set via value semantics, + // so the intermediate object can be destroyed after safely + virtual void DestroyObject(int objectID, wxClassInfo *classInfo) = 0; + + // set the corresponding property + virtual void SetProperty(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo, + const wxAny &VariantValue) = 0; + + // sets the corresponding property (value is an object) + virtual void SetPropertyAsObject(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo, + int valueObjectId) = 0; + + // adds an element to a property collection + virtual void AddToPropertyCollection( int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo, + const wxAny &VariantValue) = 0; + + // sets the corresponding property (value is an object) + virtual void AddToPropertyCollectionAsObject(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo, + int valueObjectId) = 0; + + // sets the corresponding event handler + virtual void SetConnect(int EventSourceObjectID, + const wxClassInfo *EventSourceClassInfo, + const wxPropertyInfo *delegateInfo, + const wxClassInfo *EventSinkClassInfo, + const wxHandlerInfo* handlerInfo, + int EventSinkObjectID ) = 0; +}; + +/* +wxObjectRuntimeReaderCallback implements the callbacks that will bring back +an object into a life memory instance +*/ + +class WXDLLIMPEXP_BASE wxObjectRuntimeReaderCallback: public wxObjectReaderCallback +{ + struct wxObjectRuntimeReaderCallbackInternal; + wxObjectRuntimeReaderCallbackInternal * m_data; + +public: + wxObjectRuntimeReaderCallback(); + virtual ~wxObjectRuntimeReaderCallback(); + + // returns the object having the corresponding ID fully constructed + wxObject *GetObject(int objectID); + + // allocate the new object on the heap, that object will have the passed in ID + virtual void AllocateObject(int objectID, wxClassInfo *classInfo, + wxStringToAnyHashMap &metadata); + + // initialize the already allocated object having the ID objectID with + // the Create method creation parameters which are objects are having + // their Ids passed in objectIDValues having objectId <> wxInvalidObjectID + + virtual void CreateObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, + wxAny *VariantValues, + int *objectIDValues, + const wxClassInfo **objectClassInfos, + wxStringToAnyHashMap &metadata + ); + + // construct the new object on the heap, that object will have the + // passed in ID (for objects that don't support allocate-create type of + // creation) creation parameters which are objects are having their Ids + // passed in objectIDValues having objectId <> wxInvalidObjectID + + virtual void ConstructObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, + wxAny *VariantValues, + int *objectIDValues, + const wxClassInfo **objectClassInfos, + wxStringToAnyHashMap &metadata); + + // destroy the heap-allocated object having the ID objectID, this may be + // used if an object is embedded in another object and set via value semantics, + // so the intermediate object can be destroyed after safely + virtual void DestroyObject(int objectID, wxClassInfo *classInfo); + + // set the corresponding property + virtual void SetProperty(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo, + const wxAny &variantValue); + + // sets the corresponding property (value is an object) + virtual void SetPropertyAsObject(int objectId, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo, + int valueObjectId); + + // adds an element to a property collection + virtual void AddToPropertyCollection( int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo, + const wxAny &VariantValue); + + // sets the corresponding property (value is an object) + virtual void AddToPropertyCollectionAsObject(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo, + int valueObjectId); + + // sets the corresponding event handler + virtual void SetConnect(int eventSourceObjectID, + const wxClassInfo *eventSourceClassInfo, + const wxPropertyInfo *delegateInfo, + const wxClassInfo *eventSinkClassInfo, + const wxHandlerInfo* handlerInfo, + int eventSinkObjectID ); +}; + +#endif // wxUSE_EXTENDED_RTTI + +#endif diff --git a/wxmsw/include/wx-3.0/wx/xtitypes.h b/wxmsw/include/wx-3.0/wx/xtitypes.h new file mode 100644 index 00000000..afd5c07b --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xtitypes.h @@ -0,0 +1,532 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xtitypes.h +// Purpose: enum, set, basic types support +// Author: Stefan Csomor +// Modified by: Francesco Montorsi +// Created: 27/07/03 +// Copyright: (c) 1997 Julian Smart +// (c) 2003 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _XTITYPES_H_ +#define _XTITYPES_H_ + +#include "wx/defs.h" + +#if wxUSE_EXTENDED_RTTI + +#include "wx/string.h" +#include "wx/hashmap.h" +#include "wx/arrstr.h" +#include "wx/flags.h" +#include "wx/intl.h" +#include "wx/log.h" +#include + +class WXDLLIMPEXP_BASE wxClassInfo; + +// ---------------------------------------------------------------------------- +// Enum Support +// +// In the header files XTI requires no change from pure c++ code, however in the +// implementation, an enum needs to be enumerated eg: +// +// wxBEGIN_ENUM( wxFlavor ) +// wxENUM_MEMBER( Vanilla ) +// wxENUM_MEMBER( Chocolate ) +// wxENUM_MEMBER( Strawberry ) +// wxEND_ENUM( wxFlavor ) +// ---------------------------------------------------------------------------- + +struct WXDLLIMPEXP_BASE wxEnumMemberData +{ + const wxChar* m_name; + int m_value; +}; + +class WXDLLIMPEXP_BASE wxEnumData +{ +public: + wxEnumData( wxEnumMemberData* data ); + + // returns true if the member has been found and sets the int value + // pointed to accordingly (if ptr != null ) + // if not found returns false, value left unchanged + bool HasEnumMemberValue( const wxChar *name, int *value = NULL ) const; + + // returns the value of the member, if not found in debug mode an + // assert is issued, in release 0 is returned + int GetEnumMemberValue(const wxChar *name ) const; + + // returns the name of the enum member having the passed in value + // returns an emtpy string if not found + const wxChar *GetEnumMemberName(int value) const; + + // returns the number of members in this enum + int GetEnumCount() const { return m_count; } + + // returns the value of the nth member + int GetEnumMemberValueByIndex( int n ) const; + + // returns the value of the nth member + const wxChar *GetEnumMemberNameByIndex( int n ) const; + +private: + wxEnumMemberData *m_members; + int m_count; +}; + +#define wxBEGIN_ENUM( e ) \ + wxEnumMemberData s_enumDataMembers##e[] = { + +#define wxENUM_MEMBER( v ) { wxT(#v), v }, + +#define wxEND_ENUM( e ) \ + { NULL, 0 } }; \ + wxEnumData s_enumData##e( s_enumDataMembers##e ); \ + wxEnumData *wxGetEnumData(e) { return &s_enumData##e; } \ + template<> void wxStringReadValue(const wxString& s, e &data ) \ + { data = (e) s_enumData##e.GetEnumMemberValue(s.c_str()); } \ + template<> void wxStringWriteValue(wxString &s, const e &data ) \ + { s = s_enumData##e.GetEnumMemberName((int)data); } \ + void FromLong##e( long data, wxAny& result ) \ + { result = wxAny((e)data); } \ + void ToLong##e( const wxAny& data, long &result ) \ + { result = (long) (data).As(static_cast(NULL)); } \ + \ + wxTO_STRING_IMP( e ) \ + wxFROM_STRING_IMP( e ) \ + wxEnumTypeInfo s_typeInfo##e(wxT_ENUM, &s_enumData##e, \ + &wxTO_STRING( e ), &wxFROM_STRING( e ), &ToLong##e, \ + &FromLong##e, typeid(e).name() ); + + +// ---------------------------------------------------------------------------- +// Set Support +// +// in the header : +// +// enum wxFlavor +// { +// Vanilla, +// Chocolate, +// Strawberry, +// }; +// +// typedef wxBitset wxCoupe; +// +// in the implementation file : +// +// wxBEGIN_ENUM( wxFlavor ) +// wxENUM_MEMBER( Vanilla ) +// wxENUM_MEMBER( Chocolate ) +// wxENUM_MEMBER( Strawberry ) +// wxEND_ENUM( wxFlavor ) +// +// wxIMPLEMENT_SET_STREAMING( wxCoupe, wxFlavor ) +// +// implementation note: no partial specialization for streaming, but a delegation +// to a different class +// +// ---------------------------------------------------------------------------- + +void WXDLLIMPEXP_BASE wxSetStringToArray( const wxString &s, wxArrayString &array ); + +template +void wxSetFromString(const wxString &s, wxBitset &data ) +{ + wxEnumData* edata = wxGetEnumData((e) 0); + data.reset(); + + wxArrayString array; + wxSetStringToArray( s, array ); + wxString flag; + for ( int i = 0; i < array.Count(); ++i ) + { + flag = array[i]; + int ivalue; + if ( edata->HasEnumMemberValue( flag.c_str(), &ivalue ) ) + { + data.set( (e) ivalue ); + } + } +} + +template +void wxSetToString( wxString &s, const wxBitset &data ) +{ + wxEnumData* edata = wxGetEnumData((e) 0); + int count = edata->GetEnumCount(); + int i; + s.Clear(); + for ( i = 0; i < count; i++ ) + { + e value = (e) edata->GetEnumMemberValueByIndex(i); + if ( data.test( value ) ) + { + // this could also be done by the templated calls + if ( !s.empty() ) + s += wxT("|"); + s += edata->GetEnumMemberNameByIndex(i); + } + } +} + +#define wxIMPLEMENT_SET_STREAMING(SetName,e) \ + template<> void wxStringReadValue(const wxString &s, wxBitset &data ) \ + { wxSetFromString( s, data ); } \ + template<> void wxStringWriteValue( wxString &s, const wxBitset &data ) \ + { wxSetToString( s, data ); } \ + void FromLong##SetName( long data, wxAny& result ) \ + { result = wxAny(SetName((unsigned long)data)); } \ + void ToLong##SetName( const wxAny& data, long &result ) \ + { result = (long) (data).As(static_cast(NULL)).to_ulong(); } \ + wxTO_STRING_IMP( SetName ) \ + wxFROM_STRING_IMP( SetName ) \ + wxEnumTypeInfo s_typeInfo##SetName(wxT_SET, &s_enumData##e, \ + &wxTO_STRING( SetName ), &wxFROM_STRING( SetName ), \ + &ToLong##SetName, &FromLong##SetName, typeid(SetName).name() ); + +template +void wxFlagsFromString(const wxString &s, e &data ) +{ + wxEnumData* edata = wxGetEnumData((e*) 0); + data.m_data = 0; + + wxArrayString array; + wxSetStringToArray( s, array ); + wxString flag; + for ( size_t i = 0; i < array.Count(); ++i ) + { + flag = array[i]; + int ivalue; + if ( edata->HasEnumMemberValue( flag.c_str(), &ivalue ) ) + { + data.m_data |= ivalue; + } + } +} + +template +void wxFlagsToString( wxString &s, const e& data ) +{ + wxEnumData* edata = wxGetEnumData((e*) 0); + int count = edata->GetEnumCount(); + int i; + s.Clear(); + long dataValue = data.m_data; + for ( i = 0; i < count; i++ ) + { + int value = edata->GetEnumMemberValueByIndex(i); + // make this to allow for multi-bit constants to work + if ( value && ( dataValue & value ) == value ) + { + // clear the flags we just set + dataValue &= ~value; + // this could also be done by the templated calls + if ( !s.empty() ) + s +=wxT("|"); + s += edata->GetEnumMemberNameByIndex(i); + } + } +} + +#define wxBEGIN_FLAGS( e ) \ + wxEnumMemberData s_enumDataMembers##e[] = { + +#define wxFLAGS_MEMBER( v ) { wxT(#v), static_cast(v) }, + +#define wxEND_FLAGS( e ) \ + { NULL, 0 } }; \ + wxEnumData s_enumData##e( s_enumDataMembers##e ); \ + wxEnumData *wxGetEnumData(e*) { return &s_enumData##e; } \ + template<> void wxStringReadValue(const wxString &s, e &data ) \ + { wxFlagsFromString( s, data ); } \ + template<> void wxStringWriteValue( wxString &s, const e& data ) \ + { wxFlagsToString( s, data ); } \ + void FromLong##e( long data, wxAny& result ) \ + { result = wxAny(e(data)); } \ + void ToLong##e( const wxAny& data, long &result ) \ + { result = (long) (data).As(static_cast(NULL)).m_data; } \ + wxTO_STRING_IMP( e ) \ + wxFROM_STRING_IMP( e ) \ + wxEnumTypeInfo s_typeInfo##e(wxT_SET, &s_enumData##e, \ + &wxTO_STRING( e ), &wxFROM_STRING( e ), &ToLong##e, \ + &FromLong##e, typeid(e).name() ); + +// ---------------------------------------------------------------------------- +// Type Information +// ---------------------------------------------------------------------------- + +// All data exposed by the RTTI is characterized using the following classes. +// The first characterization is done by wxTypeKind. All enums up to and including +// wxT_CUSTOM represent so called simple types. These cannot be divided any further. +// They can be converted to and from wxStrings, that's all. +// Other wxTypeKinds can instead be splitted recursively into smaller parts until +// the simple types are reached. + +enum wxTypeKind +{ + wxT_VOID = 0, // unknown type + wxT_BOOL, + wxT_CHAR, + wxT_UCHAR, + wxT_INT, + wxT_UINT, + wxT_LONG, + wxT_ULONG, + wxT_LONGLONG, + wxT_ULONGLONG, + wxT_FLOAT, + wxT_DOUBLE, + wxT_STRING, // must be wxString + wxT_SET, // must be wxBitset<> template + wxT_ENUM, + wxT_CUSTOM, // user defined type (e.g. wxPoint) + + wxT_LAST_SIMPLE_TYPE_KIND = wxT_CUSTOM, + + wxT_OBJECT_PTR, // object reference + wxT_OBJECT, // embedded object + wxT_COLLECTION, // collection + + wxT_DELEGATE, // for connecting against an event source + + wxT_LAST_TYPE_KIND = wxT_DELEGATE // sentinel for bad data, asserts, debugging +}; + +class WXDLLIMPEXP_BASE wxAny; +class WXDLLIMPEXP_BASE wxTypeInfo; + +WX_DECLARE_STRING_HASH_MAP_WITH_DECL( wxTypeInfo*, wxTypeInfoMap, class WXDLLIMPEXP_BASE ); + +class WXDLLIMPEXP_BASE wxTypeInfo +{ +public: + typedef void (*wxVariant2StringFnc)( const wxAny& data, wxString &result ); + typedef void (*wxString2VariantFnc)( const wxString& data, wxAny &result ); + + wxTypeInfo(wxTypeKind kind, + wxVariant2StringFnc to = NULL, wxString2VariantFnc from = NULL, + const wxString &name = wxEmptyString): + m_toString(to), m_fromString(from), m_kind(kind), m_name(name) + { + Register(); + } +#if 0 // wxUSE_UNICODE + wxTypeInfo(wxTypeKind kind, + wxVariant2StringFnc to, wxString2VariantFnc from, + const char *name): + m_toString(to), m_fromString(from), m_kind(kind), + m_name(wxString::FromAscii(name)) + { + Register(); + } +#endif + + virtual ~wxTypeInfo() + { + Unregister(); + } + + // return the kind of this type (wxT_... constants) + wxTypeKind GetKind() const { return m_kind; } + + // returns the unique name of this type + const wxString& GetTypeName() const { return m_name; } + + // is this type a delegate type + bool IsDelegateType() const { return m_kind == wxT_DELEGATE; } + + // is this type a custom type + bool IsCustomType() const { return m_kind == wxT_CUSTOM; } + + // is this type an object type + bool IsObjectType() const { return m_kind == wxT_OBJECT || m_kind == wxT_OBJECT_PTR; } + + // can the content of this type be converted to and from strings ? + bool HasStringConverters() const { return m_toString != NULL && m_fromString != NULL; } + + // convert a wxAny holding data of this type into a string + void ConvertToString( const wxAny& data, wxString &result ) const + { + if ( m_toString ) + (*m_toString)( data, result ); + else + wxLogError( wxGetTranslation(wxT("String conversions not supported")) ); + } + + // convert a string into a wxAny holding the corresponding data in this type + void ConvertFromString( const wxString& data, wxAny &result ) const + { + if( m_fromString ) + (*m_fromString)( data, result ); + else + wxLogError( wxGetTranslation(wxT("String conversions not supported")) ); + } + + // statics: + + // looks for the corresponding type, will return NULL if not found + static wxTypeInfo *FindType( const wxString& typeName ); +private: + void Register(); + void Unregister(); + + wxVariant2StringFnc m_toString; + wxString2VariantFnc m_fromString; + + wxTypeKind m_kind; + wxString m_name; + + // the static list of all types we know about + static wxTypeInfoMap* ms_typeTable; +}; + +class WXDLLIMPEXP_BASE wxBuiltInTypeInfo : public wxTypeInfo +{ +public: + wxBuiltInTypeInfo( wxTypeKind kind, wxVariant2StringFnc to = NULL, + wxString2VariantFnc from = NULL, + const wxString &name = wxEmptyString ) : + wxTypeInfo( kind, to, from, name ) + { wxASSERT_MSG( GetKind() < wxT_SET, wxT("Illegal Kind for Base Type") ); } +}; + +class WXDLLIMPEXP_BASE wxCustomTypeInfo : public wxTypeInfo +{ +public: + wxCustomTypeInfo( const wxString &name, wxVariant2StringFnc to, + wxString2VariantFnc from ) : + wxTypeInfo( wxT_CUSTOM, to, from, name ) + {} +}; + +class WXDLLIMPEXP_BASE wxEnumTypeInfo : public wxTypeInfo +{ +public: + typedef void (*converterToLong_t)( const wxAny& data, long &result ); + typedef void (*converterFromLong_t)( long data, wxAny &result ); + + wxEnumTypeInfo( wxTypeKind kind, wxEnumData* enumInfo, wxVariant2StringFnc to, + wxString2VariantFnc from, converterToLong_t toLong, + converterFromLong_t fromLong, const wxString &name ) : + wxTypeInfo( kind, to, from, name ), m_toLong( toLong ), m_fromLong( fromLong ) + { + wxASSERT_MSG( kind == wxT_ENUM || kind == wxT_SET, + wxT("Illegal Kind for Enum Type")); + m_enumInfo = enumInfo; + } + + const wxEnumData* GetEnumData() const { return m_enumInfo; } + + // convert a wxAny holding data of this type into a long + void ConvertToLong( const wxAny& data, long &result ) const + { + if( m_toLong ) + (*m_toLong)( data, result ); + else + wxLogError( wxGetTranslation(wxT("Long Conversions not supported")) ); + } + + // convert a long into a wxAny holding the corresponding data in this type + void ConvertFromLong( long data, wxAny &result ) const + { + if( m_fromLong ) + (*m_fromLong)( data, result ); + else + wxLogError( wxGetTranslation(wxT("Long Conversions not supported")) ); + } + +private: + converterToLong_t m_toLong; + converterFromLong_t m_fromLong; + + wxEnumData *m_enumInfo; // Kind == wxT_ENUM or Kind == wxT_SET +}; + +class WXDLLIMPEXP_BASE wxClassTypeInfo : public wxTypeInfo +{ +public: + wxClassTypeInfo( wxTypeKind kind, wxClassInfo* classInfo, + wxVariant2StringFnc to = NULL, wxString2VariantFnc from = NULL, + const wxString &name = wxEmptyString); + + const wxClassInfo *GetClassInfo() const { return m_classInfo; } + +private: + wxClassInfo *m_classInfo; // Kind == wxT_OBJECT - could be NULL +}; + +class WXDLLIMPEXP_BASE wxCollectionTypeInfo : public wxTypeInfo +{ +public: + wxCollectionTypeInfo( const wxString &elementName, wxVariant2StringFnc to, + wxString2VariantFnc from , const wxString &name) : + wxTypeInfo( wxT_COLLECTION, to, from, name ) + { m_elementTypeName = elementName; m_elementType = NULL; } + + const wxTypeInfo* GetElementType() const + { + if ( m_elementType == NULL ) + m_elementType = wxTypeInfo::FindType( m_elementTypeName ); + return m_elementType; + } + +private: + mutable wxTypeInfo * m_elementType; + wxString m_elementTypeName; +}; + +class WXDLLIMPEXP_BASE wxEventSourceTypeInfo : public wxTypeInfo +{ +public: + wxEventSourceTypeInfo( int eventType, wxClassInfo* eventClass, + wxVariant2StringFnc to = NULL, + wxString2VariantFnc from = NULL ); + wxEventSourceTypeInfo( int eventType, int lastEventType, wxClassInfo* eventClass, + wxVariant2StringFnc to = NULL, wxString2VariantFnc from = NULL ); + + int GetEventType() const { return m_eventType; } + int GetLastEventType() const { return m_lastEventType; } + const wxClassInfo* GetEventClass() const { return m_eventClass; } + +private: + const wxClassInfo *m_eventClass; // (extended will merge into classinfo) + int m_eventType; + int m_lastEventType; +}; + +template const wxTypeInfo* wxGetTypeInfo( T * ) + { return wxTypeInfo::FindType(typeid(T).name()); } + +// this macro is for usage with custom, non-object derived classes and structs, +// wxPoint is such a custom type + +#if wxUSE_FUNC_TEMPLATE_POINTER + #define wxCUSTOM_TYPE_INFO( e, toString, fromString ) \ + wxCustomTypeInfo s_typeInfo##e(typeid(e).name(), &toString, &fromString); +#else + #define wxCUSTOM_TYPE_INFO( e, toString, fromString ) \ + void ToString##e( const wxAny& data, wxString &result ) \ + { toString(data, result); } \ + void FromString##e( const wxString& data, wxAny &result ) \ + { fromString(data, result); } \ + wxCustomTypeInfo s_typeInfo##e(typeid(e).name(), \ + &ToString##e, &FromString##e); +#endif + +#define wxCOLLECTION_TYPE_INFO( element, collection ) \ + wxCollectionTypeInfo s_typeInfo##collection( typeid(element).name(), \ + NULL, NULL, typeid(collection).name() ); + +// sometimes a compiler invents specializations that are nowhere called, +// use this macro to satisfy the refs, currently we don't have to play +// tricks, but if we will have to according to the compiler, we will use +// that macro for that + +#define wxILLEGAL_TYPE_SPECIALIZATION( a ) + +#endif // wxUSE_EXTENDED_RTTI +#endif // _XTITYPES_H_ diff --git a/wxmsw/include/wx-3.0/wx/xtixml.h b/wxmsw/include/wx-3.0/wx/xtixml.h new file mode 100644 index 00000000..100e0653 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/xtixml.h @@ -0,0 +1,119 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xtixml.h +// Purpose: xml streaming runtime metadata information (extended class info) +// Author: Stefan Csomor +// Modified by: +// Created: 27/07/03 +// Copyright: (c) 2003 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XTIXMLH__ +#define _WX_XTIXMLH__ + +#include "wx/defs.h" + +#if wxUSE_EXTENDED_RTTI + +#include "wx/string.h" +#include "wx/xtistrm.h" + +/* +class WXDLLIMPEXP_XML wxXmlNode; +class WXDLLIMPEXP_BASE wxPropertyInfo; +class WXDLLIMPEXP_BASE wxObject; +class WXDLLIMPEXP_BASE wxClassInfo; +class WXDLLIMPEXP_BASE wxAnyList; +class WXDLLIMPEXP_BASE wxHandlerInfo; +class WXDLLIMPEXP_BASE wxObjectWriterCallback; +*/ + +class WXDLLIMPEXP_XML wxObjectXmlWriter: public wxObjectWriter +{ +public: + + wxObjectXmlWriter( wxXmlNode * parent ); + virtual ~wxObjectXmlWriter(); + + // + // streaming callbacks + // + // these callbacks really write out the values in the stream format + // + + // + // streaming callbacks + // + // these callbacks really write out the values in the stream format + + // begins writing out a new toplevel entry which has the indicated unique name + virtual void DoBeginWriteTopLevelEntry( const wxString &name ); + + // ends writing out a new toplevel entry which has the indicated unique name + virtual void DoEndWriteTopLevelEntry( const wxString &name ); + + // start of writing an object having the passed in ID + virtual void DoBeginWriteObject(const wxObject *object, + const wxClassInfo *classInfo, int objectID, const wxStringToAnyHashMap &metadata ); + + // end of writing an toplevel object name param is used for unique + // identification within the container + virtual void DoEndWriteObject(const wxObject *object, + const wxClassInfo *classInfo, int objectID ); + + // writes a simple property in the stream format + virtual void DoWriteSimpleType( const wxAny &value ); + + // start of writing a complex property into the stream ( + virtual void DoBeginWriteProperty( const wxPropertyInfo *propInfo ); + + // end of writing a complex property into the stream + virtual void DoEndWriteProperty( const wxPropertyInfo *propInfo ); + + virtual void DoBeginWriteElement(); + virtual void DoEndWriteElement(); + + // insert an object reference to an already written object + virtual void DoWriteRepeatedObject( int objectID ); + + // insert a null reference + virtual void DoWriteNullObject(); + + // writes a delegate in the stream format + virtual void DoWriteDelegate( const wxObject *object, + const wxClassInfo* classInfo, const wxPropertyInfo *propInfo, + const wxObject *eventSink, int sinkObjectID, + const wxClassInfo* eventSinkClassInfo, const wxHandlerInfo* handlerIndo ); + +private: + struct wxObjectXmlWriterInternal; + wxObjectXmlWriterInternal* m_data; +}; + +/* +wxObjectXmlReader handles streaming in a class from XML +*/ + +class WXDLLIMPEXP_XML wxObjectXmlReader: public wxObjectReader +{ +public: + wxObjectXmlReader(wxXmlNode *parent) { m_parent = parent; } + virtual ~wxObjectXmlReader() {} + + // Reads a component from XML. The return value is the root object ID, which can + // then be used to ask the readercallback about that object + + virtual int ReadObject( const wxString &name, wxObjectReaderCallback *readercallback ); + +private: + int ReadComponent(wxXmlNode *parent, wxObjectReaderCallback *callbacks); + + // read the content of this node (simple type) and return the corresponding value + wxAny ReadValue(wxXmlNode *Node, const wxTypeInfo *type ); + + wxXmlNode * m_parent; +}; + +#endif // wxUSE_EXTENDED_RTTI + +#endif diff --git a/wxmsw/include/wx-3.0/wx/zipstrm.h b/wxmsw/include/wx-3.0/wx/zipstrm.h new file mode 100644 index 00000000..9cd76319 --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/zipstrm.h @@ -0,0 +1,574 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/zipstrm.h +// Purpose: Streams for Zip files +// Author: Mike Wetherell +// Copyright: (c) Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WXZIPSTREAM_H__ +#define _WX_WXZIPSTREAM_H__ + +#include "wx/defs.h" + +#if wxUSE_ZIPSTREAM + +#include "wx/archive.h" +#include "wx/filename.h" + +// some methods from wxZipInputStream and wxZipOutputStream stream do not get +// exported/imported when compiled with Mingw versions before 3.4.2. So they +// are imported/exported individually as a workaround +#if (defined(__GNUWIN32__) || defined(__MINGW32__)) \ + && (!defined __GNUC__ \ + || !defined __GNUC_MINOR__ \ + || !defined __GNUC_PATCHLEVEL__ \ + || __GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 30402) +#define WXZIPFIX WXDLLIMPEXP_BASE +#else +#define WXZIPFIX +#endif + +///////////////////////////////////////////////////////////////////////////// +// constants + +// Compression Method, only 0 (store) and 8 (deflate) are supported here +// +enum wxZipMethod +{ + wxZIP_METHOD_STORE, + wxZIP_METHOD_SHRINK, + wxZIP_METHOD_REDUCE1, + wxZIP_METHOD_REDUCE2, + wxZIP_METHOD_REDUCE3, + wxZIP_METHOD_REDUCE4, + wxZIP_METHOD_IMPLODE, + wxZIP_METHOD_TOKENIZE, + wxZIP_METHOD_DEFLATE, + wxZIP_METHOD_DEFLATE64, + wxZIP_METHOD_BZIP2 = 12, + wxZIP_METHOD_DEFAULT = 0xffff +}; + +// Originating File-System. +// +// These are Pkware's values. Note that Info-zip disagree on some of them, +// most notably NTFS. +// +enum wxZipSystem +{ + wxZIP_SYSTEM_MSDOS, + wxZIP_SYSTEM_AMIGA, + wxZIP_SYSTEM_OPENVMS, + wxZIP_SYSTEM_UNIX, + wxZIP_SYSTEM_VM_CMS, + wxZIP_SYSTEM_ATARI_ST, + wxZIP_SYSTEM_OS2_HPFS, + wxZIP_SYSTEM_MACINTOSH, + wxZIP_SYSTEM_Z_SYSTEM, + wxZIP_SYSTEM_CPM, + wxZIP_SYSTEM_WINDOWS_NTFS, + wxZIP_SYSTEM_MVS, + wxZIP_SYSTEM_VSE, + wxZIP_SYSTEM_ACORN_RISC, + wxZIP_SYSTEM_VFAT, + wxZIP_SYSTEM_ALTERNATE_MVS, + wxZIP_SYSTEM_BEOS, + wxZIP_SYSTEM_TANDEM, + wxZIP_SYSTEM_OS_400 +}; + +// Dos/Win file attributes +// +enum wxZipAttributes +{ + wxZIP_A_RDONLY = 0x01, + wxZIP_A_HIDDEN = 0x02, + wxZIP_A_SYSTEM = 0x04, + wxZIP_A_SUBDIR = 0x10, + wxZIP_A_ARCH = 0x20, + + wxZIP_A_MASK = 0x37 +}; + +// Values for the flags field in the zip headers +// +enum wxZipFlags +{ + wxZIP_ENCRYPTED = 0x0001, + wxZIP_DEFLATE_NORMAL = 0x0000, // normal compression + wxZIP_DEFLATE_EXTRA = 0x0002, // extra compression + wxZIP_DEFLATE_FAST = 0x0004, // fast compression + wxZIP_DEFLATE_SUPERFAST = 0x0006, // superfast compression + wxZIP_DEFLATE_MASK = 0x0006, + wxZIP_SUMS_FOLLOW = 0x0008, // crc and sizes come after the data + wxZIP_ENHANCED = 0x0010, + wxZIP_PATCH = 0x0020, + wxZIP_STRONG_ENC = 0x0040, + wxZIP_UNUSED = 0x0F80, + wxZIP_RESERVED = 0xF000 +}; + +// Forward decls +// +class WXDLLIMPEXP_FWD_BASE wxZipEntry; +class WXDLLIMPEXP_FWD_BASE wxZipInputStream; + + +///////////////////////////////////////////////////////////////////////////// +// wxZipNotifier + +class WXDLLIMPEXP_BASE wxZipNotifier +{ +public: + virtual ~wxZipNotifier() { } + + virtual void OnEntryUpdated(wxZipEntry& entry) = 0; +}; + + +///////////////////////////////////////////////////////////////////////////// +// Zip Entry - holds the meta data for a file in the zip + +class WXDLLIMPEXP_BASE wxZipEntry : public wxArchiveEntry +{ +public: + wxZipEntry(const wxString& name = wxEmptyString, + const wxDateTime& dt = wxDateTime::Now(), + wxFileOffset size = wxInvalidOffset); + virtual ~wxZipEntry(); + + wxZipEntry(const wxZipEntry& entry); + wxZipEntry& operator=(const wxZipEntry& entry); + + // Get accessors + wxDateTime GetDateTime() const { return m_DateTime; } + wxFileOffset GetSize() const { return m_Size; } + wxFileOffset GetOffset() const { return m_Offset; } + wxString GetInternalName() const { return m_Name; } + int GetMethod() const { return m_Method; } + int GetFlags() const { return m_Flags; } + wxUint32 GetCrc() const { return m_Crc; } + wxFileOffset GetCompressedSize() const { return m_CompressedSize; } + int GetSystemMadeBy() const { return m_SystemMadeBy; } + wxString GetComment() const { return m_Comment; } + wxUint32 GetExternalAttributes() const { return m_ExternalAttributes; } + wxPathFormat GetInternalFormat() const { return wxPATH_UNIX; } + int GetMode() const; + const char *GetLocalExtra() const; + size_t GetLocalExtraLen() const; + const char *GetExtra() const; + size_t GetExtraLen() const; + wxString GetName(wxPathFormat format = wxPATH_NATIVE) const; + + // is accessors + inline bool IsDir() const; + inline bool IsText() const; + inline bool IsReadOnly() const; + inline bool IsMadeByUnix() const; + + // set accessors + void SetDateTime(const wxDateTime& dt) { m_DateTime = dt; } + void SetSize(wxFileOffset size) { m_Size = size; } + void SetMethod(int method) { m_Method = (wxUint16)method; } + void SetComment(const wxString& comment) { m_Comment = comment; } + void SetExternalAttributes(wxUint32 attr ) { m_ExternalAttributes = attr; } + void SetSystemMadeBy(int system); + void SetMode(int mode); + void SetExtra(const char *extra, size_t len); + void SetLocalExtra(const char *extra, size_t len); + + inline void SetName(const wxString& name, + wxPathFormat format = wxPATH_NATIVE); + + static wxString GetInternalName(const wxString& name, + wxPathFormat format = wxPATH_NATIVE, + bool *pIsDir = NULL); + + // set is accessors + void SetIsDir(bool isDir = true); + inline void SetIsReadOnly(bool isReadOnly = true); + inline void SetIsText(bool isText = true); + + wxZipEntry *Clone() const { return ZipClone(); } + + void SetNotifier(wxZipNotifier& notifier); + void UnsetNotifier(); + +protected: + // Internal attributes + enum { TEXT_ATTR = 1 }; + + // protected Get accessors + int GetVersionNeeded() const { return m_VersionNeeded; } + wxFileOffset GetKey() const { return m_Key; } + int GetVersionMadeBy() const { return m_VersionMadeBy; } + int GetDiskStart() const { return m_DiskStart; } + int GetInternalAttributes() const { return m_InternalAttributes; } + + void SetVersionNeeded(int version) { m_VersionNeeded = (wxUint16)version; } + void SetOffset(wxFileOffset offset) { m_Offset = offset; } + void SetFlags(int flags) { m_Flags = (wxUint16)flags; } + void SetVersionMadeBy(int version) { m_VersionMadeBy = (wxUint8)version; } + void SetCrc(wxUint32 crc) { m_Crc = crc; } + void SetCompressedSize(wxFileOffset size) { m_CompressedSize = size; } + void SetKey(wxFileOffset offset) { m_Key = offset; } + void SetDiskStart(int start) { m_DiskStart = (wxUint16)start; } + void SetInternalAttributes(int attr) { m_InternalAttributes = (wxUint16)attr; } + + virtual wxZipEntry *ZipClone() const { return new wxZipEntry(*this); } + + void Notify(); + +private: + wxArchiveEntry* DoClone() const { return ZipClone(); } + + size_t ReadLocal(wxInputStream& stream, wxMBConv& conv); + size_t WriteLocal(wxOutputStream& stream, wxMBConv& conv) const; + + size_t ReadCentral(wxInputStream& stream, wxMBConv& conv); + size_t WriteCentral(wxOutputStream& stream, wxMBConv& conv) const; + + size_t ReadDescriptor(wxInputStream& stream); + size_t WriteDescriptor(wxOutputStream& stream, wxUint32 crc, + wxFileOffset compressedSize, wxFileOffset size); + + wxUint8 m_SystemMadeBy; // one of enum wxZipSystem + wxUint8 m_VersionMadeBy; // major * 10 + minor + + wxUint16 m_VersionNeeded; // ver needed to extract (20 i.e. v2.0) + wxUint16 m_Flags; + wxUint16 m_Method; // compression method (one of wxZipMethod) + wxDateTime m_DateTime; + wxUint32 m_Crc; + wxFileOffset m_CompressedSize; + wxFileOffset m_Size; + wxString m_Name; // in internal format + wxFileOffset m_Key; // the original offset for copied entries + wxFileOffset m_Offset; // file offset of the entry + + wxString m_Comment; + wxUint16 m_DiskStart; // for multidisk archives, not unsupported + wxUint16 m_InternalAttributes; // bit 0 set for text files + wxUint32 m_ExternalAttributes; // system specific depends on SystemMadeBy + + class wxZipMemory *m_Extra; + class wxZipMemory *m_LocalExtra; + + wxZipNotifier *m_zipnotifier; + class wxZipWeakLinks *m_backlink; + + friend class wxZipInputStream; + friend class wxZipOutputStream; + + DECLARE_DYNAMIC_CLASS(wxZipEntry) +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxZipOutputStream + +WX_DECLARE_LIST_WITH_DECL(wxZipEntry, wxZipEntryList_, class WXDLLIMPEXP_BASE); + +class WXDLLIMPEXP_BASE wxZipOutputStream : public wxArchiveOutputStream +{ +public: + wxZipOutputStream(wxOutputStream& stream, + int level = -1, + wxMBConv& conv = wxConvLocal); + wxZipOutputStream(wxOutputStream *stream, + int level = -1, + wxMBConv& conv = wxConvLocal); + virtual WXZIPFIX ~wxZipOutputStream(); + + bool PutNextEntry(wxZipEntry *entry) { return DoCreate(entry); } + + bool WXZIPFIX PutNextEntry(const wxString& name, + const wxDateTime& dt = wxDateTime::Now(), + wxFileOffset size = wxInvalidOffset); + + bool WXZIPFIX PutNextDirEntry(const wxString& name, + const wxDateTime& dt = wxDateTime::Now()); + + bool WXZIPFIX CopyEntry(wxZipEntry *entry, wxZipInputStream& inputStream); + bool WXZIPFIX CopyArchiveMetaData(wxZipInputStream& inputStream); + + void WXZIPFIX Sync(); + bool WXZIPFIX CloseEntry(); + bool WXZIPFIX Close(); + + void SetComment(const wxString& comment) { m_Comment = comment; } + + int GetLevel() const { return m_level; } + void WXZIPFIX SetLevel(int level); + +protected: + virtual size_t WXZIPFIX OnSysWrite(const void *buffer, size_t size); + virtual wxFileOffset OnSysTell() const { return m_entrySize; } + + // this protected interface isn't yet finalised + struct Buffer { const char *m_data; size_t m_size; }; + virtual wxOutputStream* WXZIPFIX OpenCompressor(wxOutputStream& stream, + wxZipEntry& entry, + const Buffer bufs[]); + virtual bool WXZIPFIX CloseCompressor(wxOutputStream *comp); + + bool IsParentSeekable() const + { return m_offsetAdjustment != wxInvalidOffset; } + +private: + void Init(int level); + + bool WXZIPFIX PutNextEntry(wxArchiveEntry *entry); + bool WXZIPFIX CopyEntry(wxArchiveEntry *entry, wxArchiveInputStream& stream); + bool WXZIPFIX CopyArchiveMetaData(wxArchiveInputStream& stream); + + bool IsOpened() const { return m_comp || m_pending; } + + bool DoCreate(wxZipEntry *entry, bool raw = false); + void CreatePendingEntry(const void *buffer, size_t size); + void CreatePendingEntry(); + + class wxStoredOutputStream *m_store; + class wxZlibOutputStream2 *m_deflate; + class wxZipStreamLink *m_backlink; + wxZipEntryList_ m_entries; + char *m_initialData; + size_t m_initialSize; + wxZipEntry *m_pending; + bool m_raw; + wxFileOffset m_headerOffset; + size_t m_headerSize; + wxFileOffset m_entrySize; + wxUint32 m_crcAccumulator; + wxOutputStream *m_comp; + int m_level; + wxFileOffset m_offsetAdjustment; + wxString m_Comment; + bool m_endrecWritten; + + wxDECLARE_NO_COPY_CLASS(wxZipOutputStream); +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxZipInputStream + +class WXDLLIMPEXP_BASE wxZipInputStream : public wxArchiveInputStream +{ +public: + typedef wxZipEntry entry_type; + + wxZipInputStream(wxInputStream& stream, wxMBConv& conv = wxConvLocal); + wxZipInputStream(wxInputStream *stream, wxMBConv& conv = wxConvLocal); + +#if WXWIN_COMPATIBILITY_2_6 && wxUSE_FFILE + wxZipInputStream(const wxString& archive, const wxString& file) + : wxArchiveInputStream(OpenFile(archive), wxConvLocal) { Init(file); } +#endif + + virtual WXZIPFIX ~wxZipInputStream(); + + bool OpenEntry(wxZipEntry& entry) { return DoOpen(&entry); } + bool WXZIPFIX CloseEntry(); + + wxZipEntry *GetNextEntry(); + + wxString WXZIPFIX GetComment(); + int WXZIPFIX GetTotalEntries(); + + virtual wxFileOffset GetLength() const { return m_entry.GetSize(); } + +protected: + size_t WXZIPFIX OnSysRead(void *buffer, size_t size); + wxFileOffset OnSysTell() const { return m_decomp ? m_decomp->TellI() : 0; } + +#if WXWIN_COMPATIBILITY_2_6 + wxFileOffset WXZIPFIX OnSysSeek(wxFileOffset seek, wxSeekMode mode); +#endif + + // this protected interface isn't yet finalised + virtual wxInputStream* WXZIPFIX OpenDecompressor(wxInputStream& stream); + virtual bool WXZIPFIX CloseDecompressor(wxInputStream *decomp); + +private: + void Init(); + void Init(const wxString& file); +#if WXWIN_COMPATIBILITY_2_6 && wxUSE_FFILE + static wxInputStream *OpenFile(const wxString& archive); +#endif + + wxArchiveEntry *DoGetNextEntry() { return GetNextEntry(); } + + bool WXZIPFIX OpenEntry(wxArchiveEntry& entry); + + wxStreamError ReadLocal(bool readEndRec = false); + wxStreamError ReadCentral(); + + wxUint32 ReadSignature(); + bool FindEndRecord(); + bool LoadEndRecord(); + + bool AtHeader() const { return m_headerSize == 0; } + bool AfterHeader() const { return m_headerSize > 0 && !m_decomp; } + bool IsOpened() const { return m_decomp != NULL; } + + wxZipStreamLink *MakeLink(wxZipOutputStream *out); + + bool DoOpen(wxZipEntry *entry = NULL, bool raw = false); + bool OpenDecompressor(bool raw = false); + + class wxStoredInputStream *m_store; + class wxZlibInputStream2 *m_inflate; + class wxRawInputStream *m_rawin; + wxZipEntry m_entry; + bool m_raw; + size_t m_headerSize; + wxUint32 m_crcAccumulator; + wxInputStream *m_decomp; + bool m_parentSeekable; + class wxZipWeakLinks *m_weaklinks; + class wxZipStreamLink *m_streamlink; + wxFileOffset m_offsetAdjustment; + wxFileOffset m_position; + wxUint32 m_signature; + size_t m_TotalEntries; + wxString m_Comment; + + friend bool wxZipOutputStream::CopyEntry( + wxZipEntry *entry, wxZipInputStream& inputStream); + friend bool wxZipOutputStream::CopyArchiveMetaData( + wxZipInputStream& inputStream); + +#if WXWIN_COMPATIBILITY_2_6 + bool m_allowSeeking; + friend class wxArchiveFSHandler; +#endif + + wxDECLARE_NO_COPY_CLASS(wxZipInputStream); +}; + + +///////////////////////////////////////////////////////////////////////////// +// Iterators + +#if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR +typedef wxArchiveIterator wxZipIter; +typedef wxArchiveIterator > wxZipPairIter; +#endif + + +///////////////////////////////////////////////////////////////////////////// +// wxZipClassFactory + +class WXDLLIMPEXP_BASE wxZipClassFactory : public wxArchiveClassFactory +{ +public: + typedef wxZipEntry entry_type; + typedef wxZipInputStream instream_type; + typedef wxZipOutputStream outstream_type; + typedef wxZipNotifier notifier_type; +#if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR + typedef wxZipIter iter_type; + typedef wxZipPairIter pairiter_type; +#endif + + wxZipClassFactory(); + + wxZipEntry *NewEntry() const + { return new wxZipEntry; } + wxZipInputStream *NewStream(wxInputStream& stream) const + { return new wxZipInputStream(stream, GetConv()); } + wxZipOutputStream *NewStream(wxOutputStream& stream) const + { return new wxZipOutputStream(stream, -1, GetConv()); } + wxZipInputStream *NewStream(wxInputStream *stream) const + { return new wxZipInputStream(stream, GetConv()); } + wxZipOutputStream *NewStream(wxOutputStream *stream) const + { return new wxZipOutputStream(stream, -1, GetConv()); } + + wxString GetInternalName(const wxString& name, + wxPathFormat format = wxPATH_NATIVE) const + { return wxZipEntry::GetInternalName(name, format); } + + const wxChar * const *GetProtocols(wxStreamProtocolType type + = wxSTREAM_PROTOCOL) const; + +protected: + wxArchiveEntry *DoNewEntry() const + { return NewEntry(); } + wxArchiveInputStream *DoNewStream(wxInputStream& stream) const + { return NewStream(stream); } + wxArchiveOutputStream *DoNewStream(wxOutputStream& stream) const + { return NewStream(stream); } + wxArchiveInputStream *DoNewStream(wxInputStream *stream) const + { return NewStream(stream); } + wxArchiveOutputStream *DoNewStream(wxOutputStream *stream) const + { return NewStream(stream); } + +private: + DECLARE_DYNAMIC_CLASS(wxZipClassFactory) +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxZipEntry inlines + +inline bool wxZipEntry::IsText() const +{ + return (m_InternalAttributes & TEXT_ATTR) != 0; +} + +inline bool wxZipEntry::IsDir() const +{ + return (m_ExternalAttributes & wxZIP_A_SUBDIR) != 0; +} + +inline bool wxZipEntry::IsReadOnly() const +{ + return (m_ExternalAttributes & wxZIP_A_RDONLY) != 0; +} + +inline bool wxZipEntry::IsMadeByUnix() const +{ + const int pattern = + (1 << wxZIP_SYSTEM_OPENVMS) | + (1 << wxZIP_SYSTEM_UNIX) | + (1 << wxZIP_SYSTEM_ATARI_ST) | + (1 << wxZIP_SYSTEM_ACORN_RISC) | + (1 << wxZIP_SYSTEM_BEOS) | (1 << wxZIP_SYSTEM_TANDEM); + + // note: some unix zippers put madeby = dos + return (m_SystemMadeBy == wxZIP_SYSTEM_MSDOS + && (m_ExternalAttributes & ~0xFFFF)) + || ((pattern >> m_SystemMadeBy) & 1); +} + +inline void wxZipEntry::SetIsText(bool isText) +{ + if (isText) + m_InternalAttributes |= TEXT_ATTR; + else + m_InternalAttributes &= ~TEXT_ATTR; +} + +inline void wxZipEntry::SetIsReadOnly(bool isReadOnly) +{ + if (isReadOnly) + SetMode(GetMode() & ~0222); + else + SetMode(GetMode() | 0200); +} + +inline void wxZipEntry::SetName(const wxString& name, + wxPathFormat format /*=wxPATH_NATIVE*/) +{ + bool isDir; + m_Name = GetInternalName(name, format, &isDir); + SetIsDir(isDir); +} + + +#endif // wxUSE_ZIPSTREAM + +#endif // _WX_WXZIPSTREAM_H__ diff --git a/wxmsw/include/wx-3.0/wx/zstream.h b/wxmsw/include/wx-3.0/wx/zstream.h new file mode 100644 index 00000000..193bb79d --- /dev/null +++ b/wxmsw/include/wx-3.0/wx/zstream.h @@ -0,0 +1,148 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/zstream.h +// Purpose: Memory stream classes +// Author: Guilhem Lavaux +// Modified by: Mike Wetherell +// Created: 11/07/98 +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// +#ifndef _WX_WXZSTREAM_H__ +#define _WX_WXZSTREAM_H__ + +#include "wx/defs.h" + +#if wxUSE_ZLIB && wxUSE_STREAMS + +#include "wx/stream.h" +#include "wx/versioninfo.h" + +// Compression level +enum wxZlibCompressionLevels { + wxZ_DEFAULT_COMPRESSION = -1, + wxZ_NO_COMPRESSION = 0, + wxZ_BEST_SPEED = 1, + wxZ_BEST_COMPRESSION = 9 +}; + +// Flags +enum wxZLibFlags { + wxZLIB_NO_HEADER = 0, // raw deflate stream, no header or checksum + wxZLIB_ZLIB = 1, // zlib header and checksum + wxZLIB_GZIP = 2, // gzip header and checksum, requires zlib 1.2.1+ + wxZLIB_AUTO = 3 // autodetect header zlib or gzip +}; + +class WXDLLIMPEXP_BASE wxZlibInputStream: public wxFilterInputStream { + public: + wxZlibInputStream(wxInputStream& stream, int flags = wxZLIB_AUTO); + wxZlibInputStream(wxInputStream *stream, int flags = wxZLIB_AUTO); + virtual ~wxZlibInputStream(); + + char Peek() { return wxInputStream::Peek(); } + wxFileOffset GetLength() const { return wxInputStream::GetLength(); } + + static bool CanHandleGZip(); + + bool SetDictionary(const char *data, const size_t datalen); + bool SetDictionary(const wxMemoryBuffer &buf); + + protected: + size_t OnSysRead(void *buffer, size_t size); + wxFileOffset OnSysTell() const { return m_pos; } + + private: + void Init(int flags); + + protected: + size_t m_z_size; + unsigned char *m_z_buffer; + struct z_stream_s *m_inflate; + wxFileOffset m_pos; + + wxDECLARE_NO_COPY_CLASS(wxZlibInputStream); +}; + +class WXDLLIMPEXP_BASE wxZlibOutputStream: public wxFilterOutputStream { + public: + wxZlibOutputStream(wxOutputStream& stream, int level = -1, int flags = wxZLIB_ZLIB); + wxZlibOutputStream(wxOutputStream *stream, int level = -1, int flags = wxZLIB_ZLIB); + virtual ~wxZlibOutputStream() { Close(); } + + void Sync() { DoFlush(false); } + bool Close(); + wxFileOffset GetLength() const { return m_pos; } + + static bool CanHandleGZip(); + + bool SetDictionary(const char *data, const size_t datalen); + bool SetDictionary(const wxMemoryBuffer &buf); + + protected: + size_t OnSysWrite(const void *buffer, size_t size); + wxFileOffset OnSysTell() const { return m_pos; } + + virtual void DoFlush(bool final); + + private: + void Init(int level, int flags); + + protected: + size_t m_z_size; + unsigned char *m_z_buffer; + struct z_stream_s *m_deflate; + wxFileOffset m_pos; + + wxDECLARE_NO_COPY_CLASS(wxZlibOutputStream); +}; + +class WXDLLIMPEXP_BASE wxZlibClassFactory: public wxFilterClassFactory +{ +public: + wxZlibClassFactory(); + + wxFilterInputStream *NewStream(wxInputStream& stream) const + { return new wxZlibInputStream(stream); } + wxFilterOutputStream *NewStream(wxOutputStream& stream) const + { return new wxZlibOutputStream(stream, -1); } + wxFilterInputStream *NewStream(wxInputStream *stream) const + { return new wxZlibInputStream(stream); } + wxFilterOutputStream *NewStream(wxOutputStream *stream) const + { return new wxZlibOutputStream(stream, -1); } + + const wxChar * const *GetProtocols(wxStreamProtocolType type + = wxSTREAM_PROTOCOL) const; + +private: + DECLARE_DYNAMIC_CLASS(wxZlibClassFactory) +}; + +class WXDLLIMPEXP_BASE wxGzipClassFactory: public wxFilterClassFactory +{ +public: + wxGzipClassFactory(); + + wxFilterInputStream *NewStream(wxInputStream& stream) const + { return new wxZlibInputStream(stream); } + wxFilterOutputStream *NewStream(wxOutputStream& stream) const + { return new wxZlibOutputStream(stream, -1); } + wxFilterInputStream *NewStream(wxInputStream *stream) const + { return new wxZlibInputStream(stream); } + wxFilterOutputStream *NewStream(wxOutputStream *stream) const + { return new wxZlibOutputStream(stream, -1); } + + const wxChar * const *GetProtocols(wxStreamProtocolType type + = wxSTREAM_PROTOCOL) const; + +private: + DECLARE_DYNAMIC_CLASS(wxGzipClassFactory) +}; + +WXDLLIMPEXP_BASE wxVersionInfo wxGetZlibVersionInfo(); + +#endif + // wxUSE_ZLIB && wxUSE_STREAMS + +#endif + // _WX_WXZSTREAM_H__ + diff --git a/wxmsw/lib/libwx_baseu-3.0.a b/wxmsw/lib/libwx_baseu-3.0.a new file mode 100644 index 00000000..1757e15e Binary files /dev/null and b/wxmsw/lib/libwx_baseu-3.0.a differ diff --git a/wxmsw/lib/libwx_baseu_net-3.0.a b/wxmsw/lib/libwx_baseu_net-3.0.a new file mode 100644 index 00000000..6be79c92 Binary files /dev/null and b/wxmsw/lib/libwx_baseu_net-3.0.a differ diff --git a/wxmsw/lib/libwx_gtk2u_adv-3.0.a b/wxmsw/lib/libwx_gtk2u_adv-3.0.a new file mode 100644 index 00000000..ff2ee387 Binary files /dev/null and b/wxmsw/lib/libwx_gtk2u_adv-3.0.a differ diff --git a/wxmsw/lib/libwx_gtk2u_aui-3.0.a b/wxmsw/lib/libwx_gtk2u_aui-3.0.a new file mode 100644 index 00000000..56fad0a3 Binary files /dev/null and b/wxmsw/lib/libwx_gtk2u_aui-3.0.a differ diff --git a/wxmsw/lib/libwx_gtk2u_core-3.0.a b/wxmsw/lib/libwx_gtk2u_core-3.0.a new file mode 100644 index 00000000..99077ea6 Binary files /dev/null and b/wxmsw/lib/libwx_gtk2u_core-3.0.a differ diff --git a/wxmsw/lib/libwx_gtk2u_html-3.0.a b/wxmsw/lib/libwx_gtk2u_html-3.0.a new file mode 100644 index 00000000..55c005d9 Binary files /dev/null and b/wxmsw/lib/libwx_gtk2u_html-3.0.a differ diff --git a/wxmsw/lib/wx/config/gtk2-unicode-static-3.0 b/wxmsw/lib/wx/config/gtk2-unicode-static-3.0 new file mode 100755 index 00000000..8afcf455 --- /dev/null +++ b/wxmsw/lib/wx/config/gtk2-unicode-static-3.0 @@ -0,0 +1,1389 @@ +#!/bin/sh +# +# Name: wx-config{.in,} +# Purpose: wx configuration search and query tool {template,} +# Author: Ron +# Modified by: +# Created: 8/9/2004 +# Copyright: (c) 2004 Ron +# Essentially a fresh start this time around, but for maximum +# compatibility basic code was taken from, and heavy reference +# made to, the previously unattributed wx-config from cvs. +# All the usual suspects contributed to the dicussion that led +# to this new work and likewise to the ideas and content in the +# original (which was probably influenced by gtk), among them: +# Robert Roebling, Vadim Zeitlin, Vaclav Slavik, Robin Dunn +# Licence: wxWindows licence +############################################################################ + +# Extra^2 debug mode, for if things ever get really weird. +[ -z "$WXDEBUG_X" ] || set -x + + +# On with some basic stuff, like the ability to die gracefully, +# and to tell people what we are about. +# ------------------------------------------------------------------ + +# decho _message +# Output a message to stderr. +decho() { echo "$*" 1>&2; } + +# usage _exitcode +# Outputs a usage message to stderr and exits with _exitcode. +# Try to keep this to a single page (ie. < 25 lines). We can add +# alternate or interactive help targets if people want more detail. +# +# Exit codes are now subject to a more strict interpretation. +# wx-config should return 0 upon successful operation, 1 if the +# reqested operation could not be completed successfully, and 2 +# if the requested operation is not supported by this version of +# wx-config. +usage() +{ + cat 1>&2 < /dev/null && ls | grep -v "^inplace-"` + +is_cross && target="" + +# Define a pseudo-hash to contain the specification of this wx-config +# instance and its associated library. +this_host="${target:+${target}}" +this_toolkit="gtk2" +this_widgetset="" +this_chartype="unicode" +this_debugtype="release" +this_flavour="" +this_version="3.0" +this_linkage=`[ "x0" = "x1" ] || echo 'static'` + + +# Extract the user specification from the options parsed. +m_host=${input_option_host:+"${input_option_host}-?"} +m_host=${m_host:-$this_host} +m_toolkit=${input_option_toolkit:-'[^-]+'} +m_widgetset=${input_option_widgetset-'(univ)?'} +m_chartype=${input_option_chartype:-'(unicode|ansi)'} +m_debugtype=${input_option_debugtype:-'(debug|release)'} +m_flavour=${input_option_flavour:+-$input_option_flavour} +m_flavour=${m_flavour:-${input_option_flavour-'(-[^-]+)?'}} +m_version=${input_option_version:-'[0-9]+\.[0-9]+'} +m_linkage=${input_option_linkage-'?(static)?'} + +# Test whether or not --version has been specified +# +# This must be done after getting the input options so get_mask works correctly +# since it is version-dependent + +if [ -z "$input_option_version" ]; then + m_ourversion="2.9" +else + m_ourversion=$m_version +fi + +this_config=`get_mask this` + +configmask="^`get_mask`$" + + +# Dump the user specification in debug mode. +if [ -n "$WXDEBUG" ]; then + + decho + decho " prefix = '$prefix'" + decho " exec_prefix = '$exec_prefix'" + decho " wxconfdir = '$wxconfdir'" + + decho " m_host = '$m_host'" + decho " m_toolkit = '$m_toolkit'" + decho " m_widgetset = '$m_widgetset'" + decho " m_chartype = '$m_chartype'" + decho " m_debugtype = '$m_debugtype'" + decho " m_flavour = '$m_flavour'" + decho " m_version = '$m_version'" + decho " m_linkage = '$m_linkage'" + + decho " configmask = '$configmask'" + decho " this config = '$this_config'" + decho + +fi + + + +# From here on, we'll need to be able to figure out a delegation target. +# ----------------------------------------------------------------------- + +# The rules for delegation are: +# +# 1. If the specification is so general that it matches the default config +# (ie. this one on a first pass), then the default config will be used +# even if other installed libs would also match the spec. +# +# 2. If the default config does not match, find a list of all installed +# libraries that do match. +# a. If that list is empty, the specification is incompatible +# with any installed lib. Warn and abort. +# b. If that list contains exactly one candidate. Delegate to +# that candidate. +# c. If the list contains multiple candidates, pass on to step 3. +# +# 3. Attempt to discriminate among rival candidates by their similarity +# to the default configuration (ie. this one). If we can find a unique +# candidate in this way, delegate to it. If not, present a list of +# options to the user and request that they disambiguate it with one or +# more additional fields. +# +# To refine the specified pattern, we specialise each unbound field +# using the default value from this config file. If that results in +# no matches, we unbind it again and try the next field. If it still +# results in multiple matches we try binding the next field as well +# until a unique or null result again occurs. +# +# A more general way to look at this, is the feature specifiers are all +# modifiers of the wx-config you are calling. If you supply none, the +# default for that build configuration will be used. If you supply one +# or more that the default build cannot satisfy, it will try to find the +# config most like itself with the desired feature(s) enabled. +# The features configured into the first wx-config called will be taken +# as implicitly specified if it is necessary to disambiguate likely +# candidates from the information that was explicitly provided. + + +# But first, more sugar to keep what follows clear and legible. +# -------------------------------------------------------------- + +# find_eligible_delegates _mask +# Outputs all the config files installed which match the +# (extended regex) _mask passed as an argument. +find_eligible_delegates() { echo "$installed_configs" | $EGREP "$1" 2> /dev/null; } + +# user_mask_fits _config +# Returns true if the string _config satisfies the user specified mask. +user_mask_fits() { echo "$1" | $EGREP "$configmask" > /dev/null 2>&1; } + +# count_fields _word +# Returns the number of IFS split fields in _word +count_fields() { return $#; } + +# count_delegates _mask +# Return the number of eligible config files that match _mask +count_delegates() { count_fields `find_eligible_delegates $1`; } + +# is_set _variablename +# Returns true if $_variablename is initialised. +is_set() { [ "x`eval echo \"\\\${$1-unset}\"`" != "xunset" ]; } + +# not _cmd _args... +# true iff _cmd is false +not() { if "$@"; then false; else true; fi; } + +# do_find_best_delegate _unbound-options +# The real worker part of find_best_delegate below. Recurses though all +# unbound options binding them one at a time to the default derived from +# this file until a unique match is made or no alternatives remain that +# may be sensibly guessed at. It will preferentially bind the unspecified +# options in the order they are listed in wxconfig_schema. Using this +# partial ordering it should find the first match with the most significant +# similarity to this file that unambiguously meets the user specification. +# If such a match exists it will be output to stdout. +# +# Be careful if you modify this function. If the pruning logic is rendered +# inoperative it will simply recurse over every permutation in the search +# space, which may still appear to work, but add a couple more options (or +# explicitly specify a few less) and you may not live long enough to learn +# the result. WXDEBUG=findprogress is your friend here, it will show you +# how many nodes get searched before a result. If you start seeing +# increases in that number for the same input, check your work. +# Raising the number of discriminating options from 6 to 8 raised the worst +# case time for this to run (without pruning) from 3 to nearly 15 seconds +# and its downhill fast from here if we have to ride that boat. +# Early pruning still gets that down to under half a second (up from about +# .25), so we have some breathing space yet before a different search method +# will be called for, but let's not squander it. +do_find_best_delegate() +{ + ( + if [ "x$WXDEBUG" = "xverbose" ]; then + _fbd_indent="${_fbd_indent}. " + decho " $_fbd_indent---> unbound options: $*" + fi + + for i do + + if [ "x$WXDEBUG" = "xverbose" ]; then + decho " ${_fbd_indent}binding '$i' with '`remove_field $i $*`' still free" + [ -z "$_pruned" ] || decho " ${_fbd_indent} --- pruned: $_pruned ---" + fi + + if ( + eval m_$i=\$this_$i + _mask="^`get_mask`$" + + if [ "x$WXDEBUG" = "xverbose" ]; then + decho " ${_fbd_indent} checking: $_mask" + count_delegates "$_mask" + decho " $_fbd_indent $? eligible delegates" + for d in `find_eligible_delegates "$_mask"`; do + decho " ${_fbd_indent} $d" + done + fi + + count_delegates "$_mask" + _still_eligible=$? + + if [ $_still_eligible -eq 1 ]; then + echo `find_eligible_delegates "$_mask"` + return + fi + + [ "x$WXDEBUG" != "xfindprogress" ] || printf "." 1>&2 + + [ $_still_eligible -gt 1 ] && [ $# -gt 1 ] && + do_find_best_delegate `remove_field $i $*` + ) + then + + return + + elif [ $# -gt 1 ]; then + + if [ "x$WXDEBUG" = "xverbose" ]; then + decho " ${_fbd_indent}pruning: $i" + _pruned="${_pruned:+$_pruned }$i" + fi + set `remove_field $i $*` + + fi + + done + false + ) +} + +# find_best_delegate +# A simple wrapper around do_find_best_delegate that first determines +# the unbound options (ie. the ones that the user did not explicitly +# declare a preference for on the command line) +find_best_delegate() +{ + for _fbdi in $wxconfig_schema; do + is_set input_option_$_fbdi || + _unbound_options="${_unbound_options:+$_unbound_options }$_fbdi" + done + do_find_best_delegate $_unbound_options +} + + +# Legacy wx-config helpers. +# ------------------------- + +# get_legacy_mask +# Returns a mask in the format used by wx2.4. +get_legacy_mask() +{ + [ $# -gt 0 ] || set m + eval [ "x\${$1_chartype}" != "xunicode" ] || _unicode_flag=u + eval echo "wx\${$1_toolkit}${_unicode_flag}-\${$1_version}\${$1_host}-config" +} + +# find_legacy_configs +# Returns a list of configs installed by wx2.4 releases. +find_legacy_configs() +{ + ( + cd "$prefix/bin" && + { + ls wx*-2.4-config | grep -v ^wxbase + ls wx*-2.4-config | grep ^wxbase + } + ) 2> /dev/null +} + +# find_best_legacy_config +# Returns the best legacy config for a given specification. +# This assumes no matching new style config has been found. +find_best_legacy_config() +{ + _legacy_configs=`find_legacy_configs` + if [ -n "$_legacy_configs" ]; then + _legacy_mask=`get_legacy_mask` + for d in $_legacy_configs; do + if echo $d | $EGREP $_legacy_mask > /dev/null 2>&1 ; then + echo "$d" + return + fi + done + fi + false +} + + + +# The only action we can perform authoritatively prior to delegation +# is to list all the possible delegates. +# -------------------------------------------------------------- + +config_spec="$0 $*" +[ -z "$WXDEBUG" ] || config_spec=$configmask + +# Next chance for another satisfied customer then +# +# If we want to get really polished here we can do plural checking, +# but we should probably leave that until the day we gettextise it. +if [ -n "$output_option_list" ]; then + + _remains_in_prefix=$installed_configs + _delegates=`find_eligible_delegates $configmask` + _best_delegate=`find_best_delegate` + + if [ "x$WXDEBUG" = "xverbose" ]; then + decho + decho " all = $_remains_in_prefix" + decho " matching = $_delegates" + decho " best = $_best_delegate" + decho " this = $this_config" + fi + + for d in $_delegates; do + _remains_in_prefix=`remove_field $d $_remains_in_prefix` + done + + echo + echo " Default config is $this_config" + echo + + if user_mask_fits "$this_config" ; then + + echo " Default config ${this_exec_prefix+in $this_exec_prefix }will be used for output" + + if match_field "$this_config" $_delegates ; then + _delegates=`remove_field $this_config $_delegates` + else + echo " though it is not installed in: $prefix" + if [ -n "$_best_delegate" ] && [ "x$_best_delegate" != "x$this_config" ]; then + echo + echo " Best alternate in $prefix:" + echo " $_best_delegate" + fi + fi + + elif [ -n "$_best_delegate" ]; then + + echo " Specification best match: $_best_delegate" + + elif [ -z "$_delegates" ]; then + + _last_chance=`find_best_legacy_config` + if [ -n "$_last_chance" ]; then + + echo " Specification matches legacy config: $_last_chance" + + else + + cat <<-EOF + No config found to match: $config_spec + in $wxconfdir + + Please install the desired library build, or specify a different + prefix where it may be found. If the library is not installed + you may call its wx-config directly by specifying its full path. + +EOF + + fi + + else + echo " Specification was ambiguous. Use additional feature options" + echo " to choose between alternate matches." + fi + + _delegates=`remove_field "$_best_delegate" $_delegates` + + if [ -n "$_delegates" ]; then + echo + echo " Alternate matches:" + for d in $_delegates; do + echo " $d" + done + fi + if [ -n "$_remains_in_prefix" ]; then + echo + echo " Also available in $prefix:" + for d in $_remains_in_prefix; do + echo " $d" + done + fi + + _legacy_configs=`find_legacy_configs` + if [ -n "$_legacy_configs" ]; then + echo + echo " Legacy configs available in $prefix:" + for d in $_legacy_configs; do + echo " $d" | sed 's/-config$//' + done + fi + + echo + exit +fi + + + +# ... so if that wasn't what they wanted, then we need to know for +# certain, can this config satisfy the user specification? +# -------------------------------------------------------------- + +if not user_mask_fits "$this_config" ; then + + # No? Then let's see if it knows anybody who can. + # But first, just be sure someone hasn't typo'd us into a loop. + # In present day wx, correct delegation should never need more + # than one hop so this is trivial to detect. + + if [ -n "$WXCONFIG_DELEGATED" ]; then + decho + decho " *** Error: Bad config delegation" + decho + decho " to: $0" + decho " ($this_config) cannot satisfy:" + decho " $config_spec" + decho " Someone has been terribly careless." + decho + exit 1 + fi + + count_delegates "$configmask" + _numdelegates=$? + + if [ -n "$WXDEBUG" ]; then + decho " must delegate to an alternate config" + decho " potential delegates ($_numdelegates):" + for i in `find_eligible_delegates "$configmask"`; do + decho " $i" + done + fi + + if [ $_numdelegates -eq 0 ]; then + + _last_chance=`find_best_legacy_config` + if [ -n "$_last_chance" ]; then + + for arg do + case "$arg" in + --prefix*|--exec-prefix*| \ + --version|--release|--basename| \ + --static|--libs|--gl_libs| \ + --cppflags|--cflags|--cxxflags| \ + --cc|--cxx|--ld| \ + --rezflags|--inplace) + _legacy_args="$_legacy_args $arg" + ;; + + --static|--static=y*|--static=Y*) + _legacy_args="$_legacy_args --static" + ;; + esac + done + + if [ -n "$WXDEBUG" ]; then + decho " found a suitable legacy delegate: $_last_chance" + decho "--> $prefix/bin/$_last_chance $_legacy_args" + fi + + WXCONFIG_DELEGATED=yes + export WXCONFIG_DELEGATED + $prefix/bin/$_last_chance $_legacy_args + exit + + else + + cat 1>&2 <<-EOF + + Warning: No config found to match: $config_spec + in $wxconfdir + If you require this configuration, please install the desired + library build. If this is part of an automated configuration + test and no other errors occur, you may safely ignore it. + You may use wx-config --list to see all configs available in + the default prefix. + +EOF + + # PIPEDREAM: from here we are actually just a teensy step + # from simply building the missing config for the user + # on the fly if this is an in tree wx-config. + + exit 1 + fi + fi + + if [ $_numdelegates -gt 1 ]; then + + [ -z "$WXDEBUG" ] || decho " must prune the list of eligible delegates" + + best_delegate=`find_best_delegate` + + if [ -n "$best_delegate" ]; then + + if [ -n "$WXDEBUG" ]; then + decho " found a suitable delegate: $best_delegate" + decho "--> $wxconfdir/$best_delegate $*" + fi + + WXCONFIG_DELEGATED=yes + export WXCONFIG_DELEGATED + $wxconfdir/$best_delegate $* + exit + fi + + decho + decho " *** Error: Specification is ambiguous" + decho " as $config_spec" + decho " Use additional feature options to choose between:" + for i in `find_eligible_delegates "$configmask"`; do + decho " $i" + done + decho + + exit 1 + fi + + if [ -n "$WXDEBUG" ]; then + decho " using the only suitable delegate" + decho "--> $wxconfdir/`find_eligible_delegates $configmask` $*" + fi + + WXCONFIG_DELEGATED=yes + export WXCONFIG_DELEGATED + $wxconfdir/`find_eligible_delegates $configmask` $* + exit +fi + + + +# If we are still here, then from now on we are responsible for +# all the user's needs. Time to rustle up some output for them. +# -------------------------------------------------------------- + +[ -z "$WXDEBUG" ] || decho " using this config" + +# If the user supplied a prefix, and the in tree config did not +# delegate out to anything in that prefix, then reset the build +# tree prefix to provide the correct output for using this +# uninstalled wx build. Or put more simply: +prefix=${this_prefix-$prefix} +exec_prefix=${this_exec_prefix-$exec_prefix} + +includedir="${prefix}/include" +libdir="${exec_prefix}/lib" +bindir="${exec_prefix}/bin" + +# Trivial queries we can answer now. +[ -z "$output_option_prefix" ] || echo $prefix +[ -z "$output_option_exec_prefix" ] || echo $exec_prefix +[ -z "$output_option_release" ] || echo "3.0" +[ -z "$output_option_version" ] || echo "3.0.0" +[ -z "$output_option_version_full" ] || echo "3.0.0.0" +[ -z "$output_option_basename" ] || echo "wx_gtk2u" +[ -z "$output_option_cc" ] || echo "gcc" +[ -z "$output_option_cxx" ] || echo "g++" +[ -z "$output_option_ld" ] || echo "g++ -o" +[ -z "$flag_option_selected_config" ] || echo "$this_config" + +for q in $query_options; do + eval echo "\$this_$q" +done + +# --rezflags is deprecated and disabled (2005/11/29) +if [ -n "$output_option_rezflags" ]; then + echo "@true" + decho "Warning: --rezflags, along with Mac OS classic resource building" \ + "is deprecated. You should remove this from your Makefile and" \ + "build .app bundles instead." +fi + + +# The rest are going to need a little more work. +# -------------------------------------------------------------- + +is_monolithic() { [ "x0" = "x1" ]; } +is_static() { [ -n "$this_linkage" ]; } +is_installed() { [ -z "$this_prefix" ]; } + + +# Is the user after a support utility? +# If this is a cross build, we need to find and return a suitable +# native utility for the job, so we search: +# +# 1. local build dir (for native uninstalled builds only). +# 2. (optional) user supplied prefix. +# 3. configured install prefix. +# 4. environment $PATH. +# +# and if such a thing still cannot be found, exit signalling an error. +if [ -n "$input_option_utility" ]; then + + # This is dumb, in tree binaries should be in a standard location + # like the libs, but work with what we've got for now. + is_cross || _util="$exec_prefix/utils/$input_option_utility/$input_option_utility" + + if not is_installed && [ -x "$_util" ]; then + is_static || _preload="eval LD_LIBRARY_PATH=$exec_prefix/lib" + echo $_preload $_util + exit + fi + + IFS=':' + _user_prefix=${input_option_exec_prefix:-$input_option_prefix} + + for _util in "${input_option_utility}-3.0" \ + "${input_option_utility}-3.0" \ + "${input_option_utility}" + do + for p in ${_user_prefix:+$_user_prefix/bin} $bindir $PATH; do + + [ -z "$WXDEBUG" ] || decho " checking for: '$p/$_util'" + + if [ -x "$p/$_util" ]; then + echo "$p/$_util" + exit + fi + + done + done + exit 1 + +fi + + +# Still here? Then get the options together for building an app. +# ---------------------------------------------------------------- + +# Additional configuration for individual library components. +ldflags_gl="" + +ldlibs_base="-lwxregexu-3.0 -lz -ldl -lm" +ldlibs_core="-lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lfontconfig -lfreetype -lgthread-2.0 -pthread -lglib-2.0 -lX11 -lXxf86vm -lSM -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype -lnotify -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lwebkitgtk-1.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lpangoft2-1.0 -lpango-1.0 -lfontconfig -lfreetype -lsoup-2.4 -lgio-2.0 -lgobject-2.0 -ljavascriptcoregtk-1.0 -lglib-2.0 -lpng -lz -ljpeg -ltiff" +ldlibs_gl="-lGL -lGLU" +ldlibs_html="" +ldlibs_xml=" -lexpat" +ldlibs_adv="" +ldlibs_stc="-lwxscintilla-3.0" + + +# Order the libraries passed to us correctly for static linking. +# +# While the libraries order doesn't matter when linking dynamically, we must +# put the libraries depending on other libraries in front of their dependencies +# when linking statically or the dependencies wouldn't be resolved by the +# standard UNIX linkers. +order_libs() +{ + if is_static; then + for lib do + # Distinguish between the libraries that may need to be moved to + # the end of the list (because other ones may depend on them) and + # those that can be output immediately because no other libraries + # depend on them. + case "$lib" in + base|core|html|xml|adv) eval "use_$lib=1" ;; + *) libs="$libs $lib" ;; + esac + done + + # Add the libraries that we postponed adding above. + # Order of the checks here is important. + [ -z "$use_html" ] || libs="$libs html" + [ -z "$use_adv" ] || libs="$libs adv" + [ -z "$use_core" ] || libs="$libs core" + [ -z "$use_xml" ] || libs="$libs xml" + [ -z "$use_base" ] || libs="$libs base" + else + # No need to order them. + libs="$@" + fi + + echo $libs +} + +# lib_flags_for _liblist +# This function returns a list of flags suitable to return with the +# output of --libs for all of the libraries in _liblist. You can +# add support for a new library by adding an entry for it in the +# psuedo-hashes above if it requires additional linker options. +lib_flags_for() +{ + [ -z "$WXDEBUG" ] || decho " fetching lib flags for: '$*'" + + _all_ldflags='' + _all_libs='' + _wxlibs='' + + is_cross && _target="-${target}" + + for lib do + + # We evidently can't trust people not to duplicate things in + # configure, or to keep them in any sort of sane order overall, + # so only add unique new fields here even if it takes us a while. + # In the case of libs, we bubble any duplicates to the end, + # because if multiple libs require it, static linking at least + # will require it to come after all of them. So long as local + # order is ok in configure then we should always be able to + # massage a correct result here like this. + # + # FIXME: ldlibs_core is totally bogus. Fix the duplication + # there independently of this. This covers for it, but we + # want to do this anyway because some libs may share common + # deps without a common ancestor in wx. This is not a licence + # for sloppy work elsewhere though and @GUI_TK_LIBRARY should + # be fixed. + + for f in `eval echo \"\\\$ldflags_$lib\"`; do + match_field "$f" $_all_ldflags || _all_ldflags="$_all_ldflags $f" + done + + if match_field "$lib" xml net base ; then + _libname="wx_baseu" + else + _libname="wx_gtk2u" + fi + [ $lib = base ] || _libname="${_libname}_$lib" + _libname="${_libname}-3.0$_target" + + if is_static; then + _wxlibs="$_wxlibs ${libdir}/lib${_libname}.a" + for f in `eval echo \"\\\$ldlibs_$lib\"`; do + + # Only propagate duplicate -libraries to their latest + # possible position. Do not eliminate any other + # duplicates that might occur. They should be fixed + # in configure long before they get here. + # This started as a workaround for Mac -framework, + # but it seems like a better policy in general, which + # will let the more heinous bugs in configure shake out. + # We should maybe filter *.a here too, but not unless + # we have to. + case "$f" in + -l*) _all_libs="`remove_field $f $_all_libs` $f" ;; + *) _all_libs="$_all_libs $f" ;; + esac + + done + else + _wxlibs="$_wxlibs -l${_libname}" + fi + + done + + if [ -n "$WXDEBUG" ]; then + decho " retrieved: ldflags = $_all_ldflags" + decho " wxlibs = $_wxlibs" + decho " alllibs = $_all_libs" + fi + + echo $_all_ldflags $_wxlibs $_all_libs +} + +# this is the strict subset of the above function which returns only the +# (static) libraries themselves: this is used for linkdeps output which should +# output the list of libraries the main program should depend on +# +# of course, this duplication is bad but I'll leave to somebody else the care +# of refactoring this as I don't see any way to do it - VZ. + +# This (and the other cruft to support it) should be removed with +# reference to the FIXME above when configure stops piping us a slurry +# of options that need to be decomposed again for most practical uses - RL. +link_deps_for() +{ + _wxlibs='' + + is_cross && _target="-${target}" + + for lib do + if match_field "$lib" xml net base ; then + _libname="wx_baseu" + else + _libname="wx_gtk2u" + fi + [ $lib = base ] || _libname="${_libname}_$lib" + _libname="${_libname}-3.0$_target" + + _wxlibs="$_wxlibs ${libdir}/lib${_libname}.a" + done + + echo $_wxlibs +} + +# Sanity check the list of libs the user provided us, if any. +# -------------------------------------------------------------- + +wx_libs=`echo "$libs_parameters" | tr ',' ' '` +wx_optional_libs=`echo "$optional_libs_parameters" | tr ',' ' '` + +# Add the --optional-libs, if they've been compiled and aren't already added +for i in $wx_optional_libs; do + if match_field $i xrc webview stc richtext ribbon propgrid aui gl html qa adv core xml net base; then + if not match_field $i $wx_libs; then + wx_libs="${wx_libs:+$wx_libs }$i" + fi + fi +done + +[ -z "$WXDEBUG" ] || decho " user supplied libs: '$wx_libs'" + +# Assume we are using the GUI, unless --libs was specified with no GUI libs +using_gui=yes + +if is_monolithic; then + + # Only add additional info if --libs was specified and not just --optional-libs + if [ -n "$output_option_libs" ]; then + # Core libs are already built into the blob. + for i in std xrc webview html qa adv core xml net base; do + wx_libs=`remove_field $i $wx_libs` + done + + wx_libs=`order_libs $wx_libs` + wx_libs=" `lib_flags_for $wx_libs`" + + # We still need the core lib deps for a static build though + if is_static; then + link_deps="${libdir}/libwx_gtk2u-3.0.a" + wx_libs="$wx_libs $link_deps $ldlibs_core $ldlibs_base" + else + wx_libs="$wx_libs -lwx_gtk2u-3.0" + fi + fi +else # MONOLITHIC = 0 + + # Import core libs by default, expand std if specified, or add base if omitted. + if [ -n "$output_option_libs" ] && [ -z "$libs_parameters" ]; then + wx_libs="xrc webview html qa adv core xml net base" + elif match_field all $wx_libs; then + wx_libs="xrc webview stc richtext ribbon propgrid aui gl html qa adv core xml net base" + elif match_field std $wx_libs; then + # Bubble any libs that were already specified to the end + # of the list and ensure static linking order is retained. + wx_libs=`remove_field std $wx_libs` + for i in xrc webview html qa adv core xml net base; do + wx_libs="`remove_field $i $wx_libs` $i" + done + elif not match_field base $wx_libs ; then + # Only add base if --libs was specified and not just --optional-libs + if [ -n "$output_option_libs" ]; then + wx_libs="$wx_libs base" + fi + fi + + if [ -n "$output_option_libs" ]; then + using_gui=no + for i in $wx_libs ; do + if match_field "$i" xrc webview html qa adv core; then + _guildflags="" + using_gui=yes + break + fi + match_field "$i" xml net base || using_gui=yes + done + fi + + if is_static; then + link_deps=`link_deps_for $wx_libs` + fi + wx_libs=`order_libs $wx_libs` + wx_libs="$_guildflags `lib_flags_for $wx_libs`" +fi + + +# If they explicitly set "--cxx(pp)flags base" then they don't want the GUI +if [ "$cxx_parameters" = "base" ]; then + using_gui=no +fi + + +if [ -n "$WXDEBUG" ]; then + decho + decho " using libs: '$wx_libs'" + decho " using_gui = $using_gui" + decho +fi + + +# Endgame. Nothing left to discover now. +# -------------------------------------------------------------- + +[ "$using_gui" = "yes" ] || _gui_cppflags="-DwxUSE_GUI=0" + +if is_installed; then + _include_cppflags="-I${includedir}/wx-3.0" +else + _include_cppflags="-I${includedir}" +fi + +_cppflags=`echo "-I${libdir}/wx/include/gtk2-unicode-static-3.0" $_include_cppflags "-D_FILE_OFFSET_BITS=64 -D__WXGTK__" $_gui_cppflags` + +# now without further ado, we can answer these too. +[ -z "$output_option_cppflags" ] || echo $_cppflags +[ -z "$output_option_cflags" ] || echo $_cppflags "-pthread" +[ -z "$output_option_cxxflags" ] || echo $_cppflags "-pthread" +[ -z "$output_option_gl_libs" ] || echo `lib_flags_for gl` +[ -z "$output_option_linkdeps" ] || echo $link_deps + +if [ -n "$output_option_libs" ]; then + # if --libs [--optional-libs] then output the full linker information + + is_cross && + [ "x$libdir" = "x/usr/${target}/lib" ] || + [ "x$libdir" = "x/usr/lib" ] || + _ldflags="-L$libdir" + + if [ -n "$MAC_FRAMEWORK" ]; then + wx_libs="-framework $MAC_FRAMEWORK" + if [ -n "$MAC_FRAMEWORK_PREFIX" ]; then + _ldflags="-F$MAC_FRAMEWORK_PREFIX" + else + _ldflags="" + fi + fi + + is_installed || [ -n "$flag_option_no_rpath" ] || _rpath="" + + echo $_ldflags "-pthread " $_rpath $wx_libs "" + +elif [ -n "$output_option_optional_libs" ]; then + # if only --optional-libs then output just the libs + + echo $wx_libs +fi + + +# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +# +# Beyond here reside only machine or tool specific workarounds +# that require knowlege not obtainable prior to this comment. +# +# Please. Avoid addding things here, wx-config should avoid +# hard coding tool specific details. Do not use things here +# as an example of other things that should be here, These +# shouldn't be here either. This is a place of last resort +# for interim workarounds. I can but stress as strongly as +# the censor will allow, there are only bad examples of things +# that belong at this level of abstraction to follow. It is +# a limbo for glitches awaiting the Next Design Repair. Ok. +# +# With that firmly in mind, our debut dilemma is: + +# Resource compilers. An elusive term that covers some pretty +# dissimilar concepts on various platforms. The good news is, +# each platform has only one definition of 'resource', compiled +# or not, and so we can abstract that neatly to return a platform +# specific invocation of the appropriate tool. The bad news is, +# windres (at least) requires knowledge of the wx header files +# location(s) that cannot be predicted reliably before the call to +# wx-config is made. Currently for all known resource compilers, +# we can simply return a command and some salient configuration +# options in response to a request for --rescomp. So here we +# top up the options for any tools that may require information +# that was only just determined in the last few machine cycles, +# then output the necessary incantation for the platform. +# +# Most things should already be constant by the time configure +# has run. Do not add anything here that is already known there. + +if [ -n "$output_option_rescomp" ]; then + + case "" in + *windres|wrc) + # Note that with late model windres, we could just insert + # _include_cppflags here, but use the old notation for now + # as it is more universally accepted. + if is_installed; then + echo " --include-dir" \ + "${includedir}/wx-3.0" \ + "" + else + echo " --include-dir ${includedir}" \ + "" + fi + ;; + + # neither rez not emxbind have any specific needs from + # us, so just output what was determined by configure. + *) + echo + ;; + esac + +fi + +# +# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + +# And so that's it, we're done. Have a nice build. + +exit 0 diff --git a/wxmsw/lib/wx/include/gtk2-unicode-static-3.0/wx/setup.h b/wxmsw/lib/wx/include/gtk2-unicode-static-3.0/wx/setup.h new file mode 100644 index 00000000..e515c41e --- /dev/null +++ b/wxmsw/lib/wx/include/gtk2-unicode-static-3.0/wx/setup.h @@ -0,0 +1,1286 @@ +/* lib/wx/include/gtk2-unicode-static-3.0/wx/setup.h. Generated from setup.h.in by configure. */ +/* This define (__WX_SETUP_H__) is used both to ensure setup.h is included + * only once and to indicate that we are building using configure. */ +#ifndef __WX_SETUP_H__ +#define __WX_SETUP_H__ + +/* never undefine inline or const keywords for C++ compilation */ +#ifndef __cplusplus + +/* Define to empty if the keyword does not work. */ +/* #undef const */ + +/* Define as __inline if that's what the C compiler calls it. */ +/* #undef inline */ + +#endif /* __cplusplus */ + +/* fill in with the string wxGetOsDescription() will return */ +#define WXWIN_OS_DESCRIPTION "Linux 3.14.9-200.fc20.x86_64 x86_64" + +/* the installation location prefix from configure */ +#define wxINSTALL_PREFIX "/home/build/tmp/build/external/dist" + +/* Define to `int' if doesn't define. */ +/* #undef gid_t */ + +/* Define to `int' if doesn't define. */ +/* #undef mode_t */ + +/* Define to `long' if doesn't define. */ +/* #undef off_t */ + +/* Define to `int' if doesn't define. */ +/* #undef pid_t */ + +/* Define to `unsigned' if doesn't define. */ +/* #undef size_t */ + +/* Define if ssize_t type is available. */ +#define HAVE_SSIZE_T 1 + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define this to get extra features from GNU libc. */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE 1 +#endif + +/* Define to `int' if doesn't define. */ +/* #undef uid_t */ + +/* Define if your processor stores words with the most significant + byte first (like Motorola and SPARC, unlike Intel and VAX). */ +/* #undef WORDS_BIGENDIAN */ + +/* Define this if your version of GTK+ is greater than 1.2.7 */ +/* #undef __WXGTK127__ */ + +/* Define this if your version of GTK+ is greater than 2.0 */ +#define __WXGTK20__ 1 + +/* Define this if your version of GTK+ is greater than 2.6 */ +/* #undef __WXGTK26__ */ + +/* Define this if your version of GTK+ is greater than 2.10 */ +#define __WXGTK210__ 1 + +/* Define this if your version of GTK+ is greater than 2.18 */ +#define __WXGTK218__ 1 + +/* Define this if your version of GTK+ is >= 3.0 */ +/* #undef __WXGTK3__ */ + +/* Define this if you want to use GPE features */ +/* #undef __WXGPE__ */ + +/* Define this if your version of Motif is greater than 2.0 */ +/* #undef __WXMOTIF20__ */ + +/* Define this if you are using Lesstif */ +/* #undef __WXLESSTIF__ */ + +/* + * Define to 1 for Unix[-like] system + */ +#define wxUSE_UNIX 1 + +#define __UNIX__ 1 + +/* #undef __AIX__ */ +/* #undef __BSD__ */ +/* #undef __DARWIN__ */ +/* #undef __EMX__ */ +/* #undef __FREEBSD__ */ +/* #undef __HPUX__ */ +#define __LINUX__ 1 +/* #undef __NETBSD__ */ +/* #undef __OPENBSD__ */ +/* #undef __OSF__ */ +/* #undef __QNX__ */ +/* #undef __SGI__ */ +/* #undef __SOLARIS__ */ +/* #undef __SUN__ */ +/* #undef __SUNOS__ */ +/* #undef __SVR4__ */ +/* #undef __SYSV__ */ +/* #undef __ULTRIX__ */ +/* #undef __UNIXWARE__ */ +/* #undef __VMS__ */ + +/* #undef __IA64__ */ +/* #undef __ALPHA__ */ + +/* NanoX (with wxX11) */ +#define wxUSE_NANOX 0 + +/* PowerPC Darwin & Mac OS X */ +/* #undef __POWERPC__ */ +/* #undef TARGET_CARBON */ + +/* Hack to make IOGraphicsTypes.h not define Point conflicting with MacTypes */ +/* #undef __Point__ */ + +/* MS-DOS with DJGPP */ +/* #undef __DOS__ */ + +/* Stupid hack; __WINDOWS__ clashes with wx/defs.h */ +#ifndef __WINDOWS__ +/* #undef __WINDOWS__ */ +#endif + +#ifndef __WIN32__ +/* #undef __WIN32__ */ +#endif +#ifndef __GNUWIN32__ +/* #undef __GNUWIN32__ */ +#endif +#ifndef STRICT +/* #undef STRICT */ +#endif +#ifndef WINVER +/* #undef WINVER */ +#endif + +/* OS/2 with EMX */ +/* #undef __OS2__ */ + +/* --- start common options --- */ + +#ifndef wxUSE_GUI + #define wxUSE_GUI 1 +#endif + + +#define WXWIN_COMPATIBILITY_2_6 0 + +#define WXWIN_COMPATIBILITY_2_8 1 + +#define wxDIALOG_UNIT_COMPATIBILITY 0 + + + +#define wxUSE_ON_FATAL_EXCEPTION 1 + +#define wxUSE_STACKWALKER 1 + +#define wxUSE_DEBUGREPORT 1 + + + +#define wxUSE_DEBUG_CONTEXT 0 + +#define wxUSE_MEMORY_TRACING 0 + +#define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +#define wxUSE_DEBUG_NEW_ALWAYS 0 + + + +#ifndef wxUSE_UNICODE + #define wxUSE_UNICODE 1 +#endif + +#define wxUSE_WCHAR_T 1 + + +#define wxUSE_EXCEPTIONS 1 + +#define wxUSE_EXTENDED_RTTI 0 + +#define wxUSE_LOG 1 + +#define wxUSE_LOGWINDOW 1 + +#define wxUSE_LOGGUI 1 + +#define wxUSE_LOG_DIALOG 1 + +#define wxUSE_CMDLINE_PARSER 1 + +#define wxUSE_THREADS 1 + +#define wxUSE_STREAMS 1 + +#define wxUSE_PRINTF_POS_PARAMS 1 + +#define wxUSE_COMPILER_TLS 1 + + +#define wxUSE_STL 0 + +#if defined(__DMC__) || defined(__WATCOMC__) \ + || (defined(_MSC_VER) && _MSC_VER < 1200) + #define wxUSE_STD_DEFAULT 0 +#else + #define wxUSE_STD_DEFAULT 0 +#endif + +#define wxUSE_STD_CONTAINERS 0 + +#define wxUSE_STD_IOSTREAM 1 + +#define wxUSE_STD_STRING 1 + +#define wxUSE_STD_STRING_CONV_IN_WXSTRING wxUSE_STL + +#define wxUSE_IOSTREAMH 0 + + + +#define wxUSE_LONGLONG 1 + +#define wxUSE_BASE64 1 + +#define wxUSE_CONSOLE_EVENTLOOP 1 + +#define wxUSE_FILE 1 +#define wxUSE_FFILE 1 + +#define wxUSE_FSVOLUME 1 + +#define wxUSE_STDPATHS 1 + +#define wxUSE_TEXTBUFFER 1 + +#define wxUSE_TEXTFILE 1 + +#define wxUSE_INTL 1 + +#define wxUSE_XLOCALE 1 + +#define wxUSE_DATETIME 1 + +#define wxUSE_TIMER 1 + +#define wxUSE_STOPWATCH 1 + +#define wxUSE_FSWATCHER 1 + +#define wxUSE_CONFIG 1 + +#define wxUSE_CONFIG_NATIVE 1 + +#define wxUSE_DIALUP_MANAGER 1 + +#define wxUSE_DYNLIB_CLASS 1 + +#define wxUSE_DYNAMIC_LOADER 1 + +#define wxUSE_SOCKETS 1 + +#define wxUSE_IPV6 0 + +#define wxUSE_FILESYSTEM 1 + +#define wxUSE_FS_ZIP 1 + +#define wxUSE_FS_ARCHIVE 1 + +#define wxUSE_FS_INET 1 + +#define wxUSE_ARCHIVE_STREAMS 1 + +#define wxUSE_ZIPSTREAM 1 + +#define wxUSE_TARSTREAM 1 + +#define wxUSE_ZLIB 1 + +#define wxUSE_APPLE_IEEE 1 + +#define wxUSE_JOYSTICK 1 + +#define wxUSE_FONTENUM 1 + +#define wxUSE_FONTMAP 1 + +#define wxUSE_MIMETYPE 1 + +#define wxUSE_PROTOCOL 1 + +#define wxUSE_PROTOCOL_FILE 1 +#define wxUSE_PROTOCOL_FTP 1 +#define wxUSE_PROTOCOL_HTTP 1 + +#define wxUSE_URL 1 + +#define wxUSE_URL_NATIVE 0 + +#define wxUSE_VARIANT 1 + +#define wxUSE_ANY 1 + +#define wxUSE_REGEX 1 + +#define wxUSE_SYSTEM_OPTIONS 1 + +#define wxUSE_SOUND 1 + +#define wxUSE_MEDIACTRL 1 + +#define wxUSE_XRC 1 + +#define wxUSE_XML 1 + +#define wxUSE_AUI 1 + +#define wxUSE_RIBBON 1 + +#define wxUSE_PROPGRID 1 + +#define wxUSE_STC 1 + +#define wxUSE_WEBVIEW 1 + +#ifdef __WXMSW__ +#define wxUSE_WEBVIEW_IE 0 +#else +#define wxUSE_WEBVIEW_IE 0 +#endif + +#if defined(__WXGTK__) || defined(__WXOSX__) +#define wxUSE_WEBVIEW_WEBKIT 1 +#else +#define wxUSE_WEBVIEW_WEBKIT 1 +#endif + + +#ifdef _MSC_VER +# if _MSC_VER >= 1310 + + +#define wxUSE_GRAPHICS_CONTEXT 1 +# else + + +# define wxUSE_GRAPHICS_CONTEXT 1 +# endif +#else + + + + + +# define wxUSE_GRAPHICS_CONTEXT 1 +#endif + +#define wxUSE_CAIRO 1 + + + +#define wxUSE_CONTROLS 1 + +#define wxUSE_MARKUP 1 + +#define wxUSE_POPUPWIN 1 + +#define wxUSE_TIPWINDOW 1 + +#define wxUSE_ANIMATIONCTRL 1 +#define wxUSE_BANNERWINDOW 1 +#define wxUSE_BUTTON 1 +#define wxUSE_BMPBUTTON 1 +#define wxUSE_CALENDARCTRL 1 +#define wxUSE_CHECKBOX 1 +#define wxUSE_CHECKLISTBOX 1 +#define wxUSE_CHOICE 1 +#define wxUSE_COLLPANE 1 +#define wxUSE_COLOURPICKERCTRL 1 +#define wxUSE_COMBOBOX 1 +#define wxUSE_COMMANDLINKBUTTON 1 +#define wxUSE_DATAVIEWCTRL 1 +#define wxUSE_DATEPICKCTRL 1 +#define wxUSE_DIRPICKERCTRL 1 +#define wxUSE_EDITABLELISTBOX 1 +#define wxUSE_FILECTRL 1 +#define wxUSE_FILEPICKERCTRL 1 +#define wxUSE_FONTPICKERCTRL 1 +#define wxUSE_GAUGE 1 +#define wxUSE_HEADERCTRL 1 +#define wxUSE_HYPERLINKCTRL 1 +#define wxUSE_LISTBOX 1 +#define wxUSE_LISTCTRL 1 +#define wxUSE_RADIOBOX 1 +#define wxUSE_RADIOBTN 1 +#define wxUSE_RICHMSGDLG 1 +#define wxUSE_SCROLLBAR 1 +#define wxUSE_SEARCHCTRL 1 +#define wxUSE_SLIDER 1 +#define wxUSE_SPINBTN 1 +#define wxUSE_SPINCTRL 1 +#define wxUSE_STATBOX 1 +#define wxUSE_STATLINE 1 +#define wxUSE_STATTEXT 1 +#define wxUSE_STATBMP 1 +#define wxUSE_TEXTCTRL 1 +#define wxUSE_TIMEPICKCTRL 1 +#define wxUSE_TOGGLEBTN 1 +#define wxUSE_TREECTRL 1 +#define wxUSE_TREELISTCTRL 1 + +#define wxUSE_STATUSBAR 1 + +#define wxUSE_NATIVE_STATUSBAR 1 + +#define wxUSE_TOOLBAR 1 +#define wxUSE_TOOLBAR_NATIVE 1 + +#define wxUSE_NOTEBOOK 1 + +#define wxUSE_LISTBOOK 1 + +#define wxUSE_CHOICEBOOK 1 + +#define wxUSE_TREEBOOK 1 + +#define wxUSE_TOOLBOOK 1 + +#define wxUSE_TASKBARICON 1 + +#define wxUSE_GRID 1 + +#define wxUSE_MINIFRAME 1 + +#define wxUSE_COMBOCTRL 1 + +#define wxUSE_ODCOMBOBOX 1 + +#define wxUSE_BITMAPCOMBOBOX 1 + +#define wxUSE_REARRANGECTRL 1 + + +#define wxUSE_ACCEL 1 + +#define wxUSE_ARTPROVIDER_STD 1 + +#define wxUSE_ARTPROVIDER_TANGO 0 + +#define wxUSE_HOTKEY 0 + +#define wxUSE_CARET 1 + +#define wxUSE_DISPLAY 1 + +#define wxUSE_GEOMETRY 1 + +#define wxUSE_IMAGLIST 1 + +#define wxUSE_INFOBAR 1 + +#define wxUSE_MENUS 1 + +#define wxUSE_NOTIFICATION_MESSAGE 1 + +#define wxUSE_PREFERENCES_EDITOR 1 + +#define wxUSE_RICHTOOLTIP 1 + +#define wxUSE_SASH 1 + +#define wxUSE_SPLITTER 1 + +#define wxUSE_TOOLTIPS 1 + +#define wxUSE_VALIDATORS 1 + +#ifdef __WXMSW__ +#define wxUSE_AUTOID_MANAGEMENT 0 +#else +#define wxUSE_AUTOID_MANAGEMENT 0 +#endif + + +#define wxUSE_COMMON_DIALOGS 0 + +#define wxUSE_BUSYINFO 1 + +#define wxUSE_CHOICEDLG 1 + +#define wxUSE_COLOURDLG 1 + +#define wxUSE_DIRDLG 1 + + +#define wxUSE_FILEDLG 1 + +#define wxUSE_FINDREPLDLG 1 + +#define wxUSE_FONTDLG 1 + +#define wxUSE_MSGDLG 1 + +#define wxUSE_PROGRESSDLG 1 + +#define wxUSE_STARTUP_TIPS 1 + +#define wxUSE_TEXTDLG 1 + +#define wxUSE_NUMBERDLG 1 + +#define wxUSE_SPLASH 1 + +#define wxUSE_WIZARDDLG 1 + +#define wxUSE_ABOUTDLG 1 + +#define wxUSE_FILE_HISTORY 1 + + +#define wxUSE_METAFILE 0 +#define wxUSE_ENH_METAFILE 0 +#define wxUSE_WIN_METAFILES_ALWAYS 0 + + +#define wxUSE_MDI 1 + +#define wxUSE_DOC_VIEW_ARCHITECTURE 1 + +#define wxUSE_MDI_ARCHITECTURE 1 + +#define wxUSE_PRINTING_ARCHITECTURE 1 + +#define wxUSE_HTML 1 + +#define wxUSE_GLCANVAS 1 + +#define wxUSE_RICHTEXT 1 + + +#define wxUSE_CLIPBOARD 1 + +#define wxUSE_DATAOBJ 1 + +#define wxUSE_DRAG_AND_DROP 1 + +#define wxUSE_ACCESSIBILITY 0 + + +#define wxUSE_SNGLINST_CHECKER 1 + +#define wxUSE_DRAGIMAGE 1 + +#define wxUSE_IPC 1 + +#define wxUSE_HELP 1 + + +#define wxUSE_MS_HTML_HELP 0 + + +#define wxUSE_WXHTML_HELP 1 + +#define wxUSE_CONSTRAINTS 1 + + +#define wxUSE_SPLINES 1 + + +#define wxUSE_MOUSEWHEEL 1 + + +#define wxUSE_UIACTIONSIMULATOR 1 + + +#define wxUSE_POSTSCRIPT 1 + +#define wxUSE_AFM_FOR_POSTSCRIPT 1 + +#define wxUSE_SVG 1 + +#define wxUSE_DC_TRANSFORM_MATRIX 1 + + + +#define wxUSE_IMAGE 1 + +#define wxUSE_LIBPNG 1 + +#define wxUSE_LIBJPEG 1 + +#define wxUSE_LIBTIFF 1 + +#define wxUSE_TGA 1 + +#define wxUSE_GIF 1 + +#define wxUSE_PNM 1 + +#define wxUSE_PCX 1 + +#define wxUSE_IFF 1 + +#define wxUSE_XPM 1 + +#define wxUSE_ICO_CUR 1 + +#define wxUSE_PALETTE 1 + + +#define wxUSE_ALL_THEMES 0 + +#define wxUSE_THEME_GTK 0 +#define wxUSE_THEME_METAL 0 +#define wxUSE_THEME_MONO 0 +#define wxUSE_THEME_WIN32 0 + + +/* --- end common options --- */ + +/* + * Unix-specific options + */ +#define wxUSE_SELECT_DISPATCHER 1 +#define wxUSE_EPOLL_DISPATCHER 1 + +#define wxUSE_UNICODE_UTF8 0 +#define wxUSE_UTF8_LOCALE_ONLY 0 + +/* + Use GStreamer for Unix. + + Default is 0 as this requires a lot of dependencies which might not be + available. + + Recommended setting: 1 (wxMediaCtrl won't work by default without it). + */ +#define wxUSE_GSTREAMER 1 + +/* --- start MSW options --- */ + +#ifndef wxUSE_UNICODE_MSLU + #define wxUSE_UNICODE_MSLU 0 +#endif + +#define wxUSE_MFC 0 + +#define wxUSE_OLE 0 + +#define wxUSE_OLE_AUTOMATION 0 + +#define wxUSE_ACTIVEX 0 + +#define wxUSE_DC_CACHEING 0 + +#define wxUSE_WXDIB 0 + +#define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 0 + +#define wxUSE_REGKEY 0 + +#define wxUSE_RICHEDIT 1 + +#define wxUSE_RICHEDIT2 1 + +#define wxUSE_OWNER_DRAWN 0 + +#define wxUSE_TASKBARICON_BALLOONS 1 + +#define wxUSE_UXTHEME 0 + +#define wxUSE_INKEDIT 0 + +#define wxUSE_INICONF 0 + + +#define wxUSE_DATEPICKCTRL_GENERIC 0 + +#define wxUSE_TIMEPICKCTRL_GENERIC 0 + + +#define wxUSE_CRASHREPORT 0 +/* --- end MSW options --- */ + +/* + * Define if your compiler supports the explicit keyword + */ +#define HAVE_EXPLICIT 1 + +/* + * Define if your compiler has C99 va_copy + */ +#define HAVE_VA_COPY 1 + +/* + * Define if va_list type is an array + */ +/* #undef VA_LIST_IS_ARRAY */ + +/* + * Define if the compiler supports variadic macros + */ +#define HAVE_VARIADIC_MACROS 1 + +/* + * Define if you don't want variadic macros to be used even if they are + * supported by the compiler. + */ +/* #undef wxNO_VARIADIC_MACROS */ + +/* + * Define if your compiler has std::wstring + */ +#define HAVE_STD_WSTRING 1 +/* + * Define if your compiler has compliant std::string::compare + */ +/* #undef HAVE_STD_STRING_COMPARE */ +/* + * Define if your compiler has + */ +/* #undef HAVE_HASH_MAP */ +/* + * Define if your compiler has + */ +/* #undef HAVE_EXT_HASH_MAP */ +/* + * Define if your compiler has std::hash_map/hash_set + */ +/* #undef HAVE_STD_HASH_MAP */ +/* + * Define if your compiler has __gnu_cxx::hash_map/hash_set + */ +/* #undef HAVE_GNU_CXX_HASH_MAP */ + +/* + * Define if your compiler has std::unordered_map + */ +/* #undef HAVE_STD_UNORDERED_MAP */ + +/* + * Define if your compiler has std::unordered_set + */ +/* #undef HAVE_STD_UNORDERED_SET */ + +/* + * Define if your compiler has std::tr1::unordered_map + */ +/* #undef HAVE_TR1_UNORDERED_MAP */ + +/* + * Define if your compiler has std::tr1::unordered_set + */ +/* #undef HAVE_TR1_UNORDERED_SET */ + +/* + * Define if your compiler has + */ +#define HAVE_TR1_TYPE_TRAITS 1 + +/* + * Define if your compiler has + */ +/* #undef HAVE_TYPE_TRAITS */ + +/* + * Define if the compiler supports simple visibility declarations. + */ +/* #undef HAVE_VISIBILITY */ + +/* + * Define if the compiler supports GCC's atomic memory access builtins + */ +#define HAVE_GCC_ATOMIC_BUILTINS 1 + +/* + * Define if compiler's visibility support in libstdc++ is broken + */ +/* #undef HAVE_BROKEN_LIBSTDCXX_VISIBILITY */ + +/* + * The built-in regex supports advanced REs in additional to POSIX's basic + * and extended. Your system regex probably won't support this, and in this + * case WX_NO_REGEX_ADVANCED should be defined. + */ +/* #undef WX_NO_REGEX_ADVANCED */ +/* + * On GNU systems use re_search instead of regexec, since the latter does a + * strlen on the search text affecting the performance of some operations. + */ +/* #undef HAVE_RE_SEARCH */ +/* + * Use SDL for audio (Unix) + */ +#define wxUSE_LIBSDL 0 + +/* + * Compile sound backends as plugins + */ +#define wxUSE_PLUGINS 0 + +/* + * Use GTK print for printing under GTK+ 2.10+ + */ +#define wxUSE_GTKPRINT 1 +/* + * Use GNOME VFS for MIME types + */ +#define wxUSE_LIBGNOMEVFS 0 +/* + * Use the Hildon framework + */ +#define wxUSE_LIBHILDON 0 +/* + * Use the Hildon 2.0 framework + */ +#define wxUSE_LIBHILDON2 0 +/* + * Use libnotify library. + */ +#define wxUSE_LIBNOTIFY 1 +/* + * Use libnotify 0.7+ API. + */ +#define wxUSE_LIBNOTIFY_0_7 1 +/* + * Use libXpm + */ +#define wxHAVE_LIB_XPM 0 +/* + * Define if you have pthread_cleanup_push/pop() + */ +#define wxHAVE_PTHREAD_CLEANUP 1 +/* + * Define if compiler has __thread keyword. + */ +#define HAVE___THREAD_KEYWORD 1 +/* + * Define if large (64 bit file offsets) files are supported. + */ +#define HAVE_LARGEFILE_SUPPORT 1 + +/* + * Use OpenGL + */ +#define wxUSE_OPENGL 1 + +/* + * Use MS HTML Help via libmspack (Unix) + */ +#define wxUSE_LIBMSPACK 0 + +/* + * Matthews garbage collection (used for MrEd?) + */ +#define WXGARBAGE_COLLECTION_ON 0 + +/* + * wxWebKitCtrl + */ +#define wxUSE_WEBKIT 0 + +/* + * Objective-C class name uniquifying + */ +#define wxUSE_OBJC_UNIQUIFYING 0 + +/* + * The const keyword is being introduced more in wxWindows. + * You can use this setting to maintain backward compatibility. + * If 0: will use const wherever possible. + * If 1: will use const only where necessary + * for precompiled headers to work. + * If 2: will be totally backward compatible, but precompiled + * headers may not work and program size will be larger. + */ +#define CONST_COMPATIBILITY 0 + +/* + * use the session manager to detect KDE/GNOME + */ +#define wxUSE_DETECT_SM 1 + + +/* define with the name of timezone variable */ +#define WX_TIMEZONE timezone + +/* The type of 3rd argument to getsockname() - usually size_t or int */ +#define WX_SOCKLEN_T socklen_t + +/* The type of 5th argument to getsockopt() - usually size_t or int */ +#define SOCKOPTLEN_T socklen_t + +/* The type of statvfs(2) argument */ +#define WX_STATFS_T struct statfs + +/* The signal handler prototype */ +#define wxTYPE_SA_HANDLER int + +/* gettimeofday() usually takes 2 arguments, but some really old systems might + * have only one, in which case define WX_GETTIMEOFDAY_NO_TZ */ +/* #undef WX_GETTIMEOFDAY_NO_TZ */ + +/* struct tm doesn't always have the tm_gmtoff field, define this if it does */ +#define WX_GMTOFF_IN_TM 1 + +/* Define if you have poll(2) function */ +/* #undef HAVE_POLL */ + +/* Define if you have pw_gecos field in struct passwd */ +#define HAVE_PW_GECOS 1 + +/* Define if you have __cxa_demangle() in */ +#define HAVE_CXA_DEMANGLE 1 + +/* Define if you have dlopen() */ +#define HAVE_DLOPEN 1 + +/* Define if you have gettimeofday() */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define if fsync() is available */ +#define HAVE_FSYNC 1 + +/* Define if round() is available */ +#define HAVE_ROUND 1 + +/* Define if you have ftime() */ +/* #undef HAVE_FTIME */ + +/* Define if you have nanosleep() */ +#define HAVE_NANOSLEEP 1 + +/* Define if you have sched_yield */ +#define HAVE_SCHED_YIELD 1 + +/* Define if you have pthread_mutexattr_t and functions to work with it */ +#define HAVE_PTHREAD_MUTEXATTR_T 1 + +/* Define if you have pthread_mutexattr_settype() declaration */ +#define HAVE_PTHREAD_MUTEXATTR_SETTYPE_DECL 1 + +/* Define if you have PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP */ +/* #undef HAVE_PTHREAD_RECURSIVE_MUTEX_INITIALIZER */ + +/* Define if you have pthread_cancel */ +#define HAVE_PTHREAD_CANCEL 1 + +/* Define if you have pthread_mutex_timedlock */ +#define HAVE_PTHREAD_MUTEX_TIMEDLOCK 1 + +/* Define if you have pthread_attr_setstacksize */ +#define HAVE_PTHREAD_ATTR_SETSTACKSIZE 1 + +/* Define if you have shl_load() */ +/* #undef HAVE_SHL_LOAD */ + +/* Define if you have snprintf() */ +#define HAVE_SNPRINTF 1 + +/* Define if you have snprintf() declaration in the header */ +#define HAVE_SNPRINTF_DECL 1 + +/* Define if you have a snprintf() which supports positional arguments + (defined in the unix98 standard) */ +#define HAVE_UNIX98_PRINTF 1 + +/* define if you have statfs function */ +#define HAVE_STATFS 1 + +/* define if you have statfs prototype */ +#define HAVE_STATFS_DECL 1 + +/* define if you have statvfs function */ +/* #undef HAVE_STATVFS */ + +/* Define if you have strtoull() and strtoll() */ +#define HAVE_STRTOULL 1 + +/* Define if you have all functions to set thread priority */ +#define HAVE_THREAD_PRIORITY_FUNCTIONS 1 + +/* Define if you have vsnprintf() */ +#define HAVE_VSNPRINTF 1 + +/* Define if you have vsnprintf() declaration in the header */ +#define HAVE_VSNPRINTF_DECL 1 + +/* Define if you have a _broken_ vsnprintf() declaration in the header, + * with 'char*' for the 3rd parameter instead of 'const char*' */ +/* #undef HAVE_BROKEN_VSNPRINTF_DECL */ + +/* Define if you have vsscanf() */ +#define HAVE_VSSCANF 1 + +/* Define if you have vsscanf() declaration in the header */ +#define HAVE_VSSCANF_DECL 1 + +/* Define if you have usleep() */ +/* #undef HAVE_USLEEP */ + +/* Define if you have wcscasecmp() function */ +#define HAVE_WCSCASECMP 1 + +/* Define if you have wcsncasecmp() function */ +#define HAVE_WCSNCASECMP 1 + +/* Define if you have wcslen function */ +#define HAVE_WCSLEN 1 + +/* Define if you have wcsdup function */ +#define HAVE_WCSDUP 1 + +/* Define if you have wcsftime() function */ +#define HAVE_WCSFTIME 1 + +/* Define if you have strnlen() function */ +#define HAVE_STRNLEN 1 + +/* Define if you have wcsnlen() function */ +#define HAVE_WCSNLEN 1 + +/* Define if you have wcstoull() and wcstoll() */ +/* #undef HAVE_WCSTOULL */ + +/* The number of bytes in a wchar_t. */ +#define SIZEOF_WCHAR_T 4 + +/* The number of bytes in a int. */ +#define SIZEOF_INT 4 + +/* The number of bytes in a pointer. */ +#define SIZEOF_VOID_P 8 + +/* The number of bytes in a long. */ +#define SIZEOF_LONG 8 + +/* The number of bytes in a long long. */ +#define SIZEOF_LONG_LONG 8 + +/* The number of bytes in a short. */ +#define SIZEOF_SHORT 2 + +/* The number of bytes in a size_t. */ +#define SIZEOF_SIZE_T 8 + +/* Define if size_t on your machine is the same type as unsigned int. */ +/* #undef wxSIZE_T_IS_UINT */ + +/* Define if size_t on your machine is the same type as unsigned long. */ +#define wxSIZE_T_IS_ULONG 1 + +/* Define if wchar_t is distinct type in your compiler. */ +#define wxWCHAR_T_IS_REAL_TYPE 1 + +/* Define if you have the dlerror function. */ +#define HAVE_DLERROR 1 + +/* Define if you have Posix fnctl() function. */ +#define HAVE_FCNTL 1 + +/* Define if you have BSD flock() function. */ +/* #undef HAVE_FLOCK */ + +/* Define if you have getaddrinfo function. */ +/* #undef HAVE_GETADDRINFO */ + +/* Define if you have a gethostbyname_r function taking 6 arguments. */ +#define HAVE_FUNC_GETHOSTBYNAME_R_6 1 + +/* Define if you have a gethostbyname_r function taking 5 arguments. */ +/* #undef HAVE_FUNC_GETHOSTBYNAME_R_5 */ + +/* Define if you have a gethostbyname_r function taking 3 arguments. */ +/* #undef HAVE_FUNC_GETHOSTBYNAME_R_3 */ + +/* Define if you only have a gethostbyname function */ +/* #undef HAVE_GETHOSTBYNAME */ + +/* Define if you have the gethostname function. */ +/* #undef HAVE_GETHOSTNAME */ + +/* Define if you have a getservbyname_r function taking 6 arguments. */ +#define HAVE_FUNC_GETSERVBYNAME_R_6 1 + +/* Define if you have a getservbyname_r function taking 5 arguments. */ +/* #undef HAVE_FUNC_GETSERVBYNAME_R_5 */ + +/* Define if you have a getservbyname_r function taking 4 arguments. */ +/* #undef HAVE_FUNC_GETSERVBYNAME_R_4 */ + +/* Define if you only have a getservbyname function */ +/* #undef HAVE_GETSERVBYNAME */ + +/* Define if you have the gmtime_r function. */ +#define HAVE_GMTIME_R 1 + +/* Define if you have the inet_addr function. */ +#define HAVE_INET_ADDR 1 + +/* Define if you have the inet_aton function. */ +#define HAVE_INET_ATON 1 + +/* Define if you have the localtime_r function. */ +#define HAVE_LOCALTIME_R 1 + +/* Define if you have the mktemp function. */ +/* #undef HAVE_MKTEMP */ + +/* Define if you have the mkstemp function. */ +#define HAVE_MKSTEMP 1 + +/* Define if you have the putenv function. */ +/* #undef HAVE_PUTENV */ + +/* Define if you have the setenv function. */ +#define HAVE_SETENV 1 + +/* Define if you have strtok_r function. */ +#define HAVE_STRTOK_R 1 + +/* Define if you have thr_setconcurrency function */ +/* #undef HAVE_THR_SETCONCURRENCY */ + +/* Define if you have pthread_setconcurrency function */ +#define HAVE_PTHREAD_SET_CONCURRENCY 1 + +/* Define if you have the uname function. */ +#define HAVE_UNAME 1 + +/* Define if you have the unsetenv function. */ +#define HAVE_UNSETENV 1 + +/* Define if you have the header file. */ +#define HAVE_X11_XKBLIB_H 1 + +/* Define if you have the header file. */ +#define HAVE_X11_EXTENSIONS_XF86VMODE_H 1 + +/* Define if you have the header file. */ +#define HAVE_SCHED_H 1 + +/* Define if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_FCNTL_H */ + +/* Define if you have the header file. */ +#define HAVE_WCHAR_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_WCSTR_H */ + +/* Define if you have (Solaris only) */ +/* #undef HAVE_WIDEC_H */ + +/* Define if you have the header file and iconv() symbol. */ +#define HAVE_ICONV 1 + +/* Define as "const" if the declaration of iconv() needs const. */ +#define ICONV_CONST + +/* Define if you have the header file. */ +#define HAVE_LANGINFO_H 1 + +/* Define if you have the header file (mingw,cygwin). */ +/* #undef HAVE_W32API_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_SOUNDCARD_H 1 + +/* Define if you have wcsrtombs() function */ +#define HAVE_WCSRTOMBS 1 + +/* Define this if you have putws() */ +/* #undef HAVE_PUTWS */ + +/* Define this if you have fputws() */ +#define HAVE_FPUTWS 1 + +/* Define this if you have wprintf() and related functions */ +#define HAVE_WPRINTF 1 + +/* Define this if you have vswprintf() and related functions */ +#define HAVE_VSWPRINTF 1 + +/* Define this if you have _vsnwprintf */ +/* #undef HAVE__VSNWPRINTF */ + +/* vswscanf() */ +#define HAVE_VSWSCANF 1 + +/* Define if fseeko and ftello are available. */ +#define HAVE_FSEEKO 1 + +/* Define this if you are using gtk and gdk contains support for X11R6 XIM */ +/* #undef HAVE_XIM */ + +/* Define this if you have X11/extensions/shape.h */ +/* #undef HAVE_XSHAPE */ + +/* Define this if you have type SPBCDATA */ +/* #undef HAVE_SPBCDATA */ + +/* Define if you have pango_font_family_is_monospace() (Pango >= 1.3.3) */ +/* #undef HAVE_PANGO_FONT_FAMILY_IS_MONOSPACE */ + +/* Define if you have Pango xft support */ +/* #undef HAVE_PANGO_XFT */ + +/* Define if you have the header file. */ +#define HAVE_SYS_SELECT_H 1 + +/* Define if you have abi::__forced_unwind in your . */ +#define HAVE_ABI_FORCEDUNWIND 1 + +/* Define if fdopen is available. */ +#define HAVE_FDOPEN 1 + +/* Define if sysconf is available. */ +#define HAVE_SYSCONF 1 + +/* Define if getpwuid_r is available. */ +#define HAVE_GETPWUID_R 1 + +/* Define if getgrgid_r is available. */ +#define HAVE_GETGRGID_R 1 + +/* Define if setpriority() is available. */ +#define HAVE_SETPRIORITY 1 + +/* Define if locale_t is available */ +#define HAVE_LOCALE_T 1 + +/* Define if you have inotify_xxx() functions. */ +#define wxHAS_INOTIFY 1 + +/* Define if you have kqueu_xxx() functions. */ +/* #undef wxHAS_KQUEUE */ + +/* ------------------------------------------------------------------------- + Win32 adjustments section + ------------------------------------------------------------------------- */ + +#ifdef __WIN32__ + +/* When using an external jpeg library and the Windows headers already define + * boolean, define to the type used by the jpeg library for boolean. */ +/* #undef wxHACK_BOOLEAN */ + +/* Define if the header pbt.h is missing. */ +/* #undef NEED_PBT_H */ + +#endif /* __WIN32__ */ + +/* --------------------------------------------------------* + * This stuff is static, it doesn't get modified directly + * by configure. +*/ + +/* + define some constants identifying wxWindows version in more details than + just the version number + */ + +/* wxLogChain class available */ +#define wxHAS_LOG_CHAIN + +/* define this when wxDC::Blit() respects SetDeviceOrigin() in wxGTK */ +/* #undef wxHAS_WORKING_GTK_DC_BLIT */ + +#endif /* __WX_SETUP_H__ */ +