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

200 lines
7.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: getTheWindow.rex
* Type: Example ooRexx program
*
* Description: This example shows how to find a window without using the
* exact window title.
*
* The WindowsManager class provides the find() method to get a
* top-level window using its title. But, you need to use the
* exact title. This example uses a method of the
* WindowsManager, desktopWindow(), that is available in ooRexx
* 4.0.0 and later. Once you get the desktop window, you can
* enumerate all its children windows and compare their titles
* in a custom matching function.
*
*/
say
say
say 'This sample program will find an open top-level window'
say 'using a substring of the window title. Case does not'
say 'matter.'
say
say 'Enter part of the title of the window you want found'
.stdout~charout(" Substring: ")
parse pull text
-- Instantiate a WindowManager object and get the desktop window.
mgr = .WindowsManager~new
deskTop = mgr~desktopWindow
say
say
say 'First some information about the desktop window:'
say 'Desktop: ' desktop
say ' Class: ' deskTop~wClass
say ' Position:' deskTop~coordinates
say
say
text = text~strip
if text == "" then do
say 'Sorry the empty string is not going to work.'
say 'Try again when you are serious about finding'
say 'a window.'
say
return 99
end
-- This function is where the real work is done.
wnd = fuzzyFindWindow(deskTop, text)
if wnd <> .nil then do
say 'Found your window.'
say ' Title: ' wnd~title
say ' Class: ' wnd~wClass
say ' Position:' wnd~coordinates
say ' Styles: ' wnd~getStyle
end
else do
say 'Could not find your window'
say ' Are you sure' text 'is a substring'
say ' of the window title?'
end
-- fuzzyFindWindow() returns the first matching window. We'll use another,
-- similar, function to get all matching windows.
say
say
say 'This is a similar exercise, but will find all matching'
say 'windows, using a substring of the window title.'
say
say 'Enter part of the title of the window(s) you want found'
.stdout~charout(" Substring: ")
parse pull text
say
say
text = text~strip
if text == "" then do
say 'Sorry the empty string is not going to work.'
say 'Try again when you are serious about finding'
say 'a window.'
say
return 99
end
-- This function will return an array with all matching windows. An empty array
-- signals no match.
windows = fuzzyFindWindows(deskTop, text)
if windows~items > 0 then do wnd over windows
say 'Found this window.'
say ' Title: ' wnd~title
say ' Class: ' wnd~wClass
say ' Position:' wnd~coordinates
say ' Styles: ' wnd~getStyle
say
end
else do
say 'Could not find any matching windows.'
say ' Are you sure' text 'is a substring'
say ' of some open window title?'
end
say
return 0
::requires 'winsystm.cls'
/** fuzzyFindWindow()
* Searches the desktop children window for a window whose title contains the
* text specified.
*
* @param desktopWnd The desktop window object.
* @param text The text to look for, case is not significant.
*
* @return The window object if a window is found, otherwise .nil.
*
* @note Although in this program, only the desktop window is used, the
* function itself would work for any window.
*/
::routine fuzzyFindWindow
use strict arg deskTopWnd, text
-- Set up the default return.
wnd = .nil
-- Starting with the first child window, look at each window's title and see
-- if it contains the specified text. The first match found is returned.
child = deskTopWnd~firstChild
do while child <> .nil
title = child~title
if title~caselessPos(text) <> 0 then do
wnd = child
leave
end
child = child~next
end
return wnd
/** fuzzyFindWindows()
* This is the exact same function as the above, except it returns an array of
* all the windows that contain the specified text.
*/
::routine fuzzyFindWindows
use strict arg deskTopWnd, text
-- Set up the default return.
w = .array~new
-- Starting with the first child window, look at each window's title and see
-- if it contains the specified text. Add each matching window to the array.
child = deskTopWnd~firstChild
do while child <> .nil
title = child~title
if title~caselessPos(text) <> 0 then w~append(child)
child = child~next
end
return w