378 lines
17 KiB
Rexx
Executable File
378 lines
17 KiB
Rexx
Executable File
/* publicRoutines_demo.rex */
|
|
|
|
/*
|
|
Purpose.: Demonstrate each of the ooDialog Public Routines
|
|
Who.....: Lee Peedin
|
|
When....: August 14, 2007
|
|
*/
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* */
|
|
/* Copyright (c) 2007-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. */
|
|
/* */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
/*
|
|
This demo incorporates the following "features of ooRexx 3.2
|
|
24 September 2007
|
|
.endOfLine is used instead of '0d0a'x
|
|
ScreenSize
|
|
MSSleep
|
|
Variations of TimedMessage
|
|
time('t')
|
|
*/
|
|
|
|
-- Define a path most likely to be common to anyone using this demo - change as necessary
|
|
ooRexxHome = value("REXX_HOME", , 'ENVIRONMENT' )
|
|
if ooRexxHome~length == 0 then
|
|
path = 'C:\Program Files\ooRexx\'
|
|
else
|
|
path = ooRexxHome || '\'
|
|
|
|
-- Define a couple of variables to use in the code, including a global used for
|
|
-- a helper dialog.
|
|
delimiter = '0'x
|
|
.local~helperDlgTitle = "The publicRoutines_Demo Helper Dialog"
|
|
|
|
-- Provide a menu of different examples - use the built in SingleSelection dialog
|
|
preselect = 1
|
|
do until op = ''
|
|
option.1 = 'Play an audio file 1 time - (synchronously)'
|
|
option.2 = 'Play an audio file 1 time - (asynchronously)'
|
|
option.3 = 'Play an audio file multiple times - (loop)'
|
|
option.4 = 'Stop playing the audio file'
|
|
option.5 = 'Show an InfoDialog'
|
|
option.6 = 'Show an ErrorDialog'
|
|
option.7 = 'Show a multi-line InfoDialog'
|
|
option.8 = 'Show an AskDialog - Yes button as the default'
|
|
option.9 = 'Show an AskDialog - No button as the default'
|
|
option.10 = 'Show a FileNameDialog'
|
|
option.11 = 'Retrieve the handle to a window'
|
|
option.12 = 'Use the .DlgUtil Class To Return Screen Resolution'
|
|
option.13 = 'A Standard Timed Message (5 Seconds)'
|
|
option.14 = 'An unTimed Message'
|
|
option.15 = 'Stop The unTimed Message'
|
|
option.16 = 'An Early Reply Timed Message'
|
|
option.17 = 'Use the .DlgUtil Class To Query System Metrics'
|
|
|
|
max = 17
|
|
ssdlg = .SingleSelection~new('Select A Demonstration','Public Routines Demonstration',option.,preselect,,max%2+1)
|
|
op = ssdlg~execute
|
|
if op \= '' then
|
|
do
|
|
preselect = op + 1
|
|
if preselect > max then preselect = 1
|
|
call ('OPTION'op) ssdlg
|
|
end
|
|
end
|
|
exit
|
|
|
|
Option1:
|
|
fileName = path||'samples\oodialog\wav\gotcha.wav'
|
|
wstream = .stream~new(filename)
|
|
if wstream~query('exists') = '' then
|
|
call errorDialog'The expected audio file' filename 'does not exist'
|
|
else
|
|
do
|
|
msg = "When you close this message box, a *.wav file will"||.endOfLine||-
|
|
"play synchronously. You will return to the demo progam"||.endOfLine||-
|
|
"when the *.wav file is ended."
|
|
call InfoDialog msg
|
|
|
|
call Play fileName
|
|
end
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option2:
|
|
fileName = path||'samples\oodialog\wav\gotcha.wav'
|
|
wstream = .stream~new(filename)
|
|
if wstream~query('exists') = '' then
|
|
call errorDialog 'The expected audio file' filename 'does not exist'
|
|
else
|
|
do
|
|
msg = "When you close this message box, a *.wav file will"||.endOfLine||-
|
|
"play asynchronously. You will return to the demo progam"||.endOfLine||-
|
|
"immediately, while the *.wav file continues to play."
|
|
call InfoDialog msg
|
|
|
|
call Play fileName,'YES'
|
|
end
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option3:
|
|
fileName = path||'samples\oodialog\wav\gotcha.wav'
|
|
wstream = .stream~new(filename)
|
|
if wstream~query('exists') = '' then
|
|
call errorDialog 'The expected audio file' filename 'does not exist'
|
|
else
|
|
do
|
|
msg = "When you close this message box, a *.wav file will"||.endOfLine||-
|
|
"play asynchronously in a continuous loop. You will"||.endOfLine||-
|
|
"return to the demo progam immediately. The *.wav"||.endOfLine||-
|
|
"file will continue to play until you stop it using"||.endOfLine||-
|
|
"the 'Stop playing the audio file' option."
|
|
call InfoDialog msg
|
|
|
|
call Play fileName,'LOOP'
|
|
end
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option4:
|
|
call Play fileName
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option5:
|
|
call InfoDialog 'This is an InfoDialog - note the icon used & the tone played'
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option6:
|
|
call ErrorDialog 'This is an ErrorDialog - note the icon used & the tone played'
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option7:
|
|
msg = 'This is line1'||.endOfLine||-
|
|
'This is line2'||.endOfLine||-
|
|
'This is line3 - note that the dialog is "stretched" to accomodate the longest line'
|
|
call InfoDialog msg
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option8:
|
|
rv = AskDialog('Do you like this demonstration? (Yes button is pre-selected)')
|
|
if rv = 1 then
|
|
call InfoDialog 'You selected "Yes" - glad you like it'
|
|
else
|
|
call InfoDialog 'You selected "No" - mind sharing what you think would improve the demonstration?'
|
|
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option9:
|
|
rv = AskDialog('Do you like this demonstration? (No button is pre-selected)','n')
|
|
if rv = 1 then
|
|
call InfoDialog 'You selected "Yes" - glad you like it'
|
|
else
|
|
call InfoDialog 'You selected "No" - you must be hard to please'
|
|
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option10:
|
|
selfile = path
|
|
parent = '' -- don't need this in this example - just a place holder
|
|
filemask = 'All Files (*.*)'delimiter'*.*'delimiter
|
|
loadorsave = '' -- Load is the default
|
|
title = '' -- See documentation for default
|
|
defExtension = '' -- don't need this in this example - just a place holder
|
|
multiSelect = '' -- don't need this in this example - just a place holder
|
|
sepChar = '' -- don't need this in this example - just a place holder
|
|
|
|
a_file = FileNameDialog(selfile,parent,filemask,loadorsave,title,defExtension,multiSelect,sepChar)
|
|
if a_file = 0 then
|
|
call ErrorDialog 'You Did Not Select A File'
|
|
else
|
|
call InfoDialog 'You Selected' a_file
|
|
|
|
call InfoDialog 'For additional FileNameDialog examples, see the sample titled "fileNameDialog_demo.rex"'
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option11:
|
|
|
|
call infoDialog 'This program will open a dialog window in the'||.endOfLine||-
|
|
'upper left corner of your screen named:'||.endOfLine||.endOfLine||-
|
|
'"'.helperDlgTitle'"'||.endOfLine||.endOfLine||-
|
|
'and will return its handle. After finding the window, the'||.endOfLine||-
|
|
'handle value will be added to the dialog window title.'
|
|
|
|
-- The public routine FindWindow locates a window by its title. Since this
|
|
-- example should run for anyone, and there is no way of guaranteeing what
|
|
-- window might be open on anyone's desktop, the example creates its own
|
|
-- simple dialog window. That way it ensures that there is a known window
|
|
-- to find.
|
|
|
|
aWindow = .SimpleDialog~new()
|
|
if aWindow~initCode = 0 then
|
|
do
|
|
-- Start the dialog concurrently, so this example program can
|
|
-- continue to run. Note, it takes some finite amount of time for
|
|
-- the OS to create and start up the underlying dialog. The example
|
|
-- sleeps a short time to give the OS time to get the dialog going.
|
|
aWindow~start("Execute")
|
|
call SysSleep .01
|
|
|
|
hWnd = FindWindow(.helperDlgTitle)
|
|
if hWnd = 0 then
|
|
call ErrorDialog 'Window could not be found'
|
|
else
|
|
do
|
|
-- The window handle can now be used to change the title of
|
|
-- the helper dialog, which demonstrates that the handle is
|
|
-- correct.
|
|
aWindow~SetWindowTitle(hWnd,.helperDlgTitle '- My handle is.:' hWnd)
|
|
call InfoDialog 'The handle to the "'.helperDlgTitle'" window is:' hWnd
|
|
end
|
|
|
|
-- Now close the helper dialog.
|
|
aWindow~cancel
|
|
end
|
|
else
|
|
do
|
|
call ErrorDialog 'Sorry, the dialog creation failed'
|
|
end
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option12:
|
|
use arg self
|
|
|
|
-- Dialog units only have meaning in relation to a specfic dialog because the units are dependent on the
|
|
-- font used by the dialog. The screenSize() method of the .DlgUtil can accurately calculate the dialog
|
|
-- unit values for any dialog, if passed a reference to the dialog.
|
|
|
|
ss = .DlgUtil~screenSize('B', self)
|
|
tab = '09'x
|
|
msg = 'Dialog units are expressed as dialog units' || .endOfLine ||-
|
|
'of' self 'dialog' || .endOfLine~copies(3) || -
|
|
'Width In Dialog Units: ' || tab || ss[1] || .endOfLine ||-
|
|
'Height In Dialog Units:' || tab || ss[2] || .endOfLine ||-
|
|
'Width In Pixels: ' || tab || tab || ss[3] || .endOfLine ||-
|
|
'Height In Pixels:' || tab || tab || ss[4]
|
|
call InfoDialog msg
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option13:
|
|
msg = 'This Message Will Remain On The Screen For 5000 milliSeconds'
|
|
ret = timedMessage(msg,'A Standard TimedMessage', 5000)
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option14:
|
|
msg = "Hey, I'm Back Here - Frozen In Time! This Message Will Remain On The Screen Until The Program Calls For It To Be Stopped"
|
|
tdlg = timedMessage(msg,'An unTimedMessage', -1)
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option15:
|
|
if symbol('tdlg') = 'VAR' then
|
|
do
|
|
tdlg~cancel
|
|
drop tdlg
|
|
end
|
|
else
|
|
call errorDialog 'There Is Not unTimed Message To Stop'
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option16:
|
|
-- Total time will be the duration of the MSSleep - The TimeMessage will last only half the total duration
|
|
-- call time 'r'
|
|
startTime = time()
|
|
startTs = .TimeSpan~new(time('F'))
|
|
msg = 'Processing Occurring - Please Wait - Processing Will Take Longer Than This Message'
|
|
ret = timedMessage(msg,'A TimedMessage Early Reply', 5000, .true)
|
|
ret = MSSleep(10000)
|
|
endTime = time()
|
|
endTS = .TimeSpan~new(time('F'))
|
|
msg = 'Start Time:' startTime '- End Time:' endTime '- Duration:' (endTS - startTS)~string~right(9)~strip('T', '0') 'Seconds'
|
|
call infoDialog msg
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
|
|
----------------------------------------------------------------------------------------------------------------
|
|
Option17:
|
|
|
|
tab = '09'x
|
|
|
|
-- There are a large number of system metric values. You query the value you
|
|
-- are interested in by numeric index. The GetSystemMetrics Windows API is
|
|
-- documented in the MSDN Library, which Microsoft makes available online.
|
|
-- The numeric values of the possible indexes and their meanings are all
|
|
-- documented there. Use a Google search of "GetSystemMetrics MSDN Library"
|
|
-- to locate the documentation.
|
|
|
|
SM_CMONITORS = 80
|
|
SM_CMOUSEBUTTONS = 43
|
|
SM_MOUSEWHEELPRESENT = 19
|
|
|
|
countMonitors = .DlgUtil~getSystemMetrics(SM_CMONITORS)
|
|
countMouseButtons = .DlgUtil~getSystemMetrics(SM_CMOUSEBUTTONS)
|
|
haveMouseWheel = .DlgUtil~getSystemMetrics(SM_MOUSEWHEELPRESENT)
|
|
|
|
if countMonitors <> -1 then
|
|
l1 = "Attached Monitors:" tab || countMonitors"." ||.endOfLine
|
|
else
|
|
l1 = "SystemMetrics error." ||.endOfLine
|
|
|
|
select
|
|
when countMouseButtons == 0 then
|
|
l2 = "Mouse:" tab || tab || "no mouse attached." ||.endOfLine
|
|
when countMouseButtons > 0 then
|
|
l2 = "Mouse:" tab || tab || countMouseButtons "button mouse." ||.endOfLine
|
|
otherwise
|
|
l2 = "SystemMetrics error." ||.endOfLine
|
|
end
|
|
-- End select
|
|
|
|
select
|
|
when countMouseButtons == 0 then
|
|
l3 = "Mouse wheel:" tab || "no mouse attached." ||.endOfLine
|
|
when haveMouseWheel then
|
|
l3 = "Mouse wheel:" tab || "present." ||.endOfLine
|
|
when \ haveMouseWheel then
|
|
l3 = "Mouse wheel:" tab || "none." ||.endOfLine
|
|
otherwise
|
|
l3 = "SystemMetrics error." ||.endOfLine
|
|
end
|
|
-- End select
|
|
|
|
l4 = .endOfLine||.endOfLine||" --------------------------- "||.endOfLine||.endOfLine
|
|
|
|
SM_CXSIZE = 30
|
|
SM_CXVSCROLL = 20
|
|
SM_CYHSCROLL = 3
|
|
SM_CYMENU = 15
|
|
|
|
l5 = "Height of single line menu bar in pixels:" tab .DlgUtil~getSystemMetrics(SM_CYMENU) || ". " ||.endOfLine
|
|
l6 = "Width of title bar button in pixels:" tab .DlgUtil~getSystemMetrics(SM_CXSIZE) || ". " ||.endOfLine
|
|
l7 = "Width of vertical scroll bar in pixels:" tab .DlgUtil~getSystemMetrics(SM_CXVSCROLL) || ". " ||.endOfLine
|
|
l8 = "Height of horizontal scroll bar in pixels:" tab .DlgUtil~getSystemMetrics(SM_CYHSCROLL) || ". " ||.endOfLine
|
|
|
|
msg = l1 || l2 || l3 || l4 || l5 || l6 || l7 || l8
|
|
j = infoDialog(msg)
|
|
|
|
return
|
|
----------------------------------------------------------------------------------------------------------------
|
|
|
|
-- Requires directive to use the Public Routines
|
|
::requires "ooDialog.cls"
|
|
|
|
::class SimpleDialog subclass UserDialog public
|
|
::method Execute
|
|
self~Create(0,0,290,40, .helperDlgTitle)
|
|
self~execute:super("SHOWTOP")
|