]> git.saurik.com Git - wxWidgets.git/commitdiff
use wxFlexGridSizer for layout of the labels in the progress dialog (patch 1829312...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 6 Jan 2008 15:05:57 +0000 (15:05 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 6 Jan 2008 15:05:57 +0000 (15:05 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51038 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/generic/progdlgg.h
src/generic/progdlgg.cpp

index deea6ebbaf0d7262bd2d233e7e4edcad6dad3bee..5b9cee440a6ed03a77b4680a837e1a94fe0dcef2 100644 (file)
@@ -30,29 +30,29 @@ class WXDLLEXPORT wxProgressDialog : public wxDialog
 {
 DECLARE_DYNAMIC_CLASS(wxProgressDialog)
 public:
 {
 DECLARE_DYNAMIC_CLASS(wxProgressDialog)
 public:
-   /* Creates and displays dialog, disables event handling for other
+    /* Creates and displays dialog, disables event handling for other
        frames or parent frame to avoid recursion problems.
        @param title title for window
        @param message message to display in window
        @param maximum value for status bar, if <= 0, no bar is shown
        @param parent window or NULL
        @param style is the bit mask of wxPD_XXX constants from wx/defs.h
        frames or parent frame to avoid recursion problems.
        @param title title for window
        @param message message to display in window
        @param maximum value for status bar, if <= 0, no bar is shown
        @param parent window or NULL
        @param style is the bit mask of wxPD_XXX constants from wx/defs.h
-   */
-   wxProgressDialog(const wxString &title, wxString const &message,
-                    int maximum = 100,
-                    wxWindow *parent = NULL,
-                    int style = wxPD_APP_MODAL | wxPD_AUTO_HIDE);
-   /* Destructor.
-       Re-enables event handling for other windows.
-   */
-   virtual ~wxProgressDialog();
-
-   /* Update the status bar to the new value.
+    */
+    wxProgressDialog(const wxString& title, const wxString& message,
+                     int maximum = 100,
+                     wxWindow *parent = NULL,
+                     int style = wxPD_APP_MODAL | wxPD_AUTO_HIDE);
+    /* Destructor.
+        Re-enables event handling for other windows.
+    */
+    virtual ~wxProgressDialog();
+
+    /* Update the status bar to the new value.
        @param value new value
        @param newmsg if used, new message to display
        @returns true if ABORT button has not been pressed
        @param value new value
        @param newmsg if used, new message to display
        @returns true if ABORT button has not been pressed
-   */
-   virtual bool Update(int value, const wxString& newmsg = wxEmptyString, bool *skip = NULL);
+    */
+    virtual bool Update(int value, const wxString& newmsg = wxEmptyString, bool *skip = NULL);
 
     /* Switches the dialog to use a gauge in indeterminate mode and calls
        wxGauge::Pulse() to show to the user a bit of progress */
 
     /* Switches the dialog to use a gauge in indeterminate mode and calls
        wxGauge::Pulse() to show to the user a bit of progress */
@@ -61,63 +61,63 @@ public:
     // Must provide overload to avoid hiding it (and warnings about it)
     virtual void Update() { wxDialog::Update(); }
 
     // Must provide overload to avoid hiding it (and warnings about it)
     virtual void Update() { wxDialog::Update(); }
 
-   /* Can be called to continue after the cancel button has been pressed, but
+    /* Can be called to continue after the cancel button has been pressed, but
        the program decided to continue the operation (e.g., user didn't
        confirm it)
        the program decided to continue the operation (e.g., user didn't
        confirm it)
-   */
-   void Resume();
+    */
+    void Resume();
 
 
-   virtual bool Show( bool show = true );
+    virtual bool Show( bool show = true );
 
 protected:
 
 protected:
-   // callback for optional abort button
-   void OnCancel(wxCommandEvent& event);
+    // callback for optional abort button
+    void OnCancel(wxCommandEvent&);
 
 
-   // callback for optional skip button
-   void OnSkip(wxCommandEvent& event);
+    // callback for optional skip button
+    void OnSkip(wxCommandEvent&);
 
 
-   // callback to disable "hard" window closing
-   void OnClose(wxCloseEvent& event);
+    // callback to disable "hard" window closing
+    void OnClose(wxCloseEvent&);
 
 
-   // must be called to reenable the other windows temporarily disabled while
-   // the dialog was shown
-   void ReenableOtherWindows();
+    // must be called to reenable the other windows temporarily disabled while
+    // the dialog was shown
+    void ReenableOtherWindows();
 
 private:
 
 private:
-   // create the label with given text and another one to show the time nearby
-   // as the next windows in the sizer, returns the created control
-   wxStaticText *CreateLabel(const wxString& text, wxSizer *sizer);
+    // create the label with given text and another one to show the time nearby
+    // as the next windows in the sizer, returns the created control
+    wxStaticText *CreateLabel(const wxString& text, wxSizer *sizer);
 
     // updates the label message
 
     // updates the label message
-   void UpdateMessage(const wxString &newmsg);
-
-   // common part of Update() and Pulse(), returns true if not cancelled
-   bool DoAfterUpdate(bool *skip);
-
-   // shortcuts for enabling buttons
-   void EnableClose();
-   void EnableSkip(bool enable=true);
-   void EnableAbort(bool enable=true);
-   inline void DisableSkip() { EnableSkip(false); }
-   inline void DisableAbort() { EnableAbort(false); }
-
-   // the status bar
-   wxGauge *m_gauge;
-   // the message displayed
-   wxStaticText *m_msg;
-   // displayed elapsed, estimated, remaining time
-   class wxStaticText *m_elapsed,
-                      *m_estimated,
-                      *m_remaining;
-   // time when the dialog was created
-   unsigned long m_timeStart;
-   // time when the dialog was closed or cancelled
-   unsigned long m_timeStop;
-   // time between the moment the dialog was closed/cancelled and resume
-   unsigned long m_break;
-
-   // parent top level window (may be NULL)
-   wxWindow *m_parentTop;
+    void UpdateMessage(const wxString &newmsg);
+
+    // common part of Update() and Pulse(), returns true if not cancelled
+    bool DoAfterUpdate(bool *skip);
+
+    // shortcuts for enabling buttons
+    void EnableClose();
+    void EnableSkip(bool enable = true);
+    void EnableAbort(bool enable = true);
+    void DisableSkip() { EnableSkip(false); }
+    void DisableAbort() { EnableAbort(false); }
+
+    // the status bar
+    wxGauge *m_gauge;
+    // the message displayed
+    wxStaticText *m_msg;
+    // displayed elapsed, estimated, remaining time
+    wxStaticText *m_elapsed,
+                 *m_estimated,
+                 *m_remaining;
+    // time when the dialog was created
+    unsigned long m_timeStart;
+    // time when the dialog was closed or cancelled
+    unsigned long m_timeStop;
+    // time between the moment the dialog was closed/cancelled and resume
+    unsigned long m_break;
+
+    // parent top level window (may be NULL)
+    wxWindow *m_parentTop;
 
     // continue processing or not (return value for Update())
     enum
 
     // continue processing or not (return value for Update())
     enum
index 6af7fdfc651c901db48c0d39f67735f175a2c23f..6f4fec1fe830278a6ea82043fe72ccfb1e8a40ea 100644 (file)
@@ -92,8 +92,8 @@ IMPLEMENT_CLASS(wxProgressDialog, wxDialog)
 // wxProgressDialog creation
 // ----------------------------------------------------------------------------
 
 // wxProgressDialog creation
 // ----------------------------------------------------------------------------
 
-wxProgressDialog::wxProgressDialog(wxString const &title,
-                                   wxString const &message,
+wxProgressDialog::wxProgressDialog(const wxString& title,
+                                   const wxString& message,
                                    int maximum,
                                    wxWindow *parent,
                                    int style)
                                    int maximum,
                                    wxWindow *parent,
                                    int style)
@@ -110,8 +110,6 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
     m_hasAbortButton = (style & wxPD_CAN_ABORT) != 0;
     m_hasSkipButton = (style & wxPD_CAN_SKIP) != 0;
 
     m_hasAbortButton = (style & wxPD_CAN_ABORT) != 0;
     m_hasSkipButton = (style & wxPD_CAN_SKIP) != 0;
 
-    bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA);
-
 #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
     // we have to remove the "Close" button from the title bar then as it is
     // confusing to have it - it doesn't work anyhow
 #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
     // we have to remove the "Close" button from the title bar then as it is
     // confusing to have it - it doesn't work anyhow
@@ -144,36 +142,44 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
     wxCoord widthText = 0;
     dc.GetTextExtent(message, &widthText, NULL, NULL, NULL, NULL);
 
     wxCoord widthText = 0;
     dc.GetTextExtent(message, &widthText, NULL, NULL, NULL, NULL);
 
-    wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+    // top-level sizerTop
+    wxSizer * const sizerTop = new wxBoxSizer(wxVERTICAL);
 
     m_msg = new wxStaticText(this, wxID_ANY, message);
 
     m_msg = new wxStaticText(this, wxID_ANY, message);
-    sizer->Add(m_msg, 0, wxLEFT | wxTOP, 2*LAYOUT_MARGIN);
-
-    wxSize sizeDlg,
-           sizeLabel = m_msg->GetSize();
-    sizeDlg.y = 2*LAYOUT_MARGIN + sizeLabel.y;
+    sizerTop->Add(m_msg, 0, wxLEFT | wxTOP, 2*LAYOUT_MARGIN);
 
 
+    wxSize sizeLabel = m_msg->GetSize();
     if ( maximum > 0 )
     {
         int gauge_style = wxGA_HORIZONTAL;
     if ( maximum > 0 )
     {
         int gauge_style = wxGA_HORIZONTAL;
-        if ( ( style & wxPD_SMOOTH ) == wxPD_SMOOTH )
+        if ( style & wxPD_SMOOTH )
             gauge_style |= wxGA_SMOOTH;
             gauge_style |= wxGA_SMOOTH;
-        m_gauge = new wxGauge(this, wxID_ANY, m_maximum,
-                              wxDefaultPosition, wxDefaultSize,
-                              gauge_style );
-
-        sizer->Add(m_gauge, 0, wxLEFT | wxRIGHT | wxTOP | wxEXPAND, 2*LAYOUT_MARGIN);
+        m_gauge = new wxGauge
+                      (
+                        this,
+                        wxID_ANY,
+                        m_maximum,
+                        wxDefaultPosition,
+                        // make the progress bar sufficiently long
+                        wxSize(wxMin(wxGetClientDisplayRect().width/3, 300), -1),
+                        gauge_style
+                      );
+
+        sizerTop->Add(m_gauge, 0, wxLEFT | wxRIGHT | wxTOP | wxEXPAND, 2*LAYOUT_MARGIN);
         m_gauge->SetValue(0);
         m_gauge->SetValue(0);
-
-        wxSize sizeGauge = m_gauge->GetSize();
-        sizeDlg.y += 2*LAYOUT_MARGIN + sizeGauge.y;
     }
     else
     }
     else
-        m_gauge = (wxGauge *)NULL;
+    {
+        m_gauge = NULL;
+    }
 
     // create the estimated/remaining/total time zones if requested
 
     // create the estimated/remaining/total time zones if requested
-    m_elapsed = m_estimated = m_remaining = (wxStaticText*)NULL;
-    m_display_estimated = m_last_timeupdate = m_break = 0;
+    m_elapsed =
+    m_estimated =
+    m_remaining = NULL;
+    m_display_estimated =
+    m_last_timeupdate =
+    m_break = 0;
     m_ctdelay = 0;
 
     // if we are going to have at least one label, remember it in this var
     m_ctdelay = 0;
 
     // if we are going to have at least one label, remember it in this var
@@ -182,12 +188,14 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
     // also count how many labels we really have
     size_t nTimeLabels = 0;
 
     // also count how many labels we really have
     size_t nTimeLabels = 0;
 
+    wxSizer * const sizerLabels = new wxFlexGridSizer(2);
+
     if ( style & wxPD_ELAPSED_TIME )
     {
         nTimeLabels++;
 
         label =
     if ( style & wxPD_ELAPSED_TIME )
     {
         nTimeLabels++;
 
         label =
-        m_elapsed = CreateLabel(_("Elapsed time : "), sizer);
+        m_elapsed = CreateLabel(_("Elapsed time:"), sizerLabels);
     }
 
     if ( style & wxPD_ESTIMATED_TIME )
     }
 
     if ( style & wxPD_ESTIMATED_TIME )
@@ -195,7 +203,7 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
         nTimeLabels++;
 
         label =
         nTimeLabels++;
 
         label =
-        m_estimated = CreateLabel(_("Estimated time : "), sizer);
+        m_estimated = CreateLabel(_("Estimated time:"), sizerLabels);
     }
 
     if ( style & wxPD_REMAINING_TIME )
     }
 
     if ( style & wxPD_REMAINING_TIME )
@@ -203,14 +211,14 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
         nTimeLabels++;
 
         label =
         nTimeLabels++;
 
         label =
-        m_remaining = CreateLabel(_("Remaining time : "), sizer);
+        m_remaining = CreateLabel(_("Remaining time:"), sizerLabels);
     }
     }
