-- File: WalnutSendOpsImpl.mesa -- Contents: More procs for WalnutSend -- Created by Willie-Sue, December 13, 1983 -- Last Edited by: Willie-Sue, December 13, 1983 2:04 pm DIRECTORY GVAnswer USING [MakeHeader], Menus, IO, Rope, RopeIO USING [GetRope], 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, GVAnswer, Menus, RopeIO, TiogaOps, ViewerOps, WalnutSendInternal, WalnutSendOps EXPORTS WalnutSendInternal, WalnutSendOps SHARES Menus = BEGIN OPEN WalnutSendOps, WalnutSendInternal; -- ************************************************************************ 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 { SenderReport[IO.PutFR[ "\nSyntax error in line previous to line containing pos %g (in message being answered)", IO.int[errorIndex]]]; 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]; 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]; 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. Ęė˜JšßĪc¯œĪk œ žœžœžœžœžžœžœžœžœlžœ)žœ žœžœ%LĪnœžœžœ žœžœžœžœ žœžœ žœ$Ÿ œžœžœžœžœžœ˜žœžœžœjžœžœžœvžœžœ<žœŸœžœ žœžœ žœžœžœžœžœžœžœ/žœ+žœžœžœžœžœžœžœžœ4žœžœžœIŸœžœžœžœžœžœžœ0žœ9žœúžœžœžœ…žœžœĢžœqžœžœžœžœ”žœ‡žœŸœž œžœžœ žœžœ žœ>žœŸœž œžœžœĸžœ žœžœžœžœžœžœGžœžœžœžœ+žœžœ)žœ žœžœžœžœžœ)œžœžœŸœž œžœžœšžœ žœžœžœžœžœžœDžœžœžœžœ+žœžœ)žœ žœžœžœžœžœ)œžœ,žœIœŸœžœžœžœžœ žœ žœžœžœžœ7œžœžœžœžœžœžœžœžœžœžœUžœ"žœ,žœœ!žœmžœ žœžœžœžœ˜õ-—…—øę