diff options
Diffstat (limited to 'ipl/gprocs/vquery.icn')
-rw-r--r-- | ipl/gprocs/vquery.icn | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/ipl/gprocs/vquery.icn b/ipl/gprocs/vquery.icn new file mode 100644 index 0000000..8696153 --- /dev/null +++ b/ipl/gprocs/vquery.icn @@ -0,0 +1,194 @@ +############################################################################ +# +# File: vquery.icn +# +# Subject: Procedures for window queries +# +# Author: Jon Lipp +# +# Date: May 2, 2001 +# +############################################################################ +# +# This file is in the public domain. +# +############################################################################ +# +# Utility procedures in this file: Vchoice(), Vinput() +# +############################################################################ +# +# Requires: Version 9 graphics +# +############################################################################ +# +# Links: vidgets, vbuttons, vtext +# +############################################################################ + +link vidgets +link vbuttons +link vtext + +procedure Vchoice(str, buttons[]) +local win, root, t, u, w, b, i, x, y, rv +local button_pos, def_button, old, event +static wpad, hwpad +static temp, PAD, WINX, WINY +initial { + temp := open("vchoice", "g", "canvas=hidden") + PAD := integer(WAttrib(temp, "fheight") + 10) + WINX := integer(WAttrib(temp, "displaywidth") / 2) + WINY := integer(WAttrib(temp, "displayheight") / 2) + + wpad := 30 + hwpad := wpad/2 +} + + if *buttons = 0 then buttons := [" Yes ", " No "] + t := TextWidth(temp, str) + u := 0 + every b := !buttons do + u +:= TextWidth(temp, \b) + 13 + w := ((u > t, u) | t) + wpad + + win := vquery_open_window("choose", WINX-w/2, WINY-PAD, w, 2*PAD+wpad) + root := Vroot_frame(win) + VResize(root) + + Vmessage(root, hwpad + (w-wpad-t)/2, hwpad, win, str) + x := hwpad + (w-wpad-u)/2; y := -hwpad + button_pos := table() + every i := 1 to *buttons do { + t := Vbutton(root, x, y, win, buttons[i], , i) + x +:= t.aw+5 + button_pos[i] := xywh_rec(t.ax-2, t.ay-2, t.aw+4, t.ah+4) + } + VDraw(root) + + def_button := 1 + old := button_pos[def_button] + DrawRectangle(win, old.x, old.y, old.w, old.h) + + repeat { + rv := &null + case event := Event(win) of { + -10: next + "\r": { + rv := def_button + break + } + "\t" : { + WAttrib(win, "drawop=reverse") + DrawRectangle(win, old.x, old.y, old.w, old.h) + def_button +:= 1 + def_button := (def_button > *buttons, 1) + old := button_pos[def_button] + WAttrib(win, "drawop=copy") + DrawRectangle(win, old.x, old.y, old.w, old.h) + } + default : { + rv := VEvent(root, event, &x, &y) + (\rv, break) + } + } # end case + } + close(win) + return rv + +end +record xywh_rec(x, y, w, h) + +procedure Vinput(str, def_value) +local win, root, t, u, w, b, i, x, y, rv +local buttons, v, input_vidget, ok, cancel +local button_pos, def_button, old, lrv, event +static temp, PAD, WINX, WINY, FW, VTEXT_W +static wpad, hwpad, ID_OK, ID_CANCEL +initial { + temp := WOpen("canvas=hidden") + PAD := integer(WAttrib(temp, "fheight") + 10) + WINX := integer(WAttrib(temp, "displaywidth") / 2) + WINY := integer(WAttrib(temp, "displayheight") / 2) + FW := integer(WAttrib(temp, "fwidth")) + + wpad := 30 + hwpad := wpad/2 + ID_OK := -11 + ID_CANCEL := -12 + VTEXT_W := 20 +} + + /str := "" + /def_value := "" + buttons := [" Ok ", "Cancel"] + v := FW * VTEXT_W + 8 + t := TextWidth(temp, str) + u := 0 + every b := !buttons do + u +:= TextWidth(temp, b) + 13 + w := vquery_maximum(t, u, v) + wpad + + win := vquery_open_window("choose", WINX-w/2, WINY-PAD, w, 3*PAD+wpad) + root := Vroot_frame(win) + VResize(root) + + t := Vmessage(root, hwpad + (w-wpad-t)/2, hwpad, win, str) + input_vidget := Vtext(root, hwpad+(w-wpad-v)/2, hwpad+t.ah+5, win, "\\="||def_value , , , VTEXT_W) + x := hwpad + (w-wpad-u)/2; y := -hwpad + ok := Vbutton(root, x, y, win, buttons[1], , ID_OK) + x +:= ok.aw+5 + cancel := Vbutton(root, x, y, win, buttons[2], , ID_CANCEL) + + button_pos := table() + button_pos[ID_OK] := xywh_rec(ok.ax-2, ok.ay-2, ok.aw+4, ok.ah+4) + button_pos[ID_CANCEL] := xywh_rec(cancel.ax-2, cancel.ay-2, cancel.aw+4, cancel.ah+4) + + VDraw(root) + def_button := ID_OK + old := button_pos[def_button] + DrawRectangle(win, old.x, old.y, old.w, old.h) + + repeat { + lrv := rv := &null + case event := Event(win) of { + -10 : next + "\r" : { + rv := def_button + break + } + "\t": { + WAttrib(win, "drawop=reverse") + DrawRectangle(win, old.x, old.y, old.w, old.h) + def_button := (def_button = ID_OK, ID_CANCEL) | ID_OK + old := button_pos[def_button] + WAttrib(win, "drawop=copy") + DrawRectangle(win, old.x, old.y, old.w, old.h) + } + + default: { + lrv := root.V.lookup(root, &x, &y) + /lrv := input_vidget + rv := (lrv).V.event(lrv, event, &x, &y) + if rv === (ID_OK | ID_CANCEL) then break + } + } # end case + } + close(win) + return (rv = ID_OK, input_vidget.data) | &null + +end + +procedure vquery_maximum(l[]) + return sort(l)[-1] +end +procedure vquery_open_window(title, x, y, w, h) +local win + + /x := 50; /y := 50; /w := 400; /h := 400 + win := open(title, "g", "pos="||x||","||y, "width="||w, "height="||h) | + _Vbomb("couldn't open window") + + return win +end + |