+    sizerTop->Add(sizerLabels, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, LAYOUT_MARGIN);
 
     if ( nTimeLabels > 0 )
     {
         // set it to the current time
         m_timeStart = wxGetCurrentTime();
 
     if ( nTimeLabels > 0 )
     {
         // set it to the current time
         m_timeStart = wxGetCurrentTime();
-        sizeDlg.y += nTimeLabels * (label->GetSize().y + LAYOUT_MARGIN);
     }
 
 #if defined(__SMARTPHONE__)
     }
 
 #if defined(__SMARTPHONE__)
@@ -219,10 +227,12 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
     if ( m_hasAbortButton )
         SetLeftMenu(wxID_CANCEL);
 #else
     if ( m_hasAbortButton )
         SetLeftMenu(wxID_CANCEL);
 #else
-    m_btnAbort = m_btnSkip = (wxButton *)NULL;
-    bool sizeDlgModified = false;
+    m_btnAbort =
+    m_btnSkip = NULL;
+
     wxBoxSizer *buttonSizer = new wxBoxSizer(wxHORIZONTAL);
 
     wxBoxSizer *buttonSizer = new wxBoxSizer(wxHORIZONTAL);
 
+    // Windows dialogs usually have buttons in the lower right corner
     const int sizerFlags =
 #if defined(__WXMSW__) || defined(__WXPM__)
                            wxALIGN_RIGHT | wxALL
     const int sizerFlags =
 #if defined(__WXMSW__) || defined(__WXPM__)
                            wxALIGN_RIGHT | wxALL
