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

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")