<* PRAGMA LL *>A
View.T is the common supertype used by the source and drawing views. 
INTERFACEIfView ; IMPORT Editor, CurrCmd, Marquee; IMPORT FormsVBT; IMPORT Filter, ButtonVBT; TYPE T = Filter.T OBJECT root: Root METHODS <* LL.sup <= VBT.mu *> update(); <* LL.sup < SELF *> modified(how: ModKind); END; ModKind = { Explicit, ImplicitConsistent, ImplicitOutOfDate };
t is a View.T, then t.update is responsible for making the view
   t contain the truth according to the current command t.root.ccmd; the
   method requires t.root.astTrue.
   The method t.modified is called whenever the view is modified. If the
   how argument is Explicit, then t was edited explicitly through t.
   Otherwise, t was edited implicitly through some other view. If how is
   ImplicitConsistent, then the view through which the edit was actually
   made is consistent with the change to t. If how is ImplicitOutOfDate,
   then the view through which the edit was actually made is out-of-date with
   respect to t. 
PSImpl  <: T;
  Drawing <: PSImpl;
  Root = OBJECT
    ccmd: CurrCmd.T;
    drawing: Drawing;
    animView, currView: PSImpl;
    source: T;
    editor: Editor.T;
    modules: EditorList := NIL;
    currButton: ButtonVBT.T;
    dTrue, astTrue, sTrue, eTrue: BOOLEAN;
    skipify := FALSE;
    marquee: Marquee.T;
  END;
 A View.Root contains the shared data visible to all the views and the
   top-level Juno window. The fields drawing, source, editor, and
   modules point to the drawing view, source view, anonymous module editor,
   and named module editors, respectively.
   When Juno is used as a remote Zeus animation view, animView is the
   animation view. In any case, currView is either drawing or animView,
   and is the view all graphics are drawn to by the implementation of the PS
   module.
   CurrButton is the current ToolBox.Button.
   The booleans dTrue, sTrue, astTrue, and eTrue reflect whether the
   drawing, source, AST, and compiled editor scope contain the truth,
   respectively.
   If skipify is TRUE, we will solve only (and not run) when the current
   command is run implicitly (e.g., for repaints and during drags). 
EditorList = REF RECORD
    view: Editor.T;
    form: FormsVBT.T := NIL; (* actually of type "Juno.Toolbox" *)
    mod: TEXT;
    next: EditorList
  END;
 An EditorList is a list of open module editors. If e: EditorList, then
   e.view is the module editor, e.form is the toolbox form for the module
   (or NIL if none has been created yet for this module), and e.mod is the
   name of the module. 
END View.