Applied modified form of the StdButtonSize patch.

Tested on GTK2, MSW and Mac.
  Adapted various generic dialogs to stretch the
    button sizer so that the buttons don't end
    up centered but right aligned.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31198 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2004-12-31 18:57:25 +00:00
parent c3aee5c154
commit acf2ac3757
11 changed files with 228 additions and 100 deletions

View File

@@ -20,6 +20,9 @@
#include "wx/containr.h" #include "wx/containr.h"
#include "wx/toplevel.h" #include "wx/toplevel.h"
class WXDLLEXPORT wxSizer;
class WXDLLEXPORT wxStdDialogButtonSizer;
#define wxDIALOG_NO_PARENT 0x0001 // Don't make owned by apps top window #define wxDIALOG_NO_PARENT 0x0001 // Don't make owned by apps top window
#ifdef __WXWINCE__ #ifdef __WXWINCE__
@@ -56,6 +59,7 @@ public:
#if wxUSE_BUTTON #if wxUSE_BUTTON
// places buttons into a horizontal wxBoxSizer // places buttons into a horizontal wxBoxSizer
wxSizer *CreateButtonSizer( long flags ); wxSizer *CreateButtonSizer( long flags );
wxStdDialogButtonSizer *CreateStdDialogButtonSizer( long flags );
#endif // wxUSE_BUTTON #endif // wxUSE_BUTTON
protected: protected:

View File

@@ -18,6 +18,7 @@
#include "wx/defs.h" #include "wx/defs.h"
#include "wx/button.h"
#include "wx/window.h" #include "wx/window.h"
#include "wx/frame.h" #include "wx/frame.h"
#include "wx/dialog.h" #include "wx/dialog.h"
@@ -641,6 +642,48 @@ private:
#endif // wxUSE_STATBOX #endif // wxUSE_STATBOX
class WXDLLEXPORT wxStdDialogButtonSizer: public wxBoxSizer
{
public:
wxStdDialogButtonSizer();
// Constructor just creates a new wxBoxSizer, not much else.
// Box sizer orientation is automatically determined here:
// vertical for PDAs, horizontal for everything else?
void AddButton(wxButton *button);
// Checks button ID against system IDs and sets one of the pointers below
// to this button.
// Does not do any sizer-related things here.
// Question: what to do for non-supported button IDs? assert?
void Finalise();
// 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.
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)
};
#if WXWIN_COMPATIBILITY_2_4 #if WXWIN_COMPATIBILITY_2_4
// NB: wxBookCtrlSizer and wxNotebookSizer are deprecated, they // NB: wxBookCtrlSizer and wxNotebookSizer are deprecated, they

View File

