--- 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$'
+
! !