]> git.saurik.com Git - wxWidgets.git/blob - src/generic/progdlgg.cpp
cad525d1d3c106ab594e1165741b0276d4f34eb1
[wxWidgets.git] / src / generic / progdlgg.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: progdlgg.h
3 // Purpose: wxProgressDialog class
4 // Author: Karsten Ballüder
5 // Modified by:
6 // Created: 09.05.1999
7 // RCS-ID: $Id$
8 // Copyright: (c) Karsten Ballüder
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation "progdlgg.h"
14 #endif
15
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
18
19 #ifdef __BORLANDC__
20 #pragma hdrstop
21 #endif
22
23 #ifndef WX_PRECOMP
24 #include "wx/utils.h"
25 #include "wx/frame.h"
26 #include "wx/button.h"
27 #include "wx/stattext.h"
28 #include "wx/layout.h"
29 #include "wx/event.h"
30 #include "wx/gauge.h"
31 #include "wx/intl.h"
32 #include "wx/settings.h"
33 #include "wx/dcclient.h"
34 #endif
35
36 #if wxUSE_PROGRESSDLG
37
38 #include "wx/generic/progdlgg.h"
39
40 #define LAYOUT_X_MARGIN 8
41 #define LAYOUT_Y_MARGIN 8
42
43 // wxTextEntryDialog
44
45 #if !USE_SHARED_LIBRARY
46 BEGIN_EVENT_TABLE(wxProgressDialog, wxFrame)
47 EVT_BUTTON(-1, wxProgressDialog::OnCancel)
48 EVT_CLOSE(wxProgressDialog::OnClose)
49 END_EVENT_TABLE()
50
51 IMPLEMENT_CLASS(wxProgressDialog, wxFrame)
52 #endif
53
54 wxProgressDialog::wxProgressDialog(wxString const &title,
55 wxString const &message,
56 int maximum,
57 wxWindow *parent,
58 int style)
59 {
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;
64 m_parent = parent;
65 m_maximum = maximum;
66
67 m_elapsed = m_estimated = m_remaining = NULL;
68 if ((style & (wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME | wxPD_REMAINING_TIME)) != 0) m_time = new wxTime;
69 else m_time = NULL;
70
71 wxFrame::Create(m_parent, -1, title, wxDefaultPosition,
72 wxDefaultSize, wxDEFAULT_DIALOG_STYLE);
73 SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
74
75 wxLayoutConstraints *c;
76
77 wxClientDC dc(this);
78 dc.SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
79 long widthText;
80 dc.GetTextExtent(message, &widthText, NULL);
81
82 m_msg = new wxStaticText(this, -1, message);
83 c = new wxLayoutConstraints;
84 c->left.SameAs(this, wxLeft, 10);
85 c->top.SameAs(this, wxTop, 10);
86 c->width.AsIs();
87 c->height.AsIs();
88 m_msg->SetConstraints(c);
89 lastWindow = m_msg;
90
91 if ( maximum > 0 )
92 {
93 m_gauge = new wxGauge(this, -1, maximum,
94 wxDefaultPosition, wxDefaultSize,
95 wxGA_HORIZONTAL | wxRAISED_BORDER);
96 c = new wxLayoutConstraints;
97 c->left.SameAs(this, wxLeft, 2*LAYOUT_X_MARGIN);
98 c->top.Below(m_msg, 2*LAYOUT_Y_MARGIN);
99 c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN);
100 c->height.AsIs();
101 m_gauge->SetConstraints(c);
102 m_gauge->SetValue(0);
103 lastWindow = m_gauge;
104 }
105 else
106 m_gauge = (wxGauge *)NULL;
107
108
109 if ( style & wxPD_ELAPSED_TIME )
110 {
111 m_elapsed = new wxStaticText(this, -1, "");
112 c = new wxLayoutConstraints;
113 c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN);
114 c->top.Below(lastWindow, LAYOUT_Y_MARGIN);
115 c->width.Absolute(60);
116 c->height.AsIs();
117 m_elapsed->SetConstraints(c);
118
119 wxStaticText *dummy = new wxStaticText(this, -1, _T("Elapsed time : "));
120 c = new wxLayoutConstraints;
121 c->right.LeftOf(m_elapsed);
122 c->top.SameAs(m_elapsed, wxTop, 0);
123 c->width.AsIs();
124 c->height.AsIs();
125 dummy->SetConstraints(c);
126
127 lastWindow = m_elapsed;
128 }
129
130 if ( style & wxPD_ESTIMATED_TIME )
131 {
132 m_estimated = new wxStaticText(this, -1, "");
133 c = new wxLayoutConstraints;
134 c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN);
135 c->top.Below(lastWindow, 0);
136 c->width.Absolute(60);
137 c->height.AsIs();
138 m_estimated->SetConstraints(c);
139
140 wxStaticText *dummy = new wxStaticText(this, -1, _T("Estimated time : "));
141 c = new wxLayoutConstraints;
142 c->right.LeftOf(m_estimated);
143 c->top.SameAs(m_estimated, wxTop, 0);
144 c->width.AsIs();
145 c->height.AsIs();
146 dummy->SetConstraints(c);
147
148 lastWindow = m_estimated;
149 }
150
151 if ( style & wxPD_REMAINING_TIME )
152 {
153 m_remaining = new wxStaticText(this, -1, "");
154 c = new wxLayoutConstraints;
155 c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN);
156 c->top.Below(lastWindow, 0);
157 c->width.Absolute(60);
158 c->height.AsIs();
159 m_remaining->SetConstraints(c);
160
161 wxStaticText *dummy = new wxStaticText(this, -1, _T("Remaining time : "));
162 c = new wxLayoutConstraints;
163 c->right.LeftOf(m_remaining);
164 c->top.SameAs(m_remaining, wxTop, 0);
165 c->width.AsIs();
166 c->height.AsIs();
167 dummy->SetConstraints(c);
168
169 lastWindow = m_remaining;
170 }
171
172 if ( hasAbortButton )
173 {
174 m_btnAbort = new wxButton(this, -1, _("Cancel"));
175 c = new wxLayoutConstraints;
176 c->centreX.SameAs(this, wxCentreX);
177 c->top.Below(lastWindow, 2*LAYOUT_Y_MARGIN);
178 c->width.AsIs();
179 c->height.AsIs();
180 m_btnAbort->SetConstraints(c);
181 }
182 else
183 m_btnAbort = (wxButton *)NULL;
184
185 SetAutoLayout(TRUE);
186 Layout();
187
188 // calc the height of the dialog
189 Fit();
190 // and set the width from it - unfortunately, Fit() makes the dialog way too
191 // wide under Windows, so try to find a reasonable value for the width, not
192 // too big and not too small
193 wxSize size = GetClientSize();
194 size.x = wxMax(3*widthText/2, 2*size.y);
195 SetClientSize(size);
196
197 Show(TRUE);
198 Centre(wxCENTER_FRAME | wxBOTH);
199
200 if(m_disableParentOnly)
201 m_parent->Enable(FALSE);
202 else
203 wxEnableTopLevelWindows(FALSE);
204
205 Enable(TRUE); // enable this window
206 wxYield();
207 }
208
209
210 bool
211 wxProgressDialog::Update(int value, const wxString& newmsg)
212 {
213 wxASSERT_MSG( value == -1 || m_gauge, _T("can't update non existent dialog") );
214 wxASSERT_MSG( value < m_maximum, _T("invalid progress value") );
215
216
217 if( m_gauge )
218 m_gauge->SetValue(value + 1);
219
220 if( !newmsg.IsEmpty() )
221 m_msg->SetLabel(newmsg);
222
223 if ( (m_elapsed || m_remaining || m_estimated) && (value != 0) )
224 {
225 wxTime timenow;
226 wxTime diff = timenow - *m_time;
227 unsigned long secs = diff.GetSecond() + 60 * diff.GetMinute() + 60 * 60 * diff.GetHour();
228 unsigned long estim = secs * m_maximum / value;
229 unsigned long remai = estim - secs;
230 wxString s;
231
232 if (m_elapsed)
233 {
234 s.Printf("%i:%02i:%02i", diff.GetHour(), diff.GetMinute(), diff.GetSecond());
235 if (s != m_elapsed->GetLabel()) m_elapsed->SetLabel(s);
236 }
237 if (m_estimated)
238 {
239 s.Printf("%i:%02i:%02i", estim / (60 * 60), (estim / 60) % 60, estim % 60);
240 if (s != m_estimated->GetLabel()) m_estimated->SetLabel(s);
241 }
242 if (m_remaining)
243 {
244 s.Printf("%i:%02i:%02i", remai / (60 * 60), (remai / 60) % 60, remai % 60);
245 if (s != m_remaining->GetLabel()) m_remaining->SetLabel(s);
246 }
247 }
248
249 if ( (value == m_maximum - 1) && !(GetWindowStyleFlag() & wxPD_AUTO_HIDE) )
250 {
251 if ( m_btnAbort )
252 {
253 // tell the user what he should do...
254 m_btnAbort->SetLabel(_("Close"));
255 }
256
257 if ( !newmsg )
258 {
259 // also provide the finishing message if the application didn't
260 m_msg->SetLabel(_("Done."));
261 }
262
263 m_state = Finished;
264
265 // so that we return TRUE below
266 m_state = Finished;
267 }
268
269 return m_state != Canceled;
270 }
271
272 void wxProgressDialog::OnClose(wxCloseEvent& event)
273 {
274 if ( m_state == Uncancelable )
275 event.Veto(TRUE);
276 else
277 m_state = Canceled;
278 }
279
280
281 wxProgressDialog::~wxProgressDialog()
282 {
283 if ( m_disableParentOnly )
284 m_parent->Enable(TRUE);
285 else
286 wxEnableTopLevelWindows(TRUE);
287 if (m_time) delete m_time;
288 }
289
290 #endif