X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a2053b27b318fe81918a72c838944d1e8cd1524f..cf1a9b45c7b70f217d3cc282ab77df8feaadcdeb:/include/wx/window.h diff --git a/include/wx/window.h b/include/wx/window.h index c6d4e51be5..fe9d83b8ab 100644 --- a/include/wx/window.h +++ b/include/wx/window.h @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////// // Name: window.h -// Purpose: wxWindowBase class - the interface of wxWindowBase +// Purpose: wxWindowBase class - the interface of wxWindow // Author: Vadim Zeitlin // Modified by: // Created: 01/02/97 @@ -12,6 +12,10 @@ #ifndef _WX_WINDOW_H_BASE_ #define _WX_WINDOW_H_BASE_ +#ifdef __GNUG__ + #pragma interface "windowbase.h" +#endif + // ---------------------------------------------------------------------------- // headers which we must include here // ---------------------------------------------------------------------------- @@ -24,23 +28,29 @@ #include "wx/font.h" // so we can't do without them #include "wx/colour.h" #include "wx/region.h" -#include "wx/accel.h" +#include "wx/utils.h" + +#include "wx/validate.h" // for wxDefaultValidator (always include it) + +#if wxUSE_ACCEL + #include "wx/accel.h" +#endif // wxUSE_ACCEL // ---------------------------------------------------------------------------- // forward declarations // ---------------------------------------------------------------------------- +class WXDLLEXPORT wxCaret; class WXDLLEXPORT wxClientData; class WXDLLEXPORT wxControl; class WXDLLEXPORT wxCursor; -class WXDLLEXPORT wxDc; +class WXDLLEXPORT wxDC; class WXDLLEXPORT wxDropTarget; class WXDLLEXPORT wxItemResource; class WXDLLEXPORT wxLayoutConstraints; class WXDLLEXPORT wxResourceTable; class WXDLLEXPORT wxSizer; class WXDLLEXPORT wxToolTip; -class WXDLLEXPORT wxValidator; class WXDLLEXPORT wxWindowBase; class WXDLLEXPORT wxWindow; @@ -48,7 +58,7 @@ class WXDLLEXPORT wxWindow; // (pseudo)template list classes // ---------------------------------------------------------------------------- -WX_DECLARE_LIST_3(wxWindow, wxWindowBase, wxWindowList, wxWindowListNode); +WX_DECLARE_LIST_3(wxWindow, wxWindowBase, wxWindowList, wxWindowListNode, class WXDLLEXPORT); // ---------------------------------------------------------------------------- // global variables @@ -109,6 +119,7 @@ public: const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, const wxString& name = wxPanelNameStr); virtual ~wxWindowBase(); @@ -152,7 +163,8 @@ public: // label is just the same as the title (but for, e.g., buttons it // makes more sense to speak about labels) - wxString GetLabel() const { return GetTitle(); } + virtual void SetLabel(const wxString& label) { SetTitle(label); } + virtual wxString GetLabel() const { return GetTitle(); } // the window name is used for ressource setting in X, it is not the // same as the window title/label @@ -166,7 +178,13 @@ public: // generate a control id for the controls which were not given one by // user - static int NewControlId() { return ++ms_lastControlId; } + static int NewControlId() { return --ms_lastControlId; } + // get the id of the control following the one with the given + // (autogenerated) id + static int NextControlId(int id) { return id - 1; } + // get the id of the control preceding the one with the given + // (autogenerated) id + static int PrevControlId(int id) { return id + 1; } // moving/resizing // --------------- @@ -241,9 +259,31 @@ public: return wxSize(w, h); } + // get the size best suited for the window (in fact, minimal + // acceptable size using which it will still look "nice") + wxSize GetBestSize() const { return DoGetBestSize(); } + void GetBestSize(int *w, int *h) const + { + wxSize s = DoGetBestSize(); + if ( w ) + *w = s.x; + if ( h ) + *h = s.y; + } + + // 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 ); + void Center( int direction = wxBOTH ) { Centre(direction); } + + // centre on screen (only works for top level windows) + void CentreOnScreen(int dir = wxBOTH) { Centre(dir | wxCENTER_ON_SCREEN); } + void CenterOnScreen(int dir = wxBOTH) { CentreOnScreen(dir); } + // centre with respect to the the parent window - void Centre( int direction = wxHORIZONTAL ); - void Center( int direction = wxHORIZONTAL ) { Centre(direction); } + void CentreOnParent(int dir = wxBOTH) { Centre(dir | wxCENTER_FRAME); } + void CenterOnParent(int dir = wxBOTH) { CentreOnParent(dir); } // set window size to wrap around its children virtual void Fit(); @@ -253,6 +293,11 @@ public: int maxW = -1, int maxH = -1, int incW = -1, int incH = -1 ); + int GetMinWidth() const { return m_minWidth; } + int GetMinHeight() const { return m_minHeight; } + int GetMaxWidth() const { return m_maxWidth; } + int GetMaxHeight() const { return m_maxHeight; } + // window state // ------------ @@ -278,13 +323,19 @@ public: long GetWindowStyle() const { return GetWindowStyleFlag(); } bool HasFlag(int flag) const { return (m_windowStyle & flag) != 0; } + virtual bool IsRetained() const { return HasFlag(wxRETAINED); } - virtual bool IsRetained() const - { return (m_windowStyle & wxRETAINED) != 0; } + // extra style: the less often used style bits which can't be set with + // SetWindowStyleFlag() + void SetExtraStyle(long exStyle) { m_exStyle = exStyle; } + long GetExtraStyle() const { return m_exStyle; } // make the window modal (all other windows unresponsive) virtual void MakeModal(bool modal = TRUE); + virtual void SetThemeEnabled(bool enableTheme) { m_themeEnabled = enableTheme; } + virtual bool GetThemeEnabled() const { return m_themeEnabled; } + // focus handling // -------------- @@ -309,7 +360,7 @@ public: inline wxWindow *GetGrandParent() const; // is this window a top level one? - bool IsTopLevel() const { return m_parent != 0; } + virtual bool IsTopLevel() const; // it doesn't really change parent, use ReParent() instead void SetParent( wxWindowBase *parent ) { m_parent = (wxWindow *)parent; } @@ -344,26 +395,22 @@ public: // validators and client data // -------------------------- +#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 // 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 - virtual void SetClientObject( wxClientData *data ) - { - if ( m_clientObject ) - delete m_clientObject; - - m_clientObject = data; - } - virtual wxClientData *GetClientObject() const { return m_clientObject; } + // which won't be deleted by the window - but not both of them + void SetClientObject( wxClientData *data ) { DoSetClientObject(data); } + wxClientData *GetClientObject() const { return DoGetClientObject(); } - virtual void SetClientData( void *data ) { m_clientData = data; } - virtual void *GetClientData() const { return m_clientData; } + void SetClientData( void *data ) { DoSetClientData(data); } + void *GetClientData() const { return DoGetClientData(); } // dialog oriented functions // ------------------------- @@ -377,12 +424,14 @@ public: virtual void InitDialog(); +#if wxUSE_ACCEL // accelerators // ------------ virtual void SetAcceleratorTable( const wxAcceleratorTable& accel ) { m_acceleratorTable = accel; } wxAcceleratorTable *GetAcceleratorTable() { return &m_acceleratorTable; } +#endif // wxUSE_ACCEL // dialog units translations // ------------------------- @@ -424,7 +473,7 @@ public: virtual void Clear() = 0; // adjust DC for drawing on this window - virtual void PrepareDC( wxDC &dc ) { } + virtual void PrepareDC( wxDC & WXUNUSED(dc) ) { } // the update region of the window contains the areas which must be // repainted by the program @@ -464,6 +513,13 @@ public: const wxFont& GetFont() const { return m_font; } wxFont& GetFont() { return m_font; } +#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; @@ -478,15 +534,35 @@ public: const = 0; // translate to/from screen/client coordinates (pointers may be NULL) - virtual void ClientToScreen( int *x, int *y ) const = 0; - virtual void ScreenToClient( int *x, int *y ) const = 0; + void ClientToScreen( int *x, int *y ) const + { DoClientToScreen(x, y); } + void ScreenToClient( int *x, int *y ) const + { DoScreenToClient(x, y); } + 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); + } // misc // ---- void UpdateWindowUI(); - virtual bool PopupMenu( wxMenu *menu, int x, int y ) = 0; + bool PopupMenu( wxMenu *menu, const wxPoint& pos ) + { return DoPopupMenu(menu, pos.x, pos.y); } + bool PopupMenu( wxMenu *menu, int x, int y ) + { return DoPopupMenu(menu, x, y); } // scrollbars // ---------- @@ -506,8 +582,24 @@ public: virtual void ScrollWindow( int dx, int dy, const wxRect* rect = (wxRect *) NULL ) = 0; + // 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); + // associate this help text with all windows with the same id as this + // one + void SetHelpTextForId(const wxString& text); + // get the help string associated with this window (may be empty) + wxString GetHelpText() const; +#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 ); @@ -555,10 +647,9 @@ public: virtual void SetConstraintSizes(bool recurse = TRUE); virtual bool LayoutPhase1(int *noChanges); virtual bool LayoutPhase2(int *noChanges); - virtual bool DoPhase(int); + virtual bool DoPhase(int phase); // these methods are virtual but normally won't be overridden - virtual void TransformSizerToActual(int *x, int *y) const ; 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 ; @@ -569,12 +660,6 @@ public: // TODO: what are they and how do they work?? void SetSizer( wxSizer *sizer ); wxSizer *GetSizer() const { return m_windowSizer; } - - void SetSizerParent( wxWindowBase *win ) { m_sizerParent = win; } - wxWindowBase *GetSizerParent() const { return m_sizerParent; } - - virtual void SizerSetSize(int x, int y, int w, int h); - virtual void SizerMove(int x, int y); #endif // wxUSE_CONSTRAINTS // backward compatibility @@ -594,25 +679,19 @@ public: // event handlers void OnSysColourChanged( wxSysColourChangedEvent& event ); void OnInitDialog( wxInitDialogEvent &event ); + void OnMiddleClick( wxMouseEvent& event ); +#if wxUSE_HELP + void OnHelp(wxHelpEvent& event); +#endif // wxUSE_HELP -/* - What is this doing in the platform independent part? - - // accessors - WXWidget GetHandle() const { return m_widget; } - - // the window handle (for the underlying windowing system) and the window - // id - a number which uniquely identifies a window among its siblings - // unless it is -1 - union - { - // we have 2 common names for this member, one for MSW and the other - // for the rest of the world - WXWidget m_widget; - WXWidget m_hWnd; - }; -*/ + // get the haqndle 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; +protected: + // the window id - a number which uniquely identifies a window among + // its siblings unless it is -1 wxWindowID m_windowId; // the parent window of this window (or NULL) and the list of the children @@ -628,8 +707,10 @@ public: // 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; @@ -640,18 +721,29 @@ public: wxFont m_font; wxColour m_backgroundColour, m_foregroundColour; +#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 // 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 - wxClientData *m_clientObject; - void *m_clientData; + // 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 @@ -681,8 +773,10 @@ public: bool m_isBeingDeleted:1; // window attributes - long m_windowStyle; + long m_windowStyle, + m_exStyle; wxString m_windowName; + bool m_themeEnabled; protected: // common part of all ctors: it is not virtual because it is called from @@ -694,6 +788,26 @@ protected: static int WidthDefault(int w) { return w == -1 ? 20 : w; } static int HeightDefault(int h) { return h == -1 ? 20 : h; } + // sets the size to be size but take width and/or height from + // DoGetBestSize() if width/height of size is -1 + // + // NB: when calling this function from the ctor, the DoGetBestSize() of + // the class with the same name as the ctor, not the real (most + // derived) one - but this is what we usually want + void SetSizeOrDefault(const wxSize& size = wxDefaultSize) + { + if ( size.x == -1 || size.y == -1 ) + { + wxSize sizeDef = GetBestSize(); + SetSize( size.x == -1 ? sizeDef.x : size.x, + size.y == -1 ? sizeDef.y : size.y); + } + else + { + SetSize(size); + } + } + // more pure virtual functions // --------------------------- @@ -706,11 +820,20 @@ protected: // overloaded Something()s in terms of DoSomething() which will be the // only one to be virtual. + // coordinates translation + virtual void DoClientToScreen( int *x, int *y ) const = 0; + virtual void DoScreenToClient( int *x, int *y ) const = 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; 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 is the virtual function to be overriden 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 @@ -721,14 +844,38 @@ protected: // same as DoSetSize() for the client size virtual void DoSetClientSize(int width, int height) = 0; + // 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 + virtual void DoMoveWindow(int x, int y, int width, int height) = 0; + #if wxUSE_TOOLTIPS virtual void DoSetToolTip( wxToolTip *tip ); #endif // wxUSE_TOOLTIPS + virtual bool DoPopupMenu( wxMenu *menu, int x, int y ) = 0; + + // 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? + enum wxClientDataType + { + ClientData_None, // we don't know yet because we don't have it at all + ClientData_Object, // our client data is typed and we own it + ClientData_Void // client data is untyped and we don't own it + } m_clientDataType; + private: // contains the last id generated by NewControlId static int ms_lastControlId; + DECLARE_NO_COPY_CLASS(wxWindowBase); DECLARE_EVENT_TABLE() }; @@ -746,6 +893,8 @@ private: #include "wx/qt/window.h" #elif defined(__WXMAC__) #include "wx/mac/window.h" +#elif defined(__WXPM__) + #include "wx/os2/window.h" #endif // ---------------------------------------------------------------------------- @@ -753,17 +902,26 @@ private: // forward dependencies // ---------------------------------------------------------------------------- -wxWindow *wxWindowBase::GetGrandParent() const +inline wxWindow *wxWindowBase::GetGrandParent() const { return m_parent ? m_parent->GetParent() : (wxWindow *)NULL; } // ---------------------------------------------------------------------------- -// global function +// global functions // ---------------------------------------------------------------------------- -extern wxWindow* WXDLLEXPORT wxGetActiveWindow(); -inline int WXDLLEXPORT NewControlId() { return wxWindowBase::NewControlId(); } +WXDLLEXPORT extern wxWindow* wxGetActiveWindow(); + +// Find the wxWindow at the current mouse position, also returning the mouse +// position. +WXDLLEXPORT extern wxWindow* wxFindWindowAtPointer(wxPoint& pt); + +// Get the current mouse position. +WXDLLEXPORT extern wxPoint wxGetMousePosition(); + +// deprecated (doesn't start with 'wx' prefix), use wxWindow::NewControlId() +inline int NewControlId() { return wxWindowBase::NewControlId(); } #endif // _WX_WINDOW_H_BASE_