-/////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////
// Name: progdlgg.h
// Purpose: wxProgressDialog class
// Author: Karsten Ballüder
// Created: 09.05.1999
// RCS-ID: $Id$
// Copyright: (c) Karsten Ballüder
-// Licence: wxWindows license
-/////////////////////////////////////////////////////////////////////////////
+// Licence: wxWindows license
+////////////////////////////////////////////////////
#ifndef __PROGDLGH_G__
#define __PROGDLGH_G__
#if wxUSE_PROGRESSDLG
-#include "wx/frame.h"
-#include "wx/time.h"
+#include "wx/dialog.h"
-/** Progress dialog which shows a moving progress bar.
+class WXDLLEXPORT wxButton;
+class WXDLLEXPORT wxStaticText;
+
+/* Progress dialog which shows a moving progress bar.
Taken from the Mahogany project.*/
-class WXDLLEXPORT wxProgressDialog : public wxFrame
+class WXDLLEXPORT wxProgressDialog : public wxDialog
{
DECLARE_DYNAMIC_CLASS(wxProgressDialog)
public:
- /** Creates and displays dialog, disables event handling for other
+ /* Creates and displays dialog, disables event handling for other
frames or parent frame to avoid recursion problems.
@param title title for window
@param message message to display in window
@param style is the bit mask of wxPD_XXX constants from wx/defs.h
*/
wxProgressDialog(const wxString &title, wxString const &message,
- int maximum = 100,
- wxWindow *parent = NULL,
- int style = wxPD_APP_MODAL | wxPD_AUTO_HIDE);
- /** Destructor.
+ int maximum = 100,
+ wxWindow *parent = NULL,
+ int style = wxPD_APP_MODAL | wxPD_AUTO_HIDE);
+ /* Destructor.
Re-enables event handling for other windows.
*/
~wxProgressDialog();
- /** Update the status bar to the new value.
+ /* Update the status bar to the new value.
@param value new value
@param newmsg if used, new message to display
@returns true if ABORT button has not been pressed
*/
bool Update(int value = -1, const wxString& newmsg = _T(""));
- /** Can be called to continue after the cancel button has been pressed, but
+ /* Can be called to continue after the cancel button has been pressed, but
the program decided to continue the operation (e.g., user didn't
confirm it)
*/
void Resume() { m_state = Continue; }
- /// Callback for optional abort button
- void OnCancel(wxCommandEvent& WXUNUSED(event)) { m_state = Canceled; }
-
- /// callback to disable "hard" window closing
+ // implementation from now on
+ // callback for optional abort button
+ void OnCancel(wxCommandEvent& event);
+ // callback to disable "hard" window closing
void OnClose(wxCloseEvent& event);
private:
- /// the status bar
+ // create the label with given text and another one to show the time nearby
+ // under the lastWindow and modify it to be the same as the control created
+ // (which is returned)
+ wxStaticText *CreateLabel(const wxString& text, wxWindow **lastWindow);
+
+ // the status bar
class wxGauge *m_gauge;
- /// the message displayed
+ // the message displayed
class wxStaticText *m_msg;
- /// disable all or parent window only
+ // disable all or parent window only
bool m_disableParentOnly;
- /// displayed elapsed, estimated, remaining time
- class wxStaticText *m_elapsed, *m_estimated, *m_remaining;
- /// time when the dialog was created or NULL
- class wxTime *m_time;
- /// parent window
- class wxWindow *m_parent;
- /// continue processing or not (return value for Update())
+ // displayed elapsed, estimated, remaining time
+ class wxStaticText *m_elapsed,
+ *m_estimated,
+ *m_remaining;
+ // time when the dialog was created
+ unsigned long m_timeStart;
+ // parent window
+ wxWindow *m_parent;
+ // continue processing or not (return value for Update())
enum
{
Uncancelable = -1, // dialog can't be canceled
Continue, // can be cancelled but wasn't
Finished // finished, waiting to be removed from screen
} m_state;
- /// the abort button (or NULL if none)
- class wxButton *m_btnAbort;
- /// the maximum value
+ // the abort button (or NULL if none)
+ wxButton *m_btnAbort;
+ // the maximum value
int m_maximum;
DECLARE_EVENT_TABLE()
class WXDLLEXPORT wxBitmapButton: public wxButton
{
- DECLARE_DYNAMIC_CLASS(wxBitmapButton)
- public:
- inline wxBitmapButton(void) { m_marginX = wxDEFAULT_BUTTON_MARGIN; m_marginY = wxDEFAULT_BUTTON_MARGIN; }
- inline wxBitmapButton(wxWindow *parent, wxWindowID id, const wxBitmap& bitmap,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize, long style = wxBU_AUTODRAW,
- const wxValidator& validator = wxDefaultValidator,
- const wxString& name = wxButtonNameStr)
- {
- Create(parent, id, bitmap, pos, size, style, validator, name);
- }
-
- bool Create(wxWindow *parent, wxWindowID id, const wxBitmap& bitmap,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize, long style = wxBU_AUTODRAW,
- const wxValidator& validator = wxDefaultValidator,
- const wxString& name = wxButtonNameStr);
-
- virtual void SetLabel(const wxBitmap& bitmap)
- {
- SetBitmapLabel(bitmap);
- }
-
- virtual void SetBitmapLabel(const wxBitmap& bitmap);
+ DECLARE_DYNAMIC_CLASS(wxBitmapButton)
+
+public:
+ wxBitmapButton() { m_marginX = wxDEFAULT_BUTTON_MARGIN; m_marginY = wxDEFAULT_BUTTON_MARGIN; }
+ wxBitmapButton(wxWindow *parent, wxWindowID id, const wxBitmap& bitmap,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize, long style = wxBU_AUTODRAW,
+ const wxValidator& validator = wxDefaultValidator,
+ const wxString& name = wxButtonNameStr)
+ {
+ Create(parent, id, bitmap, pos, size, style, validator, name);
+ }
+
+ bool Create(wxWindow *parent, wxWindowID id, const wxBitmap& bitmap,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize, long style = wxBU_AUTODRAW,
+ const wxValidator& validator = wxDefaultValidator,
+ const wxString& name = wxButtonNameStr);
+
+ virtual void SetLabel(const wxBitmap& bitmap)
+ {
+ SetBitmapLabel(bitmap);
+ }
+
+ virtual void SetBitmapLabel(const wxBitmap& bitmap);
#if WXWIN_COMPATIBILITY
- inline wxBitmap *GetBitmap(void) const { return (wxBitmap *) & m_buttonBitmap; }
+ wxBitmap *GetBitmap() const { return (wxBitmap *) & m_buttonBitmap; }
#endif
- inline wxBitmap& GetBitmapLabel(void) const { return (wxBitmap&) m_buttonBitmap; }
- inline wxBitmap& GetBitmapSelected(void) const { return (wxBitmap&) m_buttonBitmapSelected; }
- inline wxBitmap& GetBitmapFocus(void) const { return (wxBitmap&) m_buttonBitmapFocus; }
- inline wxBitmap& GetBitmapDisabled(void) const { return (wxBitmap&) m_buttonBitmapDisabled; }
-
- inline void SetBitmapSelected(const wxBitmap& sel) { m_buttonBitmapSelected = sel; };
- inline void SetBitmapFocus(const wxBitmap& focus) { m_buttonBitmapFocus = focus; };
- inline void SetBitmapDisabled(const wxBitmap& disabled) { m_buttonBitmapDisabled = disabled; };
-
- inline void SetMargins(int x, int y) { m_marginX = x; m_marginY = y; }
- inline int GetMarginX(void) { return m_marginX; }
- inline int GetMarginY(void) { return m_marginY; }
-
- // Implementation
- virtual bool MSWOnDraw(WXDRAWITEMSTRUCT *item);
- virtual void DrawFace( WXHDC dc, int left, int top, int right, int bottom, bool sel );
- virtual void DrawButtonFocus( WXHDC dc, int left, int top, int right, int bottom, bool sel );
- virtual void DrawButtonDisable( WXHDC dc, int left, int top, int right, int bottom, bool with_marg );
-
- protected:
- wxBitmap m_buttonBitmap;
- wxBitmap m_buttonBitmapSelected;
- wxBitmap m_buttonBitmapFocus;
- wxBitmap m_buttonBitmapDisabled;
- int m_marginX;
- int m_marginY;
+ wxBitmap& GetBitmapLabel() const { return (wxBitmap&) m_buttonBitmap; }
+ wxBitmap& GetBitmapSelected() const { return (wxBitmap&) m_buttonBitmapSelected; }
+ wxBitmap& GetBitmapFocus() const { return (wxBitmap&) m_buttonBitmapFocus; }
+ wxBitmap& GetBitmapDisabled() const { return (wxBitmap&) m_buttonBitmapDisabled; }
+
+ void SetBitmapSelected(const wxBitmap& sel) { m_buttonBitmapSelected = sel; };
+ void SetBitmapFocus(const wxBitmap& focus) { m_buttonBitmapFocus = focus; };
+ void SetBitmapDisabled(const wxBitmap& disabled) { m_buttonBitmapDisabled = disabled; };
+
+ void SetMargins(int x, int y) { m_marginX = x; m_marginY = y; }
+ int GetMarginX() const { return m_marginX; }
+ int GetMarginY() const { return m_marginY; }
+
+ // Implementation
+ virtual void SetDefault();
+ virtual bool MSWOnDraw(WXDRAWITEMSTRUCT *item);
+ virtual void DrawFace( WXHDC dc, int left, int top, int right, int bottom, bool sel );
+ virtual void DrawButtonFocus( WXHDC dc, int left, int top, int right, int bottom, bool sel );
+ virtual void DrawButtonDisable( WXHDC dc, int left, int top, int right, int bottom, bool with_marg );
+
+protected:
+ wxBitmap m_buttonBitmap;
+ wxBitmap m_buttonBitmapSelected;
+ wxBitmap m_buttonBitmapFocus;
+ wxBitmap m_buttonBitmapDisabled;
+ int m_marginX;
+ int m_marginY;
};
#endif
const wxString& name = "wxSpinButton");
- // Attributes
- ////////////////////////////////////////////////////////////////////////////
-
+ // accessors
virtual int GetValue() const;
virtual void SetValue(int val);
virtual void SetRange(int minVal, int maxVal);
- // IMPLEMENTATION
+ // implementation
virtual bool MSWCommand(WXUINT param, WXWORD id);
+ virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
virtual bool MSWOnScroll(int orientation, WXWORD wParam,
WXWORD pos, WXHWND control);
};
// the wxSpinButton event
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxSpinEvent : public wxScrollEvent
+class WXDLLEXPORT wxSpinEvent : public wxNotifyEvent
{
DECLARE_DYNAMIC_CLASS(wxSpinEvent)
public:
wxSpinEvent(wxEventType commandType = wxEVT_NULL, int id = 0)
- : wxScrollEvent(commandType, id)
+ : wxNotifyEvent(commandType, id)
{
}
+
+ // get the current value of the control
+ int GetPosition() const { return m_commandInt; }
+ void SetPosition(int pos) { m_commandInt = pos; }
};
typedef void (wxEvtHandler::*wxSpinEventFunction)(wxSpinEvent&);
// macros for handling spin events
-#define EVT_SPIN_UP(id, func) { wxEVT_SCROLL_LINEUP, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxSpinEventFunction) & func }
-#define EVT_SPIN_DOWN(id, func) { wxEVT_SCROLL_LINEDOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxSpinEventFunction) & func }
-
-#define EVT_SPIN(id, func) \
- { wxEVT_SCROLL_TOP, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxSpinEventFunction) & func },\
- { wxEVT_SCROLL_BOTTOM, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxSpinEventFunction) & func },\
- { wxEVT_SCROLL_LINEUP, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxSpinEventFunction) & func },\
- { wxEVT_SCROLL_LINEDOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxSpinEventFunction) & func },\
- { wxEVT_SCROLL_PAGEUP, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxSpinEventFunction) & func },\
- { wxEVT_SCROLL_PAGEDOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxSpinEventFunction) & func },\
- { wxEVT_SCROLL_THUMBTRACK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxSpinEventFunction) & func },
+#define EVT_SPIN_UP(id, func) { wxEVT_SCROLL_LINEUP, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxSpinEventFunction) & func },
+#define EVT_SPIN_DOWN(id, func) { wxEVT_SCROLL_LINEDOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxSpinEventFunction) & func },
+
+#define EVT_SPIN(id, func) { wxEVT_SCROLL_THUMBTRACK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxSpinEventFunction) & func },
#endif // wxUSE_SPINBTN
wxBitmap wxImage::ConvertToBitmap() const
{
+ if ( !Ok() )
+ return wxNullBitmap;
+
// sizeLimit is the MS upper limit for the DIB size
int sizeLimit = 1024*768*3;
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
#ifdef __GNUG__
-#pragma implementation "progdlgg.h"
+ #pragma implementation "progdlgg.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#pragma hdrstop
#endif
+#if wxUSE_PROGRESSDLG
+
#ifndef WX_PRECOMP
#include "wx/utils.h"
#include "wx/frame.h"
#include "wx/dcclient.h"
#endif
-#if wxUSE_PROGRESSDLG
-
#include "wx/generic/progdlgg.h"
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
#define LAYOUT_X_MARGIN 8
#define LAYOUT_Y_MARGIN 8
-// wxTextEntryDialog
+// ----------------------------------------------------------------------------
+// private functions
+// ----------------------------------------------------------------------------
+
+// update the label to show the given time (in seconds)
+static void SetTimeLabel(unsigned long val, wxStaticText *label);
+
+// ----------------------------------------------------------------------------
+// event tables
+// ----------------------------------------------------------------------------
#if !USE_SHARED_LIBRARY
- BEGIN_EVENT_TABLE(wxProgressDialog, wxFrame)
- EVT_BUTTON(-1, wxProgressDialog::OnCancel)
+ BEGIN_EVENT_TABLE(wxProgressDialog, wxDialog)
+ EVT_BUTTON(wxID_CANCEL, wxProgressDialog::OnCancel)
EVT_CLOSE(wxProgressDialog::OnClose)
END_EVENT_TABLE()
- IMPLEMENT_CLASS(wxProgressDialog, wxFrame)
+ IMPLEMENT_CLASS(wxProgressDialog, wxDialog)
#endif
-wxProgressDialog::wxProgressDialog(wxString const &title,
- wxString const &message,
- int maximum,
- wxWindow *parent,
- int style)
-{
- wxWindow *lastWindow = NULL;
- bool hasAbortButton = (style & wxPD_CAN_ABORT) != 0;
- m_state = hasAbortButton ? Continue : Uncancelable;
- m_disableParentOnly = (style & wxPD_APP_MODAL) == 0;
- m_parent = parent;
- m_maximum = maximum;
-
- m_elapsed = m_estimated = m_remaining = NULL;
- if ((style & (wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
- wxPD_REMAINING_TIME)) != 0)
- m_time = new wxTime;
- else
- m_time = NULL;
-
- wxFrame::Create(m_parent, -1, title, wxDefaultPosition,
- wxDefaultSize, wxDEFAULT_DIALOG_STYLE);
- SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
-
- wxLayoutConstraints *c;
-
- wxClientDC dc(this);
- dc.SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
- long widthText;
- dc.GetTextExtent(message, &widthText, NULL);
-
- m_msg = new wxStaticText(this, -1, message);
- c = new wxLayoutConstraints;
- c->left.SameAs(this, wxLeft, 2*LAYOUT_X_MARGIN);
- c->top.SameAs(this, wxTop, 2*LAYOUT_Y_MARGIN);
- c->width.AsIs();
- c->height.AsIs();
- m_msg->SetConstraints(c);
- lastWindow = m_msg;
-
- if ( maximum > 0 )
- {
- m_gauge = new wxGauge(this, -1, maximum,
- wxDefaultPosition, wxDefaultSize,
- wxGA_HORIZONTAL | wxRAISED_BORDER);
- c = new wxLayoutConstraints;
- c->left.SameAs(this, wxLeft, 2*LAYOUT_X_MARGIN);
- c->top.Below(m_msg, 2*LAYOUT_Y_MARGIN);
- c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN);
- c->height.AsIs();
- m_gauge->SetConstraints(c);
- m_gauge->SetValue(0);
- lastWindow = m_gauge;
- }
- else
- m_gauge = (wxGauge *)NULL;
-
-
- if ( style & wxPD_ELAPSED_TIME )
- {
- m_elapsed = new wxStaticText(this, -1, "");
- c = new wxLayoutConstraints;
- c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN);
- c->top.Below(lastWindow, LAYOUT_Y_MARGIN);
- c->width.Absolute(60);
- c->height.AsIs();
- m_elapsed->SetConstraints(c);
-
- wxStaticText *dummy = new wxStaticText(this, -1, _T("Elapsed time : "));
- c = new wxLayoutConstraints;
- c->right.LeftOf(m_elapsed);
- c->top.SameAs(m_elapsed, wxTop, 0);
- c->width.AsIs();
- c->height.AsIs();
- dummy->SetConstraints(c);
-
- lastWindow = m_elapsed;
- }
-
- if ( style & wxPD_ESTIMATED_TIME )
- {
- m_estimated = new wxStaticText(this, -1, "");
- c = new wxLayoutConstraints;
- c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN);
- c->top.Below(lastWindow, 0);
- c->width.Absolute(60);
- c->height.AsIs();
- m_estimated->SetConstraints(c);
-
- wxStaticText *dummy = new wxStaticText(this, -1, _T("Estimated time : "));
- c = new wxLayoutConstraints;
- c->right.LeftOf(m_estimated);
- c->top.SameAs(m_estimated, wxTop, 0);
- c->width.AsIs();
- c->height.AsIs();
- dummy->SetConstraints(c);
-
- lastWindow = m_estimated;
- }
-
- if ( style & wxPD_REMAINING_TIME )
- {
- m_remaining = new wxStaticText(this, -1, "");
- c = new wxLayoutConstraints;
- c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN);
- c->top.Below(lastWindow, 0);
- c->width.Absolute(60);
- c->height.AsIs();
- m_remaining->SetConstraints(c);
-
- wxStaticText *dummy = new wxStaticText(this, -1, _T("Remaining time : "));
- c = new wxLayoutConstraints;
- c->right.LeftOf(m_remaining);
- c->top.SameAs(m_remaining, wxTop, 0);
- c->width.AsIs();
- c->height.AsIs();
- dummy->SetConstraints(c);
-
- lastWindow = m_remaining;
- }
-
- if ( hasAbortButton )
- {
- m_btnAbort = new wxButton(this, -1, _("Cancel"));
- c = new wxLayoutConstraints;
- c->centreX.SameAs(this, wxCentreX);
- c->top.Below(lastWindow, 2*LAYOUT_Y_MARGIN);
- c->width.AsIs();
- c->height.AsIs();
- m_btnAbort->SetConstraints(c);
- }
- else
- m_btnAbort = (wxButton *)NULL;
-
- SetAutoLayout(TRUE);
- Layout();
-
- // calc the height of the dialog
- Fit();
- // and set the width from it - unfortunately, Fit() makes the dialog way too
- // wide under Windows, so try to find a reasonable value for the width, not
- // too big and not too small
- wxSize size = GetClientSize();
- size.x = wxMax(3*widthText/2, 2*size.y);
- SetClientSize(size);
-
- Show(TRUE);
- Centre(wxCENTER_FRAME | wxBOTH);
+// ============================================================================
+// implementation
+// ============================================================================
- if(m_disableParentOnly)
- {
- if(m_parent) m_parent->Enable(FALSE);
- }
- else
- wxEnableTopLevelWindows(FALSE);
+// ----------------------------------------------------------------------------
+// wxProgressDialog
+// ----------------------------------------------------------------------------
- Enable(TRUE); // enable this window
- wxYield();
+wxProgressDialog::wxProgressDialog(wxString const &title,
+ wxString const &message,
+ int maximum,
+ wxWindow *parent,
+ int style)
+ : wxDialog(m_parent, -1, title)
+{
+ bool hasAbortButton = (style & wxPD_CAN_ABORT) != 0;
+ m_state = hasAbortButton ? Continue : Uncancelable;
+ m_disableParentOnly = (style & wxPD_APP_MODAL) == 0;
+ m_parent = parent;
+ m_maximum = maximum;
+
+ wxLayoutConstraints *c;
+
+ wxClientDC dc(this);
+ dc.SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
+ long widthText;
+ dc.GetTextExtent(message, &widthText, NULL);
+
+ m_msg = new wxStaticText(this, -1, message);
+ c = new wxLayoutConstraints;
+ c->left.SameAs(this, wxLeft, 2*LAYOUT_X_MARGIN);
+ c->top.SameAs(this, wxTop, 2*LAYOUT_Y_MARGIN);
+ c->width.AsIs();
+ c->height.AsIs();
+ m_msg->SetConstraints(c);
+
+ wxSize sizeDlg, sizeLabel = m_msg->GetSize();
+ sizeDlg.y = 2*LAYOUT_Y_MARGIN + sizeLabel.y;
+
+ wxWindow *lastWindow = m_msg;
+
+ if ( maximum > 0 )
+ {
+ m_gauge = new wxGauge(this, -1, maximum,
+ wxDefaultPosition, wxDefaultSize,
+ wxGA_HORIZONTAL | wxRAISED_BORDER);
+ c = new wxLayoutConstraints;
+ c->left.SameAs(this, wxLeft, 2*LAYOUT_X_MARGIN);
+ c->top.Below(m_msg, 2*LAYOUT_Y_MARGIN);
+ c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN);
+ c->height.AsIs();
+ m_gauge->SetConstraints(c);
+ m_gauge->SetValue(0);
+ lastWindow = m_gauge;
+
+ wxSize sizeGauge = m_gauge->GetSize();
+ sizeDlg.y += 2*LAYOUT_Y_MARGIN + sizeGauge.y;
+ }
+ else
+ m_gauge = (wxGauge *)NULL;
+
+ // create the estimated/remaining/total time zones if requested
+ m_elapsed = m_estimated = m_remaining = NULL;
+
+ int nTimeLabels = 0;
+ if ( style & wxPD_ELAPSED_TIME )
+ {
+ nTimeLabels++;
+
+ m_elapsed = CreateLabel(_T("Elapsed time : "), &lastWindow);
+ }
+
+ if ( style & wxPD_ESTIMATED_TIME )
+ {
+ nTimeLabels++;
+
+ m_estimated = CreateLabel(_T("Estimated time : "), &lastWindow);
+ }
+
+ if ( style & wxPD_REMAINING_TIME )
+ {
+ nTimeLabels++;
+
+ m_remaining = CreateLabel(_T("Remaining time : "), &lastWindow);
+ }
+
+ if ( nTimeLabels > 0 )
+ {
+ // set it to the current time
+ m_timeStart = wxGetCurrentTime();
+
+ sizeDlg.y += nTimeLabels * (sizeLabel.y + LAYOUT_Y_MARGIN);
+ }
+
+ if ( hasAbortButton )
+ {
+ m_btnAbort = new wxButton(this, wxID_CANCEL, _("Cancel"));
+ c = new wxLayoutConstraints;
+
+ // Windows dialogs usually have buttons in the lower right corner
+#ifdef __WXMSW__
+ c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN);
+#else // !MSW
+ c->centreX.SameAs(this, wxCentreX);
+#endif // MSW/!MSW
+ c->bottom.SameAs(this, wxBottom, 2*LAYOUT_Y_MARGIN);
+
+ wxSize sizeBtn = wxButton::GetDefaultSize();
+ c->width.Absolute(sizeBtn.x);
+ c->height.Absolute(sizeBtn.y);
+
+ m_btnAbort->SetConstraints(c);
+
+ sizeDlg.y += 2*LAYOUT_Y_MARGIN + sizeBtn.y;
+ }
+ else
+ m_btnAbort = (wxButton *)NULL;
+
+ SetAutoLayout(TRUE);
+ Layout();
+
+ sizeDlg.y += 2*LAYOUT_Y_MARGIN;
+
+ // try to make the dialog not square but rectangular of reasonabel width
+ sizeDlg.x = wxMax(widthText, 4*sizeDlg.y/3);
+ sizeDlg.x *= 3;
+ sizeDlg.x /= 2;
+ SetClientSize(sizeDlg);
+
+ Centre(wxCENTER_FRAME | wxBOTH);
+
+ if (m_disableParentOnly )
+ {
+ if ( m_parent )
+ m_parent->Enable(FALSE);
+ }
+ else
+ {
+ wxEnableTopLevelWindows(FALSE);
+ }
+
+ Show(TRUE);
+ Enable(TRUE); // enable this window
}
+wxStaticText *wxProgressDialog::CreateLabel(const wxString& text,
+ wxWindow **lastWindow)
+{
+ wxLayoutConstraints *c;
+
+ wxStaticText *label = new wxStaticText(this, -1, _T("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
+#ifdef __WXMSW__
+ 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;
+}
bool
wxProgressDialog::Update(int value, const wxString& newmsg)
if ( (m_elapsed || m_remaining || m_estimated) && (value != 0) )
{
- wxTime timenow;
- wxTime diff = timenow - *m_time;
- unsigned long secs = diff.GetSecond() + 60 * diff.GetMinute() + 60 * 60 * diff.GetHour();
- unsigned long estim = secs * m_maximum / value;
- unsigned long remai = estim - secs;
- wxString s;
-
- if (m_elapsed)
- {
- s.Printf(_T("%i:%02i:%02i"), diff.GetHour(), diff.GetMinute(), diff.GetSecond());
- if (s != m_elapsed->GetLabel()) m_elapsed->SetLabel(s);
- }
- if (m_estimated)
- {
- s.Printf(_T("%i:%02i:%02i"), estim / (60 * 60), (estim / 60) % 60, estim % 60);
- if (s != m_estimated->GetLabel()) m_estimated->SetLabel(s);
- }
- if (m_remaining)
- {
- s.Printf(_T("%i:%02i:%02i"), remai / (60 * 60), (remai / 60) % 60, remai % 60);
- if (s != m_remaining->GetLabel()) m_remaining->SetLabel(s);
- }
+ unsigned long elapsed = wxGetCurrentTime() - m_timeStart;
+ unsigned long estimated = elapsed * m_maximum / value;
+ unsigned long remaining = estimated - elapsed;
+
+ SetTimeLabel(elapsed, m_elapsed);
+ SetTimeLabel(estimated, m_estimated);
+ SetTimeLabel(remaining, m_remaining);
}
if ( (value == m_maximum - 1) && !(GetWindowStyleFlag() & wxPD_AUTO_HIDE) )
m_btnAbort->SetLabel(_("Close"));
}
-/*I think the default should be the other way round. If the
- application wants to set a "Done." message at the end, it should
- supply it. Any serious objections to this change? Makes the
- application programmers' work a little easier.
- if ( !newmsg )
+ if ( !newmsg )
{
// also provide the finishing message if the application didn't
m_msg->SetLabel(_("Done."));
}
-*/
- m_state = Finished;
- // so that we return TRUE below
+ // so that we return TRUE below and that out [Cancel] handler knew what
+ // to do
m_state = Finished;
+
+ wxYield();
+
+ (void)ShowModal();
+ }
+ else
+ {
+ // update the display
+ wxYield();
}
- wxYield();
+
return m_state != Canceled;
}
+// ----------------------------------------------------------------------------
+// event handlers
+// ----------------------------------------------------------------------------
+
+void wxProgressDialog::OnCancel(wxCommandEvent& event)
+{
+ if ( m_state == Finished )
+ {
+ // this means that the count down is already finished and we're being
+ // shown as a modal dialog - so just let the default handler do the job
+ event.Skip();
+ }
+ else
+ {
+ // request to cancel was received, the next time Update() is called we
+ // will handle it
+ m_state = Canceled;
+ }
+}
+
void wxProgressDialog::OnClose(wxCloseEvent& event)
{
- if ( m_state == Uncancelable )
- event.Veto(TRUE);
- else
- m_state = Canceled;
+ if ( m_state == Uncancelable )
+ event.Veto(TRUE);
+ else
+ m_state = Canceled;
}
+// ----------------------------------------------------------------------------
+// destruction
+// ----------------------------------------------------------------------------
wxProgressDialog::~wxProgressDialog()
{
- if ( m_disableParentOnly )
- {
- if(m_parent) m_parent->Enable(TRUE);
- }
- else
- wxEnableTopLevelWindows(TRUE);
- if (m_time) delete m_time;
+ if ( m_disableParentOnly )
+ {
+ if ( m_parent )
+ m_parent->Enable(TRUE);
+ }
+ else
+ {
+ wxEnableTopLevelWindows(TRUE);
+ }
}
-#endif
+// ----------------------------------------------------------------------------
+// private functions
+// ----------------------------------------------------------------------------
+
+static void SetTimeLabel(unsigned long val, wxStaticText *label)
+{
+ if ( label )
+ {
+ wxString s;
+ unsigned long hours = val / 3600;
+ unsigned long minutes = (val % 3600) / 60;
+ unsigned long seconds = val % 60;
+ s.Printf(_T("%lu:%02lu:%02lu"), hours, minutes, seconds);
+
+ if ( s != label->GetLabel() )
+ label->SetLabel(s);
+ }
+}
+
+#endif // wxUSE_PROGRESSDLG
wxSpinEvent event( command, win->GetId());
event.SetPosition( value );
- event.SetOrientation( wxVERTICAL );
event.SetEventObject( win );
win->GetEventHandler()->ProcessEvent( event );
wxSpinEvent event( command, win->GetId());
event.SetPosition( value );
- event.SetOrientation( wxVERTICAL );
event.SetEventObject( win );
win->GetEventHandler()->ProcessEvent( event );
::SelectObject( (HDC) dc, old ) ;
}
+void wxBitmapButton::SetDefault()
+{
+ wxButton::SetDefault();
+}
SendMessage(GetWinHwnd(parent), DM_SETDEFID, m_windowId, 0L);
}
- if ( btnOldDefault )
+ // this doesn't work with bitmap buttons because it also removes the
+ // "ownerdrawn" style...
+ if ( btnOldDefault && !wxDynamicCast(btnOldDefault, wxBitmapButton) )
{
// remove the BS_DEFPUSHBUTTON style from the other button
long style = GetWindowLong(GetHwndOf(btnOldDefault), GWL_STYLE);
rect.bottom -= pt.y;
rect.right -= pt.x;
- *x = rect.right;
- *y = rect.bottom;
+ if ( x )
+ *x = rect.right;
+ if ( y )
+ *y = rect.bottom;
}
// Set the client size (i.e. leave the calculation of borders etc.
if (style & wxCAPTION)
msflags |= WS_CAPTION;
- // Adding WS_CLIPCHILDREN causes children not to be properly
- // drawn when first displaying them.
-// if (style & wxCLIP_CHILDREN)
-// msflags |= WS_CLIPCHILDREN;
+ if (style & wxCLIP_CHILDREN)
+ msflags |= WS_CLIPCHILDREN;
wxWindow::MSWCreate(m_windowId, parent, wxMDIFrameClassName, this, title, x, y, width, height,
msflags);
break;
case WM_SIZE:
- // we will leave this message to the base class version, but we
- // must pass it to DefFrameProc() too
- MSWDefWindowProc(message, wParam, lParam);
+ // as we don't (usually) resize the MDI client to exactly fit the
+ // client area (we put it below the toolbar, above statusbar &c),
+ // we should not pass this one to DefFrameProc
break;
}
int wxSpinButton::GetValue() const
{
- return LOWORD(::SendMessage(GetHwnd(), UDM_GETPOS, 0, 0));
+ return (short)LOWORD(::SendMessage(GetHwnd(), UDM_GETPOS, 0, 0));
}
void wxSpinButton::SetValue(int val)
bool wxSpinButton::MSWOnScroll(int orientation, WXWORD wParam,
WXWORD pos, WXHWND control)
{
- if ( !control )
- return FALSE;
-
- wxSpinEvent event(wxEVT_NULL, m_windowId);
- event.SetPosition(pos);
- event.SetOrientation(orientation);
- event.SetEventObject(this);
+ wxCHECK_MSG( control, FALSE, _T("scrolling what?") )
- switch ( wParam )
+ if ( wParam != SB_THUMBPOSITION )
{
- case SB_TOP:
- event.m_eventType = wxEVT_SCROLL_TOP;
- break;
-
- case SB_BOTTOM:
- event.m_eventType = wxEVT_SCROLL_BOTTOM;
- break;
+ // probable SB_ENDSCROLL - we don't react to it
+ return FALSE;
+ }
- case SB_LINEUP:
- event.m_eventType = wxEVT_SCROLL_LINEUP;
- break;
+ wxSpinEvent event(wxEVT_SCROLL_THUMBTRACK, m_windowId);
+ event.SetPosition((short)pos); // cast is important for negative values!
+ event.SetEventObject(this);
- case SB_LINEDOWN:
- event.m_eventType = wxEVT_SCROLL_LINEDOWN;
- break;
+ return GetEventHandler()->ProcessEvent(event);
+}
- case SB_PAGEUP:
- event.m_eventType = wxEVT_SCROLL_PAGEUP;
- break;
+bool wxSpinButton::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
+{
+ LPNMUPDOWN lpnmud = (LPNMUPDOWN)lParam;
- case SB_PAGEDOWN:
- event.m_eventType = wxEVT_SCROLL_PAGEDOWN;
- break;
+ wxSpinEvent event(lpnmud->iDelta > 0 ? wxEVT_SCROLL_LINEUP
+ : wxEVT_SCROLL_LINEDOWN,
+ m_windowId);
+ event.SetPosition(lpnmud->iPos + lpnmud->iDelta);
+ event.SetEventObject(this);
- case SB_THUMBTRACK:
- case SB_THUMBPOSITION:
- event.m_eventType = wxEVT_SCROLL_THUMBTRACK;
- break;
+ bool processed = GetEventHandler()->ProcessEvent(event);
- default:
- return FALSE;
- }
+ *result = event.IsAllowed() ? 0 : 1;
- return GetEventHandler()->ProcessEvent(event);
+ return processed;
}
bool wxSpinButton::MSWCommand(WXUINT cmd, WXWORD id)
// We may be faking the client origin. So a window that's really at (0,
// 30) may appear (to wxWin apps) to be at (0, 0).
- if ( parent )
- {
- wxPoint pt(parent->GetClientAreaOrigin());
- point.x -= pt.x;
- point.y -= pt.y;
- }
+ wxPoint pt(parent->GetClientAreaOrigin());
+ point.x -= pt.x;
+ point.y -= pt.y;
}
if ( x )
ReleaseDC(hWnd, dc);
- if ( x ) *x = sizeRect.cx;
- if ( y ) *y = sizeRect.cy;
- if ( descent ) *descent = tm.tmDescent;
- if ( externalLeading ) *externalLeading = tm.tmExternalLeading;
+ if ( x )
+ *x = sizeRect.cx;
+ if ( y )
+ *y = sizeRect.cy;
+ if ( descent )
+ *descent = tm.tmDescent;
+ if ( externalLeading )
+ *externalLeading = tm.tmExternalLeading;
}
#if wxUSE_CARET && WXWIN_COMPATIBILITY
SelectObject(dc,was);
}
ReleaseDC((HWND)wnd, dc);
- *x = tm.tmAveCharWidth;
- *y = tm.tmHeight + tm.tmExternalLeading;
+
+ if ( x )
+ *x = tm.tmAveCharWidth;
+ if ( y )
+ *y = tm.tmHeight + tm.tmExternalLeading;
// if ( the_font )
// the_font->ReleaseResource();