rexx-things/modules/windows/oodialog/examples/stopWatch.rex
2025-03-12 20:50:48 +00:00

190 lines
9.1 KiB
Rexx
Executable File

/*----------------------------------------------------------------------------*/
/* */
/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */
/* */
/* This program and the accompanying materials are made available under */
/* the terms of the Common Public License v1.0 which accompanies this */
/* distribution. A copy is also available at the following address: */
/* https://www.oorexx.org/license.html */
/* */
/* Redistribution and use in source and binary forms, with or */
/* without modification, are permitted provided that the following */
/* conditions are met: */
/* */
/* Redistributions of source code must retain the above copyright */
/* notice, this list of conditions and the following disclaimer. */
/* Redistributions in binary form must reproduce the above copyright */
/* notice, this list of conditions and the following disclaimer in */
/* the documentation and/or other materials provided with the distribution. */
/* */
/* Neither the name of Rexx Language Association nor the names */
/* of its contributors may be used to endorse or promote products */
/* derived from this software without specific prior written permission. */
/* */
/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */
/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */
/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */
/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */
/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
/* */
/*----------------------------------------------------------------------------*/
/* ========================================================================= */
/* Stopwatch a Rexx Stopwatch */
/* ========================================================================= */
dlg = .StopWatchCls~new /* Create OODialog Class instance */
dlg~execute('ShowTop') /* Create, show and run the Windows Object */
EXIT -->|
/* ========================================================================= */
::requires 'ooDialog.cls' /* OODialog Windows GUI Class */
::requires "winSystm.cls" /* for clipboard manager */
/* ========================================================================= */
::class StopWatchCls subclass userdialog
/* ------------------------------------------------------------------------- */
::attribute state unguarded /* [Stopped,Running,Split,splitting] */
::attribute session unguarded /* session number */
::attribute events unguarded /* event record for clipboard */
/* ------------------------------------------------------------------------- */
::method Init
/* ------------------------------------------------------------------------- */
self~Init:super /* we call the Super Class (userdialog) */
rc = self~CreateCenter(160,62,'Stopwatch - - Stopped',,,'MS Sans Serif',8)
self~InitCode = (rc=0)
self~state = 'Stopped'
self~time = '00:00:00.00'
self~Session = 0
self~events = .array~new
/* ------------------------------------------------------------------------- */
::method DefineDialog
/* ------------------------------------------------------------------------- */
expose menuBar
u = .dlgAreaU~new(self) /* Whole dialog */
self~createEdit( 10, u~x, u~y, u~w, u~h('31%'), 'readonly center', 'time')
self~createPushButton(11, u~x, u~y('41%'),u~w('45%'),u~h('38%'), ,'Start', 'ButtonPress')
self~createPushButton(12, u~x('55%'),u~y('41%'),u~w('45%'),u~h('38%'), ,'Exit', 'ButtonPress')
menuBar = .BinaryMenuBar~new
filePopup = .PopupMenu~new(13)
filePopup~insertItem(IDCANCEL,IDCANCEL,"E&xit")
editPopup = .PopupMenu~new(14)
editPopup~insertItem(15, 15, "&Copy","GRAYED",,,.true,"Copy2CB")
menuBar~insertPopup(14,14,editPopup,"&Edit")
menuBar~insertPopup(13,13,filePopup,"&File")
/* ------------------------------------------------------------------------- */
::method InitDialog
/* ------------------------------------------------------------------------- */
expose el b1 b2 menuBar
menuBar~attachTo(self)
b1 = self~newPushButton(11)
b2 = self~newPushButton(12)
el = self~newEdit(10)
d = .Directory~new~~weight(700)
el~~setcolor(0,13)~~setFont(self~createFontEx('Lucida Console',18,d),1)
return InitDlgRet
/* ------------------------------------------------------------------------- */
::Method ButtonPress UnGuarded
/* Pressing either button runs this method */
/* ------------------------------------------------------------------------- */
expose el b1 b2 events state session menuBar
-----
REPLY --> -- run asynchronously -v>|
-----
action = self~newPushButton(arg(1))~title /* pressed button title */
Select
when action='Start' then do
call time 'r' /* RESET the clock */
session += 1
events~append(session '0909'x 'Start' '09'x date('s',,,'-') time())
call SetStateButtonsAndTitle 'Running','Stop','Split','Running'
menuBar~enable(15)
do while State <> 'Stopped' /* Run the stopwatch display */
if State='Running' | State='Splitting'
then do
ftime=FormatTime(time('e'))
el~~SetTitle(ftime)~~Update
if State='Splitting'
then do
State='Split'
events~append(session '09'x ftime '09'x 'Split')
end /* DO */
end
call syssleep 0.004 /* dont hog resources */
end /* DO */
events~append(session '09'x ftime '09'x 'Stop')
end /* DO */
when action='Stop'
then call SetStateButtonsAndTitle 'Stopped','Start','Exit','Stopped'
when action='Resume'
then call SetStateButtonsAndTitle 'Running','Stop','Split','Running'
when action='Split'
then call SetStateButtonsAndTitle 'Splitting','Resume','Split','Split Time'
when action='Exit' then do
State='Stopped' /* kill running threads */
self~OK -- EXIT Dialog ->|
end
otherwise
end /* select */
return
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
SetStateButtonsAndTitle:
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
State = arg(1)
b1~SetTitle(arg(2))
b2~SetTitle(arg(3))
self~SetTitle('Stopwatch -' session '-' arg(4))
return
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
FormatTime:
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
procedure
arg t
parse var t t'.'ms /* take off the ms */
hh = t % 3600
t = t // 3600
mm = t % 60
ss = t // 60
return hh~right(2,'0')||':'||mm~right(2,'0')||':'ss~right(2,'0')||'.'ms~left(2)
/* ------------------------------------------------------------------------- */
::Method Cancel UnGuarded /* stop possible running thread on exit */
/* ------------------------------------------------------------------------- */
self~state='Stopped'
return self~Cancel:Super -- Leave the dialog -->|
/* ------------------------------------------------------------------------- */
::method Copy2CB UnGuarded
/* ------------------------------------------------------------------------- */
expose events
cb = .WindowsClipboard~new
cb~copy(events~makeString('l',.endofline))
/* ========================================================================= */