@@ -233,37 +243,22 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
 
     if ( m_hasSkipButton )
     {
 
     if ( m_hasSkipButton )
     {
-        m_btnSkip = new wxButton(this, wxID_SKIP, _("Skip"));
+        m_btnSkip = new wxButton(this, wxID_SKIP, _("&Skip"));
 
 
-        // Windows dialogs usually have buttons in the lower right corner
         buttonSizer->Add(m_btnSkip, 0, sizerFlags, LAYOUT_MARGIN);
         buttonSizer->Add(m_btnSkip, 0, sizerFlags, LAYOUT_MARGIN);
-        sizeDlg.y += 2*LAYOUT_MARGIN + wxButton::GetDefaultSize().y;
-        sizeDlgModified = true;
     }
 
     if ( m_hasAbortButton )
     {
         m_btnAbort = new wxButton(this, wxID_CANCEL);
 
     }
 
     if ( m_hasAbortButton )
     {
         m_btnAbort = new wxButton(this, wxID_CANCEL);
 
-        // Windows dialogs usually have buttons in the lower right corner
         buttonSizer->Add(m_btnAbort, 0, sizerFlags, LAYOUT_MARGIN);
         buttonSizer->Add(m_btnAbort, 0, sizerFlags, LAYOUT_MARGIN);
-        if(!sizeDlgModified)
-            sizeDlg.y += 2*LAYOUT_MARGIN + wxButton::GetDefaultSize().y;
     }
 
     }
 
