e975c8b91d10 — Gerald Klix (speedy) 3 months ago
SUM: Added a super class fro root items.
M haver/office/OfficeRoots.pck.st +56 -25
@@ 1,4 1,4 @@ 
-'From Haver7.0 [latest update: #6454] on 26 June 2024 at 2:01:48 pm'!
+'From Haver7.0 [latest update: #6454] on 26 June 2024 at 7:21:30 pm'!
 'Description I provide a (persistent) root for all the office data like:
 
 - ToDo items

          
@@ 6,10 6,10 @@ 
 - Documents
 
 and a lot more.'!
-!provides: 'OfficeRoots' 1 70!
+!provides: 'OfficeRoots' 1 71!
 !requires: 'IdGeneration' 1 2 nil!
+!requires: 'ActionButtons' 1 47 nil!
 !requires: 'ActionBuilder' 1 36 nil!
-!requires: 'ActionButtons' 1 47 nil!
 !requires: 'States' 1 0 nil!
 !requires: 'PlanF' 1 28 nil!
 !requires: 'SystemMorphs' 1 15 nil!

          
@@ 27,9 27,9 @@ Modules newEnvironment: #OfficeRoots!
 
 !interfacesOf: OfficeRoots!
 Modules environment: #OfficeRoots ::
-	interface: #API exporting: #(#OfficeItemListMorph #Roots #OfficeItemWrapper) ::
-	interface: #SPI exporting: #(#ListItemWrapper #SubItemWrappersModel #AbstractRoots #SearchResultItemWrapper #OfficeItemListMorph #GroupingSubItemWrappersModel #ConfigurationSwitchingGroupingSubItemWrappersModel #OfficeItemWrapper) ::
-	interface: #UTI exporting: #(#ListItemWrapper)!
+	interface: #API exporting: #(#OfficeItemWrapper #OfficeItemListMorph #Roots) ::
+	interface: #UTI exporting: #(#ListItemWrapper) ::
+	interface: #SPI exporting: #(#ConfigurationSwitchingGroupingSubItemWrappersModel #AbstractRoots #OfficeItemListMorph #ListItemWrapper #SearchResultItemWrapper #OfficeItemWrapper #SubItemWrappersModel #GroupingSubItemWrappersModel)!
 
 !importsOf: OfficeRoots!
 Modules environment: #OfficeRoots :: 

          
