changed:
authorClaus Gittinger <cg@exept.de>
Wed, 18 Jan 2012 11:36:38 +0100
changeset 2869 aa4cdac32055
parent 2868 8a4d46fd157c
child 2870 0f130285be97
changed: #doMoveUpOrDown: can now move a group of items up/down
MenuEditor.st
--- a/MenuEditor.st	Thu Dec 29 14:38:58 2011 +0100
+++ b/MenuEditor.st	Wed Jan 18 11:36:38 2012 +0100
@@ -1999,34 +1999,38 @@
 !
 
 updateChannels
-    "update all channels
-    "
-    |selection sizeOfSel selectedItem|
+    "update all channels"
+
+    |selection sizeOfSel selectedItem hasSelection|
 
     super updateChannels.
 
     selection := selectionHolder value.
     sizeOfSel := selection size.
 
+    hasSelection := sizeOfSel ~~ 0.
     sizeOfSel == 1 ifTrue:[selectedItem := selection at:1]
-		  ifFalse:[selectedItem := nil].
-
-    self hasSelectionChannel       value:(sizeOfSel ~~ 0).
+                  ifFalse:[selectedItem := nil].
+
+    self hasSelectionChannel       value:hasSelection.
     self hasSingleSelectionChannel value:(selectedItem notNil).
 
     selectedItem isNil ifTrue:[
-	self enableMovingInHolder        value:false.
-	self enableMovingOutHolder       value:false.
-	self enableMovingUpOrDownHolder  value:false.
-	self enableMovingInAboveHolder   value:false.
-	self canCreateDelayedMenuChannel value:false.
+"/        self enableMovingUpOrDownHolder  value:false.
+        self enableMovingInHolder        value:false.
+        self enableMovingOutHolder       value:false.
+        self enableMovingInAboveHolder   value:false.
+        self canCreateDelayedMenuChannel value:false.
     ] ifFalse:[
-	self enableMovingUpOrDownHolder  value:(selectedItem canMoveUpOrDown).
-	self enableMovingOutHolder       value:(selectedItem canMoveOut).
-	self enableMovingInHolder        value:(selectedItem canMoveInNext).
-	self enableMovingInAboveHolder   value:(selectedItem canMoveInAbove).
-	self canCreateDelayedMenuChannel value:(selectedItem canAddDelayedMenu).
+"/        self enableMovingUpOrDownHolder  value:(selectedItem canMoveUpOrDown).
+        self enableMovingInHolder        value:(selectedItem canMoveInNext).
+        self enableMovingOutHolder       value:(selectedItem canMoveOut).
+        self enableMovingInAboveHolder   value:(selectedItem canMoveInAbove).
+        self canCreateDelayedMenuChannel value:(selectedItem canAddDelayedMenu).
     ].
+    self enableMovingUpOrDownHolder value:(selection conform:[:i | i canMoveUpOrDown]).
+
+    "Modified (comment): / 18-01-2012 / 11:24:07 / cg"
 ! !
 
 !MenuEditor methodsFor:'drag & drop'!
@@ -2512,13 +2516,15 @@
 !
 
 selectedItem
-    "returns the selected item or nil (none or multiple selected)
-    "
+    "returns the selected item or nil (none or multiple selected)"
+
     |selection|
 
     selection := selectionHolder value.
     selection size == 1 ifTrue:[ ^ selection first ].
-  ^ nil
+    ^ nil
+
+    "Modified: / 18-01-2012 / 11:33:42 / cg"
 !
 
 selectedItem:anItem
@@ -2530,6 +2536,22 @@
 		 ifFalse:[ selection := #() ].
 
     selectionHolder value:selection.
+!
+
+selectedItems
+    "returns the selected items or an empty collection"
+
+    ^ selectionHolder value.
+
+    "Created: / 18-01-2012 / 11:32:20 / cg"
+!
+
+selectedItems:aCollectionOfItems
+    "set the selected items"
+
+    selectionHolder value:aCollectionOfItems.
+
+    "Created: / 18-01-2012 / 11:32:37 / cg"
 ! !
 
 !MenuEditor methodsFor:'user actions-aspects'!
@@ -3092,36 +3114,47 @@
     self doMoveUpOrDown:#up
 !
 
-doMoveUpOrDown:aDirection
-    "move selected item up (#up) or down (#down)
-    "
-    |item index parent children|
-
-    item := self selectedItem.
-    item isNil ifTrue:[^ self].
-    item canMoveUpOrDown ifFalse:[^ self].
+doMoveUpOrDown:aDirectionSymbol
+    "move selected item up (#up) or down (#down)"
+
+    |items itemsSortedByIndex index parent children|
+
+    items := self selectedItems.
+    items isEmptyOrNil ifTrue:[^ self].
+    (items conform:[:i | i canMoveUpOrDown]) ifFalse:[^ self].
 
     self askForItemModification ifFalse:[ ^ self ].
 
     self withoutNotifyDo:[
-	parent   := item parent.
-	children := parent children.
-	index    := children identityIndexOf:item.
-
-	selectionHolder setValue:#().
-	children removeIndex:index.
-
-	aDirection == #up ifTrue:[
-	    index == 1 ifTrue:[ children add:item ]
-		      ifFalse:[ children add:item beforeIndex:index - 1 ]
-	] ifFalse:[
-	    index > children size ifTrue:[ children addFirst:item ]
-				 ifFalse:[ children add:item afterIndex:index ]
-	].
-	parent childrenOrderChanged.
+        itemsSortedByIndex := items copy.
+        (items collect:[:i | listOfItems identityIndexOf:i])
+            sortWith:itemsSortedByIndex.
+
+        aDirectionSymbol == #down ifTrue:[
+            itemsSortedByIndex := itemsSortedByIndex reversed
+        ].
+        itemsSortedByIndex do:[:item |
+            parent   := item parent.
+            children := parent children.
+            index    := children identityIndexOf:item.
+
+            selectionHolder setValue:#().
+            children removeIndex:index.
+
+            aDirectionSymbol == #up ifTrue:[
+                index == 1 ifTrue:[ children add:item ]
+                        ifFalse:[ children add:item beforeIndex:index - 1 ]
+            ] ifFalse:[
+                index > children size ifTrue:[ children addFirst:item ]
+                                    ifFalse:[ children add:item afterIndex:index ]
+            ].
+            parent childrenOrderChanged.
+        ]
     ].
-    self selectedItem:item.
+    self selectedItems:items.
     self setModified.
+
+    "Modified: / 18-01-2012 / 11:35:38 / cg"
 ! !
 
 !MenuEditor::Item class methodsFor:'defaults'!