# HG changeset patch # User ca # Date 864211289 -7200 # Node ID 6fe6c4d1672e7ac8677d7e093161174fb43af69e # Parent c6699a14d3d979a046b910696410130ccf286977 build with builder diff -r c6699a14d3d9 -r 6fe6c4d1672e UISelectionPanel.st --- 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 @@ ^ - + #(#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 - " - - - ^ - - #(#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 @@ ^ - + #(#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 @@ ^ - + #(#FullSpec #'window:' #(#WindowSpec @@ -553,6 +504,7 @@ ) ) ) + ! textSpec @@ -569,7 +521,7 @@ ^ - + #(#FullSpec #'window:' #(#WindowSpec @@ -651,6 +603,7 @@ ) ) ) + ! viewsSpec @@ -667,14 +620,14 @@ ^ - + #(#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 + " + + + + ^ + + #(#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" + + + + ^ + + #(#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$' + ! !