]>
git.saurik.com Git - wxWidgets.git/blob - src/generic/progdlgg.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxProgressDialog class
4 // Author: Karsten Ballüder
8 // Copyright: (c) Karsten Ballüder
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "progdlgg.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
26 #include "wx/button.h"
27 #include "wx/stattext.h"
28 #include "wx/layout.h"
32 #include "wx/settings.h"
33 #include "wx/dcclient.h"
38 #include "wx/generic/progdlgg.h"
40 #define LAYOUT_X_MARGIN 8
41 #define LAYOUT_Y_MARGIN 8
45 #if !USE_SHARED_LIBRARY
46 BEGIN_EVENT_TABLE(wxProgressDialog
, wxFrame
)
47 EVT_BUTTON(-1, wxProgressDialog::OnCancel
)
48 EVT_CLOSE(wxProgressDialog::OnClose
)
51 IMPLEMENT_CLASS(wxProgressDialog
, wxFrame
)
54 wxProgressDialog::wxProgressDialog(wxString
const &title
,
55 wxString
const &message
,
60 wxWindow
*lastWindow
= NULL
;
61 bool hasAbortButton
= (style
& wxPD_CAN_ABORT
) != 0;
62 m_state
= hasAbortButton
? Continue
: Uncancelable
;
63 m_disableParentOnly
= (style
& wxPD_APP_MODAL
) == 0;
67 m_elapsed
= m_estimated
= m_remaining
= NULL
;
68 if ((style
& (wxPD_ELAPSED_TIME
| wxPD_ESTIMATED_TIME
|
69 wxPD_REMAINING_TIME
)) != 0)
74 wxFrame::Create(m_parent
, -1, title
, wxDefaultPosition
,
75 wxDefaultSize
, wxDEFAULT_DIALOG_STYLE
);
76 SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE
));
78 wxLayoutConstraints
*c
;
81 dc
.SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT
));
83 dc
.GetTextExtent(message
, &widthText
, NULL
);
85 m_msg
= new wxStaticText(this, -1, message
);
86 c
= new wxLayoutConstraints
;
87 c
->left
.SameAs(this, wxLeft
, 2*LAYOUT_X_MARGIN
);
88 c
->top
.SameAs(this, wxTop
, 2*LAYOUT_Y_MARGIN
);
91 m_msg
->SetConstraints(c
);
96 m_gauge
= new wxGauge(this, -1, maximum
,
97 wxDefaultPosition
, wxDefaultSize
,
98 wxGA_HORIZONTAL
| wxRAISED_BORDER
);
99 c
= new wxLayoutConstraints
;
100 c
->left
.SameAs(this, wxLeft
, 2*LAYOUT_X_MARGIN
);
101 c
->top
.Below(m_msg
, 2*LAYOUT_Y_MARGIN
);
102 c
->right
.SameAs(this, wxRight
, 2*LAYOUT_X_MARGIN
);
104 m_gauge
->SetConstraints(c
);
105 m_gauge
->SetValue(0);
106 lastWindow
= m_gauge
;
109 m_gauge
= (wxGauge
*)NULL
;
112 if ( style
& wxPD_ELAPSED_TIME
)
114 m_elapsed
= new wxStaticText(this, -1, "");
115 c
= new wxLayoutConstraints
;
116 c
->right
.SameAs(this, wxRight
, 2*LAYOUT_X_MARGIN
);
117 c
->top
.Below(lastWindow
, LAYOUT_Y_MARGIN
);
118 c
->width
.Absolute(60);
120 m_elapsed
->SetConstraints(c
);
122 wxStaticText
*dummy
= new wxStaticText(this, -1, _T("Elapsed time : "));
123 c
= new wxLayoutConstraints
;
124 c
->right
.LeftOf(m_elapsed
);
125 c
->top
.SameAs(m_elapsed
, wxTop
, 0);
128 dummy
->SetConstraints(c
);
130 lastWindow
= m_elapsed
;
133 if ( style
& wxPD_ESTIMATED_TIME
)
135 m_estimated
= new wxStaticText(this, -1, "");
136 c
= new wxLayoutConstraints
;
137 c
->right
.SameAs(this, wxRight
, 2*LAYOUT_X_MARGIN
);
138 c
->top
.Below(lastWindow
, 0);
139 c
->width
.Absolute(60);
141 m_estimated
->SetConstraints(c
);
143 wxStaticText
*dummy
= new wxStaticText(this, -1, _T("Estimated time : "));
144 c
= new wxLayoutConstraints
;
145 c
->right
.LeftOf(m_estimated
);
146 c
->top
.SameAs(m_estimated
, wxTop
, 0);
149 dummy
->SetConstraints(c
);
151 lastWindow
= m_estimated
;
154 if ( style
& wxPD_REMAINING_TIME
)
156 m_remaining
= new wxStaticText(this, -1, "");
157 c
= new wxLayoutConstraints
;
158 c
->right
.SameAs(this, wxRight
, 2*LAYOUT_X_MARGIN
);
159 c
->top
.Below(lastWindow
, 0);
160 c
->width
.Absolute(60);
162 m_remaining
->SetConstraints(c
);
164 wxStaticText
*dummy
= new wxStaticText(this, -1, _T("Remaining time : "));
165 c
= new wxLayoutConstraints
;
166 c
->right
.LeftOf(m_remaining
);
167 c
->top
.SameAs(m_remaining
, wxTop
, 0);
170 dummy
->SetConstraints(c
);
172 lastWindow
= m_remaining
;
175 if ( hasAbortButton
)
177 m_btnAbort
= new wxButton(this, -1, _("Cancel"));
178 c
= new wxLayoutConstraints
;
179 c
->centreX
.SameAs(this, wxCentreX
);
180 c
->top
.Below(lastWindow
, 2*LAYOUT_Y_MARGIN
);
183 m_btnAbort
->SetConstraints(c
);
186 m_btnAbort
= (wxButton
*)NULL
;
191 // calc the height of the dialog
193 // and set the width from it - unfortunately, Fit() makes the dialog way too
194 // wide under Windows, so try to find a reasonable value for the width, not
195 // too big and not too small
196 wxSize size
= GetClientSize();
197 size
.x
= wxMax(3*widthText
/2, 2*size
.y
);
201 Centre(wxCENTER_FRAME
| wxBOTH
);
203 if(m_disableParentOnly
)
205 if(m_parent
) m_parent
->Enable(FALSE
);
208 wxEnableTopLevelWindows(FALSE
);
210 Enable(TRUE
); // enable this window
216 wxProgressDialog::Update(int value
, const wxString
& newmsg
)
218 wxASSERT_MSG( value
== -1 || m_gauge
, _T("cannot update non existent dialog") );
219 wxASSERT_MSG( value
<= m_maximum
, _T("invalid progress value") );
223 m_gauge
->SetValue(value
+ 1);
225 if( !newmsg
.IsEmpty() )
226 m_msg
->SetLabel(newmsg
);
228 if ( (m_elapsed
|| m_remaining
|| m_estimated
) && (value
!= 0) )
231 wxTime diff
= timenow
- *m_time
;
232 unsigned long secs
= diff
.GetSecond() + 60 * diff
.GetMinute() + 60 * 60 * diff
.GetHour();
233 unsigned long estim
= secs
* m_maximum
/ value
;
234 unsigned long remai
= estim
- secs
;
239 s
.Printf(_T("%i:%02i:%02i"), diff
.GetHour(), diff
.GetMinute(), diff
.GetSecond());
240 if (s
!= m_elapsed
->GetLabel()) m_elapsed
->SetLabel(s
);
244 s
.Printf(_T("%i:%02i:%02i"), estim
/ (60 * 60), (estim
/ 60) % 60, estim
% 60);
245 if (s
!= m_estimated
->GetLabel()) m_estimated
->SetLabel(s
);
249 s
.Printf(_T("%i:%02i:%02i"), remai
/ (60 * 60), (remai
/ 60) % 60, remai
% 60);
250 if (s
!= m_remaining
->GetLabel()) m_remaining
->SetLabel(s
);
254 if ( (value
== m_maximum
- 1) && !(GetWindowStyleFlag() & wxPD_AUTO_HIDE
) )
258 // tell the user what he should do...
259 m_btnAbort
->SetLabel(_("Close"));
262 /*I think the default should be the other way round. If the
263 application wants to set a "Done." message at the end, it should
264 supply it. Any serious objections to this change? Makes the
265 application programmers' work a little easier.
268 // also provide the finishing message if the application didn't
269 m_msg->SetLabel(_("Done."));
274 // so that we return TRUE below
278 return m_state
!= Canceled
;
281 void wxProgressDialog::OnClose(wxCloseEvent
& event
)
283 if ( m_state
== Uncancelable
)
290 wxProgressDialog::~wxProgressDialog()
292 if ( m_disableParentOnly
)
294 if(m_parent
) m_parent
->Enable(TRUE
);
297 wxEnableTopLevelWindows(TRUE
);
298 if (m_time
) delete m_time
;