<> <> <> <<>> DIRECTORY Atom USING [PropList], Cursors USING [CursorType], Icons USING [IconFlavor], Imager USING [Context], Menus USING [Menu], Rope USING [ROPE], TIPUser USING [TIPTable]; ViewerClasses: CEDAR DEFINITIONS = BEGIN Viewer: TYPE = REF ViewerRec; <> ViewerRec: TYPE = MACHINE DEPENDENT RECORD [ -- 35 words class: ViewerClass _ NIL, -- static info for all Viewers of this class ** wx, wy: INTEGER _ 0, -- position of viewer frame wrt parent's client space ww, wh: INTEGER _ 0, -- size of the viewer on the screen cx, cy: INTEGER _ 0, -- viewer client position wrt parent ** cw, ch: INTEGER _ 0, -- size of usable space wrt client ** lock: Lock _ [NIL, 0], -- locking information used by ViewerLocks * ** tipTable: TIPUser.TIPTable _ NIL, -- mouse and keyboard events, initialised from class name: Rope.ROPE _ NIL, -- Viewer name, displayed in caption (optional) menu: Menus.Menu _ NIL, -- copied from class; set with ViewerOps.SetMenu icon: Icons.IconFlavor _ unInit, -- picture to display when small, initialised from class column: Column _ left, -- screen space algorithm used when viewer is open scrollable: BOOL _ TRUE, -- optional scroll bar allocation iconic: BOOL _ TRUE, -- small or large representation on screen border: BOOL _ TRUE, -- WMgr paints a one dot black border around viewer newVersion: BOOL _ FALSE, -- hint that the user has made new edits ** newFile: BOOL _ FALSE, -- hint that a backing file does not yet exist ** visible: BOOL _ TRUE, -- WMgr maintained hint for repaint use * ** offDeskTop: BOOL _ FALSE, -- is viewer off of the current desktop? ** destroyed: BOOL _ FALSE, -- hint that viewer has been flushed from window tree ** init: BOOL _ FALSE, -- init proc call has been completed after creation * ** saveInProgress: BOOL _ FALSE, -- the saveProc has been called but not yet returned ** inhibitDestroy: BOOL _ FALSE, -- if TRUE then window menu will not permit destroy guardDestroy: BOOL _ FALSE, -- if TRUE then window menu will always guard destroy clientContext: BOOL _ FALSE, -- hint that client has installed a context for this viewer * ** spare: BOOL _ FALSE, -- unused; anyone need a bit? * ** link: Viewer _ NIL, -- ring of linked viewers ** position: INTEGER _ 0, -- for window positioning primitives use * ** openHeight: INTEGER _ 0, -- "ideal" height hint for open viewer parent: Viewer _ NIL, -- NIL if top level viewer ** sibling: Viewer _ NIL, -- sibling chain ** child: Viewer _ NIL, -- head of children chain ** props: Atom.PropList _ NIL, -- clients can associate properties with viewers ** data: REF ANY _ NIL -- data slot for Viewer Class implementor ]; <> ViewerClass: TYPE = REF ViewerClassRec; ViewerClassRec: TYPE = RECORD [ flavor: ViewerFlavor _ NIL, -- name of viewer's class notify: NotifyProc _ NIL, -- TIP input events parsed from tipTable paint: PaintProc _ NIL, -- called whenever the Viewer should repaint its contents modify: ModifyProc _ NIL, -- reports InputFocus changes destroy: DestroyProc _ NIL, -- called before Viewer structures freed on destroy copy: CopyProc _ NIL, -- copy data to new Viewer set: SetProc _ NIL, -- set the viewer contents get: GetProc _ NIL, -- get the viewer contents init: InitProc _ NIL, -- called on creation or reset to init client data save: SaveProc _ NIL, -- requests client to write contents to disk scroll: ScrollProc _ NIL, -- document scrolling caption: CaptionProc _ NIL, -- experimental proc for user caption display menu: Menus.Menu _ NIL, -- template menu used for top-level viewers tipTable: TIPUser.TIPTable _ NIL, -- table to parse mouse & keyboard events coordSys: CoordSys _ bottom, -- coordinate system for children and mouse coords clipChildren: BOOL _ FALSE, -- clip out children during repaint simpleCreate: BOOL _ FALSE, -- simple creation of new instances (see below) bltContents: BltRule _ none, -- use blt to copy screen contents (see comment below) paintRectangles: BOOL _ FALSE, -- keep hints for the paintProc; see comment below icon: Icons.IconFlavor _ document, -- picture to display when small cursor: Cursors.CursorType _ textPointer -- standard cursor when mouse is in viewer ]; <> <> <> <<>> BltRule: TYPE = { none, top, center, bottom } ; PaintRectangle: TYPE = REF PaintRectangleRec; PaintRectangleRec: TYPE = RECORD [ flavor: PaintRectangleFlavor _ invalid, x, y, w, h: INTEGER _ 0 ]; PaintRectangleFlavor: TYPE = { invalid, blt } ; ViewerFlavor: TYPE = ATOM ; <> Lock: TYPE = RECORD [ -- process-reentrant viewer lock process: UNSAFE PROCESS _ NIL, -- current write process count: CARDINAL _ 0 -- number of locks currently granted for this viewer ] ; Column: TYPE = {static, left, right, color} ; <> CoordSys: TYPE = {bottom, top} ; <> PaintProc: TYPE = PROC [self: Viewer, context: Imager.Context, whatChanged: REF ANY, clear: BOOL] ; <> NotifyProc: TYPE = PROC [self: Viewer, input: LIST OF REF ANY] ; <> ModifyProc: TYPE = PROC [self: Viewer, change: ModifyAction] ; ModifyAction: TYPE = {set, push, pop, kill}; <> DestroyProc: TYPE = PROC [self: Viewer] ; <> CopyProc: TYPE = PROC [self, new: Viewer] ; <> <> SetProc: TYPE = PROC [self: Viewer, data: REF ANY, finalise: BOOL _ TRUE, op: ATOM _ NIL] ; GetProc: TYPE = PROC [self: Viewer, op: ATOM _ NIL] RETURNS [data: REF ANY] ; InitProc: TYPE = PROC [self: Viewer] ; <> SaveProc: TYPE = PROC [self: Viewer, force: BOOL _ FALSE] ; <> ScrollProc: TYPE = PROC [self: Viewer, op: ScrollOp, amount: INTEGER, shift, control: BOOL _ FALSE] RETURNS [top, bottom: INTEGER _ LAST [INTEGER]] ; ScrollOp: TYPE = {query, up, down, thumb}; <> CaptionProc: TYPE = PROC [self: Viewer, context: Imager.Context] ; <> END.