summaryrefslogtreecommitdiff
path: root/ipl/gprocs/select.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/gprocs/select.icn')
-rw-r--r--ipl/gprocs/select.icn99
1 files changed, 99 insertions, 0 deletions
diff --git a/ipl/gprocs/select.icn b/ipl/gprocs/select.icn
new file mode 100644
index 0000000..9557c00
--- /dev/null
+++ b/ipl/gprocs/select.icn
@@ -0,0 +1,99 @@
+############################################################################
+#
+# File: select.icn
+#
+# Subject: Procedure to get selection from window
+#
+# Author: Ralph E. Griswold
+#
+# Date: August 30, 1996
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+#
+#
+############################################################################
+#
+# Requires: Version 9 graphics
+#
+############################################################################
+#
+# Links: grecords
+#
+############################################################################
+
+link grecords
+
+procedure select(win) #: interactive selection from window
+ local x0, x1, y0, y1, w, h, state, event
+
+ /win := &window
+
+ WAttrib(win, "drawop=reverse")
+ WAttrib(win, "linestyle=onoff")
+
+ state := "wait"
+
+ while event := Event(win) do {
+ if event == "q" then {
+ DrawRectangle(win, \x0, y0, 0, 0) # clear if already drawn
+ fail
+ }
+ case state of {
+ "wait": { # waiting for selection
+ case event of {
+ &lpress: {
+ x1 := x0 := &x # initial coordinates
+ y1 := y0 := &y
+ DrawRectangle(win, x0, y0, 0, 0) # start selection
+ state := "select" # now select the rectangle
+ }
+ }
+ }
+ "select": { # select the rectangle
+ case event of {
+ &ldrag: { # selecting ...
+ DrawRectangle(win, x0, y0, x1 - x0, y1 - y0) # erase
+ x1 := &x # new opposite corner
+ y1 := &y
+ DrawRectangle(win, x0, y0, x1 - x0, y1 - y0) # draw
+ }
+ &lrelease: { # got it!
+ DrawRectangle(win, x0, y0, x1 - x0, y1 - y0) # erase
+ x1 := &x # new opposite corner
+ y1 := &y
+ if (x0 = x1) | (y0 = y1) then # no area
+ state := "wait"
+ else {
+ w := x1 - x0 # set up for action
+ h := y1 - y0
+ DrawRectangle(win, x0, y0, w, h) # draw rectangle
+ state := "act" # now do something
+ }
+ }
+ }
+ }
+ "act": {
+ case event of {
+ "n": { # new selection
+ state := "wait"
+ DrawRectangle(win, x0, y0, w, h) # try again
+ }
+ "q": { # quit
+ DrawRectangle(win, x0, y0, w, h)
+ fail
+ }
+ "r": { # return selection
+ DrawRectangle(win, x0, y0, w, h) #
+ return rect(x0, y0, w, h)
+ }
+ }
+ }
+ }
+ }
+
+end