DIRECTORY Atom, BasicTime USING[Now], Commander USING [CommandProc, Register], DB USING[MarkTransaction, GetSegmentInfo], FS USING [StreamOpen], IO, Rope, ViewerTools, WhiteboardDB, WhiteboardDBPrivate; WhiteboardLoad: CEDAR PROGRAM IMPORTS Atom, BasicTime, Commander, DB, FS, IO, Rope, WhiteboardDBPrivate, WhiteboardDB = BEGIN OPEN WhiteboardDBPrivate, IO, Rope; DoLoad: Commander.CommandProc = BEGIN ENABLE WhiteboardDB.WBError => { SELECT reason FROM $ServerDown => {msg _ "Load Failed -- server unavailable; retry later"; CONTINUE}; $TransactionAbort => {msg _ "Load Failed -- transaction aborted; retry later"; CONTINUE}; $ReadOnly => {msg _ "Load Failed -- database is readonly"; CONTINUE}; ENDCASE => REJECT }; h: IO.STREAM = IO.RIS[cmd.commandLine]; [] _ h.SkipWhitespace[]; IF h.EndOf THEN [] _ WhiteboardDB.Load["Whiteboard.dump"] ELSE [] _ WhiteboardDB.Load[h.GetLineRope[]]; END; LoadFromFile: PUBLIC PROC[dumpFile: ROPE] = BEGIN in: STREAM; in _ FS.StreamOpen[dumpFile]; IF in = NIL THEN RETURN; LoadWBs[in]; DB.MarkTransaction[DB.GetSegmentInfo[$Whiteboard].trans]; END; LoadWBs: PROC[in: STREAM] = BEGIN [] _ in.SkipWhitespace[ ! EndOfStream => GOTO Return]; WHILE LoadWB[in] DO [] _ in.SkipWhitespace[ ! EndOfStream => GOTO Return]; ENDLOOP; EXITS Return => {}; END; LoadWB: PROC[in: STREAM] RETURNS [BOOLEAN] = BEGIN wb: Whiteboard; children: ChildSet; wbName: ROPE; [] _ in.GetChar[ ! EndOfStream => GOTO Done ]; -- read leading "(" [] _ in.GetTokenRope[breakProc: IDProc ! EndOfStream => GOTO Done ]; [] _ in.SkipWhitespace[]; wbName _ in.GetTokenRope[breakProc: IDProc].token; [] _ in.SkipWhitespace[]; wb _ DeclareWhiteboard[name: wbName]; children _ Children[wb]; FOR child: WBItem _ NextChild[children], NextChild[children] UNTIL child = NIL DO Destroy[child] ENDLOOP; SetVersion[wb, 0]; SetCreateDate[wb, BasicTime.Now[]]; WHILE LoadWBItem[in, wb] DO [] _ in.SkipWhitespace[]; ENDLOOP; RETURN[TRUE]; EXITS Done => { RETURN[FALSE] }; END; LoadWBItem: PROC[in: STREAM, wb: Whiteboard] RETURNS [BOOLEAN] = BEGIN key: ROPE; IF in.EndOf THEN RETURN[FALSE]; -- no more WB Items IF in.GetChar[] = ') THEN RETURN[FALSE]; -- no more WB Items key _ in.GetTokenRope[breakProc: IDProc].token; -- read keyword [] _ in.SkipWhitespace[]; IF Rope.Equal[key,"NOTE"] THEN LoadNote[in, wb] ELSE IF Rope.Equal[key, "ICON"] THEN LoadIcon[in, wb]; RETURN[TRUE]; END; LoadNote: PROC[in: STREAM, wb: Whiteboard] = BEGIN contentsRope, formatRope: ROPE; x, y, w, h: INTEGER; [] _ in.SkipWhitespace[]; [x, y, w, h] _ ReadCoords[in]; contentsRope _ in.GetRopeLiteral[]; formatRope _ in.GetRopeLiteral[]; [] _ in.SkipWhitespace[]; [] _ in.GetChar[]; --read trailing ")" [] _ NewNote[wb, x, y, w, h, NEW[ViewerTools.TiogaContentsRec _ [contentsRope, formatRope]]] END; LoadIcon: PROC[in: STREAM, wb: Whiteboard] = BEGIN iconNameRope, iconLabelRope, iconTypeRope, iconIconRope, iconArgumentRope: ROPE; x, y: INTEGER; [] _ in.SkipWhitespace[]; x _ in.GetInt[]; [] _ in.SkipWhitespace[]; y _ in.GetInt[]; [] _ in.SkipWhitespace[]; iconNameRope _ in.GetTokenRope[breakProc: IconBreakProc].token; [] _ in.GetChar[]; --read dividing "|" iconLabelRope _ in.GetTokenRope[breakProc: IconBreakProc].token; IF Rope.Equal[iconLabelRope, "-"] THEN iconLabelRope _ NIL; [] _ in.GetChar[]; --read dividing "|" iconTypeRope _ in.GetTokenRope[breakProc: IconBreakProc].token; [] _ in.GetChar[]; --read dividing "|" iconIconRope _ in.GetTokenRope[breakProc: IconBreakProc].token; IF Rope.Equal[iconIconRope, "-"] THEN iconIconRope _ NIL; [] _ in.GetChar[]; --read dividing "|" iconArgumentRope _ in.GetTokenRope[breakProc: IconBreakProc].token; IF Rope.Equal[iconArgumentRope, "-"] THEN iconArgumentRope _ NIL; [] _ in.GetChar[]; --read trailing ")" [] _ NewIcon[wb, x, y, iconNameRope, iconLabelRope, iconIconRope, iconArgumentRope, Atom.MakeAtom[iconTypeRope]] END; IconBreakProc: BreakProc = BEGIN IF (char = '|) OR (char = NUL) OR (char = ')) THEN RETURN[CharClass[break]] ELSE RETURN[CharClass[other]]; END; FormatBreakProc: BreakProc = BEGIN IF char = '| THEN RETURN[CharClass[break]] ELSE RETURN[CharClass[other]]; END; ReadCoords: PROC[in: STREAM] RETURNS [x, y, w, h: INTEGER] = BEGIN x _ in.GetInt[]; [] _ in.SkipWhitespace[]; y _ in.GetInt[]; [] _ in.SkipWhitespace[]; w _ in.GetInt[]; [] _ in.SkipWhitespace[]; h _ in.GetInt[]; [] _ in.SkipWhitespace[]; END; ReadRope: PROC[in: STREAM, length: INTEGER] RETURNS [r: ROPE] = BEGIN r _ NIL; THROUGH [1..length] DO r _ r.Cat[FromChar[in.GetChar[]]] ENDLOOP; END; Commander.Register[key: "WBLoad", proc: DoLoad, doc: "\nLoads named file into current whiteboard segment\n (File defaults to Whiteboard.dump)"] END... –File: WhiteboardLoad.mesa Copyright (C) 1984 by Xerox Corporation. All rights reserved. For loading of whiteboard databases. (Companion to WhiteboardDump.mesa.) Last edited by: Jennifer Widom, August 24, 1984 11:02:17 pm PDT Last edited by: Donahue, May 28, 1985 5:11:24 pm PDT Last Edited by: Winkler, December 17, 1984 6:32:29 pm PST read keyword "WHITEBOARD" make sure all children are destroyed Êï˜Jšœ™Jšœ=™=JšœH™HJšœ?™?J™4J™9J˜šÏk ˜ Jšœ˜Jšœ œ˜Jšœ œ˜(Jšœœ"˜*Jšœœ˜Jšœ˜Jšœ˜J˜ Jšœ ˜ Jšœ˜J˜—šœœ˜š˜Jšœœœœ+˜QJ˜——Jšœœœ˜)J˜šÏnœ˜š˜šœ˜ Jšœ˜JšœHœ˜RJšœOœ˜YJšœ;œ˜EJšœœ˜—Jš œœœœœ˜'J˜šœ œ*˜9Jšœ)˜-—Jšœ˜J˜——šž œ œ œ˜+š˜Jšœœ˜ Jšœœ˜Jšœœœœ˜J˜ Jšœ9˜9šœ˜J˜———šžœœœ˜š˜Jšœ)œ ˜6Jšœ ˜šœ)œ ˜7Jšœ˜ —Jšœ˜Jšœ˜J˜——š žœœœœœ˜,š˜J˜J˜Jšœœ˜ Jšœ"œ Ïc˜CJšœ8œ ˜EJšœ™J˜J˜2J˜J˜%Jšœ$™$J˜šœ:œ œ˜QJ˜Jšœ˜—Jšœ˜J˜#šœ˜J˜Jšœ˜—Jšœœ˜ Jšœ œœ˜ Jšœ˜J˜——š ž œœœœœ˜@š˜Jšœœ˜ Jš œ œœœŸ˜4Jš œœœœŸ˜=Jšœ1Ÿ˜@J˜šœœ˜/Jšœœœ˜6—Jšœœ˜ Jšœ˜J˜——šžœœœ˜,š˜Jšœœ˜Jšœ œ˜J˜J˜J˜#J˜!Jšœ˜JšœŸ˜'Jšœœ<˜\Jšœ˜J˜——šžœœœ˜,š˜JšœKœ˜PJšœœ˜J˜J˜J˜J˜J˜J˜?JšœŸ˜'J˜@Jšœ œœ˜;JšœŸ˜'J˜?JšœŸ˜'J˜?Jšœœœ˜9JšœŸ˜'J˜CJšœ#œœ˜AJšœŸ˜'Jšœp˜pJšœ˜J˜——šž œ ˜š˜š œ œ œœ œœ˜KJšœœ˜—Jšœ˜J˜——šžœ ˜š˜Jš œ œœœœ˜IJšœ˜J˜——š ž œœœœœ˜<šœ˜J˜J˜J˜J˜J˜J˜J˜J˜Jšœ˜J˜——š žœœœ œœœ˜?š˜Jšœœ˜ Jšœ œ#œ˜AJšœ˜J˜——˜/J˜_J˜—Jšœ˜J˜—…—JÏ