add more functionality; canvas and help
authorca
Thu, 13 Apr 2000 14:32:20 +0200
changeset 1373 623e692f53fc
parent 1372 421b2a1f4b31
child 1374 635e878e5c09
add more functionality; canvas and help
TabListEditor.st
--- a/TabListEditor.st	Thu Apr 13 12:54:09 2000 +0200
+++ b/TabListEditor.st	Thu Apr 13 14:32:20 2000 +0200
@@ -12,8 +12,10 @@
 
 
 
+"{ Package: '.:stx/libtool2' }"
+
 ResourceSpecEditor subclass:#TabListEditor
-	instanceVariableNames:'rebuildMode testView listOfTabs selectedIndex'
+	instanceVariableNames:'listOfTabs'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Interface-UIPainter'
@@ -96,6 +98,16 @@
         editAgument
         accessCharacterPosition
         shortcutKey
+        activeHelpKey
+
+        majorKey
+        minorKey
+        createNewBuilder
+
+        hasHorizontalScrollBar
+        hasVerticalScrollBar
+        miniScrollerHorizontal
+        miniScrollerVertical
     )
 
 ! !
@@ -120,12 +132,15 @@
 #addTabItem
 'Adds a new tab item.'
 
-#argument
-'An optional argument stored with the tab item.'
+#autoHideScrollBars
+'ScrollBars should be made invisible dynamically, if there is nothing to scroll.'
 
 #canSelect
 'Turns on/off whether the tab item is selectable.'
 
+#createNewBuilder
+'Create a new builder for the application; the application use its own aspects.'
+
 #color
 'Defines the foreground color of the label. The default color derives from the style sheet.'
 
@@ -141,12 +156,48 @@
 #fileSave
 'Saves current tab list.'
 
+#horizontalScroller
+'Enable horizontal scrollability.'
+
+#horizontalMiniScroller
+'Use a mini-scroller as horizontal scrollbar.'
+
+#majorKey
+'Name of the class to be started; if empty, the application itself is used.'
+
+#minorKey
+'Message sent to the class which returns the window specification (default: #windowSpec).'
+
+#verticalScroller
+'Enable vertical scrollability.'
+
+#verticalMiniScroller
+'Use a mini-scroller as vertical scrollbar.'
+
+#canvasTab
+'Define an application, which is started if the tab is pressed the first time.'
+
+#basicTab
+'Define the basic attributes.'
+
+#detailTab
+'Define the optional/specific attributes.'
+
 #label
 'Label of the tab item.'
 
 #labelDerivesFromApplication
 'If turned on, the label''s string is a selector returning a string or bitmap image, which is used as logo in the tab item.'
 
+#detailsAccessCharaterPosition
+'Index of the access character position of the textual label (optional).'
+
+#detailsAccelerator
+'Key to be pressed to select the tab item from the keyboard (accelerator key).'
+
+#detailsArgument
+'An optional argument stored with the tab item.'
+
 #testPreview
 'Turns on/off preview of the tab list.'
 
@@ -174,7 +225,7 @@
 
 !TabListEditor class methodsFor:'interface specs'!
 
-tabSpec
+basicSpec
     "This resource specification was automatically generated
      by the UIPainter of ST/X."
 
@@ -182,22 +233,22 @@
      the UIPainter may not be able to read the specification."
 
     "
-     UIPainter new openOnClass:TabListEditor andSelector:#tabSpec
-     TabListEditor new openInterface:#tabSpec
+     UIPainter new openOnClass:TabListEditor andSelector:#basicSpec
+     TabListEditor new openInterface:#basicSpec
     "
 
     <resource: #canvas>
 
     ^ 
      #(#FullSpec
-        #name: #tabSpec
+        #name: #basicSpec
         #window: 
        #(#WindowSpec
-          #label: 'Tab Basic'
-          #name: 'Tab Basic'
+          #label: 'Basic'
+          #name: 'Basic'
           #min: #(#Point 10 10)
           #max: #(#Point 1280 1024)
-          #bounds: #(#Rectangle 12 22 440 249)
+          #bounds: #(#Rectangle 803 137 1232 347)
         )
         #component: 
        #(#SpecCollection
@@ -209,19 +260,16 @@
               #resizeForLabel: true
             )
            #(#InputFieldSpec
-              #attributes: 
-             #(#LabelField
-                nil #label
-                nil #tabable
-                true
-              )
               #name: 'label'
               #layout: #(#LayoutFrame 100 0 15 0 -5 1.0 37 0)
               #activeHelpKey: #label
               #tabable: true
               #model: #label
               #group: #inputGroup
-              #acceptOnLostFocus: true
+              #immediateAccept: true
+              #acceptOnReturn: false
+              #acceptOnTab: false
+              #acceptOnLostFocus: false
               #acceptChannel: #acceptChannel
               #modifiedChannel: #modifiedChannel
               #acceptOnPointerLeave: false
@@ -233,20 +281,17 @@
               #resizeForLabel: true
             )
            #(#InputFieldSpec
-              #attributes: 
-             #(#label
-                nil #shortcutKey
-                nil #tabable
-                true
-              )
               #name: 'shortcutKey'
               #layout: #(#LayoutFrame 100 0 44 0 -5 1.0 66 0)
-              #activeHelpKey: #label
+              #activeHelpKey: #detailsAccelerator
               #tabable: true
               #model: #shortcutKey
               #group: #inputGroup
               #type: #symbolOrNil
-              #acceptOnLostFocus: true
+              #immediateAccept: true
+              #acceptOnReturn: false
+              #acceptOnTab: false
+              #acceptOnLostFocus: false
               #acceptChannel: #acceptChannel
               #modifiedChannel: #modifiedChannel
               #acceptOnPointerLeave: false
@@ -258,21 +303,16 @@
               #resizeForLabel: true
             )
            #(#InputFieldSpec
-              #attributes: 
-             #(#tabable
-                true #ArgumentField
-                nil #editAgument
-                nil
-              )
               #name: 'editAgument'
               #layout: #(#LayoutFrame 100 0 73 0 -5 1.0 95 0)
