<> <> <> <<>> DIRECTORY Cursors USING [SetCursor], IconManager, InputFocus USING [GetInputFocus, SetInputFocus], Menus USING [FindEntry, MenuEntry], MessageWindow USING [Append, Blink, Confirm], Process USING [Detach], Rope USING [Cat], TIPUser USING [InstantiateNewTIPTable, TIPScreenCoords, TIPTable], ViewerOps USING [DestroyViewer, OpenIcon, PaintViewer, ChangeColumn, SaveViewer], ViewerClasses, ViewerTools USING [SelPosRec, SetSelection], WindowManager USING [colorDisplayOn]; IconManagerImpl: CEDAR PROGRAM IMPORTS Cursors, InputFocus, Menus, MessageWindow, Process, Rope, TIPUser, ViewerOps, ViewerTools, WindowManager EXPORTS IconManager SHARES Menus, ViewerClasses = BEGIN OPEN Cursors, ViewerClasses; IconNotify: PUBLIC ViewerClasses.NotifyProc = BEGIN mx, my: INTEGER; closeOthers, switchDisplays: BOOL _ FALSE; FOR l: LIST OF REF ANY _ input, l.rest UNTIL l = NIL DO WITH l.first SELECT FROM z: TIPUser.TIPScreenCoords => [mx, ----, my] _ z^; z: ATOM => SELECT z FROM $OpenDesktop, $ResetDesktop => { IF self.class.flavor = $DeskTop THEN self.class.notify[self, input]; RETURN}; $SetInputFocus => SELECT self.class.flavor FROM $Text => ViewerTools.SetSelection[self, NEW[ViewerTools.SelPosRec_[]]]; $Typescript, $Chat => ViewerTools.SetSelection[self]; ENDCASE; $CloseOthers => closeOthers _ TRUE; $Color => IF WindowManager.colorDisplayOn THEN ViewerOps.ChangeColumn[self, color]; $Delete => DestroyIcon[self]; $Save => { entry: Menus.MenuEntry = Menus.FindEntry[self.menu, "Save"]; MessageWindow.Append["Saving icon . . . ", TRUE]; IF entry = NIL THEN ViewerOps.SaveViewer[self] ELSE entry.proc[self]; MessageWindow.Append["done."]}; $Left => ViewerOps.ChangeColumn[self, left]; $MouseMove => Cursors.SetCursor[textPointer]; $Open => ViewerOps.OpenIcon[self, closeOthers]; $Right => ViewerOps.ChangeColumn[self, right]; $Select => SelectIcon[self]; $TogglePos => ViewerOps.ChangeColumn[self, SELECT self.column FROM left => right, right => left, color => left, ENDCASE => ERROR]; ENDCASE => NULL; ENDCASE => NULL; ENDLOOP; END; IconModify: PUBLIC ViewerClasses.ModifyProc = BEGIN SELECT change FROM set => ViewerOps.PaintViewer[self, all]; kill => {selectedIcon _ NIL; ViewerOps.PaintViewer[self, all]}; ENDCASE; END; selectedIcon: PUBLIC ViewerClasses.Viewer _ NIL; DestroyIcon: PROC [icon: Viewer] = BEGIN IF icon.inhibitDestroy THEN { MessageWindow.Append["That icon cannot be destroyed.", TRUE]; MessageWindow.Blink[]; RETURN}; IF icon.link = NIL AND (icon.newVersion OR icon.newFile) THEN TRUSTED {Process.Detach[FORK ConfirmDestroyIcon[icon]]} -- fork for confirmation ELSE ViewerOps.DestroyViewer[icon]; END; ConfirmDestroyIcon: PROC [icon: Viewer] = BEGIN IF MessageWindow.Confirm[Rope.Cat["Confirm delete (and loss of edits) for icon: ", icon.name]] THEN ViewerOps.DestroyViewer[icon]; END; SelectIcon: PROC [viewer: Viewer] = BEGIN IF InputFocus.GetInputFocus[].owner#viewer THEN BEGIN InputFocus.SetInputFocus[NIL]; -- kill old so we don't smash selectedIcon selectedIcon _ viewer; InputFocus.SetInputFocus[viewer]; END; END; Open: PROC [viewer: Viewer, closeOthers: BOOL] = {ViewerOps.OpenIcon[viewer, closeOthers]}; iconTIP: PUBLIC TIPUser.TIPTable _ TIPUser.InstantiateNewTIPTable["/Indigo/CedarViewers/Viewers/Icons.tip"] ; END.