File: Nut.mesa
Implemented by: NutImpl as part of the Nuts package
Contents: An interface to allow Cypress application programs for different database entity types to call each other without knowing about each other beforehand. Each application implements one or more "nut" types; nuts are viewers on Cypress entities.
Created by: Rick Cattell on 11-Dec-81 12:29:29
Donahue, March 14, 1986 1:39:53 pm PST
Last edited by:
Rick Cattell on July 22, 1983 2:31 pm
Willie-Sue on January 21, 1983 8:48 am
Jim Donahue on February 1, 1985 9:20:09 am PST
Margaret Butler on July 11, 1984 4:25:11 pm PDT
Jennifer Widom on June 14, 1984 3:38:45 pm PDT
DIRECTORY
DBDefs, Rope, ViewerClasses;
Nut: CEDAR DEFINITIONS =
BEGIN OPEN DBDefs;
ROPE: TYPE = Rope.ROPE;
Viewer: TYPE = ViewerClasses.Viewer;
Interaction between nuts: these are implemented in NutImpl.mesa. Each nut implementation registers itself as knowing how to display or edit some set of domains (a domain is a type of entity, see DB), with the Register proc. Any application can then call one of the following procs to invoke whoever has registered himself for an entity type. NoRegistration is raised if no Implementations have been registered.
NutProc: TYPE = PROC[eName, domain: ROPE, segment: Segment, parent: Viewer ← NIL];
Return a viewer for displaying or editing the database entity with the given name and domain.
NoRegistration: ERROR;
Register: PROC[domain: ROPE, segment: Segment, display: NutProc ← NIL, edit: NutProc ← NIL];
register new procedures for a given domain and segment; if either of the display or edit procs are NIL, then the current registration is used. All previous registrations are lost
DeRegister: PROC[domain: ROPE, segment: Segment];
Deregisters all procs for this domain
Push: PROC[ domain: ROPE, segment: Segment, display: NutProc ← NIL, edit: NutProc ← NIL];
Pushes new registrations on the list (the old ones are retained). Again, if the display or edit procs supplied are NIL, then the current registration is used.
Pop: PROC[domain: ROPE, segment: Segment];
Deregisters top procs for this domain
RegistrationExists: PROC[domain: ROPE, segment: Segment] RETURNS[ok: BOOL];
Is there a registration for this domain and segment
Display: PROC[eName, domain: ROPE, segment: Segment, parent: Viewer ← NIL];
If a nut implementation has been registered for the domain and segment, that implementation will be called, else the registered default implementation will be used.
Edit: PROC[eName, domain: ROPE, segment: Segment, parent: Viewer ← NIL];
If a nut implementation has been registered for the domain and segment, that implementation will be called, else the registered default implementation will be used.
To allow reuse of viewers (rather than forcing new viewers to always be created when displaying new entities), applications may use the Spawned and Frozen properties to maintain the "last viewer" created from a parent.
SetSpawnedProperty: PROC[of: Viewer, is: Viewer] RETURNS[previous: Viewer];
Set the "spawned" property of the first viewer to point to the second. The previous value is returned.
GetSpawnedProperty: PROC[of: Viewer] RETURNS[current: Viewer];
Set the "spawned" property of the first viewer to point to the second. The previous value is returned.
GetSpawnedParent: PROC[of: Viewer] RETURNS[parent: Viewer];
If this viewer was spawned from some other viewer, return the parent
SetFrozenProperty: PROC[v: Viewer, new: BOOL] RETURNS[previous: BOOL];
Set the "frozen" property of the viewer and return its previous value. If the value of this property is TRUE (the default is FALSE), then the viewer will not be used as a "spawned" viewer.
GetFrozenProperty: PROC[v: Viewer] RETURNS[current: BOOL];
Set the "frozen" property of the viewer and return its previous value. If the value of this property is TRUE (the default is FALSE), then the viewer will not be used as a "spawned" viewer.
GetNutInfo: PROC[v: Viewer] RETURNS[segment: Segment, domain, entity: ROPE];
Returns information about the database entity being displayed in the viewer. These properties are set by the display, etc. procs in Nut for viewers that are created by calling through the Nut interface; they can also be set explicitly for other viewers by calling the SetNutInfo procedure given below.
CopyNutInfo: PROC[from: Viewer, to: Viewer];
Copy all of the Nut information properties.
ChangeName: PROC [v: Viewer, newName: Rope.ROPE];
Change the entity name associated with the viewer (to reflect executing a DB.ChangeName on the corresponding entity).
EntityNameForViewer: PROC [v: Viewer] RETURNS [entityName: ROPE];
Return the DBNames form of the entity for the viewer.
SetNutInfo: PROC[v: Viewer, segment: Segment, domain, entity: ROPE];
Sets the properties of the viewer to remember the DB entity displayed
END. . .
Change Log:
Edited by Rick on March 18, 1982 11:50 am: Major reorganization. Register now allows registration of all or some of the three procedures, and replaces any previous registration for that domain with the new one. Edit take init REF ANY. DisplayProc, EditProc, QueryProc take new viewer on calls out from Nut, old viewer on calls into Nut. Added close and open notify procs.
Edited by Rick on March 25, 1982 4:29 pm: Added user interaction procs section, dump and load stuff.
WSH on April 1, 1982: added MessageConfirm
Rick on April 3, 1982 4:29 pm: added width option to button. Added CreateProc feature.
Willie-Sue on July 8, 1982: changed EnumerateNutList, created NutPrivate.mesa, NutListImpl.mesa
Willie-Sue on July 27, 1982: changed EnumerateNutList to return LIST OF NutRec.
Cattell on August 5, 1982 7:11 pm: added init parm to Display, Create procs. Added GetDBTransaction proc.
Maxwell on September 8, 1982 9:29 am: moved procedures to Palm and SquirrelOps
Cattell on April 12, 1983 1:16 pm: fixed up some outdated comments.
Butler on June 26, 1984 3:58:24 pm PDT:
Major rewrite has been completed. Push, PushDefaults, and Pop have been added. Display, Edit, and Query now take the same arguments in the same order. See NutImpl for details of implementation changes.
Donahue on July 12, 1984 1:01:04 pm PDT:
Changed structure of Nut one final time: Domain is passed as a ROPE, so that no opportunities for DB aborts can arise. All procs take a "parent" viewer as argument and pass "last spawned" viewer to the display, etc. proc registered. Freeze moved here from NutViewer and changed slightly.
Donahue on September 13, 1984 12:00:42 pm PDT:
Two major changes: threw away query procs -- nobody implements them anyhow. And, removed PushDefaults, which used to register default displayers and editors. The new religion is that Squirrel will use its own version of Cypress and will handle its own transactions on the database -- thus, it will not register defaults for use by other clients, but will keep them hidden within itself. (Squirrel will be willing to use registrations made by other applications, though.)