UISelectionPanel.st
changeset 112 6fe6c4d1672e
parent 107 e3e9acbe8fe3
child 116 61628bedc85a
--- a/UISelectionPanel.st	Wed May 21 12:41:01 1997 +0200
+++ b/UISelectionPanel.st	Wed May 21 12:41:29 1997 +0200
@@ -11,19 +11,26 @@
 "
 
 
-View subclass:#UISelectionPanel
-	instanceVariableNames:'action window tabView labelView inputView selection
-		lastClickPoint specification'
+ApplicationModel subclass:#UISelectionPanel
+	instanceVariableNames:'selection selectors receiver'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Interface-UIPainter'
 !
 
+View subclass:#Canvas
+	instanceVariableNames:'inputView selection specification lastClickPoint labelHolder
+		nameHolder'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:UISelectionPanel
+!
+
 DropObject subclass:#DropSpecification
 	instanceVariableNames:''
 	classVariableNames:''
 	poolDictionaries:''
-	privateIn:UISelectionPanel
+	privateIn:UISelectionPanel::Canvas
 !
 
 !UISelectionPanel class methodsFor:'documentation'!
@@ -56,64 +63,27 @@
         UIPainter
 
     [start with:]
-        UISelectionPanel defaultPanel
+        UISelectionPanel open
 
 "
 
-!
-
-examples
-"
-    creates and opens the default panel
-                                                                        [exBegin]
-    self defaultPanel.
-                                                                        [exEnd]
-
-
-    create a panel with labels and selectors implemented by the receiver
-    which returns a FullSpec.
-                                                                        [exBegin]
-    |top slv inset list view idx frame colSelected colUnselected|
-
-    top := StandardSystemView new
-        label:'UI-Selection Panel';
-        extent:450@150.
-
-    view := self origin:0.0 @ 0.0 corner:1.0 @ 1.0 in:top.
-
-    view labels:#( 'Button & Toggles'
-                   'Panels'
-                   'Slider'
-                 )
-      selectors:#( #buttonToggleSpec
-                   #panelSpec
-                   #sliderSpec
-                 )
-       receiver:self.
-
-    top open.
-                                                                        [exEnd]
-"
 ! !
 
 !UISelectionPanel class methodsFor:'instance creation'!
 
-defaultPanel
-    |top slv inset list view idx frame colSelected colUnselected|
+open
+    |appl|
 
-    top := StandardSystemView new
-        label:'UI-Selection Panel';
-        extent:480@255.
+    appl := self new.
 
-    view := self origin:0.0 @ 0.0 corner:1.0 @ 1.0 in:top.
-
-    view labels:#( 'Button & Toggle'
+    appl labels:#( 'Button & Toggle'
                    'Panel'
                    'Text'
                    'View'
                    'Menu & Combo'
                    'Slider'
                  )
+
       selectors:#( #buttonToggleSpec
                    #panelSpec
                    #textSpec
@@ -123,11 +93,11 @@
                  )
        receiver:self.
 
-    top open.
-
+    appl open.
+  ^ appl.
 ! !
 
-!UISelectionPanel class methodsFor:'interface specs'!
+!UISelectionPanel class methodsFor:'default specs'!
 
 buttonToggleSpec
     "this window spec was automatically generated by the ST/X UIPainter"
@@ -143,7 +113,7 @@
     <resource: #canvas>
 
     ^
-     
+
        #(#FullSpec
           #'window:' 
            #(#WindowSpec
@@ -245,58 +215,8 @@
               )
           )
       )
-!
-
-menuComboSpec
-    "this window spec was automatically generated by the ST/X UIPainter"
-
-    "do not manually edit this - the painter/builder may not be able to
-     handle the specification if its corrupted."
-
-    "
-     UIPainter new openOnClass:UISelectionPanel andSelector:#menuComboSpec
-     UISelectionPanel new openInterface:#menuComboSpec
-    "
-
-    <resource: #canvas>
 