@@ 73,9 73,20 @@ Modules environment: #OfficeRoots ::
 (Modules>>#OfficeRoots>>#LinkingOfficeItem) class
 	instanceVariableNames: ''!
 
+!classDefinition: (Modules>>#OfficeRoots>>#AbstractRootOfficeItem) category: #'OfficeRoots-Items'!
+(Modules>>#OfficeRoots>>#AbstractOfficeItem) subclass: #AbstractRootOfficeItem
+	instanceVariableNames: 'root'
+	classVariableNames: ''
+	poolDictionaries: ''
+	category: 'OfficeRoots-Items'
+	inModule: #OfficeRoots!
+!classDefinition: (Modules>>#OfficeRoots>>#AbstractRootOfficeItem) class category: #'OfficeRoots-Items'!
+(Modules>>#OfficeRoots>>#AbstractRootOfficeItem) class
+	instanceVariableNames: ''!
+
 !classDefinition: (Modules>>#OfficeRoots>>#LinkContainersCollection) category: #'OfficeRoots-Items'!
-(Modules>>#OfficeRoots>>#AbstractOfficeItem) subclass: #LinkContainersCollection
-	instanceVariableNames: 'root'
+(Modules>>#OfficeRoots>>#AbstractRootOfficeItem) subclass: #LinkContainersCollection
+	instanceVariableNames: ''
 	classVariableNames: ''
 	poolDictionaries: ''
 	category: 'OfficeRoots-Items'

          
@@ 1590,29 1601,37 @@ recordDescriptionForPlanF: aStore
 		gettersAndSetters: #(
 			(itemsForPlanF itemsFromPlanF:))! !
 
-!(Modules>>#OfficeRoots>>#LinkContainersCollection) methodsFor: 'accessing' stamp: 'KLG 6/25/2024 20:47:55'!
+!(Modules>>#OfficeRoots>>#AbstractRootOfficeItem) methodsFor: 'accessing' stamp: 'KLG 6/26/2024 19:08:00'!
 root
 	"Answer the value of root"
 
 	^ root! !
 
-!(Modules>>#OfficeRoots>>#LinkContainersCollection) methodsFor: 'accessing' stamp: 'KLG 6/25/2024 13:48:12'!
+!(Modules>>#OfficeRoots>>#AbstractRootOfficeItem) methodsFor: 'accessing' stamp: 'KLG 6/26/2024 19:08:23'!
 root: aRoots 
 	"Set the root object."
 
 	root := aRoots! !
 
-!(Modules>>#OfficeRoots>>#LinkContainersCollection) methodsFor: 'testing' stamp: 'KLG 6/25/2024 20:49:13'!
+!(Modules>>#OfficeRoots>>#AbstractRootOfficeItem) methodsFor: 'testing' stamp: 'KLG 6/26/2024 19:08:15'!
 canSave
 	"Answer true if we can save our self."
 
 	^ root notNil! !
 
-!(Modules>>#OfficeRoots>>#LinkContainersCollection) methodsFor: 'persistence' stamp: 'KLG 6/25/2024 20:52:56'!
+!(Modules>>#OfficeRoots>>#AbstractRootOfficeItem) methodsFor: 'persistence' stamp: 'KLG 6/26/2024 19:17:27'!
+save
+	"Save me on my file entry."
+
+	self withStoreDo: [ :store |		 store backup ]! !
+
+!(Modules>>#OfficeRoots>>#AbstractRootOfficeItem) methodsFor: 'persistence' stamp: 'KLG 6/26/2024 19:13:53'!
 withStoreDo: aBlock
 	"Evaluate aBock with my store."
 
-	^ root ifNotNil: [ root withStoreDo: aBlock ]! !
+	^ root 
+		ifNotNil: [ root withStoreDo: aBlock ]
+		ifNil: [ super withStoreDo: aBlock ]! !
 
 !(Modules>>#OfficeRoots>>#LinkContainersCollection) class methodsFor: 'instance creation' stamp: 'KLG 6/25/2024 13:32:31'!
 browserMorphClass

          
@@ 2991,7 3010,7 @@ documents: anObject
 			updateObject: documents;
 			flush ]! !
 
-!(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 6/25/2024 19:18:32'!
+!(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 6/26/2024 17:12:40'!
 linkContainers
 	"Answer a collection of link containers."
 

          
@@ 3001,10 3020,12 @@ linkContainers
 			storeNonNil
 				updateObject: self;
 				flush ] ].
-	linkContainers root: self. ": This instance variable is not persistent!!"
+	linkContainers 
+		root: self; ": This instance variable is not persistent!!"
+		id: 'LC'. ": Use a descriptive id"
 	^ linkContainers! !
 
-!(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 12/15/2023 15:34:29'!
+!(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 6/26/2024 17:13:13'!
 portfolio
 	"Answer the value of investments"
 

          
@@ 3016,7 3037,9 @@ portfolio
 			ifNil: [
 				self notify: 'Investing package not available'.
 				^ nil ] ].
-	portfolio root: self. ": This instance variable is not persistent!!"
+	portfolio
+		root: self; ": This instance variable is not persistent!!"
+		id: 'PF'. ": Use a descriptive id"
 	^ portfolio ! !
 
 !(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 12/14/2023 11:46:12'!

          
@@ 3030,14 3053,16 @@ portfolio: anObject
 			updateObject: portfolio;
 			flush ]! !
 
-!(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 8/22/2023 11:21:55'!
+!(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 6/26/2024 17:13:37'!
 spreadsheets
 	"Answer the value of spreadsheets"
 
 	spreadsheets ifNil: [
 		Feature require: 'SpreadSheet'.
 		self spreadsheets: (Modules >> #SpreadSheet >> #SpreadSheetList :: new) ].
-	spreadsheets root: self. ": This instance variable is not persistent!!"
+	spreadsheets
+		root: self; ": This instance variable is not persistent!!"
+		id: 'SS'. ": Use a descriptive id"
 	^ spreadsheets! !
 
 !(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 8/22/2023 11:18:22'!

          
@@ 3051,14 3076,16 @@ spreadsheets: anObject
 			updateObject: spreadsheets;
 			flush ]! !
 
-!(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 8/18/2023 21:59:27'!
+!(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 6/26/2024 17:14:14'!
 todoItems
 	"Answer the value of todoItems"
 
 	todoItems ifNil: [
 		Feature require: 'NuMach'.
 		self todoItems: (Modules >> #NuMach >> #PersistentTodoItem :: defaultFromReferenceStream) ].
-	todoItems root: self. ": This instance variable is not persistent!!"
+	todoItems
+		root: self; ": This instance variable is not persistent!!"
+		id: 'TD'. ": Use a descriptive id"
 	^todoItems! !
 
 !(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 8/14/2023 15:50:56'!

          
@@ 3071,14 3098,16 @@ todoItems: aPersistentTodoItem
 			updateObject: self;
 			flush ]! !
 
-!(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 8/23/2023 13:27:21'!
+!(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 6/26/2024 17:15:19'!
 workspaces
 	"Answer the value of workspaces"
 
 	workspaces ifNil: [
 		Feature require: 'Workspaces'.
 		self workspaces: (Modules >> #Workspaces >> #WorkspaceList :: new) ].
-	workspaces root: self. ": This instance variable is not persistent!!"
+	workspaces
+		root: self; ": This instance variable is not persistent!!"
+		id: 'WorkS'. ": Use a descriptive id"
 	^ workspaces! !
 
 !(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 8/23/2023 20:01:38'!

          
@@ 3092,14 3121,16 @@ workspaces: anObject
 			updateObject: workspaces;
 			flush ]! !
 
-!(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 9/6/2023 21:22:51'!
+!(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 6/26/2024 17:15:40'!
 worldStates
 	"Answer the world state list"
 
 	worldStates ifNil: [
 		Feature require: 'WorldStates'.
 		self worldStates: (Modules>>#WorldStates>>#WorldStateList :: new) ].
-	worldStates root: self. ": This instance variable is not persistent!!"
+	worldStates
+		root: self; ": This instance variable is not persistent!!"
+		id: 'WorldS'.
 	^ worldStates! !
 
 !(Modules>>#OfficeRoots>>#Roots) methodsFor: 'accessing' stamp: 'KLG 8/26/2023 16:10:58'!

          
M haver/office/WorldStates.pck.st +53 -85
@@ 1,10 1,10 @@ 
-'From Haver7.0 [latest update: #6452] on 8 June 2024 at 6:31:44 pm'!
+'From Haver7.0 [latest update: #6454] on 26 June 2024 at 7:22:35 pm'!
 'Description I provide some means to persist the state of the world,
 including window sets.'!
-!provides: 'WorldStates' 1 8!
+!provides: 'WorldStates' 1 9!
 !requires: 'WindowSets' 1 27 nil!
 !requires: 'FacetsMorphs' 1 4 nil!
-!requires: 'OfficeRoots' 1 22 nil!
+!requires: 'OfficeRoots' 1 71 nil!
 !requires: 'ActionButtons' 1 33 nil!
 SystemOrganization addCategory: #WorldStates!
 SystemOrganization addCategory: #'WorldStates-Model'!

          
@@ 22,10 22,10 @@ Modules environment: #WorldStates ::
 
 !importsOf: WorldStates!
 Modules environment: #WorldStates :: 
-	import: #(#OfficeItemListMorph #OfficeItemWrapper) from: #API of: Modules>>#OfficeRoots :: 
+	import: #(#DetailsMorph) from: #API of: Modules>>#FacetsMorphs :: 
 	import: #(#ActionBuilder) from: #API of: Modules>>#ActionBuilder :: 
 	import: #(#TargetToggleButton #TargetButton) from: #API of: Modules>>#ActionButtons :: 
-	import: #(#DetailsMorph) from: #API of: Modules>>#FacetsMorphs!
+	import: #(#OfficeItemListMorph #OfficeItemWrapper) from: #API of: Modules>>#OfficeRoots!
 
 !classDefinition: (Modules>>#WorldStates>>#WindowSetsBrowser) category: #'WorldStates-Model'!
 (Modules>>#WindowSets>>#WindowSetsBrowser) subclass: #WindowSetsBrowser

          
@@ 38,6 38,17 @@ Modules environment: #WorldStates ::
 (Modules>>#WorldStates>>#WindowSetsBrowser) class
 	instanceVariableNames: ''!
 
+!classDefinition: (Modules>>#WorldStates>>#WorldStateList) category: #'WorldStates-Model'!
+(Modules>>#OfficeRoots>>#AbstractRootOfficeItem) subclass: #WorldStateList
+	instanceVariableNames: ''
+	classVariableNames: ''
+	poolDictionaries: ''
+	category: 'WorldStates-Model'
+	inModule: #WorldStates!
+!classDefinition: (Modules>>#WorldStates>>#WorldStateList) class category: #'WorldStates-Model'!
+(Modules>>#WorldStates>>#WorldStateList) class
+	instanceVariableNames: ''!
+
 !classDefinition: (Modules>>#WorldStates>>#WorldState) category: #'WorldStates-Model'!
 (Modules>>#OfficeRoots>>#AbstractOfficeItem) subclass: #WorldState
 	instanceVariableNames: 'snapshotDirty displayExtent windowSets morphMementos'

          
@@ 49,17 60,6 @@ Modules environment: #WorldStates ::
 (Modules>>#WorldStates>>#WorldState) class
 	instanceVariableNames: ''!
 
-!classDefinition: (Modules>>#WorldStates>>#WorldStateList) category: #'WorldStates-Model'!
-(Modules>>#OfficeRoots>>#AbstractOfficeItem) subclass: #WorldStateList
-	instanceVariableNames: 'root'
-	classVariableNames: ''
-	poolDictionaries: ''
-	category: 'WorldStates-Model'
-	inModule: #WorldStates!
-!classDefinition: (Modules>>#WorldStates>>#WorldStateList) class category: #'WorldStates-Model'!
-(Modules>>#WorldStates>>#WorldStateList) class
-	instanceVariableNames: ''!
-
 !classDefinition: (Modules>>#WorldStates>>#WindowSetsBrowserMorph) category: #'WorldStates-Morphs'!
 (Modules>>#WindowSets>>#WindowSetsBrowserMorph) subclass: #WindowSetsBrowserMorph
 	instanceVariableNames: ''

          
@@ 108,12 108,12 @@ Object subclass: #WindowStateMemento
 !(Modules>>#WorldStates>>#WindowSetsBrowser) commentStamp: '<historical>' prior: 0!
 I am a slightly modified window sets browser.!
 
+!(Modules>>#WorldStates>>#WorldStateList) commentStamp: '<historical>' prior: 0!
+I am represent a list of world states.!
+
 !(Modules>>#WorldStates>>#WorldState) commentStamp: '<historical>' prior: 0!
 I am a persistent world state.!
 
-!(Modules>>#WorldStates>>#WorldStateList) commentStamp: '<historical>' prior: 0!
-I am represent a list of world states.!
-
 !(Modules>>#WorldStates>>#WindowSetsBrowserMorph) commentStamp: '<historical>' prior: 0!
 I am browser morph for window sets with less actions.!
 

          
@@ 197,6 197,40 @@ windowSetItemWrapperClass
 
 	^ WindowSetItemWrapper! !
 
+!(Modules>>#WorldStates>>#WorldStateList) class methodsFor: 'instance creation' stamp: 'KLG 8/26/2023 22:37:42'!
+browserMorphClass
+	"Answer my browser morph."
+	
+	^ OfficeItemListMorph! !
+
+!(Modules>>#WorldStates>>#WorldStateList) class methodsFor: 'instance creation' stamp: 'KLG 8/26/2023 22:36:24'!
+itemClass
+	"Answer my item class."
+	
+	^ WorldState! !
+
+!(Modules>>#WorldStates>>#WorldStateList) class methodsFor: 'user interface' stamp: 'KLG 8/26/2023 22:37:12'!
+displayCode
+	"Answer my 4 character display code."
+
+	^ 'WstL'! !
+
+!(Modules>>#WorldStates>>#WorldStateList) class methodsFor: 'user interface' stamp: 'KLG 8/26/2023 22:38:03'!
+printName
+	"Answer my print name."
+	
+	^ 'WorldStates'! !
+
+!(Modules>>#WorldStates>>#WorldStateList) class methodsFor: 'persistence' stamp: 'KLG 8/26/2023 22:35:00'!
+recordDescriptionForPlanF: aStore
+	"Answer a record description for my instances."
+
+	^ aStore recordDescriptionClass
+		forClass: self
+		storeInstanceVariables: #(id)
+		gettersAndSetters: #(
+			(itemsForPlanF itemsFromPlanF:))! !
+
 !(Modules>>#WorldStates>>#WorldState) methodsFor: 'accessing' stamp: 'KLG 9/5/2023 19:18:22'!
 collection
 	"Answer my window set collection."

          
@@ 355,72 389,6 @@ recordDescriptionForPlanF: aStore
 		gettersAndSetters: #(
 			(itemsForPlanF itemsFromPlanF:))! !
 
-!(Modules>>#WorldStates>>#WorldStateList) methodsFor: 'accessing' stamp: 'KLG 8/26/2023 22:35:00'!
-root
-	"Answer the value of root"
-
-	^ root! !
-
-!(Modules>>#WorldStates>>#WorldStateList) methodsFor: 'accessing' stamp: 'KLG 8/26/2023 22:35:00'!
-root: anObject
-	"Set the value of root"
-
-	root := anObject! !
-
-!(Modules>>#WorldStates>>#WorldStateList) methodsFor: 'testing' stamp: 'KLG 8/26/2023 22:35:00'!
-canSave
-	"Answer true if we can save our self."
-
-	^ root notNil! !
-
-!(Modules>>#WorldStates>>#WorldStateList) methodsFor: 'persistence PlanF' stamp: 'KLG 8/26/2023 22:35:00'!
-save
-	"Save me on my file entry."
-
-	self withStoreDo: [ :store |		store backup ]! !
-
-!(Modules>>#WorldStates>>#WorldStateList) methodsFor: 'persistence PlanF' stamp: 'KLG 8/26/2023 22:35:00'!
-withStoreDo: aBlock
-	"Evaluate aBock with my store."
-
-	^ root 
-		ifNotNil: [ root withStoreDo: aBlock ]
-		ifNil: [ super withStoreDo: aBlock ]! !
-
-!(Modules>>#WorldStates>>#WorldStateList) class methodsFor: 'instance creation' stamp: 'KLG 8/26/2023 22:37:42'!
-browserMorphClass
-	"Answer my browser morph."
-	
-	^ OfficeItemListMorph! !
-
-!(Modules>>#WorldStates>>#WorldStateList) class methodsFor: 'instance creation' stamp: 'KLG 8/26/2023 22:36:24'!
-itemClass
-	"Answer my item class."
-	
-	^ WorldState! !
-
-!(Modules>>#WorldStates>>#WorldStateList) class methodsFor: 'user interface' stamp: 'KLG 8/26/2023 22:37:12'!
-displayCode
-	"Answer my 4 character display code."
-
-	^ 'WstL'! !
-
-!(Modules>>#WorldStates>>#WorldStateList) class methodsFor: 'user interface' stamp: 'KLG 8/26/2023 22:38:03'!
-printName
-	"Answer my print name."
-	
-	^ 'WorldStates'! !
-
-!(Modules>>#WorldStates>>#WorldStateList) class methodsFor: 'persistence' stamp: 'KLG 8/26/2023 22:35:00'!
-recordDescriptionForPlanF: aStore
-	"Answer a record description for my instances."
-
-	^ aStore recordDescriptionClass
-		forClass: self
-		storeInstanceVariables: #(id)
-		gettersAndSetters: #(
-			(itemsForPlanF itemsFromPlanF:))! !
-
 !(Modules>>#WorldStates>>#WindowSetsBrowserMorph) methodsFor: 'GUI building' stamp: 'KLG 9/5/2023 19:53:35'!
 buildActions
 	"Build all my actions."

          
M haver/office/spreadsheet/SpreadSheet.pck.st +53 -85
@@ 1,13 1,13 @@ 
-'From Haver 6.0 [latest update: #6067] on 1 November 2023 at 2:11:35 pm'!
+'From Haver7.0 [latest update: #6454] on 26 June 2024 at 7:21:41 pm'!
 'Description I contain a simple spread sheet with either Smalltalk expression or expression in a simple language.'!
-!provides: 'SpreadSheet' 1 30!
-!requires: 'SystemMorphs' 1 7 nil!
+!provides: 'SpreadSheet' 1 31!
+!requires: 'PlanF' 1 19 nil!
 !requires: 'ActionButtons' 1 31 nil!
-!requires: 'OfficeRoots' 1 22 nil!
+!requires: 'OfficeRoots' 1 71 nil!
 !requires: 'EarleyCuisScanner' 1 8 nil!
 !requires: 'GridLayout' 1 13 nil!
 !requires: 'Earley' 1 72 nil!
-!requires: 'PlanF' 1 19 nil!
+!requires: 'SystemMorphs' 1 7 nil!
 SystemOrganization addCategory: #SpreadSheet!
 SystemOrganization addCategory: #'SpreadSheet-Grammar Items'!
 SystemOrganization addCategory: #'SpreadSheet-Semantics'!

          
@@ 22,16 22,16 @@ Modules newEnvironment: #SpreadSheet!
 
 !interfacesOf: SpreadSheet!
 Modules environment: #SpreadSheet ::
-	interface: #UTI exporting: #(#Sheet #Interpreter ) ::
-	interface: #API exporting: #(#Grammar ) ::
+	interface: #API exporting: #(#Grammar) ::
+	interface: #UTI exporting: #(#Sheet #Interpreter) ::
 	interface: #SPI aliasFor: #API!
 
 !importsOf: SpreadSheet!
 Modules environment: #SpreadSheet :: 
-	import: #(#ε ) from: #API of: Modules>>#Earley :: 
-	import: #(#SystemWindow ) from: #API of: Modules>>#SystemMorphs :: 
-	import: #(#TargetButton ) from: #API of: Modules>>#ActionButtons :: 
-	import: #(#OfficeItemWrapper #OfficeItemListMorph ) from: #API of: Modules>>#OfficeRoots!
+	import: #(#ε) from: #API of: Modules>>#Earley :: 
+	import: #(#SystemWindow) from: #API of: Modules>>#SystemMorphs :: 
+	import: #(#TargetButton) from: #API of: Modules>>#ActionButtons :: 
+	import: #(#OfficeItemWrapper #OfficeItemListMorph) from: #API of: Modules>>#OfficeRoots!
 
 !classDefinition: (Modules>>#SpreadSheet>>#CellSourceModel) category: #'SpreadSheet-Model'!
 TextModel subclass: #CellSourceModel

          
@@ 44,6 44,17 @@ TextModel subclass: #CellSourceModel
 (Modules>>#SpreadSheet>>#CellSourceModel) class
 	instanceVariableNames: ''!
 
+!classDefinition: (Modules>>#SpreadSheet>>#SpreadSheetList) category: #'SpreadSheet-Model'!
+(Modules>>#OfficeRoots>>#AbstractRootOfficeItem) subclass: #SpreadSheetList
+	instanceVariableNames: ''
+	classVariableNames: ''
+	poolDictionaries: ''
+	category: 'SpreadSheet-Model'
+	inModule: #SpreadSheet!
+!classDefinition: (Modules>>#SpreadSheet>>#SpreadSheetList) class category: #'SpreadSheet-Model'!
+(Modules>>#SpreadSheet>>#SpreadSheetList) class
+	instanceVariableNames: ''!
+
 !classDefinition: (Modules>>#SpreadSheet>>#Sheet) category: #'SpreadSheet-Model'!
 (Modules>>#OfficeRoots>>#AbstractOfficeItem) subclass: #Sheet
 	instanceVariableNames: 'cellsByRow cellsByName interpreter addressPaster'

          
@@ 55,17 66,6 @@ TextModel subclass: #CellSourceModel
 (Modules>>#SpreadSheet>>#Sheet) class
 	instanceVariableNames: ''!
 
-!classDefinition: (Modules>>#SpreadSheet>>#SpreadSheetList) category: #'SpreadSheet-Model'!
-(Modules>>#OfficeRoots>>#AbstractOfficeItem) subclass: #SpreadSheetList
-	instanceVariableNames: 'root'
-	classVariableNames: ''
-	poolDictionaries: ''
-	category: 'SpreadSheet-Model'
-	inModule: #SpreadSheet!
-!classDefinition: (Modules>>#SpreadSheet>>#SpreadSheetList) class category: #'SpreadSheet-Model'!
-(Modules>>#SpreadSheet>>#SpreadSheetList) class
-	instanceVariableNames: ''!
-
 !classDefinition: (Modules>>#SpreadSheet>>#Cell) category: #'SpreadSheet-Model'!
 ActiveModel subclass: #Cell
 	instanceVariableNames: 'sheet rowIndex columnIndex sourceCode currentValue syntaxTree cellsReferenced cellsReferencingMe'

          
@@ 268,12 268,12 @@ Object subclass: #AbstractProcessor
 !(Modules>>#SpreadSheet>>#CellSourceModel) commentStamp: '<historical>' prior: 0!
 I am text model for editing spread sheet source code. !
 
+!(Modules>>#SpreadSheet>>#SpreadSheetList) commentStamp: '<historical>' prior: 0!
+I am represent a list of spread sheets, but I am no spread sheet by myself.!
+
 !(Modules>>#SpreadSheet>>#Sheet) commentStamp: '<historical>' prior: 0!
 I model a spread sheet.!
 
-!(Modules>>#SpreadSheet>>#SpreadSheetList) commentStamp: '<historical>' prior: 0!
-I am represent a list of spread sheets, but I am no spread sheet by myself.!
-
 !(Modules>>#SpreadSheet>>#Cell) commentStamp: '<historical>' prior: 0!
 I am a cell in my morph.!
 

          
@@ 423,6 423,34 @@ forSheet: aSheet andCell: aCell withGett
 
 	^ self new initalizeWithSheet: aSheet andCell: aCell withGetter: aSourceGetter andSetter: aSourceSetter! !
 
+!(Modules>>#SpreadSheet>>#SpreadSheetList) class methodsFor: 'instance creation' stamp: 'KLG 8/21/2023 12:37:21'!
+browserMorphClass
+	"Answer my browser morph."
+	
+	^ OfficeItemListMorph! !
+
+!(Modules>>#SpreadSheet>>#SpreadSheetList) class methodsFor: 'instance creation' stamp: 'KLG 8/21/2023 12:44:36'!
+itemClass
+	"Answer my item class."
+	
+	^ Sheet! !
+
+!(Modules>>#SpreadSheet>>#SpreadSheetList) class methodsFor: 'user interface' stamp: 'KLG 8/21/2023 12:43:46'!
+printName
+	"Answer my print name."
+	
+	^ 'Spreadsheets'! !
+
+!(Modules>>#SpreadSheet>>#SpreadSheetList) class methodsFor: 'persistence' stamp: 'KLG 8/21/2023 22:08:18'!
+recordDescriptionForPlanF: aStore
+	"Answer a record description for my instances."
+
+	^ aStore recordDescriptionClass
+		forClass: self
+		storeInstanceVariables: #(id)
+		gettersAndSetters: #(
+			(itemsForPlanF itemsFromPlanF:))! !
+
 !(Modules>>#SpreadSheet>>#Sheet) methodsFor: 'initialization' stamp: 'KLG 3/28/2023 12:02:01'!
 initialize
 	"Initialize my cells."

          
@@ 583,66 611,6 @@ recordDescriptionForPlanF: aStore
 			(itemsForPlanF itemsFromPlanF:)
 			(cellsForPlanF cellsFromPlanF:))! !
 
-!(Modules>>#SpreadSheet>>#SpreadSheetList) methodsFor: 'accessing' stamp: 'KLG 8/21/2023 12:33:42'!
-root
-	"Answer the value of root"
-
-	^ root! !
-
-!(Modules>>#SpreadSheet>>#SpreadSheetList) methodsFor: 'accessing' stamp: 'KLG 8/21/2023 12:33:42'!
-root: anObject
-	"Set the value of root"
-
-	root := anObject! !
-
-!(Modules>>#SpreadSheet>>#SpreadSheetList) methodsFor: 'testing' stamp: 'KLG 8/21/2023 12:56:38'!
-canSave
-	"Answer true if we can save our self."
-
-	^ root notNil! !
-
-!(Modules>>#SpreadSheet>>#SpreadSheetList) methodsFor: 'persistence PlanF' stamp: 'KLG 8/21/2023 12:57:49'!
-save
-	"Save me on my file entry."
-
-	self withStoreDo: [ :store |		store backup ]! !
-
-!(Modules>>#SpreadSheet>>#SpreadSheetList) methodsFor: 'persistence PlanF' stamp: 'KLG 8/22/2023 11:11:03'!
-withStoreDo: aBlock
-	"Evaluate aBock with my store."
-
-	^ root 
-		ifNotNil: [ root withStoreDo: aBlock ]
-		ifNil: [ super withStoreDo: aBlock ]! !
-
-!(Modules>>#SpreadSheet>>#SpreadSheetList) class methodsFor: 'instance creation' stamp: 'KLG 8/21/2023 12:37:21'!
-browserMorphClass
-	"Answer my browser morph."
-	
-	^ OfficeItemListMorph! !
-
-!(Modules>>#SpreadSheet>>#SpreadSheetList) class methodsFor: 'instance creation' stamp: 'KLG 8/21/2023 12:44:36'!
-itemClass
-	"Answer my item class."
-	
-	^ Sheet! !
-
-!(Modules>>#SpreadSheet>>#SpreadSheetList) class methodsFor: 'user interface' stamp: 'KLG 8/21/2023 12:43:46'!
-printName
-	"Answer my print name."
-	
-	^ 'Spreadsheets'! !
-
-!(Modules>>#SpreadSheet>>#SpreadSheetList) class methodsFor: 'persistence' stamp: 'KLG 8/21/2023 22:08:18'!
-recordDescriptionForPlanF: aStore
-	"Answer a record description for my instances."
-
-	^ aStore recordDescriptionClass
-		forClass: self
-		storeInstanceVariables: #(id)
-		gettersAndSetters: #(
-			(itemsForPlanF itemsFromPlanF:))! !
-
 !(Modules>>#SpreadSheet>>#Cell) methodsFor: 'printing' stamp: 'KLG 3/31/2023 11:51:47'!
 addressString
 	"Answer my address as string."

          
M haver/programming/Workspaces.pck.st +61 -93
@@ 1,14 1,14 @@ 
-'From Haver7.0 [latest update: #6454] on 21 June 2024 at 6:11:58 pm'!
+'From Haver7.0 [latest update: #6454] on 26 June 2024 at 7:24:32 pm'!
 'Description I provide persistent and enhances Workspaces, featureing an bindings explorer.'!
-!provides: 'Workspaces' 1 34!
+!provides: 'Workspaces' 1 35!
 !requires: 'IdGeneration' 1 2 nil!
 !requires: 'ModulesTools' 1 44 nil!
+!requires: 'Modules' 1 116 nil!
 !requires: 'ActionBuilder' 1 35 nil!
-!requires: 'Modules' 1 116 nil!
-!requires: 'OfficeRoots' 1 22 nil!
 !requires: 'FacetsMorphs' 1 6 nil!
+!requires: 'ActionButtons' 1 42 nil!
 !requires: 'PlanF' 1 22 nil!
-!requires: 'ActionButtons' 1 42 nil!
+!requires: 'OfficeRoots' 1 71 nil!
 SystemOrganization addCategory: #Workspaces!
 SystemOrganization addCategory: #'Workspaces-Model'!
 SystemOrganization addCategory: #'Workspaces-Morphs'!

          
@@ 20,7 20,7 @@ Modules newEnvironment: #Workspaces!
 
 !interfacesOf: Workspaces!
 Modules environment: #Workspaces ::
-	interface: #DMI exporting: #(#Workspace #WorkspaceMorph #TextModel #ObjectExplorerMorph #WorkspaceBindingWrapper) ::
+	interface: #DMI exporting: #(#Workspace #ObjectExplorerMorph #WorkspaceMorph #TextModel #WorkspaceBindingWrapper) ::
 	interface: #SPI exporting: #(#Workspace #WorkspaceMorph #TextModel) ::
 	interface: #UTI aliasFor: #API!
 

          
@@ 30,8 30,8 @@ Modules environment: #Workspaces ::
 	import: #(#ModulesListMorph) from: #SPI of: Modules>>#ModulesTools :: 
 	import: #(#ActionBuilder) from: #API of: Modules>>#ActionBuilder :: 
 	import: #(#TargetToggleButton #TargetButton #ActionButton) from: #API of: Modules>>#ActionButtons :: 
+	import: #(#OfficeItemWrapper #OfficeItemListMorph) from: #API of: Modules>>#OfficeRoots :: 
 	import: #(#SwitchingMorphButton #DetailsMorph) from: #API of: Modules>>#FacetsMorphs :: 
-	import: #(#OfficeItemWrapper #OfficeItemListMorph) from: #API of: Modules>>#OfficeRoots :: 
 	import: #API of: Modules>>#SystemMorphs :: 
 	import: #(#Module) from: #API of: Modules>>#Modules!
 

          
@@ 46,6 46,17 @@ Modules environment: #Workspaces ::
 (Modules>>#Workspaces>>#ModulesList) class
 	instanceVariableNames: ''!
 
+!classDefinition: (Modules>>#Workspaces>>#WorkspaceList) category: #'Workspaces-Model'!
+(Modules>>#OfficeRoots>>#AbstractRootOfficeItem) subclass: #WorkspaceList
+	instanceVariableNames: ''
+	classVariableNames: ''
+	poolDictionaries: ''
+	category: 'Workspaces-Model'
+	inModule: #Workspaces!
+!classDefinition: (Modules>>#Workspaces>>#WorkspaceList) class category: #'Workspaces-Model'!
+(Modules>>#Workspaces>>#WorkspaceList) class
+	instanceVariableNames: ''!
+
 !classDefinition: (Modules>>#Workspaces>>#BindingsModel) category: #'Workspaces-Model'!
 (Modules>>#OfficeRoots>>#AbstractOfficeItem) subclass: #BindingsModel
 	instanceVariableNames: 'workspace'

          
@@ 79,17 90,6 @@ Modules environment: #Workspaces ::
 (Modules>>#Workspaces>>#Workspace) class
 	instanceVariableNames: ''!
 
-!classDefinition: (Modules>>#Workspaces>>#WorkspaceList) category: #'Workspaces-Model'!
-(Modules>>#OfficeRoots>>#AbstractOfficeItem) subclass: #WorkspaceList
-	instanceVariableNames: 'root'
-	classVariableNames: ''
-	poolDictionaries: ''
-	category: 'Workspaces-Model'
-	inModule: #Workspaces!
-!classDefinition: (Modules>>#Workspaces>>#WorkspaceList) class category: #'Workspaces-Model'!
-(Modules>>#Workspaces>>#WorkspaceList) class
-	instanceVariableNames: ''!
-
 !classDefinition: (Modules>>#Workspaces>>#ObjectExplorer) category: #'Workspaces-Model'!
 (Modules>>#SystemMorphs>>#AbstractSystemMorphModel) subclass: #ObjectExplorer
 	instanceVariableNames: 'rootObject monitorList currentSelection'

          
@@ 168,12 168,12 @@ ObjectExplorerWrapper subclass: #ObjectE
 	instanceVariableNames: ''!
 
 
+!(Modules>>#Workspaces>>#WorkspaceList) commentStamp: '<historical>' prior: 0!
+I am represent a list of work spaces, but I am no work space by myself.!
+
 !(Modules>>#Workspaces>>#BindingsModel) commentStamp: '<historical>' prior: 0!
 I am a model used in an object explorer for the workspace's bindings.!
 
-!(Modules>>#Workspaces>>#WorkspaceList) commentStamp: '<historical>' prior: 0!
-I am represent a list of work spaces, but I am no work space by myself.!
-
 !(Modules>>#Workspaces>>#ObjectExplorer) commentStamp: '<historical>' prior: 0!
 ObjectExplorer provides a hierarchical alternative to #inspect. Simply evaluate an expression like:
 

          
@@ 272,6 272,46 @@ moduleListItemClassForModules
 
 	^ ModuleListItemWrapper! !
 
+!(Modules>>#Workspaces>>#WorkspaceList) methodsFor: 'accessing' stamp: 'KLG 8/23/2023 21:39:28'!
+workspaceModuleName
+	"Answer the module's name to be used to retrieve bindings."
+
+	^ parentItem ifNotNil: [ parentItem workspaceModuleName ]! !
+
+!(Modules>>#Workspaces>>#WorkspaceList) class methodsFor: 'instance creation' stamp: 'KLG 8/23/2023 13:13:23'!
+browserMorphClass
+	"Answer my browser morph."
+	
+	^ OfficeItemListMorph! !
+
+!(Modules>>#Workspaces>>#WorkspaceList) class methodsFor: 'instance creation' stamp: 'KLG 8/26/2023 22:36:50'!
+itemClass
+	"Answer my item class."
+	
+	^ Workspace! !
+
+!(Modules>>#Workspaces>>#WorkspaceList) class methodsFor: 'user interface' stamp: 'KLG 8/23/2023 21:36:07'!
+displayCode
+	"Answer my 4 character display code."
+
+	^ 'WspL'! !
+
+!(Modules>>#Workspaces>>#WorkspaceList) class methodsFor: 'user interface' stamp: 'KLG 8/23/2023 13:29:10'!
+printName
+	"Answer my print name."
+	
+	^ 'Workspaces'! !
+
+!(Modules>>#Workspaces>>#WorkspaceList) class methodsFor: 'persistence' stamp: 'KLG 8/23/2023 13:11:11'!
+recordDescriptionForPlanF: aStore
+	"Answer a record description for my instances."
+
+	^ aStore recordDescriptionClass
+		forClass: self
+		storeInstanceVariables: #(id)
+		gettersAndSetters: #(
+			(itemsForPlanF itemsFromPlanF:))! !
+
 !(Modules>>#Workspaces>>#BindingsModel) methodsFor: 'accessing' stamp: 'KLG 8/24/2023 13:31:00'!
 workspace
 	"Answer the value of workspace"

          
@@ 1203,78 1243,6 @@ minmumLocalBindinigsIndexGap
 
 	^ 8! !
 
-!(Modules>>#Workspaces>>#WorkspaceList) methodsFor: 'accessing' stamp: 'KLG 8/23/2023 13:11:11'!
-root
-	"Answer the value of root"
-
-	^ root! !
-
-!(Modules>>#Workspaces>>#WorkspaceList) methodsFor: 'accessing' stamp: 'KLG 8/23/2023 13:11:11'!
-root: anObject
-	"Set the value of root"
-
-	root := anObject! !
-
-!(Modules>>#Workspaces>>#WorkspaceList) methodsFor: 'accessing' stamp: 'KLG 8/23/2023 21:39:28'!
-workspaceModuleName
-	"Answer the module's name to be used to retrieve bindings."
-
-	^ parentItem ifNotNil: [ parentItem workspaceModuleName ]! !
-
-!(Modules>>#Workspaces>>#WorkspaceList) methodsFor: 'testing' stamp: 'KLG 8/23/2023 13:11:11'!
-canSave
-	"Answer true if we can save our self."
-
-	^ root notNil! !
-
-!(Modules>>#Workspaces>>#WorkspaceList) methodsFor: 'persistence PlanF' stamp: 'KLG 8/23/2023 13:11:11'!
-save
-	"Save me on my file entry."
-
-	self withStoreDo: [ :store |		store backup ]! !
-
-!(Modules>>#Workspaces>>#WorkspaceList) methodsFor: 'persistence PlanF' stamp: 'KLG 8/23/2023 13:11:11'!
-withStoreDo: aBlock
-	"Evaluate aBock with my store."
-
-	^ root 
-		ifNotNil: [ root withStoreDo: aBlock ]
-		ifNil: [ super withStoreDo: aBlock ]! !
-
-!(Modules>>#Workspaces>>#WorkspaceList) class methodsFor: 'instance creation' stamp: 'KLG 8/23/2023 13:13:23'!
-browserMorphClass
-	"Answer my browser morph."
-	
-	^ OfficeItemListMorph! !
-
-!(Modules>>#Workspaces>>#WorkspaceList) class methodsFor: 'instance creation' stamp: 'KLG 8/26/2023 22:36:50'!
-itemClass
-	"Answer my item class."
-	
-	^ Workspace! !
-
-!(Modules>>#Workspaces>>#WorkspaceList) class methodsFor: 'user interface' stamp: 'KLG 8/23/2023 21:36:07'!
-displayCode
-	"Answer my 4 character display code."
-
-	^ 'WspL'! !
-
-!(Modules>>#Workspaces>>#WorkspaceList) class methodsFor: 'user interface' stamp: 'KLG 8/23/2023 13:29:10'!
-printName
-	"Answer my print name."
-	
-	^ 'Workspaces'! !
-
-!(Modules>>#Workspaces>>#WorkspaceList) class methodsFor: 'persistence' stamp: 'KLG 8/23/2023 13:11:11'!
-recordDescriptionForPlanF: aStore
-	"Answer a record description for my instances."
-
-	^ aStore recordDescriptionClass
-		forClass: self
-		storeInstanceVariables: #(id)
-		gettersAndSetters: #(
-			(itemsForPlanF itemsFromPlanF:))! !
-
 !(Modules>>#Workspaces>>#ObjectExplorer) methodsFor: 'accessing' stamp: 'KLG 1/28/2024 14:08:09'!
 getList