MenuEditor.st
changeset 213 71b11a173f87
parent 209 b2fa6f8d4808
child 215 d3c66fe05b12
equal deleted inserted replaced
212:1836a16763cc 213:71b11a173f87
   861       )
   861       )
   862 ! !
   862 ! !
   863 
   863 
   864 !MenuEditor class methodsFor:'startup'!
   864 !MenuEditor class methodsFor:'startup'!
   865 
   865 
       
   866 openModalOnClass:aClass andSelector:aSelector
       
   867     ^ self new openModalOnClass:aClass andSelector:aSelector
       
   868 
       
   869 
       
   870 !
       
   871 
   866 openOnClass:aClass andSelector:aSelector
   872 openOnClass:aClass andSelector:aSelector
   867     ^ self new openOnClass:aClass andSelector:aSelector
   873     ^ self new openOnClass:aClass andSelector:aSelector
   868 
   874 
   869 
   875 
   870 ! !
   876 ! !
  1101 
  1107 
  1102 
  1108 
  1103 
  1109 
  1104 !
  1110 !
  1105 
  1111 
       
  1112 openModalOnClass:aClass andSelector:aSelector
       
  1113     specClass := Association key:aClass value:aSelector.
       
  1114     super openInterfaceModal.
       
  1115 
       
  1116 !
       
  1117 
  1106 openOnClass:aClass andSelector:aSelector
  1118 openOnClass:aClass andSelector:aSelector
       
  1119     specClass := Association key:aClass value:aSelector.
  1107     super openInterface.
  1120     super openInterface.
  1108     self buildFrom:aClass andSelector:aSelector.
  1121     self buildFrom:aClass andSelector:aSelector.
       
  1122 
  1109 !
  1123 !
  1110 
  1124 
  1111 postBuildWith:builder
  1125 postBuildWith:builder
  1112     self buildFrom:nil andSelector:nil.
  1126     |cls sel|
       
  1127 
       
  1128     specClass isAssociation ifTrue:[
       
  1129         cls := specClass key.
       
  1130         sel := specClass value.
       
  1131     ].
       
  1132     specClass := nil.
       
  1133     self buildFrom:cls andSelector:sel.
  1113 ! !
  1134 ! !
  1114 
  1135 
  1115 !MenuEditor methodsFor:'user interactions'!
  1136 !MenuEditor methodsFor:'user interactions'!
  1116 
  1137 
  1117 doBrowseAppClass
  1138 doBrowseAppClass
  1281 
  1302 
  1282 !MenuEditor::Item class methodsFor:'documentation'!
  1303 !MenuEditor::Item class methodsFor:'documentation'!
  1283 
  1304 
  1284 documentation
  1305 documentation
  1285 "
  1306 "
  1286     implements the contents assigned to a HierarchyNode. An instance
  1307     implements the contents assigned to a TreeItem. An instance
  1287     is associated with one item and keeps all its information
  1308     is associated with one item and keeps all its information
  1288 
  1309 
  1289     [see also:]
  1310     [see also:]
  1290         HierarchyNode
  1311         TreeItem
  1291         MenuEditor
  1312         MenuEditor
  1292 
  1313 
  1293     [author:]
  1314     [author:]
  1294         Claus Atzkern
  1315         Claus Atzkern
  1295 "
  1316 "
  1459 "
  1480 "
  1460     menu selection list
  1481     menu selection list
  1461 
  1482 
  1462     [see also:]
  1483     [see also:]
  1463         SelectionInTreeView
  1484         SelectionInTreeView
  1464         SelectionInHierarchy
  1485         SelectionInTree
  1465         HierarchyNode
  1486         TreeItem
  1466 
  1487 
  1467     [author:]
  1488     [author:]
  1468         Claus Atzkern
  1489         Claus Atzkern
  1469 "
  1490 "
  1470 
  1491 
  1494             spec := cls perform:aSelector
  1515             spec := cls perform:aSelector
  1495         ]
  1516         ]
  1496     ].
  1517     ].
  1497     spec isNil ifFalse:[
  1518     spec isNil ifFalse:[
  1498         menu := Menu new fromLiteralArrayEncoding:spec.
  1519         menu := Menu new fromLiteralArrayEncoding:spec.
  1499         node := self nodeLabel:(aSelector asString) level:1.
  1520         node := self nodeLabel:(aSelector asString).
  1500         self subMenu:menu parent:node.
  1521         self subMenu:menu parent:node.
  1501     ] ifTrue:[
  1522     ] ifTrue:[
  1502         aSelector notNil ifTrue:[cls := aSelector asString]
  1523         aSelector notNil ifTrue:[cls := aSelector asString]
  1503                         ifFalse:[cls := 'menu'].
  1524                         ifFalse:[cls := 'menu'].
  1504 
  1525 
  1505         node := self nodeLabel:cls level:1.
  1526         node := self nodeLabel:cls.
  1506     ].
  1527     ].
  1507 
  1528 
  1508     node hasChildren ifFalse:[
  1529     node hasChildren ifFalse:[
  1509         node addChild:(self nodeLabel:'undefined' level:1)
  1530         node add:(self nodeLabel:'undefined')
  1510     ].
  1531     ].
       
  1532     node expand.
  1511     model root:node.
  1533     model root:node.
  1512     model setHideToChildren:true startingAt:node.
       
  1513 
  1534 
  1514 !
  1535 !
  1515 
  1536 
  1516 buildFromMenu:aMenu
  1537 buildFromMenu:aMenu
  1517 
  1538 
  1518     |spec cls node|
  1539     |spec cls node|
  1519 
  1540 
  1520     node := self nodeLabel:'menu' level:1.
  1541     node := self nodeLabel:'menu'.
  1521     self subMenu:aMenu parent:node.
  1542     self subMenu:aMenu parent:node.
  1522 
  1543 
  1523     node hasChildren ifFalse:[
  1544     node hasChildren ifFalse:[
  1524         node addChild:(self nodeLabel:'undefined' level:1)
  1545         node add:(self nodeLabel:'undefined')
  1525     ].
  1546     ].
       
  1547     node expand.
  1526     model root:node.
  1548     model root:node.
  1527     model setHideToChildren:true startingAt:node.
  1549 
  1528 
  1550 !
  1529 !
  1551 
  1530 
  1552 menuItem:anItem
  1531 item:anItem level:aLevel
       
  1532 
  1553 
  1533     |level node submenu grp ctr sep|
  1554     |level node submenu grp ctr sep|
  1534 
  1555 
  1535     node := self nodeLabel:(anItem label) level:aLevel.
  1556     node := self nodeLabel:(anItem label).
  1536     node contents buildFromMenuItem:anItem.
  1557     node contents buildFromMenuItem:anItem.
  1537     node name:(node contents label).
  1558     node name:(node contents label).
  1538     node hide:true.
       
  1539     self subMenu:(anItem submenu) parent:node.
  1559     self subMenu:(anItem submenu) parent:node.
  1540   ^ node.
  1560   ^ node.
  1541 
  1561 
  1542 
  1562 
  1543 !
  1563 !
  1544 
  1564 
  1545 subMenu:aMenu parent:aParent
  1565 subMenu:aMenu parent:aParent
  1546     |lvl grp sep|
  1566     |idx grp|
  1547 
  1567 
  1548     aMenu isNil ifFalse:[
  1568     aMenu isNil ifFalse:[
  1549         lvl := (aParent level) + 1.
       
  1550         grp := aMenu groupSizes.
  1569         grp := aMenu groupSizes.
  1551 
  1570         aMenu itemsDo:[:i| aParent add:(self menuItem:i)].
  1552         aMenu itemsDo:[:i| aParent addChild:(self item:i level:lvl)].
       
  1553 
  1571 
  1554         grp notNil ifTrue:[
  1572         grp notNil ifTrue:[
  1555             sep := self nodeLabel:nil level:lvl.
  1573             idx := 0.
  1556             lvl := 0.
       
  1557 
  1574 
  1558             grp do:[:i|
  1575             grp do:[:i|
  1559                 lvl := lvl + i + 1.
  1576                 idx := idx + i + 1.
  1560                 aParent addChildAndSubChildren:sep at:lvl
  1577                 aParent add:(self nodeLabel:nil) beforeIndex:idx.
  1561             ]
  1578             ]
  1562         ]
  1579         ]
  1563     ]
  1580     ]
  1564 ! !
  1581 ! !
  1565 
  1582 
  1614 
  1631 
  1615 !MenuEditor::Painter methodsFor:'initialization'!
  1632 !MenuEditor::Painter methodsFor:'initialization'!
  1616 
  1633 
  1617 initialize
  1634 initialize
  1618     super initialize.
  1635     super initialize.
  1619     super model:(SelectionInHierarchy new).
  1636     self multipleSelectOk:true.
  1620 
  1637     self model:(SelectionInTree new).
  1621 
  1638 
  1622 ! !
  1639 ! !
  1623 
  1640 
  1624 !MenuEditor::Painter methodsFor:'menus'!
  1641 !MenuEditor::Painter methodsFor:'menus'!
  1625 
  1642 
  1626 doCopy
  1643 doCopy
  1627     CopyBuffer := listOfNodes at:selection.
  1644     self hasSelection ifTrue:[
  1628 
  1645         CopyBuffer := OrderedCollection new.
  1629 
  1646         self selectionDo:[:i| CopyBuffer add:((listOfNodes at:i) copy)]
       
  1647     ]
  1630 !
  1648 !
  1631 
  1649 
  1632 doCreateItem
  1650 doCreateItem
  1633     self addNode:(self nodeLabel:'undefined' level:1)
  1651     self addElement:(self nodeLabel:'undefined')
  1634 !
  1652 !
  1635 
  1653 
  1636 doCreateMenu
  1654 doCreateMenu
  1637     |node|
  1655     |node|
  1638 
  1656 
  1639     node := self nodeLabel:'undefined' level:1.
  1657     node := self nodeLabel:'undefined'.
  1640     node addChild:(self nodeLabel:'undefined' level:2).
  1658     node add:(self nodeLabel:'undefined').
  1641     self addNode:node
  1659     self addElement:node
  1642 
  1660 
  1643 !
  1661 !
  1644 
  1662 
  1645 doCreateSep
  1663 doCreateSep
  1646     self addNode:(self nodeLabel:nil level:1)
  1664     self addElement:(self nodeLabel:nil)
  1647 
  1665 
  1648 !
  1666 !
  1649 
  1667 
  1650 doCut
  1668 doCut
  1651     self doCopy.
  1669     self doCopy.
  1652     model removeIndex:selection.
  1670     model removeSelection.
  1653     self selection:nil.
  1671     self selection:nil.
  1654 
  1672 
  1655 
  1673 
  1656 !
  1674 !
  1657 
  1675 
  1658 doPaste
  1676 doPaste
  1659     self addNode:CopyBuffer
  1677 
       
  1678     (CopyBuffer notNil and:[self selectedNode notNil]) ifTrue:[
       
  1679         self addElement:(CopyBuffer collect:[:el| el copy])
       
  1680     ]
  1660 !
  1681 !
  1661 
  1682 
  1662 menu
  1683 menu
  1663     |menu subm|
  1684     |menu subm sz inclRoot|
  1664 
  1685 
  1665     selection isNumber ifFalse:[
  1686     (sz := self numberOfSelections) == 0 ifTrue:[
  1666         ^ nil
  1687         ^ self
       
  1688     ].
       
  1689 
       
  1690     inclRoot := self isInSelection:1.
       
  1691 
       
  1692     sz > 1 ifTrue:[
       
  1693           inclRoot ifTrue:[^ nil ].
       
  1694 
       
  1695         ^ PopUpMenu labels:#( 'copy'   'cut'  )
       
  1696                  selectors:#( #doCopy  #doCut )
       
  1697                   receiver:self.
  1667     ].
  1698     ].
  1668 
  1699 
  1669     menu := PopUpMenu labels:#( 'copy'   'cut'   'paste'  '-' 'create' )
  1700     menu := PopUpMenu labels:#( 'copy'   'cut'   'paste'  '-' 'create' )
  1670                    selectors:#( #doCopy  #doCut  #doPaste nil #create  )
  1701                    selectors:#( #doCopy  #doCut  #doPaste nil #create  )
  1671                     receiver:self.
  1702                     receiver:self.
  1672 
  1703 
  1673     selection == 1 ifTrue:[
  1704     inclRoot ifTrue:[
  1674         menu disable:#doCopy.
  1705         menu disable:#doCopy.
  1675         menu disable:#doCut.
  1706         menu disable:#doCut.
  1676     ].
  1707     ].
  1677     subm :=  PopUpMenu labels:#( 'menu'        'item'        'seperator'  )
  1708     subm :=  PopUpMenu labels:#( 'menu'        'item'        'seperator'  )
  1678                     selectors:#( #doCreateMenu #doCreateItem #doCreateSep )
  1709                     selectors:#( #doCreateMenu #doCreateItem #doCreateSep )
  1679                      receiver:self.
  1710                      receiver:self.
  1680 
  1711 
  1681     menu subMenuAt:#create put:subm.
  1712     menu subMenuAt:#create put:subm.
  1682 
       
  1683   ^ menu.
  1713   ^ menu.
  1684 
       
  1685 
       
  1686 ! !
  1714 ! !
  1687 
  1715 
  1688 !MenuEditor::Painter methodsFor:'private'!
  1716 !MenuEditor::Painter methodsFor:'private'!
  1689 
  1717 
  1690 addNode:aNode
  1718 addElement:something
  1691     |node parent|
  1719     "add something after selection
  1692 
  1720     "
  1693     (aNode notNil and:[(node := self selectedNode) notNil]) ifFalse:[
  1721     |node parent index|
  1694         ^ self
  1722 
  1695     ].
  1723     (node := self selectedNode) notNil ifTrue:[
  1696 
  1724         node parent notNil ifTrue:[
  1697     (node isCollapsable or:[node parent isNil]) ifTrue:[
  1725             node isCollapsable ifTrue:[
  1698         model addChildAndSubChildren:aNode below:node at:1
  1726                 model add:something beforeIndex:1 below:node
  1699     ] ifFalse:[
  1727             ] ifFalse:[
  1700         model addChildAndSubChildren:aNode below:(node parent) after:node
  1728                 model add:something after:node
       
  1729             ]
       
  1730         ] ifFalse:[
       
  1731             model add:something beforeIndex:1 below:(self root)
       
  1732         ]
  1701     ]
  1733     ]
  1702 
  1734 !
  1703 
  1735 
  1704 !
  1736 nodeLabel:aLabel
  1705 
  1737    ^ TreeItem name:aLabel contents:(MenuEditor::Item new label:aLabel).
  1706 nodeLabel:aLabel level:aLevel
       
  1707     |node|
       
  1708 
       
  1709     node := HierarchyNode new.
       
  1710     node childCollectionClass:OrderedCollection.
       
  1711     node  name:aLabel.
       
  1712     node level:aLevel.
       
  1713     node contents:(MenuEditor::Item new label:aLabel).
       
  1714   ^ node
       
  1715 ! !
  1738 ! !
  1716 
  1739 
  1717 !MenuEditor::Painter methodsFor:'selection'!
  1740 !MenuEditor::Painter methodsFor:'selection'!
  1718 
  1741 
  1719 selectedNodeChanged
  1742 selectedNodeChanged
  1720     |node name|
  1743     |node name index|
  1721 
  1744 
  1722     (node := self selectedNode) isNil ifTrue:[^ self].
  1745     (index := self selectedIndex) ~~ 0 ifTrue:[
  1723     name := node contents label.
  1746         node := listOfNodes at:index.
  1724 
  1747         name := node contents label.
  1725     list at:selection put:name.
  1748         list at:index put:name.
  1726     node name:name.
  1749         node name:name.
  1727     self redrawLine:selection.
  1750         self redrawLine:index.
       
  1751     ]
  1728 ! !
  1752 ! !
  1729 
  1753 
  1730 !MenuEditor class methodsFor:'documentation'!
  1754 !MenuEditor class methodsFor:'documentation'!
  1731 
  1755 
  1732 version
  1756 version