MenuEditor.st
changeset 213 71b11a173f87
parent 209 b2fa6f8d4808
child 215 d3c66fe05b12
--- a/MenuEditor.st	Fri Jul 04 23:50:04 1997 +0200
+++ b/MenuEditor.st	Sat Jul 05 14:59:38 1997 +0200
@@ -863,6 +863,12 @@
 
 !MenuEditor class methodsFor:'startup'!
 
+openModalOnClass:aClass andSelector:aSelector
+    ^ self new openModalOnClass:aClass andSelector:aSelector
+
+
+!
+
 openOnClass:aClass andSelector:aSelector
     ^ self new openOnClass:aClass andSelector:aSelector
 
@@ -1103,13 +1109,28 @@
 
 !
 
+openModalOnClass:aClass andSelector:aSelector
+    specClass := Association key:aClass value:aSelector.
+    super openInterfaceModal.
+
+!
+
 openOnClass:aClass andSelector:aSelector
+    specClass := Association key:aClass value:aSelector.
     super openInterface.
     self buildFrom:aClass andSelector:aSelector.
+
 !
 
 postBuildWith:builder
-    self buildFrom:nil andSelector:nil.
+    |cls sel|
+
+    specClass isAssociation ifTrue:[
+        cls := specClass key.
+        sel := specClass value.
+    ].
+    specClass := nil.
+    self buildFrom:cls andSelector:sel.
 ! !
 
 !MenuEditor methodsFor:'user interactions'!
@@ -1283,11 +1304,11 @@
 
 documentation
 "
-    implements the contents assigned to a HierarchyNode. An instance
+    implements the contents assigned to a TreeItem. An instance
     is associated with one item and keeps all its information
 
     [see also:]
-        HierarchyNode
+        TreeItem
         MenuEditor
 
     [author:]
@@ -1461,8 +1482,8 @@
 
     [see also:]
         SelectionInTreeView
-        SelectionInHierarchy
-        HierarchyNode
+        SelectionInTree
+        TreeItem
 
     [author:]
         Claus Atzkern
@@ -1496,20 +1517,20 @@
     ].
     spec isNil ifFalse:[
         menu := Menu new fromLiteralArrayEncoding:spec.
-        node := self nodeLabel:(aSelector asString) level:1.
+        node := self nodeLabel:(aSelector asString).
         self subMenu:menu parent:node.
     ] ifTrue:[
         aSelector notNil ifTrue:[cls := aSelector asString]
                         ifFalse:[cls := 'menu'].
 
-        node := self nodeLabel:cls level:1.
+        node := self nodeLabel:cls.
     ].
 
     node hasChildren ifFalse:[
-        node addChild:(self nodeLabel:'undefined' level:1)
+        node add:(self nodeLabel:'undefined')
     ].
+    node expand.
     model root:node.
-    model setHideToChildren:true startingAt:node.
 
 !
 
@@ -1517,25 +1538,24 @@
 
     |spec cls node|
 
-    node := self nodeLabel:'menu' level:1.
+    node := self nodeLabel:'menu'.
     self subMenu:aMenu parent:node.
 
     node hasChildren ifFalse:[
-        node addChild:(self nodeLabel:'undefined' level:1)
+        node add:(self nodeLabel:'undefined')
     ].
+    node expand.
     model root:node.
-    model setHideToChildren:true startingAt:node.
 
 !
 
-item:anItem level:aLevel
+menuItem:anItem
 
     |level node submenu grp ctr sep|
 
-    node := self nodeLabel:(anItem label) level:aLevel.
+    node := self nodeLabel:(anItem label).
     node contents buildFromMenuItem:anItem.
     node name:(node contents label).
-    node hide:true.
     self subMenu:(anItem submenu) parent:node.
   ^ node.
 
@@ -1543,21 +1563,18 @@
 !
 
 subMenu:aMenu parent:aParent
-    |lvl grp sep|
+    |idx grp|
 
     aMenu isNil ifFalse:[
-        lvl := (aParent level) + 1.
         grp := aMenu groupSizes.
-
-        aMenu itemsDo:[:i| aParent addChild:(self item:i level:lvl)].
+        aMenu itemsDo:[:i| aParent add:(self menuItem:i)].
 
         grp notNil ifTrue:[
-            sep := self nodeLabel:nil level:lvl.
-            lvl := 0.
+            idx := 0.
 
             grp do:[:i|
-                lvl := lvl + i + 1.
-                aParent addChildAndSubChildren:sep at:lvl
+                idx := idx + i + 1.
+                aParent add:(self nodeLabel:nil) beforeIndex:idx.
             ]
         ]
     ]
