]> git.saurik.com Git - wxWidgets.git/commitdiff
Applied modified form of the StdButtonSize patch.
authorRobert Roebling <robert@roebling.de>
Fri, 31 Dec 2004 18:57:25 +0000 (18:57 +0000)
committerRobert Roebling <robert@roebling.de>
Fri, 31 Dec 2004 18:57:25 +0000 (18:57 +0000)
    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

include/wx/dialog.h
include/wx/sizer.h
src/common/dlgcmn.cpp
src/common/sizer.cpp
src/generic/choicdgg.cpp
src/generic/colrdlgg.cpp
src/generic/dirdlgg.cpp
src/generic/msgdlgg.cpp
src/generic/numdlgg.cpp
src/generic/prntdlgg.cpp
src/generic/textdlgg.cpp

index 855ce352c8a3292d16a013c612ea5cdf383fd06a..17dc6c0ac110873b788606fd0265cd83135c45a9 100644 (file)
@@ -20,6 +20,9 @@
 #include "wx/containr.h"
 #include "wx/toplevel.h"
 
+class WXDLLEXPORT wxSizer;
+class WXDLLEXPORT wxStdDialogButtonSizer;
+
 #define wxDIALOG_NO_PARENT      0x0001  // Don't make owned by apps top window
 
 #ifdef __WXWINCE__
@@ -56,6 +59,7 @@ public:
 #if wxUSE_BUTTON
     // places buttons into a horizontal wxBoxSizer
     wxSizer *CreateButtonSizer( long flags );
+    wxStdDialogButtonSizer *CreateStdDialogButtonSizer( long flags );
 #endif // wxUSE_BUTTON
 
 protected:
index e13f2029030e9a263e106119c8d51955856aed9c..11915e11b6e441b98b30ca145911e37cde76528b 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "wx/defs.h"
 
+#include "wx/button.h"
 #include "wx/window.h"
 #include "wx/frame.h"
 #include "wx/dialog.h"
@@ -641,6 +642,48 @@ private:
 
 #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
 // NB: wxBookCtrlSizer and wxNotebookSizer are deprecated, they
index b599012aa5b52380e3ea20b27e5c7fbbdc17037c..26fa7ab5301d4afe07cd1496fe4e160cdecd127f 100644 (file)
@@ -170,92 +170,45 @@ wxSizer *wxDialogBase::CreateTextSizer( const wxString& message )
 
 wxSizer *wxDialogBase::CreateButtonSizer( long flags )
 {
-    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.
-    wxBoxSizer *box = is_pda ? new wxBoxSizer( wxVERTICAL ) : new wxBoxSizer( wxHORIZONTAL );
-
-    wxBoxSizer *inner_yes_no = NULL;
+    return CreateStdDialogButtonSizer( flags );
+}
 
-    // Only create sizer containing yes/no
-    // if it is actually required
-    if ( (flags & wxYES_NO) != 0 )
-    {
-        inner_yes_no = new wxBoxSizer( wxHORIZONTAL );
-        box->Add( inner_yes_no, 0, wxBOTTOM, 10 );
+wxStdDialogButtonSizer *wxDialogBase::CreateStdDialogButtonSizer( long flags )
+{
+    wxStdDialogButtonSizer *sizer = new wxStdDialogButtonSizer();
+    wxButton *ok = NULL;
+    wxButton *cancel = NULL;
+    wxButton *yes = NULL;
+    wxButton *no = NULL;
+    wxButton *help = NULL;
+    
+    if (flags & wxOK){
+       ok = new wxButton(this, wxID_OK, _("OK"));
+       sizer->AddButton(ok);
     }
-
-    wxBoxSizer *inner_rest = new wxBoxSizer( wxHORIZONTAL );
-    box->Add( inner_rest, 0, 0, 0 );
-
-#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 & wxCANCEL){
+       cancel = new wxButton(this, wxID_CANCEL, _("Cancel"));
+       sizer->AddButton(cancel);       
     }
-    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 & wxYES){
+       yes = new wxButton(this, wxID_YES, _("Yes"));
+       sizer->AddButton(yes);
     }
-
-    if (flags & wxOK)
-    {
-        ok = new wxButton(this, wxID_OK, wxEmptyString,
-                          wxDefaultPosition, wxDefaultSize, wxCLIP_SIBLINGS);
-        inner_rest->Add( ok, 0, wxLEFT|wxRIGHT, margin );
+    
+    if (flags & wxNO){
+       no = new wxButton(this, wxID_NO, _("No"));
+       sizer->AddButton(no);
     }
-
-    if (flags & wxFORWARD)
-        inner_rest->Add(new wxButton(this, wxID_FORWARD, wxEmptyString,
-                                     wxDefaultPosition, wxDefaultSize,
-                                     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 );
+    
+    if (flags & wxHELP){
+       help = new wxButton(this, wxID_HELP, _("Help"));
+       sizer->AddButton(help);
     }
-
-    // choose the default button
+    
+    sizer->Finalise();
+           
     if (flags & wxNO_DEFAULT)
     {
         if (no)
@@ -278,7 +231,8 @@ wxSizer *wxDialogBase::CreateButtonSizer( long flags )
         }
     }
 
-    return box;
+    return sizer;
 }
 
+
 #endif // wxUSE_BUTTON
index 93f988572eb338ac246e4937a3d04889b3d3fa8f..307ab3adc8ecac0dd10783f00e39be403f4d467a 100644 (file)
@@ -24,6 +24,7 @@
 #include "wx/sizer.h"
 #include "wx/utils.h"
 #include "wx/statbox.h"
+#include "wx/settings.h"
 #include "wx/listimpl.cpp"
 #if WXWIN_COMPATIBILITY_2_4
     #include "wx/notebook.h"
