X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9cd6d737d5adc5fe415cddb3ef0024b9da2b9e08..3e2d47e1a96977aa31c8af18f96e9363000f3ca5:/include/wx/window.h?ds=inline diff --git a/include/wx/window.h b/include/wx/window.h index 3f453930d6..ce771ed7d2 100644 --- a/include/wx/window.h +++ b/include/wx/window.h @@ -1,8 +1,8 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: window.h +// Name: wx/window.h // Purpose: wxWindowBase class - the interface of wxWindow // Author: Vadim Zeitlin -// Modified by: +// Modified by: Ron Lee // Created: 01/02/97 // RCS-ID: $Id$ // Copyright: (c) wxWindows team @@ -12,7 +12,7 @@ #ifndef _WX_WINDOW_H_BASE_ #define _WX_WINDOW_H_BASE_ -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(__APPLE__) #pragma interface "windowbase.h" #endif @@ -32,10 +32,18 @@ #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__ @@ -49,7 +57,6 @@ // ---------------------------------------------------------------------------- class WXDLLEXPORT wxCaret; -class WXDLLEXPORT wxClientData; class WXDLLEXPORT wxControl; class WXDLLEXPORT wxCursor; class WXDLLEXPORT wxDC; @@ -62,6 +69,10 @@ class WXDLLEXPORT wxToolTip; class WXDLLEXPORT wxWindowBase; class WXDLLEXPORT wxWindow; +#if wxUSE_ACCESSIBILITY +class WXDLLEXPORT wxAccessible; +#endif + // ---------------------------------------------------------------------------- // (pseudo)template list classes // ---------------------------------------------------------------------------- @@ -74,39 +85,6 @@ WX_DECLARE_LIST_3(wxWindow, wxWindowBase, wxWindowList, wxWindowListNode, class WXDLLEXPORT_DATA(extern wxWindowList) wxTopLevelWindows; -// ---------------------------------------------------------------------------- -// helper classes used by [SG]etClientObject/Data -// -// TODO move into a separate header? -// ---------------------------------------------------------------------------- - -// 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 wxClientData -{ -public: - wxClientData() { } - virtual ~wxClientData() { } -}; - -class wxStringClientData : public wxClientData -{ -public: - wxStringClientData() { } - 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; -}; - // ---------------------------------------------------------------------------- // wxWindowBase is the base class for all GUI controls/widgets, this is the public // interface of this class. @@ -170,10 +148,14 @@ public: // window attributes // ----------------- + // NB: in future versions of wxWindows Set/GetTitle() will only work + // with the top level windows (such as dialogs and frames) and + // Set/GetLabel() only with the other ones (i.e. all controls). + // the title (or label, see below) of the window: the text which the // window shows - virtual void SetTitle( const wxString & WXUNUSED(title) ) { } - virtual wxString GetTitle() const { return ""; } + virtual void SetTitle( const wxString& WXUNUSED(title) ) {} + virtual wxString GetTitle() const { return wxEmptyString; } // label is just the same as the title (but for, e.g., buttons it // makes more sense to speak about labels) @@ -296,7 +278,18 @@ public: *h = s.y; } - // the generic centre function - centers the window on parent by + // There are times (and windows) where 'Best' size and 'Min' size + // are vastly out of sync. This should be remedied somehow, but in + // the meantime, this method will return the larger of BestSize + // (the window's smallest legible size), and any user specified + // MinSize hint. + wxSize GetAdjustedBestSize() const + { + wxSize s( DoGetBestSize() ); + return wxSize( wxMax( s.x, GetMinWidth() ), wxMax( s.y, GetMinHeight() ) ); + } + + // 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 direction = wxBOTH ); @@ -313,16 +306,63 @@ public: // set window size to wrap around its children virtual void Fit(); + // set virtual size to satisfy children + virtual void FitInside(); + // set min/max size of the window virtual void SetSizeHints( int minW, int minH, int maxW = -1, int maxH = -1, int incW = -1, int incH = -1 ); - int GetMinWidth() const { return m_minWidth; } - int GetMinHeight() const { return m_minHeight; } + virtual void SetVirtualSizeHints( int minW, int minH, + int maxW = -1, int maxH = -1 ); + + virtual int GetMinWidth() const { return m_minWidth; } + virtual int GetMinHeight() const { return m_minHeight; } int GetMaxWidth() const { return m_maxWidth; } int GetMaxHeight() const { return m_maxHeight; } + // Override this method to control the values given to Sizers etc. + virtual wxSize GetMaxSize() const { return wxSize( m_maxWidth, m_maxHeight ); } + + // 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 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. Default is to alias VirtualSize to ClientSize. + + virtual void DoSetVirtualSize( int x, int y ); + virtual wxSize DoGetVirtualSize() const; // { return m_virtualSize; } + + // 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 ) ); + } + // window state // ------------ @@ -352,7 +392,7 @@ public: // extra style: the less often used style bits which can't be set with // SetWindowStyleFlag() - void SetExtraStyle(long exStyle) { m_exStyle = exStyle; } + virtual void SetExtraStyle(long exStyle) { m_exStyle = exStyle; } long GetExtraStyle() const { return m_exStyle; } // make the window modal (all other windows unresponsive) @@ -361,12 +401,15 @@ public: virtual void SetThemeEnabled(bool enableTheme) { m_themeEnabled = enableTheme; } virtual bool GetThemeEnabled() const { return m_themeEnabled; } - // focus handling - // -------------- + // 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() /* = 0: implement in derived classes */; @@ -378,6 +421,20 @@ public: // click it virtual bool AcceptsFocusFromKeyboard() const { return AcceptsFocus(); } + // NB: these methods really don't belong here but with the current + // class hierarchy there is no other place for them :-( + + // get the default child of this parent, i.e. the one which is + // activated by pressing + virtual wxWindow *GetDefaultItem() const { return NULL; } + + // set this child as default, return the old default + virtual wxWindow *SetDefaultItem(wxWindow * WXUNUSED(child)) + { return NULL; } + + // set this child as temporary default + virtual void SetTmpDefaultItem(wxWindow * WXUNUSED(win)) { } + // parent/children relations // ------------------------- @@ -398,14 +455,24 @@ public: // 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 ); + + // 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 id ); wxWindow *FindWindow( const wxString& name ); - // implementation mostly - virtual void AddChild( wxWindowBase *child ); - virtual void RemoveChild( wxWindowBase *child ); + // Find a window among any window (all return NULL if not found) + static wxWindow *FindWindowById( long id, 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 // ------------------- @@ -422,6 +489,13 @@ public: 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); + // validators // ---------- @@ -432,18 +506,6 @@ public: virtual wxValidator *GetValidator() { return m_windowValidator; } #endif // wxUSE_VALIDATORS - // client data - // ----------- - - // each window may have associated client data: either a pointer to - // wxClientData object in which case it is managed by the window (i.e. - // it will delete the data when it's destroyed) or an untyped pointer - // which won't be deleted by the window - but not both of them - void SetClientObject( wxClientData *data ) { DoSetClientObject(data); } - wxClientData *GetClientObject() const { return DoGetClientObject(); } - - void SetClientData( void *data ) { DoSetClientData(data); } - void *GetClientData() const { return DoGetClientData(); } // dialog oriented functions // ------------------------- @@ -491,9 +553,12 @@ public: // move the mouse to the specified position virtual void WarpPointer(int x, int y) = 0; - // start or end mouse capture - virtual void CaptureMouse() = 0; - virtual void ReleaseMouse() = 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(); @@ -718,15 +783,6 @@ public: void SetConstraints( wxLayoutConstraints *constraints ); wxLayoutConstraints *GetConstraints() const { return m_constraints; } - // when using constraints, 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; } - - // do layout the window and its children - virtual bool Layout(); - // implementation only void UnsetConstraints(wxLayoutConstraints *c); wxWindowList *GetConstraintsInvolvedIn() const @@ -749,11 +805,42 @@ public: 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 - // TODO: what are they and how do they work?? - void SetSizer( wxSizer *sizer ); + void SetSizer(wxSizer *sizer, bool deleteOld = TRUE ); + void SetSizerAndFit( wxSizer *sizer, bool deleteOld = TRUE ); + wxSizer *GetSizer() const { return m_windowSizer; } -#endif // wxUSE_CONSTRAINTS + + // Track if this window is a member of a sizer + void SetContainingSizer(wxSizer* sizer) { m_containingSizer = 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 // backward compatibility // ---------------------- @@ -782,7 +869,31 @@ public: // platform-specific APIs virtual WXWidget GetHandle() const = 0; +#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 + protected: +#if wxUSE_CONSTRAINTS + // satisfy the constraints for the windows but don't set the window sizes + void SatisfyConstraints(); +#endif // wxUSE_CONSTRAINTS + + // Send the wxWindowDestroyEvent + void SendDestroyEvent(); + // the window id - a number which uniquely identifies a window among // its siblings unless it is -1 wxWindowID m_windowId; @@ -794,7 +905,10 @@ protected: // the minimal allowed size for the window (no minimal size if variable(s) // contain(s) -1) - int m_minWidth, m_minHeight, m_maxWidth, m_maxHeight; + int m_minWidth, + m_minHeight, + m_maxWidth, + m_maxHeight; // event handler for this window: usually is just 'this' but may be // changed with SetEventHandler() @@ -827,17 +941,6 @@ protected: wxAcceleratorTable m_acceleratorTable; #endif // wxUSE_ACCEL - // user data associated with the window: either an object which will be - // deleted by the window 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 window with - // wxClientData or vice versa) - union - { - wxClientData *m_clientObject; - void *m_clientData; - }; - // the tooltip for this window (may be NULL) #if wxUSE_TOOLTIPS wxToolTip *m_tooltip; @@ -850,28 +953,49 @@ protected: // constraints this window is involved in wxWindowList *m_constraintsInvolvedIn; +#endif // wxUSE_CONSTRAINTS - // top level and the parent sizers - // TODO what's this and how does it work?) + // this window's sizer wxSizer *m_windowSizer; - wxWindowBase *m_sizerParent; + + // The sizer this window is a member of, if any + wxSizer *m_containingSizer; // Layout() window automatically when its size changes? bool m_autoLayout:1; -#endif // wxUSE_CONSTRAINTS // 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; + // window attributes long m_windowStyle, m_exStyle; wxString m_windowName; bool m_themeEnabled; -protected: +#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; + + int m_minVirtualWidth; // VirtualSizeHints + int m_minVirtualHeight; + int m_maxVirtualWidth; + int m_maxVirtualHeight; + // common part of all ctors: it is not virtual because it is called from // ctor void InitBase(); @@ -888,8 +1012,16 @@ protected: // set the best size for the control if the default size was given: // replaces the fields of size == -1 with the best values for them and // calls SetSize() if needed + // + // This function is rather unfortunately named.. it's really just a + // smarter SetSize / convenience function for expanding wxDefaultSize. + // Note that it does not influence the value returned by GetBestSize + // at all. void SetBestSize(const wxSize& size) { + // the size only needs to be changed if the current size is incomplete, + // i.e. one of the components was specified as default -- so if both + // were given, simply don't do anything if ( size.x == -1 || size.y == -1 ) { wxSize sizeBest = DoGetBestSize(); @@ -920,6 +1052,10 @@ protected: 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 DoGetSize( int *width, int *height ) const = 0; @@ -954,20 +1090,19 @@ protected: virtual bool DoPopupMenu( wxMenu *menu, int x, int y ) = 0; #endif // wxUSE_MENUS - // client data accessors - virtual void DoSetClientObject( wxClientData *data ); - virtual wxClientData *DoGetClientObject() const; + // Makes an adjustment to the window position (for example, a frame that has + // a toolbar that it manages itself). + virtual void AdjustForParentClientOrigin(int& x, int& y, int sizeFlags) const; - virtual void DoSetClientData( void *data ); - virtual void *DoGetClientData() const; - - // what kind of data do we have? - wxClientDataType m_clientDataType; private: + // contains the last id generated by NewControlId static int ms_lastControlId; + // the stack of windows which have captured the mouse + static struct WXDLLEXPORT wxWindowNext *ms_winCaptureNext; + DECLARE_ABSTRACT_CLASS(wxWindowBase) DECLARE_NO_COPY_CLASS(wxWindowBase) DECLARE_EVENT_TABLE() @@ -996,7 +1131,15 @@ private: #define sm_classwxWindowGTK sm_classwxWindow #endif // wxUniv #include "wx/gtk/window.h" -#elif defined(__WXGL__) +#elif defined(__WXX11__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowX11 + #else // !wxUniv + #define wxWindowX11 wxWindow + #define sm_classwxWindowX11 sm_classwxWindow + #endif // wxUniv + #include "wx/x11/window.h" +#elif defined(__WXMGL__) #ifdef __WXUNIVERSAL__ #define wxWindowNative wxWindowMGL #else // !wxUniv @@ -1004,8 +1147,6 @@ private: #define sm_classwxWindowMGL sm_classwxWindow #endif // wxUniv #include "wx/mgl/window.h" -#elif defined(__WXQT__) - #include "wx/qt/window.h" #elif defined(__WXMAC__) #ifdef __WXUNIVERSAL__ #define wxWindowNative wxWindowMac @@ -1058,8 +1199,108 @@ WXDLLEXPORT extern wxPoint wxGetMousePosition(); // get the currently active window of this application or NULL WXDLLEXPORT extern wxWindow *wxGetActiveWindow(); +// get the (first) top level parent window +WXDLLEXPORT wxWindow* wxGetTopLevelParent(wxWindow *win); + // deprecated (doesn't start with 'wx' prefix), use wxWindow::NewControlId() inline int NewControlId() { return wxWindowBase::NewControlId(); } +#if wxUSE_ACCESSIBILITY +// ---------------------------------------------------------------------------- +// accessible object for windows +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT 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* childId); + + // 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); + + // 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_ACCESSIBILITY + + #endif // _WX_WINDOW_H_BASE_ +