<> <> <> <> <> <> DIRECTORY Atom, Commander USING [CommandProc, Register], DB USING[MarkTransaction, GetSegmentInfo], FS USING [StreamOpen], IO, Rope, ViewerTools, WhiteboardDB, WhiteboardDBPrivate; WhiteboardLoad: CEDAR PROGRAM IMPORTS Atom, 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]; 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...