-    sizer->Add(buttonSizer, 0, sizerFlags, LAYOUT_MARGIN );
+    sizerTop->Add(buttonSizer, 0, sizerFlags, LAYOUT_MARGIN );
 #endif // __SMARTPHONE__/!__SMARTPHONE__
 
 #endif // __SMARTPHONE__/!__SMARTPHONE__
 
-    SetSizerAndFit(sizer);
-
-    if (!isPda)
-    {
-        sizeDlg.y += 2*LAYOUT_MARGIN;
-
-        // try to make the dialog not square but rectangular of reasonable width
-        sizeDlg.x = (wxCoord)wxMax(3*widthText/2, 4*sizeDlg.y/3);
-        SetClientSize(sizeDlg);
-    }
+    SetSizerAndFit(sizerTop);
 
     Centre(wxCENTER_FRAME | wxBOTH);
 
 
     Centre(wxCENTER_FRAME | wxBOTH);
 
@@ -292,33 +287,28 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
     Update();
 }
 
     Update();
 }
 
-wxStaticText *wxProgressDialog::CreateLabel(const wxString& text,
-                                            wxSizer *sizer)
+wxStaticText *
+wxProgressDialog::CreateLabel(const wxString& text, wxSizer *sizer)
 {
 {
-    wxBoxSizer *locsizer = new wxBoxSizer(wxLARGESMALL(wxHORIZONTAL,wxVERTICAL));
-
-    wxStaticText *dummy = new wxStaticText(this, wxID_ANY, text);
-    wxStaticText *label = new wxStaticText(this, wxID_ANY, _("unknown"));
+    wxStaticText *label = new wxStaticText(this, wxID_ANY, text);
+    wxStaticText *value = new wxStaticText(this, wxID_ANY, _("unknown"));
 
     // select placement most native or nice on target GUI
 #if defined(__SMARTPHONE__)
 
     // select placement most native or nice on target GUI
 #if defined(__SMARTPHONE__)
-    // label and time to the left in two rows
-    locsizer->Add(dummy, 1, wxALIGN_LEFT);
-    locsizer->Add(label, 1, wxALIGN_LEFT);
-    sizer->Add(locsizer, 0, wxALIGN_LEFT | wxTOP | wxLEFT, LAYOUT_MARGIN);
+    // value and time to the left in two rows
+    sizer->Add(label, 1, wxALIGN_LEFT);
+    sizer->Add(value, 1, wxALIGN_LEFT);
 #elif defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMAC__) || defined(__WXGTK20__)
 #elif defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMAC__) || defined(__WXGTK20__)
-    // label and time centered in one row
-    locsizer->Add(dummy, 1, wxLARGESMALL(wxALIGN_RIGHT,wxALIGN_LEFT));
-    locsizer->Add(label, 1, wxALIGN_LEFT | wxLEFT, LAYOUT_MARGIN);
-    sizer->Add(locsizer, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, LAYOUT_MARGIN);
+    // value and time centered in one row
+    sizer->Add(label, 1, wxLARGESMALL(wxALIGN_RIGHT,wxALIGN_LEFT) | wxTOP | wxRIGHT, LAYOUT_MARGIN);
+    sizer->Add(value, 1, wxALIGN_LEFT | wxTOP, LAYOUT_MARGIN);
 #else
 #else
-    // label and time to the right in one row
-    sizer->Add(locsizer, 0, wxALIGN_RIGHT | wxRIGHT | wxTOP, LAYOUT_MARGIN);
-    locsizer->Add(dummy);
-    locsizer->Add(label, 0, wxLEFT, LAYOUT_MARGIN);
+    // value and time to the right in one row
+    sizer->Add(label);
+    sizer->Add(value, 0, wxLEFT, LAYOUT_MARGIN);
 #endif
 
 #endif
 
-    return label;
+    return value;
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------