<<>> <> <> <> <> <> DIRECTORY Ascii USING [CR, LF, TAB], Rope USING [Concat, Equal, Fetch, ROPE, Size, SkipTo, Substr], TEditInputOps USING [LoadAbbreviations, ReloadStyleName], NodeStyleOps USING [SetDefaultStyle, SetExtensionStyles], TEditProfile USING [CategoryOfUser, DefaultMenuChoice, SelectionCaret], UserProfile USING [Boolean, Line, ListOfTokens, Number, Token]; TEditProfileImpl: CEDAR PROGRAM IMPORTS Rope, UserProfile, TEditInputOps, NodeStyleOps EXPORTS TEditProfile = { ROPE: TYPE = Rope.ROPE; CategoryOfUser: TYPE = TEditProfile.CategoryOfUser; DefaultMenuChoice: TYPE = TEditProfile.DefaultMenuChoice; SelectionCaret: TYPE = TEditProfile.SelectionCaret; menu1, menu2, menu3: PUBLIC DefaultMenuChoice ¬ none; openFirstLevelOnly: PUBLIC BOOL; wordPunctuation: PUBLIC BOOL; editTypeScripts: PUBLIC BOOL; scrollTopOffset: PUBLIC INTEGER ; scrollBottomOffset: PUBLIC INTEGER ; ySelectFudge: PUBLIC INTEGER ; showUnsavedDocumentsList: PUBLIC BOOL; unsavedDocumentCacheSize: PUBLIC INTEGER ; selectionCaret: PUBLIC SelectionCaret; userCategory: PUBLIC CategoryOfUser; sourceExtensions, implExtensions: PUBLIC LIST OF ROPE; -- without leading "." tryVersionMap: PUBLIC BOOL; ReadProfile: PUBLIC PROC = { wordPunctuation ¬ UserProfile.Boolean["Tioga.SelectDelimitingSpaces", FALSE]; editTypeScripts ¬ UserProfile.Boolean["Tioga.EditTypeScripts", TRUE]; openFirstLevelOnly ¬ UserProfile.Boolean["Tioga.OpenFirstLevelOnly", FALSE]; scrollTopOffset ¬ UserProfile.Number["Tioga.ScrollTopOffset", 2]; scrollBottomOffset ¬ UserProfile.Number["Tioga.ScrollBottomOffset", 2]; ySelectFudge ¬ UserProfile.Number["Tioga.YSelectFudge", 2]; showUnsavedDocumentsList ¬ UserProfile.Boolean["Tioga.ShowUnsavedDocumentsList", TRUE]; unsavedDocumentCacheSize ¬ UserProfile.Number["Tioga.UnsavedDocumentsCacheSize", 4]; SetUserCategory[UserProfile.Token["Tioga.UserCategory", "Advanced"]]; SetSelectionCaret[UserProfile.Token["Tioga.SelectionCaret", "balance"]]; ReadExtensions[]; ReadMenuDefaults[]; NodeStyleOps.SetDefaultStyle[UserProfile.Token["Tioga.DefaultStyle", "Cedar"]]; NodeStyleOps.SetExtensionStyles[UserProfile.ListOfTokens["Tioga.ExtensionStyles"]]; tryVersionMap ¬ UserProfile.Boolean["Tioga.TryVersionMap", TRUE]; }; ReadMenuDefaults: PROC = { num: INTEGER ¬ 1; DefaultMenu: PROC [rope: ROPE] = { which: DefaultMenuChoice ¬ SELECT TRUE FROM Rope.Equal[rope,"Places",FALSE] => places, Rope.Equal[rope,"Levels",FALSE] => levels, ENDCASE => none; IF which=none THEN RETURN; SELECT num FROM 1 => menu1 ¬ which; 2 => menu2 ¬ which; 3 => menu3 ¬ which; ENDCASE => RETURN; num ¬ num+1 }; menu1 ¬ menu2 ¬ menu3 ¬ none; DoList["Tioga.DefaultTiogaMenus", DefaultMenu, "places"]; }; ReadExtensions: PROC = { RemoveLeadingDot: PROC[ext: ROPE] RETURNS[ROPE] = { RETURN[IF ext.Size[]>0 AND ext.Fetch[0]='. THEN ext.Substr[start: 1] ELSE ext]; }; AddExt: PROC [ext: ROPE] = { ext ¬ RemoveLeadingDot[ext]; IF sourceExtensions=NIL THEN sourceExtensions ¬ LIST[ext] ELSE FOR lst: LIST OF ROPE ¬ sourceExtensions, lst.rest DO IF lst.rest = NIL THEN { lst.rest ¬ LIST[ext]; RETURN }; ENDLOOP; }; AddImplExt: PROC [ext: ROPE] = { ext ¬ RemoveLeadingDot[ext]; IF implExtensions=NIL THEN implExtensions ¬ LIST[ext] ELSE FOR lst: LIST OF ROPE ¬ implExtensions, lst.rest DO IF lst.rest = NIL THEN { lst.rest ¬ LIST[ext]; RETURN }; ENDLOOP; }; sourceExtensions ¬ implExtensions ¬ NIL; DoList["Tioga.SourceFileExtensions", AddExt, "mesa tioga df cm config style"]; DoList["Tioga.ImplFileExtensions", AddImplExt, "mesa"]; AddExt[""]; <> }; SetSelectionCaret: PROC [rope: ROPE] = { selectionCaret ¬ SELECT TRUE FROM Rope.Equal[rope,"before",FALSE] => before, Rope.Equal[rope,"after",FALSE] => after, ENDCASE => balance; }; SetUserCategory: PROC [rope: ROPE] = { userCategory ¬ SELECT TRUE FROM Rope.Equal[rope,"Expert",FALSE] => expert, Rope.Equal[rope,"Advanced",FALSE] => advanced, Rope.Equal[rope,"Intermediate",FALSE] => intermediate, Rope.Equal[rope,"Beginner",FALSE] => beginner, ENDCASE => intermediate; }; PreloadStyles: PROC = { DoList["Tioga.Styles", TEditInputOps.ReloadStyleName]; }; PreloadAbbreviations: PROC = { DoList["Tioga.Abbreviations", TEditInputOps.LoadAbbreviations]; }; GetToken: PUBLIC PROC [rope: ROPE, offset: INT ¬ 0, thruEnd: BOOL ¬ FALSE] RETURNS [token: ROPE, newOffset: INT] = { size: INT = Rope.Size[rope]; start: INT; Sep: PROC [c: CHAR] RETURNS [BOOL] = { RETURN[SELECT c FROM ' , ',, Ascii.TAB, Ascii.CR, Ascii.LF, '\000 => TRUE, ENDCASE => FALSE]; }; IF offset>=size THEN RETURN["", offset]; WHILE offset