-              #activeHelpKey: #argument
+              #activeHelpKey: #detailsArgument
               #tabable: true
               #model: #editAgument
               #group: #inputGroup
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptOnLostFocus: true
+              #immediateAccept: true
+              #acceptOnReturn: false
+              #acceptOnTab: false
+              #acceptOnLostFocus: false
               #acceptChannel: #acceptChannel
               #modifiedChannel: #modifiedChannel
               #acceptOnPointerLeave: false
@@ -284,30 +324,22 @@
               #resizeForLabel: true
             )
            #(#InputFieldSpec
-              #attributes: 
-             #(#label
-                nil #accessCharacterPos
-                nil #tabable
-                true #accessCharacterPosition
-                nil
-              )
               #name: 'accessCharacterPosition'
               #layout: #(#LayoutFrame 278 0 103 0 -5 1.0 125 0)
-              #activeHelpKey: #label
+              #activeHelpKey: #detailsAccessCharaterPosition
               #tabable: true
               #model: #accessCharacterPosition
               #group: #inputGroup
               #type: #number
-              #acceptOnLostFocus: true
+              #immediateAccept: true
+              #acceptOnReturn: false
+              #acceptOnTab: false
+              #acceptOnLostFocus: false
               #acceptChannel: #acceptChannel
               #modifiedChannel: #modifiedChannel
               #acceptOnPointerLeave: false
             )
            #(#CheckBoxSpec
-              #attributes: 
-             #(#tabable
-                true
-              )
               #label: 'Application provides translation '
               #name: 'translateLabel'
               #layout: #(#Point 96 135)
@@ -315,14 +347,259 @@
               #tabable: true
               #model: #translateLabel
             )
+           #(#LabelSpec
+              #label: 'Help Key:'
+              #name: 'activeHelp'
+              #layout: #(#AlignmentOrigin 98 0 190 0 1 0.5)
+              #resizeForLabel: true
+            )
+           #(#InputFieldSpec
+              #name: 'activeHelpKey'
+              #layout: #(#LayoutFrame 100 0 179 0 -5 1.0 201 0)
+              #activeHelpKey: #label
+              #tabable: true
+              #model: #activeHelpKey
+              #group: #inputGroup
+              #type: #symbolOrNil
+              #immediateAccept: true
+              #acceptOnReturn: false
+              #acceptOnTab: false
+              #acceptOnLostFocus: false
+              #acceptChannel: #acceptChannel
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           )
+         
+        )
+      )
+!
+
+canvasSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:TabListEditor andSelector:#canvasSpec
+     TabListEditor new openInterface:#canvasSpec
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #canvasSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Canvas'
+          #name: 'Canvas'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1280 1024)
+          #bounds: #(#Rectangle 803 137 1186 357)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#LabelSpec
+              #label: 'Class Name:'
+              #name: 'majorKeyLabel'
+              #layout: #(#AlignmentOrigin 98 0 26 0 1 0.5)
+              #resizeForLabel: true
+            )
+           #(#InputFieldSpec
+              #name: 'majorKeyField'
+              #layout: #(#LayoutFrame 100 0 15 0 -5 1.0 37 0)
+              #activeHelpKey: #majorKey
+              #tabable: true
+              #model: #majorKey
+              #group: #inputGroup
+              #type: #symbolOrNil
+              #immediateAccept: true
+              #acceptOnReturn: false
+              #acceptOnTab: false
+              #acceptOnLostFocus: false
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: 'Spec. Selector:'
+              #name: 'minorKeyLabel'
+              #layout: #(#AlignmentOrigin 98 0 55 0 1 0.5)
+              #resizeForLabel: true
+            )
+           #(#InputFieldSpec
+              #name: 'minorKeyField'
+              #layout: #(#LayoutFrame 100 0 44 0 -5 1.0 66 0)
+              #activeHelpKey: #minorKey
+              #tabable: true
+              #model: #minorKey
+              #group: #inputGroup
+              #type: #symbolOrNil
+              #immediateAccept: true
+              #acceptOnReturn: false
+              #acceptOnTab: false
+              #acceptOnLostFocus: false
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#FramedBoxSpec
+              #label: 'Scroll Bars'
+              #name: 'FramedBox'
+              #layout: #(#LayoutFrame 0 0.0 119 0.0 0 1.0 214 0)
+              #labelPosition: #topLeft
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#HorizontalPanelViewSpec
+                    #name: 'HorizontalPanel1'
+                    #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+                    #horizontalLayout: #fitSpace
+                    #verticalLayout: #fitSpace
+                    #horizontalSpace: 3
+                    #verticalSpace: 3
+                    #component: 
+                   #(#SpecCollection
+                      #collection: #(
+                       #(#ViewSpec
+                          #name: 'Box1'
+                          #component: 
+                         #(#SpecCollection
+                            #collection: #(
+                             #(#CheckBoxSpec
+                                #label: 'Vertical'
+                                #name: 'verticalScrollBarCheckBox'
+                                #layout: #(#LayoutFrame 0 0.0 3 0 0 1.0 27 0)
+                                #activeHelpKey: #verticalScroller
+                                #tabable: true
+                                #model: #hasVerticalScrollBar
+                              )
+                             #(#CheckBoxSpec
+                                #label: 'Mini'
+                                #name: 'miniScrollerVerticalCheckBox'
+                                #layout: #(#LayoutFrame 0 0.0 32 0 0 1.0 56 0)
+                                #activeHelpKey: #verticalMiniScroller
+                                #tabable: true
+                                #model: #miniScrollerVertical
+                              )
+                             )
+                           
+                          )
+                          #useDefaultExtent: true
+                        )
+                       #(#ViewSpec
+                          #name: 'Box2'
+                          #component: 
+                         #(#SpecCollection
+                            #collection: #(
+                             #(#CheckBoxSpec
+                                #label: 'Horizontal'
+                                #name: 'horizontalScrollBarCheckBox'
+                                #layout: #(#LayoutFrame 0 0.0 3 0 0 1.0 27 0)
+                                #activeHelpKey: #horizontalScroller
+                                #tabable: true
+                                #model: #hasHorizontalScrollBar
+                              )
+                             #(#CheckBoxSpec
+                                #label: 'Mini'
+                                #name: 'miniScrollerHorizontalCheckBox'
+                                #layout: #(#LayoutFrame 0 0.0 32 0 0 1.0 56 0)
+                                #activeHelpKey: #horizontalMiniScroller
+                                #tabable: true
+                                #model: #miniScrollerHorizontal
+                              )
+                             )
+                           
+                          )
+                          #extent: #(#Point 114 59)
+                        )
+                       #(#ViewSpec
+                          #name: 'Box3'
+                          #component: 
+                         #(#SpecCollection
+                            #collection: #(
+                             #(#LabelSpec
+                                #label: 'Auto Hide:'
+                                #name: 'Label1'
+                                #layout: #(#LayoutFrame 0 0.0 6 0 0 1.0 23 0)
+                                #translateLabel: true
+                                #resizeForLabel: true
+                                #adjust: #left
+                              )
+                             #(#PopUpListSpec
+                                #label: 'Default'
+                                #name: 'PopUpList1'
+                                #layout: #(#LayoutFrame 0 0.0 32 0 0 1.0 54 0)
+                                #tabable: true
+                                #activeHelpKey: #autoHideScrollBars
+                                #model: #autoHideScrollBars
+                                #menu: 
+                               #(#Default
+                                  #On #Off
+                                )
+                                #useIndex: true
+                                #showHandle: true
+                              )
+                             )
+                           
+                          )
+                          #extent: #(#Point 114 59)
+                        )
+                       )
+                     
+                    )
+                  )
+                 )
+               
+              )
+            )
            #(#CheckBoxSpec
