On screens with restricted space, it's useful to be able to add controls

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
This commit is contained in:
Julian Smart
2006-04-13 14:22:32 +00:00
parent 7a9f5d5a79
commit 87cf52d8ac
4 changed files with 64 additions and 28 deletions

View 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}\\

View 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

View 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_RIGHT:
posCtrl.x = sizeClient.x - sizeNew.x;
break;
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;
}
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 )
{

View 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() )