@@ -170,92 +170,45 @@ wxSizer *wxDialogBase::CreateTextSizer( const wxString& message )
wxSizer *wxDialogBase::CreateButtonSizer( long flags ) wxSizer *wxDialogBase::CreateButtonSizer( long flags )
{ {
bool is_pda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); return CreateStdDialogButtonSizer( flags );
}
// If we have a PDA screen, put yes/no button over wxStdDialogButtonSizer *wxDialogBase::CreateStdDialogButtonSizer( long flags )
// all other buttons, otherwise on the left side. {
wxBoxSizer *box = is_pda ? new wxBoxSizer( wxVERTICAL ) : new wxBoxSizer( wxHORIZONTAL ); wxStdDialogButtonSizer *sizer = new wxStdDialogButtonSizer();
wxButton *ok = NULL;
wxButton *cancel = NULL;
wxButton *yes = NULL;
wxButton *no = NULL;
wxButton *help = NULL;
wxBoxSizer *inner_yes_no = NULL; if (flags & wxOK){
ok = new wxButton(this, wxID_OK, _("OK"));
// Only create sizer containing yes/no sizer->AddButton(ok);
// if it is actually required
if ( (flags & wxYES_NO) != 0 )
{
inner_yes_no = new wxBoxSizer( wxHORIZONTAL );
box->Add( inner_yes_no, 0, wxBOTTOM, 10 );
} }
wxBoxSizer *inner_rest = new wxBoxSizer( wxHORIZONTAL ); if (flags & wxCANCEL){
box->Add( inner_rest, 0, 0, 0 ); cancel = new wxButton(this, wxID_CANCEL, _("Cancel"));
sizer->AddButton(cancel);
#if defined(__WXMSW__) || defined(__WXMAC__)
static const int margin = 6;
#else
static const int margin = 10;
#endif
wxButton *ok = (wxButton *) NULL;
wxButton *yes = (wxButton *) NULL;
wxButton *no = (wxButton *) NULL;
// always show an OK button, unless we have both YES and NO
if ( (flags & wxYES_NO) != wxYES_NO )
flags |= wxOK;
if (flags & wxYES)
{
yes = new wxButton(this, wxID_YES, wxEmptyString,
wxDefaultPosition, wxDefaultSize, wxCLIP_SIBLINGS);
inner_yes_no->Add( yes, 0, wxLEFT|wxRIGHT, margin );
}
if (flags & wxNO)
{
no = new wxButton(this, wxID_NO, wxEmptyString,
wxDefaultPosition, wxDefaultSize, wxCLIP_SIBLINGS);
inner_yes_no->Add( no, 0, wxLEFT|wxRIGHT, margin );
} }
if (flags & wxOK) if (flags & wxYES){
{ yes = new wxButton(this, wxID_YES, _("Yes"));
ok = new wxButton(this, wxID_OK, wxEmptyString, sizer->AddButton(yes);
wxDefaultPosition, wxDefaultSize, wxCLIP_SIBLINGS);
inner_rest->Add( ok, 0, wxLEFT|wxRIGHT, margin );
} }
if (flags & wxFORWARD) if (flags & wxNO){
inner_rest->Add(new wxButton(this, wxID_FORWARD, wxEmptyString, no = new wxButton(this, wxID_NO, _("No"));
wxDefaultPosition, wxDefaultSize, sizer->AddButton(no);
wxCLIP_SIBLINGS),
0, wxLEFT|wxRIGHT, margin);
if (flags & wxBACKWARD)
inner_rest->Add(new wxButton(this, wxID_BACKWARD, wxEmptyString,
wxDefaultPosition, wxDefaultSize,
wxCLIP_SIBLINGS),
0, wxLEFT|wxRIGHT, margin);
if (flags & wxSETUP)
inner_rest->Add( new wxButton( this, wxID_SETUP, _("Setup"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin );
if (flags & wxMORE)
inner_rest->Add( new wxButton( this, wxID_MORE, _("More..."),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin );
if (flags & wxHELP)
inner_rest->Add(new wxButton(this, wxID_HELP, wxEmptyString,
wxDefaultPosition, wxDefaultSize,
wxCLIP_SIBLINGS),
0, wxLEFT|wxRIGHT, margin);
if (flags & wxCANCEL)
{
wxButton *cancel = new wxButton(this, wxID_CANCEL, wxEmptyString,
wxDefaultPosition, wxDefaultSize,
wxCLIP_SIBLINGS);
inner_rest->Add( cancel, 0, wxLEFT|wxRIGHT, margin );
} }
// choose the default button if (flags & wxHELP){
help = new wxButton(this, wxID_HELP, _("Help"));
sizer->AddButton(help);
}
sizer->Finalise();
if (flags & wxNO_DEFAULT) if (flags & wxNO_DEFAULT)
{ {
if (no) if (no)
@@ -278,7 +231,8 @@ wxSizer *wxDialogBase::CreateButtonSizer( long flags )
} }
} }
return box; return sizer;
} }
#endif // wxUSE_BUTTON #endif // wxUSE_BUTTON

View File

@@ -24,6 +24,7 @@
#include "wx/sizer.h" #include "wx/sizer.h"
#include "wx/utils.h" #include "wx/utils.h"
#include "wx/statbox.h" #include "wx/statbox.h"
#include "wx/settings.h"
#include "wx/listimpl.cpp" #include "wx/listimpl.cpp"
#if WXWIN_COMPATIBILITY_2_4 #if WXWIN_COMPATIBILITY_2_4
#include "wx/notebook.h" #include "wx/notebook.h"
@@ -43,6 +44,7 @@ IMPLEMENT_CLASS(wxBoxSizer, wxSizer)
#if wxUSE_STATBOX #if wxUSE_STATBOX
IMPLEMENT_CLASS(wxStaticBoxSizer, wxBoxSizer) IMPLEMENT_CLASS(wxStaticBoxSizer, wxBoxSizer)
#endif #endif
IMPLEMENT_CLASS(wxStdDialogButtonSizer, wxBoxSizer)
WX_DEFINE_EXPORTED_LIST( wxSizerItemList ); WX_DEFINE_EXPORTED_LIST( wxSizerItemList );
@@ -1639,6 +1641,141 @@ void wxStaticBoxSizer::ShowItems( bool show )
#endif // wxUSE_STATBOX #endif // wxUSE_STATBOX
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::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
}
#if WXWIN_COMPATIBILITY_2_4 #if WXWIN_COMPATIBILITY_2_4

View File

