# HG changeset patch # User ca # Date 1218185591 -7200 # Node ID 59128c4b9caea3ed9cb92cb43d39db0a1172db59 # Parent 8a02cfb5da94d8ecc64613912d6ee07af5388ce1 group diff -r 8a02cfb5da94 -r 59128c4b9cae UIPainterView.st --- a/UIPainterView.st Fri Aug 08 10:16:46 2008 +0200 +++ b/UIPainterView.st Fri Aug 08 10:53:11 2008 +0200 @@ -1774,63 +1774,73 @@ ! groupSelectionWithLayout: withLayout - | spec rect views box layout specs canvas view oldSelection cS nViews menu item xOffset yOffset | + |minViews specs spec menu newView target keepLyt keepPos rectangle| + + self canGroup ifFalse:[^ self ]. + + keepLyt := withLayout. + keepPos := true. 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. + menu addItem:(MenuItem label:'Box' value:[spec := ViewSpec new]). + menu addItem:(MenuItem label:'TBox' value:[spec := TBoxSpec new]). + menu addItem:(MenuItem label:'FramedBox' value:[spec := FramedBoxSpec new]). + + menu addItem:(MenuItem label:'HorizontalPanel' + value:[ + keepLyt := keepPos := false. + spec := HorizontalPanelViewSpec new. + spec verticalLayout: #fit. + spec horizontalLayout: #leftSpace. + ]). + menu addItem:(MenuItem label:'VerticalPanel' + value:[ + keepLyt := keepPos := false. + spec := VerticalPanelViewSpec new. + spec verticalLayout: #topSpace. + spec horizontalLayout: #fit. + ]). + + menu startUp. + spec isNil ifTrue:[^ self]. + + minViews := self minClosedViewSetFor:(self selection). + minViews size > 1 ifFalse:[^ self]. + + specs := OrderedCollection new. + rectangle := minViews first frame copy. + + minViews do:[:eachView| + specs add:(self fullSpecWithAbsolutePositionFor:eachView). + rectangle := rectangle quickMerge:(eachView frame). ]. - spec class == HorizontalPanelViewSpec ifTrue:[ - spec verticalLayout: #fit. - spec horizontalLayout: #leftSpace. + spec layout:rectangle. + + target := self findContainerOfView:(minViews first). + + self withinTransaction:#group objects:(Array with:target) do:[ |widgets| + self deleteSelectionBuffered:false. + + spec otherAttributeAt:#uiPainterAttributes put:(Dictionary new + at:#origin put:(rectangle origin); + at:#extent put:(rectangle extent); + at:#absOrigin put:(rectangle origin); + yourself). + + newView := self pasteSpecifications:(Array with:spec) + into:target + keepLayout:true + keepPosition:true + at:#keep. + + widgets := self pasteSpecifications:specs + into:newView + keepLayout:keepLyt + keepPosition:keepPos + at:nil. ]. - - 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. + self select:newView. ! groupWithLayout @@ -1847,6 +1857,8 @@ | canvas cS views specs frame view layout superView| + self canUngroup ifFalse:[^ self ]. + canvas := self painter. cS := canvas getSelectedViewsAndSpecs. cS isNil ifTrue:[^self]. @@ -1858,14 +1870,14 @@ 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. - ]. + 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. @@ -2256,6 +2268,10 @@ self selection: sel. ! +selectedNodes + ^ treeView model selectedNodes +! + updateSelectionFromModel:aSelOrNil "update selection from a new selection " @@ -2549,6 +2565,26 @@ ! +canGroup + "test whether selected elements can be grouped; minimum two elements + must be selected and all must have the same parent" + + |selectedNodes parent| + + selectedNodes := self selectedNodes. + + selectedNodes size < 2ifTrue:[ ^ false ]. + + parent := selectedNodes first parent. + parent isNil ifTrue:[ ^ false ]. "/ test whether not the canvas itself is selected + + selectedNodes do:[:each| + each parent ~~ parent ifTrue:[^ false ]. + ]. + + ^true +! + canKeepLayoutInSelection "returns true if layout can be kept during a paste operation " @@ -2576,6 +2612,26 @@ can be moved or aligned " ^ self canMove:(self selection) +! + +canUngroup + "test whether the selected element can be ungrouped; only one + element is selected and has children" + + "/ the #ungroupSelectionWithLayout: dosnot work yet - so disable + +"/ |selectedNodes node| +"/ +"/ selectedNodes := self selectedNodes. +"/ +"/ +"/ selectedNodes size == 1 ifTrue:[ +"/ node := selectedNodes first. +"/ node parent isNil ifTrue:[ ^ false ]. "/ test whether not the canvas itself is selected +"/ +"/ ^ node hasChildren +"/ ]. + ^ false ! ! !UIPainterView methodsFor:'transaction'!