-              #attributes: 
-             #(#tabable
-                true
-              )
+              #label: 'Create New Builder'
+              #name: 'createNewBuilder'
+              #layout: #(#Point 97 75)
+              #model: #createNewBuilder
+              #activeHelpKey: #createNewBuilder
+            )
+           )
+         
+        )
+      )
+!
+
+detailSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:TabListEditor andSelector:#detailSpec
+     TabListEditor new openInterface:#detailSpec
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #detailSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Details'
+          #name: 'Details'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1280 1024)
+          #bounds: #(#Rectangle 12 22 370 129)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#CheckBoxSpec
               #label: 'Can Select'
               #name: 'enabled'
-              #layout: #(#Point 96 161)
+              #layout: #(#Point 46 14)
               #activeHelpKey: #canSelect
               #tabable: true
               #model: #enabled
@@ -330,7 +607,7 @@
            #(#LabelSpec
               #label: 'Color:'
               #name: 'ForegroundLabel'
-              #layout: #(#AlignmentOrigin 98 0 209 0 1 0.5)
+              #layout: #(#AlignmentOrigin 46 0 62 0 1 0.5)
               #resizeForLabel: true
               #adjust: #right
             )
@@ -340,7 +617,7 @@
                 true
               )
               #name: 'ForegroundColorMenu'
-              #layout: #(#LayoutFrame 100 0 197 0 -5 1.0 219 0)
+              #layout: #(#LayoutFrame 48 0 50 0 -10 1.0 72 0)
               #activeHelpKey: #color
               #model: #labelForegroundColor
               #labelsAreColored: false
@@ -373,10 +650,9 @@
        #(#WindowSpec
           #label: 'Tab List Editor'
           #name: 'Tab List Editor'
-          #layout: #(#LayoutFrame 58 0 290 0 659 0 707 0)
           #min: #(#Point 440 280)
           #max: #(#Point 1152 900)
-          #bounds: #(#Rectangle 58 290 660 708)
+          #bounds: #(#Rectangle 17 449 488 816)
           #menu: #menu
         )
         #component: 
@@ -391,19 +667,28 @@
            #(#VariableHorizontalPanelSpec
               #name: 'VariablePanel'
               #layout: #(#LayoutFrame 0 0.0 36 0.0 0 1.0 -26 1.0)
-              #handles: #(#Any 0.259875 1.0)
               #component: 
              #(#SpecCollection
                 #collection: #(
-                 #(#SequenceViewSpec
-                    #name: 'ColumnView'
+                 #(#SelectionInListModelViewSpec
+                    #attributes: 
+                   #(#vpext
+                      
+                     #(#Array
+                        #Point 0.264414
+                        1.0
+                      )
+                    )
+                    #name: 'ListOfLabels'
+                    #tabable: true
                     #model: #selectionHolder
                     #menu: #menuEdit
                     #hasHorizontalScrollBar: true
                     #hasVerticalScrollBar: true
                     #miniScrollerHorizontal: true
-                    #useIndex: true
-                    #sequenceList: #listOfLabels
+                    #listModel: #listOfTabs
+                    #highlightMode: #line
+                    #selectConditionSelector: #askForItemModification
                   )
                  #(#ViewSpec
                     #name: 'SpecView'
@@ -411,24 +696,13 @@
                     #component: 
                    #(#SpecCollection
                       #collection: #(
-                       #(#ViewSpec
-                          #name: 'TestView'
-                          #layout: #(#LayoutFrame 1 0.0 0 0.0 0 1.0 0 1.0)
-                          #component: 
-                         #(#SpecCollection
-                            #collection: #(
-                             #(#TabViewSpec
-                                #name: 'TestTabsView'
-                                #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 0.5)
-                              )
-                             )
-                           
-                          )
-                        )
-                       #(#SubCanvasSpec
-                          #name: 'specCanvas'
+                       #(#NoteBookViewSpec
+                          #name: 'NoteBook'
                           #layout: #(#LayoutFrame 1 0.0 0 0.0 0 1.0 -30 1.0)
