%% options copyright owner = Dirk Krause copyright year = 2011-2013 license = bsd %% wx-gui type = dialog contents = sDialog # status bar = 1 dkwx_pd_def_texts[0] # title = ((title) ? title : dkwx_pd_def_texts[1]) [wxBoxSizer sDialog] direction = horizontal contents = $space(10) contents = verticalSizer contents = $space(10) [wxBoxSizer verticalSizer] direction = vertical grow = yes proportion = 1 contents = $space(10) contents = sttFilename left contents = $space(10) contents = gaugeProgress centered-x contents = $space(10) contents = sttWait left contents = $space(10) contents = bCancel centered-x contents = $space(10) [wxStaticText sttFilename] text = ((firstFileName) ? firstFileName : dkwx_pd_def_texts[0]) text style = centered grow = yes proportion = 1 [wxGauge gaugeProgress] range = 1000 value = 0 grow = yes [wxButton bCancel] text = ((buttonText) ? buttonText : dkwx_pd_def_texts[2]) tip = ((buttonTip) ? buttonTip : dkwx_pd_def_texts[3]) id = wxID_CANCEL [wxStaticText sttWait] text = ((waitText) ? waitText : dkwx_pd_def_texts[4]) text style = left no-auto-resize %% header start #include %% class start /** Progress dialog showing currently process file, progress bar and a button to abort operation. */ class DkWxProgressDialog : public wxDialog { private: /** Event table. */ DECLARE_EVENT_TABLE() protected: /** Communicator object delivering the file name and progress bar value. */ DkWxCommunicator *pComm; /** String: Cancel operation scheduled. Please wait. */ wxChar const *sWaitPlease; /** Parent frame. */ DkWxFrame *pParent; /** Log text field to receive the messages. */ wxTextCtrl *pLogTextField; %% class end public: /** Constructor. @param parent Parent window. @param comm Communicator object. @param tc Text control to show messages. @param title Title text. @param firstFileName First file name to show. @param buttonText Text for "Cancel" button. @param buttonTip Tooltip text for button. @param waitText Button to show while waiting for thread exit. */ DkWxProgressDialog( DkWxFrame *parent, DkWxCommunicator *comm, wxTextCtrl *tc, wxChar const *title, wxChar const *firstFileName, wxChar const *buttonText, wxChar const *buttonTip, wxChar const *waitText ); /** Handler for idle events. We request the current file name and progress bar from the communicator object and update the information shown in the dialog. */ void OnIdle(wxIdleEvent & event); /** Handler for cancel button. */ void OnCancel(wxCommandEvent & WXUNUSED(event)); /** Choose a modal position centered on the parent. */ void chooseModalPosition(); }; %% header end %% module start #include "dkwxtrace.h" $!trace-include BEGIN_EVENT_TABLE(DkWxProgressDialog,wxDialog) EVT_IDLE(DkWxProgressDialog::OnIdle) EVT_BUTTON(wxID_CANCEL, DkWxProgressDialog::OnCancel) END_EVENT_TABLE() /** Default texts to use if the constructor has NULL pointer arguments. */ wxChar const * const dkwx_pd_def_texts[] = { $!string-table macro=wxT # # 0: Empty string # # # 1: Default title. # Progress # # 2: Button text. # Cancel # # 3: Button tool tip. # Push button to interrupt processing. # # 4: Notification, user should wait. # Cancel command scheduled... Wait, please! $!end }; %% constructor start DkWxProgressDialog::DkWxProgressDialog( DkWxFrame *parent, DkWxCommunicator *comm, wxTextCtrl *tc, wxChar const *title, wxChar const *firstFileName, wxChar const *buttonText, wxChar const *buttonTip, wxChar const *waitText ) : wxDialog( parent, wxID_ANY, ((title) ? title : dkwx_pd_def_texts[1]), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE ) { $? "+ DkWxProgressDialog::DkWxProgressDialog" pParent = parent; pLogTextField = tc; pComm = comm; sWaitPlease = ((waitText) ? waitText : dkwx_pd_def_texts[4]); %% constructor end if(dkctGUILayoutOK) { if(sttWait) { sttWait->SetLabel(dkwx_pd_def_texts[0]); } } $? "- DkWxProgressDialog::DkWxProgressDialog" } %% module end void DkWxProgressDialog::OnIdle(wxIdleEvent & event) { int canContinue = 1; int res; $? "+ DkWxProgressDialog::OnIdle" if(pComm) { $? ". pComm ok" res = pComm->getUpdates(this, sttFilename, gaugeProgress); $? ". res = %d", res if(res & DK_WX_COMMUNICATOR_STATUS_UPDATE) { $? ". must update" Refresh(); Update(); } else { $? ". no update" } if(res & DK_WX_COMMUNICATOR_STATUS_RUNNING) { $? ". can continue" canContinue = 1; } else { $? ". finished, end indicated" canContinue = 0; } } else { $? "! no pComm" canContinue = 0; } if(canContinue) { $? ". can continue" event.RequestMore(); } else { $? ". finished" canContinue = 1; if(pComm) { canContinue = pComm->getCanContinue(); if(pLogTextField) { $? ". transfer text" pComm->getText(pLogTextField); if(pParent) { $? ". refresh win" pParent->Refresh(); } else { $? ". refresh text" pLogTextField->Refresh(); } } } if(IsModal()) { $? ". end modal" EndModal((canContinue) ? wxID_OK : wxID_CANCEL); } else { $? ". show false" SetReturnCode((canContinue) ? wxID_OK : wxID_CANCEL); Show(false); } } event.Skip(); $? "- DkWxProgressDialog::OnIdle" } void DkWxProgressDialog::OnCancel(wxCommandEvent & event) { $? "+ DkWxProgressDialog::OnCancel" if(pComm) { pComm->setCanContinue(0); } if(sttWait) { sttWait->SetLabel(sWaitPlease); } if(bCancel) { bCancel->Enable(false); bCancel->SetToolTip(sWaitPlease); } Refresh(); Update(); $? "- DkWxProgressDialog::OnCancel" } void DkWxProgressDialog::chooseModalPosition() { int px = 0; /* Parent x position. */ int py = 0; /* Parent y position. */ int pw = 0; /* Parent width. */ int ph = 0; /* Parent height. */ int x = 0; /* X position. */ int y = 0; /* Y position. */ int w = 0; /* Width. */ int h = 0; /* Height. */ $? "+ DkWxProgressDialog::chooseModalPosition" /* Sceen size */ wxSize scsz = wxGetDisplaySize(); pParent->GetPosition(&px, &py); pParent->GetSize(&pw, &ph); GetSize(&w, &h); x = px + (pw - w) / 2; y = py + (ph - h) / 2; if((x + w) > scsz.x) { x = scsz.x - w; } if((y + h) > scsz.y) { y = scsz.y - h; } if(x < 0) { x = 0; } if(y < 0) { y = 0; } SetSize(x, y, w, h); $? "- DkWxProgressDialog::chooseModalPosition" }