--- a/MenuEditor.st Thu Mar 12 15:01:32 1998 +0100
+++ b/MenuEditor.st Thu Mar 12 23:02:28 1998 +0100
@@ -55,18 +55,15 @@
documentation
"
- create and modify or inspect popup and pullDown menus of the
- new style( derives from Menu).
+ The MenuEditor allows you to create, modify or just inspect
+ hierarchical menus of menu bars, popup menu, or tool bar menus.
[start with:]
MenuEditor open
- MenuEditor new openOnClass:MenuEditor andSelector:#menuPullDown
+ MenuEditor openOnClass:MenuEditor andSelector:#menu
[see also:]
UIPainter
- UIHelpTool
- UISpecificationTool
- SelectionInTreeView
[author:]
Claus Atzkern, eXept Software AG
@@ -75,25 +72,29 @@
! !
-!MenuEditor class methodsFor:'initialization'!
-
-initialize
-
- super initialize.
-
- TreeView initialize
-! !
-
!MenuEditor class methodsFor:'instance creation'!
openModalOnClass:aClass andSelector:aSelector
- ^ self new openModalOnClass:aClass andSelector:aSelector
+ "Open modal a MenuEditor on aClass and aSelector"
+ "self openModalOnClass:self andSelector:#menu"
+
+ ^self new openModalOnClass:aClass andSelector:aSelector
!
+openModalOnMenu: aMenu
+ "Open a MenuEditor modal on aMenu"
+ "self openModalOnMenu: (self perform: #menu) decodeAsLiteralArray"
+
+ ^self new openModalOnMenu: aMenu
+!
+
openOnClass:aClass andSelector:aSelector
- ^ self new openOnClass:aClass andSelector:aSelector
+ "Open a MenuEditor on aClass and aSelector"
+ "self openOnClass:self andSelector:#menu"
+
+ ^self new openOnClass:aClass andSelector:aSelector
! !
@@ -101,6 +102,7 @@
!MenuEditor class methodsFor:'accessing'!
resourceType
+ "get the type of resource of the method generated by the MenuEditor"
^#menu
@@ -112,8 +114,9 @@
!MenuEditor class methodsFor:'aspects'!
aspects
-
-^#(
+ "get the aspects for the attributes of the menu components"
+
+ ^#(
label
accessCharacterPos
argument
@@ -130,19 +133,10 @@
iconAndLabel
icon
isVisible
-
)
! !
-!MenuEditor class methodsFor:'code generation'!
-
-sourceCategory
- "returns the category where to install the menu
- "
- ^ 'accessing menu'
-! !
-
!MenuEditor class methodsFor:'help specs'!
helpSpec
@@ -262,12 +256,12 @@
#(#FullSpec
#window:
#(#WindowSpec
- #name: 'unnamed canvas'
- #layout: #(#LayoutFrame 72 0 301 0 338 0 619 0)
- #label: 'unnamed canvas'
+ #name: 'Basics Item'
+ #layout: #(#LayoutFrame 212 0 351 0 478 0 669 0)
+ #label: 'Basics Item'
#min: #(#Point 10 10)
#max: #(#Point 1160 870)
- #bounds: #(#Rectangle 72 301 339 620)
+ #bounds: #(#Rectangle 212 351 479 670)
#usePreferredExtent: false
)
#component:
@@ -359,7 +353,7 @@
)
#(#CheckBoxSpec
#name: 'translateLabelCheckBox'
- #layout: #(#Point 20 192)
+ #layout: #(#Point 20 190)
#activeHelpKey: #basicsTranslateLabel
#tabable: true
#model: #translateLabel
@@ -367,7 +361,7 @@
)
#(#CheckBoxSpec
#name: 'isButtonCheckBox'
- #layout: #(#Point 20 221)
+ #layout: #(#Point 20 219)
#activeHelpKey: #basicsIsButton
#tabable: true
#model: #isButton
@@ -396,12 +390,12 @@
#(#FullSpec
#window:
#(#WindowSpec
- #name: 'unnamed canvas'
- #layout: #(#LayoutFrame 478 0 279 0 744 0 597 0)
- #label: 'unnamed canvas'
+ #name: 'Basics Link'
+ #layout: #(#LayoutFrame 212 0 351 0 478 0 669 0)
+ #label: 'Basics Link'
#min: #(#Point 10 10)
#max: #(#Point 1280 1024)
- #bounds: #(#Rectangle 478 279 745 598)
+ #bounds: #(#Rectangle 212 351 479 670)
#usePreferredExtent: false
)
#component:
@@ -474,7 +468,7 @@
)
#(#CheckBoxSpec
#name: 'translateLabelCheckBox'
- #layout: #(#Point 20 128)
+ #layout: #(#Point 20 190)
#activeHelpKey: #basicsTranslateLabel
#tabable: true
#model: #translateLabel
@@ -503,12 +497,12 @@
#(#FullSpec
#window:
#(#WindowSpec
- #name: 'unnamed canvas'
- #layout: #(#LayoutFrame 484 0 274 0 750 0 592 0)
- #label: 'unnamed canvas'
+ #name: 'Basics Menu'
+ #layout: #(#LayoutFrame 212 0 351 0 478 0 669 0)
+ #label: 'Basics Menu'
#min: #(#Point 10 10)
#max: #(#Point 1280 1024)
- #bounds: #(#Rectangle 484 274 751 593)
+ #bounds: #(#Rectangle 212 351 479 670)
#usePreferredExtent: false
)
#component:
@@ -550,7 +544,7 @@
)
#(#CheckBoxSpec
#name: 'translateLabelCheckBox'
- #layout: #(#Point 20 100)
+ #layout: #(#Point 20 190)
#activeHelpKey: #basicsTranslateLabel
#tabable: true
#model: #translateLabel
@@ -579,12 +573,12 @@
#(#FullSpec
#window:
#(#WindowSpec
- #name: 'unnamed canvas'
- #layout: #(#LayoutFrame 448 0 290 0 714 0 608 0)
- #label: 'unnamed canvas'
+ #name: 'Basics Root'
+ #layout: #(#LayoutFrame 424 0 293 0 690 0 611 0)
+ #label: 'Basics Root'
#min: #(#Point 10 10)
#max: #(#Point 1280 1024)
- #bounds: #(#Rectangle 448 290 715 609)
+ #bounds: #(#Rectangle 424 293 691 612)
#usePreferredExtent: false
)
#component:
@@ -630,12 +624,12 @@
#(#FullSpec
#window:
#(#WindowSpec
- #name: 'unnamed canvas'
- #layout: #(#LayoutFrame 467 0 304 0 733 0 622 0)
- #label: 'unnamed canvas'
+ #name: 'Basics Separator'
+ #layout: #(#LayoutFrame 297 0 354 0 563 0 672 0)
+ #label: 'Basics Separator'
#min: #(#Point 10 10)
#max: #(#Point 1160 870)
- #bounds: #(#Rectangle 467 304 734 623)
+ #bounds: #(#Rectangle 297 354 564 673)
#usePreferredExtent: false
)
#component:
@@ -665,7 +659,7 @@
#resizeForLabel: true
)
#(#InputFieldSpec
- #name: 'isVisibleInputField'
+ #name: 'visibilityInputField'
#layout: #(#LayoutFrame 132 0 65 0 -5 1.0 87 0)
#activeHelpKey: #detailsVisibility
#tabable: true
@@ -697,12 +691,12 @@
#(#FullSpec
#window:
#(#WindowSpec
- #name: 'unnamed canvas'
- #layout: #(#LayoutFrame 449 0 329 0 707 0 616 0)
- #label: 'unnamed canvas'
+ #name: 'Details Edit'
+ #layout: #(#LayoutFrame 263 0 364 0 521 0 651 0)
+ #label: 'Details Edit'
#min: #(#Point 10 10)
#max: #(#Point 1280 1024)
- #bounds: #(#Rectangle 449 329 708 617)
+ #bounds: #(#Rectangle 263 364 522 652)
#usePreferredExtent: false
)
#component:
@@ -818,12 +812,12 @@
#(#FullSpec
#window:
#(#WindowSpec
- #name: 'unnamed canvas'
- #layout: #(#LayoutFrame 462 0 313 0 706 0 454 0)
- #label: 'unnamed canvas'
+ #name: 'Image Item'
+ #layout: #(#LayoutFrame 263 0 364 0 507 0 505 0)
+ #label: 'Image Item'
#min: #(#Point 10 10)
#max: #(#Point 1280 1024)
- #bounds: #(#Rectangle 462 313 707 455)
+ #bounds: #(#Rectangle 263 364 508 506)
#usePreferredExtent: false
)
#component:
@@ -1007,7 +1001,6 @@
)
#(#MenuItem
#label: 'File'
- #translateLabel: true
#activeHelpKey: #file
#submenu:
#(#Menu
@@ -1026,7 +1019,6 @@
#translateLabel: true
#value: #doLoad
#activeHelpKey: #fileLoad
- #enabled: #isStandAlone
)
#(#MenuItem
#label: '-'
@@ -1048,7 +1040,6 @@
#label: 'Pick A Menu...'
#value: #doPickAMenu
#activeHelpKey: #filePickAMenu
- #enabled: #isStandAlone
)
#(#MenuItem
#label: '-'
@@ -1407,6 +1398,16 @@
!MenuEditor class methodsFor:'resources'!
+iconUnknown
+ "returns an image used for picked items containing an image
+ "
+
+ <resource: #fileImage>
+
+
+ ^ Image fromFile:'brokenImage.xpm'
+!
+
linkSubmenuImage
"Generated by the Image Editor"
"
@@ -1501,7 +1502,7 @@
!MenuEditor methodsFor:'accessing'!
submenuTest
- "returns submenu assigned to item test"
+ "return submenu assigned to item test"
|menu|
@@ -1514,6 +1515,7 @@
!
useHelpTool: aHelpTool
+ "take the help dictionaries from aHelpTool into my helpTool"
self noteBookView.
@@ -1540,6 +1542,7 @@
!
noteBookView
+ "create the note book view containing the attibute sections and the help tool"
|noteBook helpTool|
@@ -1561,10 +1564,11 @@
!
tabList
+ "get a value holder with the list of the attribute sections (slices)"
|holder|
(holder := builder bindingAt:#tabList) isNil ifTrue:[
- builder aspectAt:#tabList put:(holder := #('Properties') asValue).
+ builder aspectAt:#tabList put:(holder := self class slicesRootMenu asValue).
].
^ holder
@@ -1572,7 +1576,7 @@
!
treeView
- "returns the tree view representing hierarchically all the menu items"
+ "get a tree view representing hierarchically the menu items"
|treeView|
(treeView := builder bindingAt:#treeView) isNil ifTrue:[
@@ -1583,6 +1587,13 @@
^treeView
! !
+!MenuEditor methodsFor:'building'!
+
+buildFromListSpec: aListSpec
+
+ self buildFromMenu: aListSpec
+! !
+
!MenuEditor methodsFor:'change & update'!
updateEnabledChannels
@@ -1648,7 +1659,7 @@
!MenuEditor methodsFor:'initialization'!
initialize
- "initialize value holders for the menu item properties"
+ "initialize value holders for the attributes of the menu components"
|holder|
@@ -1656,13 +1667,14 @@
aspects at:#seperatorSelection put:(holder := SelectionInList new).
holder list: Item separatorList.
- holder addDependent:self.
+ holder addDependent:self.
! !
!MenuEditor methodsFor:'private'!
helpKey
+ "get the help key of the selected menu item"
|node|
(node := self treeView selectedNode) notNil ifTrue:[
@@ -1672,6 +1684,7 @@
!
helpTool
+ "get the help tool"
^helpCanvas application
! !
@@ -1679,7 +1692,7 @@
!MenuEditor methodsFor:'queries'!
isHelpToolSelected
- "returns true if current selection is help tool"
+ "return true if current selection is help tool"
(tabSelection ~~ 0 and:[slices notNil]) ifTrue:[
^(slices at:tabSelection) first = UIHelpTool label
@@ -1687,12 +1700,6 @@
^false
!
-isStandAlone
- "returns true in case of owner of the helptool"
-
- ^self masterApplication isNil
-!
-
preferredExtent
^super preferredExtent max: (Screen current width//3)@(Screen current height//2.5)
@@ -1704,7 +1711,7 @@
menuChanged
- |node item slc sel old dep|
+ |node item slc sel old|
aspects do: [:holder| holder removeDependent:self].
(node := self treeView selectedNode) notNil ifTrue:[
@@ -1741,7 +1748,7 @@
(slices := slc) notNil ifTrue:[
sel := slices collect:[:s| s first].
- tabSelection := 0.
+ tabSelection := 0.
self tabList value:sel.
(old notNil and:[(sel := sel findFirst:[:n|n = old]) ~~ 0]) ifFalse:[
@@ -1758,8 +1765,8 @@
!
tabSelection: aSelection
-
- |sel|
+ "put the section aSelection into the note book"
+
tabSelection = aSelection ifTrue:[
^ self
].
@@ -1778,12 +1785,11 @@
self isHelpToolSelected ifTrue:[
self helpTool helpKey:(self helpKey).
helpCanvas raise.
- ] ifFalse:[
- sel := (slices at:tabSelection) last.
+ ] ifFalse:[
aspects do: [:holder| holder release].
- specCanvas client:self spec:(self class perform:sel) builder:builder.
+ specCanvas client:self spec:(self class perform:(slices at:tabSelection) last) builder:builder.
aspects do: [:holder| holder addDependent:self].
- specCanvas raise.
+ specCanvas raise.
]
! !
@@ -1804,6 +1810,12 @@
!
+openModalOnMenu: aMenu
+ "build a tree from aMenu open it modal"
+
+ super openModalOnListSpec: aMenu
+!
+
postOpenWith:aBuilder
super postOpenWith:aBuilder.
@@ -2293,7 +2305,10 @@
buildFromClass:aClass andSelector:aSelector
- |spec cls menu node|
+ |spec cls menu firstNode firstNodeLabel|
+
+ "if opened on a menu"
+ (aClass isNil and: [aSelector isNil and: [listOfNodes size > 0]]) ifTrue: [^nil].
(aClass notNil and:[aSelector notNil]) ifTrue:[
cls := self application resolveName:aClass.
@@ -2309,22 +2324,29 @@
] ifTrue:[
menu := spec.
].
- node := self nodeLabel:(aSelector asString).
- self subMenu:menu parent:node.
+ firstNode := self nodeLabel:(aSelector asString).
+ self subMenu:menu parent:firstNode.
] ifTrue:[
- aSelector notNil ifTrue:[cls := aSelector asString]
- ifFalse:[cls := 'menu'].
-
- node := self nodeLabel:cls.
+ (aClass notNil and: [aSelector isNil and: [listOfNodes size > 0]])
+ ifTrue:
+ [
+ firstNode := listOfNodes first
+ ]
+ ifFalse:
+ [
+ aSelector notNil ifTrue:[firstNodeLabel := aSelector asString]
+ ifFalse:[firstNodeLabel := 'menu'].
+ firstNode := self nodeLabel:firstNodeLabel.
+ ]
].
- node expand.
- model root:node.
-
- node hasChildren ifFalse:[
- |n|
- n := self nodeLabel:'Item 1'.
- n parent: node.
- node add: n.
+ firstNode expand.
+ model root: firstNode.
+
+ firstNode hasChildren ifFalse:[
+ |firstChildNode|
+ firstChildNode := self nodeLabel:'Item 1'.
+ firstChildNode parent: firstNode.
+ firstNode add: firstChildNode.
model recomputeList
].
@@ -2339,11 +2361,12 @@
self subMenu:aMenu parent:node.
node hasChildren ifFalse:[
- node add:(self nodeLabel:'Item')
+ node add:(self nodeLabel:'Item 1')
].
node expand.
model root:node.
+ model recomputeList
!
menuItem:anItem
@@ -2622,4 +2645,3 @@
version
^ '$Header$'
! !
-MenuEditor initialize!