]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/progdlgg.cpp
Layout fixes due to measuring with the wrong font. Also added
[wxWidgets.git] / src / generic / progdlgg.cpp
index d59ecc17983f7375f33e17f7d2df71096088df0d..e6cfc0231c7204e21d2a2283c27867d8de238ab7 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     09.05.1999
 // RCS-ID:      $Id$
 // Copyright:   (c) Karsten Ballüder
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
@@ -17,7 +17,7 @@
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "progdlgg.h"
 #endif
 
@@ -85,7 +85,7 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
                                    int maximum,
                                    wxWindow *parent,
                                    int style)
-                : wxDialog(parent, -1, title)
+                : wxDialog(parent, wxID_ANY, title)
 {
     // we may disappear at any moment, let the others know about it
     SetExtraStyle(GetExtraStyle() | wxWS_EX_TRANSIENT);
@@ -101,7 +101,7 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
     // FIXME: should probably have a (extended?) window style for this
     if ( !hasAbortButton )
     {
-        EnableCloseButton(FALSE);
+        EnableCloseButton(false);
     }
 #endif // wxMSW
 
@@ -115,11 +115,7 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
     m_maximum /= m_factor;
 #endif // __WXMSW__
 
-    m_parentTop = parent;
-    while ( m_parentTop && m_parentTop->GetParent() )
-    {
-        m_parentTop = m_parentTop->GetParent();
-    }
+    m_parentTop = wxGetTopLevelParent(parent);
 
     wxLayoutConstraints *c;
 
@@ -128,7 +124,7 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
     long widthText;
     dc.GetTextExtent(message, &widthText, NULL, NULL, NULL, NULL);
 
-    m_msg = new wxStaticText(this, -1, message);
+    m_msg = new wxStaticText(this, wxID_ANY, message);
     c = new wxLayoutConstraints;
     c->left.SameAs(this, wxLeft, 2*LAYOUT_X_MARGIN);
     c->top.SameAs(this, wxTop, 2*LAYOUT_Y_MARGIN);
@@ -144,10 +140,10 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
 
     if ( maximum > 0 )
     {
-        // note that we can't use wxGA_SMOOTH because it happens to also mean
-        // wxDIALOG_MODAL and will cause the dialog to be modal. Have an extra
+        // note that we can't use wxGA_SMOOTH because it happens to
+        // cause the dialog to be modal. Have an extra
         // style argument to wxProgressDialog, perhaps.
-        m_gauge = new wxGauge(this, -1, m_maximum,
+        m_gauge = new wxGauge(this, wxID_ANY, m_maximum,
                               wxDefaultPosition, wxDefaultSize,
                               wxGA_HORIZONTAL);
 
@@ -231,7 +227,7 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
         m_btnAbort = (wxButton *)NULL;
     }
 
-    SetAutoLayout(TRUE);
+    SetAutoLayout(true);
     Layout();
 
     sizeDlg.y += 2*LAYOUT_Y_MARGIN;
@@ -251,12 +247,12 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
     else
     {
         if ( m_parentTop )
-            m_parentTop->Enable(FALSE);
+            m_parentTop->Disable();
         m_winDisabler = NULL;
     }
 
-    Show(TRUE);
-    Enable(TRUE); // enable this window
+    Show();
+    Enable();
 
     // this one can be initialized even if the others are unknown for now
     //
@@ -266,13 +262,7 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
         SetTimeLabel(0, m_elapsed);
     }
 
-    // Update the display (especially on X, GTK)
-    wxYield();
-    wxYield();
-
-#ifdef __WXMAC__
-    MacUpdateImmediately();
-#endif
+    Update();
 }
 
 wxStaticText *wxProgressDialog::CreateLabel(const wxString& text,
@@ -280,12 +270,12 @@ wxStaticText *wxProgressDialog::CreateLabel(const wxString& text,
 {
     wxLayoutConstraints *c;
 
-    wxStaticText *label = new wxStaticText(this, -1, _("unknown"));
+    wxStaticText *label = new wxStaticText(this, wxID_ANY, _("unknown"));
     c = new wxLayoutConstraints;
 
     // VZ: I like the labels be centered - if the others don't mind, you may
     //     remove "#ifdef __WXMSW__" and use it for all ports
-#if defined(__WXMSW__) || defined(__WXPM__)
+#if defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMAC__)
     c->left.SameAs(this, wxCentreX, LAYOUT_X_MARGIN);
 #else // !MSW
     c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN);
@@ -295,7 +285,7 @@ wxStaticText *wxProgressDialog::CreateLabel(const wxString& text,
     c->height.AsIs();
     label->SetConstraints(c);
 
-    wxStaticText *dummy = new wxStaticText(this, -1, text);
+    wxStaticText *dummy = new wxStaticText(this, wxID_ANY, text);
     c = new wxLayoutConstraints;
     c->right.LeftOf(label);
     c->top.SameAs(label, wxTop, 0);
@@ -323,23 +313,24 @@ wxProgressDialog::Update(int value, const wxString& newmsg)
 
     wxASSERT_MSG( value <= m_maximum, wxT("invalid progress value") );
 
-    if ( m_gauge )
+    // 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 + 1);
+        m_gauge->SetValue(value == m_maximum ? value : value + 1);
     }
 
     if ( !newmsg.IsEmpty() )
     {
         m_msg->SetLabel(newmsg);
 
-        wxYield();
-        wxYield();
+        wxYieldIfNeeded() ;
     }
 
     if ( (m_elapsed || m_remaining || m_estimated) && (value != 0) )
     {
         unsigned long elapsed = wxGetCurrentTime() - m_timeStart;
-        unsigned long estimated = elapsed * m_maximum / value;
+        unsigned long estimated = (unsigned long)(( (double) elapsed * m_maximum ) / ((double)value)) ;
         unsigned long remaining = estimated - elapsed;
 
         SetTimeLabel(elapsed, m_elapsed);
@@ -347,9 +338,9 @@ wxProgressDialog::Update(int value, const wxString& newmsg)
         SetTimeLabel(remaining, m_remaining);
     }
 
-    if ( (value == m_maximum ) )
+    if ( value == m_maximum )
     {
-        // so that we return TRUE below and that out [Cancel] handler knew what
+        // so that we return true below and that out [Cancel] handler knew what
         // to do
         m_state = Finished;
         if( !(GetWindowStyle() & wxPD_AUTO_HIDE) )
@@ -360,9 +351,9 @@ wxProgressDialog::Update(int value, const wxString& newmsg)
                 m_btnAbort->SetLabel(_("Close"));
             }
 #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
-            else // enable the close button to give the user a way to close the dlg
+            else // enable the button to give the user a way to close the dlg
             {
-                EnableCloseButton(TRUE);
+                EnableCloseButton();
             }
 #endif // __WXMSW__
 
@@ -372,27 +363,29 @@ wxProgressDialog::Update(int value, const wxString& newmsg)
                 m_msg->SetLabel(_("Done."));
             }
 
-            wxYield();
-            wxYield();
+            wxYieldIfNeeded() ;
 
             (void)ShowModal();
         }