-    ^
-     
-       #(#FullSpec
-          #'window:' 
-           #(#WindowSpec
-              #'name:' 'uIPainterView'
-              #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
-              #'label:' 'unnamed'
-              #'bounds:' #(#Rectangle 0 0 450 100)
-          )
-          #'component:' 
-           #(#SpecCollection
-              #'collection:' 
-               #(
-                 #(#ComboBoxSpec
-                    #'name:' 'ComboBox'
-                    #'layout:' #(#LayoutFrame 20 0 20 0 123 0 40 0)
-                    #'immediateAccept:' false
-                    #'acceptOnLeave:' true
-                    #'acceptOnReturn:' true
-                    #'acceptOnTab:' true
-                    #'acceptOnLostFocus:' true
-                    #'hasBorder:' false
-                )
-                 #(#ComboListSpec
-                    #'name:' 'ComboList'
-                    #'layout:' #(#LayoutFrame 20 0 51 0 123 0 71 0)
-                    #'tabable:' false
-                )
-                 #(#PopUpListSpec
-                    #'name:' 'PopUpList'
-                    #'layout:' #(#LayoutFrame 145 0 20 0 248 0 42 0)
-                    #'label:' 'PopUpList'
-                )
-              )
-          )
-      )
+
 !
 
 panelSpec
@@ -313,7 +233,7 @@
     <resource: #canvas>
 
     ^
-     
+
        #(#FullSpec
           #'window:' 
            #(#WindowSpec
@@ -333,25 +253,31 @@
                      #(#SpecCollection
                         #'collection:' 
                          #(
-                           #(#ActionButtonSpec
-                              #'name:' 'button1'
+                           #(#LabelSpec
+                              #'name:' 'label1'
                               #'label:' 'A'
-                              #'isTriggerOnDown:' false
-                              #'extent:' #(#Point 22 23)
+                              #'level:' 2
+                              #'adjust:' #center
+                              #'hasCharacterOrientedLabel:' true
+                              #'extent:' #(#Point 23 23)
                               #'canUIDrag:' false
                           )
-                           #(#ActionButtonSpec
-                              #'name:' 'button8'
+                           #(#LabelSpec
+                              #'name:' 'label2'
                               #'label:' 'B'
-                              #'isTriggerOnDown:' false
-                              #'extent:' #(#Point 22 23)
+                              #'level:' 2
+                              #'adjust:' #center
+                              #'hasCharacterOrientedLabel:' true
+                              #'extent:' #(#Point 23 23)
                               #'canUIDrag:' false
                           )
-                           #(#ActionButtonSpec
-                              #'name:' 'button9'
+                           #(#LabelSpec
+                              #'name:' 'label3'
                               #'label:' 'C'
-                              #'isTriggerOnDown:' false
-                              #'extent:' #(#Point 22 23)
+                              #'level:' 2
+                              #'adjust:' #center
+                              #'hasCharacterOrientedLabel:' true
+                              #'extent:' #(#Point 23 23)
                               #'canUIDrag:' false
                           )
                         )
@@ -364,21 +290,25 @@
                 )
                  #(#VariableHorizontalPanelSpec
                     #'name:' 'VariableHorizontalPanel'
-                    #'layout:' #(#LayoutFrame 275 0 20 0 363 0 105 0)
+                    #'layout:' #(#LayoutFrame 249 0 20 0 337 0 105 0)
                     #'component:' 
                      #(#SpecCollection
                         #'collection:' 
                          #(
-                           #(#ActionButtonSpec
-                              #'name:' 'button2'
+                           #(#LabelSpec
+                              #'name:' 'label4'
                               #'label:' 'A'
-                              #'isTriggerOnDown:' false
+                              #'level:' 2
+                              #'adjust:' #center
+                              #'hasCharacterOrientedLabel:' true
                               #'canUIDrag:' false
                           )
-                           #(#ActionButtonSpec
-                              #'name:' 'button3'
+                           #(#LabelSpec
+                              #'name:' 'label5'
                               #'label:' 'B'
-                              #'isTriggerOnDown:' false
+                              #'level:' 2
+                              #'adjust:' #center
+                              #'hasCharacterOrientedLabel:' true
                               #'canUIDrag:' false
                           )
                         )
@@ -386,30 +316,36 @@
                 )
                  #(#VerticalPanelViewSpec
                     #'name:' 'VerticalPanelView'
-                    #'layout:' #(#LayoutFrame 110 0 20 0 191 0 105 0)
+                    #'layout:' #(#LayoutFrame 110 0 20 0 168 0 105 0)
                     #'component:' 
                      #(#SpecCollection
                         #'collection:' 
                          #(
-                           #(#ActionButtonSpec
-                              #'name:' 'button4'
+                           #(#LabelSpec
+                              #'name:' 'label6'
                               #'label:' 'A'
-                              #'isTriggerOnDown:' false
-                              #'extent:' #(#Point 22 23)
+                              #'level:' 2
+                              #'adjust:' #center
+                              #'hasCharacterOrientedLabel:' true
+                              #'extent:' #(#Point 23 23)
                               #'canUIDrag:' false
                           )
