]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/progdlgg.cpp
Added samples.inc to DATAFILES in Makefile.in - is that enough?
[wxWidgets.git] / src / generic / progdlgg.cpp
index 34890e763ce17c70c987bc942ca7a9976f70470a..dd0765d2edd8e9433f6e015d8e0a23ec0732575e 100644 (file)
@@ -86,13 +86,18 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
                                    int style)
                 : wxDialog(parent, -1, title)
 {
+    m_windowStyle |= style;
+
     bool hasAbortButton = (style & wxPD_CAN_ABORT) != 0;
     m_state = hasAbortButton ? Continue : Uncancelable;
-    m_disableParentOnly = (style & wxPD_APP_MODAL) == 0;
-    m_AutoHide = (style & wxPD_AUTO_HIDE) != 0;
-    m_parent = parent;
     m_maximum = maximum;
 
+    m_parentTop = parent;
+    while ( m_parentTop && m_parentTop->GetParent() )
+    {
+        m_parentTop = m_parentTop->GetParent();
+    }
+
     wxLayoutConstraints *c;
 
     wxClientDC dc(this);
@@ -209,10 +214,10 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
 
     Centre(wxCENTER_FRAME | wxBOTH);
 
-    if ( m_disableParentOnly )
+    if ( !(style & wxPD_APP_MODAL) )
     {
-        if ( m_parent )
-            m_parent->Enable(FALSE);
+        if ( m_parentTop )
+            m_parentTop->Enable(FALSE);
     }
     else
     {
@@ -266,60 +271,69 @@ wxStaticText *wxProgressDialog::CreateLabel(const wxString& text,
 bool
 wxProgressDialog::Update(int value, const wxString& newmsg)
 {
-   wxASSERT_MSG( value == -1 || m_gauge, wxT("cannot update non existent dialog") );
-   wxASSERT_MSG( value <= m_maximum, wxT("invalid progress value") );
-
-
-   if( m_gauge )
-      m_gauge->SetValue(value + 1);
-
-   if( !newmsg.IsEmpty() )
-      m_msg->SetLabel(newmsg);
-
-   if ( (m_elapsed || m_remaining || m_estimated) && (value != 0) )
-   {
-      unsigned long elapsed = wxGetCurrentTime() - m_timeStart;
-      unsigned long estimated = elapsed * m_maximum / value;
-      unsigned long remaining = estimated - elapsed;
-
-      SetTimeLabel(elapsed, m_elapsed);
-      SetTimeLabel(estimated, m_estimated);
-      SetTimeLabel(remaining, m_remaining);
-   }
-
-   if ( (value == m_maximum ) && !m_AutoHide )
-   {
-       if ( m_btnAbort )
-       {
-           // tell the user what he should do...
-           m_btnAbort->SetLabel(_("Close"));
-       }
-
-       if ( !newmsg )
-       {
-           // also provide the finishing message if the application didn't
-           m_msg->SetLabel(_("Done."));
-       }
-
-       // so that we return TRUE below and that out [Cancel] handler knew what
-       // to do
-       m_state = Finished;
-
-       wxYield();
-
-       (void)ShowModal();
-   }
-   else
-   {
-       // update the display
-       wxYield();
-   }
+    wxASSERT_MSG( value == -1 || m_gauge, wxT("cannot update non existent dialog") );
+    wxASSERT_MSG( value <= m_maximum, wxT("invalid progress value") );
+
+    if ( m_gauge )
+        m_gauge->SetValue(value + 1);
+
+    if ( !newmsg.IsEmpty() )
+    {
+#ifdef __WXMSW__
+        // this seems to be necessary or garbage is left when the new label is
+        // longer than the old one
+        m_msg->SetLabel(wxEmptyString);
+#endif // MSW
+
+        m_msg->SetLabel(newmsg);
+
+        wxYield();
+    }
+
+    if ( (m_elapsed || m_remaining || m_estimated) && (value != 0) )
+    {
+        unsigned long elapsed = wxGetCurrentTime() - m_timeStart;
+        unsigned long estimated = elapsed * m_maximum / value;
+        unsigned long remaining = estimated - elapsed;
+
+        SetTimeLabel(elapsed, m_elapsed);
+        SetTimeLabel(estimated, m_estimated);
+        SetTimeLabel(remaining, m_remaining);
+    }
+
+    if ( (value == m_maximum ) && !(GetWindowStyle() & wxPD_AUTO_HIDE) )
+    {
+        if ( m_btnAbort )
+        {
+            // tell the user what he should do...
+            m_btnAbort->SetLabel(_("Close"));
+        }
+
+        if ( !newmsg )
+        {
+            // also provide the finishing message if the application didn't
+            m_msg->SetLabel(_("Done."));
+        }
+
+        // so that we return TRUE below and that out [Cancel] handler knew what
+        // to do
+        m_state = Finished;
+
+        wxYield();
+
+        (void)ShowModal();
+    }
+    else
+    {
+        // update the display
+        wxYield();
+    }
 
 #ifdef __WXMAC__
     MacUpdateImmediately();
 #endif
 
-   return m_state != Canceled;
+    return m_state != Canceled;
 }
 
 // ----------------------------------------------------------------------------
@@ -349,9 +363,20 @@ void wxProgressDialog::OnCancel(wxCommandEvent& event)
 void wxProgressDialog::OnClose(wxCloseEvent& event)
 {
     if ( m_state == Uncancelable )
+    {
+        // can't close this dialog
         event.Veto(TRUE);
+    }
+    else if ( m_state == Finished )
+    {
+        // let the default handler close the window as we already terminated
+        event.Skip();
+    }
     else
+    {
+        // next Update() will notice it
         m_state = Canceled;
+    }
 }
 
 // ----------------------------------------------------------------------------
@@ -360,10 +385,10 @@ void wxProgressDialog::OnClose(wxCloseEvent& event)
 
 wxProgressDialog::~wxProgressDialog()
 {
-    if ( m_disableParentOnly )
+    if ( !(GetWindowStyle() & wxPD_APP_MODAL) )
     {
-        if ( m_parent )
-            m_parent->Enable(TRUE);
+        if ( m_parentTop )
+            m_parentTop->Enable(TRUE);
     }
     else
     {