X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cbc66a27047635e86fbba08043da831666d74f4a..8f974c520a8733158591891458fda10fae4c3950:/src/generic/progdlgg.cpp diff --git a/src/generic/progdlgg.cpp b/src/generic/progdlgg.cpp index 90436f9340..4fc3c97542 100644 --- a/src/generic/progdlgg.cpp +++ b/src/generic/progdlgg.cpp @@ -65,8 +65,11 @@ static void SetTimeLabel(unsigned long val, wxStaticText *label); // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(wxProgressDialog, wxDialog) - EVT_BUTTON(wxID_CANCEL, wxProgressDialog::OnCancel) - EVT_CLOSE(wxProgressDialog::OnClose) + EVT_BUTTON(wxID_CANCEL, wxProgressDialog::OnCancel) + + EVT_SHOW(wxProgressDialog::OnShow) + + EVT_CLOSE(wxProgressDialog::OnClose) END_EVENT_TABLE() IMPLEMENT_CLASS(wxProgressDialog, wxDialog) @@ -89,6 +92,18 @@ wxProgressDialog::wxProgressDialog(wxString const &title, m_windowStyle |= style; bool hasAbortButton = (style & wxPD_CAN_ABORT) != 0; + +#ifdef __WXMSW__ + // we have to remove the "Close" button from the title bar then as it is + // confusing to have it - it doesn't work anyhow + // + // FIXME: should probably have a (extended?) window style for this + if ( !hasAbortButton ) + { + EnableCloseButton(FALSE); + } +#endif // wxMSW + m_state = hasAbortButton ? Continue : Uncancelable; m_maximum = maximum; @@ -120,13 +135,13 @@ 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 + // style argument to wxProgressDialog, perhaps. m_gauge = new wxGauge(this, -1, maximum, - wxDefaultPosition, wxDefaultSize, - wxGA_HORIZONTAL | wxRAISED_BORDER); -// Sorry, but wxGA_SMOOTH happens to also mean wxDIALOG_MODAL and will -// cause the dialog to be modal. Have an extra style argument to wxProgressDialog, -// perhaps. -// wxGA_HORIZONTAL | wxRAISED_BORDER | (style & wxGA_SMOOTH)); + wxDefaultPosition, wxDefaultSize, + wxGA_HORIZONTAL); + c = new wxLayoutConstraints; c->left.SameAs(this, wxLeft, 2*LAYOUT_X_MARGIN); c->top.Below(m_msg, 2*LAYOUT_Y_MARGIN); @@ -225,6 +240,14 @@ wxProgressDialog::wxProgressDialog(wxString const &title, Show(TRUE); Enable(TRUE); // enable this window + // this one can be initialized even if the others are unknown for now + // + // NB: do it after calling Layout() to keep the labels correctly aligned + if ( m_elapsed ) + { + SetTimeLabel(0, m_elapsed); + } + // Update the display (especially on X, GTK) wxYield(); @@ -306,6 +329,12 @@ wxProgressDialog::Update(int value, const wxString& newmsg) // tell the user what he should do... m_btnAbort->SetLabel(_("Close")); } +#ifdef __WXMSW__ + else // enable the close button to give the user a way to close the dlg + { + EnableCloseButton(TRUE); + } +#endif // __WXMSW__ if ( !newmsg ) { @@ -377,15 +406,32 @@ void wxProgressDialog::OnClose(wxCloseEvent& event) } } +void wxProgressDialog::OnShow(wxShowEvent& event) +{ + // if the dialog is being hidden, it was closed, so reenable other windows + // now + if ( event.GetShow() ) + { + ReenableOtherWindows(); + } +} + // ---------------------------------------------------------------------------- // destruction // ---------------------------------------------------------------------------- wxProgressDialog::~wxProgressDialog() +{ + // normally this should have been already done, but just in case + ReenableOtherWindows(); +} + +void wxProgressDialog::ReenableOtherWindows() { if ( GetWindowStyle() & wxPD_APP_MODAL ) { delete m_winDisabler; + m_winDisabler = (wxWindowDisabler *)NULL; } else {