- c->left.SameAs(this, wxCentreX, LAYOUT_X_MARGIN);
-#else // !MSW
- c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN);
-#endif // MSW/!MSW
- c->top.Below(*lastWindow, LAYOUT_Y_MARGIN);
- c->width.AsIs();
- c->height.AsIs();
- label->SetConstraints(c);
-
- wxStaticText *dummy = new wxStaticText(this, -1, text);
- c = new wxLayoutConstraints;
- c->right.LeftOf(label);
- c->top.SameAs(label, wxTop, 0);
- c->width.AsIs();
- c->height.AsIs();
- dummy->SetConstraints(c);
-
- *lastWindow = label;
-
- return label;
+ value /= m_factor;
+#endif // __WXMSW__
+
+ wxASSERT_MSG( value <= m_maximum, wxT("invalid progress value") );
+
+ if ( m_gauge )
+ m_gauge->SetValue(value);
+
+ UpdateMessage(newmsg);
+
+ if ( (m_elapsed || m_remaining || m_estimated) && (value != 0) )
+ {
+ unsigned long elapsed = wxGetCurrentTime() - m_timeStart;
+ if ( m_last_timeupdate < elapsed
+ || value == m_maximum
+ )
+ {
+ m_last_timeupdate = elapsed;
+ unsigned long estimated = m_break +
+ (unsigned long)(( (double) (elapsed-m_break) * m_maximum ) / ((double)value)) ;
+ if ( estimated > m_display_estimated
+ && m_ctdelay >= 0
+ )
+ {
+ ++m_ctdelay;
+ }
+ else if ( estimated < m_display_estimated
+ && m_ctdelay <= 0
+ )
+ {
+ --m_ctdelay;
+ }
+ else
+ {
+ m_ctdelay = 0;
+ }
+ if ( m_ctdelay >= m_delay // enough confirmations for a higher value
+ || m_ctdelay <= (m_delay*-1) // enough confirmations for a lower value
+ || value == m_maximum // to stay consistent
+ || elapsed > m_display_estimated // to stay consistent
+ || ( elapsed > 0 && elapsed < 4 ) // additional updates in the beginning
+ )
+ {
+ m_display_estimated = estimated;
+ m_ctdelay = 0;
+ }
+ }
+
+ long display_remaining = m_display_estimated - elapsed;
+ if ( display_remaining < 0 )
+ {
+ display_remaining = 0;
+ }
+
+ SetTimeLabel(elapsed, m_elapsed);
+ SetTimeLabel(m_display_estimated, m_estimated);
+ SetTimeLabel(display_remaining, m_remaining);
+ }
+
+ if ( value == m_maximum )
+ {
+ if ( m_state == Finished )
+ {
+ // ignore multiple calls to Update(m_maximum): it may sometimes be
+ // troublesome to ensure that Update() is not called twice with the
+ // same value (e.g. because of the rounding errors) and if we don't
+ // return now we're going to generate asserts below
+ return true;
+ }
+
+ // so that we return true below and that out [Cancel] handler knew what
+ // to do
+ m_state = Finished;
+ if( !HasFlag(wxPD_AUTO_HIDE) )
+ {
+ EnableClose();
+ DisableSkip();
+#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
+ EnableCloseButton();
+#endif // __WXMSW__
+
+ if ( newmsg.empty() )
+ {
+ // also provide the finishing message if the application didn't
+ m_msg->SetLabel(_("Done."));
+ }
+
+ wxYieldIfNeeded();
+
+ (void)ShowModal();
+ }
+ else // auto 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 // not at maximum yet
+ {
+ return DoAfterUpdate(skip);
+ }
+
+ // update the display in case yielding above didn't do it
+ Update();
+
+ return m_state != Canceled;