]> git.saurik.com Git - wxWidgets.git/commitdiff
On screens with restricted space, it's useful to be able to add controls
authorJulian Smart <julian@anthemion.co.uk>
Thu, 13 Apr 2006 14:22:32 +0000 (14:22 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Thu, 13 Apr 2006 14:22:32 +0000 (14:22 +0000)
to e.g. the wxChoice control of a wxChoicebook. GetControlSizer
allows an app to do that, and we also add a control margin which
may or may not be respected by individual book controls.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38698 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/choicebk.tex
include/wx/bookctrl.h
src/common/bookctrl.cpp
src/generic/choicbkg.cpp

index f329d59af80d47b955383e444b0557cc348f2c28..6af79828c1d1e33a6ff0dae1b7bb649b690ae23e 100644 (file)
@@ -20,8 +20,13 @@ identical to wxNotebook (except for the features clearly related to tabs
 only), so please refer to that class documentation for now. You can also
 use the \helpref{notebook sample}{samplenotebook} to see wxChoicebook in action.
 
+wxChoicebook allows the use of wxBookCtrl::GetControlSizer, allowing a program
+to add other controls next to the choice control. This is particularly useful
+when screen space is restricted, as it often is when wxChoicebook is being employed.
+
 \wxheading{Derived from}
 
+wxBookCtrlBase\\
 \helpref{wxControl}{wxcontrol}\\
 \helpref{wxWindow}{wxwindow}\\
 \helpref{wxEvtHandler}{wxevthandler}\\
index 5d09ad2d9a06acce8233943b80abe5f812d4f371..653a186aaacf6bc962e92522c6cea67235e3682d 100644 (file)
@@ -128,6 +128,10 @@ public:
         m_internalBorder = internalBorder;
     }
 
+    // Sets/gets the margin around the controller
+    void SetControlMargin(int margin) { m_controlMargin = margin; }
+    int GetControlMargin() const { return m_controlMargin; }
+
     // returns true if we have wxCHB_TOP or wxCHB_BOTTOM style
     bool IsVertical() const { return HasFlag(wxBK_BOTTOM | wxBK_TOP); }
 
@@ -135,6 +139,9 @@ public:
     void SetFitToCurrentPage(bool fit) { m_fitToCurrentPage = fit; }
     bool GetFitToCurrentPage() const { return m_fitToCurrentPage; }
 
+    // returns the sizer containing the control, if any
+    wxSizer* GetControlSizer() const { return m_controlSizer; }
+
     // operations
     // ----------
 
@@ -236,6 +243,12 @@ protected:
     // Whether to shrink to fit current page
     bool m_fitToCurrentPage;
 
+    // the sizer containing the choice control
+    wxSizer*    m_controlSizer;
+
+    // the margin around the choice control
+    int         m_controlMargin;
+
 private:
 
     // common part of all ctors
index f22559cb9857d9094d7df8e07e8b716e7c40721b..b61570f183f9f619e8a924b2267db72bd60a639b 100644 (file)
@@ -60,6 +60,9 @@ void wxBookCtrlBase::Init()
 #else
     m_internalBorder = 5;
 #endif
+
+    m_controlMargin = 0;
+    m_controlSizer = NULL;
 }
 
 bool
@@ -264,39 +267,44 @@ void wxBookCtrlBase::DoSize()
         // we're not fully created yet or OnSize() should be hidden by derived class
         return;
     }
-
-    // resize controller and the page area to fit inside our new size
-    const wxSize sizeClient( GetClientSize() ),
-                 sizeBorder( m_bookctrl->GetSize() - m_bookctrl->GetClientSize() ),
-                 sizeCtrl( GetControllerSize() );
-
-    m_bookctrl->SetClientSize( sizeCtrl.x - sizeBorder.x, sizeCtrl.y - sizeBorder.y );
-
-    const wxSize sizeNew = m_bookctrl->GetSize();
-    wxPoint posCtrl;
-    switch ( GetWindowStyle() & wxBK_ALIGN_MASK )
+    
+    if (GetSizer())
+        Layout();
+    else
     {
-        default:
-            wxFAIL_MSG( _T("unexpected alignment") );
-            // fall through
+        // resize controller and the page area to fit inside our new size
+        const wxSize sizeClient( GetClientSize() ),
+                    sizeBorder( m_bookctrl->GetSize() - m_bookctrl->GetClientSize() ),
+                    sizeCtrl( GetControllerSize() );
 
-        case wxBK_TOP:
-        case wxBK_LEFT:
-            // posCtrl is already ok
-            break;
+        m_bookctrl->SetClientSize( sizeCtrl.x - sizeBorder.x, sizeCtrl.y - sizeBorder.y );
 
-        case wxBK_BOTTOM:
-            posCtrl.y = sizeClient.y - sizeNew.y;
-            break;
+        const wxSize sizeNew = m_bookctrl->GetSize();
+        wxPoint posCtrl;
+        switch ( GetWindowStyle() & wxBK_ALIGN_MASK )
+        {
+            default:
+                wxFAIL_MSG( _T("unexpected alignment") );
+                // fall through
+
+            case wxBK_TOP:
+            case wxBK_LEFT:
+                // posCtrl is already ok
+                break;
+
+            case wxBK_BOTTOM:
+                posCtrl.y = sizeClient.y - sizeNew.y;
+                break;
+
+            case wxBK_RIGHT:
+                posCtrl.x = sizeClient.x - sizeNew.x;
+                break;
+        }
 
-        case wxBK_RIGHT:
-            posCtrl.x = sizeClient.x - sizeNew.x;
-            break;
+        if ( m_bookctrl->GetPosition() != posCtrl )
+            m_bookctrl->Move(posCtrl);
     }
 
-    if ( m_bookctrl->GetPosition() != posCtrl )
-        m_bookctrl->Move(posCtrl);
-
     // resize the currently shown page
     if (GetSelection() != wxNOT_FOUND )
     {
index ca3d019f5d1bf74e9ac735dbfd61e2ae75b97c61..163998a42173de2ceb631a858cf5d7918e2c6fea 100644 (file)
@@ -96,6 +96,15 @@ wxChoicebook::Create(wxWindow *parent,
                     wxDefaultSize
                  );
 
+    wxSizer* mainSizer = new wxBoxSizer(IsVertical() ? wxVERTICAL : wxHORIZONTAL);
+                 
+    if (style & wxCHB_RIGHT || style & wxCHB_BOTTOM)
+        mainSizer->Add(0, 0, 1, wxEXPAND, 0);
+    
+    m_controlSizer = new wxBoxSizer(IsVertical() ? wxHORIZONTAL : wxVERTICAL);
+    m_controlSizer->Add(m_bookctrl, 1, (IsVertical() ? wxALIGN_CENTRE_VERTICAL : wxALIGN_CENTRE) |wxGROW, 0);
+    mainSizer->Add(m_controlSizer, 0, wxGROW|wxALL, m_controlMargin);
+    SetSizer(mainSizer);
     return true;
 }
 
@@ -106,7 +115,8 @@ wxChoicebook::Create(wxWindow *parent,
 wxSize wxChoicebook::GetControllerSize() const
 {
     const wxSize sizeClient = GetClientSize(),
-                 sizeChoice = m_bookctrl->GetBestFittingSize();
+                 // sizeChoice = m_bookctrl->GetBestFittingSize();
+                 sizeChoice = m_controlSizer->CalcMin();
 
     wxSize size;
     if ( IsVertical() )