summaryrefslogtreecommitdiff
path: root/ipl/gprocs/viface.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/gprocs/viface.icn')
-rw-r--r--ipl/gprocs/viface.icn421
1 files changed, 421 insertions, 0 deletions
diff --git a/ipl/gprocs/viface.icn b/ipl/gprocs/viface.icn
new file mode 100644
index 0000000..6047cc7
--- /dev/null
+++ b/ipl/gprocs/viface.icn
@@ -0,0 +1,421 @@
+############################################################################
+#
+# File: viface.icn
+#
+# Subject: Procedures for interfacing vidgets
+#
+# Authors: Jon Lipp and Gregg M. Townsend
+#
+# Date: April 1, 1997
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# Utility procedures in this file:
+# VDraw()
+# VErase()
+# VOutline()
+# VResize()
+# VRemove()
+# VInsert()
+# VEvent()
+# VRegister()
+# VUnregister()
+# VOpenDialog()
+# VFormat()
+# VAddClient()
+# VToggle()
+# VUnSet()
+# VSetState() [formerly SetVidget() and VSet()]
+# VGetState()
+# VSetItems()
+# VGetItems()
+# ProcessEvent()
+# GetEvents()
+# VEcho()
+# VSetFont()
+#
+############################################################################
+#
+# Includes: vdefns
+#
+############################################################################
+#
+# Links: vidgets
+#
+############################################################################
+
+link vidgets
+
+$include "vdefns.icn"
+
+procedure VDraw(vid, code)
+ static type
+
+ initial type := proc("type", 0) # protect attractive name
+ if not (type(vid) == !Vrecset ) then
+ _Vbomb("invalid vidget parameter to VDraw()")
+
+ vid.V.draw(vid, code)
+end
+
+procedure VErase(vid)
+ static type
+
+ initial type := proc("type", 0) # protect attractive name
+ if not (type(vid) == !Vrecset) then
+ _Vbomb("invalid vidget parameter to VErase()")
+ if type(vid) == "Vline_rec" then
+ erase_Vline(vid)
+ else
+ EraseArea(vid.win, vid.ax, vid.ay, vid.aw, vid.ah)
+end
+
+procedure VOutline(vid)
+ static type
+
+ initial type := proc("type", 0) # protect attractive name
+ if not (type(vid) == !Vrecset ) then
+ _Vbomb("invalid vidget parameter to VOutline()")
+
+ vid.V.outline(vid)
+end
+
+procedure VResize(vid, x, y, w, h)
+ static type
+
+ initial type := proc("type", 0) # protect attractive name
+ if not (type(vid) == !Vrecset ) then
+ _Vbomb("invalid vidget parameter to VResize()")
+ if type(vid) == "Vline_rec" then {
+ vid.ax1 := \x
+ vid.ay1 := \y
+ vid.ax2 := vid.ax1 + \w
+ vid.ay2 := vid.ay1 + \h
+ }
+ else {
+ vid.ax := \x
+ vid.ay := \y
+ vid.aw := \w
+ vid.ah := \h
+ }
+ vid.V.resize(vid)
+end
+
+procedure VRemove(frame, vid, erase)
+ if not (type(frame) ? find("frame") ) then
+ _Vbomb("invalid frame parameter to VRemove()")
+ else if not (type(vid) == !Vrecset ) then
+ _Vbomb("invalid vidget parameter to VRemove()")
+
+ frame.V.remove(frame, vid, erase)
+end
+
+procedure VInsert(frame, vid, x, y, w, h)
+ static image
+
+ initial image := proc("image", 0) # protect attractive name
+
+ if not (type(frame) ? find("frame") ) then
+ _Vbomb("invalid frame parameter to VInsert()")
+ else if not (type(vid) == !Vrecset ) then
+ _Vbomb("invalid vidget parameter to VInsert(): " || image(vid))
+ else if (\x, not numeric(x) ) then
+ _Vbomb("non-numeric x parameter to VInsert()")
+ else if (\y, not numeric(y) ) then
+ _Vbomb("non-numeric y parameter to VInsert()")
+ else if (\w, not numeric(w) ) then
+ _Vbomb("non-numeric w parameter to VInsert()")
+ else if (\h, not numeric(h) ) then
+ _Vbomb("non-numeric y parameter to VInsert()")
+ frame.V.insert(frame, vid, x, y, w, h)
+end
+
+procedure VEvent(vid, e, x, y)
+ if not (type(vid) == !Vrecset ) then
+ _Vbomb("invalid vidget parameter to VEvent()")
+
+ return vid.V.event(vid, e, x, y)
+end
+
+############################################################################
+# The following two procedure are only for use with dialog box frames
+# and menu_frames.
+#
+# VRegister is analogous to VInsert, except, it tells the dialog box that
+# this is an editable field.
+############################################################################
+procedure VRegister(dialog, vid, x, y, w, h)
+ if not (type(dialog) ? find("dialog_frame") ) then
+ _Vbomb("invalid dialog parameter to VRegister()")
+ else if not (type(vid) == !Vrecset ) then
+ _Vbomb("invalid vidget parameter to VRegister()")
+ else if (\x, not numeric(x) ) then
+ _Vbomb("Non-numeric x parameter to VRegister()")
+ else if (\y, not numeric(y) ) then
+ _Vbomb("Non-numeric y parameter to VRegister()")
+ else if (\w, not numeric(w) ) then
+ _Vbomb("Non-numeric w parameter to VRegister()")
+ else if (\h, not numeric(h) ) then
+ _Vbomb("Non-numeric y parameter to VRegister()")
+
+ dialog.F.register(dialog, vid, x, y, w, h)
+end
+
+procedure VUnregister(dialog, vid)
+ if not (type(dialog) ? find("dialog_frame") ) then
+ _Vbomb("invalid dialog parameter to VUnregister()")
+ else if not (type(vid) == !Vrecset ) then
+ _Vbomb("invalid vidget parameter to VUnregister()")
+
+ dialog.F.unregister(dialog, vid)
+end
+
+#
+# Vopen_dialog
+# Opens a dialog for input. Returns the list of new objects, or the
+# original data if "cancel" was picked.
+#
+# open a dialog box at (x, y); dialog contains a record of type
+# 'dialog', data is a list of initial values corresponding to the
+# objects "registered" with the dialog; default_string is the label
+# of the control button to press upon hitting a return.
+#
+# If x is null and y is not, y is an "ID" for the dialog box, which
+# opens at the default location but can be moved by the user. The
+# location is remembered and applied to subsequent opens.
+#
+procedure VOpenDialog(dialog, x, y, data, default_string)
+ if not (type(dialog) ? find("dialog_frame") ) then
+ _Vbomb("invalid dialog parameter to VOpenDialog()")
+ if \x & not (numeric(x) & numeric(y)) then
+ _Vbomb("invalid x or y parameter passed to VOpenDialog()")
+ /data := []
+ return \(dialog.F.open_dialog(dialog, x, y, data, default_string)) | data
+end
+
+
+#
+# VFormat resizes the frame, and figures out the width and height
+# automatically, contingent on all vidgets being inserted or registered
+# with absolute coordinates.
+#
+procedure VFormat(frame)
+ if not (type(frame) ? find("frame") ) then
+ _Vbomb("invalid frame parameter to VFormat()")
+
+ frame["F"].format(frame)
+end
+
+############################################################################
+# The following procedure is only for use with couplers.
+############################################################################
+
+procedure VAddClient(coupler, client, caller)
+ if not (type(coupler) ? find("coupler") ) then
+ _Vbomb("invalid coupler parameter to VAddClient()")
+
+ coupler.V.add_client(coupler, client, caller)
+end
+
+procedure VToggle(coupler)
+ if not (type(coupler) ? find("coupler") ) then
+ _Vbomb("invalid coupler parameter to VToggle()")
+
+ coupler.V.toggle(coupler)
+end
+
+procedure VUnSet(coupler)
+ if not (type(coupler) ? find("coupler") ) then
+ _Vbomb("invalid coupler parameter to VUnSet()")
+
+ coupler.V.unset(coupler)
+end
+
+procedure VLock(coupler)
+ if not (type(coupler) ? find("coupler") ) then
+ _Vbomb("invalid coupler parameter to VLock()")
+
+ coupler.locked := 1
+end
+
+procedure VUnLock(coupler)
+ if not (type(coupler) ? find("coupler") ) then
+ _Vbomb("invalid coupler parameter to VUnLock()")
+
+ coupler.locked := &null
+end
+
+############################################################################
+# VSetState sets the vidget | coupler to the value.
+############################################################################
+procedure VSetState(vid, val, code)
+ if type(vid) ? find("coupler") then
+ return (\(\vid).V.set)(vid, , val, code)
+ else if type(vid) == !Vrecset then
+ return (\(\vid).V.set_value)(vid, val, code)
+ else
+ _Vbomb("invalid vidget parameter to VSetState()")
+end
+
+procedure SetVidget(vid, val, code) # old name
+ SetVidget := VSetState
+ return VSetState(vid, val, code)
+end
+
+procedure VSet(vid, val, code) # older name
+ VSet := VSetState
+ return VSetState(vid, val, code)
+end
+
+############################################################################
+# VGetState returns the value of the vidget state.
+############################################################################
+procedure VGetState(vid)
+ if type(vid) ? find("scroll" | "slide" | "radio" | "text") then
+ return (\vid.callback).value
+ else if vid.V.set_value === set_value_Vlist then # list vidget
+ return get_value_Vlist(vid)
+ else if type(vid) == "Vbutton_rec" &
+ (vid.V.event === event_Vtoggle) then return(\vid.callback).value
+ else
+ fail
+end
+
+############################################################################
+# VSetItems sets the items displayed by a list vidget.
+############################################################################
+procedure VSetItems(vid, val)
+ if vid.V.set_value === set_value_Vlist then # list vidget
+ return set_items_Vlist(vid, val)
+ else if type(vid) == "Vframe_rec" & type(vid.lookup) == "list" &
+ type(vid.lookup[1]) == "Vmenu_item_rec" then
+ return Vmenu_set_items(vid, val)
+ else
+ fail
+end
+
+############################################################################
+# VGetItems returns the items displayed by a list vidget.
+############################################################################
+procedure VGetItems(vid)
+ if vid.V.set_value === set_value_Vlist then # list vidget
+ return get_items_Vlist(vid)
+ else if type(vid) == "Vframe_rec" & type(vid.lookup) == "list" &
+ type(vid.lookup[1]) == "Vmenu_item_rec" then
+ return Vmenu_get_items(vid)
+ else
+ fail
+end
+
+
+############################################################################
+# Event handlers.
+############################################################################
+
+procedure GetEvents(vidget, missed, all, resize)
+ repeat ProcessEvent(vidget, missed, all, resize)
+end
+
+procedure ProcessEvent(vidget, missed, all, resize)
+ local event, lrv
+
+ type(vidget) ? {
+ if not find("frame")
+ then _Vbomb("invalid frame argument to ProcessEvent()")
+ }
+
+ event := Event(vidget.win)
+
+ if event === &resize then {
+ (\resize)(vidget, event, &x, &y)
+ VEvent(vidget, event, &x, &y)
+ }
+
+ (\(lrv := vidget.V.lookup(vidget,&x,&y)) & lrv.V.event(lrv,event,&x,&y)) |
+ (\missed)(event, &x, &y)
+
+ (\all)(event, &x, &y)
+
+ return event
+
+end
+
+
+############################################################################
+# VEcho(v, x) -- echoing callback routine
+#
+# VEcho can be used as the default callback routine passed to vsetup.
+# It just prints a message on standard output giving the value of x.
+############################################################################
+
+procedure vecho(v, x) # old name
+ vecho := VEcho
+ return VEcho(v, x)
+end
+
+procedure VEcho(v, x)
+ static image
+
+ initial image := proc("image", 0) # protect attractive name
+
+ writes("callback: id=", v.id, ", value=")
+ if type(x) == "list" then {
+ writes("[")
+ writes(image(x[1]))
+ every writes(",", image(x[2 to *x]))
+ writes("]")
+ }
+ else
+ writes(image(x))
+ write()
+ return
+end
+
+
+############################################################################
+# VSetFont(win) -- set vidget font in window.
+#
+# VSetFont tries to set a 7-pixel-wide font for use by VIB and vidgets.
+############################################################################
+
+procedure vsetfont(win) # old name
+ vsetfont := VSetFont
+ return VSetFont(win)
+end
+
+procedure VSetFont(win)
+ local spec, maybe
+
+ /win := &window
+ if WAttrib(win, "fwidth") = VFWidth then
+ return win # existing font is acceptable
+
+ every spec :=
+
+$ifdef _X_WINDOW_SYSTEM
+ "lucidasanstypewriter-bold-12" |
+ "-*-lucidatypewriter-bold-r-*-*-12-*-*-*-*-70-iso8859-1" |
+ "-*-lucidatypewriter-bold-r-*-*-*-*-*-*-*-70-iso8859-1" |
+ "-*-*-r-*-sans-*-*-*-*-m-70-iso8859-1" |
+ "-*-*-r-*-*-*-*-*-*-m-70-iso8859-1" |
+ "-*-*-r-*-*-*-*-*-*-c-70-iso8859-1"
+$else
+ ("mono,bold," | "mono," | "typewriter,") || (12 | 11 | 13 | 10 | 14)
+$endif
+
+ do {
+ Font(win, spec) | next # try a font
+ /maybe := spec # remember first success
+ if WAttrib(win, "fwidth") = VFWidth then
+ return win # this font is right size
+ }
+
+ # No font was the right size. Go back to the first one that was legal.
+ # If nothing works, return with the font unchanged.
+ Font(win, \maybe)
+ return win
+end