diff -r 1836a16763cc -r 71b11a173f87 MenuEditor.st --- 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'!