-                          #specHolder: #specChannel
+                          #model: #noteBookModel
+                          #menu: #noteBookTabList
+                          #useIndex: true
+                          #keepCanvasAlive: true
                         )
                        #(#UISubSpecification
                           #name: 'subSpec'
@@ -436,6 +710,13 @@
                           #majorKey: #ToolApplicationModel
                           #minorKey: #windowSpecForCommit
                         )
+                       #(#NoteBookViewSpec
+                          #name: 'TestNoteBook'
+                          #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+                          #visibilityChannel: #testMode
+                          #menu: #testItemList
+                          #useIndex: true
+                        )
                        )
                      
                     )
@@ -443,6 +724,7 @@
                  )
                
               )
+              #handles: #(#Any 0.24053 1.0)
             )
            #(#UISubSpecification
               #name: 'infoBarSubSpec'
@@ -456,6 +738,42 @@
       )
 ! !
 
+!TabListEditor class methodsFor:'list specs'!
+
+noteBookTabList
+    "This resource specification was automatically generated
+     by the TabListEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the TabListEditor may not be able to read the specification."
+
+    "
+     TabListEditor new openOnClass:TabListEditor andSelector:#noteBookTabList
+    "
+
+    <resource: #tabList>
+
+    ^     #(
+       #(#TabItem
+          #label: 'Basic'
+          #activeHelpKey: #basicTab
+          #minorKey: #basicSpec
+        )
+       #(#TabItem
+          #label: 'Details'
+          #activeHelpKey: #detailTab
+          #minorKey: #detailSpec
+        )
+       #(#TabItem
+          #label: 'Canvas'
+          #activeHelpKey: #canvasTab
+          #minorKey: #canvasSpec
+        )
+       )
+     
+      collect:[:aTab| TabItem new fromLiteralArrayEncoding:aTab ]
+! !
+
 !TabListEditor class methodsFor:'menu specs'!
 
 menu
@@ -551,7 +869,7 @@
                      #(
                        #(#MenuItem
                           #label: 'Tab Item'
-                          #value: #doCreateTabItem
+                          #value: #doCreate
                           #activeHelpKey: #addTabItem
                           #labelImage: #(#ResourceRetriever nil #newTabItemIcon 'Tab Item')
                       )
@@ -586,7 +904,7 @@
                        #(#MenuItem
                           #label: 'Preview'
                           #activeHelpKey: #testPreview
-                          #enabled: #canShowTestMode
+                          #enabled: #canToggleTestMode
                           #indication: #testMode
                       )
                     ) nil
@@ -690,134 +1008,150 @@
 
     <resource: #menu>
 
-    ^
-     
-       #(#Menu
-          
-           #(
-             #(#MenuItem
-                #label: 'New'
-                #isButton: true
-                #value: #doNew
-                #activeHelpKey: #fileNew
-                #labelImage: #(#ResourceRetriever #Icon #newIcon)
-            )
-             #(#MenuItem
-                #label: 'Load'
-                #isButton: true
-                #value: #doLoad
-                #activeHelpKey: #fileLoad
-                #labelImage: #(#ResourceRetriever #Icon #loadIcon)
-            )
-             #(#MenuItem
-                #label: 'Save'
-                #isButton: true
-                #value: #doSave
-                #activeHelpKey: #fileSave
-                #labelImage: #(#ResourceRetriever #Icon #saveIcon)
-            )
-             #(#MenuItem
-                #label: ''
-            )
-             #(#MenuItem
-                #label: 'Cut'
-                #isButton: true
-                #value: #doCut
-                #activeHelpKey: #editCut
-                #enabled: #valueOfCanCut
-                #labelImage: #(#ResourceRetriever #Icon #cutIcon)
-            )
-             #(#MenuItem
-                #label: 'Copy'
-                #isButton: true
-                #value: #doCopy
-                #activeHelpKey: #editCopy
-                #enabled: #valueOfCanCopy
-                #labelImage: #(#ResourceRetriever #Icon #copyIcon)
-            )
-             #(#MenuItem
-                #label: 'Paste'
-                #isButton: true
-                #value: #doPaste
-                #activeHelpKey: #editPaste
-                #enabled: #valueOfCanPaste
-                #labelImage: #(#ResourceRetriever #Icon #pasteIcon)
-            )
-             #(#MenuItem
-                #label: 'Delete'
-                #isButton: true
-                #value: #doDelete
-                #activeHelpKey: #editDelete
-                #enabled: #valueOfCanCut
-                #labelImage: #(#ResourceRetriever #Icon #deleteIcon)
-            )
-             #(#MenuItem
-                #label: ''
-            )
-             #(#MenuItem
-                #label: 'Add Tab Item'
-                #isButton: true
-                #value: #doCreateTabItem
-                #activeHelpKey: #addTabItem
-                #labelImage: #(#ResourceRetriever nil #newTabItemIcon)
-            )
-             #(#MenuItem
-                #label: ''
-            )
-             #(#MenuItem
-                #label: 'Move Tab Up'
-                #isButton: true
-                #value: #doMoveTabUpOrDown:
-                #activeHelpKey: #editMoveUp
-                #enabled: #canMoveTabItemUpOrDown
-                #argument: #up
-                #labelImage: #(#ResourceRetriever #Icon #upIcon)
-            )
-             #(#MenuItem
-                #label: 'Move Tab Down'
-                #isButton: true
-                #value: #doMoveTabUpOrDown:
-                #activeHelpKey: #editMoveDown
-                #enabled: #canMoveTabItemUpOrDown
-                #argument: #down
-                #labelImage: #(#ResourceRetriever #Icon #downIcon)
-            )
-             #(#MenuItem
-                #label: ''
-            )
-             #(#MenuItem
-                #label: 'Preview'
-                #activeHelpKey: #testPreview
-                #enabled: #canShowTestMode
-                #indication: #testMode
-            )
-          ) nil
-          nil
+    ^ 
+     #(#Menu
+        #(
+         #(#MenuItem
+            #label: 'New'
+            #isButton: true
+            #value: #doNew
+            #activeHelpKey: #fileNew
+            #labelImage: #(#ResourceRetriever #Icon #newIcon)
+          )
+         #(#MenuItem
+            #label: 'Load'
+            #isButton: true
+            #value: #doLoad
+            #activeHelpKey: #fileLoad
+            #labelImage: #(#ResourceRetriever #Icon #loadIcon)
+          )
+         #(#MenuItem
+            #label: 'Save'
+            #isButton: true
+            #value: #doSave
+            #activeHelpKey: #fileSave
+            #labelImage: #(#ResourceRetriever #Icon #saveIcon)
+          )
+         #(#MenuItem
+            #label: ''
+          )
+         #(#MenuItem
+            #label: 'Cut'
+            #isButton: true
+            #value: #doCut
+            #activeHelpKey: #editCut
+            #enabled: #valueOfCanCut
+            #labelImage: #(#ResourceRetriever #Icon #cutIcon)
+          )
+         #(#MenuItem
+            #label: 'Copy'
+            #isButton: true
+            #value: #doCopy
+            #activeHelpKey: #editCopy
+            #enabled: #valueOfCanCopy
+            #labelImage: #(#ResourceRetriever #Icon #copyIcon)
+          )
+         #(#MenuItem
+            #label: 'Paste'
+            #isButton: true
+            #value: #doPaste
+            #activeHelpKey: #editPaste
+            #enabled: #valueOfCanPaste
+            #labelImage: #(#ResourceRetriever #Icon #pasteIcon)
+          )
+         #(#MenuItem
+            #label: 'Delete'
+            #isButton: true
+            #value: #doDelete
+            #activeHelpKey: #editDelete
+            #enabled: #valueOfCanCut
+            #labelImage: #(#ResourceRetriever #Icon #deleteIcon)
+          )
+         #(#MenuItem
+            #label: ''
+          )
+         #(#MenuItem
+            #label: 'Add Tab Item'
+            #isButton: true
+            #value: #doCreate
+            #activeHelpKey: #addTabItem
+            #labelImage: #(#ResourceRetriever nil #newTabItemIcon)
+          )
+         #(#MenuItem
+            #label: ''
+          )
+         #(#MenuItem
+            #label: 'Move Tab Up'
+            #isButton: true
+            #value: #doMoveTabUpOrDown:
+            #activeHelpKey: #editMoveUp
+            #enabled: #canMoveTabItemUpOrDown
+            #argument: #up
+            #labelImage: #(#ResourceRetriever #Icon #upIcon)
+          )
+         #(#MenuItem
+            #label: 'Move Tab Down'
+            #isButton: true
+            #value: #doMoveTabUpOrDown:
+            #activeHelpKey: #editMoveDown
+            #enabled: #canMoveTabItemUpOrDown
+            #argument: #down
+            #labelImage: #(#ResourceRetriever #Icon #downIcon)
+          )
+         )
+        nil
+        nil
       )
 ! !
 
 !TabListEditor methodsFor:'aspects'!
 
