190 lines
8.2 KiB
Rexx
Executable File
190 lines
8.2 KiB
Rexx
Executable File
/*----------------------------------------------------------------------------*/
|
|
/* */
|
|
/* Copyright (c) 2008-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. */
|
|
/* */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* Name: displayAnyMenu.rex
|
|
* Type: Example ooRexx program
|
|
*
|
|
* Description: Displays the menu hierarchy for a window that the user picks.
|
|
*
|
|
* The user is prompted for the title of an open, top-level,
|
|
* window. This program then parses the details of the menubar
|
|
* for that window and displays them graphically.
|
|
*
|
|
* The example uses a mixture of ooDialog and winsystm.
|
|
*
|
|
* In addition, the example uses some of the public functions
|
|
* provided by the windowsSystem.frm package. That framweowork
|
|
* is an example of how to extract common function into a
|
|
* package and share that function with any number of ooRexx
|
|
* programs.
|
|
*
|
|
* The table below lists the external functions and classes used in this
|
|
* program and shows where to go to examine the source code for them.
|
|
*
|
|
* External function Source
|
|
* ---------------------------------------------------
|
|
* RcDialog ooDialog
|
|
* errorDialog() ooDialog
|
|
* askDialog() ooDialog
|
|
* infoDialog() ooDialog
|
|
* MenuDetailer windowsSystem.frm
|
|
* findTheWindow() windowsSystem.frm
|
|
*/
|
|
|
|
sd = locate()
|
|
.application~useGlobalConstDir("O", sd"winSystemDlgs.h")
|
|
|
|
-- Prompt the user for a window title
|
|
dlg = .UserPrompt~new(sd"winSystemDlgs.rc", IDD_USER_PROMPT)
|
|
|
|
if dlg~initCode <> 0 then do
|
|
msg = "Error initializing the UserPrompt dialog." || '0d0a0d0a'x || -
|
|
"The dislplayAnyMenu example will have to quit."
|
|
j = errorDialog(msg)
|
|
return 99
|
|
end
|
|
|
|
-- A return of 2 means the user canceled, and we will just quit.
|
|
if dlg~execute("SHOWTOP") == 2 then return 2
|
|
|
|
-- The UserPrompt dialog validates the data, i.e. it enforces that either a
|
|
-- valid WindowObject is obtained, or that the user cancels. Here, we ask the
|
|
-- dialog for the window object that the user picked, create a MenuDetailer
|
|
-- object using that window object, and then display the menu.
|
|
|
|
topWnd = dlg~getUserPick
|
|
md = .MenuDetailer~new(topWnd)
|
|
md~display
|
|
|
|
-- Return 0 for okay
|
|
return 0
|
|
|
|
::requires 'windowsSystem.frm'
|
|
|
|
/** class UserPrompt
|
|
* Our user prompt dialog subclasses the RcDialog. The RcDialog class takes
|
|
* care of all the details of the dialog and we just over-ride the ok method
|
|
* to take care of validating the user input. We also add a method,
|
|
* getUserPick(), which is used to return the window object representing the
|
|
* window the user selected.
|
|
*/
|
|
::class 'UserPrompt' subclass RcDialog inherit AdvancedControls MessageExtensions
|
|
|
|
/** ok()
|
|
* The over-ride of the ok() method is basically simple. It verifies that the
|
|
* user entered something in the edit control and then attempts to contstruct
|
|
* a .WindowObject using the text from the edit control as the title of a
|
|
* window.
|
|
*
|
|
* The method will only end the dialog with the 'ok' value if a valid window
|
|
* object is constructed. Otherwise it forces the user to either try again,
|
|
* or to cancel.
|
|
*/
|
|
::method ok
|
|
expose wnd edit
|
|
|
|
-- Get the edit control object and then the text the user entered. We only
|
|
-- instantiate the edit control object the first time through.
|
|
|
|
if \ edit~isA(.EditControl) then edit = self~newEdit(IDC_EDIT_NAME)
|
|
title = edit~getText~strip
|
|
|
|
-- Check that the user entered something.
|
|
if title~length == 0 then do
|
|
msg = "You must enter the title of a window whose menu" || '0d0a'x || -
|
|
"you want displayed." || '0d0a0d0a'x || -
|
|
"Would you rather cancel?"
|
|
if askDialog(msg) then return self~cancel
|
|
else return
|
|
end
|
|
|
|
-- Warn the user that constructing the window object may take a little bit of
|
|
-- time.
|
|
msg = "It may take a second or two find the window" || '0d0a'x || -
|
|
"you picked. Be patient." || '0d0a0d0a'x || -
|
|
"This dialog will be disabled during the search."
|
|
j = infoDialog(msg)
|
|
|
|
-- Disable the dialog so that an impatient user can not fiddle with it.
|
|
self~disable
|
|
edit~disable
|
|
self~disableItem(IDOK)
|
|
self~disableItem(IDCANCEL)
|
|
|
|
-- The big step, get a window object with the title entered by the user.
|
|
wnd = findTheWindow(title)
|
|
|
|
-- Re-enable the dialog.
|
|
self~enable
|
|
edit~enable
|
|
self~enableItem(IDOK)
|
|
self~enableItem(IDCANCEL)
|
|
|
|
-- If we don't have a window object, give the user a chance to try again, or
|
|
-- to cancel. If the user does not want to try again, we end the dialog by
|
|
-- invoking our cancel() method.
|
|
if wnd == .nil then do
|
|
msg = "Failed to find the window with title:" || '0d0a'x || -
|
|
" " title || '0d0a0d0a'x || -
|
|
"The window title has to match exactly." || '0d0a0d0a'x || -
|
|
"Try again?"
|
|
if askDialog(msg) then return
|
|
else return self~cancel
|
|
end
|
|
|
|
-- Okay, we have a window object. We end the dialog by inoking the superclass
|
|
-- ok() method.
|
|
return self~ok:super
|
|
|
|
/** cancel()
|
|
* Just to keep things tidy, if the user cancels, we make sure that wnd is .nil.
|
|
* Then if getUserPick() is called, .nil is returned. Presumably, if the user
|
|
* cancels, getUserPick() would not be invoked. However, if someone were to
|
|
* take this dialog class implementation and extend it, this simple detail might
|
|
* be overlooked.
|
|
*/
|
|
::method cancel
|
|
expose wnd
|
|
wnd = .nil
|
|
return self~cancel:super
|
|
|
|
/** getUserPick() Return the window object to the caller */
|
|
::method getUserPick
|
|
expose wnd
|
|
return wnd
|