-- File: WalnutSendOpsImpl.mesa -- Contents: More procs for WalnutSend -- Created by Willie-Sue, December 13, 1983 -- Last Edited by: Willie-Sue, July 31, 1984 10:22:29 am PDT DIRECTORY GVAnswer USING [MakeHeader], Menus, IO, Rope, RopeIO USING [GetRope], RuntimeError USING [BoundsFault], TiogaOps USING [ Pattern, Ref, Location, CreateSimplePattern, GetSelection, InsertRope, SelectDocument, SelectPoint, SelectionRoot, SelectionSearch, SetSelection, ToPrimary], ViewerOps, ViewerClasses, ViewerTools, WalnutSendInternal, WalnutSendOps; WalnutSendOpsImpl: CEDAR MONITOR IMPORTS IO, Rope, RuntimeError, GVAnswer, Menus, RopeIO, TiogaOps, ViewerOps, WalnutSendInternal, WalnutSendOps EXPORTS WalnutSendInternal, WalnutSendOps SHARES Menus = BEGIN OPEN WalnutSendOps, WalnutSendInternal; -- ************************************************************************ nullIndex: INT = LAST[INT]; Answer: PUBLIC PROC[msgHeaders: ROPE, who: Viewer_ NIL] RETURNS [v: Viewer] = BEGIN notOk: BOOL; errorIndex: INT; answer: ROPE; answerForm: WalnutSendOps.Form; AnswerGetChar: PROC[pos: INT] RETURNS[CHAR] = {RETURN[msgHeaders.Fetch[pos]]}; [notOk, answer, errorIndex]_ GVAnswer.MakeHeader[AnswerGetChar, msgHeaders.Length[], simpleUserName, defaultRegistry]; IF notOk THEN { start, end: INT_ errorIndex; BEGIN ENABLE RuntimeError.BoundsFault => {start_ 0; end_ 1; CONTINUE}; IF start = nullIndex THEN start_ 0 ELSE {UNTIL msgHeaders.Fetch[start] = '\n DO start_ start - 1; ENDLOOP; start_ start + 1}; IF end = nullIndex THEN end_ start + 1 ELSE {UNTIL msgHeaders.Fetch[end] = '\n DO end_ end + 1; ENDLOOP; end_ end - 1}; END; IF who # NIL THEN ShowErrorFeedback[who, start, end]; SenderReport[IO.PutFR[ "\nSyntax error in line starting at pos %g (in message being answered)", IO.int[start]]]; RETURN }; answerForm _ NEW[ WalnutSendOps.FormRec _ [formText: answerText, fields: ParseAnswerHeader[answer] ] ]; v_ BuildSendViewer[TRUE, FALSE, answerForm, who]; ClearFileAssoc[v]; GrabFocus[v]; END; ParseAnswerHeader: PROC[header: ROPE] RETURNS[fields: LIST OF ROPE] = { HeaderLines: ARRAY[0..3] OF Rope.ROPE; startPos: INT _ Rope.Find[header, ": ", 0]; endOfLine: INT _ Rope.Find[header, "\n", startPos]; FOR i: INT IN [0..3] DO HeaderLines[i] _ Rope.Substr[header, startPos+2, endOfLine-startPos-2]; startPos _ Rope.Find[header, ": ", endOfLine]; IF startPos = -1 THEN EXIT ELSE endOfLine _ Rope.Find[header, "\n", startPos] ENDLOOP; RETURN[ LIST[ HeaderLines[0], HeaderLines[1], HeaderLines[2], HeaderLines[3] ] ] }; Forward: PUBLIC PROC[msg: Viewer, who: Viewer_ NIL] RETURNS[v: Viewer] = TRUSTED BEGIN forwardForm: WalnutSendOps.Form = NEW[WalnutSendOps.FormRec _ [formText: forwardText, fields: NIL]]; messagePattern: TiogaOps.Pattern = TiogaOps.CreateSimplePattern["ForwardedMessage"]; headerPattern: TiogaOps.Pattern = TiogaOps.CreateSimplePattern["MessageHeader"]; pstart, pend: TiogaOps.Location; root: TiogaOps.Ref; found: BOOL; v_ BuildSendViewer[TRUE, FALSE, forwardForm, who]; ClearFileAssoc[v]; TiogaOps.SelectDocument[v]; root _ TiogaOps.SelectionRoot[]; pstart _ TiogaOps.Location[ root, 0 ]; TiogaOps.SelectPoint[ v, pstart ]; found _ TiogaOps.SelectionSearch[pattern: headerPattern]; IF found THEN { [ ,pstart, pend, , , ] _ TiogaOps.GetSelection[]; TiogaOps.SetSelection[viewer: v, start: pstart, end: pend, level: word, pendingDelete: TRUE]; TiogaOps.InsertRope[ msg.name ] }; found _ TiogaOps.SelectionSearch[pattern: messagePattern]; IF NOT found THEN RETURN; [ ,pstart, pend, , , ] _ TiogaOps.GetSelection[]; TiogaOps.SetSelection[ viewer: v, start: pstart, end: pend, level: node, pendingDelete: TRUE ]; TiogaOps.SelectDocument[ viewer: msg, which: secondary ]; TiogaOps.ToPrimary[]; UnsetNewVersion[v]; GrabFocus[v] END; ClearFileAssoc: PUBLIC PROC[v: Viewer] = BEGIN IF v.file # NIL THEN v.file_ NIL; v.name_ sendCaption; ViewerOps.PaintViewer[v, caption]; END; SenderNewVersion: PUBLIC PROC[viewer: Viewer] = BEGIN OPEN Menus; menu: Menus.Menu = viewer.menu; firstForm: Menus.MenuEntry = Menus.GetLine[formsMenu, 0]; getEntry: Menus.MenuEntry_ Menus.FindEntry[menu, "Get"]; IF getEntry # NIL THEN Menus.SetGuarded[getEntry, TRUE]; getEntry_ Menus.FindEntry[menu, "Default"]; IF getEntry # NIL THEN Menus.SetGuarded[getEntry, TRUE]; getEntry_ Menus.FindEntry[menu, "PrevMsg"]; IF getEntry # NIL THEN Menus.SetGuarded[getEntry, TRUE]; FOR i: Menus.MenuLine IN [1..5) DO thisLine: Menus.MenuEntry = Menus.GetLine[menu, i]; IF thisLine = NIL THEN EXIT; IF Rope.Equal[thisLine.name, firstForm.name] THEN FOR entry: MenuEntry _ thisLine, entry.link UNTIL entry = NIL DO SetGuarded[entry, TRUE] ENDLOOP; ENDLOOP; ViewerOps.PaintViewer[viewer, menu]; -- show as guarded viewer.newVersion_ TRUE; END; UnsetNewVersion: PUBLIC PROC[viewer: Viewer] = BEGIN OPEN Menus; menu: Menu = viewer.menu; firstForm: Menus.MenuEntry = Menus.GetLine[formsMenu, 0]; getEntry: Menus.MenuEntry_ Menus.FindEntry[menu, "Get"]; IF getEntry # NIL THEN Menus.SetGuarded[getEntry, FALSE]; getEntry_ Menus.FindEntry[menu, "Default"]; IF getEntry # NIL THEN Menus.SetGuarded[getEntry, FALSE]; getEntry_ Menus.FindEntry[menu, "PrevMsg"]; IF getEntry # NIL THEN Menus.SetGuarded[getEntry, FALSE]; FOR i: Menus.MenuLine IN [1..5) DO thisLine: Menus.MenuEntry = Menus.GetLine[menu, i]; IF thisLine = NIL THEN EXIT; IF Rope.Equal[thisLine.name, firstForm.name] THEN FOR entry: MenuEntry _ thisLine, entry.link UNTIL entry = NIL DO SetGuarded[entry, FALSE] ENDLOOP; ENDLOOP; ViewerOps.PaintViewer[viewer, menu]; -- show as unguarded viewer.newVersion_ FALSE; ViewerOps.PaintViewer[viewer, caption]; END; -- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * TiogaTextFromStrm: PUBLIC PROC[strm: IO.STREAM, startPos: INT_ 0, len: INT_ LAST[INT]] RETURNS[contents: TiogaContents] = -- returns NIL IF endOfStream encountered during read BEGIN ENABLE IO.EndOfStream => GOTO TooShort; fulltext: ROPE; formatPos: INT; strm.SetIndex[startPos]; IF len = LAST[INT] THEN len _ strm.GetLength[] - startPos; fulltext_ RopeIO.GetRope[strm, len]; contents_ NEW[ViewerTools.TiogaContentsRec]; IF (formatPos_ fulltext.Find["\000\000"]) < 0 THEN -- no formatting { contents.contents_ fulltext; RETURN}; contents.contents_ fulltext.Substr[len: formatPos]; contents.formatting_ fulltext.Substr[formatPos]; EXITS TooShort => RETURN[NIL]; END; END. DCopyright (C) 1984, Xerox Corporation. All rights reserved. Êl˜JšÏc˜J™žœ˜”J˜JšDŸœž œžœžœ¢žœ žœžœžœ1žœ žœžœžœ1žœ žœžœžœžœžœžœGžœžœžœžœ+žœžœ)žœ žœžœžœžœžœ)œžœžœ˜âJ˜JšDŸœž œžœžœšžœ žœžœžœ1žœ žœžœžœ1žœ žœžœžœžœžœžœDžœžœžœžœ+žœžœ)žœ žœžœžœžœžœ)œžœ,žœ˜‹J˜JšH˜HJ˜Jš<Ÿœžœžœžœžœ žœ žœžœžœžœ7œžœžœžœžœžœžœžœžœžœžœUžœ"žœ,žœœ!žœmžœ žœžœžœ˜±J˜Jšžœ˜—…—À