//genesis
// xtools.g - revised 8/10/91
int XTOOLSDEBUG // define as non-zero prior to including xtools to
// get debug output
/*
** user functions available in xtools
**
** function arguments
** ======================================================
** xrange path xmin xmax
** yrange path ymin ymax
** graphclock path clock
** overlay path value
** overlaytoggle widget // also in buttons.g
** showgraphics path
** hidegraphics path
** makeconfirm path title yes_script no_script x y
** makepopup path title x y w h [name script ...]
** addpopup path name script [name script ...]
** setgraphscale graph
** showgraphscale graph // orig had y offset of -155
** makegraphscale graph
** fieldbutton path field widget
** quitbutton widget
** cancelquit widget
** setstepsize widget
** stepbutton widget
** formtoggle widget form0 form1
** \
donebutton form // clicks all buttons in form except "DONE"
** makegif path x y w h gif_file title
** textwindow path x y textfile [XREV]
**
*/
function xrange(name, xmin, xmax)
if ({argc} < 3)
echo usage: xrange name xmin xmax
return
end
str name
float xmin, xmax
if ({isa xgraph {name}})
setfield {name} xmin {xmin} xmax {xmax}
else
setfield {name}/##[ISA=xgraph] xmin {xmin} xmax {xmax}
end
end
function yrange(name, ymin, ymax)
if ({argc} < 3)
echo usage: xrange name xmin xmax
return
end
str name
float ymin, ymax
if ({isa xgraph {name}})
setfield {name} ymin {ymin} ymax {ymax}
else
setfield {name}/##[ISA=xgraph] ymin {ymin} ymax {ymax}
end
end
function graphclock(path, clock)
str path
int clock
str num
useclock {path}/##[ISA=xgraph] {clock}
end
function overlay(path, value)
str path
setfield {path}/##[ISA=xgraph] overlay {value}
echo -n "overlay "
if (value == 0)
echo OFF
else
echo ON
end
end
// ==============================================
// toggles the overlaying of graph outputs
// ==============================================
function overlaytoggle(widget)
overlay / {getfield {widget} state}
end
function showgraphics(path)
if ({argc} < 1)
echo usage: showgraphics path
return
end
str path
str name
foreach name ({el {path}/##[ISA=xform]})
xshow {name}
end
end
function hidegraphics(path)
if ({argc} < 1)
echo usage: showgraphics path
return
end
str path
str name
foreach name ({el {path}/##[ISA=xform]})
xhide {name}
end
end
function makeconfirm(path, title, yes_script, no_script, x, y)
if ({argc} < 6)
echo usage: makeconfirm path title yes_script no_script x y
return
end
str path, title, yes_script, no_script
float x, y
create x1form {path}/confirm [{x},{y},200,80] -nolabel
create x1label {path}/confirm/label [0,0,200,30] -title {title}
create x1button {path}/confirm/yes [10,40,80,30] -script \
{yes_script}
create x1button {path}/confirm/no [100,40,80,30] -script {no_script}
disable {path}/confirm
end
function makeconfirm(path, title, yes_script, no_script, x, y)
if ({argc} < 6)
echo usage: makeconfirm path title yes_script no_script x y
return
end
str path, title, yes_script, no_script
float x, y
create x1form {path}/confirm [{x},{y},200,80] -nolabel
create x1label {path}/confirm/label [0,0,200,30] -title {title}
create x1button {path}/confirm/yes [10,40,80,30] -script \
{yes_script}
create x1button {path}/confirm/no [100,40,80,30] -script {no_script}
disable {path}/confirm
end
function makepopup(path, title, x, y, w, h)// name,script,name,script...
if ({argc} < 6)
echo usage: makepopup path title x y w h [name script ...]
return
end
str path, title
float x, y, w, h
int i
int firstitem = 7
int nitems = ({argc} - firstitem + 1)/2
create x1form {path} [{x},{y},{w},{(h + 2)*(nitems + 2)}] -nolabel
create x1label {path}/label [0,0,{w},{h}] -title {title}
create x1button {path}/DONE [0,{h + 2},{w},{h}] -script \
"xhide "{path}
for (i = firstitem; i < {argc}; i = i + 2)
create x1button {path}/item[{(i - firstitem)/2 + 1}] \
[0,{(h + 2)*((i - firstitem)/2 + 2)},{w},{h}] -title \
{argv {i}} -script {argv {i + 1}}
end
disable {path}
xshow {path}
end
function addpopup(path)// name,script,name,script...
if ({argc} < 3)
echo usage: addpopup path name script [name script ...]
return
end
str path, title
float w, h
float formh
int i
int firstitem = 2
int nadds = ({argc} - firstitem + 1)/2
int nitems
// locate the last item in the popup
nitems = 1
while ({exists {path}/item[{nitems}]} == 1)
nitems = nitems + 1
end
// get the width and height from the popup label
w = {getfield {path}/label width}
h = {getfield {path}/label height}
// resize the form
formh = {getfield {path} height}
setfield {path} height {formh + (h + 2)*nadds}
for (i = firstitem; i < {argc}; i = i + 2)
create x1button {path}/item[{(i - firstitem)/2 + nitems}] \
[0,{(h + 2)*((i - firstitem)/2 + nitems + 1)},{w},{h}] \
-title {argv {i}} -script {argv {i + 1}}
end
end
function setgraphscale(graph)
str graph
str form = graph @ "_scaleform"
str xmin = {getfield {form}/xmin value}
str xmax = {getfield {form}/xmax value}
str ymin = {getfield {form}/ymin value}
str ymax = {getfield {form}/ymax value}
setfield {graph} xmin {xmin} xmax {xmax} ymin {ymin} ymax {ymax}
xhide {form}
end
function showgraphscale(form)
if (XTOOLSDEBUG)
echo showgraphscale begin
end
str form
str x, y
// find the parent form
if (XTOOLSDEBUG)
echo " finding parent form"
end
str parent = {el {form}/..}
while (!{isa xform {parent}})
parent = {el {parent}/..}
end
if (XTOOLSDEBUG)
echo " getting parent geometry"
end
x = {getfield {parent} xgeom}
y = {getfield {parent} ygeom}
if (XTOOLSDEBUG)
echo " setting graphscale geometry"
end
setfield {form} xgeom {x} ygeom {y}
if (XTOOLSDEBUG)
echo " showing graphscale"
end
xshow {form}
if (XTOOLSDEBUG)
echo showgraphscale end
end
end
function makegraphscale(graph)
if ({argc} < 1)
echo usage: makegraphscale graph
return
end
str graph
str graphName = {getpath {graph} -tail}
float x, y
str form = graph @ "_scaleform"
str parent = {el {graph}/..}
while (!{isa xform {parent}})
parent = {el {parent}/..}
end
x = {getfield {graph} x}
y = {getfield {graph} y}
create x1button {graph}_scalebutton \
[{getfield {graph} xgeom},{getfield {graph} ygeom},50,25] -title scale -script \
"showgraphscale "{form}
create x1form {form} [{x},{y},180,170] -nolabel
disable {form}
pushe {form}
create x1button DONE [10,10,50,15] -script "setgraphscale "{graph}
create x1button CANCEL [70,10,50,15] -script "xhide "{form}
create x1dialog xmin [10,35,160,25] -value {getfield {graph} xmin}
create x1dialog xmax [10,65,160,25] -value {getfield {graph} xmax}
create x1dialog ymin [10,95,160,25] -value {getfield {graph} ymin}
create x1dialog ymax [10,125,160,25] -value {getfield {graph} ymax}
pope
end
// ==============================================
// sets the field of the specified element
// ==============================================
function fieldbutton(path, field, widget)
str path, field, widget
setfield {path} {field} {getfield {widget} value}
echo {path} {field} = {getfield {widget} value}
end
function quitbutton(widget)
str widget
// display the confirmation widget
xshowontop {widget}/confirm
end
function cancelquit(widget)
str widget
// hide the confirmation widget
xhide {widget}/..
end
// ==============================================
// sets the global simulation clock
// ==============================================
function setstepsize(widget)
str widget
float dt = ({getfield {widget} value})
setclock 0 {dt}
echo dt = {dt}
adjustspike
end
// ==============================================
// advances the simulation by the amount of time given in the dialog
// ==============================================
function stepbutton(widget)
str widget
echo step -t {getfield {widget} value}
step {getfield {widget} value} -time
end
// ==============================================
// toggles the display of two forms
// ==============================================
function formtoggle(widget, form0, form1)
if ({getfield {widget} state} == 1)
xshow {form1}
xhide {form0}
else
xshow {form0}
xhide {form1}
end
end
//==================================================================
// Clicks all buttons in form except "DONE"
// (used with a menu containing dialog boxes to send all values)
//==================================================================
function donebutton(form)
str form, button
foreach button ({el {form}/#}) // returns full paths
if (({getpath {button} -tail}) != "DONE") // looks at tail of each
xsendevent {button} click1
end
end
xhide {form}
end
//=====================================================================
// makegif(formpath,x,y,image_width,image_height,gif_file,title)
// Creates a form to display a GIF file with label and "DONE" button
// The form will have width=image_width+10 and height=image_height+25
//=====================================================================
function makegif(formpath, x, y, image_width, image_height, gif_file, \
title)
str formpath, gif_file, title
int x, y, image_width, image_height
create x1form {formpath} \
[{x},{y},{image_width + 10},{image_height + 25}] -nolabel
create x1label {formpath}"/titlebar" [5,0,{image_width},20] -title \
{title}
create x1button {formpath}"/DONE" [15,3,80,15] -script \
"xhide "{formpath}
create x1image {formpath}"/image" [5,20,{image_width},{image_height}]
setfield ^ wx {image_width} wy {image_height} filename {gif_file}
end
str XREV
//XREV = "R3"
// global variable for setting width of text display from X11 revision #
// "R4" will be assumed if it is not explicitly set to "R3"
/*
The function "textwindow" creates a form 580 pixels wide and 336 pixels high
at x,y to display the specified text file with scrolling and paging. Using
the default font for X11R4, this provides room for 24 lines with 78
characters per line and a one character right and left margin. (The left
margin is provided automatically.) X11R3 uses a smaller font for both the
xtext widget and the xlabel widget, however. In addition, it does not
usually provide a scroll bar with the xtext widget. Thus, in order to
accomodate the same number of characters, a form width of 480 pixels can be
used. "textwindow" uses an optional argument "XREV" to determine the proper
width and also allows the size of the text window to be resized along with
the parent form. If this argument is not specified, the larger width
appropriate to X11R4 is used. When displaying X11R4 windows on a DECstation
with its large fonts, an even wider width of 810 should be used. This can
either be changed below, or the window may be rescaled after it appears.
*/
//=====================================================================
// textwindow(formpath,x,y,textfile,[XREV])
// creates a form 580 pixels wide and 336 pixels high at x,y to display
// the specified text file with scrolling and paging
//=====================================================================
function textwindow(formpath, x, y, textfile)
str formpath, textfile, XREV
int x, y, width, height
height = 336
XREV = "R4"
// the default width will be the large one for X11 R4 fonts
width = 580
if ({argc} > 4) // look for a 5th argument
XREV = $5
end
// if not explicitly R3, play it safe and use larger R4 width
if ((XREV) == "R3")
// for X11R3 fonts
width = 490
end
create x1form {formpath} [{x},{y},{width},{height}] -nolabel
pushe {formpath}
create x1label textbar [40,0,{100*(width - 40)/width}%,20] -title \
"b/f - back/forward by page | j/k - by line | a/z - begin/end"
create x1button DONE [0,0,40,20] -script "xhide "{formpath}
create x1text text [0%,20,100%,94%] -file {textfile}
pope
end