<> <> <> <> <> <> DIRECTORY Atom, BasicTime USING[Now], Commander USING [CommandProc, Register], FS USING [StreamOpen], IO, Rope, ViewerTools, WhiteboardDB, WhiteboardDBPrivate; WhiteboardLoad: CEDAR PROGRAM IMPORTS Atom, BasicTime, Commander, 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]; WhiteboardDBPrivate.MarkTransaction[]; END; LoadWBs: PROC[in: STREAM] = BEGIN WHILE LoadWB[in] DO ENDLOOP; END; LoadWB: PROC[in: STREAM] RETURNS [success: BOOLEAN] = BEGIN wb: Whiteboard; children: ChildSet; wbName: ROPE; [] _ in.GetTokenRope[ ! IO.EndOfStream => GOTO Done]; <> wbName _ in.GetTokenRope[].token; 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 ENDLOOP; RETURN[TRUE]; EXITS Done => { RETURN[FALSE] }; END; LoadWBItem: PROC[in: STREAM, wb: Whiteboard] RETURNS [BOOLEAN] = BEGIN key: ROPE; key _ in.GetTokenRope[].token; -- read keyword IF Rope.Equal[key,"NOTE"] THEN LoadNote[in, wb] ELSE IF Rope.Equal[key, "ICON"] THEN LoadIcon[in, wb] ELSE IF Rope.Equal[key, "END"] THEN RETURN[FALSE]; 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[]; [] _ 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; x _ in.GetInt[]; y _ in.GetInt[]; iconNameRope _ in.GetRopeLiteral[]; iconLabelRope _ in.GetRopeLiteral[]; iconTypeRope _ in.GetRopeLiteral[]; iconIconRope _ in.GetRopeLiteral[]; iconArgumentRope _ in.GetRopeLiteral[]; [] _ NewIcon[wb, x, y, iconNameRope, iconLabelRope, iconIconRope, iconArgumentRope, Atom.MakeAtom[iconTypeRope]] END; ReadCoords: PROC[in: STREAM] RETURNS [x, y, w, h: INTEGER] = BEGIN x _ in.GetInt[]; y _ in.GetInt[]; w _ in.GetInt[]; h _ in.GetInt[]; END; Commander.Register[key: "WBLoad", proc: DoLoad, doc: "\nLoads named file into current whiteboard segment\n (File defaults to Whiteboard.dump)"] END...