X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8e32ea1c8dda3ae90ff1112f10464d4691a766a2..a9102b3671a45d116d781b0c8e90d2e9a84fbdcb:/include/wx/sizer.h diff --git a/include/wx/sizer.h b/include/wx/sizer.h index fdcd3cc989..78581ba30c 100644 --- a/include/wx/sizer.h +++ b/include/wx/sizer.h @@ -2,7 +2,7 @@ // Name: sizer.h // Purpose: provide wxSizer class for layout // Author: Robert Roebling and Robin Dunn -// Modified by: Ron Lee +// Modified by: Ron Lee, Vadim Zeitlin (wxSizerFlags) // Created: // RCS-ID: $Id$ // Copyright: (c) Robin Dunn, Robert Roebling @@ -18,6 +18,7 @@ #include "wx/defs.h" +#include "wx/button.h" #include "wx/window.h" #include "wx/frame.h" #include "wx/dialog.h" @@ -31,6 +32,76 @@ class WXDLLEXPORT wxSizerItem; class WXDLLEXPORT wxSizer; class WXDLLEXPORT wxBoxSizer; + +// ---------------------------------------------------------------------------- +// wxSizerFlags: flags used for an item in the sizer +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT 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& Align(int alignment) // combination of wxAlignment values + { + m_flags &= wxALL; + m_flags |= alignment; + + return *this; + } + + // some shortcuts for Align() + wxSizerFlags& Expand() { return Align(wxEXPAND); } + wxSizerFlags& Centre() { return Align(wxCENTRE); } + wxSizerFlags& Center() { return Centre(); } + wxSizerFlags& Left() { return Align(wxALIGN_LEFT); } + wxSizerFlags& Right() { return Align(wxALIGN_RIGHT); } + + + wxSizerFlags& Border(int direction, int borderInPixels) + { + m_flags &= ~wxALL; + m_flags |= direction; + + m_borderInPixels = borderInPixels; + + return *this; + } + + wxSizerFlags& Border(int direction = wxALL) + { + // FIXME: default border size shouldn't be hardcoded + return Border(direction, 5); + } + + + // 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; +}; + + //--------------------------------------------------------------------------- // wxSizerItem //--------------------------------------------------------------------------- @@ -38,13 +109,21 @@ class WXDLLEXPORT wxBoxSizer; class WXDLLEXPORT wxSizerItem: public wxObject { public: - // spacer - wxSizerItem( int width, - int height, - int proportion, - int flag, - int border, - wxObject* userData); + // window with flags + wxSizerItem(wxWindow *window, const wxSizerFlags& flags) + { + Init(flags); + + m_window = window; + } + + // sizer with flags + wxSizerItem(wxSizer *sizer, const wxSizerFlags& flags) + { + Init(flags); + + m_sizer = sizer; + } // window wxSizerItem( wxWindow *window, @@ -60,6 +139,14 @@ public: int border, wxObject* userData ); + // spacer + wxSizerItem( int width, + int height, + int proportion, + int flag, + int border, + wxObject* userData); + wxSizerItem(); virtual ~wxSizerItem(); @@ -98,6 +185,8 @@ public: float GetRatio() const { return m_ratio; } + virtual wxRect GetRect() { return m_zoneRect; } + bool IsWindow() const; bool IsSizer() const; bool IsSpacer() const; @@ -142,6 +231,13 @@ public: { return m_pos; } protected: + // common part of several ctors + void Init(); + + // common part of ctors taking wxSizerFlags + void Init(const wxSizerFlags& flags); + + wxWindow *m_window; wxSizer *m_sizer; wxSize m_size; @@ -150,6 +246,7 @@ protected: int m_proportion; int m_border; int m_flag; + wxRect m_zoneRect; // Rectangle for window or item (not including borders) // If true, then this item is considered in the layout // calculation. Otherwise, it is skipped over. @@ -169,6 +266,7 @@ private: WX_DECLARE_EXPORTED_LIST( wxSizerItem, wxSizerItemList ); + //--------------------------------------------------------------------------- // wxSizer //--------------------------------------------------------------------------- @@ -181,71 +279,81 @@ public: // methods for adding elements to the sizer: there are Add/Insert/Prepend // overloads for each of window/sizer/spacer/wxSizerItem - inline void Add( wxWindow *window, - int proportion = 0, - int flag = 0, - int border = 0, - wxObject* userData = NULL ); - inline void Add( wxSizer *sizer, - int proportion = 0, - int flag = 0, - int border = 0, - wxObject* userData = NULL ); - inline void Add( int width, - int height, - int proportion = 0, - int flag = 0, - int border = 0, - wxObject* userData = NULL ); - inline void Add( wxSizerItem *item ); - - inline void AddSpacer(int size); - inline void AddStretchSpacer(int prop = 1); - - inline void Insert( size_t index, - wxWindow *window, - int proportion = 0, - int flag = 0, - int border = 0, - wxObject* userData = NULL ); - inline void Insert( size_t index, - wxSizer *sizer, - int proportion = 0, - int flag = 0, - int border = 0, - wxObject* userData = NULL ); - inline void Insert( size_t index, - int width, - int height, - int proportion = 0, - int flag = 0, - int border = 0, - wxObject* userData = NULL ); - virtual void Insert( size_t index, wxSizerItem *item ); - - inline void InsertSpacer(size_t index, int size); - inline void InsertStretchSpacer(size_t index, int prop = 1); - - inline void Prepend( wxWindow *window, - int proportion = 0, - int flag = 0, - int border = 0, - wxObject* userData = NULL ); - inline void Prepend( wxSizer *sizer, - int proportion = 0, - int flag = 0, - int border = 0, - wxObject* userData = NULL ); - inline void Prepend( int width, - int height, - int proportion = 0, - int flag = 0, - int border = 0, - wxObject* userData = NULL ); - inline void Prepend( wxSizerItem *item ); - - inline void PrependSpacer(int size); - inline void PrependStretchSpacer(int prop = 1); + inline wxSizerItem* Add( wxWindow *window, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL ); + inline wxSizerItem* Add( wxSizer *sizer, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL ); + inline wxSizerItem* Add( int width, + int height, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL ); + inline wxSizerItem* Add( wxWindow *window, const wxSizerFlags& flags ); + inline wxSizerItem* Add( wxSizer *sizer, const wxSizerFlags& flags ); + inline wxSizerItem* Add( wxSizerItem *item ); + + inline wxSizerItem* AddSpacer(int size); + inline wxSizerItem* AddStretchSpacer(int prop = 1); + + inline wxSizerItem* Insert( size_t index, + wxWindow *window, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL ); + inline wxSizerItem* Insert( size_t index, + wxSizer *sizer, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL ); + inline wxSizerItem* Insert( size_t index, + int width, + int height, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL ); + inline wxSizerItem* Insert( size_t index, + wxWindow *window, + const wxSizerFlags& flags ); + inline wxSizerItem* Insert( size_t index, + wxSizer *sizer, + const wxSizerFlags& flags ); + virtual wxSizerItem* Insert( size_t index, wxSizerItem *item ); + + inline wxSizerItem* InsertSpacer(size_t index, int size); + inline wxSizerItem* InsertStretchSpacer(size_t index, int prop = 1); + + inline wxSizerItem* Prepend( wxWindow *window, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL ); + inline wxSizerItem* Prepend( wxSizer *sizer, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL ); + inline wxSizerItem* Prepend( int width, + int height, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL ); + inline wxSizerItem* Prepend( wxWindow *window, const wxSizerFlags& flags ); + inline wxSizerItem* Prepend( wxSizer *sizer, const wxSizerFlags& flags ); + inline wxSizerItem* Prepend( wxSizerItem *item ); + + inline wxSizerItem* PrependSpacer(int size); + inline wxSizerItem* PrependStretchSpacer(int prop = 1); // Deprecated in 2.6 since historically it does not delete the window, @@ -306,6 +414,10 @@ public: void SetDimension( int x, int y, int width, int height ); + wxSizerItem* GetItem( wxWindow *window, bool recursive = false ); + wxSizerItem* GetItem( wxSizer *sizer, bool recursive = false ); + wxSizerItem* GetItem( size_t index ); + // Manage whether individual scene items are considered // in the layout calculations or not. bool Show( wxWindow *window, bool show = true, bool recursive = false ); @@ -511,7 +623,8 @@ class WXDLLEXPORT wxStaticBox; class WXDLLEXPORT wxStaticBoxSizer: public wxBoxSizer { public: - wxStaticBoxSizer( wxStaticBox *box, int orient ); + wxStaticBoxSizer(wxStaticBox *box, int orient); + wxStaticBoxSizer(int orient, wxWindow *win, const wxString& label = wxEmptyString); void RecalcSizes(); wxSize CalcMin(); @@ -532,10 +645,57 @@ private: #endif // wxUSE_STATBOX +#if wxUSE_BUTTON + +class WXDLLEXPORT 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; + wxButton *m_buttonNegative; // wxID_NO + wxButton *m_buttonCancel; + wxButton *m_buttonHelp; + +private: + DECLARE_CLASS(wxStdDialogButtonSizer) + DECLARE_NO_COPY_CLASS(wxStdDialogButtonSizer) +}; + +#endif // wxUSE_BUTTON #if WXWIN_COMPATIBILITY_2_4 // NB: wxBookCtrlSizer and wxNotebookSizer are deprecated, they -// don't do anything. wxBookCtrl::DoGetBestSize does the job now. +// don't do anything. wxBookCtrlBase::DoGetBestSize does the job now. // ---------------------------------------------------------------------------- // wxBookCtrlSizer @@ -545,14 +705,14 @@ private: // this sizer works with wxNotebook/wxListbook/... and sizes the control to // fit its pages -class WXDLLEXPORT wxBookCtrl; +class WXDLLEXPORT wxBookCtrlBase; class WXDLLEXPORT wxBookCtrlSizer : public wxSizer { public: - wxDEPRECATED( wxBookCtrlSizer(wxBookCtrl *bookctrl) ); + wxDEPRECATED( wxBookCtrlSizer(wxBookCtrlBase *bookctrl) ); - wxBookCtrl *GetControl() const { return m_bookctrl; } + wxBookCtrlBase *GetControl() const { return m_bookctrl; } virtual void RecalcSizes(); virtual wxSize CalcMin(); @@ -562,7 +722,7 @@ protected: // and still have warning-free build of the library itself: wxBookCtrlSizer() {} - wxBookCtrl *m_bookctrl; + wxBookCtrlBase *m_bookctrl; private: DECLARE_CLASS(wxBookCtrlSizer) @@ -572,7 +732,7 @@ private: #if wxUSE_NOTEBOOK -// before wxBookCtrl we only had wxNotebookSizer, keep it for backwards +// before wxBookCtrlBase we only had wxNotebookSizer, keep it for backwards // compatibility class WXDLLEXPORT wxNotebook; @@ -598,122 +758,158 @@ private: // inline functions implementation // ---------------------------------------------------------------------------- -inline void +inline wxSizerItem* wxSizer::Add( wxWindow *window, int proportion, int flag, int border, wxObject* userData ) { - Add( new wxSizerItem( window, proportion, flag, border, userData ) ); + return Add( new wxSizerItem( window, proportion, flag, border, userData ) ); } -inline void +inline wxSizerItem* wxSizer::Add( wxSizer *sizer, int proportion, int flag, int border, wxObject* userData ) { - Add( new wxSizerItem( sizer, proportion, flag, border, userData ) ); + return Add( new wxSizerItem( sizer, proportion, flag, border, userData ) ); } -inline void +inline wxSizerItem* wxSizer::Add( int width, int height, int proportion, int flag, int border, wxObject* userData ) { - Add( new wxSizerItem( width, height, proportion, flag, border, 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 void +inline wxSizerItem* +wxSizer::Add( wxSizer *sizer, const wxSizerFlags& flags ) +{ + return Add( new wxSizerItem(sizer, flags) ); +} + +inline wxSizerItem* wxSizer::Add( wxSizerItem *item ) { - Insert( m_children.GetCount(), item ); + return Insert( m_children.GetCount(), item ); } -inline void +inline wxSizerItem* wxSizer::AddSpacer(int size) { - Add(size, size); + return Add(size, size); } -inline void +inline wxSizerItem* wxSizer::AddStretchSpacer(int prop) { - Add(0, 0, prop); + return Add(0, 0, prop); } -inline void +inline wxSizerItem* wxSizer::Prepend( wxWindow *window, int proportion, int flag, int border, wxObject* userData ) { - Prepend( new wxSizerItem( window, proportion, flag, border, userData ) ); + return Prepend( new wxSizerItem( window, proportion, flag, border, userData ) ); } -inline void +inline wxSizerItem* wxSizer::Prepend( wxSizer *sizer, int proportion, int flag, int border, wxObject* userData ) { - Prepend( new wxSizerItem( sizer, proportion, flag, border, userData ) ); + return Prepend( new wxSizerItem( sizer, proportion, flag, border, userData ) ); } -inline void +inline wxSizerItem* wxSizer::Prepend( int width, int height, int proportion, int flag, int border, wxObject* userData ) { - Prepend( new wxSizerItem( width, height, proportion, flag, border, userData ) ); + return Prepend( new wxSizerItem( width, height, proportion, flag, border, userData ) ); } -inline void +inline wxSizerItem* wxSizer::Prepend( wxSizerItem *item ) { - Insert( 0, item ); + return Insert( 0, item ); } -inline void +inline wxSizerItem* wxSizer::PrependSpacer(int size) { - Prepend(size, size); + return Prepend(size, size); } -inline void +inline wxSizerItem* wxSizer::PrependStretchSpacer(int prop) { - Prepend(0, 0, 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 void +inline wxSizerItem* wxSizer::Insert( size_t index, - wxWindow *window, - int proportion, - int flag, - int border, - wxObject* userData ) + wxWindow *window, + int proportion, + int flag, + int border, + wxObject* userData ) { - Insert( index, new wxSizerItem( window, proportion, flag, border, userData ) ); + return Insert( index, new wxSizerItem( window, proportion, flag, border, userData ) ); } -inline void +inline wxSizerItem* wxSizer::Insert( size_t index, - wxSizer *sizer, - int proportion, - int flag, - int border, - wxObject* userData ) + wxSizer *sizer, + int proportion, + int flag, + int border, + wxObject* userData ) { - Insert( index, new wxSizerItem( sizer, proportion, flag, border, userData ) ); + return Insert( index, new wxSizerItem( sizer, proportion, flag, border, userData ) ); } -inline void +inline wxSizerItem* wxSizer::Insert( size_t index, - int width, - int height, - int proportion, - int flag, - int border, - wxObject* userData ) -{ - Insert( index, new wxSizerItem( width, height, proportion, flag, border, userData ) ); + 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 void +inline wxSizerItem* wxSizer::InsertSpacer(size_t index, int size) { - Insert(index, size, size); + return Insert(index, size, size); } -inline void +inline wxSizerItem* wxSizer::InsertStretchSpacer(size_t index, int prop) { - Insert(index, 0, 0, prop); + return Insert(index, 0, 0, prop); }