190 lines
9.1 KiB
Rexx
Executable File
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))
|
|
|
|
/* ========================================================================= */
|