DIRECTORY Buttons USING [ButtonProc], EditToolBuilder USING [BuildButton, Layout, ToNext], EditToolPrivate USING [BuildExtraOverflow, CheckPSel, Info], Rope USING [ROPE], TEditDocument USING [Selection], TEditOps USING [GetSelData]; EditToolExtraImpl: CEDAR PROGRAM IMPORTS EditToolPrivate, EditToolBuilder, TEditOps EXPORTS EditToolPrivate = { OPEN EditToolPrivate, EditToolBuilder; ---------------------------- BuildExtraButtons: PUBLIC PROC [info: Info] = { { OPEN info; BuildOne: PROC [info: Layout, name: Rope.ROPE, proc: Buttons.ButtonProc] = { [] _ BuildButton[info: info, name: name, proc: proc, gapAfter: FALSE] }; BuildOne[layout, "CaretBefore", CaretBefore]; BuildOne[layout, "CaretAfter", CaretAfter]; BuildOne[layout, "CaretOnly", MakePointSelection]; BuildOne[layout, "Grow", GrowSelection]; BuildOne[layout, "Document", Everything]; ToNext[layout,TRUE]; BuildOne[layout, "PendingDelete", MakePendingDelete]; BuildOne[layout, "NotPendingDelete", MakeNotPendingDelete]; ToNext[layout,TRUE]; BuildOne[layout, "MakeSecondary", MakeSecondary]; BuildOne[layout, "MakePrimary", MakePrimary]; BuildOne[layout, "CancelSecondary", CancelSecondary]; BuildOne[layout, "CancelPrimary", CancelPrimary]; ToNext[layout,TRUE]; BuildOne[layout, "ToPrimary", ToPrimary]; BuildOne[layout, "ToSecondary", ToSecondary]; BuildOne[layout, "Transpose", Transpose]; ToNext[layout,TRUE]; BuildOne[layout, "GoToNextChar", GoToNextChar]; BuildOne[layout, "GoToNextWord", GoToNextWord]; BuildOne[layout, "GoToNextNode", GoToNextNode]; ToNext[layout,TRUE]; BuildOne[layout, "SaveSel-A", SaveSelectionA]; BuildOne[layout, "RestoreSel-A", RestoreSelectionA]; BuildOne[layout, "SaveSel-B", SaveSelectionB]; BuildOne[layout, "RestoreSel-B", RestoreSelectionB]; ToNext[layout,TRUE]; BuildOne[layout, "(...)", SelectMatchingParens]; BuildOne[layout, "<...>", SelectMatchingAngleBrackets]; BuildOne[layout, "{...}", SelectMatchingCurlyBrackets]; BuildOne[layout, "[...]", SelectMatchingSquareBrackets]; BuildOne[layout, "\"...\"", SelectMatchingDoubleQuotes]; BuildOne[layout, "'...'", SelectMatchingSingleQuotes]; BuildOne[layout, "-...-", SelectMatchingDashBrackets]; BuildOne[layout, "...", SelectMatchingPlaceholderBrackets]; BuildOne[layout, "Next...", NextPlaceholder]; BuildOne[layout, "Prev...", PreviousPlaceholder]; ToNext[layout,TRUE]; BuildOne[layout, "Delete", Delete]; BuildOne[layout, "Paste", Paste]; BuildOne[layout, "SaveForPaste", SaveForPaste]; BuildOne[layout, "Repeat", Repeat]; BuildOne[layout, "Undo", Undo]; ToNext[layout,TRUE]; BuildExtraOverflow[info] }}; ---------------------------- DoList: PUBLIC PROC [list: LIST OF REF ANY, typescriptOK: BOOL _ TRUE] = { pSel: TEditDocument.Selection = TEditOps.GetSelData[primary: TRUE]; IF ~CheckPSel[pSel, typescriptOK] THEN RETURN; pSel.viewer.class.notify[pSel.viewer, list]}; DoList2: PUBLIC PROC [list: LIST OF REF ANY, typescriptOK: BOOL _ TRUE] = { sSel: TEditDocument.Selection = TEditOps.GetSelData[primary: FALSE]; IF ~CheckPSel[sSel, typescriptOK] THEN RETURN; sSel.viewer.class.notify[sSel.viewer, list]}; ---------------------------- toprimary: LIST OF REF ANY = LIST[$ToPrimary,$DoEdit]; ToPrimary: Buttons.ButtonProc = {DoList[toprimary]}; tosecondary: LIST OF REF ANY = LIST[$ToSecondary,$DoEdit]; ToSecondary: Buttons.ButtonProc = {DoList[tosecondary]}; transpose: LIST OF REF ANY = LIST[$ToBoth,$DoEdit]; Transpose: Buttons.ButtonProc = {DoList[transpose]}; pdel: LIST OF REF ANY = LIST[$MakePendingDelete]; MakePendingDelete: Buttons.ButtonProc = {DoList[pdel]}; makesecondary: LIST OF REF ANY = LIST[$MakeSecondary]; MakeSecondary: Buttons.ButtonProc = {DoList[makesecondary]}; makeprimary: LIST OF REF ANY = LIST[$MakePrimary]; MakePrimary: Buttons.ButtonProc = {DoList2[makeprimary]}; cancelsecondary: LIST OF REF ANY = LIST[$CancelSecondary]; CancelSecondary: Buttons.ButtonProc = {DoList2[cancelsecondary]}; cancelprimary: LIST OF REF ANY = LIST[$CancelPrimary]; CancelPrimary: Buttons.ButtonProc = {DoList[cancelprimary]}; notpdel: LIST OF REF ANY = LIST[$MakeNotPendingDelete]; MakeNotPendingDelete: Buttons.ButtonProc = {DoList[notpdel]}; caretbefore: LIST OF REF ANY = LIST[$CaretBefore]; CaretBefore: Buttons.ButtonProc = {DoList[caretbefore]}; caretafter: LIST OF REF ANY = LIST[$CaretAfter]; CaretAfter: Buttons.ButtonProc = {DoList[caretafter]}; makepointselection: LIST OF REF ANY = LIST[$MakePointSelection]; MakePointSelection: Buttons.ButtonProc = {DoList[makepointselection]}; growselection: LIST OF REF ANY = LIST[$GrowSelection]; GrowSelection: Buttons.ButtonProc = {DoList[growselection]}; everything: LIST OF REF ANY = LIST[$Everything]; Everything: Buttons.ButtonProc = {DoList[everything]}; int: PROC [i: INT] RETURNS [REF] = { RETURN [NEW[INT _ i]] }; gotonextchar: LIST OF REF ANY = LIST[int[1],$GoToNextChar]; gotopreviouschar: LIST OF REF ANY = LIST[int[1],$GoToPreviousChar]; GoToNextChar: Buttons.ButtonProc = { DoList[IF mouseButton=red THEN gotonextchar ELSE gotopreviouschar,TRUE]}; gotonextword: LIST OF REF ANY = LIST[int[1],$GoToNextWord]; gotopreviousword: LIST OF REF ANY = LIST[int[1],$GoToPreviousWord]; GoToNextWord: Buttons.ButtonProc = { DoList[IF mouseButton=red THEN gotonextword ELSE gotopreviousword,TRUE]}; gotonextnode: LIST OF REF ANY = LIST[int[1],$GoToNextNode]; gotopreviousnode: LIST OF REF ANY = LIST[int[1],$GoToPreviousNode]; GoToNextNode: Buttons.ButtonProc = { DoList[IF mouseButton=red THEN gotonextnode ELSE gotopreviousnode]}; saveselectionA: LIST OF REF ANY = LIST[$SaveSelectionA]; SaveSelectionA: Buttons.ButtonProc = {DoList[saveselectionA]}; restoreselectionA: LIST OF REF ANY = LIST[$RestoreSelectionA]; RestoreSelectionA: Buttons.ButtonProc = {DoList[restoreselectionA]}; saveselectionB: LIST OF REF ANY = LIST[$SaveSelectionB]; SaveSelectionB: Buttons.ButtonProc = {DoList[saveselectionB]}; restoreselectionB: LIST OF REF ANY = LIST[$RestoreSelectionB]; RestoreSelectionB: Buttons.ButtonProc = {DoList[restoreselectionB]}; selectmatchingparens: LIST OF REF ANY = LIST[$SelectMatchingParens]; SelectMatchingParens: Buttons.ButtonProc = {DoList[selectmatchingparens]}; selectmatchingdashbrackets: LIST OF REF ANY = LIST[$SelectMatchingDashBrackets]; SelectMatchingDashBrackets: Buttons.ButtonProc = {DoList[selectmatchingdashbrackets]}; selectmatchinganglebrackets: LIST OF REF ANY = LIST[$SelectMatchingAngleBrackets]; SelectMatchingAngleBrackets: Buttons.ButtonProc = {DoList[selectmatchinganglebrackets]}; selectmatchingcurlybrackets: LIST OF REF ANY = LIST[$SelectMatchingCurlyBrackets]; SelectMatchingCurlyBrackets: Buttons.ButtonProc = {DoList[selectmatchingcurlybrackets]}; selectmatchingsquarebrackets: LIST OF REF ANY = LIST[$SelectMatchingSquareBrackets]; SelectMatchingSquareBrackets: Buttons.ButtonProc = {DoList[selectmatchingsquarebrackets]}; selectmatchingplaceholderbrackets: LIST OF REF ANY = LIST[$SelectMatchingPlaceholderBrackets]; SelectMatchingPlaceholderBrackets: Buttons.ButtonProc = {DoList[selectmatchingplaceholderbrackets]}; selectmatchingdoublequotes: LIST OF REF ANY = LIST[$SelectMatchingDoubleQuotes]; SelectMatchingDoubleQuotes: Buttons.ButtonProc = {DoList[selectmatchingdoublequotes]}; selectmatchingsinglequotes: LIST OF REF ANY = LIST[$SelectMatchingSingleQuotes]; SelectMatchingSingleQuotes: Buttons.ButtonProc = {DoList[selectmatchingsinglequotes]}; nextplaceholder: LIST OF REF ANY = LIST[$NextPlaceholder]; NextPlaceholder: Buttons.ButtonProc = {DoList[nextplaceholder]}; previousplaceholder: LIST OF REF ANY = LIST[$PreviousPlaceholder]; PreviousPlaceholder: Buttons.ButtonProc = {DoList[previousplaceholder]}; delete: LIST OF REF ANY = LIST[$Delete]; Delete: Buttons.ButtonProc = {DoList[delete]}; paste: LIST OF REF ANY = LIST[$Paste]; Paste: Buttons.ButtonProc = {DoList[paste]}; saveforpaste: LIST OF REF ANY = LIST[$SaveForPaste]; SaveForPaste: Buttons.ButtonProc = {DoList[saveforpaste]}; repeat: LIST OF REF ANY = LIST[$Repeat]; Repeat: Buttons.ButtonProc = {DoList[repeat]}; undo: LIST OF REF ANY = LIST[$Undo]; Undo: Buttons.ButtonProc = {DoList[undo]}; }. .. Selection related: MakePendingDelete MakeNotPendingDelete CaretBefore CaretAfter MakePointSelection GrowSelection Everything GoToNextChar GoToPreviousChar GoToNextWord GoToPreviousWord GoToNextNode GoToPreviousNode PushSelection PopSelection SelectMatchingParens SelectMatchingAngleBrackets SelectMatchingCurlyBrackets SelectMatchingSquareBrackets SelectMatchingPlaceholderBrackets NextPlaceholder PreviousPlaceholder NextViewer PreviousViewer Editing: Delete Paste Repeat Cancel BackSpace BackWord DeleteNextChar DeleteNextWord ParenBrackets DashBrackets AngleBrackets DoubleQuoteBrackets SingleQuoteBrackets CurlyBrackets SquareBrackets PlaceholderBrackets AllCaps AllLower InitialCaps FirstCap MakeOctalCharacter MakeControlCharacter ExpandAbbrev SetMesaLooks SetComment SetNotComment Break Join Nest UnNest here is the EditTool program I used to create all the button procs: PushSelection EditToolMatchCase EditToolMatchLiterally EditToolClearSearchFor "Everything" PopSelection EditToolSearchForward EditToolDoIt EditToolSearchForward EditToolDoIt EditToolIgnoreCase EditToolSearchForward EditToolDoIt AllLower PushSelection EditToolClearSearchFor "{everything}: LIST" PopSelection EditToolMatchPattern EditToolSearchBackwards EditToolDoIt AllLower just put the name, such as "MakeControlCharacter", in the "Replace by:" field, select just before a copy of the Everything stuff, the do the command. ²EditToolExtraImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Doug Wyatt on January 13, 1984 2:45 pm Russ Atkinson (RRA) June 18, 1985 4:54:03 pm PDT ΚΫ˜codešœ™Kšœ Οmœ1™˜>K˜Kš œžœžœžœžœžœ˜>KšœD˜DK˜Kš œžœžœžœžœžœ˜8Kšœ>˜>K˜Kš œžœžœžœžœžœ˜>KšœD˜DK˜Kš œžœžœžœžœžœ˜DKšœJ˜JK˜Kš œžœžœžœžœžœ˜PKšœV˜VK˜Kš œžœžœžœžœžœ˜RKšœX˜XK˜Kš œžœžœžœžœžœ˜RKšœX˜XK˜Kš œžœžœžœžœžœ ˜TKšœZ˜ZK˜Kš œ#žœžœžœžœžœ%˜^˜7Kšœ,˜,K˜—Kš œžœžœžœžœžœ˜PKšœV˜VK˜Kš œžœžœžœžœžœ˜PKšœV˜VK˜Kš œžœžœžœžœžœ˜:Kšœ@˜@K˜Kš œžœžœžœžœžœ˜BKšœH˜HK˜Kš œžœžœžœžœžœ ˜(K˜.K˜Kš œžœžœžœžœžœ ˜&K˜,K˜Kš œžœžœžœžœžœ˜4Kšœ:˜:K˜Kš œžœžœžœžœžœ ˜(K˜.K˜Kš œžœžœžœžœžœ˜$K˜*K˜K˜K˜K˜K˜K˜K˜&K˜K˜K˜ K˜ K˜K˜K˜K˜K˜‹K˜#K˜K˜K˜K˜ K˜ K˜K˜K˜K˜&K˜'K˜ K˜ K˜K˜ K˜ K˜K˜Kšœžœ%˜CK˜K˜φK˜˜OK˜FK˜K˜K˜——…—%..»