@@ -1616,61 +1633,75 @@
 
 initialize
     super initialize.
-    super model:(SelectionInHierarchy new).
-
+    self multipleSelectOk:true.
+    self model:(SelectionInTree new).
 
 ! !
 
 !MenuEditor::Painter methodsFor:'menus'!
 
 doCopy
-    CopyBuffer := listOfNodes at:selection.
-
-
+    self hasSelection ifTrue:[
+        CopyBuffer := OrderedCollection new.
+        self selectionDo:[:i| CopyBuffer add:((listOfNodes at:i) copy)]
+    ]
 !
 
 doCreateItem
-    self addNode:(self nodeLabel:'undefined' level:1)
+    self addElement:(self nodeLabel:'undefined')
 !
 
 doCreateMenu
     |node|
 
-    node := self nodeLabel:'undefined' level:1.
-    node addChild:(self nodeLabel:'undefined' level:2).
-    self addNode:node
+    node := self nodeLabel:'undefined'.
+    node add:(self nodeLabel:'undefined').
+    self addElement:node
 
 !
 
 doCreateSep
-    self addNode:(self nodeLabel:nil level:1)
+    self addElement:(self nodeLabel:nil)
 
 !
 
 doCut
     self doCopy.
-    model removeIndex:selection.
+    model removeSelection.
     self selection:nil.
 
 
 !
 
 doPaste
-    self addNode:CopyBuffer
+
+    (CopyBuffer notNil and:[self selectedNode notNil]) ifTrue:[
+        self addElement:(CopyBuffer collect:[:el| el copy])
+    ]
 !
 
 menu
-    |menu subm|
+    |menu subm sz inclRoot|
+
+    (sz := self numberOfSelections) == 0 ifTrue:[
+        ^ self
+    ].
 
-    selection isNumber ifFalse:[
-        ^ nil
+    inclRoot := self isInSelection:1.
+
+    sz > 1 ifTrue:[
+          inclRoot ifTrue:[^ nil ].
+
+        ^ PopUpMenu labels:#( 'copy'   'cut'  )
+                 selectors:#( #doCopy  #doCut )
+                  receiver:self.
     ].
 
     menu := PopUpMenu labels:#( 'copy'   'cut'   'paste'  '-' 'create' )
                    selectors:#( #doCopy  #doCut  #doPaste nil #create  )
                     receiver:self.
 
-    selection == 1 ifTrue:[
+    inclRoot ifTrue:[
         menu disable:#doCopy.
         menu disable:#doCut.
     ].
@@ -1679,52 +1710,45 @@
                      receiver:self.
 
     menu subMenuAt:#create put:subm.
-
   ^ menu.
-
-
 ! !
 
 !MenuEditor::Painter methodsFor:'private'!
 
-addNode:aNode
-    |node parent|
-
-    (aNode notNil and:[(node := self selectedNode) notNil]) ifFalse:[
-        ^ self
-    ].
+addElement:something
+    "add something after selection
+    "
+    |node parent index|
 
-    (node isCollapsable or:[node parent isNil]) ifTrue:[
-        model addChildAndSubChildren:aNode below:node at:1
-    ] ifFalse:[
-        model addChildAndSubChildren:aNode below:(node parent) after:node
+    (node := self selectedNode) notNil ifTrue:[
+        node parent notNil ifTrue:[
+            node isCollapsable ifTrue:[
+                model add:something beforeIndex:1 below:node
+            ] ifFalse:[
+                model add:something after:node
+            ]
+        ] ifFalse:[
+            model add:something beforeIndex:1 below:(self root)
+        ]
     ]
-
-
 !
 
-nodeLabel:aLabel level:aLevel
-    |node|
-
-    node := HierarchyNode new.
-    node childCollectionClass:OrderedCollection.
-    node  name:aLabel.
-    node level:aLevel.
-    node contents:(MenuEditor::Item new label:aLabel).
-  ^ node
+nodeLabel:aLabel
+   ^ TreeItem name:aLabel contents:(MenuEditor::Item new label:aLabel).
 ! !
 
 !MenuEditor::Painter methodsFor:'selection'!
 
 selectedNodeChanged
-    |node name|
+    |node name index|
 
-    (node := self selectedNode) isNil ifTrue:[^ self].
-    name := node contents label.
-
-    list at:selection put:name.
-    node name:name.
-    self redrawLine:selection.
+    (index := self selectedIndex) ~~ 0 ifTrue:[
+        node := listOfNodes at:index.
+        name := node contents label.
+        list at:index put:name.
+        node name:name.
+        self redrawLine:index.
+    ]
 ! !
 
 !MenuEditor class methodsFor:'documentation'!