-        else
+        else // auto hide
         {
-            Hide();
+            // reenable other windows before hiding this one because otherwise
+            // Windows wouldn't give the focus back to the window which had
+            // been previously focused because it would still be disabled
             ReenableOtherWindows();
+
+            Hide();
         }
     }
     else
     {
-        // update the display
-        wxYield();
-        wxYield();
+        // we have to yield because not only we want to update the display but
+        // also to process the clicks on the cancel button
+        wxYieldIfNeeded() ;
     }
 
-#ifdef __WXMAC__
-    MacUpdateImmediately();
-#endif
+    // update the display in case yielding above didn't do it
+    Update();
 
     return m_state != Canceled;
 }
@@ -406,6 +399,17 @@ void wxProgressDialog::Resume()
     m_btnAbort->Enable();
 }
 
+bool wxProgressDialog::Show( bool show )
+{
+    // reenable other windows before hiding this one because otherwise
+    // Windows wouldn't give the focus back to the window which had
+    // been previously focused because it would still be disabled
+    if(!show)
+        ReenableOtherWindows();
+
+    return wxDialog::Show(show);
+}
+
 // ----------------------------------------------------------------------------
 // event handlers
 // ----------------------------------------------------------------------------
@@ -435,7 +439,7 @@ void wxProgressDialog::OnClose(wxCloseEvent& event)
     if ( m_state == Uncancelable )
     {
         // can't close this dialog
-        event.Veto(TRUE);
+        event.Veto();
     }
     else if ( m_state == Finished )
     {
@@ -469,7 +473,7 @@ void wxProgressDialog::ReenableOtherWindows()
     else
     {
         if ( m_parentTop )
-            m_parentTop->Enable(TRUE);
+            m_parentTop->Enable();
     }
 }