X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d775fa82354a1f8d5db87ad1d71ab00ef7d9123c..a353dc9852cc44fcffd339895ba3024d0eebbad7:/src/common/sizer.cpp diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index 475867e17b..98086b6804 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -21,10 +21,17 @@ #pragma hdrstop #endif +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/intl.h" +#endif // WX_PRECOMP + #include "wx/sizer.h" #include "wx/utils.h" #include "wx/statbox.h" +#include "wx/settings.h" #include "wx/listimpl.cpp" +#include "wx/intl.h" #if WXWIN_COMPATIBILITY_2_4 #include "wx/notebook.h" #endif @@ -43,6 +50,9 @@ IMPLEMENT_CLASS(wxBoxSizer, wxSizer) #if wxUSE_STATBOX IMPLEMENT_CLASS(wxStaticBoxSizer, wxBoxSizer) #endif +#if wxUSE_BUTTON +IMPLEMENT_CLASS(wxStdDialogButtonSizer, wxBoxSizer) +#endif WX_DEFINE_EXPORTED_LIST( wxSizerItemList ); @@ -89,6 +99,7 @@ void wxSizerItem::Init() m_sizer = NULL; m_show = true; m_userData = NULL; + m_zoneRect = wxRect( 0, 0, 0, 0 ); } void wxSizerItem::Init(const wxSizerFlags& flags) @@ -108,6 +119,7 @@ wxSizerItem::wxSizerItem( int width, int height, int proportion, int flag, int b , m_proportion( proportion ) , m_border( border ) , m_flag( flag ) + , m_zoneRect( 0, 0, 0, 0 ) , m_show( true ) , m_userData( userData ) { @@ -120,6 +132,7 @@ wxSizerItem::wxSizerItem( wxWindow *window, int proportion, int flag, int border , m_proportion( proportion ) , m_border( border ) , m_flag( flag ) + , m_zoneRect( 0, 0, 0, 0 ) , m_show( true ) , m_userData( userData ) { @@ -139,6 +152,7 @@ wxSizerItem::wxSizerItem( wxSizer *sizer, int proportion, int flag, int border, , m_proportion( proportion ) , m_border( border ) , m_flag( flag ) + , m_zoneRect( 0, 0, 0, 0 ) , m_show( true ) , m_ratio( 0.0 ) , m_userData( userData ) @@ -287,6 +301,7 @@ void wxSizerItem::SetDimension( wxPoint pos, wxSize size ) if (IsSizer()) m_sizer->SetDimension( pos.x, pos.y, size.x, size.y ); + m_zoneRect = wxRect(pos, size); if (IsWindow()) m_window->SetSize( pos.x, pos.y, size.x, size.y, wxSIZE_ALLOW_MINUS_ONE ); @@ -357,12 +372,14 @@ wxSizer::~wxSizer() WX_CLEAR_LIST(wxSizerItemList, m_children); } -void wxSizer::Insert( size_t index, wxSizerItem *item ) +wxSizerItem* wxSizer::Insert( size_t index, wxSizerItem *item ) { m_children.Insert( index, item ); if( item->GetWindow() ) item->GetWindow()->SetContainingSizer( this ); + + return item; } bool wxSizer::Remove( wxWindow *window ) @@ -760,9 +777,9 @@ bool wxSizer::DoSetItemMinSize( size_t index, int width, int height ) return true; } -bool wxSizer::Show( wxWindow *window, bool show, bool recursive ) +wxSizerItem* wxSizer::GetItem( wxWindow *window, bool recursive ) { - wxASSERT_MSG( window, _T("Show for NULL window") ); + wxASSERT_MSG( window, _T("GetItem for NULL window") ); wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); while (node) @@ -771,58 +788,93 @@ bool wxSizer::Show( wxWindow *window, bool show, bool recursive ) if (item->GetWindow() == window) { - item->Show( show ); - - return true; + return item; } else if (recursive && item->IsSizer()) { - if (item->GetSizer()->Show(window, show, recursive)) - return true; + wxSizerItem *subitem = item->GetSizer()->GetItem( window, true ); + if (subitem) + return subitem; } node = node->GetNext(); } - return false; + return NULL; } -bool wxSizer::Show( wxSizer *sizer, bool show, bool recursive ) +wxSizerItem* wxSizer::GetItem( wxSizer *sizer, bool recursive ) { - wxASSERT_MSG( sizer, _T("Show for NULL sizer") ); + wxASSERT_MSG( sizer, _T("GetItem for NULL sizer") ); wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); while (node) { - wxSizerItem *item = node->GetData(); + wxSizerItem *item = node->GetData(); if (item->GetSizer() == sizer) { - item->Show( show ); - - return true; + return item; } else if (recursive && item->IsSizer()) { - if (item->GetSizer()->Show(sizer, show, recursive)) - return true; + wxSizerItem *subitem = item->GetSizer()->GetItem( sizer, true ); + if (subitem) + return subitem; } node = node->GetNext(); } + return NULL; +} + +wxSizerItem* wxSizer::GetItem( size_t index ) +{ + wxCHECK_MSG( index < m_children.GetCount(), + NULL, + _T("GetItem index is out of range") ); + + return m_children.Item( index )->GetData(); +} + +bool wxSizer::Show( wxWindow *window, bool show, bool recursive ) +{ + wxSizerItem *item = GetItem( window, recursive ); + + if ( item ) + { + item->Show( show ); + return true; + } + + return false; +} + +bool wxSizer::Show( wxSizer *sizer, bool show, bool recursive ) +{ + wxSizerItem *item = GetItem( sizer, recursive ); + + if ( item ) + { + item->Show( show ); + return true; + } + return false; } bool wxSizer::Show( size_t index, bool show) { - wxCHECK_MSG( index < m_children.GetCount(), - false, - _T("Show index is out of range") ); + wxSizerItem *item = GetItem( index ); - m_children.Item( index )->GetData()->Show( show ); + if ( item ) + { + item->Show( show ); + return true; + } - return true; + return false; } void wxSizer::ShowItems( bool show ) @@ -1079,9 +1131,11 @@ void wxFlexGridSizer::RecalcSizes() SetItemBounds( node->GetData(), x, y, w, h); } - y = y + m_rowHeights[r] + m_vgap; + if (m_rowHeights[r] != -1) + y = y + m_rowHeights[r] + m_vgap; } - x = x + m_colWidths[c] + m_hgap; + if (m_colWidths[c] != -1) + x = x + m_colWidths[c] + m_hgap; } } @@ -1135,12 +1189,16 @@ wxSize wxFlexGridSizer::CalcMin() int width = 0; for (int col = 0; col < ncols; col++) if ( m_colWidths[ col ] != -1 ) - width += m_colWidths[ col ] + ( col == ncols-1 ? 0 : m_hgap ); + width += m_colWidths[ col ] + m_hgap; + if (width > 0) + width -= m_hgap; int height = 0; for (int row = 0; row < nrows; row++) if ( m_rowHeights[ row ] != -1 ) - height += m_rowHeights[ row ] + ( row == nrows-1 ? 0 : m_vgap ); + height += m_rowHeights[ row ] + m_vgap; + if (height > 0) + height -= m_vgap; m_calculatedMinSize = wxSize( width, height ); return m_calculatedMinSize; @@ -1351,7 +1409,7 @@ void wxBoxSizer::RecalcSizes() } wxPoint child_pos( pt ); - wxSize child_size( wxSize( size.x, height) ); + wxSize child_size( size.x, height ); if (item->GetFlag() & (wxEXPAND | wxSHAPED)) child_size.x = m_size.x; @@ -1377,7 +1435,7 @@ void wxBoxSizer::RecalcSizes() } wxPoint child_pos( pt ); - wxSize child_size( wxSize(width, size.y) ); + wxSize child_size( width, size.y ); if (item->GetFlag() & (wxEXPAND | wxSHAPED)) child_size.y = m_size.y; @@ -1547,7 +1605,7 @@ static void GetStaticBoxBorders( wxStaticBox *box, #else #ifdef __WXGTK__ - if ( box->GetLabel().IsEmpty() ) + if ( box->GetLabel().empty() ) *borderTop = 5; else #endif // __WXGTK__ @@ -1597,6 +1655,160 @@ void wxStaticBoxSizer::ShowItems( bool show ) #endif // wxUSE_STATBOX +#if wxUSE_BUTTON + +wxStdDialogButtonSizer::wxStdDialogButtonSizer() + : wxBoxSizer(wxHORIZONTAL) +{ + bool is_pda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + + // If we have a PDA screen, put yes/no button over + // all other buttons, otherwise on the left side. + if (is_pda) + m_orient = wxVERTICAL; + + m_buttonAffirmative = NULL; + m_buttonApply = NULL; + m_buttonNegative = NULL; + m_buttonCancel = NULL; + m_buttonHelp = NULL; +} + +void wxStdDialogButtonSizer::AddButton(wxButton *mybutton) +{ + switch (mybutton->GetId()) + { + case wxID_OK: + case wxID_YES: + case wxID_SAVE: + m_buttonAffirmative = mybutton; + break; + case wxID_APPLY: + m_buttonApply = mybutton; + break; + case wxID_NO: + m_buttonNegative = mybutton; + break; + case wxID_CANCEL: + m_buttonCancel = mybutton; + break; + case wxID_HELP: + m_buttonHelp = mybutton; + break; + default: + break; + } +} + +void wxStdDialogButtonSizer::SetAffirmativeButton( wxButton *button ) +{ + m_buttonAffirmative = button; +} + +void wxStdDialogButtonSizer::SetNegativeButton( wxButton *button ) +{ + m_buttonNegative = button; +} + +void wxStdDialogButtonSizer::SetCancelButton( wxButton *button ) +{ + m_buttonCancel = button; +} + +void wxStdDialogButtonSizer::Finalise() +{ +#ifdef __WXMAC__ + Add(0, 0, 0, wxLEFT, 6); + if (m_buttonHelp) + Add((wxWindow*)m_buttonHelp, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 6); + + if (m_buttonNegative){ + // HIG POLICE BULLETIN - destructive buttons need extra padding + // 24 pixels on either side + Add((wxWindow*)m_buttonNegative, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 12); + } + + // extra whitespace between help/negative and cancel/ok buttons + Add(0, 0, 1, wxEXPAND, 0); + + if (m_buttonCancel){ + Add((wxWindow*)m_buttonCancel, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 6); + // Cancel or help should be default + // m_buttonCancel->SetDefaultButton(); + } + + // Ugh, Mac doesn't really have apply dialogs, so I'll just + // figure the best place is between Cancel and OK + if (m_buttonApply) + Add((wxWindow*)m_buttonApply, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 6); + + if (m_buttonAffirmative){ + Add((wxWindow*)m_buttonAffirmative, 0, wxALIGN_CENTRE | wxLEFT, 6); + + if (m_buttonAffirmative->GetId() == wxID_SAVE){ + // these buttons have set labels under Mac so we should use them + m_buttonAffirmative->SetLabel(_("Save")); + m_buttonNegative->SetLabel(_("Don't Save")); + } + } + + // Extra space around and at the right + Add(12, 24); +#elif defined(__WXGTK20__) + Add(0, 0, 0, wxLEFT, 9); + if (m_buttonHelp) + Add((wxWindow*)m_buttonHelp, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 3); + + // extra whitespace between help and cancel/ok buttons + Add(0, 0, 1, wxEXPAND, 0); + + if (m_buttonNegative){ + Add((wxWindow*)m_buttonNegative, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 3); + } + + if (m_buttonCancel){ + Add((wxWindow*)m_buttonCancel, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 3); + // Cancel or help should be default + // m_buttonCancel->SetDefaultButton(); + } + + if (m_buttonApply) + Add((wxWindow*)m_buttonApply, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 3); + + if (m_buttonAffirmative) + Add((wxWindow*)m_buttonAffirmative, 0, wxALIGN_CENTRE | wxLEFT, 6); +#else + // do the same thing for GTK1 and Windows platforms + // and assume any platform not accounted for here will use + // Windows style + Add(0, 0, 0, wxLEFT, 9); + if (m_buttonHelp) + Add((wxWindow*)m_buttonHelp, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, m_buttonHelp->ConvertDialogToPixels(wxSize(4, 0)).x); + + // extra whitespace between help and cancel/ok buttons + Add(0, 0, 1, wxEXPAND, 0); + + if (m_buttonApply) + Add((wxWindow*)m_buttonApply, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, m_buttonApply->ConvertDialogToPixels(wxSize(4, 0)).x); + + if (m_buttonAffirmative){ + Add((wxWindow*)m_buttonAffirmative, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, m_buttonAffirmative->ConvertDialogToPixels(wxSize(4, 0)).x); + } + + if (m_buttonNegative){ + Add((wxWindow*)m_buttonNegative, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, m_buttonNegative->ConvertDialogToPixels(wxSize(4, 0)).x); + } + + if (m_buttonCancel){ + Add((wxWindow*)m_buttonCancel, 0, wxALIGN_CENTRE | wxLEFT, m_buttonCancel->ConvertDialogToPixels(wxSize(4, 0)).x); + // Cancel or help should be default + // m_buttonCancel->SetDefaultButton(); + } + +#endif +} + +#endif // wxUSE_BUTTON #if WXWIN_COMPATIBILITY_2_4 @@ -1613,7 +1825,7 @@ IMPLEMENT_CLASS(wxNotebookSizer, wxBookCtrlSizer) #if wxUSE_BOOKCTRL -wxBookCtrlSizer::wxBookCtrlSizer(wxBookCtrl *bookctrl) +wxBookCtrlSizer::wxBookCtrlSizer(wxBookCtrlBase *bookctrl) : m_bookctrl(bookctrl) { wxASSERT_MSG( bookctrl, wxT("wxBookCtrlSizer needs a control") );