Copyright (C) 1992, Digital Equipment Corporation           
 All rights reserved.                                        
 See the file COPYRIGHT for a full description.              
 Last modified on Tue Sep 22 16:48:53 PDT 1992 by meehan     
      modified on Tue Jun 16 21:55:40 PDT 1992 by muller     
{\bf WARNING:} This interface is very tentative. It is likely to change quite soon.

A FormsEditVBT is a filter whose child is a FormsVBT. When you initialize a FormsEditVBT with a file or other description, you get a second FormsVBT, the {\it editor}, which can installed and used to edit the filter's child.

The stand-alone application called formsedit is the major client of this interface, but any program that constructs FormsVBT's can do so through this interface and get an editor that can change the form dynamically. This could be helpful during the development of an application, where changes can be made as the application is running. Obviously, you could do major damage to the application (by removing named VBTs, for instance), but having an online editor for changing colors and shapes, for example, could be valuable.

When the editor parses a new description, it constructs a new FormsVBT and replaces the filter's child with it, discarding the previous child, if any. It also copies all the attached procedures from the old child to the new child. Doing so will raise an error if the attachment fails, typically because the new form lacks a named VBT that the old form contained. No other state-information is preserved, such as the contents of text-fields.


IMPORT Filter, FormsVBT, Thread, TrestleComm, XParam;

  T <: Public;
  Public = Filter.T OBJECT
             editor (): FormsVBT.T;
             init (description: TEXT := NIL): T
                   RAISES {FormsVBT.Error}; <* LL = *>
             initFromFile (filename: TEXT): T
                           RAISES {FormsVBT.Error, Thread.Alerted};
             <* LL = *>
The init and initFromFile methods are nearly the same as those in the FormsVBT interface. The raw parameter is not supported, and the default value for description is NIL, which causes a ``dummy'' form to be used.

EditorRoot <: PublicRoot;
  PublicRoot =
    Thread.Closure OBJECT
      init (v: T; Xdisplay := ":0.0"; Xgeometry := "-50-50"):
            EditorRoot RAISES {TrestleComm.Failure, XParam.Error}

END FormsEditVBT.
Once a FormsEditVBT has been created, you use it to initialize an EditorRoot, along with specifications as to its initial placement. The EditorRoot's init method will install the VBT in Trestle. Then you call Thread.Fork on the initialized EditorRoot to start an editor. The EditorRoot's apply method will await the deletion of this and other VBTs: since the editor has facilities for opening other files, it may spawn other threads, all of which are connected to the EditorRoot. If you Alert the EditorRoot thread, or if the user activates the Quit button, all the threads will be be alerted, and the EditorRoot thread will return. If the user closes all the windows, the EditorRoot thread will return.

      TYPE MyEd = FormsEditVBT.T OBJECT ... END;
      WITH v = NEW (MyEd, ...).initFromFile ("myfile.fv"),
           eroot = NEW (FormsEditVBT.EditorRoot).init (v,
           thread = Thread.Fork (eroot) DO
        EVAL Thread.Join (thread)