@@ -292,7 +292,7 @@ bool wxAnyChoiceDialog::Create(wxWindow *parent,
#endif #endif
// 4) buttons // 4) buttons
topsizer->Add( CreateButtonSizer( styleDlg & (wxOK|wxCANCEL) ), 0, wxCENTRE | wxALL, 10 ); topsizer->Add( CreateButtonSizer( styleDlg & (wxOK|wxCANCEL) ), 0, wxEXPAND | wxALL, 10 );
#endif // !__SMARTPHONE__ #endif // !__SMARTPHONE__

View File

@@ -295,7 +295,7 @@ void wxGenericColourDialog::CreateWidgets()
// 3) buttons // 3) buttons
wxSizer *buttonsizer = CreateButtonSizer( wxOK|wxCANCEL ); wxSizer *buttonsizer = CreateButtonSizer( wxOK|wxCANCEL );
buttonsizer->Add( new wxButton(this, wxID_ADD_CUSTOM, _("Add to custom colours") ), 0, wxLEFT|wxRIGHT, 10 ); buttonsizer->Add( new wxButton(this, wxID_ADD_CUSTOM, _("Add to custom colours") ), 0, wxLEFT|wxRIGHT, 10 );
topSizer->Add( buttonsizer, 0, wxCENTRE | wxALL, 10 ); topSizer->Add( buttonsizer, 0, wxEXPAND | wxALL, 10 );
SetAutoLayout( true ); SetAutoLayout( true );
SetSizer( topSizer ); SetSizer( topSizer );

View File

@@ -190,17 +190,7 @@ wxGenericDirDialog::wxGenericDirDialog(wxWindow* parent, const wxString& title,
#endif #endif
// 4) Buttons // 4) Buttons
buttonsizer = new wxBoxSizer( wxHORIZONTAL ); topsizer->Add( CreateButtonSizer( wxOK|wxCANCEL ), 0, wxEXPAND | wxALL, 10 );
// OK and Cancel button should be at the right bottom
wxButton* okButton = new wxButton(this, wxID_OK);
buttonsizer->Add( okButton, 0, wxLEFT|wxRIGHT, 10 );
wxButton* cancelButton = new wxButton(this, wxID_CANCEL);
buttonsizer->Add( cancelButton, 0, wxLEFT|wxRIGHT, 10 );
topsizer->Add( buttonsizer, 0, wxLEFT|wxTOP|wxBOTTOM | wxALIGN_RIGHT, 10 );
okButton->SetDefault();
#endif // !__SMARTPHONE__ #endif // !__SMARTPHONE__

View File

@@ -118,7 +118,7 @@ wxGenericMessageDialog::wxGenericMessageDialog( wxWindow *parent,
// 4) buttons // 4) buttons
topsizer->Add( CreateButtonSizer( style & (wxOK|wxCANCEL|wxYES_NO|wxYES_DEFAULT|wxNO_DEFAULT) ), topsizer->Add( CreateButtonSizer( style & (wxOK|wxCANCEL|wxYES_NO|wxYES_DEFAULT|wxNO_DEFAULT) ),
0, wxCENTRE | wxALL, 10 ); 0, wxEXPAND | wxALL, 10 );
SetAutoLayout( true ); SetAutoLayout( true );
SetSizer( topsizer ); SetSizer( topsizer );

View File

@@ -138,7 +138,7 @@ wxNumberEntryDialog::wxNumberEntryDialog(wxWindow *parent,
#endif #endif
// 4) buttons // 4) buttons
topsizer->Add( CreateButtonSizer( wxOK|wxCANCEL ), 0, wxCENTRE | wxALL, 10 ); topsizer->Add( CreateButtonSizer( wxOK|wxCANCEL ), 0, wxEXPAND | wxALL, 10 );
#endif // !__SMARTPHONE__ #endif // !__SMARTPHONE__

View File

@@ -252,7 +252,7 @@ void wxGenericPrintDialog::Init(wxWindow * WXUNUSED(parent))
// 5) buttons // 5) buttons
mainsizer->Add( CreateButtonSizer( wxOK|wxCANCEL), 0, wxCENTER|wxALL, 10 ); mainsizer->Add( CreateButtonSizer( wxOK|wxCANCEL), 0, wxEXPAND|wxALL, 10 );
SetAutoLayout( true ); SetAutoLayout( true );
SetSizer( mainsizer ); SetSizer( mainsizer );
@@ -656,7 +656,7 @@ void wxGenericPrintSetupDialog::Init(wxPrintData* data)
// buttons // buttons
main_sizer->Add( CreateButtonSizer( wxOK|wxCANCEL), 0, wxCENTER|wxALL, 10 ); main_sizer->Add( CreateButtonSizer( wxOK|wxCANCEL), 0, wxEXPAND|wxALL, 10 );
SetAutoLayout( true ); SetAutoLayout( true );
SetSizer( main_sizer ); SetSizer( main_sizer );
@@ -920,7 +920,7 @@ wxGenericPageSetupDialog::wxGenericPageSetupDialog( wxWindow *parent,
// if (m_printData.GetEnableHelp()) // if (m_printData.GetEnableHelp())
// wxButton *helpButton = new wxButton(this, (wxFunction)wxGenericPageSetupHelpProc, _("Help"), wxDefaultCoord, wxDefaultCoord, buttonWidth, buttonHeight); // wxButton *helpButton = new wxButton(this, (wxFunction)wxGenericPageSetupHelpProc, _("Help"), wxDefaultCoord, wxDefaultCoord, buttonWidth, buttonHeight);
mainsizer->Add( buttonsizer, 0, wxCENTER|wxALL, 10 ); mainsizer->Add( buttonsizer, 0, wxEXPAND|wxALL, 10 );
SetAutoLayout( true ); SetAutoLayout( true );

View File

@@ -125,7 +125,7 @@ wxTextEntryDialog::wxTextEntryDialog(wxWindow *parent,
#endif #endif
// 4) buttons // 4) buttons
topsizer->Add( CreateButtonSizer( style ), 0, wxCENTRE | wxALL, 10 ); topsizer->Add( CreateButtonSizer( style ), 0, wxEXPAND | wxALL, 10 );
#endif // !__SMARTPHONE__ #endif // !__SMARTPHONE__