-                           #(#ActionButtonSpec
-                              #'name:' 'button5'
+                           #(#LabelSpec
+                              #'name:' 'label7'
                               #'label:' 'B'
-                              #'isTriggerOnDown:' false
-                              #'extent:' #(#Point 22 23)
+                              #'level:' 2
+                              #'adjust:' #center
+                              #'hasCharacterOrientedLabel:' true
+                              #'extent:' #(#Point 23 23)
                               #'canUIDrag:' false
                           )
-                           #(#ActionButtonSpec
-                              #'name:' 'button10'
+                           #(#LabelSpec
+                              #'name:' 'label8'
                               #'label:' 'C'
-                              #'isTriggerOnDown:' false
-                              #'extent:' #(#Point 22 23)
+                              #'level:' 2
+                              #'adjust:' #center
+                              #'hasCharacterOrientedLabel:' true
+                              #'extent:' #(#Point 23 23)
                               #'canUIDrag:' false
                           )
                         )
@@ -422,21 +358,25 @@
                 )
                  #(#VariableVerticalPanelSpec
                     #'name:' 'VariableVerticalPanel'
-                    #'layout:' #(#LayoutFrame 372 0 20 0 456 0 105 0)
+                    #'layout:' #(#LayoutFrame 342 0 20 0 426 0 105 0)
                     #'component:' 
                      #(#SpecCollection
                         #'collection:' 
                          #(
-                           #(#ActionButtonSpec
-                              #'name:' 'button6'
+                           #(#LabelSpec
+                              #'name:' 'label9'
                               #'label:' 'A'
-                              #'isTriggerOnDown:' false
+                              #'level:' 2
+                              #'adjust:' #center
+                              #'hasCharacterOrientedLabel:' true
                               #'canUIDrag:' false
                           )
-                           #(#ActionButtonSpec
-                              #'name:' 'button7'
+                           #(#LabelSpec
+                              #'name:' 'label10'
                               #'label:' 'B'
-                              #'isTriggerOnDown:' false
+                              #'level:' 2
+                              #'adjust:' #center
+                              #'hasCharacterOrientedLabel:' true
                               #'canUIDrag:' false
                           )
                         )
@@ -444,44 +384,54 @@
                 )
                  #(#PanelViewSpec
                     #'name:' 'PanelView'
-                    #'layout:' #(#LayoutFrame 197 0 20 0 255 0 105 0)
+                    #'layout:' #(#LayoutFrame 174 0 20 0 232 0 105 0)
                     #'component:' 
                      #(#SpecCollection
                         #'collection:' 
                          #(
-                           #(#ActionButtonSpec
-                              #'name:' 'button11'
+                           #(#LabelSpec
+                              #'name:' 'label11'
                               #'label:' 'A'
-                              #'isTriggerOnDown:' false
-                              #'extent:' #(#Point 22 23)
+                              #'level:' 2
+                              #'adjust:' #center
+                              #'hasCharacterOrientedLabel:' true
+                              #'extent:' #(#Point 23 23)
                               #'canUIDrag:' false
                           )
-                           #(#ActionButtonSpec
-                              #'name:' 'button12'
+                           #(#LabelSpec
+                              #'name:' 'label12'
                               #'label:' 'B'
-                              #'isTriggerOnDown:' false
-                              #'extent:' #(#Point 22 23)
+                              #'level:' 2
+                              #'adjust:' #center
+                              #'hasCharacterOrientedLabel:' true
+                              #'extent:' #(#Point 23 23)
                               #'canUIDrag:' false
                           )
-                           #(#ActionButtonSpec
-                              #'name:' 'button13'
+                           #(#LabelSpec
+                              #'name:' 'label13'
                               #'label:' 'C'
-                              #'isTriggerOnDown:' false
-                              #'extent:' #(#Point 22 23)
+                              #'level:' 2
+                              #'adjust:' #center
+                              #'hasCharacterOrientedLabel:' true
+                              #'extent:' #(#Point 23 23)
                               #'canUIDrag:' false
                           )
-                           #(#ActionButtonSpec
-                              #'name:' 'button14'
+                           #(#LabelSpec
+                              #'name:' 'label14'
                               #'label:' 'D'
-                              #'isTriggerOnDown:' false
-                              #'extent:' #(#Point 22 23)
+                              #'level:' 2
+                              #'adjust:' #center
+                              #'hasCharacterOrientedLabel:' true
+                              #'extent:' #(#Point 23 23)
                               #'canUIDrag:' false
                           )
-                           #(#ActionButtonSpec
-                              #'name:' 'button15'
+                           #(#LabelSpec
+                              #'name:' 'label15'
                               #'label:' 'E'
