group & ungroup
authorwerner
Wed, 07 Apr 2004 16:33:10 +0200
changeset 1832 ba152306fbf5
parent 1831 f5ba45d3d70a
child 1833 6ad211a201cf
group & ungroup
UIPainterView.st
--- a/UIPainterView.st	Wed Apr 07 16:24:03 2004 +0200
+++ b/UIPainterView.st	Wed Apr 07 16:33:10 2004 +0200
@@ -302,6 +302,22 @@
     self deleteSelectionBuffered: false
 !
 
+getSelectedViewsAndSpecs
+    "return an array filed with selected views and corresponding specs.
+     Nil if there is none.
+    "
+    |specs coll sel|
+
+    sel := treeView selection.
+
+    coll := self minSetOfSuperViews:(self selection).
+
+    coll isNil ifTrue:[^ nil].
+
+    specs := coll collect:[:aView| self fullSpecFor:aView ].
+    ^ Array with: coll with: specs
+!
+
 pasteBuffer
     "add the objects in the paste-buffer to the object view
     "
@@ -1448,6 +1464,117 @@
 
 ! !
 
+!UIPainterView methodsFor:'group & ungroup'!
+
+group
+
+    self groupSelectionWithLayout: false
+!
+
+groupSelectionWithLayout: withLayout
+    | spec rect views box layout specs canvas view oldSelection cS nViews menu item xOffset yOffset |
+
+    menu := Menu new.
+    menu receiver: self.
+    item := MenuItem label:'Box' value:[spec := ViewSpec new].
+    menu addItem: item.
+    item := MenuItem label:'TBox' value:[spec := TBoxSpec new].
+    menu addItem: item.
+    item := MenuItem label:'FramedBox' value:[spec := FramedBoxSpec new].
+    menu addItem: item.
+    item := MenuItem label:'HorizontalPanel' value:[spec := HorizontalPanelViewSpec new].
+    menu addItem: item.
+    item := MenuItem label:'VerticalPanel' value:[spec := VerticalPanelViewSpec new].
+    menu addItem: item.
+    (MenuPanel menu: menu) startUp.
+    canvas := self painter.
+    cS := canvas getSelectedViewsAndSpecs.
+    cS isNil ifTrue:[^self].
+    views := cS first.
+    specs := cS last. 
+    rect := views first frame.
+    2 to: views size do:[:i| rect := rect merge: (views at: i) frame].
+    layout := LayoutFrame leftFraction:0.0 offset: rect origin x 
+                         rightFraction:0.0 offset: rect corner x + 1 
+                           topFraction:0.0 offset: rect origin y 
+                        bottomFraction:0.0 offset:rect corner y + 1.
+    oldSelection := canvas selection.
+    canvas select: views first superView.
+    spec layout: layout.
+    spec class == VerticalPanelViewSpec ifTrue:[
+        spec verticalLayout: #topSpace.
+        spec horizontalLayout: #fit.
+    ].
+    spec class == HorizontalPanelViewSpec ifTrue:[
+        spec verticalLayout: #fit.
+        spec horizontalLayout: #leftSpace.
+    ].
+
+    box := self pasteSpecifications:spec keepLayout:true at:nil.
+
+    xOffset := box origin x.
+    yOffset := box origin y.
+    withLayout ifFalse:[
+        1 to: specs size do:[:i|
+            view := views at: i.
+            layout :=  LayoutFrame leftFraction:0.0 offset: (view origin x - xOffset)
+                                  rightFraction:0.0 offset: (view corner x - xOffset + 1)
+                                    topFraction:0.0 offset: (view origin y - yOffset )
+                                 bottomFraction:0.0 offset: (view corner y - yOffset + 1).
+            (specs at: i) layout: layout.
+        ].
+    ]. 
+    canvas selection: oldSelection.
+    canvas deleteSelection.
+    canvas selection:box.
+    nViews := canvas pasteSpecifications:specs keepLayout:true.
+    canvas selection: box.
+!
+
+groupWithLayout
+
+    self groupSelectionWithLayout: true
+!
+
+ungroup
+
+    self ungroupSelectionWithLayout: false
+!
+
+ungroupSelectionWithLayout: withLayout
+
+    | canvas cS views specs frame view layout superView|
+
+    canvas := self painter.
+    cS := canvas getSelectedViewsAndSpecs.
+    cS isNil ifTrue:[^self].
+    views := cS first first subViews copy.
+    superView := cS first first superView.
+    cS last first component isNil ifTrue:[^self].
+    cS last first component collection isEmpty ifTrue:[^self].
+    specs := cS last first component collection copy. 
+    frame := cS first first frame.
+    canvas deleteSelection.
+    withLayout ifFalse:[
+        1 to: specs size do:[:i|
+            view := views at: i.
+            layout :=  LayoutFrame leftFraction:0.0 offset: (view origin x + frame origin x)
+                                  rightFraction:0.0 offset: (view corner x + frame origin x + 1)
+                                    topFraction:0.0 offset: (view origin y + frame origin y )
+                                 bottomFraction:0.0 offset: (view corner y + frame origin y + 1).
+            (specs at: i) layout: layout.
+        ].
+    ]. 
+    canvas selection: superView.
+    canvas pasteSpecifications:specs keepLayout:true.
+    canvas selection: superView.
+!
+
+ungroupWithLayout
+
+    self ungroupSelectionWithLayout: true
+! !
+
 !UIPainterView methodsFor:'initialization'!
 
 create
@@ -1539,6 +1666,10 @@
 
 !UIPainterView methodsFor:'private-handles'!
 
+painter
+    ^ treeView canvas
+!
+
 showSelected:aComponent
     "show object selected
     "
@@ -1953,12 +2084,15 @@
         v := aSpec buildViewWithLayoutFor:builder in:(self findContainerOfView:aView).
         v realize.    
         aView destroy.
-        device flush  "sync" .
+        device sync.
+        device flush.
         aView becomeSameAs:v.
+        inputView raise.
     ] ifFalse:[
         aSpec setAttributesIn:aView with:builder.
         self elementChangedSize:aView.
     ].
+
 !
 
 specFor:anObject