home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
ipl
/
gprocs
/
dsetup.icn
< prev
next >
Wrap
Text File
|
2001-05-02
|
8KB
|
294 lines
############################################################################
#
# File: dsetup.icn
#
# Subject: Procedures for creating dialog boxes
#
# Authors: Gregg M. Townsend and Ralph E. Griswold
#
# Date: May 2, 2001
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# dsetup(win, wlist) initializes a set of widgets according to
# a list of specifications created by the interface editor VIB.
#
# win can be an existing window, or null.
#
# wlist is a list of specifications; the first must be the Sizer and
# the last may be null. Each specification is itself a list consisting
# of a specification string, a callback routine, and an optional list
# of additional specifications. Specification strings vary by vidget
# type, but the general form is "ID:type:style:n:x,y,w,h:label".
#
# dsetup() returns a table of values from the dialog, indexed by ID.
#
############################################################################
#
# Includes: vdefns
#
############################################################################
#
# Links: dialog, xio, xutils,
# vidgets, vslider, vmenu, vscroll, vtext, vbuttons, vradio
# vdialog
#
############################################################################
$include "vdefns.icn"
link dialog
link vdialog
link vidgets
link vslider
link vmenu
link vscroll
link vtext
link vbuttons
link vradio
link vsetup
record DL_rec(var, typ, sty, num, x, y, w, h, lbl, cbk, etc)
record DL_state(dialog, list, deflabel)
global did_list, did_label
## dsetup(win, wlist) -- set up vidgets and return table of handles
#
# wlist is a list of vidget specs as constructed by vib (or uix).
procedure dsetup(win, wlist[])
local r, dialog, obj, num, wspec, alist
if type(win) ~== "window" then
win := &window
win := Clone(win, "fg=black", "linewidth=1", "linestyle=solid",
"fillstyle=solid", "drawop=copy") # clone window with standard attribs
VSetFont(win) # set standard VIB font
if ColorValue(Bg(win)) == ("65535,65535,65535" | "0,0,0") then
Bg(win, VBackground) # change black or white bg to pale gray
while /wlist[-1] do # ignore trailing null elements
pull(wlist)
wspec := get(wlist) # first spec gives wdow size
r := DL_crack(wspec) | stop("dsetup: bad spec")
did_list := []
did_label := &null
dialog := Vdialog(win, 0, 0) # create dialog frame
dialog.id := r.var
VInsert(dialog, Vmessage(win, ""), # set dialog box dimensions
r.x + r.w - 1, r.y + r.h - WAttrib(win, "fheight") - 1)
every r := DL_crack(!sort(wlist), &null) do {
DL_obj(win, dialog, r) # insert other vidgets
}
VFormat(dialog) # create the dialog
return DL_state(dialog, did_list, did_label) # return state for dpopup()
end
procedure dpopup(win, dftbl, dstate)
local did_list, init_list, i
if type(win) ~== "window" then {
win :=: dftbl
}
/dftbl := table()
did_list := dstate.list
init_list := list(*did_list)
every i := 1 to *did_list do
init_list[i] := \dftbl[did_list[i]]
dialog_value := VOpenDialog(dstate.dialog, , dstate.dialog.id,
init_list, dstate.deflabel)
every i := 1 to *did_list do
dftbl[did_list[i]] := dialog_value[i]
dialog_value := dftbl
return dialog_button
end
## DL_crack(wspec, cbk) -- extract elements of spec and put into record
#
# cbk is a default callback to use if the spec doesn't supply one.
procedure DL_crack(wspec, cbk)
local r, f
r := DL_rec()
(get(wspec) | fail) ? {
r.var := tab(upto(':')) | fail; move(1)
r.typ := tab(upto(':')) | fail; move(1)
r.sty := tab(upto(':')) | fail; move(1)
r.num := tab(upto(':')) | fail; move(1)
r.x := tab(upto(',')) | fail; move(1)
r.y := tab(upto(',')) | fail; move(1)
r.w := tab(upto(',')) | fail; move(1)
r.h := tab(upto(':')) | fail; move(1)
r.lbl := tab(0)
}
get(wspec) # skip callback field
r.cbk := cbk # always use parameter
r.etc := get(wspec)
return r
end
## DL_obj(win, dialog, r) -- create vidget depending on type
procedure DL_obj(win, dialog, r)
local obj, gc, style, lo, hi, iv, args
case r.typ of {
"Label" | "Message": {
obj := Vmessage(win, r.lbl)
VInsert(dialog, obj, r.x, r.y, r.w, r.h)
}
"Line": {
obj := Vline(win, r.x, r.y, r.w, r.h)
VInsert(dialog, obj, r.x, r.y, 1, 1)
}
# "Rect": { # doesn't work
# gc := Clone(win)
# if r.num == "" | r.num = 0 then
# r.num := &null
# obj := Vpane(gc, r.cbk, r.var, r.num)
# VInsert(dialog, obj, r.x, r.y, r.w, r.h)
# }
"Rect": &null
"List": &null
"Check": {
obj := Vcheckbox(win, r.cbk, r.var, r.w)
VInsert(dialog, obj, r.x, r.y, r.w, r.h)
}
"Button": {
style := case r.sty of {
"regular": V_RECT
"regularno":V_RECT_NO
"check": V_CHECK
"checkno": V_CHECK_NO
"circle": V_CIRCLE
"circleno": V_CIRCLE_NO
"diamond": V_DIAMOND
"diamondno":V_DIAMOND_NO
"xbox": V_XBOX
"xboxno": V_XBOX_NO
default: V_RECT
}
if r.num == "1" then { # toggle
put(did_list, r.var)
obj := Vtoggle(win, r.lbl, r.cbk, r.var, style, r.w, r.h)
VRegister(dialog, obj, r.x, r.y)
}
else { # dismiss
obj := Vbutton(win, r.lbl, dialog_cb, V_OK, style, r.w, r.h)
VInsert(dialog, obj, r.x, r.y)
if r.num == "-1" then
did_label := r.lbl
}
}
"Choice": {
obj := Vradio_buttons(win, r.etc, r.cbk, r.var, V_DIAMOND_NO)
put(did_list, r.var)
VRegister(dialog, obj, r.x, r.y)
}
"Slider" | "Scrollbar" : {
r.lbl ? {
lo := numeric(tab(upto(',')))
move(1)
hi := numeric(tab(upto(',')))
move(1)
iv := numeric(tab(0))
}
if r.num == "" then
r.num := &null
obj := case (r.sty || r.typ) of {
"hSlider":
Vhoriz_slider(win, r.cbk, r.var, r.w, r.h, lo, hi, iv, r.num)
"vSlider":
Vvert_slider(win, r.cbk, r.var, r.h, r.w, hi, lo, iv, r.num)
"hScrollbar":
Vhoriz_scrollbar(win, r.cbk, r.var, r.w, r.h, lo, hi, , , r.num)
"vScrollbar":
Vvert_scrollbar(win, r.cbk, r.var, r.h, r.w, hi, lo, , , r.num)
}
put(did_list, r.var)
VRegister(dialog, obj, r.x, r.y)
}
"Text": {
obj := Vtext(win, r.lbl, r.cbk, r.var, r.num)
put(did_list, r.var)
VRegister(dialog, obj, r.x, r.y)
}
# "Menu": {
# obj := Vmenu_bar(win, r.lbl, DL_submenu(win, r.etc, r.cbk))
# VInsert(dialog, obj, r.x, r.y)
# }
"Menu": &null
default: {
stop("dsetup: unrecognized object: ", r.typ)
fail
}
}
return obj
end
## DL_submenu(win, lst, cbk) -- create submenu vidget
procedure DL_submenu(win, lst, cbk)
local a, c, lbl
a := [win]
while *lst > 0 do {
put(a, get(lst))
if type(lst[1]) == "list" then
put(a, DL_submenu(win, get(lst), cbk))
else
put(a, cbk)
}
return Vsub_menu ! a
end
## dproto(proc, font, w, h) -- prototype a dialog box procedure built by vib
#
# n.b. "font" is now ignored, although it was once significant.
procedure dproto(proc, font, w, h)
local win, s, l
w <:= 150
h <:= 100
win := Window([], "canvas=hidden")
VSetFont(win)
repeat {
if write(image(proc), " returned ", image(proc(win))) then {
l := sort(dialog_value, 3)
while write(" dialog_value[\"", get(l), "\"] = ", image(get(l)))
}
else
write(image(proc), " failed")
if TextDialog(win,"Test prototype",,,,["Again","Quit"]) == "Quit" then
break
}
WClose(win)
end