-                              #'isTriggerOnDown:' false
-                              #'extent:' #(#Point 22 23)
+                              #'level:' 2
+                              #'adjust:' #center
+                              #'hasCharacterOrientedLabel:' true
+                              #'extent:' #(#Point 23 23)
                               #'canUIDrag:' false
                           )
                         )
@@ -495,6 +445,7 @@
               )
           )
       )
+
 !
 
 sliderSpec
@@ -511,7 +462,7 @@
     <resource: #canvas>
 
     ^
-     
+
        #(#FullSpec
           #'window:' 
            #(#WindowSpec
@@ -553,6 +504,7 @@
               )
           )
       )
+
 !
 
 textSpec
@@ -569,7 +521,7 @@
     <resource: #canvas>
 
     ^
-     
+
        #(#FullSpec
           #'window:' 
            #(#WindowSpec
@@ -651,6 +603,7 @@
               )
           )
       )
+
 !
 
 viewsSpec
@@ -667,14 +620,14 @@
     <resource: #canvas>
 
     ^
-     
+
        #(#FullSpec
           #'window:' 
            #(#WindowSpec
               #'name:' 'uIPainterView'
               #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
               #'label:' 'unnamed'
-              #'bounds:' #(#Rectangle 0 0 457 177)
+              #'bounds:' #(#Rectangle 0 0 485 245)
           )
           #'component:' 
            #(#SpecCollection
@@ -682,37 +635,22 @@
                #(
                  #(#FramedBoxSpec
                     #'name:' 'FramedBox'
-                    #'layout:' #(#LayoutFrame 20 0 20 0 125 0 75 0)
+                    #'layout:' #(#LayoutFrame 20 0 20 0 122 0 95 0)
                     #'label:' 'FramedBox'
                     #'labelPosition:' #topCenter
                     #'showFrame:' true
                 )
                  #(#ViewSpec
                     #'name:' 'View'
-                    #'layout:' #(#LayoutFrame 134 0 20 0 239 0 75 0)
-                    #'component:' 
-                     #(#SpecCollection
-                        #'collection:' 
-                         #(
-                           #(#LabelSpec
-                              #'name:' 'label1'
-                              #'layout:' #(#Point 3 2)
-                              #'label:' 'View'
-                              #'level:' 0
-                              #'adjust:' #center
-                              #'hasCharacterOrientedLabel:' true
-                              #'canUIDrag:' false
-                          )
-                        )
-                    )
+                    #'layout:' #(#LayoutFrame 134 0 20 0 236 0 95 0)
                 )
                  #(#SubCanvasSpec
                     #'name:' 'SubCanvas'
-                    #'layout:' #(#LayoutFrame 134 0 87 0 239 0 142 0)
+                    #'layout:' #(#LayoutFrame 250 0 20 0 352 0 95 0)
                 )
                  #(#LabelSpec
-                    #'name:' 'label2'
-                    #'layout:' #(#Point 136 87)
+                    #'name:' 'subCanvasLabel'
+                    #'layout:' #(#LayoutFrame 266 0 25 0 337 0 42 0)
                     #'label:' 'SubCanvas'
                     #'level:' 0
                     #'adjust:' #center
@@ -721,26 +659,18 @@
                 )
                  #(#DividerSpec
                     #'name:' 'Horizontal Seperator'
-                    #'layout:' #(#LayoutFrame 292 0 20 0 356 0 37 0)
+                    #'layout:' #(#LayoutFrame 20 0 111 0 353 0 128 0)
                     #'orientation:' #horizontal
                 )
                  #(#DividerSpec
                     #'name:' 'Vertical Seperator'
-                    #'layout:' #(#LayoutFrame 267 0 20 0 286 0 75 0)
+                    #'layout:' #(#LayoutFrame 364 0 20 0 383 0 128 0)
                     #'orientation:' #vertical
                 )
-                 #(#TabViewSpec
-                    #'name:' 'TabView'
-                    #'layout:' #(#LayoutFrame 20 0 87 0 125 0 142 0)
-                    #'tabWidget:' #Window
-                    #'direction:' #top
-                    #'fitLastRow:' true
-                    #'moveSelectedRow:' true
-                )
                  #(#LabelSpec
-                    #'name:' 'label3'
-                    #'layout:' #(#Point 23 87)
-                    #'label:' 'TabView'
+                    #'name:' 'viewLabel'
+                    #'layout:' #(#LayoutFrame 160 0 25 0 211 0 42 0)
+                    #'label:' 'View'
                     #'level:' 0
                     #'adjust:' #center
                     #'hasCharacterOrientedLabel:' true
