<* PRAGMA LL *>All components (forms/frames/widgets) in
NodeVBT are instances
of NodeVBT
INTERFACENodeVBT ; IMPORT DialogMenu, FormsVBT, Rd, Wr, ZHandleVBT; EXCEPTION InvalidObjectName(TEXT); InstanceListFull(TEXT); InvalidNode; TYPE Tuple = RECORD class : TEXT; name: TEXT; END; (* This is a storage format for pointers. class = "NIL" represents a nil pointer *) T <: Public; Public = ZHandleVBT.T OBJECT parent : T; partuple : Tuple; name : TEXT; x, y : INTEGER; (* computed when needed *) width : INTEGER := 50; (* computed when needed *) height : INTEGER := 50; (* computed when needed *) BgColor : TEXT := "LightYellow"; FgColor : TEXT := "Black"; Font : TEXT := "Fixed"; Rim : CARDINAL := 1; Border : CARDINAL := 1; Embellishment: TEXT := "Flat"; (* possible values are "Flat", "Raised", "Lowered", "Chiseled" , "Ridged" and "None" *) InitialState: TEXT := "Active"; (* possible values are "Active", "Passive", "Dormant", "Vanish" *) Foreground: BOOLEAN := TRUE; Local : BOOLEAN := TRUE; Location : TEXT := ""; DialogSX: TEXT; (* current SX expression by customizing SXTemplate *) Code : TEXT := ""; (* This is Callback code for widgets and Initialization code for splitnodes *) ResizeModel : TEXT := "Scaled"; (* possible values are "CenterPin", "Scaled", "HScaled", "VScaled" *) classIndex: CARDINAL; METHODS <* LL <= VBT.mu *> loadAttributes (v: FormsVBT.T); (* load attributes into the attribute sheet *) (* you will override this method to add attribute sheet initialization code *) (* be sure to call NodeVBT.T.loadAttributes within your method *) checkAttributes (as: FormsVBT.T; VAR error: TEXT): BOOLEAN; (* checks the validity of all the attributes entered by the user *) (* returns FALSE if there is an error and sets the error message *) (* you will override this method to add code to check the validity of your fields in the attribute sheet *) (* be sure to call NodeVBT.T.checkAttributes if you do not have an error *) applyAttributes (as: FormsVBT.T); (* make the changes effective *) (* you will override this in order to make changes to the attributes specific to your widget *) (* When you override this be sure to FIRST call the NodeVBT.applyAttributes method *) computeSX (Final: BOOLEAN := FALSE): TEXT; (* this uses the current attributes to customize SXTemplate giving the current s-expression, which is stored in DialogSX - this is also returned. If Final is set then it generates the s-expressions for contained objects and anchored forms as well and is recursive. *) generateObjectDefs (): TEXT; (* generates code for the objects representing the widgets forms collect object defs for all components & menus & attached forms frames collect object defs for all components typically one def per widget unless overridden *) generateCallbacks (): TEXT; (* forms and frames have not callbacks but others do forms collect callbacks for all components & menus & attached forms frames collect callbacks for all components typically one callback per widget unless overridden *) generateAttachments() : TEXT; (* generates the formsvbt attachment typically one per widget unless overridden e.g. filebrowser forms collect attachments for all components & menus & attached forms frames collect attachments for all components *) generateInitializationCode() : TEXT; (* forms and frames have intialization code the order of initialization is depth first *) (* These 4 methods are invoked on a FormNode which may in turn invoke methods in components *) SXTemplate() : TEXT; (* returns the template for this class *) save(fv : FormsVBT.T; s : Wr.T); load(fv : FormsVBT.T; s: Rd.T); initObliqAttrs() : TEXT; (* generates the obliq widget constructor argument-list *) END; Widget <: PublicWidget; PublicWidget = T OBJECT END; SplitNode <: PublicSplit; PublicSplit = T OBJECT children: ARRAY [1 .. 50] OF T; (* anchored forms do not count as children *) (* the array is compacted so that 1..nc is filled *) childtuples : ARRAY[1..50] OF Tuple; (* computed when needed *) nc: CARDINAL := 0; END; FormNode <: PublicForm; PublicForm = SplitNode OBJECT HasMenu : BOOLEAN := FALSE; MenuBgColor: TEXT := "VeryPaleYellow"; MenuFgColor: TEXT := "Black"; MenuFont : TEXT := "-*-helvetica-bold-*R-120-*"; Menu : REF ARRAY OF DialogMenu.T := NIL; ParentForm: FormNode := NIL; Partuple : Tuple; (* this is always up to date *) SupportCode : TEXT := ""; (* may be used by all widgets within the form *) ChildForms: ARRAY [0 .. 50] OF FormNode; (* computed when needed *) (* anchored forms - ChildForms is a misnomer *) NoOfChildren: CARDINAL; (* not guaranteed to be up to date *) Screen : CARDINAL; END; FrameNode <: PublicFrame; PublicFrame = SplitNode OBJECT END; Proc = PROCEDURE (): T; InfoDefn = RECORD topic: TEXT; info: TEXT; END; VAR defaultBgColor := "White"; defaultFgColor := "Black"; defaultFont := "Fixed"; defaultName := "Unnamed"; blowEditingFont := FALSE; PROCEDURE Register (className : TEXT; createProc : Proc; minParentWidth : INTEGER := 100; minParentHeight: INTEGER := 100; attrsheetName : TEXT := "Default"): CARDINAL;
This is used by various object classes to install their object types
An unique index is returned for each class that is registered If attrsheetName is
Default then className&att is used, otherwise
the user specified name is taken to be the name of the attr-sheet
page
NOTE : If your widget class is called foo then your dialog editor
widget should be called foo.fv, your attributes sheet tsplit extension
should normally be called fooatt and your widget menu entry will be
called FOO
Pick a size that is at least 50 points larger than the default size of
the widget, in each dimension
PROCEDURE NewObject (dialogFV : FormsVBT.T;
className: TEXT;
parent : T := NIL): T
RAISES {InvalidObjectName, InstanceListFull};
This also instantiates the name field and loads the default s-expression
PROCEDURE GetMinParentDimensions ( className : TEXT;
VAR minParentWidth : INTEGER;
VAR minParentHeight: INTEGER )
RAISES {InvalidObjectName};
minimum size of parent
PROCEDURE ReloadSExpressions();
Load S-expressions from files
PROCEDURE GetNodeIndex (v: T): CARDINAL RAISES {InvalidNode};
This returns a number that is unique for every node within a given class
PROCEDURE GetNodeTypeName (v: T): TEXT;
returns the name of the nodetype
PROCEDURE GetAttributeSheetName (v: T): TEXT;
returns name of the associated attribute sheet
PROCEDURE DeleteObject (obj: T);
This deletes it from the object manager database not from the dialog editor
PROCEDURE InsertObject (obj: T) RAISES {InstanceListFull};
This adds it to the object manager database not from the dialog editor
PROCEDURE NameToIndex (className: TEXT): CARDINAL
RAISES {InvalidObjectName};
PROCEDURE IndexToName (classIndex: CARDINAL): TEXT;
PROCEDURE NoOfClasses (): CARDINAL;
PROCEDURE NoOfObjects (index: CARDINAL): CARDINAL;
PROCEDURE GetFirst (classIndex: CARDINAL): T;
First object of this class
PROCEDURE GetNext (classIndex: CARDINAL): T;
Next object of this class - Do not create or delete nodes between GetFirst and GetNext
PROCEDURE GetNodeNamed (name: TEXT; classIndex: INTEGER := -1): T;
if you do not specify classIndex it will search all classes
returns NIL if not present
To help customize attributes ...
PROCEDURE FindAndReplace (string, quarry, replacement: TEXT;
delimiter : CHAR := '$'):
TEXT;
Replaces the first occurrence of <delimiter><quarry><delimiter> with <replacement>
PROCEDURE FAndRAll (string, quarry, replacement: TEXT;
delimiter: CHAR := '$'):TEXT;
recursive version that replaces all occurences
Warning - this includes the replacement as well - so it may never terminate if the replacement has the same quarry between the delimiters
PROCEDURE ComputeAnchoredFormTree ();
computes current values for
PROCEDURE ComputeDimensions (v: T);
computes current values for v.x v.y v.width and v.height
PROCEDURE AllWhitespace(t : TEXT) : BOOLEAN; PROCEDURE SaveToFile(fv : FormsVBT.T; s : Wr.T); PROCEDURE LoadFromFile(fv : FormsVBT.T; s : Rd.T); PROCEDURE ResetTables();
clean up tables
PROCEDURE RecursivelyDeleteFromTables(csn : T);
delete tree of nodes from tables
PROCEDURE RecursivelyInsertInTables (csn: T; s : ZHandleVBT.Selection);
insert tree of nodes into table
doesn't set any fields !
PROCEDURE print(c : TEXT); PROCEDURE Initialize (); PROCEDURE GetInfo(topic:TEXT) : REF InfoDefn;Routines to generate Obliq code for initializing widget attributes
PROCEDURE IntAttr(name:TEXT; arg : INTEGER): TEXT; PROCEDURE TextAttr(name:TEXT; arg :TEXT) : TEXT; PROCEDURE BoolAttr(name:TEXT; arg :BOOLEAN) : TEXT; END NodeVBT.