summaryrefslogtreecommitdiff
path: root/ipl/gpacks/vib/vibbttn.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/gpacks/vib/vibbttn.icn')
-rw-r--r--ipl/gpacks/vib/vibbttn.icn220
1 files changed, 220 insertions, 0 deletions
diff --git a/ipl/gpacks/vib/vibbttn.icn b/ipl/gpacks/vib/vibbttn.icn
new file mode 100644
index 0000000..362b807
--- /dev/null
+++ b/ipl/gpacks/vib/vibbttn.icn
@@ -0,0 +1,220 @@
+############################################################################
+#
+# vibbttn.icn -- procedures for defining a button object
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+
+$include "vibdefn.icn"
+
+##########################################################################
+# button_obj:
+# v : vidget used for drawing text input object
+# proc : name of user callback procedure
+# id : unique means of identifying instance
+# x,y,w,h : bounding box
+# label : button label
+# style : button style
+# toggle : is this a toggle button?
+# dflt : is this button the default in a dialog box?
+# focus : should focus lines be drawn around this object?
+##########################################################################
+record button_obj(v, proc, id, x, y, w, h,
+ label, style, toggle, dflt, focus)
+
+
+##########################################################################
+# create_button() creates a button instance and draws the button if
+# it is a first class object.
+##########################################################################
+procedure create_button(x, y, w, h, label, style, toggle, dflt)
+ local r, id
+
+ id := next_id("button")
+ /style := DEFAULT_BUTTON_STYLE
+ r := button_obj(, "button_cb" || id, "button" || id,
+ x, y, w, h, label, style, toggle, dflt, 0)
+ r.v := Vbutton(ROOT, x, y, APPWIN, label, , id, style, w, h)
+ VRemove(ROOT, r.v, 1)
+ return r
+end
+
+##########################################################################
+# draw_button() draws the given button in that button's style.
+##########################################################################
+procedure draw_button(r)
+ VResize(r.v, r.x, r.y, r.w, r.h)
+ VDraw(r.v)
+ if \r.dflt then
+ BevelRectangle(APPWIN, r.x - 4, r.y - 4, r.w + 8, r.h + 8, -2)
+ return r
+end
+
+##########################################################################
+# update_button_bb() updates various attributes of the button that
+# change when the button is resized, etc.
+##########################################################################
+procedure update_button_bb(r)
+ local tempy, temph, vpad, hpad, sp, sz
+
+ vpad := 4 # vertical padding
+ hpad := 7 # horizontal padding
+ sp := 11 # space between circle/box and text
+ r.w <:= MIN_W
+ r.h <:= MIN_H
+ case r.style of {
+ "check" | "circle" | "checkno" | "circleno": {
+ sz := integer(WAttrib(APPWIN, "fheight") * 0.75)
+ r.w <:= sz + sp + TextWidth(APPWIN, r.label) + hpad
+ r.h <:= WAttrib(APPWIN, "fheight") + vpad
+ }
+ "regular" | "regularno": {
+ r.w <:= TextWidth(APPWIN, r.label) + hpad
+ r.h <:= WAttrib(APPWIN, "fheight") + vpad
+ }
+ "xbox" | "xboxno": {
+ r.w <:= r.h
+ r.h <:= r.w
+ r.label := &null
+ }
+ }
+end
+
+##########################################################################
+# load_button() restores a button object from session code.
+##########################################################################
+procedure load_button(r, o)
+ r.label := o.lbl
+ r.style := o.sty
+ case o.num of {
+ "1": r.toggle := 1
+ "-1": r.dflt := 1
+ }
+ r.v := Vbutton(ROOT, r.x, r.y, APPWIN, r.label, , r.id, r.style, r.w, r.h)
+ VRemove(ROOT, r.v, 1)
+end
+
+##########################################################################
+# load_xbox() makes an xbox button object from an old checkbox entry.
+##########################################################################
+procedure load_xbox(r, o)
+ r.label := ""
+ r.style := "xbox"
+ r.toggle := 1
+end
+
+##########################################################################
+# save_button() augments the record for saving a button object.
+##########################################################################
+procedure save_button(r, o)
+ r.typ := "Button"
+ r.lbl := o.label
+ r.sty := o.style
+ if \o.dflt then
+ r.num := -1
+ else
+ r.num := o.toggle
+ return
+end
+
+##########################################################################
+# display_button_atts() displays the attribute sheet with the current
+# attributes for the given button instance.
+##########################################################################
+procedure display_button_atts(object)
+ local s, o, t, d
+
+ d := object.dflt
+
+ s := object.style
+ o := 1
+ if s[-2:0] == "no" then {
+ s := s[1:-2]
+ o := &null
+ }
+
+ t := table()
+ t["_style"] := s
+ t["_outline"] := o
+ t["_toggle"] := object.toggle
+ t["_dflt"] := object.dflt
+ t["a_label"] := object.label
+ t["b_id"] := object.id
+ t["c_callback"] := object.proc
+ t["d_x"] := object.x
+ t["e_y"] := object.y - CANVASY
+ t["f_width"] := object.w
+ t["g_height"] := object.h
+
+ repeat {
+ if button_dialog(t) == "Cancel" then
+ fail
+
+ if illegal(t["a_label"], "Label", "l") |
+ illegal(t["b_id"], "ID", "s") |
+ illegal(t["c_callback"], "Callback", "p") |
+ illegal(t["d_x"], "X", "i") |
+ illegal(t["e_y"], "Y", "i") |
+ illegal(t["f_width"], "Width", MIN_W) |
+ illegal(t["g_height"], "Height", MIN_H)
+ then
+ next
+
+ if t["_style"] ? ="xbox" & *t["a_label"] > 0 then {
+ Notice("No text is allowed with xbox style")
+ next
+ }
+ if \t["_toggle"] & \t["_dflt"] then {
+ Notice("A toggle button cannot be a dialog default")
+ next
+ }
+
+ object.style := t["_style"]
+ if /t["_outline"] then
+ object.style ||:= "no"
+
+ object.dflt := t["_dflt"]
+ object.toggle := t["_toggle"]
+ object.label := t["a_label"]
+ object.id := t["b_id"]
+ object.proc := t["c_callback"]
+
+ object.v.style := object.style
+ object.v.s := object.label
+
+ unfocus_object(object)
+ if /object.dflt & \d then # remove default frame
+ EraseArea(object.x - 4, object.y - 4, object.w + 8, object.h + 8)
+ move_object(object,
+ t["d_x"], t["e_y"] + CANVASY, t["f_width"], t["g_height"])
+ focus_object(object)
+ break
+ }
+end
+
+#===<<vib:begin>>=== modify using vib; do not remove this marker line
+procedure button_dialog(win, deftbl)
+static dstate
+initial dstate := dsetup(win,
+ ["button_dialog:Sizer::1:0,0,392,240:",],
+ ["_cancel:Button:regular::211,189,50,30:Cancel",],
+ ["_dflt:Button:check:1:245,148,125,20:dialog default",],
+ ["_okay:Button:regular:-1:141,189,50,30:Okay",],
+ ["_outline:Button:check:1:245,85,76,20:outline",],
+ ["_style:Choice::4:142,85,78,84:",,
+ ["regular","check","circle","xbox"]],
+ ["_toggle:Button:check:1:245,116,76,20:toggle",],
+ ["a_label:Text::40:13,14,360,19:label: \\=",],
+ ["b_id:Text::40:13,35,360,19:ID: \\=",],
+ ["c_callback:Text::40:13,56,360,19:callback: \\=",],
+ ["d_x:Text::3:13,85,101,19: x: \\=",],
+ ["e_y:Text::3:13,106,101,19: y: \\=",],
+ ["f_width:Text::3:13,131,101,19: width: \\=",],
+ ["g_height:Text::3:13,152,101,19: height: \\=",],
+ )
+return dpopup(win, deftbl, dstate)
+end
+#===<<vib:end>>=== end of section maintained by vib