@@ -749,185 +679,250 @@
               )
           )
       )
+
+! !
+
+!UISelectionPanel class methodsFor:'interface specs'!
+
+menuComboSpec
+    "this window spec was automatically generated by the ST/X UIPainter"
+
+    "do not manually edit this - the painter/builder may not be able to
+     handle the specification if its corrupted."
+
+    "
+     UIPainter new openOnClass:UISelectionPanel andSelector:#menuComboSpec
+     UISelectionPanel new openInterface:#menuComboSpec
+    "
+
+    <resource: #canvas>
+
+    ^
+     
+       #(#FullSpec
+          #'window:' 
+           #(#WindowSpec
+              #'name:' 'uIPainterView'
+              #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+              #'label:' 'unnamed'
+              #'bounds:' #(#Rectangle 0 0 464 253)
+          )
+          #'component:' 
+           #(#SpecCollection
+              #'collection:' 
+               #(
+                 #(#ComboBoxSpec
+                    #'name:' 'ComboBox'
+                    #'layout:' #(#LayoutFrame 20 0 20 0 123 0 40 0)
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#ComboListSpec
+                    #'name:' 'ComboList'
+                    #'layout:' #(#LayoutFrame 20 0 51 0 123 0 71 0)
+                    #'tabable:' false
+                )
+                 #(#PopUpListSpec
+                    #'name:' 'PopUpList'
+                    #'layout:' #(#LayoutFrame 145 0 20 0 248 0 42 0)
+                    #'label:' 'PopUpList'
+                )
+                 #(#MenuPanelSpec
+                    #'name:' 'MenuPanel'
+                    #'layout:' #(#LayoutFrame 145 0 51 0 248 0 73 0)
+                )
+                 #(#TabViewSpec
+                    #'name:' 'TabView'
+                    #'layout:' #(#LayoutFrame 269 0 20 0 409 0 56 0)
+                    #'tabWidget:' #Window
+                    #'direction:' #top
+                    #'useIndex:' false
+                    #'fitLastRow:' true
+                    #'moveSelectedRow:' true
+                )
+                 #(#NoteBookViewSpec
+                    #'name:' 'noteBookView'
+                    #'layout:' #(#LayoutFrame 269 0 66 0 409 0 182 0)
+                    #'tabWidget:' #Window
+                    #'direction:' #top
+                    #'useIndex:' false
+                    #'fitLastRow:' true
+                    #'moveSelectedRow:' true
+                    #'level:' 2
+                )
+              )
+          )
+      )
+!
+
+windowSpec
+    "this window spec was automatically generated by the ST/X UIPainter"
+
+    "do not manually edit this - the painter/builder may not be able to
+     handle the specification if its corrupted."
+
+    "
+     UIPainter new openOnClass:UISelectionPanel andSelector:#windowSpec
+     UISelectionPanel new openInterface:#windowSpec
+    "
+    "UISelectionPanel open"
+
+    <resource: #canvas>
+
+    ^
+     
+       #(#FullSpec
+          #'window:' 
+           #(#WindowSpec
+              #'name:' 'uIPainterView'
+              #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+              #'label:' 'Tree-View'
+              #'bounds:' #(#Rectangle 0 0 480 260)
+          )
+          #'component:' 
+           #(#SpecCollection
+              #'collection:' 
+               #(
+                 #(#LabelSpec
+                    #'name:' 'label1'
+                    #'layout:' #(#LayoutFrame 0 0.0 -20 1.0 0 1.0 0 1.0)
+                    #'label:' 'selection'
+                    #'labelChannel:' #'nameOfObject'
+                    #'level:' 2
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' false
+                )
+                 #(#NoteBookViewSpec
+                    #'name:' 'noteBookView1'
+                    #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -21 1.0)
+                    #'model:' #tabModel
+                    #'menu:' #tabList
+                    #'tabWidget:' #Window
+                    #'direction:' #top
+                    #'fitLastRow:' true
+                    #'useIndex:' true
+                    #'moveSelectedRow:' true
+                    #'level:' 2
+                    #'canvas:' #canvas
+                )
+              )
+          )
+      )
 ! !
 
 !UISelectionPanel methodsFor:'accessing'!
 
