| /* |
| ooRexx (FOSS): <http://www.ooRexx.org> |
| BSF4Rexx (FOSS): <http://wi.wu-wien.ac.at/rgf/rexx/bsf4rexx/current/> or |
| eventually at <https://sourceforge.net/projects/bsf4rexx> |
| |
| ------------------------ Apache Version 2.0 license ------------------------- |
| Copyright (C) 2001-2006 Rony G. Flatscher |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| ----------------------------------------------------------------------------- |
| */ |
| |
| /********************************************************* |
| * A simple four function calculator, written in REXX * |
| *********************************************************/ |
| |
| /* *** create a res window */ |
| res = .bsf~new("java.awt.TextField", 0) |
| |
| |
| /* *** create a panel of buttons */ |
| panel = .bsf~new("java.awt.Panel") |
| panel~setLayout(.bsf~new("java.awt.GridLayout", 4, 4)) |
| |
| buttons = "789*456/123-C0.+" |
| do i=1 to buttons~length |
| label=buttons~substr(i, 1) |
| button=.bsf~new("java.awt.Button", label) |
| panel~add(button) |
| |
| if "*/-+"~pos(label)>0 then |
| button~bsf.addEventListener("action", "", "call op '" ||label||"'") |
| |
| else if label="C" then |
| button~bsf.addEventListener("action", "", "call clear") |
| |
| else |
| button~bsf.addEventListener("action", "", "call press" label) |
| end |
| |
| |
| /* *** Place everything in the frame */ |
| frame = .bsf~bsf.lookupBean("frame") |
| frame~~setTitle("Object Rexx Calc") ~~resize(130, 200) |
| frame~~add("North", res) ~~add("Center", panel) ~~validate ~~show |
| frame~bsf.addEventListener("window", "windowClosing", "call bsf 'exit'") |
| |
| /* *** Initialize the state of the calculator */ |
| mem = 0 |
| nextOp = "+" |
| autoClear = 1 /* true */ |
| |
| do forever /* get eventText and execute it as a Rexx program */ |
| interpret .bsf~bsf.pollEventText |
| end |
| exit |
| |
| |
| press: /* handle data entry keys */ |
| parse arg key |
| |
| if autoClear then |
| res~bsf.invokestrict("setText", "str", 0) |
| |
| if res~getText=="0" & key<>"." then |
| res~bsf.invokeStrict("setText", "str", "") |
| -- res~setText("str", "") |
| |
| if key="." then |
| if pos(".", res~getText)>0 then |
| key="" |
| |
| -- res~setText("str", res~getText || key) |
| res~bsf.invokeStrict("setText", "str", res~getText || key) |
| |
| autoClear=0 /* set it to false */ |
| return |
| |
| /* *** handle arithmetic keys */ |
| op: |
| parse arg key |
| num=res~getText |
| if nextOp="+" then mem=mem+num |
| else if nextOp="-" then mem=mem-num |
| else if nextOp="*" then mem=mem*num |
| else if nextOp="/" & num<>0 then mem=mem/num |
| nextOp=key |
| -- res~setText("str", mem) |
| res~bsf.invokeStrict("setText", "str", mem) |
| autoClear=1 /* set to true */ |
| return |
| |
| /* handle the "C" key */ |
| clear: |
| mem=0 |
| nextOp="" |
| -- res~setText("str", 0) |
| res~bsf.invokeStrict("setText", "str", 0) |
| return |
| |
| ::requires BSF.CLS -- add Object Rexx proxy support |
| |