]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/progdlgg.cpp
reset the tooltip text before changing it, this apparently prevents a spurious redraw...
[wxWidgets.git] / src / generic / progdlgg.cpp
index d286409ab9b44e9c93ef7434631bc33893a52e86..224f40a593eff3943678d77b046625177adbd635 100644 (file)
     #include "wx/dcclient.h"
     #include "wx/timer.h"
     #include "wx/settings.h"
+    #include "wx/app.h"
 #endif
 
 #include "wx/progdlg.h"
+#include "wx/evtloop.h"
 
 // ---------------------------------------------------------------------------
 // macros
@@ -387,7 +389,7 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip)
         // so that we return true below and that out [Cancel] handler knew what
         // to do
         m_state = Finished;
-        if( !(GetWindowStyle() & wxPD_AUTO_HIDE) )
+        if( !HasFlag(wxPD_AUTO_HIDE) )
         {
             EnableClose();
             DisableSkip();
@@ -401,7 +403,13 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip)
                 m_msg->SetLabel(_("Done."));
             }
 
-            wxYieldIfNeeded() ;
+            wxCHECK_MSG(wxEventLoopBase::GetActive(), false,
+                        "wxProgressDialog::Update needs a running event loop");
+
+            // allow the window to repaint:
+            // NOTE: since we yield only for UI events with this call, there
+            //       should be no side-effects
+            wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI);
 
             (void)ShowModal();
         }
@@ -449,9 +457,14 @@ bool wxProgressDialog::Pulse(const wxString& newmsg, bool *skip)
 
 bool wxProgressDialog::DoAfterUpdate(bool *skip)
 {
+    wxCHECK_MSG(wxEventLoopBase::GetActive(), false,
+                "wxProgressDialog::DoAfterUpdate needs a running event loop");
+
     // 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();
+    // NOTE: using YieldFor() this call shouldn't give re-entrancy problems
+    //       for event handlers not interested to UI/user-input events.
+    wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI|wxEVT_CATEGORY_USER_INPUT);
 
     Update();
 
@@ -575,10 +588,10 @@ wxProgressDialog::~wxProgressDialog()
 
 void wxProgressDialog::ReenableOtherWindows()
 {
-    if ( GetWindowStyle() & wxPD_APP_MODAL )
+    if ( HasFlag(wxPD_APP_MODAL) )
     {
         delete m_winDisabler;
-        m_winDisabler = (wxWindowDisabler *)NULL;
+        m_winDisabler = NULL;
     }
     else
     {
@@ -599,10 +612,10 @@ static void SetTimeLabel(unsigned long val, wxStaticText *label)
 
         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);
+            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
         {
@@ -664,13 +677,19 @@ void wxProgressDialog::EnableClose()
 
 void wxProgressDialog::UpdateMessage(const wxString &newmsg)
 {
+    wxCHECK_RET(wxEventLoopBase::GetActive(),
+                "wxProgressDialog::UpdateMessage needs a running event loop");
+
     if ( !newmsg.empty() && newmsg != m_msg->GetLabel() )
     {
         m_msg->SetLabel(newmsg);
 
         Fit();   // adapt to the new label size
 
-        wxYieldIfNeeded() ;
+        // allow the window to repaint:
+        // NOTE: since we yield only for UI events with this call, there
+        //       should be no side-effects
+        wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI);
     }
 }