#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
-#ifdef __WXMAC__
-# include "wx/mac/uma.h"
-#endif
-
//---------------------------------------------------------------------------
IMPLEMENT_CLASS(wxSizerItem, wxObject)
#if wxUSE_STATBOX
IMPLEMENT_CLASS(wxStaticBoxSizer, wxBoxSizer)
#endif
+#if wxUSE_BUTTON
+IMPLEMENT_CLASS(wxStdDialogButtonSizer, wxBoxSizer)
+#endif
WX_DEFINE_EXPORTED_LIST( wxSizerItemList );
m_sizer = NULL;
m_show = true;
m_userData = NULL;
+ m_zoneRect = wxRect(0,0,0,0);
}
void wxSizerItem::Init(const wxSizerFlags& flags)
, m_proportion( proportion )
, m_border( border )
, m_flag( flag )
+ , m_zoneRect()
, m_show( true )
, m_userData( userData )
{
, m_proportion( proportion )
, m_border( border )
, m_flag( flag )
+ , m_zoneRect()
, m_show( true )
, m_userData( userData )
{
, m_proportion( proportion )
, m_border( border )
, m_flag( flag )
+ , m_zoneRect()
, m_show( true )
, m_ratio( 0.0 )
, m_userData( userData )
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 );
//---------------------------------------------------------------------------
wxSizer::wxSizer()
- : m_minSize( wxSize( 0, 0 ) )
+ :m_minSize()
{
}
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 )
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;
}
}
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;
wxASSERT_MSG( box, wxT("wxStaticBoxSizer needs a static box") );
}
+wxStaticBoxSizer::wxStaticBoxSizer(int orient, wxWindow *win, const wxString& s)
+ : wxBoxSizer(orient),
+ m_staticBox(new wxStaticBox(win, wxID_ANY, s))
+{
+}
+
static void GetStaticBoxBorders( wxStaticBox *box,
int *borderTop,
int *borderOther)
{
// this has to be done platform by platform as there is no way to
// guess the thickness of a wxStaticBox border
-#ifdef __WXCOCOA__
- box->GetBordersForSizer(borderTop,borderOther);
-#elif defined(__WXMAC__)
-
- static int extraTop = -1; // Uninitted
- static int other = 5;
-
- if ( extraTop == -1 )
- {
- // The minimal border used for the top. Later on the staticbox'
- // font height is added to this.
- extraTop = 0;
-
- if ( UMAGetSystemVersion() >= 0x1030 /*Panther*/ )
- {
- // As indicated by the HIG, Panther needs an extra border of 11
- // pixels (otherwise overlapping occurs at the top). The "other"
- // border has to be 11.
- extraTop = 11;
- other = 11;
- }
-
- }
-
- *borderTop = extraTop + box->GetCharHeight();
- *borderOther = other;
-
-#else
-#ifdef __WXGTK__
- if ( box->GetLabel().IsEmpty() )
- *borderTop = 5;
- else
-#endif // __WXGTK__
- *borderTop = box->GetCharHeight();
-
- *borderOther = 5;
-#endif // __WXCOCOA__
+ box->GetBordersForSizer(borderTop, borderOther);
}
void wxStaticBoxSizer::RecalcSizes()
#endif // wxUSE_STATBOX
+#if wxUSE_BUTTON
+
+wxStdDialogButtonSizer::wxStdDialogButtonSizer()
+ : wxBoxSizer(wxHORIZONTAL)
+{
+ // Vertical buttons with lots of space on either side
+ // looks rubbish on WinCE, so let's not do this for now.
+ // If we are going to use vertical buttons, we should
+ // put the sizer to the right of other controls in the dialog,
+ // and that's beyond the scope of this sizer.
+#ifndef __WXWINCE__
+ 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;
+#endif
+
+ 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:
+ case wxID_CONTEXT_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::Realize()
+{
+#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
#if wxUSE_BOOKCTRL
-wxBookCtrlSizer::wxBookCtrlSizer(wxBookCtrl *bookctrl)
+wxBookCtrlSizer::wxBookCtrlSizer(wxBookCtrlBase *bookctrl)
: m_bookctrl(bookctrl)
{
wxASSERT_MSG( bookctrl, wxT("wxBookCtrlSizer needs a control") );
wxSize wxBookCtrlSizer::CalcMin()
{
- wxSize sizeBorder = m_bookctrl->CalcSizeFromPage(wxSize(0, 0));
+ wxSize sizeBorder = m_bookctrl->CalcSizeFromPage(wxSize(0,0));
sizeBorder.x += 5;
sizeBorder.y += 5;