X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4f24cbbd3dbbf3eb45225b36044c41e76b1e5eef..66c2bf7b1d9326fb650acfaae22ec50528cfbf7c:/include/wx/window.h diff --git a/include/wx/window.h b/include/wx/window.h index fb66bf004e..199c4b7ef3 100644 --- a/include/wx/window.h +++ b/include/wx/window.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: Ron Lee // Created: 01/02/97 -// RCS-ID: $Id$ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -118,6 +117,7 @@ enum wxWindowVariant // 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, @@ -148,7 +148,9 @@ WX_DECLARE_LIST_3(wxWindow, wxWindowBase, wxWindowList, wxWindowListNode, class // ---------------------------------------------------------------------------- extern WXDLLIMPEXP_DATA_CORE(wxWindowList) wxTopLevelWindows; -extern WXDLLIMPEXP_DATA_CORE(wxList) wxPendingDelete; + +// 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 @@ -171,15 +173,6 @@ public: // Create() wxWindowBase() ; - // pseudo ctor (can't be virtual, called from ctor) - 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); - virtual ~wxWindowBase(); // deleting the window @@ -374,12 +367,8 @@ public: // 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 - { - if (m_bestSizeCache.IsFullySpecified()) - return m_bestSizeCache; - return DoGetBestSize(); - } + wxSize GetBestSize() const; + void GetBestSize(int *w, int *h) const { wxSize s = GetBestSize(); @@ -389,6 +378,13 @@ public: *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; } @@ -402,7 +398,7 @@ public: // 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. - wxSize GetEffectiveMinSize() const; + virtual wxSize GetEffectiveMinSize() const; wxDEPRECATED( wxSize GetBestFittingSize() const ); // replaced by GetEffectiveMinSize wxDEPRECATED( wxSize GetAdjustedMinSize() const ); // replaced by GetEffectiveMinSize @@ -418,7 +414,7 @@ public: void Centre(int dir = wxBOTH) { DoCentre(dir); } void Center(int dir = wxBOTH) { DoCentre(dir); } - // centre with respect to the the parent window + // centre with respect to the parent window void CentreOnParent(int dir = wxBOTH) { DoCentre(dir); } void CenterOnParent(int dir = wxBOTH) { CentreOnParent(dir); } @@ -456,10 +452,10 @@ public: // Call these to override what GetBestSize() returns. This - // method is only virtual because it is overriden in wxTLW + // method is only virtual because it is overridden in wxTLW // as a different API for SetSizeHints(). - virtual void SetMinSize(const wxSize& minSize) { m_minWidth = minSize.x; m_minHeight = minSize.y; } - virtual void SetMaxSize(const wxSize& maxSize) { m_maxWidth = maxSize.x; m_maxHeight = maxSize.y; } + 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) @@ -490,7 +486,7 @@ public: // 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. + // 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 ); } @@ -524,6 +520,11 @@ public: 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; @@ -535,12 +536,7 @@ public: // tells the item how much more space there is available in the opposite // direction (-1 if unknown). virtual bool - InformFirstDirection(int WXUNUSED(direction), - int WXUNUSED(size), - int WXUNUSED(availableOtherDir)) - { - return false; - } + 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 @@ -563,6 +559,43 @@ public: // 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 // ------------ @@ -619,7 +652,7 @@ public: virtual void SetWindowStyleFlag( long style ) { m_windowStyle = style; } virtual long GetWindowStyleFlag() const { return m_windowStyle; } - // just some (somewhat shorter) synonims + // just some (somewhat shorter) synonyms void SetWindowStyle( long style ) { SetWindowStyleFlag(style); } long GetWindowStyle() const { return GetWindowStyleFlag(); } @@ -638,9 +671,10 @@ public: bool HasExtraStyle(int exFlag) const { return (m_exStyle & exFlag) != 0; } +#if WXWIN_COMPATIBILITY_2_8 // make the window modal (all other windows unresponsive) - virtual void MakeModal(bool modal = true); - + wxDEPRECATED( virtual void MakeModal(bool modal = true) ); +#endif // (primitive) theming support // --------------------------- @@ -689,8 +723,13 @@ public: virtual bool AcceptsFocusFromKeyboard() const { return AcceptsFocus(); } - // this is mostly a helper for the various functions using it below - bool CanBeFocused() const { return IsShown() && IsEnabled(); } + // 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(); } @@ -754,8 +793,12 @@ public: // 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 ) { m_parent = (wxWindow *)parent; } + 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 ); @@ -792,7 +835,7 @@ public: // replace the event handler (allows to completely subclass the // window) - void SetEventHandler( wxEvtHandler *handler ) { m_eventHandler = handler; } + void SetEventHandler( wxEvtHandler *handler ); // push/pop event handler: allows to chain a custom event handler to // alreasy existing ones @@ -806,13 +849,59 @@ public: // be there) bool RemoveEventHandler(wxEvtHandler *handler); - // 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. + // 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 // ---------- @@ -858,16 +947,16 @@ public: // dialog units translations // ------------------------- - wxPoint ConvertPixelsToDialog( const wxPoint& pt ); - wxPoint ConvertDialogToPixels( const wxPoint& pt ); - wxSize ConvertPixelsToDialog( const wxSize& sz ) + 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 ) + wxSize ConvertDialogToPixels( const wxSize& sz ) const { wxPoint pt(ConvertDialogToPixels(wxPoint(sz.x, sz.y))); @@ -998,15 +1087,22 @@ public: wxColour GetForegroundColour() const; // Set/get the background style. - // Pass one of wxBG_STYLE_SYSTEM, wxBG_STYLE_COLOUR, wxBG_STYLE_CUSTOM - virtual bool SetBackgroundStyle(wxBackgroundStyle style) { m_backgroundStyle = style; return true; } - virtual wxBackgroundStyle GetBackgroundStyle() const { return m_backgroundStyle; } + 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; @@ -1035,12 +1131,14 @@ public: // get the width/height/... of the text using current or specified // font - virtual void GetTextExtent(const wxString& string, - int *x, int *y, - int *descent = (int *) NULL, - int *externalLeading = (int *) NULL, - const wxFont *theFont = (const wxFont *) NULL) - const = 0; + 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 { @@ -1108,7 +1206,8 @@ public: // simply return the id of the selected item or wxID_NONE without // generating any events - int GetPopupMenuSelectionFromUser(wxMenu& menu, const wxPoint& pos) + 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); } @@ -1121,12 +1220,11 @@ public: // scrollbars // ---------- - // does the window have the scrollbar for this orientation? - bool HasScrollbar(int orient) const - { - return (m_windowStyle & - (orient == wxHORIZONTAL ? wxHSCROLL : wxVSCROLL)) != 0; - } + // 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, @@ -1141,7 +1239,7 @@ public: // scroll window to the specified position virtual void ScrollWindow( int dx, int dy, - const wxRect* rect = (wxRect *) NULL ) = 0; + const wxRect* rect = NULL ) = 0; // scrolls window by line/page: note that not all controls support this // @@ -1216,6 +1314,15 @@ public: // 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 @@ -1327,10 +1434,11 @@ public: // virtual function for implementing internal idle // behaviour - virtual void OnInternalIdle() {} + virtual void OnInternalIdle(); - // call internal idle recursively -// void ProcessInternalIdle() ; + // 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 @@ -1377,10 +1485,43 @@ public: // 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 TryValidator(wxEvent& event); - virtual bool TryParent(wxEvent& event); + virtual bool TryBefore(wxEvent& event); + virtual bool TryAfter(wxEvent& event); enum WindowOrder { @@ -1402,26 +1543,16 @@ protected: void SatisfyConstraints(); #endif // wxUSE_CONSTRAINTS - // Send the wxWindowDestroyEvent + // Send the wxWindowDestroyEvent if not done yet and sets m_isBeingDeleted + // to true void SendDestroyEvent(); - // 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; } - // 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)) { } - // called when the on-screen widget state changes and provides an - // an opportunity for the widget to update its visual state (colours, - // fonts, anything else) as necessary - virtual void OnEnabled(bool WXUNUSED(enabled)) { } - // the window id - a number which uniquely identifies a window among // its siblings unless it is wxID_ANY @@ -1567,6 +1698,13 @@ protected: // 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; @@ -1588,7 +1726,20 @@ protected: // same size as it would have after a call to Fit() virtual wxSize DoGetBestSize() const; - // this is the virtual function to be overriden in any derived class which + // 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, @@ -1602,6 +1753,15 @@ protected: 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 @@ -1645,27 +1805,26 @@ protected: static void NotifyCaptureLost(); private: - // recursively call our own and our children OnEnabled() when the + // 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 handler used by GetPopupMenuSelectionFromUser() + // 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 - // the stack of windows which have captured the mouse - static struct WXDLLIMPEXP_FWD_CORE wxWindowNext *ms_winCaptureNext; + // layout the window children when its size changes unless this was + // explicitly disabled with SetAutoLayout(false) + void InternalOnSize(wxSizeEvent& event); - // the window that currently has mouse capture - static wxWindow *ms_winCaptureCurrent; - - // indicates if execution is inside CaptureMouse/ReleaseMouse - static bool ms_winCaptureChanging; + // 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 @@ -1674,7 +1833,7 @@ private: DECLARE_ABSTRACT_CLASS(wxWindowBase) - DECLARE_NO_COPY_CLASS(wxWindowBase) + wxDECLARE_NO_COPY_CLASS(wxWindowBase); DECLARE_EVENT_TABLE() }; @@ -1707,14 +1866,7 @@ inline void wxWindowBase::SetInitialBestSize(const wxSize& size) // ---------------------------------------------------------------------------- // include the declaration of the platform-specific class -#if defined(__WXPALMOS__) - #ifdef __WXUNIVERSAL__ - #define wxWindowNative wxWindowPalm - #else // !wxUniv - #define wxWindowPalm wxWindow - #endif // wxUniv/!wxUniv - #include "wx/palmos/window.h" -#elif defined(__WXMSW__) +#if defined(__WXMSW__) #ifdef __WXUNIVERSAL__ #define wxWindowNative wxWindowMSW #else // !wxUniv @@ -1744,9 +1896,6 @@ inline void wxWindowBase::SetInitialBestSize(const wxSize& size) #define wxWindowX11 wxWindow #endif // wxUniv #include "wx/x11/window.h" -#elif defined(__WXMGL__) - #define wxWindowNative wxWindowMGL - #include "wx/mgl/window.h" #elif defined(__WXDFB__) #define wxWindowNative wxWindowDFB #include "wx/dfb/window.h" @@ -1790,7 +1939,7 @@ inline void wxWindowBase::SetInitialBestSize(const wxSize& size) inline wxWindow *wxWindowBase::GetGrandParent() const { - return m_parent ? m_parent->GetParent() : (wxWindow *)NULL; + return m_parent ? m_parent->GetParent() : NULL; } // ----------------------------------------------------------------------------