@@ -43,6 +44,7 @@ IMPLEMENT_CLASS(wxBoxSizer, wxSizer)
 #if wxUSE_STATBOX
 IMPLEMENT_CLASS(wxStaticBoxSizer, wxBoxSizer)
 #endif
+IMPLEMENT_CLASS(wxStdDialogButtonSizer, wxBoxSizer)
 
 WX_DEFINE_EXPORTED_LIST( wxSizerItemList );
 
@@ -1639,6 +1641,141 @@ void wxStaticBoxSizer::ShowItems( bool show )
 
 #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
 
index bb2a38dc5636bb1df7ce1cc0ee5db4b276c5759d..2b5b11b2a2c2bac8be91b2bca346621067a7e346 100644 (file)
@@ -292,7 +292,7 @@ bool wxAnyChoiceDialog::Create(wxWindow *parent,
 #endif
 
     // 4) buttons
-    topsizer->Add( CreateButtonSizer( styleDlg & (wxOK|wxCANCEL) ), 0, wxCENTRE | wxALL, 10 );
+    topsizer->Add( CreateButtonSizer( styleDlg & (wxOK|wxCANCEL) ), 0, wxEXPAND | wxALL, 10 );
 
 #endif // !__SMARTPHONE__
 
index a5d264b557c8b9003edb3fd71afba5a0e8a4eb32..80b13b5337e601fb9d08dc08ee139bf8bd171525 100644 (file)
@@ -295,7 +295,7 @@ void wxGenericColourDialog::CreateWidgets()
     // 3) buttons
     wxSizer *buttonsizer = CreateButtonSizer( wxOK|wxCANCEL );
     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 );
     SetSizer( topSizer );
index a07fbd497e786483b84db914555cbd552cf51275..327bcbc81e2bf5e872f4a94de3c3166070227e1b 100644 (file)
@@ -190,17 +190,7 @@ wxGenericDirDialog::wxGenericDirDialog(wxWindow* parent, const wxString& title,
 #endif
 
     // 4) Buttons
-    buttonsizer = new wxBoxSizer( wxHORIZONTAL );
-
-    // 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();
+    topsizer->Add( CreateButtonSizer( wxOK|wxCANCEL ), 0, wxEXPAND | wxALL, 10 );
 
 #endif // !__SMARTPHONE__
 
index 041fe3301aa9d43ef850160942a2a283f00d50ad..cc4ed5c81e92f8a65103c02dcffec4b2fd2c598a 100644 (file)
@@ -118,7 +118,7 @@ wxGenericMessageDialog::wxGenericMessageDialog( wxWindow *parent,
 
     // 4) buttons
     topsizer->Add( CreateButtonSizer( style & (wxOK|wxCANCEL|wxYES_NO|wxYES_DEFAULT|wxNO_DEFAULT) ),
-                   0, wxCENTRE | wxALL, 10 );
+                   0, wxEXPAND | wxALL, 10 );
 
     SetAutoLayout( true );
     SetSizer( topsizer );
index d8a6f2ae5f9cb0fb94de8c9f15c05e54c362a3cf..a4455a0b922810631c5d20feebdb023b2b20875d 100644 (file)
@@ -138,7 +138,7 @@ wxNumberEntryDialog::wxNumberEntryDialog(wxWindow *parent,
 #endif
 
     // 4) buttons
-    topsizer->Add( CreateButtonSizer( wxOK|wxCANCEL ), 0, wxCENTRE | wxALL, 10 );
+    topsizer->Add( CreateButtonSizer( wxOK|wxCANCEL ), 0, wxEXPAND | wxALL, 10 );
 
 #endif // !__SMARTPHONE__
 
index 9b9e3846c01163f0afd1eb1aba6310643eca89f2..f3995f5d6ddf4777c0b573f862b61c0ffe93d7e3 100644 (file)
@@ -252,7 +252,7 @@ void wxGenericPrintDialog::Init(wxWindow * WXUNUSED(parent))
 
     // 5) buttons
 
-    mainsizer->Add( CreateButtonSizer( wxOK|wxCANCEL), 0, wxCENTER|wxALL, 10 );
+    mainsizer->Add( CreateButtonSizer( wxOK|wxCANCEL), 0, wxEXPAND|wxALL, 10 );
 
     SetAutoLayout( true );
     SetSizer( mainsizer );
@@ -656,7 +656,7 @@ void wxGenericPrintSetupDialog::Init(wxPrintData* data)
 
     // buttons
 
-    main_sizer->Add( CreateButtonSizer( wxOK|wxCANCEL), 0, wxCENTER|wxALL, 10 );
+    main_sizer->Add( CreateButtonSizer( wxOK|wxCANCEL), 0, wxEXPAND|wxALL, 10 );
 
     SetAutoLayout( true );
     SetSizer( main_sizer );
@@ -920,7 +920,7 @@ wxGenericPageSetupDialog::wxGenericPageSetupDialog( wxWindow *parent,
         
     //  if (m_printData.GetEnableHelp())
     //  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 );
index b89b9d5de3c1e61b2cd2819f4f351edcc4e17c26..70d8a220ff9c6d784d883214310e33eafd21bfd2 100644 (file)
@@ -125,7 +125,7 @@ wxTextEntryDialog::wxTextEntryDialog(wxWindow *parent,
 #endif
 
     // 4) buttons
-    topsizer->Add( CreateButtonSizer( style ), 0, wxCENTRE | wxALL, 10 );
+    topsizer->Add( CreateButtonSizer( style ), 0, wxEXPAND | wxALL, 10 );
 
 #endif // !__SMARTPHONE__