]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/progdlgg.cpp
don't update the tree unnecessarily in Expand/CollapseAllChildren() (patch 1809520)
[wxWidgets.git] / src / generic / progdlgg.cpp
index 0e648130283b4000dd8f22a5cdb34eec537bcfe3..fbb2699e627789b4f6e4de1670e42517f9985872 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        progdlgg.h
+// Name:        src/generic/progdlgg.cpp
 // Purpose:     wxProgressDialog class
 // Author:      Karsten Ballüder
 // Modified by:
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "progdlgg.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
     #include "wx/intl.h"
     #include "wx/dcclient.h"
     #include "wx/timer.h"
+    #include "wx/settings.h"
 #endif
 
-#include "wx/generic/progdlgg.h"
-#include "wx/settings.h"
+#include "wx/progdlg.h"
 
 // ---------------------------------------------------------------------------
 // macros
@@ -101,7 +97,7 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
                                    int maximum,
                                    wxWindow *parent,
                                    int style)
-                : wxDialog(parent, wxID_ANY, title),
+                : wxDialog(GetParentForModalDialog(parent), wxID_ANY, title),
                   m_skip(false),
                   m_delay(3),
                   m_hasAbortButton(false),
@@ -115,7 +111,7 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
     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
@@ -145,7 +141,7 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
 
     wxClientDC dc(this);
     dc.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
-    long widthText;
+    wxCoord widthText = 0;
     dc.GetTextExtent(message, &widthText, NULL, NULL, NULL, NULL);
 
     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
@@ -265,7 +261,7 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
         sizeDlg.y += 2*LAYOUT_MARGIN;
 
         // try to make the dialog not square but rectangular of reasonable width
-        sizeDlg.x = (wxCoord)wxMax(widthText, 4*sizeDlg.y/3);
+        sizeDlg.x = (wxCoord)wxMax(widthText*2, 4*sizeDlg.y/3);
         sizeDlg.x *= 3;
         sizeDlg.x /= 2;
         SetClientSize(sizeDlg);
@@ -312,7 +308,7 @@ wxStaticText *wxProgressDialog::CreateLabel(const wxString& text,
     locsizer->Add(dummy, 1, wxALIGN_LEFT);
     locsizer->Add(label, 1, wxALIGN_LEFT);
     sizer->Add(locsizer, 0, wxALIGN_LEFT | wxTOP | wxLEFT, LAYOUT_MARGIN);
-#elif defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMAC__)
+#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);
@@ -342,19 +338,10 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip)
 
     wxASSERT_MSG( value <= m_maximum, wxT("invalid progress value") );
 
-    // fill up the gauge if value == maximum because this means that the dialog
-    // is going to close and the gauge shouldn't be partly empty in this case
-    if ( m_gauge && value <= m_maximum )
-    {
-        m_gauge->SetValue(value == m_maximum ? value : value + 1);
-    }
-
-    if ( !newmsg.empty() && newmsg != m_msg->GetLabel() )
-    {
-        m_msg->SetLabel(newmsg);
+    if ( m_gauge )
+        m_gauge->SetValue(value);
 
-        wxYieldIfNeeded() ;
-    }
+    UpdateMessage(newmsg);
 
     if ( (m_elapsed || m_remaining || m_estimated) && (value != 0) )
     {
@@ -427,7 +414,7 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip)
             EnableCloseButton();
 #endif // __WXMSW__
 
-            if ( !newmsg.empty() )
+            if ( newmsg.empty() )
             {
                 // also provide the finishing message if the application didn't
                 m_msg->SetLabel(_("Done."));
@@ -447,18 +434,9 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip)
             Hide();
         }
     }
-    else
+    else // not at maximum yet
     {
-        // we have to yield because not only we want to update the display but
-        // also to process the clicks on the cancel and skip buttons
-        wxYieldIfNeeded() ;
-
-        if ( (m_skip) && (skip != NULL) && (*skip == false) )
-        {
-            *skip = true;
-            m_skip = false;
-            EnableSkip();
-        }
+        return DoAfterUpdate(skip);
     }
 
     // update the display in case yielding above didn't do it
@@ -467,6 +445,45 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip)
     return m_state != Canceled;
 }
 
+bool wxProgressDialog::Pulse(const wxString& newmsg, bool *skip)
+{
+    wxASSERT_MSG( m_gauge, wxT("cannot update non existent dialog") );
+
+    // show a bit of progress
+    m_gauge->Pulse();
+
+    UpdateMessage(newmsg);
+
+    if (m_elapsed || m_remaining || m_estimated)
+    {
+        unsigned long elapsed = wxGetCurrentTime() - m_timeStart;
+
+        SetTimeLabel(elapsed, m_elapsed);
+        SetTimeLabel((unsigned long)-1, m_estimated);
+        SetTimeLabel((unsigned long)-1, m_remaining);
+    }
+
+    return DoAfterUpdate(skip);
+}
+
+bool wxProgressDialog::DoAfterUpdate(bool *skip)
+{
+    // we have to yield because not only we want to update the display but
+    // also to process the clicks on the cancel and skip buttons
+    wxYieldIfNeeded();
+
+    Update();
+
+    if ( m_skip && skip && !*skip )
+    {
+        *skip = true;
+        m_skip = false;
+        EnableSkip();
+    }
+
+    return m_state != Canceled;
+}
+
 void wxProgressDialog::Resume()
 {
     m_state = Continue;
@@ -579,10 +596,18 @@ static void SetTimeLabel(unsigned long val, wxStaticText *label)
     if ( label )
     {
         wxString s;
+
+        if (val != (unsigned long)-1)
+        {
         unsigned long hours = val / 3600;
         unsigned long minutes = (val % 3600) / 60;
         unsigned long seconds = val % 60;
         s.Printf(wxT("%lu:%02lu:%02lu"), hours, minutes, seconds);
+        }
+        else
+        {
+            s = _("Unknown");
+        }
 
         if ( s != label->GetLabel() )
             label->SetLabel(s);
@@ -637,4 +662,14 @@ void wxProgressDialog::EnableClose()
     }
 }
 
+void wxProgressDialog::UpdateMessage(const wxString &newmsg)
+{
+    if ( !newmsg.empty() && newmsg != m_msg->GetLabel() )
+    {
+        m_msg->SetLabel(newmsg);
+
+        wxYieldIfNeeded() ;
+    }
+}
+
 #endif // wxUSE_PROGRESSDLG