]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/window.h
hack to fix crash when creating a DC for a widgetless window
[wxWidgets.git] / include / wx / window.h
index e801a29cf59f181f79513199d339c85d3f426f59..3a1e9362bbf9cfcda1f0ab57729c778169ea072c 100644 (file)
@@ -1,6 +1,6 @@
 ///////////////////////////////////////////////////////////////////////////////
 // Name:        window.h
 ///////////////////////////////////////////////////////////////////////////////
 // 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
 // Author:      Vadim Zeitlin
 // Modified by:
 // Created:     01/02/97
 #include "wx/font.h"            // so we can't do without them
 #include "wx/colour.h"
 #include "wx/region.h"
 #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
 // ----------------------------------------------------------------------------
 
 
 // ----------------------------------------------------------------------------
 // forward declarations
 // ----------------------------------------------------------------------------
 
+class WXDLLEXPORT wxCaret;
 class WXDLLEXPORT wxClientData;
 class WXDLLEXPORT wxControl;
 class WXDLLEXPORT wxCursor;
 class WXDLLEXPORT wxClientData;
 class WXDLLEXPORT wxControl;
 class WXDLLEXPORT wxCursor;
@@ -44,7 +51,6 @@ class WXDLLEXPORT wxLayoutConstraints;
 class WXDLLEXPORT wxResourceTable;
 class WXDLLEXPORT wxSizer;
 class WXDLLEXPORT wxToolTip;
 class WXDLLEXPORT wxResourceTable;
 class WXDLLEXPORT wxSizer;
 class WXDLLEXPORT wxToolTip;
-class WXDLLEXPORT wxValidator;
 class WXDLLEXPORT wxWindowBase;
 class WXDLLEXPORT wxWindow;
 
 class WXDLLEXPORT wxWindowBase;
 class WXDLLEXPORT wxWindow;
 
@@ -113,6 +119,7 @@ public:
                     const wxPoint& pos = wxDefaultPosition,
                     const wxSize& size = wxDefaultSize,
                     long style = 0,
                     const wxPoint& pos = wxDefaultPosition,
                     const wxSize& size = wxDefaultSize,
                     long style = 0,
+                    const wxValidator& validator = wxDefaultValidator,
                     const wxString& name = wxPanelNameStr);
 
     virtual ~wxWindowBase();
                     const wxString& name = wxPanelNameStr);
 
     virtual ~wxWindowBase();
@@ -156,6 +163,7 @@ public:
 
         // label is just the same as the title (but for, e.g., buttons it
         // makes more sense to speak about labels)
 
         // label is just the same as the title (but for, e.g., buttons it
         // makes more sense to speak about labels)
+    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
     virtual wxString GetLabel() const { return GetTitle(); }
 
         // the window name is used for ressource setting in X, it is not the
@@ -171,6 +179,12 @@ public:
         // generate a control id for the controls which were not given one by
         // user
     static int NewControlId() { return --ms_lastControlId; }
         // generate a control id for the controls which were not given one by
         // user
     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
     // ---------------
 
     // moving/resizing
     // ---------------
@@ -245,9 +259,31 @@ public:
         return wxSize(w, h);
     }
 
         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
         // 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();
 
         // set window size to wrap around its children
     virtual void Fit();
@@ -257,6 +293,11 @@ public:
                                int maxW = -1, int maxH = -1,
                                int incW = -1, int incH = -1 );
 
                                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
     // ------------
 
     // window state
     // ------------
 
@@ -282,9 +323,12 @@ public:
     long GetWindowStyle() const { return GetWindowStyleFlag(); }
 
     bool HasFlag(int flag) const { return (m_windowStyle & flag) != 0; }
     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);
 
         // make the window modal (all other windows unresponsive)
     virtual void MakeModal(bool modal = TRUE);
@@ -313,7 +357,7 @@ public:
     inline wxWindow *GetGrandParent() const;
 
         // is this window a top level one?
     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; }
 
         // it doesn't really change parent, use ReParent() instead
     void SetParent( wxWindowBase *parent ) { m_parent = (wxWindow *)parent; }
@@ -348,26 +392,22 @@ public:
     // validators and client data
     // --------------------------
 
     // 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; }
         // 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
 
         // 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;
+        // which won't be deleted by the window - but not both of them
+    void SetClientObject( wxClientData *data ) { DoSetClientObject(data); }
+    wxClientData *GetClientObject() const { return DoGetClientObject(); }
 
 
-        m_clientObject = data;
-    }
-    virtual wxClientData *GetClientObject() const { return m_clientObject; }
-
-    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
     // -------------------------
 
     // dialog oriented functions
     // -------------------------
@@ -381,12 +421,14 @@ public:
 
     virtual void InitDialog();
 
 
     virtual void InitDialog();
 
+#if wxUSE_ACCEL
     // accelerators
     // ------------
     virtual void SetAcceleratorTable( const wxAcceleratorTable& accel )
         { m_acceleratorTable = accel; }
     wxAcceleratorTable *GetAcceleratorTable()
         { return &m_acceleratorTable; }
     // accelerators
     // ------------
     virtual void SetAcceleratorTable( const wxAcceleratorTable& accel )
         { m_acceleratorTable = accel; }
     wxAcceleratorTable *GetAcceleratorTable()
         { return &m_acceleratorTable; }
+#endif // wxUSE_ACCEL
 
     // dialog units translations
     // -------------------------
 
     // dialog units translations
     // -------------------------
