NodeStyleWorks.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Written by Bill Paxton, January 1981
Last changed by Bill Paxton, December 21, 1982 9:49 am
Last Edited by: Maxwell, January 6, 1983 8:08 am
Doug Wyatt, March 2, 1985 5:43:49 pm PST
Michael Plass, March 14, 1985 4:51:01 pm PST
Rick Beach, March 19, 1985 6:10:20 pm PST
This is where the style machinery lives.
DIRECTORY
NodeStyle USING [NameParam, RealParam, Ref],
NodeStyleOps USING [OfStyle],
Rope USING [ROPE],
TextLooks USING [Looks],
TJaM USING [Frame, PushInteger, PushReal, PopReal];
NodeStyleWorks: CEDAR DEFINITIONS
IMPORTS TJaM
= BEGIN OPEN NodeStyle;
Object: TYPE = TJaM.Object;
OfStyle: TYPE = NodeStyleOps.OfStyle;
Execution Frames for Style Machinery
Frame: TYPE = TJaMInternal.Frame;
GetFrame: PROC [style: Ref, styleName: ATOM, kind: OfStyle] RETURNS [frame: Frame];
FreeFrame: PROC [frame: Frame, styleName: ATOM, kind: OfStyle];
StyleForFrame: PROC [frame: Frame] RETURNS [style: Ref];
Style Dictionaries
InitDict: PROC [name: ATOM, size: CARDINAL ← 100] RETURNS [dictionary: Object];
Create a dictionary and name it in the system dictionary, .sysdict
InitStyleDict: PROC;
InitStylesDict: PROC;
InitBindingDict: PROC;
InitAttachmentsDict: PROC;
GetStyleDict: PROC [frame: Frame, styleName: ATOM, kind: OfStyle, def: Rope.ROPENIL]
RETURNS
[d: dict Object];
BadStyleFile: PROC [frame: Frame, styleName: ATOM];
RunStyle: PROC [frame: Frame, styleName: ATOM] RETURNS [ok: BOOL];
RunStyleString: PROC [frame: Frame, styleName: ATOM, def: Rope.ROPE] RETURNS [ok: BOOL];
sysdict: Object; -- system dictionary
userdict: Object; -- user dictionary with helpful stuff and errordefs
styledict: Object; -- style dictionary has Tioga style machinery names
stylesDictsNames: REF ARRAY OfStyle OF ATOM;
names are TiogaBaseStylesDictionary, TiogaPrintStylesDictionary, TiogaScreenStylesDictionary
stylesDicts: REF ARRAY OfStyle OF dict Object;
bindingDictName: ATOM; -- TiogaBindingDictionary
attachmentsDictName: ATOM; -- TiogaAttachedStylesDictionary
styledictName: ATOM;
ForEachAttachedStyle: PROC [dictName: ATOM,
proc: PROC [attached: ATOM] RETURNS [stop: BOOL]
];
Executing Style Rules
ExecuteName: PROC [frame: Frame, name: ATOM] RETURNS [ok: BOOL];
ExecuteNameInStyle: PROC [ref: Ref, kind: OfStyle, styleName: ATOM] RETURNS [ok: BOOL];
ExecuteObjectInStyle: PROC [ref: Ref, kind: OfStyle, object: Object] RETURNS [ok: BOOL];
ExecuteLooksInStyle: PROC [ref: Ref, kind: OfStyle, looks: TextLooks.Looks]
RETURNS [ok: BOOL];
executingName: ATOM; -- for debugging
StyleError: PROC [frame: Frame, num: INTEGER]; -- number of things to print
load: Object;
get: Object;
run: Object;
start: Object;
Types for Implementing Style Commands
LoadProc: TYPE = PROC [frame: Frame, p: Param, style: Ref];
StoreProc: TYPE = PROC [frame: Frame, p: Param, style: Ref];
AddRealProc: TYPE = PROC [frame: Frame, inc: REAL, p: Param, style: Ref];
PercentProc: TYPE = PROC [frame: Frame, percent: REAL, p: Param, style: Ref];
SetNameProc: TYPE = PROC [frame: Frame, name: ATOM, p: Param, style: Ref];
Param: TYPE = REF ParamRec;
ParamRec: TYPE = RECORD [
ops: Ops,
opName: REF READONLY TEXT,
data: SELECT kind: OfParam FROM
name => [ param: NameParam ],
real => [ param: RealParam ],
glue => [ size, stretch, shrink: RealParam ],
color => [ hue, saturation, brightness: RealParam ],
misc => [],
ENDCASE
];
OfParam: TYPE = { name, real, glue, color, misc };
Ops: TYPE = REF OpsRec;
OpsRec: TYPE = RECORD [
Load: LoadProc, Store: StoreProc, AddReal: AddRealProc,
Percent: PercentProc, SetName: SetNameProc
];
Implementing Style Operations
opsList: LIST OF RECORD[name: REF READONLY TEXT, op: PROC [frame: Frame]];
Preregister: PROC [param: Param, op: PROC [frame: Frame]] RETURNS [Param];
DoStyleOp: PROC [frame: Frame, p: Param];
StoreError: StoreProc;
AddRealError: AddRealProc;
PercentError: PercentProc;
SetNameError: SetNameProc;
Named Attribute Parameter Operations
nameOps: Ops;
LoadNameParam: LoadProc;
SetNameParam: SetNameProc;
NameError: PROC [frame: Frame, name: ATOM, p: Param];
Real Parameter Operations
realOps: Ops;
RealOpLoad: LoadProc;
RealOpSetReal: StoreProc;
RealOpAddReal: AddRealProc;
RealOpPercent: PercentProc;
Glue Parameter Operations
glueOps: Ops;
GlueOpLoad: LoadProc;
GlueOpSetReal: StoreProc;
GlueOpAddReal: AddRealProc;
GlueOpPercent: PercentProc;
Color Parameter Operations
colorOps: Ops;
ColorOpLoad: LoadProc;
ColorOpSetReal: StoreProc;
ColorOpAddReal: AddRealProc;
ColorOpPercent: PercentProc;
Support Procs
GetCommand: PROC [frame: Frame, name: ATOM] RETURNS [command Object];
GetObject: PROC [frame: Frame, name: ATOM] RETURNS [ob: Object];
ForceLowerName: PUBLIC PROC [n: ATOM] RETURNS [ATOM];
PushText: PROC [frame: Frame, txt: LONG STRING];
PushObject: PROC [frame: Frame, ob: Object];
PopObject: PROC [frame: Frame] RETURNS [Object];
PushName: PROC [frame: Frame, name: ATOM];
PopName: PROC [frame: Frame] RETURNS [ATOM];
PushInteger: PROC [frame: Frame, val: INTEGER] = TRUSTED INLINE {
TJaMOps.PushInteger[frame.opstk,val] };
PushReal: PROC [frame: Frame, val: REAL] = TRUSTED INLINE {
TJaMOps.PushReal[frame.opstk,val] };
PopReal: PROC [frame: Frame] RETURNS [REAL] = TRUSTED INLINE {
RETURN [TJaMOps.PopReal[frame.opstk]] };
TryToPopName: PROC [frame: Frame] RETURNS [name: ATOM, ok: BOOL];
TryToPopReal: PROC [frame: Frame] RETURNS [value: REAL ← 0.0, ok: BOOL];
TryToPopString: PROC [frame: Frame] RETURNS [string: string TJaMBasic.Object, ok: BOOL];
TypeCheckName: PROC [obj: Object] RETURNS [ATOM];
TypeCheckDict: PROC [obj: Object] RETURNS [dict Object];
TypeCheckCommand: PROC [obj: Object] RETURNS [command Object];
Support for initializing style parameters
SpecialOpArray: PROC [name: ATOM, op: Object]
RETURNS
[key: ATOM, array: array Object];
StyleParamKey: PROC [name: ATOM] RETURNS [key: ATOM];
DefineSpecialOp: PROC [frame: Frame, name: ATOM, proc: TJaM.CommandProc]
RETURNS [op: Object];
RegisterStyleCommand: PROC [frame: Frame, name: ATOM, proc: TJaM.CommandProc];
RegisterStyleLiteral: PROC [frame: Frame, name: ATOM];
END.