(FILECREATED "28-Jul-86 14:27:36" {ERIS}<LISPCORE>LIBRARY>DINFO.;28 69255
changes to: (VARS DINFOCOMS)
previous date: "16-Jul-86 10:30:03" {ERIS}<LISPCORE>LIBRARY>DINFO.;27)
(* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.)
(PRETTYCOMPRINT DINFOCOMS)
(RPAQQ DINFOCOMS ((FILES TEDIT GRAPHER FREEMENU)
(COMS (DECLARE: EVAL@COMPILE DONTCOPY (RECORDS DINFOGRAPH DINFONODE)
(MACROS DINFOGRAPHPROP))
(INITRECORDS DINFOGRAPH))
(FNS (* Primary functions)
DINFO DINFO.UPDATE DINFOGRAPH DINFO.SPECIAL.UPDATE DINFO.READ.GRAPH
DINFO.WRITE.GRAPH DINFO.SELECT.GRAPH DINFO.DEFAULT.MENU DINFO.FIND
DINFO.LOOKUP)
(FNS (* Koto compatability)
DINFO.READ.KOTO.GRAPH)
(FNS (* Window functions)
DINFO.SETUP.WINDOW DINFO.CLOSEFN DINFO.SHRINKFN DINFO.EXPANDFN DINFO.ICONFN)
(FNS (* FreeMenu functions)
DINFO.ADD.FMENU DINFO.CREATE.FMENU DINFO.FMW.CLOSEFN DINFO.FMENU.HANDLER
DINFO.UPDATE.FMENU DINFO.TOGGLE.MENU DINFO.TOGGLE.GRAPH DINFO.TOGGLE.HISTORY
DINFO.TOGGLE.TEXT)
(FNS (* Other menu functions)
DINFO.UPDATE.MENU.DISPLAY DINFO.UPDATE.FROM.MENU DINFO.UPDATE.HISTORY
DINFO.HISTORIC.UPDATE)
(FNS (* Interface to GRAPHER)
DINFO.UPDATE.GRAPH.DISPLAY DINFO.UPDATE.FROM.GRAPH DINFO.GET.GRAPH.WINDOW
DINFO.CREATE.GRAPH.WINDOW DINFO.SHOWGRAPH DINFO.INVERT.NODE DINFO.LAYOUTGRAPH)
(FNS (* Interface to TEdit)
DINFO.UPDATE.TEXT.DISPLAY DINFO.TITLEMENUFN DINFO.OPENTEXTSTREAM DINFO.SHOWSEL
DINFO.GET.FILENAME)
(ADDVARS (BackgroundMenuCommands (DInfo (DINFO.SELECT.GRAPH)
"Open a DInfo window for browsing documentation."
)))
(VARS (BackgroundMenu))
(INITVARS (DINFO.GRAPHS)
(DINFOMODES (QUOTE (TEXT GRAPH)))
(DINFO.HISTORY.LENGTH 20)
(\DINFO.MAX.MENU.LEN 10))
(GLOBALVARS DINFO.GRAPH.FILES DINFOMODES DINFO.HISTORY.LENGTH \DINFO.MAX.MENU.LEN)))
(FILESLOAD TEDIT GRAPHER FREEMENU)
(DECLARE: EVAL@COMPILE DONTCOPY
[DECLARE: EVAL@COMPILE
(DATATYPE DINFOGRAPH
(NAME NODELST TOPNODEID CURRENTNODE USERDATA TEXTPROPS FREEMENUITEMS LOOKUPFN MENUFN
DEFAULTHOST DEFAULTDEVICE DEFAULTDIR MONITORLOCK DINFO.MENU WINDOW MENUFONT
FMENU.WINDOW GRAPH.WINDOW HISTORY.MENU.WINDOW SUBNODE.MENU.WINDOW LAST.TEXT
LAST.INVERTED.NODE LAST.GRAPH.LOCATION HISTORY.ITEMS FIND.STRING LOOKUP.STRING))
(RECORD DINFONODE (ID LABEL FILE FROMBYTE TOBYTE PARENT CHILDREN NEXTNODE PREVIOUSNODE USERDATA))
]
(/DECLAREDATATYPE (QUOTE DINFOGRAPH)
(QUOTE (POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER
POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER
POINTER POINTER POINTER POINTER POINTER POINTER))
(QUOTE ((DINFOGRAPH 0 POINTER)
(DINFOGRAPH 2 POINTER)
(DINFOGRAPH 4 POINTER)
(DINFOGRAPH 6 POINTER)
(DINFOGRAPH 8 POINTER)
(DINFOGRAPH 10 POINTER)
(DINFOGRAPH 12 POINTER)
(DINFOGRAPH 14 POINTER)
(DINFOGRAPH 16 POINTER)
(DINFOGRAPH 18 POINTER)
(DINFOGRAPH 20 POINTER)
(DINFOGRAPH 22 POINTER)
(DINFOGRAPH 24 POINTER)
(DINFOGRAPH 26 POINTER)
(DINFOGRAPH 28 POINTER)
(DINFOGRAPH 30 POINTER)
(DINFOGRAPH 32 POINTER)
(DINFOGRAPH 34 POINTER)
(DINFOGRAPH 36 POINTER)
(DINFOGRAPH 38 POINTER)
(DINFOGRAPH 40 POINTER)
(DINFOGRAPH 42 POINTER)
(DINFOGRAPH 44 POINTER)
(DINFOGRAPH 46 POINTER)
(DINFOGRAPH 48 POINTER)
(DINFOGRAPH 50 POINTER)))
(QUOTE 52))
(DECLARE: EVAL@COMPILE
[PUTPROPS
DINFOGRAPHPROP MACRO
(ARGS
(LET ((GRAPH (CAR ARGS))
(PROP (EVAL (CADR ARGS)))
SYSTEM?)
[SETQ SYSTEM?
(FMEMB PROP
(QUOTE (NAME NODELST TOPNODEID CURRENTNODE TEXTPROPS FREEMENUITEMS LOOKUPFN
MENUFN DEFAULTHOST DEFAULTDEVICE DEFAULTDIR MONITORLOCK DINFO.MENU
MENUFONT WINDOW FMENU.WINDOW GRAPH.WINDOW HISTORY.MENU.WINDOW
SUBNODE.MENU.WINDOW LAST.TEXT LAST.INVERTED.NODE LAST.GRAPH.LOCATION
HISTORY.ITEMS FIND.STRING LOOKUP.STRING]
(SELECTQ
(LENGTH ARGS)
[2 (if SYSTEM? then (BQUOTE (fetch (DINFOGRAPH %, PROP)
of %, GRAPH))
else
(BQUOTE (LISTGET (fetch (DINFOGRAPH USERDATA)
of %, GRAPH)
%,
(KWOTE PROP]
[3 (LET ((VALUE (CADDR ARGS)))
(if SYSTEM? then (BQUOTE (replace (DINFOGRAPH %, PROP)
of %, GRAPH with %, VALUE))
else
(BQUOTE (LET ((USERDATA (fetch (DINFOGRAPH USERDATA)
of %, GRAPH)))
(if (LISTP USERDATA)
then
(LISTPUT USERDATA %, (KWOTE PROP)
%, VALUE)
else
(LET ((RESULT %, VALUE))
(replace (DINFOGRAPH USERDATA)
of %, GRAPH with (LIST %, (KWOTE PROP)
RESULT))
RESULT]
(SHOULDNT]
)
)
(/DECLAREDATATYPE (QUOTE DINFOGRAPH)
(QUOTE (POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER
POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER
POINTER POINTER POINTER POINTER POINTER POINTER))
(QUOTE ((DINFOGRAPH 0 POINTER)
(DINFOGRAPH 2 POINTER)
(DINFOGRAPH 4 POINTER)
(DINFOGRAPH 6 POINTER)
(DINFOGRAPH 8 POINTER)
(DINFOGRAPH 10 POINTER)
(DINFOGRAPH 12 POINTER)
(DINFOGRAPH 14 POINTER)
(DINFOGRAPH 16 POINTER)
(DINFOGRAPH 18 POINTER)
(DINFOGRAPH 20 POINTER)
(DINFOGRAPH 22 POINTER)
(DINFOGRAPH 24 POINTER)
(DINFOGRAPH 26 POINTER)
(DINFOGRAPH 28 POINTER)
(DINFOGRAPH 30 POINTER)
(DINFOGRAPH 32 POINTER)
(DINFOGRAPH 34 POINTER)
(DINFOGRAPH 36 POINTER)
(DINFOGRAPH 38 POINTER)
(DINFOGRAPH 40 POINTER)
(DINFOGRAPH 42 POINTER)
(DINFOGRAPH 44 POINTER)
(DINFOGRAPH 46 POINTER)
(DINFOGRAPH 48 POINTER)
(DINFOGRAPH 50 POINTER)))
(QUOTE 52))
(DEFINEQ
(DINFO
[LAMBDA (GRAPH.OR.FILE WINDOW.OR.REGION SETUP.ONLY? NO.FREEMENU?) (* drc:
"25-Jan-86 18:23")
(* Starts a DInfo
browser.)
(RESETLST (LET ((W (OR (WINDOWP WINDOW.OR.REGION)
(AND (REGIONP WINDOW.OR.REGION)
(CREATEW WINDOW.OR.REGION "DInfo" NIL T))
(AND (type? DINFOGRAPH GRAPH.OR.FILE)
(WINDOWP (fetch (DINFOGRAPH WINDOW) of GRAPH.OR.FILE)))
(CREATEW NIL "DInfo")))
GRAPH MONITORLOCK)
(OPENW W)
[SETQ GRAPH (if (type? DINFOGRAPH GRAPH.OR.FILE)
then GRAPH.OR.FILE
else (RESETFORM (TTYDISPLAYSTREAM (GETPROMPTWINDOW W))
(DINFO.READ.GRAPH GRAPH.OR.FILE]
[SETQ MONITORLOCK (OR (fetch (DINFOGRAPH MONITORLOCK) of GRAPH)
(replace (DINFOGRAPH MONITORLOCK) of GRAPH
with (CREATE.MONITORLOCK "DInfo"]
(RESETSAVE NIL (LIST (QUOTE RELEASE.MONITORLOCK)
MONITORLOCK))
(OBTAIN.MONITORLOCK MONITORLOCK)
(DINFO.SETUP.WINDOW GRAPH W NO.FREEMENU?)
(OR SETUP.ONLY? (DINFO.UPDATE GRAPH NIL NIL T))
GRAPH])
(DINFO.UPDATE
[LAMBDA (GRAPH NEW.NODE SEL FORCE?) (* jow "20-May-86 15:14")
(* * Called to visit a NEW.NODE in GRAPH, or to just make sure that the display
of GRAPH is current.)
(LET ([NODE (OR NEW.NODE (fetch (DINFOGRAPH CURRENTNODE) of GRAPH)
(FASSOC (fetch (DINFOGRAPH TOPNODEID) of GRAPH)
(fetch (DINFOGRAPH NODELST) of GRAPH]
(PREVIOUS.NODE (fetch (DINFOGRAPH CURRENTNODE) of GRAPH))
(WINDOW (fetch (DINFOGRAPH WINDOW) of GRAPH)))
(OPENW WINDOW)
(WINDOWPROP WINDOW (QUOTE DINFOGRAPH)
GRAPH)
(OR (FMEMB NODE (fetch (DINFOGRAPH NODELST) of GRAPH))
(ERROR NODE "NOT IN NODELST"))
(LET ((FMENU.WINDOW (fetch (DINFOGRAPH FMENU.WINDOW) of GRAPH))
(MONITORLOCK (fetch (DINFOGRAPH MONITORLOCK) of GRAPH)))
[RESETLST (RESETSAVE NIL (LIST (QUOTE RELEASE.MONITORLOCK)
MONITORLOCK))
(if (NOT (OBTAIN.MONITORLOCK MONITORLOCK T))
then (* somebody else is messing with this
graph.)
(FLASHWINDOW WINDOW)
(PROMPTPRINT "DInfo is busy")
elseif (NULL FMENU.WINDOW)
then (replace (DINFOGRAPH CURRENTNODE) of GRAPH with NODE)
(* FreeMenu turned off, so just
display text)
(DINFO.UPDATE.TEXT.DISPLAY GRAPH NODE SEL)
else (* We've got a FreeMenu, so update
away!)
(DINFO.UPDATE.FMENU GRAPH NODE)
(LET ((STATUS (FM.GETSTATE FMENU.WINDOW)))
(replace (DINFOGRAPH CURRENTNODE) of GRAPH with NODE)
(AND (LISTGET STATUS (QUOTE GRAPH))
(DINFO.UPDATE.GRAPH.DISPLAY GRAPH NODE FORCE?))
(AND (LISTGET STATUS (QUOTE MENU))
(DINFO.UPDATE.MENU.DISPLAY GRAPH NODE))
(AND (LISTGET STATUS (QUOTE TEXT))
(DINFO.UPDATE.TEXT.DISPLAY GRAPH NODE SEL))
(DINFO.UPDATE.HISTORY GRAPH NODE SEL (LISTGET STATUS (QUOTE HISTORY]
(CLEARW (GETPROMPTWINDOW WINDOW])
(DINFOGRAPH
[LAMBDA (X) (* drc:
" 8-Jan-86 11:12")
(if (type? DINFOGRAPH X)
then X
elseif (AND (WINDOWP X)
(WINDOWPROP X (QUOTE DINFOGRAPH)))
elseif (AND (WINDOWP X)
(WINDOWPROP X (QUOTE MAINWINDOW)))
then (WINDOWPROP (WINDOWPROP X (QUOTE MAINWINDOW))
(QUOTE DINFOGRAPH])
(DINFO.SPECIAL.UPDATE
[LAMBDA (TYPE GRAPH) (* drc:
"25-Jan-86 18:26")
(* * Do a TYPE update of Graph, where TYPE is one of Top, Parent, Previous
or Next.)
(LET*[(DINFOW (fetch (DINFOGRAPH WINDOW) of GRAPH))
(CURRENT.NODE (fetch (DINFOGRAPH CURRENTNODE) of GRAPH))
(NEW.NODE (FASSOC (SELECTQ TYPE
(Top (fetch (DINFOGRAPH TOPNODEID) of GRAPH))
(Parent (fetch (DINFONODE PARENT) of CURRENT.NODE))
(Next (fetch (DINFONODE NEXTNODE) of CURRENT.NODE))
(Previous (fetch (DINFONODE PREVIOUSNODE) of CURRENT.NODE))
NIL)
(fetch (DINFOGRAPH NODELST) of GRAPH]
(if (OBTAIN.MONITORLOCK (fetch (DINFOGRAPH MONITORLOCK) of GRAPH)
T)
then (if NEW.NODE
then (PROCESSPROP (THIS.PROCESS)
(QUOTE NAME)
(CONCAT "DInfo " TYPE))
(DINFO.UPDATE GRAPH NEW.NODE)
else (* TYPE of Top! or Node!
will sound silly here,
but should never happen.)
(printout (GETPROMPTWINDOW (fetch (DINFOGRAPH WINDOW) of GRAPH))
T "This node has no " TYPE))
else (FLASHWINDOW DINFOW)
(PROMPTPRINT "DInfo is busy"])
(DINFO.READ.GRAPH
[LAMBDA (FILE QUIETFLG) (* drc:
"25-Jan-86 18:17")
(* Reads a file written
by DINFO.WRITE.GRAPH.
Returns the DInfo graph
stored on FILE.)
(OR QUIETFLG (printout T T "Reading " (FILENAMEFIELD FILE (QUOTE NAME))
" graph..."))
(LET*((FULLFILENAME (INFILEP FILE))
[DATA (CDR (READFILE (OR FULLFILENAME (ERROR "FILE NOT FOUND" FILE]
(GRAPH (create DINFOGRAPH))) (* fields stored on file)
(replace (DINFOGRAPH TOPNODEID) of GRAPH with (LISTGET DATA (QUOTE TOPNODEID)))
(replace (DINFOGRAPH TEXTPROPS) of GRAPH with (LISTGET DATA (QUOTE TEXTPROPS)))
(replace (DINFOGRAPH LOOKUPFN) of GRAPH with (LISTGET DATA (QUOTE LOOKUPFN)))
(replace (DINFOGRAPH MENUFN) of GRAPH with (LISTGET DATA (QUOTE MENUFN)))
(replace (DINFOGRAPH FREEMENUITEMS) of GRAPH with (LISTGET DATA (QUOTE FREEMENUITEMS)))
(replace (DINFOGRAPH NODELST) of GRAPH with (LISTGET DATA (QUOTE NODELST)))
(replace (DINFOGRAPH USERDATA) of GRAPH with (LISTGET DATA (QUOTE USERDATA)))
(* fields filled in at
read time)
(replace (DINFOGRAPH NAME) of GRAPH with (FILENAMEFIELD FULLFILENAME (QUOTE NAME)))
(replace (DINFOGRAPH DEFAULTHOST) of GRAPH with (FILENAMEFIELD FULLFILENAME (QUOTE HOST)))
(replace (DINFOGRAPH DEFAULTDEVICE) of GRAPH with (FILENAMEFIELD FULLFILENAME (QUOTE DEVICE)))
(replace (DINFOGRAPH DEFAULTDIR) of GRAPH with (FILENAMEFIELD FULLFILENAME (QUOTE DIRECTORY)))
(OR QUIETFLG (printout T "OK."))
GRAPH])
(DINFO.WRITE.GRAPH
[LAMBDA (GRAPH FILE) (* drc:
"25-Jan-86 18:16")
(* Writes a DInfo graph
to a file for reading by
DINFO.READ.GRAPH.
Returns the full file
name of the file.)
(* dump it out as a
props list)
(WRITEFILE (LIST (QUOTE TOPNODEID)
(fetch (DINFOGRAPH TOPNODEID) of GRAPH)
(QUOTE TEXTPROPS)
(fetch (DINFOGRAPH TEXTPROPS) of GRAPH)
(QUOTE LOOKUPFN)
(fetch (DINFOGRAPH LOOKUPFN) of GRAPH)
(QUOTE MENUFN)
(fetch (DINFOGRAPH MENUFN) of GRAPH)
(QUOTE FREEMENUITEMS)
(fetch (DINFOGRAPH FREEMENUITEMS) of GRAPH)
(QUOTE NODELST)
(fetch (DINFOGRAPH NODELST) of GRAPH)
(QUOTE USERDATA)
(fetch (DINFOGRAPH USERDATA) of GRAPH))
FILE])
(DINFO.SELECT.GRAPH
[LAMBDA NIL (* drc:
"24-Jan-86 13:25")
(* * This is called when DInfo is selected from the Background Menu.)
(DECLARE (GLOBALVARS DINFO.GRAPHS))
(ALLOW.BUTTON.EVENTS)
(RESETFORM (TTY.PROCESS (THIS.PROCESS))
(LET [(GRAPH (if (NULL DINFO.GRAPHS)
then (PROMPTPRINT "No Graphs installed -- load HelpSys or DInfoEdit")
elseif (NULL (CDR DINFO.GRAPHS))
then (EVAL (CADAR DINFO.GRAPHS))
else (MENU (create MENU
CENTERFLG ← T
TITLE ←"Select Graph"
ITEMS ← DINFO.GRAPHS]
(AND GRAPH (DINFO GRAPH])
(DINFO.DEFAULT.MENU
[LAMBDA (GRAPH) (* jow "15-Jul-86 17:36")
(* * This is the default MENUFN for DInfo graphs.)
(LET ((DINFOW (fetch (DINFOGRAPH WINDOW) of GRAPH)))
(CLEARW (GETPROMPTWINDOW DINFOW))
(LET [(TYPE (MENU (OR (fetch (DINFOGRAPH DINFO.MENU) of GRAPH)
(replace (DINFOGRAPH DINFO.MENU) of GRAPH
with (create MENU
ITEMS ← (QUOTE (("Top" (QUOTE Top)
"Visit the top node in the graph"
)
("Parent" (QUOTE Parent)
"Visit the parent of the current node"
)
("Previous" (QUOTE Previous)
"Visit the node before this node"
)
("Next " (QUOTE Next)
"Visit the node following this node"
)
("Find" (QUOTE Find)
"Search the text of this node")
("Lookup" (QUOTE Lookup)
"Lookup a new term in this graph"
)
("Expanded Menu" (QUOTE FreeMenu)
"Add an expanded options menu.")
))
CENTERFLG ← T
MENUFONT ← (FONTCREATE (QUOTE HELVETICA)
10
(QUOTE BOLD]
(if TYPE
then (PROCESSPROP (THIS.PROCESS)
(QUOTE NAME)
(CONCAT "DInfo " TYPE))
(SELECTQ TYPE
((Top Parent Previous Next)
(DINFO.SPECIAL.UPDATE TYPE GRAPH))
(Find (DINFO.FIND GRAPH))
(Lookup (DINFO.LOOKUP GRAPH (QUOTE (LEFT))))
(FreeMenu (DINFO.ADD.FMENU GRAPH)
(DINFO.UPDATE GRAPH))
NIL])
(DINFO.FIND
[LAMBDA (GRAPH BUTTONS) (* drc:
"25-Jan-86 18:23")
(LET ((DINFOW (fetch (DINFOGRAPH WINDOW) of GRAPH)))
(if (NOT (OBTAIN.MONITORLOCK (fetch (DINFOGRAPH MONITORLOCK) of GRAPH)
T))
then (FLASHWINDOW DINFOW)
(PROMPTPRINT "DInfo is busy")
else (RESETFORM (TTYDISPLAYSTREAM (GETPROMPTWINDOW DINFOW))
(TERPRI T)
(LET ([STRING (if (AND (FMEMB (QUOTE MIDDLE)
BUTTONS)
(fetch (DINFOGRAPH FIND.STRING) of GRAPH))
else (PROMPTFORWORD "Find: " (fetch (DINFOGRAPH FIND.STRING)
of GRAPH)
NIL NIL NIL (QUOTE TTY)
(CONSTANT (CHARCODE (EOL ESCAPE LF]
(TEXTSTREAM (WINDOWPROP DINFOW (QUOTE TEXTSTREAM)))
PAIR)
(replace (DINFOGRAPH FIND.STRING) of GRAPH with STRING)
(if STRING
then (PRINTOUT T " Searching...")
(if (SETQ PAIR (TEDIT.FIND TEXTSTREAM STRING NIL NIL T))
then (printout T "OK.")
(TEDIT.NORMALIZECARET TEXTSTREAM
(TEDIT.SHOWSEL TEXTSTREAM T (TEDIT.SETSEL
TEXTSTREAM
(CAR PAIR)
(NCHARS STRING)
(QUOTE RIGHT)
T)))
else (printout T "not found.")
(TEDIT.NORMALIZECARET TEXTSTREAM (TEDIT.SETSEL TEXTSTREAM
0 0])
(DINFO.LOOKUP
[LAMBDA (GRAPH BUTTONS) (* drc:
"25-Jan-86 18:22")
(LET ((DINFOW (fetch (DINFOGRAPH WINDOW) of GRAPH)))
(if (OBTAIN.MONITORLOCK (fetch (DINFOGRAPH MONITORLOCK) of GRAPH)
T)
then
[RESETFORM
(TTYDISPLAYSTREAM (GETPROMPTWINDOW DINFOW))
(LET ((LOOKUPFN (fetch (DINFOGRAPH LOOKUPFN) of GRAPH)))
(if LOOKUPFN
then (CLEARW T)
(LET*[(OLD.STRING (fetch (DINFOGRAPH LOOKUP.STRING) of GRAPH))
(STRING (if (AND OLD.STRING (FMEMB (QUOTE MIDDLE)
BUTTONS))
then OLD.STRING
else (PROMPTFORWORD "Lookup: " OLD.STRING NIL NIL NIL
(QUOTE TTY)
(CONSTANT (CHARCODE (EOL ESCAPE LF]
(replace (DINFOGRAPH LOOKUP.STRING) of GRAPH with STRING)
(AND STRING (APPLY* LOOKUPFN STRING GRAPH)))
else (PRINTOUT T T "The " (fetch (DINFOGRAPH NAME) of GRAPH)
" graph has no LOOKUPFN."]
else (FLASHWINDOW DINFOW)
(PROMPTPRINT "DInfo is busy"])
)
(DEFINEQ
(DINFO.READ.KOTO.GRAPH
[LAMBDA (FILE QUIETFLG) (* drc:
" 4-Feb-86 11:27")
(* Reads a file written by Koto DINFO.WRITE.GRAPH and returns a Lute
DINFOGRAPH. Thus, (DINFO.WRITE.GRAPH (DINFO.READ.KOTO.GRAPH <file1>)
<file2>) will convert the Koto format graph in <file1> to a Lute format
graph in <file2>.)
(OR QUIETFLG (printout T T "Reading " (FILENAMEFIELD FILE (QUOTE NAME))
" graph..."))
(LET*((FULLFILENAME (INFILEP FILE))
[DATA (CDR (READFILE (OR FULLFILENAME (ERROR "FILE NOT FOUND" FILE]
(GRAPH (create DINFOGRAPH))) (* in Koto we just wrote
out the DINFOGRAPH
record)
(for FIELD in DATA as N from 1 to 11 do (* fields stored on file)
(SELECTQ N
((1 4 5 6 10 11))
(2 (replace (DINFOGRAPH NODELST) of GRAPH
with FIELD))
(3 (replace (DINFOGRAPH TOPNODEID) of GRAPH
with FIELD))
(7 (replace (DINFOGRAPH TEXTPROPS) of GRAPH
with FIELD))
(8 (replace (DINFOGRAPH LOOKUPFN) of GRAPH
with FIELD))
(9 (replace (DINFOGRAPH MENUFN) of GRAPH
with FIELD))
(SHOULDNT))) (* fields filled in at
read time)
(replace (DINFOGRAPH NAME) of GRAPH with (FILENAMEFIELD FULLFILENAME (QUOTE NAME)))
(replace (DINFOGRAPH DEFAULTHOST) of GRAPH with (FILENAMEFIELD FULLFILENAME (QUOTE HOST)))
(replace (DINFOGRAPH DEFAULTDEVICE) of GRAPH with (FILENAMEFIELD FULLFILENAME (QUOTE DEVICE)))
(replace (DINFOGRAPH DEFAULTDIR) of GRAPH with (FILENAMEFIELD FULLFILENAME (QUOTE DIRECTORY)))
(OR QUIETFLG (printout T "OK."))
GRAPH])
)
(DEFINEQ
(DINFO.SETUP.WINDOW
[LAMBDA (GRAPH WINDOW NO.FREEMENU?) (* jow "10-Jun-86 15:29")
(replace (DINFOGRAPH WINDOW) of GRAPH with WINDOW)
(WINDOWPROP WINDOW (QUOTE DINFOGRAPH)
GRAPH)
(DETACHALLWINDOWS WINDOW)
(if (NOT NO.FREEMENU?)
then (DINFO.ADD.FMENU GRAPH))
(DINFO.UPDATE.TEXT.DISPLAY GRAPH NIL NIL T)
(WINDOWPROP WINDOW (QUOTE TITLE)
(CONCAT (fetch (DINFOGRAPH NAME) of GRAPH)
" DInfo"))
(WINDOWADDPROP WINDOW (QUOTE CLOSEFN)
(QUOTE DINFO.CLOSEFN))
(WINDOWADDPROP WINDOW (QUOTE SHRINKFN)
(QUOTE DINFO.SHRINKFN))
(WINDOWADDPROP WINDOW (QUOTE EXPANDFN)
(QUOTE DINFO.EXPANDFN])
(DINFO.CLOSEFN
[LAMBDA (W) (* drc:
"25-Jan-86 18:26")
(LET [(GRAPH (WINDOWPROP W (QUOTE DINFOGRAPH]
(if (type? DINFOGRAPH GRAPH)
then (CLOSEW (fetch (DINFOGRAPH GRAPH.WINDOW) of GRAPH)) (* remove circularity...)
(WINDOWPROP W (QUOTE DINFOGRAPH)
NIL])
(DINFO.SHRINKFN
[LAMBDA (W) (* drc:
"25-Jan-86 18:26")
(CLOSEW (fetch (DINFOGRAPH GRAPH.WINDOW) of (DINFOGRAPH W])
(DINFO.EXPANDFN
[LAMBDA (W) (* jow "15-Jul-86 17:00")
(LET* ((GRAPH (DINFOGRAPH W))
(FMENU (fetch (DINFOGRAPH FMENU.WINDOW) of GRAPH)))
(if (AND FMENU (LISTGET (FM.GETSTATE FMENU)
(QUOTE GRAPH)))
then (LET ((GRAPHW (fetch (DINFOGRAPH GRAPH.WINDOW) of GRAPH)))
(OPENW GRAPHW)
(TOTOPW W)
(WINDOWPROP GRAPHW (QUOTE DINFOGRAPH)
GRAPH])
(DINFO.ICONFN
[LAMBDA (W) (* drc:
"25-Jan-86 16:33")
(OR (WINDOWPROP WINDOW (QUOTE ICON))
(WINDOWPROP WINDOW (QUOTE ICON)
(TITLEDICONW TEDIT.TITLED.ICON.TEMPLATE (WINDOWPROP WINDOW (QUOTE TITLE))
TEDIT.ICON.FONT NIL T))
(WINDOWPROP WINDOW (QUOTE ICON])
)
(DEFINEQ
(DINFO.ADD.FMENU
[LAMBDA (GRAPH) (* jow "20-May-86 15:41")
(* * Add a DInfo FreeMenu to WINDOW. then update the FreeMenu's display.)
(LET ((WINDOW (fetch (DINFOGRAPH WINDOW) of GRAPH))
(FM.WINDOW (fetch (DINFOGRAPH FMENU.WINDOW) of GRAPH)))
(if [AND (WINDOWP FM.WINDOW)
(FMEMB FM.WINDOW (WINDOWPROP WINDOW (QUOTE ATTACHEDWINDOWS]
then (OPENW FM.WINDOW)
else (REMOVEPROMPTWINDOW WINDOW)
(SETQ FM.WINDOW (OR (WINDOWP FM.WINDOW)
(DINFO.CREATE.FMENU GRAPH)))
(replace (DINFOGRAPH FMENU.WINDOW) of GRAPH with FM.WINDOW)
(ATTACHWINDOW FM.WINDOW WINDOW)
(WINDOWPROP FM.WINDOW (QUOTE FM.PROMPTWINDOW)
(GETPROMPTWINDOW WINDOW))
(WINDOWDELPROP FM.WINDOW (QUOTE PASSTOMAINCOMS)
(QUOTE CLOSEW))
(WINDOWADDPROP FM.WINDOW (QUOTE CLOSEFN)
(QUOTE DINFO.FMW.CLOSEFN)
T)
(DINFO.UPDATE.FMENU GRAPH])
(DINFO.CREATE.FMENU
[LAMBDA (GRAPH) (* jow "15-Jul-86 17:39")
(* * Makes a DInfo FreeMenu for GRAPH)
(LET* [(ADD.ITEMS (fetch (DINFOGRAPH FREEMENUITEMS) of GRAPH))
(FONT (OR (FONTP (fetch (DINFOGRAPH MENUFONT) of GRAPH))
MENUFONT))
(FM (FREEMENU (BQUOTE ((PROPS FONT %, FONT)
((LABEL Node: TYPE DISPLAY FONT (HELVETICA 10))
(ID NODE LABEL "" TYPE DISPLAY))
((LABEL Top! SELECTEDFN DINFO.FMENU.HANDLER FONT (HELVETICA 10 BOLD
)
MESSAGE "Visit the top node")
(ID TOP LABEL "" TYPE DISPLAY))
((LABEL Parent! SELECTEDFN DINFO.FMENU.HANDLER FONT
(HELVETICA 10 BOLD)
MESSAGE "Visit the parent of the current node")
(ID PARENT LABEL "" TYPE DISPLAY))
((LABEL Previous! SELECTEDFN DINFO.FMENU.HANDLER FONT
(HELVETICA 10 BOLD)
MESSAGE "Visit the node previous to the current node")
(ID PREVIOUS LABEL "" TYPE DISPLAY))
((LABEL Next! SELECTEDFN DINFO.FMENU.HANDLER FONT (HELVETICA 10
BOLD)
MESSAGE "Visit the node after the current node")
(ID NEXT LABEL "" TYPE DISPLAY))
((LABEL Display: TYPE DISPLAY FONT (HELVETICA 10))
(LABEL Graph ID GRAPH INITSTATE %, (MEMB (QUOTE GRAPH)
DINFOMODES)
TYPE TOGGLE SELECTEDFN DINFO.TOGGLE.GRAPH FONT
(HELVETICA 10 BOLD)
MESSAGE "Toggle display of the graph")
(LABEL Menu ID MENU INITSTATE %, (MEMB (QUOTE MENU)
DINFOMODES)
TYPE TOGGLE SELECTEDFN DINFO.TOGGLE.MENU FONT
(HELVETICA 10 BOLD)
MESSAGE "Toggle display of the subnode menu")
(LABEL Text ID TEXT INITSTATE %, (MEMB (QUOTE TEXT)
DINFOMODES)
TYPE TOGGLE SELECTEDFN DINFO.TOGGLE.TEXT FONT
(HELVETICA 10 BOLD)
MESSAGE "Toggle display of the text of the current node")
(LABEL History ID HISTORY INITSTATE %, (MEMB (QUOTE HISTORY)
DINFOMODES)
TYPE TOGGLE FONT (HELVETICA 10 BOLD)
SELECTEDFN DINFO.TOGGLE.HISTORY MESSAGE
"Toggle the display of the History Menu"))
%,
(APPEND (QUOTE ((LABEL Find! SELECTEDFN DINFO.FMENU.HANDLER FONT
(HELVETICA 10 BOLD)
MESSAGE
"Perform a string search in the selected text of the current node"
)
(LABEL Lookup! SELECTEDFN DINFO.FMENU.HANDLER FONT
(HELVETICA 10 BOLD)
MESSAGE
"Lookup a term in this graph. LEFT for new term, MIDDLE to repeat last."
)))
ADD.ITEMS]
(WINDOWPROP FM (QUOTE FM.DONTRESHAPE)
T)
FM])
(DINFO.FMW.CLOSEFN
[LAMBDA (W) (* drc:
"25-Jan-86 18:19")
(* * CLOSEFN for a DInfo FreeMenu window.)
(LET*((DINFOW (WINDOWPROP W (QUOTE MAINWINDOW)))
(GRAPH (DINFOGRAPH DINFOW)))
(if GRAPH
then (DETACHWINDOW W)
(replace (DINFOGRAPH FMENU.WINDOW) of GRAPH with NIL)
(DETACHWINDOW (fetch (DINFOGRAPH SUBNODE.MENU.WINDOW) of GRAPH))
(CLOSEW (fetch (DINFOGRAPH SUBNODE.MENU.WINDOW) of GRAPH))
(DETACHWINDOW (fetch (DINFOGRAPH HISTORY.MENU.WINDOW) of GRAPH))
(CLOSEW (fetch (DINFOGRAPH GRAPH.WINDOW) of GRAPH))
(REMOVEPROMPTWINDOW DINFOW])
(DINFO.FMENU.HANDLER
[LAMBDA (ITEM WINDOW BUTTONS) (* drc:
"16-Jan-86 11:42")
(* * Handle a command from the FreeMenu.)
(LET [(GRAPH (WINDOWPROP (WINDOWPROP WINDOW (QUOTE MAINWINDOW))
(QUOTE DINFOGRAPH)))
(TYPE (MKATOM (SUBSTRING (FM.ITEMPROP ITEM (QUOTE LABEL))
1 -2]
(SELECTQ TYPE
((Top Parent Previous Next)
(DINFO.SPECIAL.UPDATE TYPE GRAPH))
(Find (DINFO.FIND GRAPH BUTTONS))
(Lookup (DINFO.LOOKUP GRAPH BUTTONS))
(SHOULDNT])
(DINFO.UPDATE.FMENU
[LAMBDA (GRAPH NEW.NODE) (* jow "20-May-86 15:13")
(* * Update the display of GRAPH's FreeMenu.
If NEW.NODE is not specified, use Top node of GRAPH, and change Top node title.)
(LET* [(W (fetch (DINFOGRAPH FMENU.WINDOW) of GRAPH))
(NODELST (fetch (DINFOGRAPH NODELST) of GRAPH))
(NODE (OR NEW.NODE (FASSOC (fetch (DINFONODE ID) of (fetch (DINFOGRAPH CURRENTNODE)
of GRAPH))
NODELST)
(FASSOC (fetch (DINFOGRAPH TOPNODEID) of GRAPH)
NODELST]
(OR NEW.NODE (FM.CHANGELABEL (FM.GETITEM (QUOTE TOP)
NIL W)
(fetch (DINFONODE LABEL) of (FASSOC (fetch (DINFOGRAPH TOPNODEID)
of GRAPH)
(fetch (DINFOGRAPH NODELST)
of GRAPH)))
W))
(FM.CHANGELABEL (FM.GETITEM (QUOTE NODE)
NIL W)
(fetch (DINFONODE LABEL) of NODE)
W)
(FM.CHANGELABEL (FM.GETITEM (QUOTE PARENT)
NIL W)
(fetch (DINFONODE LABEL) of NODE (FASSOC (fetch (DINFONODE PARENT) of NODE)
NODELST))
W)
(FM.CHANGELABEL (FM.GETITEM (QUOTE NEXT)
NIL W)
(fetch (DINFONODE LABEL) of NODE (FASSOC (fetch (DINFONODE NEXTNODE) of NODE)
NODELST))
W)
(FM.CHANGELABEL (FM.GETITEM (QUOTE PREVIOUS)
NIL W)
(fetch (DINFONODE LABEL) of NODE (FASSOC (fetch (DINFONODE PREVIOUSNODE)
of NODE)
NODELST))
W])
(DINFO.TOGGLE.MENU
[LAMBDA (ITEM WINDOW) (* jow "10-Jun-86 14:15")
(LET [(GRAPH (WINDOWPROP (WINDOWPROP WINDOW (QUOTE MAINWINDOW))
(QUOTE DINFOGRAPH]
(if (FM.ITEMPROP ITEM (QUOTE STATE))
then (DINFO.UPDATE.MENU.DISPLAY GRAPH (fetch (DINFOGRAPH CURRENTNODE) of GRAPH))
else (LET ((SUBNODE.MENU.WINDOW (fetch (DINFOGRAPH SUBNODE.MENU.WINDOW) of GRAPH)))
(DETACHWINDOW SUBNODE.MENU.WINDOW)
(CLOSEW SUBNODE.MENU.WINDOW])
(DINFO.TOGGLE.GRAPH
[LAMBDA (ITEM WINDOW) (* jow "10-Jun-86 14:12")
(LET [(GRAPH (WINDOWPROP (WINDOWPROP WINDOW (QUOTE MAINWINDOW))
(QUOTE DINFOGRAPH]
(if (FM.ITEMPROP ITEM (QUOTE STATE))
then (DINFO.UPDATE.GRAPH.DISPLAY GRAPH (fetch CURRENTNODE of GRAPH))
else (CLOSEW (fetch (DINFOGRAPH GRAPH.WINDOW) of GRAPH)))
ITEM])
(DINFO.TOGGLE.HISTORY
[LAMBDA (ITEM WINDOW) (* jow "10-Jun-86 14:22")
(LET [(GRAPH (WINDOWPROP (WINDOWPROP WINDOW (QUOTE MAINWINDOW))
(QUOTE DINFOGRAPH]
(if (FM.ITEMPROP ITEM (QUOTE STATE))
then (DINFO.UPDATE.HISTORY GRAPH NIL NIL T)
else (LET ((HISTORY.MENU.WINDOW (fetch (DINFOGRAPH HISTORY.MENU.WINDOW) of GRAPH)))
(DETACHWINDOW HISTORY.MENU.WINDOW)
(CLOSEW HISTORY.MENU.WINDOW])
(DINFO.TOGGLE.TEXT
[LAMBDA (ITEM WINDOW) (* drc:
"25-Jan-86 18:26")
(LET*((DINFOW (WINDOWPROP WINDOW (QUOTE MAINWINDOW)))
(GRAPH (WINDOWPROP DINFOW (QUOTE DINFOGRAPH)))
(MONITORLOCK (fetch (DINFOGRAPH MONITORLOCK) of GRAPH)))
(if (NOT (OBTAIN.MONITORLOCK MONITORLOCK T))
then (FLASHWINDOW DINFOW)
(PROMPTPRINT "DInfo is busy")
elseif (FM.ITEMPROP ITEM (QUOTE STATE))
then (DINFO.UPDATE.TEXT.DISPLAY GRAPH (fetch (DINFOGRAPH CURRENTNODE) of GRAPH))
(RELEASE.MONITORLOCK MONITORLOCK)
else (DINFO.UPDATE.TEXT.DISPLAY GRAPH (fetch (DINFOGRAPH CURRENTNODE) of GRAPH)
NIL T)
(RELEASE.MONITORLOCK MONITORLOCK])
)
(DEFINEQ
(DINFO.UPDATE.MENU.DISPLAY
[LAMBDA (GRAPH NODE) (* drc:
"25-Jan-86 18:20")
(LET*[(DINFOW (fetch (DINFOGRAPH WINDOW) of GRAPH))
(WINDOW (fetch (DINFOGRAPH SUBNODE.MENU.WINDOW) of GRAPH))
[CHILDREN (DREVERSE (for ID in (fetch (DINFONODE CHILDREN) of NODE)
bind (NODELST ←(fetch (DINFOGRAPH NODELST) of GRAPH))
collect (FASSOC ID NODELST]
(LENGTH (FLENGTH CHILDREN))
(SCROLLABLE (GREATERP LENGTH \DINFO.MAX.MENU.LEN))
(MENU (create MENU
MENUFONT ←(OR (FONTP (fetch (DINFOGRAPH MENUFONT) of GRAPH))
MENUFONT)
ITEMWIDTH ←(WINDOWPROP DINFOW (QUOTE WIDTH))
CENTERFLG ← T
MENUCOLUMNS ← 1
MENUOUTLINESIZE ← 0
ITEMS ←(for CHILD in CHILDREN collect (LIST (fetch (DINFONODE LABEL)
of CHILD)
CHILD
"Will visit this node if selected."
))
WHENSELECTEDFN ←(FUNCTION DINFO.UPDATE.FROM.MENU]
(AND WINDOW (PROGN (DETACHWINDOW WINDOW)
(CLOSEW WINDOW)))
(if CHILDREN
then (UPDATE/MENU/IMAGE MENU)
(SETQ WINDOW (CREATEW (create REGION
LEFT ← 0
BOTTOM ← 0
WIDTH ←(WINDOWPROP DINFOW (QUOTE WIDTH))
HEIGHT ←(HEIGHTIFWINDOW
(if SCROLLABLE
then (TIMES \DINFO.MAX.MENU.LEN
(fetch (MENU ITEMHEIGHT)
of MENU))
else (fetch (MENU IMAGEHEIGHT) of MENU))
T))
"Subnodes" NIL T))
(ADDMENU MENU WINDOW (create POSITION
XCOORD ← 0
YCOORD ←(if SCROLLABLE
then (TIMES (DIFFERENCE \DINFO.MAX.MENU.LEN
LENGTH)
(fetch (MENU ITEMHEIGHT)
of MENU))
else 0))
T)
(ATTACHWINDOW WINDOW DINFOW (QUOTE BOTTOM))
(REDISPLAYW WINDOW)
(replace (DINFOGRAPH SUBNODE.MENU.WINDOW) of GRAPH with WINDOW)
(LET [(BITS (fetch (REGION BOTTOM) of (WINDOWPROP WINDOW (QUOTE REGION]
(* Slide DINFOW up if
our new menu is off the
screen)
(AND (ILESSP BITS 0)
(RELMOVEW DINFOW (create POSITION
XCOORD ← 0
YCOORD ←(IDIFFERENCE 0 BITS])
(DINFO.UPDATE.FROM.MENU
[LAMBDA (ITEM MENU BUTTONS) (* drc:
"12-Dec-85 14:49")
(DINFO.UPDATE (WINDOWPROP (WINDOWPROP (WFROMMENU MENU)
(QUOTE MAINWINDOW))
(QUOTE DINFOGRAPH))
(CADR ITEM])
(DINFO.UPDATE.HISTORY
[LAMBDA (GRAPH NODE SEL DISPLAY?) (* drc:
"25-Jan-86 18:21")
(LET*((DINFOW (fetch (DINFOGRAPH WINDOW) of GRAPH))
(OLDWINDOW (fetch (DINFOGRAPH HISTORY.MENU.WINDOW) of GRAPH))
(OLDITEMS (fetch (DINFOGRAPH HISTORY.ITEMS) of GRAPH))
(NEWITEM (if SEL
then (LIST (if (LISTP SEL)
then (CAR SEL)
else SEL)
(LIST (fetch (DINFONODE ID) of NODE)
SEL)
"Will re-lookup this term")
elseif NODE
then (LIST (fetch (DINFONODE LABEL) of NODE)
(LIST (fetch (DINFONODE ID) of NODE)
SEL)
"Will re-visit this node")))
(ITEMS (if [AND NEWITEM (NOT (EQUAL NEWITEM (CAR OLDITEMS]
then (CONS NEWITEM (for ITEM in OLDITEMS as I from 2 to DINFO.HISTORY.LENGTH
collect ITEM))
else OLDITEMS)))
(replace (DINFOGRAPH HISTORY.ITEMS) of GRAPH with ITEMS)
(AND OLDWINDOW (PROGN (DETACHWINDOW OLDWINDOW)
(CLOSEW OLDWINDOW)))
(AND DISPLAY? ITEMS
(LET [(HISTORYW (ATTACHMENU (create MENU
MENUFONT ←(OR (FONTP (fetch (DINFOGRAPH MENUFONT)
of GRAPH))
MENUFONT)
TITLE ←"History"
CENTERFLG ← T
MENUCOLUMNS ← 1
ITEMS ← ITEMS
WHENSELECTEDFN ←(FUNCTION DINFO.HISTORIC.UPDATE))
DINFOW
(QUOTE LEFT)
(QUOTE TOP]
(replace (DINFOGRAPH HISTORY.MENU.WINDOW) of GRAPH with HISTORYW])
(DINFO.HISTORIC.UPDATE
[LAMBDA (ITEM MENU BUTTONS) (* drc:
"25-Jan-86 18:24")
(LET*[(ID (CAADR ITEM))
(SEL (CADADR ITEM))
(WINDOW (WINDOWPROP (WFROMMENU MENU)
(QUOTE MAINWINDOW)))
(GRAPH (WINDOWPROP WINDOW (QUOTE DINFOGRAPH)))
(NODE (FASSOC ID (fetch (DINFOGRAPH NODELST) of GRAPH]
(if (NOT (OBTAIN.MONITORLOCK (fetch (DINFOGRAPH MONITORLOCK) of GRAPH)
T))
then (FLASHWINDOW WINDOW)
(PROMPTPRINT "DInfo is busy")
elseif (NULL NODE)
then (PRINTOUT (GETPROMPTWINDOW WINDOW)
T "This node no longer exists")
else (DINFO.UPDATE GRAPH NODE SEL])
)
(DEFINEQ
(DINFO.UPDATE.GRAPH.DISPLAY
[LAMBDA (DINFO.GRAPH NODE FORCE?) (* drc:
"27-Jan-86 16:19")
(LET [(DINFOW (fetch (DINFOGRAPH WINDOW) of DINFO.GRAPH))
(LOCATION (CONS (fetch (DINFONODE PARENT) of NODE)
(fetch (DINFONODE CHILDREN) of NODE]
(if (AND (NOT FORCE?)
(EQUAL LOCATION (fetch (DINFOGRAPH LAST.GRAPH.LOCATION) of DINFO.GRAPH)))
then (* don't need to
relayout grapher display
-- just change which
node is inverted.)
(DINFO.INVERT.NODE (fetch (DINFOGRAPH GRAPH.WINDOW) of DINFO.GRAPH)
NODE DINFO.GRAPH)
else (DINFO.SHOWGRAPH (DINFO.LAYOUTGRAPH DINFO.GRAPH NODE)
DINFO.GRAPH))
(replace (DINFOGRAPH LAST.GRAPH.LOCATION) of DINFO.GRAPH with LOCATION)
(WINDOWPROP (fetch (DINFOGRAPH GRAPH.WINDOW) of DINFO.GRAPH)
(QUOTE TITLE)
(CONCAT (fetch (DINFOGRAPH NAME) of DINFO.GRAPH)
" - "
(fetch (DINFONODE LABEL) of (fetch (DINFOGRAPH CURRENTNODE) of DINFO.GRAPH])
(DINFO.UPDATE.FROM.GRAPH
[LAMBDA (GRAPHER.NODE GRAPH.WINDOW) (* drc:
"12-Dec-85 18:34")
(AND GRAPHER.NODE (ADD.PROCESS [BQUOTE (DINFO.UPDATE (QUOTE , (WINDOWPROP GRAPH.WINDOW
(QUOTE DINFOGRAPH)))
(QUOTE , (fetch (GRAPHNODE NODEID)
of GRAPHER.NODE]
(QUOTE NAME)
"DInfo From Graph"])
(DINFO.GET.GRAPH.WINDOW
[LAMBDA (GRAPH REGION) (* drc:
"25-Jan-86 18:05")
(LET ((W (fetch (DINFOGRAPH GRAPH.WINDOW) of GRAPH)))
(COND
((WINDOWP W))
(T (SETQ W (DINFO.CREATE.GRAPH.WINDOW GRAPH REGION))
[WINDOWPROP W (QUOTE CLOSEFN)
(FUNCTION (LAMBDA (W)
(WINDOWPROP W (QUOTE DINFOGRAPH)
NIL]
(replace (DINFOGRAPH GRAPH.WINDOW) of GRAPH with W)))
(WINDOWPROP W (QUOTE DINFOGRAPH)
GRAPH)
W])
(DINFO.CREATE.GRAPH.WINDOW
[LAMBDA (GRAPH REGION) (* drc:
"25-Jan-86 17:49")
(LET*((DINFOW (fetch (DINFOGRAPH WINDOW) of GRAPH))
(DINFOREGION (WINDOWPROP DINFOW (QUOTE REGION)))
(LEFT (DIFFERENCE (DIFFERENCE (fetch (REGION LEFT) of DINFOREGION)
(fetch (REGION WIDTH) of REGION))
10))
(BOTTOM (DIFFERENCE (DIFFERENCE (fetch (REGION BOTTOM) of DINFOREGION)
(fetch (REGION HEIGHT) of REGION))
50)))
(CREATEW (CREATEREGION (if (GEQ LEFT 0)
then LEFT
else (RAND 0 10))
(if (GEQ BOTTOM 0)
then BOTTOM
else (RAND 0 10))
(fetch (REGION WIDTH) of REGION)
(fetch (REGION HEIGHT) of REGION))
NIL NIL T])
(DINFO.SHOWGRAPH
[LAMBDA (GRAPHER.GRAPH DINFO.GRAPH) (* drc:
"27-Jan-86 16:15")
(LET*[(GRAPH.REGION (GRAPHREGION GRAPHER.GRAPH))
(GRAPH.WINDOW (DINFO.GET.GRAPH.WINDOW DINFO.GRAPH GRAPH.REGION))
(WINDOW.REGION (WINDOWPROP GRAPH.WINDOW (QUOTE REGION]
[SHAPEW GRAPH.WINDOW (LET [(LEFT (fetch (REGION LEFT) of WINDOW.REGION))
(BOTTOM (fetch (REGION BOTTOM) of WINDOW.REGION))
(HEIGHT (HEIGHTIFWINDOW (fetch (REGION HEIGHT) of GRAPH.REGION)
T))
(WIDTH (WIDTHIFWINDOW (fetch (REGION WIDTH) of GRAPH.REGION]
(create REGION
LEFT ← LEFT
BOTTOM ← BOTTOM
HEIGHT ←(if (GEQ (IPLUS BOTTOM HEIGHT)
SCREENHEIGHT)
then (IDIFFERENCE SCREENHEIGHT BOTTOM)
else HEIGHT)
WIDTH ←(if (GEQ (IPLUS LEFT WIDTH)
SCREENWIDTH)
then (IDIFFERENCE SCREENWIDTH LEFT)
else WIDTH]
(SHOWGRAPH GRAPHER.GRAPH GRAPH.WINDOW (FUNCTION DINFO.UPDATE.FROM.GRAPH)
(FUNCTION DINFO.UPDATE.FROM.GRAPH])
(DINFO.INVERT.NODE
[LAMBDA (WINDOW DINFO.NODE DINFO.GRAPH) (* drc:
"25-Jan-86 18:24")
(LET*((NODE (for NODE in (fetch (GRAPH GRAPHNODES) of (WINDOWPROP WINDOW (QUOTE GRAPH)))
thereis (EQ (fetch (GRAPHNODE NODEID) of NODE)
DINFO.NODE)))
(LAST.NODE (fetch (DINFOGRAPH LAST.INVERTED.NODE) of DINFO.GRAPH)))
(replace (DINFOGRAPH LAST.INVERTED.NODE) of DINFO.GRAPH with NODE)
(if (NEQ NODE LAST.NODE)
then (replace (GRAPHNODE NODELABELSHADE) of NODE with BLACKSHADE)
(* (PRINTDISPLAYNODE
NODE (create POSITION
XCOORD ← 0 YCOORD ← 0)
WINDOW))
(replace (GRAPHNODE NODELABELSHADE) of LAST.NODE with WHITESHADE)
(* (PRINTDISPLAYNODE
LAST.NODE (create
POSITION XCOORD ← 0
YCOORD ← 0) WINDOW))
(REDISPLAYW WINDOW)
else (OPENW WINDOW])
(DINFO.LAYOUTGRAPH
[LAMBDA (DINFO.GRAPH NODE) (* drc:
"25-Jan-86 18:20")
(LET*[(WINDOW (fetch (DINFOGRAPH WINDOW) of DINFO.GRAPH))
(FONT (OR (FONTP (fetch (DINFOGRAPH MENUFONT) of DINFO.GRAPH))
MENUFONT))
(NODELST (fetch (DINFOGRAPH NODELST) of DINFO.GRAPH))
(CHILDREN (for ID in (fetch (DINFONODE CHILDREN) of NODE) collect (FASSOC ID NODELST)))
[CHILD.GRAPHER.NODES (for CHILD in CHILDREN
collect (create GRAPHNODE
NODEID ← CHILD
NODELABEL ←(fetch (DINFONODE LABEL) of CHILD]
(GRAPHER.NODE (create GRAPHNODE
NODELABELSHADE ← BLACKSHADE
NODEID ← NODE
TONODES ← CHILDREN
NODELABEL ←(fetch (DINFONODE LABEL) of NODE]
(replace (DINFOGRAPH LAST.INVERTED.NODE) of DINFO.GRAPH with GRAPHER.NODE)
(* so DINFO.INVERT.NODE
will work right)
(if (fetch (DINFONODE PARENT) of NODE)
then (LET*((PARENT (FASSOC (fetch (DINFONODE PARENT) of NODE)
NODELST))
(SIBLINGS (for ID in (fetch (DINFONODE CHILDREN) of PARENT)
collect (FASSOC ID NODELST)))
[SIBLING.GRAPHER.NODES (for SIBLING in SIBLINGS
collect (if (EQ (fetch (DINFONODE ID) of SIBLING)
(fetch (DINFONODE ID) of NODE))
then GRAPHER.NODE
else (create GRAPHNODE
NODEID ← SIBLING
NODELABEL ←(fetch (DINFONODE
LABEL)
of SIBLING]
(PARENT.GRAPHER.NODE (create GRAPHNODE
NODEID ← PARENT
NODELABEL ←(fetch (DINFONODE LABEL) of PARENT)
TONODES ← SIBLINGS)))
(LAYOUTGRAPH (CONS PARENT.GRAPHER.NODE (NCONC SIBLING.GRAPHER.NODES
CHILD.GRAPHER.NODES))
(LIST PARENT)
NIL FONT))
else (LAYOUTGRAPH (CONS GRAPHER.NODE CHILD.GRAPHER.NODES)
(LIST NODE)
NIL FONT])
)
(DEFINEQ
(DINFO.UPDATE.TEXT.DISPLAY
[LAMBDA (GRAPH NODE SEL OFF?) (* drc:
"25-Jan-86 18:18")
(LET ((WINDOW (fetch (DINFOGRAPH WINDOW) of GRAPH))
(FILENAME (DINFO.GET.FILENAME GRAPH NODE))
(FROM (fetch (DINFONODE FROMBYTE) of NODE))
(TO (fetch (DINFONODE TOBYTE) of NODE))
(PROPS (APPEND (LIST (QUOTE READONLY)
T
(QUOTE NOTITLE)
T
(QUOTE TITLEMENUFN)
(QUOTE DINFO.TITLEMENUFN))
(fetch (DINFOGRAPH TEXTPROPS) of GRAPH)))
(OLD.TEXTSTREAM (WINDOWPROP (fetch (DINFOGRAPH WINDOW) of GRAPH)
(QUOTE TEXTSTREAM)))
TEXTSTREAM FULLFILENAME) (* Default directory and
host.)
(if (OR OFF? (NULL FILENAME))
then (OPENTEXTSTREAM (if OFF?
then ""
else "This node has no text")
WINDOW NIL NIL PROPS)
(replace (DINFOGRAPH LAST.TEXT) of GRAPH with NIL)
elseif (SETQ FULLFILENAME (MKATOM (INFILEP FILENAME)))
then (SETQ TEXTSTREAM (DINFO.OPENTEXTSTREAM FULLFILENAME WINDOW FROM TO PROPS))
(DINFO.SHOWSEL TEXTSTREAM SEL)
else (OPENTEXTSTREAM (CONCAT "Sorry, can't find the text for this node."
(MKSTRING (CHARACTER (CHARCODE CR)))
"Missing file is: " FILENAME)
WINDOW NIL NIL PROPS)
(replace (DINFOGRAPH LAST.TEXT) of GRAPH with NIL))
(CLOSEF? OLD.TEXTSTREAM)
(WINDOWPROP WINDOW (QUOTE ICONFN)
(QUOTE DINFO.ICONFN))
(WINDOWPROP WINDOW (QUOTE TEDIT.TITLEMENUFN)
(QUOTE DINFO.TITLEMENUFN])
(DINFO.TITLEMENUFN
[LAMBDA (DINFOW) (* drc:
"25-Jan-86 18:19")
(* * This is the TEdit TITLEMENUFN for a DInfo Window.
Uses the MENUFN of graph, defaulting to DINFO.DEFAULT.MENU.)
(LET [(GRAPH (WINDOWPROP DINFOW (QUOTE DINFOGRAPH]
(if (OBTAIN.MONITORLOCK (fetch (DINFOGRAPH MONITORLOCK) of GRAPH)
T)
then [LET ((MENUFN (fetch (DINFOGRAPH MENUFN) of GRAPH)))
(if (FGETD MENUFN)
then (OR (fetch (DINFOGRAPH FMENU.WINDOW) of GRAPH)
(DINFO.ADD.FMENU GRAPH))
(RESETFORM (TTYDISPLAYSTREAM (GETPROMPTWINDOW DINFOW))
(APPLY* MENUFN GRAPH))
else (RESETFORM (TTYDISPLAYSTREAM (GETPROMPTWINDOW DINFOW))
(DINFO.DEFAULT.MENU GRAPH]
else (FLASHWINDOW DINFOW)
(PROMPTPRINT "DInfo is busy"])
(DINFO.OPENTEXTSTREAM
[LAMBDA (FILE WINDOW FROM TO PROPS) (* drc:
"25-Jan-86 18:24")
(RESETFORM (TTYDISPLAYSTREAM (GETPROMPTWINDOW WINDOW))
(LET ((TEXTSTREAM (WINDOWPROP WINDOW (QUOTE TEXTSTREAM)))
(THIS.TEXT (LIST FILE FROM TO)))
(if (AND (EQUAL THIS.TEXT (fetch (DINFOGRAPH LAST.TEXT) of (DINFOGRAPH WINDOW)))
TEXTSTREAM)
then (* Same text, and its
still there, so do
nothing.)
TEXTSTREAM
else (AND TEXTSTREAM (TEDIT.KILL TEXTSTREAM))
(CLEARW T)
(CLEARW WINDOW)
[RESETSAVE NIL (BQUOTE (AND RESETSTATE (WINDOWPROP , WINDOW (QUOTE LAST.TEXT)
NIL]
(PRINTOUT T "Fetching text from " FILE "...")
(PROG1 (OPENTEXTSTREAM FILE WINDOW FROM TO PROPS)
(PRINTOUT T "OK.")
(replace (DINFOGRAPH LAST.TEXT) of (DINFOGRAPH WINDOW) with THIS.TEXT])
(DINFO.SHOWSEL
[LAMBDA (TEXTSTREAM SEL) (* drc:
"16-Jan-86 21:30")
(if (LISTP SEL)
then (TEDIT.NORMALIZECARET TEXTSTREAM (TEDIT.SETSEL TEXTSTREAM (CADR SEL)
0))
elseif (STRINGP SEL)
then [LET ((CHAR# (TEDIT.FIND TEXTSTREAM SEL)))
(if CHAR#
then (TEDIT.NORMALIZECARET TEXTSTREAM (TEDIT.SETSEL TEXTSTREAM CHAR#
(NCHARS SEL)
NIL T]
else (TEDIT.NORMALIZECARET TEXTSTREAM (TEDIT.SETSEL TEXTSTREAM 0 0])
(DINFO.GET.FILENAME
[LAMBDA (GRAPH NODE) (* drc:
"10-Jan-86 14:47")
(* * returns the filename of the documentation for NODE in GRAPH.
Defaults HOST and DIRECTORY to that of graph)
(LET ((FILE (fetch (DINFONODE FILE) of NODE)))
(AND FILE (PACKFILENAME (QUOTE HOST)
(OR (FILENAMEFIELD FILE (QUOTE HOST))
(fetch (DINFOGRAPH DEFAULTHOST) of GRAPH))
(QUOTE DEVICE)
(OR (FILENAMEFIELD FILE (QUOTE DEVICE))
(fetch (DINFOGRAPH DEFAULTDEVICE) of GRAPH))
(QUOTE DIRECTORY)
(OR (FILENAMEFIELD FILE (QUOTE DIRECTORY))
(fetch (DINFOGRAPH DEFAULTDIR) of GRAPH))
(QUOTE BODY)
FILE])
)
(ADDTOVAR BackgroundMenuCommands (DInfo (DINFO.SELECT.GRAPH)
"Open a DInfo window for browsing documentation."))
(RPAQQ BackgroundMenu NIL)
(RPAQ? DINFO.GRAPHS )
(RPAQ? DINFOMODES (QUOTE (TEXT GRAPH)))
(RPAQ? DINFO.HISTORY.LENGTH 20)
(RPAQ? \DINFO.MAX.MENU.LEN 10)
(DECLARE: DOEVAL@COMPILE DONTCOPY
(GLOBALVARS DINFO.GRAPH.FILES DINFOMODES DINFO.HISTORY.LENGTH \DINFO.MAX.MENU.LEN)
)
(PUTPROPS DINFO COPYRIGHT ("Xerox Corporation" 1985 1986))
(DECLARE: DONTCOPY
(FILEMAP (NIL (7905 27048 (DINFO 7915 . 9591) (DINFO.UPDATE 9593 . 12559) (DINFOGRAPH 12561 . 13057) (
DINFO.SPECIAL.UPDATE 13059 . 14820) (DINFO.READ.GRAPH 14822 . 16940) (DINFO.WRITE.GRAPH 16942 . 18511)
(DINFO.SELECT.GRAPH 18513 . 19462) (DINFO.DEFAULT.MENU 19464 . 23020) (DINFO.FIND 23022 . 25497) (
DINFO.LOOKUP 25499 . 27046)) (27049 29702 (DINFO.READ.KOTO.GRAPH 27059 . 29700)) (29703 32258 (
DINFO.SETUP.WINDOW 29713 . 30485) (DINFO.CLOSEFN 30487 . 30947) (DINFO.SHRINKFN 30949 . 31204) (
DINFO.EXPANDFN 31206 . 31808) (DINFO.ICONFN 31810 . 32256)) (32259 44607 (DINFO.ADD.FMENU 32269 .
33497) (DINFO.CREATE.FMENU 33499 . 38139) (DINFO.FMW.CLOSEFN 38141 . 38950) (DINFO.FMENU.HANDLER 38952
. 39675) (DINFO.UPDATE.FMENU 39677 . 42095) (DINFO.TOGGLE.MENU 42097 . 42707) (DINFO.TOGGLE.GRAPH
42709 . 43187) (DINFO.TOGGLE.HISTORY 43189 . 43753) (DINFO.TOGGLE.TEXT 43755 . 44605)) (44608 51998 (
DINFO.UPDATE.MENU.DISPLAY 44618 . 48468) (DINFO.UPDATE.FROM.MENU 48470 . 48854) (DINFO.UPDATE.HISTORY
48856 . 51172) (DINFO.HISTORIC.UPDATE 51174 . 51996)) (51999 62206 (DINFO.UPDATE.GRAPH.DISPLAY 52009
. 53513) (DINFO.UPDATE.FROM.GRAPH 53515 . 54160) (DINFO.GET.GRAPH.WINDOW 54162 . 54870) (
DINFO.CREATE.GRAPH.WINDOW 54872 . 55934) (DINFO.SHOWGRAPH 55936 . 57577) (DINFO.INVERT.NODE 57579 .
59129) (DINFO.LAYOUTGRAPH 59131 . 62204)) (62207 68719 (DINFO.UPDATE.TEXT.DISPLAY 62217 . 64350) (
DINFO.TITLEMENUFN 64352 . 65488) (DINFO.OPENTEXTSTREAM 65490 . 66915) (DINFO.SHOWSEL 66917 . 67697) (
DINFO.GET.FILENAME 67699 . 68717)))))
STOP