-labels:labels selectors:selectors receiver:receiver
-    "change specification and tabs
+labels:loLabels selectors:loSelectors receiver:aReceiver
+    selectors := loSelectors.
+    receiver := aReceiver.
+    (self tabList) value:loLabels.
+
+! !
+
+!UISelectionPanel methodsFor:'aspects'!
+
+canvas
+    |holder|
+
+    (holder := builder bindingAt:#canvas) isNil ifTrue:[
+        builder aspectAt:#canvas put:(holder := Canvas new)
+    ].
+    ^ holder
+!
+
+nameOfObject
+    |holder canvas|
+
+    (holder := builder bindingAt:#nameOfObject) isNil ifTrue:[
+        builder aspectAt:#nameOfObject put:(holder := ValueHolder new).
+        canvas := self canvas.
+        canvas nameHolder:holder.
+    ].
+    ^ holder
+!
+
+tabList
+    "returns list of tab-labels
     "
-    tabView action:[:aNrOrNil||spec|
-        aNrOrNil notNil ifTrue:[
-            spec := receiver perform:(selectors at:aNrOrNil).
-        ].
-        self specification:spec.
+    |holder|
+
+    (holder := builder bindingAt:#tabList) isNil ifTrue:[
+        builder aspectAt:#tabList put:(holder := ValueHolder new).
     ].
-    tabView list:labels.
-    self recomputeSizes.
-
-
+    ^ holder
 !
 
-specification:specOrSpecArray
-    "load a spec
+tabModel
+    "returns my model; catching select notifications
+    "
+    |holder|
+
+    (holder := builder bindingAt:#tabModel) isNil ifTrue:[
+        holder := AspectAdaptor new subject:self; forAspect:#selection.
+        builder aspectAt:#tabModel put:holder.
+    ].
+    ^ holder
+
+! !
+
+!UISelectionPanel methodsFor:'selection'!
+
+selection
+    ^ selection
+!
+
+selection:aValue
+    |spec|
+
+    selection ~~ aValue ifTrue:[
+        (selection := aValue) notNil ifTrue:[
+            selectors size >= aValue ifTrue:[
+                spec := receiver perform:(selectors at:selection)
+            ]
+        ].
+        (builder aspectAt:#canvas) specification:spec
+    ].
+! !
+
+!UISelectionPanel::Canvas methodsFor:'accessing'!
+
+nameHolder:aValueHolder
+    "set value holder which keeps the name of the object
+     under the cursor or selected
+    "
+    nameHolder := aValueHolder
+!
+
+specification:aSpecOrSpecArray
+    "load a new specification
     "
     |builder|
 
     self selection:nil.
-    labelView label:''.
 
-    window subViews copy do:[:aSubView|
+    self subViews copy do:[:aSubView|
         aSubView ~~ inputView ifTrue:[
-            aSubView == labelView ifTrue:[self halt].
             aSubView destroy
         ]
     ].
 
-    specOrSpecArray notNil ifTrue:[
-        specification := UISpecification from:specOrSpecArray.
-
+    aSpecOrSpecArray notNil ifTrue:[
+        specification := UISpecification from:aSpecOrSpecArray.
         builder := UIBuilder new.
-        specification buildViewFor:builder in:window.
-        window realizeAllSubViews.
+        specification buildViewFor:builder in:self.
+        self realizeAllSubViews.
         inputView raise.
-    ]
-! !
-
-!UISelectionPanel methodsFor:'change & update'!
-
-recomputeSizes
-    "recompute sizes dependent on list
-    "
-    |y x extent|
-
-    extent := tabView preferredExtent.
-    x := extent x.
-
-    x <= (self extent x) ifTrue:[
-        y := extent y.
     ] ifFalse:[
-        y := tabView preferredSizeXorY.
-    ].
-    tabView bottomInset:(y negated).
-    window  topInset:y.
-
-
-!
-
-update:something with:aParameter from:changedObject
-    "tabView might change its size
-    "
-    (something == #preferredExtent and:[changedObject == tabView]) ifFalse:[
-        ^ self
-    ].
-    self recomputeSizes
-
-
-! !
-
-!UISelectionPanel methodsFor:'drag & drop'!
-
-startDrag
-    "start drag of selection
-    "
-    |dragObj spec|
-
-    spec := self findSpecFor:selection.
-
-    spec notNil ifTrue:[
-        spec := self buildSpecFrom:spec.
-
-        self showUnselected.
-        dragObj := DropSpecification for:selection specification:spec.
-        self showSelected.
-        DragAndDropManager startDrag:dragObj from:inputView.
+        specification := nil
     ]
 
 ! !
 
-!UISelectionPanel methodsFor:'event handling'!
-
-buttonMotion:state x:x y:y
-    "start a drag on selection
-    "
-    |obj sensor|
-
-    (state ~~ 0 and:[selection notNil]) ifTrue:[
-        sensor := self sensor.
-        sensor anyButtonPressed ifTrue:[
-            (lastClickPoint dist:(x@y)) > 10.0 ifTrue:[
-                self startDrag
-            ]
-        ]
-    ] ifFalse:[
-        obj := self findObjectAtX:x y:y.
-
-        obj notNil ifTrue:[
-            labelView label:obj name
-        ]
-    ].
-!
-
-buttonPress:button x:x y:y
-    "change selection
-    "
-    lastClickPoint := Point x:x y:y.
-    self selection:(self findObjectAtX:x y:y).
-
-
-!
-
-doesNotUnderstand:aMessage
-    "any event message not catched; discard message
-    "
-
-
-!
-
-exposeX:x y:y width:w height:h
-    "handle an expose event from device; redraw selection
-    "
-    super exposeX:x y:y width:w height:h.
-    self showSelected.
-
-! !
-
-!UISelectionPanel methodsFor:'initialization'!
-
-initialize
-    |y|
-
-    super initialize.
-    tabView   := TabView           origin:0.0@0.0 corner:1.0@0.0 in:self.
-    window    := NoteBookFrameView origin:0.0@0.0 corner:1.0@1.0 in:self.
-    labelView := Label             origin:0.0@1.0 corner:1.0@1.0 in:self.
-    inputView := InputView         origin:0.0@0.0 extent:1.0@1.0 in:window.
-
-    y := labelView preferredExtent y.
-    window bottomInset:y.
-    labelView topInset:(y negated).
-
-    inputView eventReceiver:self.
-    inputView enableButtonEvents.
-    inputView enableButtonMotionEvents.
-    inputView enableMotionEvents.
-    inputView delegate:(KeyboardForwarder from:inputView toView:tabView).
-
-
-    tabView tabWidget:#Window.
-    tabView useIndex:true.
-
-    tabView styleAt:#expandSelection   put:6@2.
-    tabView font:(Label defaultFont).
-    tabView addDependent:self.
-    self delegate:(KeyboardForwarder from:self toView:tabView).
-
-    window     viewBackground:(tabView styleAt:#selectedColor).
-    labelView backgroundColor:(tabView styleAt:#unselectedColor).
-
-! !
-
-!UISelectionPanel methodsFor:'searching'!
+!UISelectionPanel::Canvas methodsFor:'drag & drop'!
 
 buildSpecFrom:aSpec
     "build spec out of spec
@@ -938,11 +933,12 @@
         ^ nil
     ].
 
+    spec := aSpec copy.
+
     (aSpec class supportsSubComponents and:[aSpec component notNil]) ifFalse:[
-        ^ aSpec
+        ^ spec
     ].
     comp := aSpec component.
-    spec := aSpec copy.
     spec component:nil.
 
     comp canUIDrag ifFalse:[
@@ -962,8 +958,90 @@
     comp collection:coll.
     spec component:comp.
   ^ spec
+
+
 !
 
+startDrag
+    "start drag of selection
+    "
+    |dragObj spec name|
+
+    spec := self findSpecFor:selection.
+
+    spec notNil ifTrue:[
+        spec := self buildSpecFrom:spec.
+        name := spec className asString.
+        name := name copyFrom:1 to:(name size - ('Spec' size) + 1). 
+        name at:1 put:(name at:1) asLowercase.
+        name at:(name size) put:$1.
+        spec name:name.
+
+        self showUnselected.
+        dragObj := DropSpecification for:selection specification:spec.
+        self showSelected.
+        DragAndDropManager startDrag:dragObj from:inputView.
+    ]
+
+
+! !
+
+!UISelectionPanel::Canvas methodsFor:'event handling'!
+
+buttonMotion:state x:x y:y
+    "start a drag on selection
+    "
+    |obj sensor|
+
+    (state ~~ 0 and:[selection notNil]) ifTrue:[
+        sensor := self sensor.
+        sensor anyButtonPressed ifTrue:[
+            (lastClickPoint dist:(x@y)) > 10.0 ifTrue:[
+                self startDrag
+            ]
+        ]
+    ] ifFalse:[
+        (nameHolder notNil and:[(obj := self findObjectAtX:x y:y) notNil]) ifTrue:[
+            nameHolder value:(obj name)
+        ]
+    ]
+
+!
+
+buttonPress:button x:x y:y
+    "change selection
+    "
+    lastClickPoint := Point x:x y:y.
+    self selection:(self findObjectAtX:x y:y).
+
+
+!
+
+exposeX:x y:y width:w height:h
+    "handle an expose event from device; redraw selection
+    "
+    super exposeX:x y:y width:w height:h.
+    self showSelected.
+
+
+! !
+
+!UISelectionPanel::Canvas methodsFor:'initialization'!
+
+initialize
+    super initialize.
+
+    inputView := InputView origin:0.0@0.0 extent:1.0@1.0 in:self.
+
+    inputView eventReceiver:self.
+    inputView enableButtonEvents.
+    inputView enableButtonMotionEvents.
+    inputView enableMotionEvents.
+
+! !
+
+!UISelectionPanel::Canvas methodsFor:'searching'!
+
 findObjectAtX:x y:y
     "find the origin/corner of the currentWidget
     "
@@ -973,11 +1051,11 @@
     point   := device translatePoint:point from:(inputView id)
                                              to:(inputView device rootView id).
     inputView lower.
-    viewId := device viewIdFromPoint:point in:(window id).
+    viewId := device viewIdFromPoint:point in:(self id).
     view   := device viewFromId:viewId.
     inputView raise.
 
-    (view ~~ window and:[view ~~ inputView]) ifTrue:[
+    (view ~~ self and:[view ~~ inputView]) ifTrue:[
         (self findSpecFor:view) notNil ifTrue:[
              ^ view
         ]
@@ -985,6 +1063,8 @@
     ^ nil
 
 
+
+
 !
 
 findSpecFor:anObject
@@ -1006,7 +1086,7 @@
 
 ! !
 
-!UISelectionPanel methodsFor:'selections'!
+!UISelectionPanel::Canvas methodsFor:'selection'!
 
 handlesOf:aComponent do:aOneArgBlock
     "evaluate the block on each handle; the argument to the block
@@ -1023,28 +1103,23 @@
         aOneArgBlock value:(aComponent bottomCenter - (4@4) extent:7@7).
     ]
 
-
 !
 
 selection:anObject
     "selection changed
     "
-    |spec|
+    |name|
 
     selection ~~ anObject ifTrue:[
         self showUnselected.
-        spec := self findSpecFor:anObject.
-
-        spec notNil ifTrue:[
+        (self findSpecFor:anObject) notNil ifTrue:[
             selection := anObject.
+            name := anObject name.
             self showSelected
         ] ifFalse:[
             selection := nil
         ].
-
-        selection notNil ifTrue:[
-            labelView label:(selection name)
-        ]
+        nameHolder notNil ifTrue:[nameHolder value:name]
     ]
 
 !
@@ -1053,13 +1128,15 @@
     "show selected
     "
     selection notNil ifTrue:[
-        window clippedByChildren:false.
+        self clippedByChildren:false.
 
         self handlesOf:selection do:[:aRectangle|
-            window fillRectangle:aRectangle
+            self fillRectangle:aRectangle
         ].
-        window clippedByChildren:true.
+        self clippedByChildren:true.
     ].
+
+
 !
 
 showUnselected
@@ -1071,22 +1148,22 @@
         ^ self
     ].
 
-    window clippedByChildren:false.
+    self clippedByChildren:false.
 
     self handlesOf:selection do:[:aRectangle|
-        window clearRectangle:aRectangle
+        self clearRectangle:aRectangle
     ].
-    window clippedByChildren:true.
+    self clippedByChildren:true.
 
 "must redraw all components which are affected b the handles
 "
-    r := (selection originRelativeTo:window) - (4@4) extent:(selection extent + (4@4)).
+    r := (selection originRelativeTo:self) - (4@4) extent:(selection extent + (4@4)).
 
-    window subViews do:[:aComponent |
+    self subViews do:[:aComponent |
         |absOrg absFrame|
 
         aComponent ~~ inputView ifTrue:[
-            absOrg   := aComponent originRelativeTo:window.
+            absOrg   := aComponent originRelativeTo:self.
             absFrame := absOrg extent:(aComponent extent).
 
             (absFrame intersects:r) ifTrue:[
@@ -1098,9 +1175,10 @@
         ]
     ]
 
+
 ! !
 
-!UISelectionPanel::DropSpecification class methodsFor:'instance creation'!
+!UISelectionPanel::Canvas::DropSpecification class methodsFor:'instance creation'!
 
 for:aView specification:aSpec
     "create drop object for a view derived from a specification
@@ -1120,10 +1198,13 @@
     ].
 
     ^ self new theObject:aSpec
+
+
 ! !
 
 !UISelectionPanel class methodsFor:'documentation'!
 
 version
     ^ '$Header$'
+
 ! !