+autoHideScrollBars
+    |holder|
+
+    (holder := builder bindingAt:#autoHideScrollBars) isNil ifTrue:[
+        builder aspectAt:#autoHideScrollBars put:(holder := 1 asValue).
+        holder addDependent: self
+    ].
+    ^ holder.
+!
+
 canMoveTabItemUpOrDown
+    ^ builder booleanValueAspectFor:#canMoveTabItemUpOrDown
+!
+
+hasHorizontalScrollBar
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
 
     |holder|
 
-    (holder := builder bindingAt:#canMoveTabItemUpOrDown) isNil ifTrue:[
-        builder aspectAt:#canMoveTabItemUpOrDown put:(holder := false asValue).
+    (holder := builder bindingAt:#hasHorizontalScrollBar) isNil ifTrue:[
+        holder := true asValue.
+        builder aspectAt:#hasHorizontalScrollBar put:holder.
+"/        holder addDependent:self.
     ].
-    ^ holder
-
+    ^ holder.
 !
 
-canShowTestMode
+hasVerticalScrollBar
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
 
     |holder|
 
-    (holder := builder bindingAt:#canShowTestMode) isNil ifTrue:[
-        builder aspectAt:#canShowTestMode put:(holder := false asValue).
+    (holder := builder bindingAt:#hasVerticalScrollBar) isNil ifTrue:[
+        holder := true asValue.
+        builder aspectAt:#hasVerticalScrollBar put:holder.
+"/        holder addDependent:self.
     ].
-    ^ holder
-
+    ^ holder.
 !
 
 inputGroup
@@ -832,11 +1166,97 @@
 
 !
 
-listOfLabels
-    "returns a holder which keeps the list of tab labels
-    "
+listOfTabs
+    ^ listOfTabs
+!
+
+majorKey
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+
+    |holder|
+
+    (holder := builder bindingAt:#majorKey) isNil ifTrue:[
+        holder := ValueHolder new.
+        builder aspectAt:#majorKey put:holder.
+"/        holder addDependent:self.
+    ].
+    ^ holder.
+!
+
+miniScrollerHorizontal
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+
+    |holder|
+
+    (holder := builder bindingAt:#miniScrollerHorizontal) isNil ifTrue:[
+        holder := true asValue.
+        builder aspectAt:#miniScrollerHorizontal put:holder.
+"/        holder addDependent:self.
+    ].
+    ^ holder.
+!
+
+miniScrollerVertical
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
 
-    ^ builder listAspectFor:#listOfLabels
+    |holder|
+
+    (holder := builder bindingAt:#miniScrollerVertical) isNil ifTrue:[
+        holder := true asValue.
+        builder aspectAt:#miniScrollerVertical put:holder.
+"/        holder addDependent:self.
+    ].
+    ^ holder.
+!
+
+minorKey
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+
+    |holder|
+
+    (holder := builder bindingAt:#minorKey) isNil ifTrue:[
+        holder := ValueHolder new.
+        builder aspectAt:#minorKey put:holder.
+"/        holder addDependent:self.
+    ].
+    ^ holder.
+!
+
+noteBookModel
+    |holder|
+
+    (holder := builder bindingAt:#noteBookModel) isNil ifTrue:[
+        holder := 0 asValue.
+        builder aspectAt:#noteBookModel put:holder.
+    ].
+    ^ holder.
+!
+
+noteBookTabList
+    "Generated by the TabListEditor"
+
+    |list|
+
+    (list := builder bindingAt:#noteBookTabList) isNil ifTrue:[
+        builder aspectAt:#noteBookTabList put:(list := self class noteBookTabList).
+    ].
+    ^ list
 !
 
 selectionHolder
@@ -845,21 +1265,21 @@
     |holder|
 
     (holder := builder bindingAt:#selectionHolder) isNil ifTrue:[
-        holder := AspectAdaptor new subject:self; forAspect:#selectedIndex.
+        holder := 0 asValue.
         builder aspectAt:#selectionHolder put:holder.
+        holder addDependent:self.
     ].
     ^ holder
 !
 
-specChannel
-    "holder which keeps the current tab specification
-    "
+testItemList
     |holder|
 
-    (holder := builder bindingAt:#specChannel) isNil ifTrue:[
-        builder aspectAt:#specChannel put:(holder :=  ValueHolder new).
+    (holder := builder bindingAt:#testItemList) isNil ifTrue:[
+        holder := ValueHolder new.
+        builder aspectAt:#testItemList put:holder.
     ].
-    ^ holder
+    ^ holder.
 !
 
 testMode
@@ -879,31 +1299,18 @@
 buildFromClass:aClass andSelector:aSelector
     "build from class and selector
     "
-    |cls spec list selectionHolder|
+    |cls spec|
 
     self testMode value: false.
-    (selectionHolder := self selectionHolder) value:0.
+    self selection:0.
 
     "if opened on a tab list"
-    (aClass isNil and: [aSelector isNil and: [listOfTabs size > 0]]) 
-    ifTrue:[
-        listOfTabs notEmpty ifTrue:[
-            selectionHolder value:1
-        ].
-        ^ nil
+    (aClass isNil and: [aSelector isNil and: [listOfTabs size > 0]]) ifTrue:[
+        listOfTabs notEmpty ifTrue:[self selection:1].
+      ^ nil
     ].
-
-    self listOfLabels removeAll.
     listOfTabs removeAll.
 
-    testView notNil ifTrue:[
-        testView lower
-    ].
-
-    rebuildMode := false.
-
-    self canShowTestMode value: false.
-
     cls := self resolveName:aClass.
     specSelector := aSelector.
 
@@ -912,17 +1319,11 @@
 
             (cls respondsTo:specSelector) ifTrue:[
                 spec := cls perform:specSelector.
-                list := self listOfLabels.
 
                 spec size ~~ 0 ifTrue:[
-
-                    rebuildMode := true.
-
                     spec do:[:aTab|
-                        list add:aTab label.
                         listOfTabs add:aTab.
                     ].
-                    rebuildMode := false.          
                     self addToHistory:(cls name, ' ', specSelector) -> #loadFromMessage:                        
                 ]
             ]
@@ -932,38 +1333,29 @@
     modified := false.
 
     listOfTabs notEmpty ifTrue:[
-        self selectionHolder value:1
+        self selection:1
     ].
 
     self updateInfoLabel
 !
 
-buildFromResourceSpec: aListSpec
-
-    self buildFromTabList: aListSpec
+buildFromResourceSpec:aListSpec
+    self buildFromTabList:aListSpec
 !
 
 buildFromTabList: aTabList
     "build from a aTabList"
 
-    |selectionHolder listOfLabels|
-
-    rebuildMode := true.
-
-    (selectionHolder := self selectionHolder) value: nil.
-    (listOfLabels := self listOfLabels) removeAll.
+    self selection:0.
     listOfTabs removeAll.
 
     aTabList do:[:aTabItem|
         listOfTabs add: aTabItem.
-        listOfLabels add: aTabItem label
     ].
-    rebuildMode := false.          
-
     modified := false.
 
     listOfTabs notEmpty ifTrue:[
-        selectionHolder value:1
+        self selection:1
     ].
 
     self updateInfoLabel
@@ -974,63 +1366,96 @@
 update:something with:aParameter from:someObject
     "one of my aspects has changed; update modified channel
     "
-    super update:something with:aParameter from:someObject.
+    |list size index|
+
+    someObject = self selectionHolder ifTrue:[
+        ^ self selectionChanged
+    ].
+
+    someObject = self testMode ifFalse:[              
+        ^ super update:something with:aParameter from:someObject.
+    ].
+
+    size := listOfTabs size.
+
+    someObject value ifTrue:[
+        index := 0.
 
-    someObject = self testMode
-    ifTrue:[              
-        someObject value
-            ifTrue: [self doTest]
-            ifFalse:[testView lower. self selectionHolder value:1].
+        size ~~ 0 ifTrue:[
+            list := listOfTabs collect:[:aTab| |tab|
+                tab := aTab copy.
+                tab setAttributesFromClass:specClass.
+                tab
+            ].
+        ]
+    ] ifFalse:[
+        index := 1 min:size
+    ].
+    self selectionHolder value:index.
+    self testItemList value:list.
+    self updateInfoLabel.
 
-        self updateInfoLabel
-    ]
 ! !
 
-!TabListEditor methodsFor:'help'!
-
-defaultInfoLabel
+!TabListEditor methodsFor:'queries'!
 
-    ^self testMode value
-        ifTrue:  ['Test mode']
-        ifFalse: [super defaultInfoLabel]
+canToggleTestMode
+    "checks whether testMode button is enabled
+    "
+    self testMode value ifTrue:[
+        ^ true
+    ].
+
+    self valueOfEnablingCommitButtons value ifFalse:[
+        ^ listOfTabs notEmpty
+    ].
+    ^ false
 ! !
 
 !TabListEditor methodsFor:'selection'!
 
-selectedIndex
-    ^ selectedIndex
+selectedElement
+    |idx tab|
+
+    idx := self selection.
+
+    idx ~~ 0 ifTrue:[
+        (tab := listOfTabs at:idx ifAbsent:nil) notNil ifTrue:[
+            ^ tab
+        ].
+        self selection:0
+    ].
+    ^ nil
+!
+
+selection
+    ^ self selectionHolder value ? 0
 !
 
-selectedIndex:anIndex
-    |oldSel specChannel|
+selection:anIndex
+    self selectionHolder value:(anIndex ? 0).
+!
 
-    self listOfLabels notEmpty ifTrue: [self canShowTestMode value: true].
-    anIndex notNil ifTrue: [self testMode value: false].
-
-    oldSel := selectedIndex.
-    selectedIndex := anIndex ? 0.
+selectionChanged
+    |noteBookModel hasSelection|
 
-    selectedIndex == oldSel ifTrue:[^ self].
-
-    specChannel := self specChannel.
+    hasSelection  := self selection ~~ 0.
+    noteBookModel := self noteBookModel.
 
-    oldSel == 0 ifTrue:[
-        specChannel value:(self class tabSpec)
+    hasSelection ifTrue:[
+        self testMode value:false.
+        noteBookModel value == 0 ifTrue:[noteBookModel value:1]
     ] ifFalse:[
-        selectedIndex == 0 ifTrue:[
-            specChannel value:nil
-        ]
+        noteBookModel value:0
     ].
     self cancel.
-
-    testView notNil ifTrue:[
-        testView lower.
-    ].
+    self valueOfCanCut  value:hasSelection.
+    self valueOfCanCopy value:hasSelection.
+    self valueOfCanPaste.
+!
 
-    self valueOfCanCut value: (anIndex ~~ 0).
-    self valueOfCanCopy value: (anIndex ~~ 0).
-    self valueOfCanPaste.
-
+setSelection:anIndex
+    self selectionHolder value:(anIndex ? 0) withoutNotifying:self
 ! !
 
 !TabListEditor methodsFor:'startup / release'!
@@ -1038,12 +1463,8 @@
 initialize
     "setup aspects used by column description specifications
     "
-
     super initialize.
-
-    listOfTabs    := OrderedCollection new.
-    selectedIndex := 0.
-    rebuildMode   := false.
+    listOfTabs := List new.
 !
 
 openModalOnTabList: aTabList
@@ -1051,14 +1472,6 @@
 
     super openModalOnResourceSpec: aTabList
 
-!
-
-postBuildWith:builder
-
-    super postBuildWith:builder.
-
-    testView := builder componentAt:#TestView.
-    (builder componentAt:#ColumnView) selectConditionBlock: [:i|self askForItemModification].
 ! !
 
 !TabListEditor methodsFor:'user actions'!
@@ -1066,48 +1479,53 @@
 accept
     "accept changes
     "
-    |label|
-
-    self acceptChannel 
-	value:true; value:false.      "/ toggle to force inputFields to accept
+    |tab idx asb|
 
-    selectedIndex ~~ 0 ifTrue:[
-        rebuildMode := true.
-        label := listOfTabs at:selectedIndex.
+    (tab := self selectedElement) notNil ifTrue:[
+        super accept.
+        aspects keysAndValuesDo:[:k :m| tab perform:(k , ':') asSymbol with:(m value) ].
 
-        aspects keysAndValuesDo:[:aKey :aModel|
-            label perform:(aKey , ':') asSymbol with:(aModel value).
-        ].
-        self listOfLabels at:selectedIndex put:(label label).
-
-        rebuildMode := false.
+        asb := self autoHideScrollBars value.
+        asb := asb ~~ 1 ifTrue:[asb == 2] ifFalse:[nil].
+        tab autoHideScrollBars:asb.
     ].
     self cancel.
-    modified := true.
-    self valueOfEnablingCommitButtons value: false
+!
+
+addTab:aTab
+    |idx|
+
+    aTab notNil ifTrue:[
+        self testMode value: false.
+
+        (idx := self selection) == 0 ifTrue:[
+            listOfTabs add:aTab.
+            self selection:(listOfTabs size).
+        ] ifFalse:[
+            listOfTabs add:aTab afterIndex:idx
+        ].
+        modified := true.
+    ].
 !
 
 cancel
     "cancel all changes
     "
-    |tab|
+    |tab idx asb|
 
-    selectedIndex ~~ 0 ifTrue:[
-        tab := listOfTabs at:selectedIndex.
-
-        rebuildMode := true.
+    (     (idx := self selection) ~~ 0
+     and:[(tab := self selectedElement) notNil]
+    ) ifTrue:[
+        aspects keysAndValuesDo:[:k :m| m value:(tab perform:k) ].
+        listOfTabs at:idx put:tab.
 
-        aspects keysAndValuesDo:[:aKey :aModel|
-            aModel value:(tab perform:aKey)    
-        ].
-        #( label editAgument ) do:[:aKey| |v|
-                v := aspects at:aKey.
-                v value isNil ifTrue:[v value:'']
-        ].
+        asb := tab autoHideScrollBars.
+        asb notNil ifTrue:[asb := asb == true ifTrue:[2] ifFalse:[3]]
+                  ifFalse:[asb := 1].
 
-        rebuildMode := false.
+        self autoHideScrollBars value:asb.
     ].
-    self canMoveTabItemUpOrDown value:(selectedIndex ~~ 0 and:[listOfTabs size > 1]).
+    self canMoveTabItemUpOrDown value:(listOfTabs size > 1 and:[idx ~~ 0]).
     self valueOfEnablingCommitButtons value: false
 
 
@@ -1117,53 +1535,26 @@
 doCopy
     "copy selected tab
     "
-    selectedIndex ~~ 0 ifTrue:[
-        self clipboard:(listOfTabs at:selectedIndex) deepCopy.
+    |tab|
+
+    (tab := self selectedElement) notNil ifTrue:[
+        self clipboard:tab.
         self updateAllToolInstances.
     ]
 !
 
-doCreateTabItem
-
-    |tab selectionHolder|
-
-    self testMode value: false.
-    tab := TabItem label:'Tab Item ', (listOfTabs size + 1) printString.
-
-    listOfTabs add:tab afterIndex:selectedIndex.
-    self listOfLabels add:(tab label) afterIndex:selectedIndex.
-
-    selectionHolder := self selectionHolder.
-
-    selectedIndex == 0 ifTrue:[
-        selectionHolder value:1
-    ] ifFalse:[    
-        selectionHolder value:selectedIndex + 1.
-        self cancel.
-    ].
-
-    modified := true.
+doCreate
+    self addTab:(TabItem label:'TAB').
 !
 
 doCut
-    "cut selected tab
+    "cut the selected tab; put to pasteBuffer
     "
-    |listOfLabels index selectionHolder|
+    |tab|
 
-    (index := selectedIndex) ~~ 0 ifTrue:[
-        self testMode value: false.
-        listOfLabels := self listOfLabels.
-        self clipboard:(listOfTabs at:index) deepCopy.
-        (selectionHolder := self selectionHolder) value:0.
-        listOfTabs removeIndex:index.
-        listOfLabels removeIndex:index.
-        index > listOfLabels size ifTrue:[
-            index := index - 1
-        ].
-        selectionHolder value:index.
-        listOfLabels isEmpty ifTrue: [self canShowTestMode value: false].
-        self updateAllToolInstances.
-        modified := true.
+    (tab := self selectedElement) notNil ifTrue:[
+        self clipboard:tab.
+        self doDelete.
     ].
 
 !
@@ -1171,19 +1562,18 @@
 doDelete
     "delete selected tab
     "
-    |listOfLabels index selectionHolder|
+    |index|
 
-    (index := selectedIndex) ~~ 0 ifTrue:[
+    (index := self selection) ~~ 0 ifTrue:[
         self testMode value: false.
-        listOfLabels := self listOfLabels.
-        (selectionHolder := self selectionHolder) value:0.
+        self setSelection:0.
         listOfTabs removeIndex:index.
-        listOfLabels removeIndex:index.
-        index > listOfLabels size ifTrue:[index := index - 1].
-        selectionHolder value:index.
-        listOfLabels isEmpty ifTrue: [self canShowTestMode value: false].
+        index > listOfTabs size ifTrue:[index := index - 1].
+        self selection:index.
+        self updateAllToolInstances.
         modified := true.
     ].       
+
 !
 
 doGenerateAspectMethod
@@ -1232,35 +1622,29 @@
 doMoveTabUpOrDown:what
     "step up or down
     "
-    |tab listOfLabels index nLabels|
+    |tab idx sz|
 
-    (selectedIndex ~~ 0 and:[listOfTabs size > 1]) ifFalse:[
+    (listOfTabs size > 1 and:[(idx := self selection) ~~ 0]) ifFalse:[
         ^ self
     ].
 
-    listOfLabels := self listOfLabels.
-    tab  := listOfTabs at:selectedIndex.
+    (tab := listOfTabs at:idx ifAbsent:nil) isNil ifTrue:[
+        ^ self selection:0
+    ].
 
-    listOfLabels removeIndex:selectedIndex.
-    listOfTabs removeIndex:selectedIndex.
+    self setSelection:0.
+    listOfTabs removeIndex:idx.
 
-    nLabels := listOfLabels size.
+    sz := listOfTabs size.
 
     what == #down ifTrue:[
-        index := selectedIndex > nLabels ifTrue:[1]
-                                         ifFalse:[selectedIndex + 1]
+        idx := idx > sz ifTrue:[1] ifFalse:[idx + 1]
     ] ifFalse:[
-        index := selectedIndex == 1 ifTrue:[nLabels + 1]
-                                   ifFalse:[selectedIndex - 1]
+        idx := idx == 1 ifTrue:[sz + 1] ifFalse:[idx - 1]
     ].
 
-    listOfLabels add:(tab label) beforeIndex:index.
-    listOfTabs add:tab beforeIndex:index.
-
-    rebuildMode := true.
-    self selectionHolder value:index.
-    rebuildMode := false.
-
+    listOfTabs add:tab beforeIndex:idx.
+    self setSelection:idx.
     modified := true.
 
 !
@@ -1268,24 +1652,11 @@
 doPaste
     "paste a tab
     "
-    |tab selectionHolder|
-
-    self testMode value: false.
-    (tab := self class clipboard deepCopy) isNil ifTrue: [^nil].
-    listOfTabs add:tab afterIndex:selectedIndex.
-    self listOfLabels add:(tab label) afterIndex:selectedIndex.
-
-    selectionHolder := self selectionHolder.
+    |tab|
 
-    selectedIndex == 0 ifTrue:[
-        selectionHolder value:1
-    ] ifFalse:[    
-        selectionHolder value:selectedIndex + 1.
-        self cancel.
-    ].
-      
-    modified  := true.
-
+    ((tab := self class clipboard) notNil and:[tab isKindOf:TabItem]) ifTrue:[
+        self addTab:(tab deepCopy).
+    ]
 !
 
 doSave
@@ -1352,32 +1723,6 @@
     self addToHistory:(cls name, ' ', specSelector) -> #loadFromMessage:.
     modified  := false.
     hasSaved  := true.
-!
-
-doTest
-    "run a test
-    "
-    |tabView list|
-
-    self selectionHolder value:nil.
-
-    listOfTabs size ~~ 0 ifTrue:[
-        list := listOfTabs collect:[:aTab||t|
-            t := aTab copy.
-            t setAttributesFromClass:specClass.
-            t
-        ]
-    ] ifFalse:[
-        list := nil
-    ].
-    tabView  := builder componentAt:#TestTabsView.
-    tabView list:list.
-    testView raise.
-
-    self valueOfCanCut value: false.
-    self valueOfCanCopy value: false.
-    self valueOfCanPaste value: false.
-
 ! !
 
 !TabListEditor class methodsFor:'documentation'!