300 lines
12 KiB
Rexx
Executable File
300 lines
12 KiB
Rexx
Executable File
/*----------------------------------------------------------------------------*/
|
|
/* */
|
|
/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */
|
|
/* Copyright (c) 2005-2021 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: calculator.rex */
|
|
/* Type: ooRexx Script */
|
|
/* Resource: CALCULATOR */
|
|
/* */
|
|
/* Description: */
|
|
/* Sample that demonstrates the usage of RxMath and ooDialog */
|
|
/* */
|
|
/****************************************************************************/
|
|
|
|
/* Find our installation directory */
|
|
|
|
j = locate()
|
|
|
|
/* create the dialog */
|
|
calcDlg = .Calculator~new
|
|
|
|
/* Set the defaults for arithmetic operations (optional) */
|
|
NUMERIC DIGITS 16 /* precision can be up to 16 digits for RxMath */
|
|
NUMERIC FORM SCIENTIFIC /* controls exponential notation */
|
|
NUMERIC FUZZ 0 /* number of digits ignored for numeric comparison */
|
|
|
|
/* Display the dialog */
|
|
if calcDlg~initCode = 0 then do
|
|
rc = calcDlg~execute("SHOWTOP")
|
|
end
|
|
|
|
exit /* leave program */
|
|
|
|
::requires "ooDialog.cls"
|
|
|
|
/* This requires loads the RxMath functions. */
|
|
::requires "rxmath" library
|
|
|
|
/* The Calculator dialog class */
|
|
::class 'Calculator' subclass UserDialog
|
|
|
|
::method init
|
|
forward class (super) continue /* call parent constructor */
|
|
InitRet = Result
|
|
|
|
if self~load(.application~srcDir"rc\CALCULATOR.RC", ) \= 0 then do
|
|
self~initCode = 1
|
|
return 1
|
|
end
|
|
|
|
/* Connect dialog control items to class methods */
|
|
self~connectButtonEvent("BNO1", "CLICKED", "BNO1")
|
|
self~connectButtonEvent("BNO2", "CLICKED", "BNO2")
|
|
self~connectButtonEvent("BNO3", "CLICKED", "BNO3")
|
|
self~connectButtonEvent("BNO4", "CLICKED", "BNO4")
|
|
self~connectButtonEvent("BNO5", "CLICKED", "BNO5")
|
|
self~connectButtonEvent("BNO6", "CLICKED", "BNO6")
|
|
self~connectButtonEvent("BNO7", "CLICKED", "BNO7")
|
|
self~connectButtonEvent("BNO8", "CLICKED", "BNO8")
|
|
self~connectButtonEvent("BNO9", "CLICKED", "BNO9")
|
|
self~connectButtonEvent("BNO0", "CLICKED", "BNO0")
|
|
self~connectButtonEvent("BSIGN", "CLICKED", "BSIGN")
|
|
self~connectButtonEvent("BPOINT", "CLICKED", "BPOINT")
|
|
self~connectButtonEvent("BDIVIDE", "CLICKED", "BDIVIDE")
|
|
self~connectButtonEvent("BTIMES", "CLICKED", "BTIMES")
|
|
self~connectButtonEvent("BMINUS", "CLICKED", "BMINUS")
|
|
self~connectButtonEvent("BPLUS", "CLICKED", "BPLUS")
|
|
self~connectButtonEvent("BSQRT", "CLICKED", "BSQRT")
|
|
self~connectButtonEvent("BLOG", "CLICKED", "BLOG")
|
|
self~connectButtonEvent("BLOG10", "CLICKED", "BLOG10")
|
|
self~connectButtonEvent("BPI", "CLICKED", "BPI")
|
|
self~connectButtonEvent("BBACKSPACE", "CLICKED", "BBACKSPACE")
|
|
self~connectButtonEvent("BCLEAR", "CLICKED", "BCLEAR")
|
|
self~connectButtonEvent("BCALC", "CLICKED", "BCALC")
|
|
self~connectButtonEvent("BSINUS", "CLICKED", "BSINUS")
|
|
self~connectButtonEvent("BCOSINUS", "CLICKED", "BCOSINUS")
|
|
self~connectButtonEvent("BTANGENS", "CLICKED", "BTANGENS")
|
|
self~connectButtonEvent("BARCSIN", "CLICKED", "BARCSIN")
|
|
self~connectButtonEvent("BARCCOS", "CLICKED", "BARCCOS")
|
|
self~connectButtonEvent("BARCTAN", "CLICKED", "BARCTAN")
|
|
|
|
/* Initial values that are assigned to the object attributes */
|
|
self~TLine= '0' /* set text-line to 0 initially */
|
|
|
|
/* Add your initialization code here */
|
|
return InitRet
|
|
|
|
::method initDialog
|
|
expose tl
|
|
tl = self~newEdit(TLine) /* get the EditControl object */
|
|
|
|
::method getLine
|
|
/* Return the current text-line content, */
|
|
/* or 0 if infinity has been reached. */
|
|
|
|
expose tl
|
|
if tl~getText~Left(5) = 'ERROR' then
|
|
return 0
|
|
return tl~getText
|
|
|
|
::method setLine
|
|
/* Set the argument as new text-line. If this is ERROR raise an */
|
|
/* errorDialog with additional information. */
|
|
|
|
expose tl
|
|
use arg line, merror
|
|
if line~left(5) = 'ERROR' then
|
|
call errorDialog "RxCalc returned an error:" merror
|
|
tl~setText(line)
|
|
|
|
::method justZero
|
|
/* Return true if the current text-line is only one 0. */
|
|
/* Most functions will then ignore the current text-line */
|
|
|
|
line = self~getLine
|
|
if line~Length = 1 & line = 0 then
|
|
return 1
|
|
return 0
|
|
|
|
::method getCheckedLine
|
|
/* Return the result of the current calculation or the line */
|
|
/* if it is only a number. DataType will not return NUM */
|
|
/* if any operators are present. */
|
|
|
|
line = self~getLine
|
|
if DataType(line) = 'NUM' then
|
|
return line
|
|
else do
|
|
interpret 'calcResult =' line
|
|
return calcResult
|
|
end
|
|
|
|
/* --------------------- message handler -----------------------------------*/
|
|
|
|
::method UNKNOWN
|
|
/* The UNKNOWN-method is called, whenever the defined message for a */
|
|
/* button cannot be found. This is a good way to roll all the methods for */
|
|
/* the 10 digits into one. The last character of the argument is the */
|
|
/* number that was pressed. */
|
|
|
|
use arg message
|
|
number = message~SubStr(4)
|
|
if self~justZero then
|
|
self~setLine(number)
|
|
else self~setLine(self~getLine||number)
|
|
|
|
::method BSIGN
|
|
/* Toggles the sign of the leading number on the text line. */
|
|
|
|
if self~justZero then
|
|
self~setLine('-')
|
|
else do
|
|
select
|
|
when left(self~getLine,1)='-' then
|
|
self~setLine('+'||substr(self~getLine,2))
|
|
when left(self~getLine,1)='+' then
|
|
self~setLine('-'||substr(self~getLine,2))
|
|
otherwise
|
|
self~setLine('-'||self~getLine)
|
|
end
|
|
end
|
|
|
|
::method BPOINT
|
|
/* Append a point.. */
|
|
self~setLine(self~getLine||'.')
|
|
|
|
::method BDIVIDE
|
|
/* Appends a 'divide' symbol to the checked line. */
|
|
self~setLine(self~GetCheckedLine||'/')
|
|
|
|
::method BTIMES
|
|
/* Append a 'multiply' symbol to the checked line. */
|
|
self~setLine(self~GetCheckedLine||'*')
|
|
|
|
::method BMINUS
|
|
/* Appends a 'minus' symbol to the checked line. */
|
|
self~setLine(self~GetCheckedLine||'-')
|
|
|
|
::method BPLUS
|
|
/* Appends a 'plus' symbol to the checked line. */
|
|
self~setLine(self~GetCheckedLine||'+')
|
|
|
|
::method BSQRT
|
|
/* Displays the square root of the checked line. */
|
|
/* MATHERRNO is filled with additional information if the */
|
|
/* RxMath-funtion detects an error. */
|
|
self~setLine(RxCalcSqrt(self~GetCheckedLine), MATHERRNO)
|
|
|
|
::method BLOG
|
|
/* Displays the natural logarithm of the checked line */
|
|
self~setLine(RxCalcLog(self~GetCheckedLine), MATHERRNO)
|
|
|
|
::method BLOG10
|
|
/* Displays the 10-base logarithm of the checked line */
|
|
self~setLine(RxCalcLog10(self~GetCheckedLine), MATHERRNO)
|
|
|
|
::method BPI
|
|
/* Displays the number Pi */
|
|
if self~justZero then
|
|
self~setLine(RxCalcPi(), MATHERRNO)
|
|
else self~setLine(self~getLine||RxCalcPi(), MATHERRNO)
|
|
|
|
::method BBACKSPACE
|
|
/* Delete the last character of the line */
|
|
line = self~getLine
|
|
line = line~Left(line~Length - 1)
|
|
if line = '' then /* if the line is empty set it to 0 */
|
|
self~setLine(0)
|
|
else self~setLine(line)
|
|
|
|
::method BCLEAR
|
|
/* Set the line to 0 */
|
|
self~setLine(0)
|
|
|
|
::method BCALC
|
|
/* Interpret the current line = calculate the result */
|
|
interpret 'calcResult =' self~getLine
|
|
self~setLine(calcResult)
|
|
|
|
::method BSINUS
|
|
/* Display the sine of the checked line */
|
|
self~setLine(RxCalcSin(self~getCheckedLine), MATHERRNO)
|
|
|
|
::method BCOSINUS
|
|
/* Display the cosine of the checked line */
|
|
self~setLine(RxCalcCos(self~GetCheckedLine), MATHERRNO)
|
|
|
|
::method BTANGENS
|
|
/* Display the tangent of the checked line */
|
|
self~setLine(RxCalcTan(self~GetCheckedLine), MATHERRNO)
|
|
|
|
::method BARCSIN
|
|
/* Display the arc sine of the checked line */
|
|
self~setLine(RxCalcArcSin(self~GetCheckedLine), MATHERRNO)
|
|
|
|
::method BARCCOS
|
|
/* Display the arc cosine of the checked line */
|
|
self~setLine(RxCalcArcCos(self~GetCheckedLine), MATHERRNO)
|
|
|
|
::method BARCTAN
|
|
/* Display the arc tangent of the checked line */
|
|
self~setLine(RxCalcArcTan(self~GetCheckedLine), MATHERRNO)
|
|
|
|
::method Ok
|
|
/*
|
|
This is the method connected to our exit-button. You don't have to implement it,
|
|
ooDialog supplies a default implementation of the ok method. Note that the ok
|
|
method is always connected to the button with resource ID 1. Note also, that
|
|
once you invoke the superclass ok method, if validate() returns true, the dialog
|
|
will close.
|
|
|
|
This is what the default implementation of ok does: it invokes the validate()
|
|
method. If validate() returns false, then ok() does nothing and just returns.
|
|
If validate() returns true then ok() sets self~initCode to 1 and ends the
|
|
dialog. To end a dialog programatically, the superclass ok or cancel
|
|
methods should always be used.
|
|
|
|
This over-ride sets the calculator display to 0 before ending the dialog. Again,
|
|
this is not necessary, it is just done to demonstrate how to over-ride the ok
|
|
method
|
|
*/
|
|
if \ self~validate then return 0
|
|
|
|
self~setLine(0)
|
|
|
|
return self~ok:super
|