diff -r 9d86e8fc4219 -r e35a94b5c2a0 WorkspaceApplication.st --- a/WorkspaceApplication.st Mon Sep 24 21:01:22 2001 +0200 +++ b/WorkspaceApplication.st Tue Sep 25 12:08:05 2001 +0200 @@ -1,7 +1,7 @@ "{ Package: 'stx:libtool' }" ToolApplicationModel subclass:#WorkspaceApplication - instanceVariableNames:'' + instanceVariableNames:'workspaces tabList selectedWorkspaceIndexHolder workspaceHolder' classVariableNames:'' poolDictionaries:'' category:'Interface-Smalltalk' @@ -44,7 +44,7 @@ #name: 'Workspace' #min: #(#Point 10 10) #max: #(#Point 1024 768) - #bounds: #(#Rectangle 170 332 602 573) + #bounds: #(#Rectangle 16 46 448 287) #menu: #mainMenu ) #component: @@ -59,6 +59,19 @@ #hasBorder: false #component: #Workspace ) + #(#NoteBookViewSpec + #name: 'NoteBook1' + #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0) + #model: #selectedWorkspaceIndexHolder + #menu: #tabList + #useIndex: true + #accessTabMenuAction: #tabMenuAt: + #canvas: #workspaceHolder + #canvasInset: 0 + #canvasFrameLevel: 0 + #keepCanvasAlive: true + #tabLevel: 2 + ) ) ) @@ -93,8 +106,8 @@ #(#MenuItem #label: 'New' #translateLabel: true + #isVisible: false #value: #menuNew - #isVisible: false ) #(#MenuItem #label: '-' @@ -127,6 +140,40 @@ ) ) #(#MenuItem + #label: 'Workspace' + #translateLabel: true + #nameKey: #Workspace + #submenu: + #(#Menu + #( + #(#MenuItem + #label: 'Add' + #translateLabel: true + #triggerOnDown: true + #value: #addWorkspace + ) + #(#MenuItem + #label: 'Rename...' + #translateLabel: true + #triggerOnDown: true + #value: #renameWorkspace + ) + #(#MenuItem + #label: '-' + ) + #(#MenuItem + #label: 'Remove' + #translateLabel: true + #triggerOnDown: true + #value: #removeWorkspace + #enabled: #canRemoveWorkspace + ) + ) + nil + nil + ) + ) + #(#MenuItem #label: 'Edit' #translateLabel: true #submenu: @@ -215,77 +262,211 @@ nil nil ) +! + +tabMenu + "This resource specification was automatically generated + by the MenuEditor of ST/X." + + "Do not manually edit this!! If it is corrupted, + the MenuEditor may not be able to read the specification." + + " + MenuEditor new openOnClass:WorkspaceApplication andSelector:#tabMenu + (Menu new fromLiteralArrayEncoding:(WorkspaceApplication tabMenu)) startUp + " + + + + ^ + #(#Menu + #( + #(#MenuItem + #label: 'Add' + #translateLabel: true + #triggerOnDown: true + #value: #addWorkspace + ) + #(#MenuItem + #label: 'Rename...' + #translateLabel: true + #triggerOnDown: true + #value: #renameWorkspace: + ) + #(#MenuItem + #label: '-' + ) + #(#MenuItem + #label: 'Remove' + #translateLabel: true + #triggerOnDown: true + #value: #removeWorkspace: + #enabled: #canRemoveWorkspace: + ) + ) + nil + nil + ) ! ! !WorkspaceApplication methodsFor:'accessing'! -workspaceView - ^ (builder componentAt:#WorkspaceView) +selectedWorkspace + |wsIndex| + + workspaces isNil ifTrue:[ + workspaces := OrderedCollection new. + ]. + wsIndex := self selectedWorkspaceIndexHolder value. + wsIndex == 0 ifTrue:[ + ^ nil + ]. + + workspaces size < wsIndex ifTrue:[ + workspaces grow:wsIndex. + workspaces at:wsIndex put:(HVScrollableView for:Workspace). + ]. + ^ workspaces at:wsIndex +! + +tabMenuAt:index + |m i| + + m := self class tabMenu. + m := m decodeAsLiteralArray. + i := m detectItem:[:item | item value == #removeWorkspace:] ifNone:nil. + i notNil ifTrue:[ + i argument:index. + index ~~ self selectedWorkspaceIndexHolder value ifTrue:[ + "/ for now: if that buffer is modified, + "/ do not allow removing. + "/ (must be brought to front, in order for check-for-modification to work) + (workspaces at:index) modified ifTrue:[ + i disable + ]. + ]. + ]. + i := m detectItem:[:item | item value == #renameWorkspace:] ifNone:nil. + i notNil ifTrue:[ + i argument:index. + ]. + + m findGuiResourcesIn:self. + ^ m +! + +workspace + |wsIndex| + + workspaces isNil ifTrue:[ + workspaces := OrderedCollection new. + ]. + wsIndex := self selectedWorkspaceIndexHolder value. + workspaces size < wsIndex ifTrue:[ + workspaces grow:wsIndex. + workspaces at:wsIndex put:(HVScrollableView for:Workspace). + ]. + ^ workspaces at:wsIndex +! + +workspaceHolder + workspaceHolder isNil ifTrue:[ + workspaceHolder := ValueHolder with:(self selectedWorkspace).. + ]. + ^ workspaceHolder +! ! + +!WorkspaceApplication methodsFor:'aspects'! + +selectedWorkspaceIndexHolder + selectedWorkspaceIndexHolder isNil ifTrue:[ + selectedWorkspaceIndexHolder := 1 asValue. + selectedWorkspaceIndexHolder onChangeSend:#workspaceSelectionChanged to:self. + ]. + ^ selectedWorkspaceIndexHolder. +! + +tabList + tabList isNil ifTrue:[ + tabList := List new. + ]. + ^ tabList. +! ! + +!WorkspaceApplication methodsFor:'aspects - queries'! + +canRemoveWorkspace + ^ self tabList size > 1 ! ! !WorkspaceApplication methodsFor:'initialization & release'! closeRequest - (self askIfModified:'Close without saving ?' yesButton:'Close') ifFalse:[ + (self askIfModified:'Text was modified. Close anyway ?' yesButton:'Close') ifFalse:[ ^ self ]. ^ super closeRequest -! - -postBuildWith:aBuilder - "This is a hook method generated by the Browser. - It will be invoked during the initialization of your app/dialog, - after all of the visual components have been built, - but BEFORE the top window is made visible. - Add any app-specific actions here (reading files, setting up - values etc.)" - - "/ add any code here ... - - ^ super postBuildWith:aBuilder ! ! !WorkspaceApplication methodsFor:'menu actions'! +addWorkspace + |tabList wsIndex| + + tabList := self tabList. + wsIndex := tabList size + 1. + wsIndex == 1 ifTrue:[ + "/ first - add a name for the first tab + tabList add:(self window label). "/ 'Workspace'. + wsIndex := wsIndex + 1. + ]. + + tabList add:('Workspace%1' bindWith:wsIndex). + workspaces grow:wsIndex. + workspaces at:wsIndex put:(HVScrollableView for:Workspace). + self selectedWorkspaceIndexHolder value:wsIndex +! + browseIt - self workspaceView browseIt + self selectedWorkspace browseIt ! copySelection - self workspaceView copySelection + self selectedWorkspace copySelection ! cutSelection - self workspaceView cutSelection + self selectedWorkspace cutSelection ! doIt - self workspaceView doIt + self selectedWorkspace doIt ! inspectIt - self workspaceView inspectIt + self selectedWorkspace inspectIt ! menuLoad - |file| + |file ws| - (self askIfModified:'Text was modified. Load anyway ?' yesButton:'Load'). + (self askIfModified:'Text was modified. Load anyway ?' yesButton:'Load') ifFalse:[ ^ self]. + file := Dialog requestFileName:'Load file:'. file size > 0 ifTrue:[ - self workspaceView contents:file asFilename contentsOfEntireFile. + (ws := self selectedWorkspace) contents:file asFilename contentsOfEntireFile. + ws modified:false. ] ! menuSaveAs - |file| + |file ws| - file := Dialog - requestFileName:'Save file:' - default:'file.wsp'. + file := Dialog requestFileName:'Save file:' default:'file.wsp'. file size > 0 ifTrue:[ - self workspaceView saveAs:file. + (ws := self selectedWorkspace) saveAs:file. + ws modified:false. ] ! @@ -296,11 +477,70 @@ ! paste - self workspaceView paste + self selectedWorkspace paste ! printIt - self workspaceView printIt + self selectedWorkspace printIt +! + +removeWorkspace + self removeWorkspace:(self selectedWorkspaceIndexHolder value) +! + +removeWorkspace:wsIndex + |tabList newWsIndex| + + wsIndex == self selectedWorkspaceIndexHolder value ifTrue:[ + (self askIfModified:'Text was modified. Remove anyway ?' yesButton:'Remove') ifFalse:[ + ^ self + ]. + ]. + + tabList := self tabList. + + wsIndex == tabList size ifTrue:[ + newWsIndex := wsIndex - 1. + ] ifFalse:[ + newWsIndex := wsIndex. + ]. + + tabList removeIndex:wsIndex. + (workspaces at:wsIndex) destroy. + workspaces removeIndex:wsIndex. + + tabList size == 1 ifTrue:[ + self window label:(tabList at:1). + tabList removeIndex:1 + ]. + + self selectedWorkspaceIndexHolder value:newWsIndex. + "/ to force change (update workspaceHolder - even if same index) + self selectedWorkspaceIndexHolder changed:#value. +! + +renameWorkspace + self renameWorkspace:(self selectedWorkspaceIndexHolder value) +! + +renameWorkspace:wsIndex + |tabList oldName newName| + + tabList := self tabList. + tabList isEmpty ifTrue:[ + oldName := self window label + ] ifFalse:[ + oldName := tabList at:wsIndex. + ]. + newName := Dialog request:(resources string:'New Name for %1:' with:oldName) initialAnswer:oldName. + newName size == 0 ifTrue:[ ^ self]. + + tabList notEmpty ifTrue:[ + tabList at:wsIndex put:newName. + ]. + wsIndex == self selectedWorkspaceIndexHolder value ifTrue:[ + self window label:newName. + ]. ! ! !WorkspaceApplication methodsFor:'private'! @@ -310,7 +550,7 @@ |textView| - textView := self workspaceView. + textView := self selectedWorkspace. (textView modified not or:[textView contentsWasSaved]) ifTrue:[ ^ true ]. @@ -326,10 +566,23 @@ ^ false "Modified: 2.10.1997 / 14:23:47 / stefan" +! + +workspaceSelectionChanged + |wsIndex windowLabel| + + "/ self selected + self workspaceHolder value:(self selectedWorkspace). + wsIndex := self selectedWorkspaceIndexHolder value. + + wsIndex ~~ 0 ifTrue:[ + windowLabel := tabList at:wsIndex ifAbsent:nil. + windowLabel notNil ifTrue:[self window label:windowLabel]. + ]. ! ! !WorkspaceApplication class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libtool/WorkspaceApplication.st,v 1.3 2001-09-24 13:39:53 cg Exp $' + ^ '$Header: /cvs/stx/stx/libtool/WorkspaceApplication.st,v 1.4 2001-09-25 10:08:05 cg Exp $' ! !