@@ -468,6 +510,13 @@ public:
     const wxFont& GetFont() const { return m_font; }
     wxFont& GetFont() { return m_font; }
 
     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;
         // get the (average) character size for the current font
     virtual int GetCharHeight() const = 0;
     virtual int GetCharWidth() const = 0;
@@ -482,15 +531,35 @@ public:
                                const = 0;
 
         // translate to/from screen/client coordinates (pointers may be NULL)
                                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();
 
 
     // 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
     // ----------
 
     // scrollbars
     // ----------
@@ -559,10 +628,9 @@ public:
     virtual void SetConstraintSizes(bool recurse = TRUE);
     virtual bool LayoutPhase1(int *noChanges);
     virtual bool LayoutPhase2(int *noChanges);
     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
 
         // 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 ;
     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 ;
@@ -573,12 +641,6 @@ public:
         // TODO: what are they and how do they work??
     void SetSizer( wxSizer *sizer );
     wxSizer *GetSizer() const { return m_windowSizer; }
         // 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
 #endif // wxUSE_CONSTRAINTS
 
     // backward compatibility
@@ -598,6 +660,7 @@ public:
         // event handlers
     void OnSysColourChanged( wxSysColourChangedEvent& event );
     void OnInitDialog( wxInitDialogEvent &event );
         // event handlers
     void OnSysColourChanged( wxSysColourChangedEvent& event );
     void OnInitDialog( wxInitDialogEvent &event );
+    void OnMiddleClick( wxMouseEvent& event );
 
         // 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
 
         // 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
@@ -605,7 +668,7 @@ public:
     virtual WXWidget GetHandle() const = 0;
 
 protected:
     virtual WXWidget GetHandle() const = 0;
 
 protected:
-    // the window id - a number which uniquely identifies a window among 
+    // the window id - a number which uniquely identifies a window among
     // its siblings unless it is -1
     wxWindowID           m_windowId;
 
     // its siblings unless it is -1
     wxWindowID           m_windowId;
 
@@ -622,8 +685,10 @@ protected:
     // changed with SetEventHandler()
     wxEvtHandler        *m_eventHandler;
 
     // changed with SetEventHandler()
     wxEvtHandler        *m_eventHandler;
 
+#if wxUSE_VALIDATORS
     // associated validator or NULL if none
     wxValidator         *m_windowValidator;
     // associated validator or NULL if none
     wxValidator         *m_windowValidator;
+#endif // wxUSE_VALIDATORS
 
 #if wxUSE_DRAG_AND_DROP
     wxDropTarget        *m_dropTarget;
 
 #if wxUSE_DRAG_AND_DROP
     wxDropTarget        *m_dropTarget;
@@ -634,18 +699,29 @@ protected:
     wxFont               m_font;
     wxColour             m_backgroundColour, m_foregroundColour;
 
     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;
 
     // 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;
     // 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
 
     // 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
 
     // the tooltip for this window (may be NULL)
 #if wxUSE_TOOLTIPS
@@ -675,7 +751,8 @@ protected:
     bool                 m_isBeingDeleted:1;
 
     // window attributes
     bool                 m_isBeingDeleted:1;
 
     // window attributes
-    long                 m_windowStyle;
+    long                 m_windowStyle,
+                         m_exStyle;
     wxString             m_windowName;
 
 protected:
     wxString             m_windowName;
 
 protected:
@@ -688,6 +765,26 @@ protected:
     static int WidthDefault(int w) { return w == -1 ? 20 : w; }
     static int HeightDefault(int h) { return h == -1 ? 20 : h; }
 
     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
     // ---------------------------
 
     // more pure virtual functions
     // ---------------------------
 
@@ -700,11 +797,20 @@ protected:
     //     overloaded Something()s in terms of DoSomething() which will be the
     //     only one to be virtual.
 
     //     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;
 
     // 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
     // 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
@@ -715,10 +821,33 @@ protected:
     // same as DoSetSize() for the client size
     virtual void DoSetClientSize(int width, int height) = 0;
 
     // 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
 
 #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;
 private:
     // contains the last id generated by NewControlId
     static int ms_lastControlId;
@@ -741,6 +870,8 @@ private:
     #include "wx/qt/window.h"
 #elif defined(__WXMAC__)
     #include "wx/mac/window.h"
     #include "wx/qt/window.h"
 #elif defined(__WXMAC__)
     #include "wx/mac/window.h"
+#elif defined(__WXPM__)
+    #include "wx/os2/window.h"
 #endif
 
 // ----------------------------------------------------------------------------
 #endif
 
 // ----------------------------------------------------------------------------
@@ -757,8 +888,10 @@ inline wxWindow *wxWindowBase::GetGrandParent() const
 // global function
 // ----------------------------------------------------------------------------
 
 // global function
 // ----------------------------------------------------------------------------
 
-extern wxWindow* WXDLLEXPORT wxGetActiveWindow();
-inline int WXDLLEXPORT NewControlId() { return wxWindowBase::NewControlId(); }
+WXDLLEXPORT extern wxWindow* wxGetActiveWindow();
+
+// deprecated (doesn't start with 'wx' prefix), use wxWindow::NewControlId()
+inline WXDLLEXPORT int NewControlId() { return wxWindowBase::NewControlId(); }
 
 #endif
     // _WX_WINDOW_H_BASE_
 
 #endif
     // _WX_WINDOW_H_BASE_