summaryrefslogtreecommitdiff
path: root/support/dktools/DkWxProgressDialog.wxc
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/DkWxProgressDialog.wxc
Initial commit
Diffstat (limited to 'support/dktools/DkWxProgressDialog.wxc')
-rw-r--r--support/dktools/DkWxProgressDialog.wxc318
1 files changed, 318 insertions, 0 deletions
diff --git a/support/dktools/DkWxProgressDialog.wxc b/support/dktools/DkWxProgressDialog.wxc
new file mode 100644
index 0000000000..942d0d56d3
--- /dev/null
+++ b/support/dktools/DkWxProgressDialog.wxc
@@ -0,0 +1,318 @@
+%% options
+
+copyright owner = Dirk Krause
+copyright year = 2011-xxxx
+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 <DkWxCommunicator.h>
+
+
+
+%% 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"
+}
+
+