<<-- TapeToolUtilitiesImpl.mesa>> <> <> <> <<>> DIRECTORY Idle USING [IdleHandler, RegisterIdleHandler, UnregisterIdleHandler], IO USING [Close, EndOfStream, GetTokenRope, IDProc, RIS, STREAM], Rope USING [Cat, Index, ROPE, Substr], TapeToolInternal USING [ExecuteOp, Parameters, TapeTool, ToolParameters], UserCredentials USING [Get], UserProfile USING [Boolean, ListOfTokens, Number, ProfileChangedProc, Token], VFonts USING [EstablishFont, Font, FontHeight], ViewerClasses USING [Viewer], ViewerTools USING [GetContents, SetContents]; TapeToolUtilitiesImpl: CEDAR MONITOR IMPORTS Idle, IO, Rope, TapeToolInternal, UserCredentials, UserProfile, VFonts, ViewerTools EXPORTS TapeToolInternal = BEGIN OPEN Tool: TapeToolInternal; ROPE: TYPE = Rope.ROPE; STREAM: TYPE ~ IO.STREAM; ---- ---- ---- ---- ---- ---- ---- ---- <> ---- ---- ---- ---- ---- ---- ---- ---- parameters: Tool.Parameters _ NIL; atIdle: BOOL _ FALSE; profileTool: Tool.TapeTool _ NIL; curUser: ROPE _ NIL; ---- ---- ---- ---- ---- ---- ---- ---- <> ---- ---- ---- ---- ---- ---- ---- ---- ViewerToRopeList: PUBLIC PROC [viewer: ViewerClasses.Viewer] RETURNS [list: LIST OF ROPE _ NIL] = BEGIN tail: LIST OF ROPE _ NIL; s: IO.STREAM = IO.RIS[ViewerTools.GetContents[viewer]]; DO r: ROPE _ s.GetTokenRope[IO.IDProc ! IO.EndOfStream => EXIT].token; rL: LIST OF ROPE; rL _ CONS[r, NIL]; IF list = NIL THEN list _ rL ELSE tail.rest _ rL; tail _ rL; ENDLOOP; s.Close[]; END; GetToolParameters: PUBLIC PROC RETURNS [Tool.Parameters] = {RETURN[parameters]}; ResetNewParameters: PUBLIC ENTRY PROC = BEGIN parameters.new _ FALSE; END; ReactToProfile: PUBLIC ENTRY UserProfile.ProfileChangedProc = BEGIN ENABLE UNWIND => NULL; params: Tool.Parameters _ NEW[Tool.ToolParameters]; fontFamily: ROPE = UserProfile.Token["TapeTool.FontFamily", "Tioga"]; fontSize: NAT = UserProfile.Number["TapeTool.FontSize", 10]; userName: ROPE _ UserCredentials.Get[].name; host: ROPE _ UserProfile.Token["TapeTool.Host", "Ivy"]; userName _ userName.Substr[len: userName.Index[s2: "."]]; params.fileNamePrefixes _ UserProfile.ListOfTokens[ key: "TapeTool.FileNamePrefixes", default: LIST[Rope.Cat["[", host, "]<", userName, ">"], NIL] ]; params.font _ VFonts.EstablishFont[fontFamily, fontSize]; params.fixedFont _ VFonts.EstablishFont[family: "Gacha", size: fontSize - 2]; params.entryHeight _ VFonts.FontHeight[params.font] + 2; params.entryVSpace _ VFonts.FontHeight[params.font]*1/6; params.entryHSpace _ 10; params.localDisk _ UserProfile.Boolean["TapeTool.Local", FALSE]; params.defaultServer _ UserProfile.Token["TapeTool.Server", "Maggie"]; params.new _ TRUE; parameters _ params; IF profileTool # NIL THEN BEGIN ViewerTools.SetContents[profileTool.fileNameViewer, (IF params.fileNamePrefixes = NIL THEN NIL ELSE params.fileNamePrefixes.first)]; END; END; RegisterProfile: PUBLIC ENTRY PROC [tool: Tool.TapeTool] = BEGIN profileTool _ tool; END; UnregisterProfile: PUBLIC ENTRY PROC [tool: Tool.TapeTool] = BEGIN profileTool _ NIL; END; RegisterIdle: PUBLIC ENTRY PROC [tool: Tool.TapeTool] = BEGIN tool.idleEvent _ Idle.RegisterIdleHandler[RegisterProc, tool]; END; UnRegisterIdle: PUBLIC ENTRY PROC [tool: Tool.TapeTool] = BEGIN IF tool.idleEvent = NIL THEN RETURN []; Idle.UnregisterIdleHandler[tool.idleEvent]; END; IdleCheck: PUBLIC ENTRY PROC [tool: Tool.TapeTool] RETURNS [idle: BOOL] = BEGIN RETURN [atIdle]; END; RegisterProc: Idle.IdleHandler = BEGIN <> tool: Tool.TapeTool _ NARROW[data]; atIdle _ IF reason = becomingIdle THEN TRUE ELSE FALSE; IF atIdle AND tool.open AND NOT tool.active THEN Tool.ExecuteOp[tool: tool, op: [op: Close]]; END; ReactToProfile[edit]; END. <<>>