############################################################################
#
#	File:     drawlab.icn
#
#	Subject:  Procedure to draw figures
#
#	Author:   Ralph E. Griswold
#
#	Date:     August 3, 2000
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This procedure is a general-purpose interface used by various programs
#  that draw figures of various kinds.
#
#  Although it's listed as requiring graphics, that's really not necessary
#  for interfaces to other devices or just producing coordinates.
#
############################################################################
#
#  Requires:  Version 9 graphics
#
############################################################################
#
#  Links:  ifg, gtrace, gdisable, wopen, xgtrace
#
############################################################################

link ifg
link gtrace
link gdisable
link wopen
link xgtrace

global size	# can be set by caller to control the window size

procedure drawlab(p, callt, label)
   local line, ws, calls, arg, trace, dlist, name

   /size := 600

   ws := ' \t'

   calls := callt()

   dlist := []
   every put(dlist, key(calls))
   dlist := sort(dlist)

#  If a window can be opened, set things up for drawing.  If not, just
#  list coordinates.  (This is useful for testing when an X server
#  is not available.)

   if ifg() then {
      WOpen("label=" || label, "width=" || size, "height=" || size) |
         stop("*** cannot open window")
      trace := line_trace
      }
   else {
      gdisable()
      trace := list_coords
      }

   while line := read() do {
      EraseArea()			# clear window if there is one
      args := []
      line ? {
         tab(many(ws))
         if ="=" then {
            name := tab(0)
            GotoRC(2, 2)
            writes(&window, name)
            trace(\calls[name]) | {
               write(&errout, "*** erroneous specification")
               next
               }
            }
         else if ="all" then {
            every name := !dlist do {
               GotoRC(2, 2)
               writes(&window, name)
               trace(calls[name])
               Event()
               EraseArea()
               }
            }
         else {				# not tested yet
            tab(many(ws))
            while arg := tab(upto(',')) do {
               if *arg = 0 then put(args, &null) else {
                  put(args, numeric(arg)) | {
                     write(&errout, "*** erroneous specification")
                     next
                     }
                  }
               move(1) | break
               tab(many(ws))
               }
            trace(call(p, args))
            }
         }
      }

end
