*** empty log message ***
authorca
Mon, 23 Sep 2002 14:22:29 +0200
changeset 1606 54f978ea4b66
parent 1605 8aab97d1f5fe
child 1607 1823c35b66d2
*** empty log message ***
MenuEditor.st
--- a/MenuEditor.st	Mon Sep 23 11:37:48 2002 +0200
+++ b/MenuEditor.st	Mon Sep 23 14:22:29 2002 +0200
@@ -1,6 +1,6 @@
 "
  COPYRIGHT (c) 1997 by eXept Software AG
-              All Rights Reserved
+	      All Rights Reserved
 
  This software is furnished under a license and may be used
  only in accordance with the terms of that license and with the
@@ -10,42 +10,79 @@
  hereby transferred.
 "
 
-
-
 "{ Package: 'stx:libtool2' }"
 
 ResourceSpecEditor subclass:#MenuEditor
-	instanceVariableNames:'treeView typeOfCanvas listOfCanvas listOfSlices
-		lastImageRetriever slices'
+	instanceVariableNames:'selectionHolder tabHolder listOfItems listOfTabs
+		selectedSuperItems notifyDisabledCounter wizards listOfItemsView'
 	classVariableNames:'ImageRetrieverClasses'
 	poolDictionaries:''
 	category:'Interface-UIPainter'
 !
 
-Object subclass:#Item
-	instanceVariableNames:'activeHelpKey enabled label value nameKey indication shortcutKey
-		accessCharacterPos retriever icon iconAndLabel submenuChannel
-		startGroup argument translateLabel isButton isVisible choice
-		choiceValue auxValue hideMenuOnActivated font horizontalLayout
-		showBusyCursorWhilePerforming keepLinkedMenu triggerOnDown'
+HierarchicalItem subclass:#Item
+	instanceVariableNames:'menuItem'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:MenuEditor
+!
+
+MenuEditor::Item subclass:#ItemAction
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:MenuEditor
+!
+
+MenuEditor::Item subclass:#ItemLinkedMenu
+	instanceVariableNames:''
 	classVariableNames:''
 	poolDictionaries:''
 	privateIn:MenuEditor
 !
 
-SelectionInTreeView subclass:#TreeView
+MenuEditor::Item subclass:#ItemMenu
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:MenuEditor
+!
+
+MenuEditor::ItemMenu subclass:#ItemRoot
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:MenuEditor
+!
+
+MenuEditor::Item subclass:#ItemSeparator
 	instanceVariableNames:''
 	classVariableNames:''
 	poolDictionaries:''
 	privateIn:MenuEditor
 !
 
+ApplicationModel subclass:#ResourceEditor
+	instanceVariableNames:'selectorHolder iconAndLabelHolder retrieverHolder imageHolder
+		imageList imageViewer'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:MenuEditor
+!
+
+HierarchicalItem subclass:#ResourceEditorItem
+	instanceVariableNames:'selector icon'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:MenuEditor
+!
+
 !MenuEditor class methodsFor:'documentation'!
 
 copyright
 "
  COPYRIGHT (c) 1997 by eXept Software AG
-              All Rights Reserved
+	      All Rights Reserved
 
  This software is furnished under a license and may be used
  only in accordance with the terms of that license and with the
@@ -54,38 +91,45 @@
  other person.  No title to or ownership of the software is
  hereby transferred.
 "
-
-
 !
 
 documentation
 "
     The MenuEditor allows you to create, modify or just inspect
-    hierarchical menus of menu bars, popup menu, or tool bar menus.
+    menus.
+
+
+    [Instance variables:]
+
+	selectionHolder         <ValueHolder>        collection of current selected items
+	tabHolder               <ValueHolder>        selected tab label holder
+	listOfItems             <HierarchicalList>   hierarchical list of menu items
+	listOfTabs              <List>               list of current shown tab-labels
+	wizards                 <IdentityDictionary> keeps all created wizard dialogs
+	selectedSuperItems      <Collection>         collection of superItems derived from selection
+	notifyDisabledCounter   <SmallInteger>       ~~ 0 than change notifications are discard
+
+    [Class variables:]
+	ImageRetrieverClasses   <Collection>        sorted collection of image receivers
 
     [start with:]
-        MenuEditor open
-        MenuEditor openOnClass:MenuEditor andSelector:#menu
-
-    [see also:]
-        UIPainter
+	MenuEditor open
+	MenuEditor openOnClass:MenuEditor andSelector:#menu
 
     [author:]
-        Claus Atzkern, eXept Software AG
-        Thomas Zwick, eXept Software AG
+	Claus Atzkern, eXept Software AG
+	Thomas Zwick, eXept Software AG
 "
-
 ! !
 
 !MenuEditor class methodsFor:'initialization'!
 
 initialize
     ImageRetrieverClasses := #( 
-                                Icon
-                                NewLauncher
-                                SystemBrowser 
-                                ToolbarIconLibrary
-                              ) 
+				Icon
+				SystemBrowser 
+				ToolbarIconLibrary
+			      ). 
 
     "
      self initialize
@@ -95,30 +139,10 @@
 !MenuEditor class methodsFor:'instance creation'!
 
 openModalOnMenu: aMenu
-    "Open a MenuEditor modal on aMenu"
-    "self openModalOnMenu: (self perform: #menu) decodeAsLiteralArray"
-
-    ^self new openModalOnMenu: aMenu
-! !
-
-!MenuEditor class methodsFor:'accessing'!
-
-iconUnknown
-    "returns an image used for picked items containing an image
+    "Open a MenuEditor modal on aMenu
+     self openModalOnMenu: (self perform: #menu) decodeAsLiteralArray
     "
-    <resource: #fileImage>
-
-    ^ MenuPanelSpec icon
-!
-
-resourceType
-    "get the type of resource of the method generated by the MenuEditor"
-
-    ^#menu
-
-
-
-
+    ^self new openModalOnMenu:aMenu
 ! !
 
 !MenuEditor class methodsFor:'accessing image retriever'!
@@ -129,19 +153,19 @@
     |key|
 
     aSymbolOrClass isBehavior ifTrue:[
-        key := aSymbolOrClass nameWithNameSpacePrefix
+	key := aSymbolOrClass nameWithNameSpacePrefix
     ] ifFalse:[
-        key := aSymbolOrClass
+	key := aSymbolOrClass
     ].
 
     key size ~~ 0 ifTrue:[
-        key := key asSymbol.
-
-        (ImageRetrieverClasses includes:key) ifFalse:[
-            ImageRetrieverClasses := ImageRetrieverClasses asOrderedCollection.
-            ImageRetrieverClasses add:key.
-            ImageRetrieverClasses sort.
-        ]
+	key := key asSymbol.
+
+	(ImageRetrieverClasses includes:key) ifFalse:[
+	    ImageRetrieverClasses := ImageRetrieverClasses asOrderedCollection.
+	    ImageRetrieverClasses add:key.
+	    ImageRetrieverClasses sort.
+	]
     ].
 !
 
@@ -157,74 +181,59 @@
     "get the aspects for the attributes of the menu components"
 
     ^#(
-        label
-        accessCharacterPos
-        showBusyCursorWhilePerforming
-        horizontalLayout
-        triggerOnDown
-        font
-        argument
-        submenuChannel
-        keepLinkedMenu
-        enabled
-        value
-        nameKey
-        indication
-        choice
-        choiceValue
-        translateLabel
-        isButton
-        shortcutKey
-        startGroup
-        retriever
-        iconAndLabel
-        icon
-        isVisible
-        hideMenuOnActivated
-        auxValue
+	rawLabel
+	accessCharacterPosition
+	showBusyCursorWhilePerforming
+	horizontalLayout
+	triggerOnDown
+	font
+	argument
+	submenuChannel
+	keepLinkedMenu
+	enabled
+	value
+	nameKey
+	indication
+	choice
+	choiceValue
+	translateLabel
+	isButton
+	shortcutKeyCharacter
+	startGroup
+	isVisible
+	hideMenuOnActivated
+	auxValue
+	activeHelpKey
+	resourceRetriever
      )
-
-    "Modified: / 14.8.1998 / 14:46:36 / cg"
+! !
+
+!MenuEditor class methodsFor:'defaults'!
+
+aboutImage
+    "the image to be displayed in my about-box;
+     If nil is returned, the ST/X default image is used.
+    "
+    ^ Image fromFile:'bitmaps/xpmBitmaps/misc_tools/setup_menus.xpm'
+!
+
+resourceType
+    "get the type of the resource of the method generated by the MenuEditor
+    "
+    ^ #menu
 ! !
 
 !MenuEditor class methodsFor:'help specs'!
 
 flyByHelpSpec
-    <resource: #help>
-
-    ^super flyByHelpSpec addPairsFrom:#(
-
-#addMenuItem
-'Add Item'
-
-#addMenuSeparator
-'Add Separator'
-
-#addSubMenu
-'Add SubMenu'
-
-#addSubMenuLink
-'Add linked SubMenu'
-
-#fileLoad
-'Load Menu'
-
-#fileNew
-'New Menu'
-
-#filePickAMenu
-'Pick a menu'
-
-#fileSave
-'Save Menu'
-
-#fileSaveAs
-'Save Menu'
-
-)
+    ^super flyByHelpSpec addPairsFrom:(self localHelpSpecStrings)
 !
 
 helpSpec
+    ^super helpSpec addPairsFrom:(self localHelpSpecStrings)
+!
+
+localHelpSpecStrings
     "This resource specification was automatically generated
      by the UIHelpTool of ST/X."
 
@@ -237,7 +246,13 @@
 
     <resource: #help>
 
-    ^super helpSpec addPairsFrom:#(
+    ^ #(
+
+#addDelayedMenu
+'Add a new delayed menu to item.'
+
+#addDelayedSubMenuLink
+'Add a new linked delayed menu to item.'
 
 #addMenuItem
 'Add a new menu item.'
@@ -329,9 +344,15 @@
 #fileSaveAs
 'Open a dialog to save the menu spec (and the help spec, if modified).'
 
+#fileShowMenuSpec
+'Opens a Workspace showing the current menu spec.'
+
 #hideMenuOnActivated
 'If on, the menu hides itself after the item was activated.'
 
+#horizontalLayout
+'If on, the submenu organizes its items horizontal insteat of vertical (default).'
+
 #imageImageAndLabel
 'Toggle display of both image and textual label.'
 
@@ -356,1011 +377,21 @@
 #triggerOnDown
 'If on, the items action is performed on mouse-button press (default is on button-release).'
 
-#horizontalLayout
-'If on, the submenu organizes its items horizontal insteat of vertical (default).'
-
 )
 ! !
 
 !MenuEditor class methodsFor:'image specs'!
 
-linkSubmenuImage
-    "This resource specification was automatically generated
-     by the ImageEditor of ST/X."
-
-    "Do not manually edit this!!!! If it is corrupted,
-     the ImageEditor may not be able to read the specification."
-
-    "
-     ImageEditor openOnClass:self andSelector:#linkSubmenuImage
-    "
-
-    <resource: #image>
-
-    ^Icon
-        constantNamed:#'MenuEditor linkSubmenuImage'
-        ifAbsentPut:[(Depth4Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@ADQDQDQDQDQDQH@D"H"H"H"H"H"K0@RH"H"H"H"H"H/@A????????????<@D@@@@@@@@@@@C0@PL3L0DQDQDQD_@A@3L3LBH"H"H"<@DCL3L3@"H"H"K0@PL3L3L0??????@A@@@@L3L@@@@@<@DQDQDCL3@PLAG0@RH"H"@3L0@3@/@AH"H"H L3L3L0<@G?????<CL3L3L@@P@@@@@@@3L3LO@ADQDQDQDP@CLA<@D"H"H"H"H LBK0@RH"H"H"H"@BH/@B????????????<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 170 170 170 255 0 0 0 255 0 0 0 255 0 255 255 255 255 0 255 0 255 127 0 0 0 127 0 0 0 127 0 127 127 127 127 0 127 0 127 127 127 127]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'???<???<???<???<???<???<???<???<???<???<???<???<???<???<???<???<???<???<???<???<???<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; yourself); yourself]
-!
-
-menuItemImage
-    "This resource specification was automatically generated
-     by the ImageEditor of ST/X."
-
-    "Do not manually edit this!!!! If it is corrupted,
-     the ImageEditor may not be able to read the specification."
-
-    "
-     ImageEditor openOnClass:self andSelector:#menuItemImage
+iconUnknown
+    "returns an image used for picked items containing an image
     "
-
-    <resource: #image>
-
-    ^Icon
-        constantNamed:#'MenuEditor menuItemImage'
-        ifAbsentPut:[(Depth2Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'UUUUUUUQUUUUUUUPUUUUUUU_UUUUUUUPUUUUUUUP@@@@@@@@EUUUUUVAF*****+HF:?+::;@F:.+*?;@F:.+::;@F:.+*:;@F:.+::;@F*****+DK??????A@@@@@@@@UUUUUUUPUUUUUUUXUUUUUUUPUUUUUUUPUUUUUUUPUUUUUUUX') ; colorMapFromArray:#[0 0 0 255 255 255 170 170 170 127 127 127]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@???<???<???<???<???<???<???<???<???<???<???<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; yourself); yourself]
-!
-
-menuSeparatorImage
-    "This resource specification was automatically generated
-     by the ImageEditor of ST/X."
-
-    "Do not manually edit this!!!! If it is corrupted,
-     the ImageEditor may not be able to read the specification."
-
-    "
-     ImageEditor openOnClass:self andSelector:#menuSeparatorImage
-    "
-
-    <resource: #image>
-
-    ^Icon
-        constantNamed:#'MenuEditor menuSeparatorImage'
-        ifAbsentPut:[(Depth2Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'UUUUUUURUUUUUUUPUUUUUUUPUUUUUUUPUUUUUUUP@@@@@@@@EUUUUUV@F*****+DF*****+CF?????+@F0@@@@[@F%UUUU[HF*****+@F*****+@K??????N@@@@@@@HUUUUUUUPUUUUUUUPUUUUUUUWUUUUUUUXUUUUUUUPUUUUUUUP') ; colorMapFromArray:#[0 0 0 255 255 255 170 170 170 127 127 127]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@???<???<???<???<???<???<???<???<???<???<???<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; yourself); yourself]
-!
-
-submenuImage
-    "This resource specification was automatically generated
-     by the ImageEditor of ST/X."
-
-    "Do not manually edit this!!!! If it is corrupted,
-     the ImageEditor may not be able to read the specification."
-
-    "
-     ImageEditor openOnClass:self andSelector:#submenuImage
-    "
-
-    <resource: #image>
-
-    ^Icon
-        constantNamed:#'MenuEditor submenuImage'
-        ifAbsentPut:[(Depth2Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@EUUUUUV@F*****+@F*****+@G??????GD@@@@@C@EUUUUUWLF*****+@F*****+@G??????HD@@@@@C@EUUUUUW@F*****+@F*****+OG??????@D@@@@@C@EUUUUUW@F*****+@F*****+@K??????@@@@@@@@@@@@@@@@@') ; colorMapFromArray:#[0 0 0 255 255 255 170 170 170 127 127 127]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'???<???<???<???<???<???<???<???<???<???<???<???<???<???<???<???<???<???<???<???<???<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; yourself); yourself]
+    <resource: #fileImage>
+
+    ^ MenuPanelSpec icon
 ! !
 
 !MenuEditor class methodsFor:'interface specs'!
 
-basicsItemSpec
-    "This resource specification was automatically generated
-     by the UIPainter of ST/X."
-
-    "Do not manually edit this!! If it is corrupted,
-     the UIPainter may not be able to read the specification."
-
-    "
-     UIPainter new openOnClass:MenuEditor andSelector:#basicsItemSpec
-     MenuEditor new openInterface:#basicsItemSpec
-    "
-
-    <resource: #canvas>
-
-    ^ 
-     #(#FullSpec
-        #name: #basicsItemSpec
-        #window: 
-       #(#WindowSpec
-          #label: 'Basics Item'
-          #name: 'Basics Item'
-          #min: #(#Point 10 10)
-          #max: #(#Point 1160 870)
-          #bounds: #(#Rectangle 898 390 1173 751)
-        )
-        #component: 
-       #(#SpecCollection
-          #collection: #(
-           #(#LabelSpec
-              #label: 'Name Key:'
-              #name: 'nameKeyLabel'
-              #layout: #(#AlignmentOrigin 107 0 26 0 1 0.5)
-              #activeHelpKey: #basicsKey
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'nameKeyField'
-              #layout: #(#LayoutFrame 110 0 16 0 -5 1.0 38 0)
-              #activeHelpKey: #basicsKey
-              #tabable: true
-              #model: #nameKey
-              #group: #inputGroup1
-              #type: #symbolOrNil
-              #acceptOnLeave: false
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptOnLostFocus: false
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#LabelSpec
-              #label: 'Label:'
-              #name: 'labelLabel'
-              #layout: #(#AlignmentOrigin 107 0 51 0 1 0.5)
-              #activeHelpKey: #basicsLabel
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'labelField'
-              #layout: #(#LayoutFrame 110 0 40 0 -5 1.0 62 0)
-              #activeHelpKey: #basicsLabel
-              #tabable: true
-              #model: #label
-              #group: #inputGroup1
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptOnLostFocus: false
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#LabelSpec
-              #label: 'Action:'
-              #name: 'valueLabel'
-              #layout: #(#AlignmentOrigin 107 0 85 0 1 0.5)
-              #activeHelpKey: #basicsAction
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'valueField'
-              #layout: #(#LayoutFrame 110 0 74 0 -5 1.0 96 0)
-              #activeHelpKey: #basicsAction
-              #tabable: true
-              #model: #value
-              #group: #inputGroup1
-              #type: #symbolOrNil
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptOnLostFocus: false
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#LabelSpec
-              #label: 'Argument:'
-              #name: 'argumentLabel'
-              #layout: #(#AlignmentOrigin 107 0 110 0 1 0.5)
-              #activeHelpKey: #basicsArgument
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'argumentField'
-              #layout: #(#LayoutFrame 110 0 99 0 -5 1.0 121 0)
-              #activeHelpKey: #basicsArgument
-              #tabable: true
-              #model: #argument
-              #group: #inputGroup1
-              #type: #smalltalkObject
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptOnLostFocus: false
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#LabelSpec
-              #label: 'Indication:'
-              #name: 'indicationLabel'
-              #layout: #(#AlignmentOrigin 107 0 144 0 1 0.5)
-              #activeHelpKey: #basicsIndication
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'indicationField'
-              #layout: #(#LayoutFrame 110 0 133 0 -5 1.0 155 0)
-              #activeHelpKey: #basicsIndication
-              #enableChannel: #indicationEnabled
-              #tabable: true
-              #model: #indication
-              #group: #inputGroup1
-              #type: #symbolOrNil
-              #immediateAccept: true
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptOnLostFocus: false
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#LabelSpec
-              #label: 'Choice:'
-              #name: 'choiceLabel'
-              #layout: #(#AlignmentOrigin 107 0 169 0 1 0.5)
-              #activeHelpKey: #basicsChoice
-              #translateLabel: true
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'choiceField'
-              #layout: #(#LayoutFrame 110 0 158 0 -5 1.0 180 0)
-              #activeHelpKey: #basicsChoice
-              #enableChannel: #choiceEnabled
-              #tabable: true
-              #model: #choice
-              #group: #inputGroup1
-              #type: #symbolOrNil
-              #immediateAccept: true
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptOnLostFocus: false
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#LabelSpec
-              #label: 'Value:'
-              #name: 'choiceValueLabel'
-              #layout: #(#AlignmentOrigin 107 0 194 0 1 0.5)
-              #activeHelpKey: #basicsChoiceValue
-              #translateLabel: true
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'choiceValueField'
-              #layout: #(#LayoutFrame 110 0 183 0 -5 1.0 205 0)
-              #activeHelpKey: #basicsChoiceValue
-              #enableChannel: #choiceValueEnabled
-              #tabable: true
-              #model: #choiceValue
-              #group: #inputGroup1
-              #type: #smalltalkObject
-              #acceptOnLeave: false
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptOnLostFocus: false
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#CheckBoxSpec
-              #label: 'Translate Label'
-              #name: 'translateLabelCheckBox'
-              #layout: #(#Point 20 218)
-              #activeHelpKey: #basicsTranslateLabel
-              #tabable: true
-              #model: #translateLabel
-            )
-           #(#CheckBoxSpec
-              #label: 'Is Button'
-              #name: 'isButtonCheckBox'
-              #layout: #(#Point 20 243)
-              #activeHelpKey: #basicsIsButton
-              #tabable: true
-              #model: #isButton
-            )
-           #(#CheckBoxSpec
-              #label: 'Hide Menu after Activation'
-              #name: 'hideMenuOnActivated'
-              #layout: #(#Point 20 267)
-              #activeHelpKey: #hideMenuOnActivated
-              #tabable: true
-              #model: #hideMenuOnActivated
-            )
-           #(#CheckBoxSpec
-              #label: 'BusyCursor while Active'
-              #name: 'showBusyCursorWhilePerforming'
-              #layout: #(#Point 20 291)
-              #activeHelpKey: #showBusyCursorWhilePerforming
-              #tabable: true
-              #model: #showBusyCursorWhilePerforming
-              #translateLabel: true
-            )
-           #(#CheckBoxSpec
-              #label: 'Trigger On Down'
-              #name: 'triggerOnDown'
-              #layout: #(#Point 20 315)
-              #activeHelpKey: #triggerOnDown
-              #tabable: true
-              #model: #triggerOnDown
-              #translateLabel: true
-            )
-           )
-         
-        )
-      )
-!
-
-basicsLinkSpec
-    "This resource specification was automatically generated
-     by the UIPainter of ST/X."
-
-    "Do not manually edit this!! If it is corrupted,
-     the UIPainter may not be able to read the specification."
-
-    "
-     UIPainter new openOnClass:MenuEditor andSelector:#basicsLinkSpec
-     MenuEditor new openInterface:#basicsLinkSpec
-    "
-
-    <resource: #canvas>
-
-    ^ 
-     #(#FullSpec
-        #name: #basicsLinkSpec
-        #window: 
-       #(#WindowSpec
-          #label: 'Basics Link'
-          #name: 'Basics Link'
-          #min: #(#Point 10 10)
-          #max: #(#Point 1280 1024)
-          #bounds: #(#Rectangle 900 124 1167 443)
-        )
-        #component: 
-       #(#SpecCollection
-          #collection: #(
-           #(#LabelSpec
-              #label: 'Name Key:'
-              #name: 'nameKeyLabel'
-              #layout: #(#AlignmentOrigin 107 0 26 0 1 0.5)
-              #activeHelpKey: #nameKey
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'nameKeyField'
-              #layout: #(#LayoutFrame 110 0 15 0 -5 1.0 37 0)
-              #activeHelpKey: #basicsNameKey
-              #tabable: true
-              #model: #nameKey
-              #group: #inputGroup2
-              #type: #symbolOrNil
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#LabelSpec
-              #label: 'Label:'
-              #name: 'labelLabel'
-              #layout: #(#AlignmentOrigin 107 0 51 0 1 0.5)
-              #resizeForLabel: true
-            )
-           #(#InputFieldSpec
-              #name: 'labelField'
-              #layout: #(#LayoutFrame 110 0 40 0 -5 1.0 62 0)
-              #activeHelpKey: #basicsLabel
-              #tabable: true
-              #model: #label
-              #group: #inputGroup2
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#LabelSpec
-              #label: 'Menu:'
-              #name: 'menuLabel'
-              #layout: #(#AlignmentOrigin 107 0 76 0 1 0.5)
-              #resizeForLabel: true
-            )
-           #(#InputFieldSpec
-              #name: 'menuField'
-              #layout: #(#LayoutFrame 110 0 65 0 -5 1.0 87 0)
-              #activeHelpKey: #basicsMenu
-              #tabable: true
-              #model: #submenuChannel
-              #group: #inputGroup2
-              #type: #symbolOrNil
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#LabelSpec
-              #label: 'Argument:'
-              #name: 'ArgumentLabel'
-              #layout: #(#AlignmentOrigin 107 0 100 0 1 0.5)
-              #resizeForLabel: true
-            )
-           #(#InputFieldSpec
-              #name: 'argumentField'
-              #layout: #(#LayoutFrame 110 0 90 0 -5 1.0 112 0)
-              #activeHelpKey: #basicsMenuArgument
-              #tabable: true
-              #model: #argument
-              #group: #inputGroup2
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#CheckBoxSpec
-              #label: 'Translate Label'
-              #name: 'translateLabelCheckBox'
-              #layout: #(#Point 20 190)
-              #activeHelpKey: #basicsTranslateLabel
-              #tabable: true
-              #model: #translateLabel
-            )
-           #(#CheckBoxSpec
-              #label: 'Has Horizontal Layout'
-              #name: 'horizontalLayout'
-              #layout: #(#Point 20 217)
-              #activeHelpKey: #horizontalLayout
-              #tabable: true
-              #model: #horizontalLayout
-            )
-           #(#CheckBoxSpec
-              #label: 'Do not destroy linked Menu'
-              #name: 'keepLinkedMenu'
-              #layout: #(#Point 20 244)
-              #tabable: true
-              #activeHelpKey: #keepLinkedMenu
-              #model: #keepLinkedMenu
-              #translateLabel: true
-            )
-           )
-         
-        )
-      )
-!
-
-basicsMenuSpec
-    "This resource specification was automatically generated
-     by the UIPainter of ST/X."
-
-    "Do not manually edit this!! If it is corrupted,
-     the UIPainter may not be able to read the specification."
-
-    "
-     UIPainter new openOnClass:MenuEditor andSelector:#basicsMenuSpec
-     MenuEditor new openInterface:#basicsMenuSpec
-    "
-
-    <resource: #canvas>
-
-    ^ 
-     #(#FullSpec
-        #name: #basicsMenuSpec
-        #window: 
-       #(#WindowSpec
-          #label: 'Basics Menu'
-          #name: 'Basics Menu'
-          #min: #(#Point 10 10)
-          #max: #(#Point 1280 1024)
-          #bounds: #(#Rectangle 93 223 360 542)
-        )
-        #component: 
-       #(#SpecCollection
-          #collection: #(
-           #(#LabelSpec
-              #label: 'Name Key:'
-              #name: 'nameKeyLabel'
-              #layout: #(#AlignmentOrigin 107 0 26 0 1 0.5)
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'nameKeyField'
-              #layout: #(#LayoutFrame 110 0 15 0 -5 1.0 37 0)
-              #activeHelpKey: #basicsNameKey
-              #tabable: true
-              #model: #nameKey
-              #group: #inputGroup3
-              #type: #symbolOrNil
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#LabelSpec
-              #label: 'Label:'
-              #name: 'labelLabel'
-              #layout: #(#AlignmentOrigin 107 0 51 0 1 0.5)
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'labelField'
-              #layout: #(#LayoutFrame 110 0 40 0 -5 1.0 62 0)
-              #activeHelpKey: #basicsLabel
-              #tabable: true
-              #model: #label
-              #group: #inputGroup3
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#CheckBoxSpec
-              #label: 'Translate Label'
-              #name: 'translateLabelCheckBox'
-              #layout: #(#Point 20 190)
-              #activeHelpKey: #basicsTranslateLabel
-              #tabable: true
-              #model: #translateLabel
-            )
-           #(#CheckBoxSpec
-              #label: 'Has Horizontal Orientation'
-              #name: 'horizontalLayout'
-              #layout: #(#Point 20 217)
-              #activeHelpKey: #horizontalLayout
-              #tabable: true
-              #model: #horizontalLayout
-            )
-
-           )
-         
-        )
-      )
-!
-
-basicsRootSpec
-    "This resource specification was automatically generated
-     by the UIPainter of ST/X."
-
-    "Do not manually edit this!! If it is corrupted,
-     the UIPainter may not be able to read the specification."
-
-    "
-     UIPainter new openOnClass:MenuEditor andSelector:#basicsRootSpec
-     MenuEditor new openInterface:#basicsRootSpec
-    "
-
-    <resource: #canvas>
-
-    ^ 
-     #(#FullSpec
-        #name: #basicsRootSpec
-        #window: 
-       #(#WindowSpec
-          #label: 'Basics Root'
-          #name: 'Basics Root'
-          #layout: #(#LayoutFrame 11 0 100 0 277 0 418 0)
-          #level: 0
-          #min: #(#Point 10 10)
-          #max: #(#Point 1280 1024)
-          #bounds: #(#Rectangle 11 100 278 419)
-          #usePreferredExtent: false
-          #returnIsOKInDialog: true
-          #escapeIsCancelInDialog: true
-        )
-        #component: 
-       #(#SpecCollection
-          #collection: #(
-           #(#LabelSpec
-              #label: 'Selector:'
-              #name: 'selectorLabel'
-              #layout: #(#AlignmentOrigin 107 0 26 0 1 0.5)
-              #resizeForLabel: true
-              #adjust: #right
-              #activeHelpKey: #basicsSelector
-            )
-           #(#InputFieldSpec
-              #name: 'selectorField'
-              #layout: #(#LayoutFrame 110 0 15 0 -5 1.0 37 0)
-              #activeHelpKey: #basicsSelector
-              #tabable: true
-              #model: #label
-              #group: #inputGroup
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           )
-         
-        )
-      )
-!
-
-basicsSeparatorSpec
-    "This resource specification was automatically generated
-     by the UIPainter of ST/X."
-
-    "Do not manually edit this!! If it is corrupted,
-     the UIPainter may not be able to read the specification."
-
-    "
-     UIPainter new openOnClass:MenuEditor andSelector:#basicsSeparatorSpec
-     MenuEditor new openInterface:#basicsSeparatorSpec
-    "
-
-    <resource: #canvas>
-
-    ^ 
-     #(#FullSpec
-        #name: #basicsSeparatorSpec
-        #window: 
-       #(#WindowSpec
-          #label: 'Basics Separator'
-          #name: 'Basics Separator'
-          #layout: #(#LayoutFrame 9 0 149 0 275 0 467 0)
-          #level: 0
-          #min: #(#Point 10 10)
-          #max: #(#Point 1160 870)
-          #bounds: #(#Rectangle 9 149 276 468)
-          #usePreferredExtent: false
-          #returnIsOKInDialog: true
-          #escapeIsCancelInDialog: true
-        )
-        #component: 
-       #(#SpecCollection
-          #collection: #(
-           #(#LabelSpec
-              #label: 'Separator Type:'
-              #name: 'separatorLabel'
-              #layout: #(#AlignmentOrigin 127 0 26 0 1 0.5)
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#ComboListSpec
-              #name: 'seperatorList'
-              #layout: #(#LayoutFrame 132 0 15 0 -5 1.0 37 0)
-              #activeHelpKey: #basicsSeparatorType
-              #tabable: true
-              #model: #seperatorSelection
-              #useIndex: true
-            )
-           #(#LabelSpec
-              #label: 'Visibility:'
-              #name: 'visibilityLabel'
-              #layout: #(#AlignmentOrigin 127 0 76 0 1 0.5)
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'visibilityInputField'
-              #layout: #(#LayoutFrame 132 0 65 0 -5 1.0 87 0)
-              #activeHelpKey: #detailsVisibility
-              #tabable: true
-              #model: #isVisible
-              #group: #inputGroup
-              #type: #symbolOrNil
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           )
-         
-        )
-      )
-!
-
-detailsEditSpec
-    "This resource specification was automatically generated
-     by the UIPainter of ST/X."
-
-    "Do not manually edit this!! If it is corrupted,
-     the UIPainter may not be able to read the specification."
-
-    "
-     UIPainter new openOnClass:MenuEditor andSelector:#detailsEditSpec
-     MenuEditor new openInterface:#detailsEditSpec
-    "
-
-    <resource: #canvas>
-
-    ^ 
-     #(#FullSpec
-        #name: #detailsEditSpec
-        #window: 
-       #(#WindowSpec
-          #label: 'Details Edit'
-          #name: 'Details Edit'
-          #min: #(#Point 10 10)
-          #max: #(#Point 1280 1024)
-          #bounds: #(#Rectangle 12 22 327 306)
-        )
-        #component: 
-       #(#SpecCollection
-          #collection: #(
-           #(#LabelSpec
-              #label: 'Accelerator:'
-              #name: 'shortcutKeyLabel'
-              #layout: #(#AlignmentOrigin 107 0 26 0 1 0.5)
-              #activeHelpKey: #detailsAccelerator
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'shortcutKeyField'
-              #layout: #(#LayoutFrame 110 0 15 0 -5 1.0 37 0)
-              #activeHelpKey: #detailsAccelerator
-              #tabable: true
-              #model: #shortcutKey
-              #group: #inputGroup4
-              #type: #symbolOrNil
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#LabelSpec
-              #label: 'Enabled:'
-              #name: 'enabledLabel'
-              #layout: #(#AlignmentOrigin 107 0 51 0 1 0.5)
-              #activeHelpKey: #detailsEnabled
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'enabledField'
-              #layout: #(#LayoutFrame 110 0 40 0 -5 1.0 62 0)
-              #activeHelpKey: #detailsEnabled
-              #tabable: true
-              #model: #enabled
-              #group: #inputGroup4
-              #type: #symbolOrNil
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#LabelSpec
-              #label: 'Visibility:'
-              #name: 'visibilityLabel'
-              #layout: #(#AlignmentOrigin 107 0 76 0 1 0.5)
-              #activeHelpKey: #detailsVisibility
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'isVisibleInputField'
-              #layout: #(#LayoutFrame 110 0 65 0 -5 1.0 87 0)
-              #activeHelpKey: #detailsVisibility
-              #tabable: true
-              #model: #isVisible
-              #group: #inputGroup4
-              #type: #symbolOrNil
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#LabelSpec
-              #label: 'Aux Value'
-              #name: 'auxLabel'
-              #layout: #(#AlignmentOrigin 107 0 101 0 1 0.5)
-              #activeHelpKey: #detailsAuxValue
-              #translateLabel: true
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'auxInputField'
-              #layout: #(#LayoutFrame 110 0 90 0 -5 1.0 112 0)
-              #activeHelpKey: #detailsAuxValue
-              #tabable: true
-              #model: #auxValue
-              #group: #inputGroup4
-              #type: #smalltalkObject
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#LabelSpec
-              #label: 'Start Group:'
-              #name: 'StartGroupLabel'
-              #layout: #(#AlignmentOrigin 107 0 139 0 1 0.5)
-              #activeHelpKey: #detailsStartGroup
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#PopUpListSpec
-              #label: 'left'
-              #name: 'StartGroupPopUp'
-              #layout: #(#LayoutFrame 110 0 128 0 -5 1.0 150 0)
-              #activeHelpKey: #detailsStartGroup
-              #tabable: true
-              #model: #startGroup
-              #menu: 
-             #(#left
-                #right
-              )
-              #useIndex: false
-            )
-           #(#LabelSpec
-              #label: 'Access Character Position:'
-              #name: 'accessCharLabel'
-              #layout: #(#AlignmentOrigin 217 0 170 0 1 0.5)
-              #activeHelpKey: #detailsAccessCharaterPosition
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'accessCharField'
-              #layout: #(#LayoutFrame 220 0 159 0 -5 1.0 181 0)
-              #activeHelpKey: #detailsAccessCharaterPosition
-              #tabable: true
-              #model: #accessCharacterPos
-              #group: #inputGroup4
-              #type: #numberOrNil
-              #immediateAccept: false
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#LabelSpec
-              #label: 'Font:'
-              #name: 'fontLabel'
-              #layout: #(#AlignmentOrigin 75 0 231 0 1 0.5)
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#FontMenuSpec
-              #attributes: 
-             #(#tabable
-                true
-              )
-              #name: 'fontMenu'
-              #layout: #(#LayoutFrame 78 0 220 0 -5 1.0 242 0)
-              #activeHelpKey: #fontMenu
-              #model: #font
-            )
-           )
-         
-        )
-      )
-!
-
-imageEditSpec
-    "This resource specification was automatically generated
-     by the UIPainter of ST/X."
-
-    "Do not manually edit this!! If it is corrupted,
-     the UIPainter may not be able to read the specification."
-
-    "
-     UIPainter new openOnClass:MenuEditor andSelector:#imageEditSpec
-     MenuEditor new openInterface:#imageEditSpec
-    "
-
-    <resource: #canvas>
-
-    ^ 
-     #(#FullSpec
-        #name: #imageEditSpec
-        #window: 
-       #(#WindowSpec
-          #label: 'Image Item'
-          #name: 'Image Item'
-          #min: #(#Point 10 10)
-          #max: #(#Point 1280 1024)
-          #bounds: #(#Rectangle 12 22 300 317)
-        )
-        #component: 
-       #(#SpecCollection
-          #collection: #(
-           #(#LabelSpec
-              #label: 'Retriever:'
-              #name: 'retrieverLabel'
-              #layout: #(#AlignmentOrigin 107 0 26 0 1 0.5)
-              #activeHelpKey: #imageRetriever
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#ComboBoxSpec
-              #name: 'retrieverField'
-              #layout: #(#LayoutFrame 110 0 15 0 -20 1.0 37 0)
-              #activeHelpKey: #imageRetriever
-              #tabable: true
-              #model: #retriever
-              #type: #symbolOrNil
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptChannel: #acceptChannel
-              #acceptOnPointerLeave: false
-              #comboList: #retrieverClassList
-            )
-           #(#LabelSpec
-              #label: 'Selector:'
-              #name: 'iconLabel'
-              #layout: #(#AlignmentOrigin 107 0 51 0 1 0.5)
-              #activeHelpKey: #imageSelector
-              #resizeForLabel: true
-              #adjust: #right
-            )
-           #(#InputFieldSpec
-              #name: 'iconField'
-              #layout: #(#LayoutFrame 110 0 40 0 -42 1.0 62 0)
-              #activeHelpKey: #imageSelector
-              #tabable: true
-              #model: #icon
-              #group: #inputGroup5
-              #type: #symbolOrNil
-              #acceptOnReturn: true
-              #acceptOnTab: true
-              #acceptChannel: #acceptChannel
-              #modifiedChannel: #modifiedChannel
-              #acceptOnPointerLeave: false
-            )
-           #(#ActionButtonSpec
-              #label: '...'
-              #name: 'browseButton'
-              #layout: #(#LayoutFrame -40 1 40 0 -20 1 62 0)
-              #activeHelpKey: #browseResource
-              #tabable: true
-              #model: #doBrowseForImageResource
-            )
-           #(#SelectionInListModelViewSpec
-              #name: 'selectionOfImage'
-              #layout: #(#LayoutFrame 20 0.0 67 0 -20 1.0 -30 1.0)
-              #activeHelpKey: #imageImageList
-              #tabable: true
-              #model: #selectionOfImage
-              #menu: #menuEditImage
-              #hasHorizontalScrollBar: true
-              #hasVerticalScrollBar: true
-              #miniScrollerHorizontal: true
-              #listModel: #listOfImages
-              #useIndex: false
-              #highlightMode: #line
-              #doubleClickSelector: #doEditImage
-              #valueChangeSelector: #imageSelected
-            )
-           #(#ViewSpec
-              #name: 'Box1'
-              #layout: #(#LayoutFrame 20 0.0 -30 1.0 -20 1.0 0 1.0)
-              #level: 0
-              #component: 
-             #(#SpecCollection
-                #collection: #(
-                 #(#CheckBoxSpec
-                    #label: 'Image & Label'
-                    #name: 'iconAndLabelCheckBox'
-                    #layout: #(#AlignmentOrigin 0 0 0 0.5 0 0.5)
-                    #activeHelpKey: #imageImageAndLabel
-                    #tabable: true
-                    #model: #iconAndLabel
-                  )
-                 #(#ActionButtonSpec
-                    #label: 'Image Editor'
-                    #name: 'imageEditorButton'
-                    #layout: #(#AlignmentOrigin 0 1.0 0 0.5 1 0.5)
-                    #activeHelpKey: #imageImageEditor
-                    #tabable: true
-                    #model: #doEditImage
-                  )
-                 )
-               
-              )
-            )
-           )
-         
-        )
-      )
-!
-
 windowSpec
     "This resource specification was automatically generated
      by the UIPainter of ST/X."
@@ -1383,9 +414,9 @@
        #(#WindowSpec
           #label: 'Menu Editor'
           #name: 'Menu Editor'
-          #min: #(#Point 550 440)
+          #min: #(#Point 550 385)
           #max: #(#Point 1152 900)
-          #bounds: #(#Rectangle 61 493 618 974)
+          #bounds: #(#Rectangle 117 275 693 750)
           #menu: #menu
           #returnIsOKInDialog: false
           #escapeIsCancelInDialog: false
@@ -1394,10 +425,10 @@
        #(#SpecCollection
           #collection: #(
            #(#MenuPanelSpec
-              #name: 'menuToolbarView'
+              #name: 'toolbar'
               #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 32 0)
               #tabable: true
-              #menu: #menuToolbar
+              #menu: #toolbar
               #showSeparatingLines: true
             )
            #(#VariableHorizontalPanelSpec
@@ -1406,13 +437,31 @@
               #component: 
              #(#SpecCollection
                 #collection: #(
-                 #(#ArbitraryComponentSpec
-                    #name: 'TreeView'
-                    #menu: #menuEdit
+                 #(#HierarchicalListViewSpec
+                    #name: 'ListOfItemsView'
+                    #model: #selectionHolder
+                    #menu: #editMenu
                     #hasHorizontalScrollBar: true
                     #hasVerticalScrollBar: true
-                    #hasBorder: false
-                    #component: #treeView
+                    #miniScrollerHorizontal: true
+                    #miniScrollerVertical: true
+                    #listModel: #listOfItems
+                    #multipleSelectOk: true
+                    #useIndex: false
+                    #highlightMode: #label
+                    #doubleClickSelector: #indicatorClickedAt:
+                    #selectConditionSelector: #canSelect:
+                    #showLeftIndicators: false
+                    #indicatorSelector: #indicatorClickedAt:
+                    #properties: 
+                   #(#PropertyListDictionary
+                      #dragArgument: nil
+                      #dropObjectSelector: #dropObjects
+                      #dropArgument: nil
+                      #canDropSelector: #canDrop:
+                      #dropSelector: #doDrop:
+                    )
+                    #postBuildCallback: #postBuildListOfItemsView:
                   )
                  #(#ViewSpec
                     #name: 'Box'
@@ -1423,12 +472,12 @@
                        #(#NoteBookViewSpec
                           #name: 'NoteBook'
                           #layout: #(#LayoutFrame 1 0.0 0 0.0 1 1.0 -30 1.0)
-                          #enableChannel: #hasAnySingleSelection
+                          #enableChannel: #hasSingleSelectionChannel
                           #tabable: true
-                          #model: #tabModel
-                          #menu: #tabList
-                          #useIndex: true
-                          #canvas: #tabCanvasHolder
+                          #model: #tabHolder
+                          #menu: #listOfTabs
+                          #fitLastRow: false
+                          #canvas: #wizardHolder
                           #keepCanvasAlive: true
                         )
                        #(#UISubSpecification
@@ -1444,7 +493,7 @@
                  )
                
               )
-              #handles: #(#Any 0.346499 1.0)
+              #handles: #(#Any 0.300493 1.0)
             )
            #(#UISubSpecification
               #name: 'InfoBarSubSpec'
@@ -1460,6 +509,319 @@
 
 !MenuEditor class methodsFor:'menu specs'!
 
+addMenu
+    "This resource specification was automatically generated
+     by the MenuEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:MenuEditor andSelector:#addMenu
+     (Menu new fromLiteralArrayEncoding:(MenuEditor addMenu)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(#Menu
+        #(
+         #(#MenuItem
+            #label: 'Separator'
+            #translateLabel: true
+            #value: #doCreateSep
+            #activeHelpKey: #addMenuSeparator
+            #labelImage: #(#ResourceRetriever #'MenuEditor::Item' #iconSeparator '')
+          )
+         #(#MenuItem
+            #label: 'Item'
+            #translateLabel: true
+            #value: #doCreateItem
+            #activeHelpKey: #addMenuItem
+            #labelImage: #(#ResourceRetriever #'MenuEditor::Item' #iconItem '')
+          )
+         #(#MenuItem
+            #label: 'Menu'
+            #translateLabel: true
+            #value: #doCreateMenu
+            #activeHelpKey: #addMenuItem
+            #labelImage: #(#ResourceRetriever #'MenuEditor::Item' #iconMenu '')
+          )
+         #(#MenuItem
+            #label: 'Linked Menu'
+            #value: #doCreateLinkedMenu
+            #activeHelpKey: #addSubMenuLink
+            #labelImage: #(#ResourceRetriever #'MenuEditor::Item' #iconLinkedMenu '')
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #label: 'Delayed Menu'
+            #value: #doCreateDelayedMenu:
+            #enabled: #canCreateDelayedMenuChannel
+            #activeHelpKey: #addDelayedMenu
+           #argument: #menu
+            #labelImage: #(#ResourceRetriever #'MenuEditor::Item' #iconDelayedMenu '')
+          )
+         #(#MenuItem
+            #label: 'Delayed Linked Menu'
+            #value: #doCreateDelayedMenu:
+            #enabled: #canCreateDelayedMenuChannel
+            #activeHelpKey: #addDelayedSubMenuLink
+            #argument: #linkedMenu
+            #labelImage: #(#ResourceRetriever #'MenuEditor::Item' #iconDelayedLinkedMenu '')
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #label: 'Standard Menus'
+            #translateLabel: true
+            #submenuChannel: #standardMenus
+            #keepLinkedMenu: true
+          )
+         )
+        nil
+        nil
+      )
+!
+
+editMenu
+    "This resource specification was automatically generated
+     by the MenuEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:MenuEditor andSelector:#editMenu
+     (Menu new fromLiteralArrayEncoding:(MenuEditor editMenu)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(#Menu
+	#(
+	 #(#MenuItem
+	    #label: 'Cut'
+	    #value: #doCut
+	    #activeHelpKey: #editCut
+	    #enabled: #hasSelectionChannel
+	  )
+	 #(#MenuItem
+	    #label: 'Copy'
+	    #value: #doCopy
+	    #activeHelpKey: #editCopy
+	    #enabled: #hasSelectionChannel
+	  )
+	 #(#MenuItem
+	    #label: 'Paste'
+	    #value: #doPaste
+	    #activeHelpKey: #editPaste
+	    #enabled: #valueOfCanPaste
+	  )
+	 #(#MenuItem
+	    #label: 'Delete'
+	    #value: #doDelete
+	    #activeHelpKey: #editDelete
+	    #enabled: #hasSelectionChannel
+	  )
+	 #(#MenuItem
+	    #label: '-'
+	  )
+	 #(#MenuItem
+	    #label: 'Move Up'
+	    #startGroup: #right
+	    #value: #doMoveUpOrDown:
+	    #activeHelpKey: #editMoveUp
+	    #enabled: #valueOfEnableMovingUpOrDown
+	    #argument: #up
+	    #labelImage: #(#ResourceRetriever #Icon #upIcon 'Move Up')
+	  )
+	 #(#MenuItem
+	    #label: 'Move Down'
+	    #value: #doMoveUpOrDown:
+	    #activeHelpKey: #editMoveDown
+	    #enabled: #valueOfEnableMovingUpOrDown
+	    #argument: #down
+	    #labelImage: #(#ResourceRetriever #Icon #downIcon 'Move Down')
+	  )
+	 #(#MenuItem
+	    #label: 'Move In'
+	    #value: #doMoveIn:
+	    #activeHelpKey: #editMoveIn
+	    #enabled: #valueOfEnableMovingIn
+	    #argument: #inNext
+	    #labelImage: #(#ResourceRetriever #Icon #downRightIcon 'Move In')
+	  )
+	 #(#MenuItem
+	    #label: 'Move In Above'
+	    #value: #doMoveIn:
+	    #activeHelpKey: #editMoveInAbove
+	    #enabled: #valueOfEnableMovingInAbove
+	    #argument: #inPrev
+	    #labelImage: #(#ResourceRetriever #Icon #upRightIcon 'Move In Above')
+	  )
+	 #(#MenuItem
+	    #label: 'Move Out'
+	    #value: #doMoveOut
+	    #activeHelpKey: #editMoveOut
+	    #enabled: #valueOfEnableMovingOut
+	    #labelImage: #(#ResourceRetriever #Icon #leftDownIcon 'Move Out')
+	  )
+	 )
+	nil
+	nil
+      )
+!
+
+fileMenu
+    "This resource specification was automatically generated
+     by the MenuEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:MenuEditor andSelector:#fileMenu
+     (Menu new fromLiteralArrayEncoding:(MenuEditor fileMenu)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(#Menu
+        #(
+         #(#MenuItem
+            #label: 'New'
+            #translateLabel: true
+            #value: #doNew
+            #activeHelpKey: #fileNew
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #label: 'Load...'
+            #translateLabel: true
+            #value: #doLoad
+            #activeHelpKey: #fileLoad
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #label: 'Save'
+            #translateLabel: true
+            #value: #doSave
+            #activeHelpKey: #fileSave
+          )
+         #(#MenuItem
+            #label: 'Save As...'
+            #translateLabel: true
+            #value: #doSaveAs
+            #activeHelpKey: #fileSaveAs
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #label: 'Pick a Menu...'
+            #translateLabel: true
+            #value: #doPickAMenu
+            #activeHelpKey: #filePickAMenu
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #label: 'Show Menu Spec'
+            #translateLabel: true
+            #value: #doShowMenuSpec
+            #activeHelpKey: #fileShowMenuSpec
+          )
+         #(#MenuItem
+            #label: 'Browse Class'
+            #translateLabel: true
+            #value: #doBrowseClass
+            #activeHelpKey: #fileBrowseClass
+            #enabled: #hasValidSpecClass
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #label: 'Exit'
+            #translateLabel: true
+            #value: #closeRequest
+            #activeHelpKey: #fileExit
+          )
+         )
+        nil
+        nil
+      )
+!
+
+helpMenu
+    "This resource specification was automatically generated
+     by the MenuEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:MenuEditor andSelector:#helpMenu
+     (Menu new fromLiteralArrayEncoding:(MenuEditor helpMenu)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(#Menu
+        #(
+         #(#MenuItem
+            #label: 'Documentation'
+            #translateLabel: true
+            #value: #openHTMLDocument:
+            #activeHelpKey: #helpTutorial
+            #argument: 'tools/uipainter/MenuEditor.html'
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #label: 'Help Tool'
+            #translateLabel: true
+            #value: #openHTMLDocument:
+            #activeHelpKey: #helpHelpTool
+            #argument: 'tools/uipainter/HelpTool.html'
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #label: 'Show Help Texts'
+            #translateLabel: true
+            #activeHelpKey: #helpShowHelp
+            #indication: #showingHelp:
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #label: 'About MenuEditor...'
+            #translateLabel: true
+            #value: #openAboutThisApplication
+            #activeHelpKey: #aboutThisAppliaction
+          )
+         )
+        nil
+        nil
+      )
+!
+
 menu
     "This resource specification was automatically generated
      by the MenuEditor of ST/X."
@@ -1481,82 +843,23 @@
             #label: '&File'
             #translateLabel: true
             #activeHelpKey: #file
-            #submenu: 
-           #(#Menu
-              #(
-               #(#MenuItem
-                  #label: 'New'
-                  #translateLabel: true
-                  #value: #doNew
-                  #activeHelpKey: #fileNew
-                )
-               #(#MenuItem
-                  #label: '-'
-                )
-               #(#MenuItem
-                  #label: 'Load...'
-                  #translateLabel: true
-                  #value: #doLoad
-                  #activeHelpKey: #fileLoad
-                )
-               #(#MenuItem
-                  #label: '-'
-                )
-               #(#MenuItem
-                  #label: 'Save'
-                  #translateLabel: true
-                  #value: #doSave
-                  #activeHelpKey: #fileSave
-                )
-               #(#MenuItem
-                  #label: 'Save As...'
-                  #translateLabel: true
-                  #value: #doSaveAs
-                  #activeHelpKey: #fileSaveAs
-                )
-               #(#MenuItem
-                  #label: '-'
-                )
-               #(#MenuItem
-                  #label: 'Pick a Menu...'
-                  #translateLabel: true
-                  #value: #doPickAMenu
-                  #activeHelpKey: #filePickAMenu
-                )
-               #(#MenuItem
-                  #label: '-'
-                )
-               #(#MenuItem
-                  #label: 'Browse Class'
-                  #translateLabel: true
-                  #value: #doBrowseClass
-                  #activeHelpKey: #fileBrowseClass
-                )
-               #(#MenuItem
-                  #label: '-'
-                )
-               #(#MenuItem
-                  #label: 'Exit'
-                  #translateLabel: true
-                  #value: #closeRequest
-                  #activeHelpKey: #fileExit
-                )
-               )
-              nil
-              nil
-            )
+            #submenuChannel: #fileMenu
+            #keepLinkedMenu: true
           )
          #(#MenuItem
-            #label: 'Edit'
+            #label: '&Edit'
             #translateLabel: true
             #activeHelpKey: #edit
-            #submenuChannel: #menuEdit
+            #submenuChannel: #editMenu
+            #keepLinkedMenu: true
           )
          #(#MenuItem
             #label: 'Add'
             #translateLabel: true
             #activeHelpKey: #add
-            #submenuChannel: #menuAdd
+            #enabled: #hasSingleSelectionChannel
+            #submenuChannel: #addMenu
+            #keepLinkedMenu: true
           )
          #(#MenuItem
             #label: 'Test'
@@ -1571,51 +874,11 @@
             #submenuChannel: #menuHistory
           )
          #(#MenuItem
-            #label: 'Help'
+            #label: '&Help'
             #translateLabel: true
-            #startGroup: #right
-            #submenu: 
-           #(#Menu
-              #(
-               #(#MenuItem
-                  #label: 'Documentation'
-                  #translateLabel: true
-                  #value: #openHTMLDocument:
-                  #activeHelpKey: #helpTutorial
-                  #argument: 'tools/uipainter/MenuEditor.html'
-                )
-               #(#MenuItem
-                  #label: '-'
-                )
-               #(#MenuItem
-                  #label: 'Help Tool'
-                  #translateLabel: true
-                  #value: #openHTMLDocument:
-                  #activeHelpKey: #helpHelpTool
-                  #argument: 'tools/uipainter/HelpTool.html'
-                )
-               #(#MenuItem
-                  #label: '-'
-                )
-               #(#MenuItem
-                  #label: 'Show Help Texts'
-                  #translateLabel: true
-                  #activeHelpKey: #helpShowHelp
-                  #indication: #showingHelp:
-                )
-               #(#MenuItem
-                  #label: '-'
-                )
-               #(#MenuItem
-                  #label: 'About MenuEditor...'
-                  #translateLabel: true
-                  #value: #openAboutThisApplication
-                  #activeHelpKey: #aboutThisAppliaction
-                )
-               )
-              nil
-              nil
-            )
+            #activeHelpKey: #help
+            #submenuChannel: #helpMenu
+            #keepLinkedMenu: true
           )
          )
         nil
@@ -1623,93 +886,7 @@
       )
 !
 
-menuAdd
-    "This resource specification was automatically generated
-     by the MenuEditor of ST/X."
-
-    "Do not manually edit this!! If it is corrupted,
-     the MenuEditor may not be able to read the specification."
-
-    "
-     MenuEditor new openOnClass:MenuEditor andSelector:#menuAdd
-     (Menu new fromLiteralArrayEncoding:(MenuEditor menuAdd)) startUp
-    "
-
-    <resource: #menu>
-
-    ^
-     
-       #(#Menu
-          
-           #(
-             #(#MenuItem
-                #label: 'Menu Item'
-                #translateLabel: true
-                #value: #doCreateItem
-                #activeHelpKey: #addMenuItem
-                #labelImage: #(#ResourceRetriever #MenuEditor #menuItemImage 'Menu Item')
-            )
-             #(#MenuItem
-                #label: 'Menu Separator'
-                #translateLabel: true
-                #value: #doCreateSep
-                #activeHelpKey: #addMenuSeparator
-                #labelImage: #(#ResourceRetriever #MenuEditor #menuSeparatorImage 'Menu Separator')
-            )
-             #(#MenuItem
-                #label: '-'
-            )
-             #(#MenuItem
-                #label: 'Submenu'
-                #translateLabel: true
-                #value: #doCreateMenu
-                #activeHelpKey: #addSubMenu
-                #labelImage: #(#ResourceRetriever #MenuEditor #submenuImage 'Submenu')
-            )
-             #(#MenuItem
-                #label: 'Submenu Link'
-                #translateLabel: true
-                #value: #doCreateLink
-                #activeHelpKey: #addSubMenuLink
-                #labelImage: #(#ResourceRetriever #MenuEditor #linkSubmenuImage 'Submenu Link')
-            )
-             #(#MenuItem
-                #label: '-'
-            )
-             #(#MenuItem
-                #label: 'Standard Submenu'
-                #translateLabel: true
-                #submenu: 
-                 #(#Menu
-                    
-                     #(
-                       #(#MenuItem
-                          #label: 'Standard Menu: File'
-                          #translateLabel: true
-                          #value: #doCreateStandardFileMenu
-                      )
-                       #(#MenuItem
-                          #label: 'Standard Menu: Edit'
-                          #translateLabel: true
-                          #value: #doCreateStandardEditMenu
-                      )
-                       #(#MenuItem
-                          #label: 'Standard Menu: Help'
-                          #translateLabel: true
-                          #value: #doCreateStandardHelpMenu
-                      )
-                    ) nil
-                    nil
-                )
-            )
-          ) nil
-          nil
-      )
-
-    "Modified: / 23.8.1998 / 15:48:21 / cg"
-!
-
-menuDefaultLink
+standardMenus
     "This resource specification was automatically generated
      by the MenuEditor of ST/X."
 
@@ -1717,26 +894,37 @@
      the MenuEditor may not be able to read the specification."
 
     "
-     MenuEditor new openOnClass:MenuEditor andSelector:#menuDefaultLink
-     (Menu new fromLiteralArrayEncoding:(MenuEditor menuDefaultLink)) startUp
+     MenuEditor new openOnClass:MenuEditor andSelector:#standardMenus
+     (Menu new fromLiteralArrayEncoding:(MenuEditor standardMenus)) startUp
     "
 
     <resource: #menu>
 
-    ^
-
-       #(#Menu
-
-           #(
-             #(#MenuItem
-                #'label:' '!!!! derives from application !!!!'
-            )
-          ) nil
-          nil
+    ^ 
+     #(#Menu
+	#(
+	 #(#MenuItem
+	    #label: 'Standard Menu: Edit'
+	    #translateLabel: true
+	    #value: #doCreateStandardEditMenu
+	  )
+	 #(#MenuItem
+	    #label: 'Standard Menu: Help'
+	    #translateLabel: true
+	    #value: #doCreateStandardHelpMenu
+	  )
+	 #(#MenuItem
+	    #label: 'Standard Menu: File'
+	    #translateLabel: true
+	    #value: #doCreateStandardFileMenu
+	  )
+	 )
+	nil
+	nil
       )
 !
 
-menuEdit
+toolbar
     "This resource specification was automatically generated
      by the MenuEditor of ST/X."
 
@@ -1744,133 +932,8 @@
      the MenuEditor may not be able to read the specification."
 
     "
-     MenuEditor new openOnClass:MenuEditor andSelector:#menuEdit
-     (Menu new fromLiteralArrayEncoding:(MenuEditor menuEdit)) startUp
-    "
-
-    <resource: #menu>
-
-    ^
-     
-       #(#Menu
-          
-           #(
-             #(#MenuItem
-                #label: 'Cut'
-                #translateLabel: true
-                #value: #doCut
-                #activeHelpKey: #editCut
-                #enabled: #hasValidSelection
-            )
-             #(#MenuItem
-                #label: 'Copy'
-                #translateLabel: true
-                #value: #doCopy
-                #activeHelpKey: #editCopy
-                #enabled: #hasValidSelection
-            )
-             #(#MenuItem
-                #label: 'Paste'
-                #translateLabel: true
-                #value: #doPaste
-                #activeHelpKey: #editPaste
-                #enabled: #valueOfCanPaste
-            )
-             #(#MenuItem
-                #label: 'Delete'
-                #translateLabel: true
-                #value: #doDelete
-                #activeHelpKey: #editDelete
-                #enabled: #hasValidSelection
-            )
-             #(#MenuItem
-                #label: '-'
-            )
-             #(#MenuItem
-                #label: 'Move Up'
-                #translateLabel: true
-                #value: #doStepUp
-                #activeHelpKey: #editMoveUp
-                #enabled: #valueOfEnableMovingUpOrDown
-                #labelImage: #(#ResourceRetriever #Icon #upIcon 'Move Up')
-            )
-             #(#MenuItem
-                #label: 'Move Down'
-                #translateLabel: true
-                #value: #doStepDown
-                #activeHelpKey: #editMoveDown
-                #enabled: #valueOfEnableMovingUpOrDown
-                #labelImage: #(#ResourceRetriever #Icon #downIcon 'Move Down')
-            )
-             #(#MenuItem
-                #label: 'Move In'
-                #translateLabel: true
-                #value: #doStepIn
-                #activeHelpKey: #editMoveIn
-                #enabled: #valueOfEnableMovingIn
-                #labelImage: #(#ResourceRetriever #Icon #downRightIcon 'Move In')
-            )
-             #(#MenuItem
-                #label: 'Move Out'
-                #translateLabel: true
-                #value: #doStepOut
-                #activeHelpKey: #editMoveOut
-                #enabled: #valueOfEnableMovingOut
-                #labelImage: #(#ResourceRetriever #Icon #leftDownIcon 'Move Out')
-            )
-          ) nil
-          nil
-      )
-!
-
-menuEditImage
-    "This resource specification was automatically generated
-     by the MenuEditor of ST/X."
-
-    "Do not manually edit this!! If it is corrupted,
-     the MenuEditor may not be able to read the specification."
-
-    "
-     MenuEditor new openOnClass:MenuEditor andSelector:#menuEditImage
-     (Menu new fromLiteralArrayEncoding:(MenuEditor menuEditImage)) startUp
-    "
-
-    <resource: #menu>
-
-    ^
-     
-       #(#Menu
-          
-           #(
-             #(#MenuItem
-                #label: 'Edit'
-                #translateLabel: true
-                #value: #doEditImage
-                #activeHelpKey: #editCut
-                #enabled: #hasValidSelection
-            )
-             #(#MenuItem
-                #label: 'Remove'
-                #translateLabel: true
-                #value: #doRemoveImage
-                #activeHelpKey: #editCopy
-                #enabled: #hasValidSelection
-            )
-          ) nil
-          nil
-      )
-!
-
-menuToolbar
-    "This resource specification was automatically generated
-     by the MenuEditor of ST/X."
-
-    "Do not manually edit this!! If it is corrupted,
-     the MenuEditor may not be able to read the specification."
-
-    "
-     MenuEditor new openOnClass:MenuEditor andSelector:#menuToolbar
-     (Menu new fromLiteralArrayEncoding:(MenuEditor menuToolbar)) startUp
+     MenuEditor new openOnClass:MenuEditor andSelector:#toolbar
+     (Menu new fromLiteralArrayEncoding:(MenuEditor toolbar)) startUp
     "
 
     <resource: #menu>
@@ -1879,18 +942,12 @@
      #(#Menu
         #(
          #(#MenuItem
-            #label: 'New'
-            #isButton: true
-            #value: #doNew
-            #activeHelpKey: #fileNew
-            #labelImage: #(#ResourceRetriever #Icon #newIcon)
-          )
-         #(#MenuItem
             #label: 'Load'
             #isButton: true
             #value: #doLoad
             #activeHelpKey: #fileLoad
             #labelImage: #(#ResourceRetriever #Icon #loadIcon)
+            #submenuChannel: #menuHistory
           )
          #(#MenuItem
             #label: 'Save'
@@ -1907,7 +964,7 @@
             #isButton: true
             #value: #doCut
             #activeHelpKey: #editCut
-            #enabled: #hasValidSelection
+            #enabled: #hasSelectionChannel
             #labelImage: #(#ResourceRetriever #Icon #cutIcon)
           )
          #(#MenuItem
@@ -1915,7 +972,7 @@
             #isButton: true
             #value: #doCopy
             #activeHelpKey: #editCopy
-            #enabled: #hasValidSelection
+            #enabled: #hasSelectionChannel
             #labelImage: #(#ResourceRetriever #Icon #copyIcon)
           )
          #(#MenuItem
@@ -1927,87 +984,104 @@
             #labelImage: #(#ResourceRetriever #Icon #pasteIcon)
           )
          #(#MenuItem
-            #label: 'Delete'
-            #isButton: true
-            #value: #doDelete
-            #activeHelpKey: #editDelete
-            #enabled: #hasValidSelection
-            #labelImage: #(#ResourceRetriever #Icon #deleteIcon)
-          )
-         #(#MenuItem
             #label: ''
           )
          #(#MenuItem
-            #label: 'Add Item'
-            #isButton: true
-            #value: #doCreateItem
-            #activeHelpKey: #addMenuItem
-            #enabled: #hasAnySingleSelection
-            #labelImage: #(#ResourceRetriever nil #menuItemImage)
-          )
-         #(#MenuItem
             #label: 'Add Separator'
             #isButton: true
             #value: #doCreateSep
             #activeHelpKey: #addMenuSeparator
-            #enabled: #hasAnySingleSelection
-            #labelImage: #(#ResourceRetriever nil #menuSeparatorImage)
+            #enabled: #hasSingleSelectionChannel
+            #labelImage: #(#ResourceRetriever #'MenuEditor::Item' #iconSeparator)
           )
          #(#MenuItem
-            #label: 'Add Submenu'
+            #label: 'Add Item'
+            #isButton: true
+            #value: #doCreateItem
+            #activeHelpKey: #addMenuItem
+            #enabled: #hasSingleSelectionChannel
+            #labelImage: #(#ResourceRetriever #'MenuEditor::Item' #iconItem)
+          )
+         #(#MenuItem
+            #label: 'Add Menu'
             #isButton: true
             #value: #doCreateMenu
             #activeHelpKey: #addSubMenu
-            #enabled: #hasAnySingleSelection
-            #labelImage: #(#ResourceRetriever nil #submenuImage)
+            #enabled: #hasSingleSelectionChannel
+            #labelImage: #(#ResourceRetriever #'MenuEditor::Item' #iconMenu)
+            #submenuChannel: #standardMenus
+            #keepLinkedMenu: true
           )
          #(#MenuItem
-            #label: 'Add Linked Submenu'
+            #label: 'Add Linked Menu'
             #isButton: true
-            #value: #doCreateLink
+            #value: #doCreateLinkedMenu
             #activeHelpKey: #addSubMenuLink
-            #enabled: #hasAnySingleSelection
-            #labelImage: #(#ResourceRetriever nil #linkSubmenuImage)
+            #enabled: #hasSingleSelectionChannel
+            #labelImage: #(#ResourceRetriever #'MenuEditor::Item' #iconLinkedMenu)
           )
          #(#MenuItem
             #label: ''
           )
          #(#MenuItem
+            #label: 'Add Delayed Menu'
+            #isButton: true
+            #value: #doCreateDelayedMenu:
+            #activeHelpKey: #addDelayedMenu
+            #enabled: #canCreateDelayedMenuChannel
+            #argument: #menu
+            #labelImage: #(#ResourceRetriever #'MenuEditor::Item' #iconDelayedMenu)
+          )
+         #(#MenuItem
+            #label: 'Add Delayed Linked Menu'
+            #isButton: true
+            #value: #doCreateDelayedMenu:
+            #activeHelpKey: #addDelayedSubMenuLink
+            #enabled: #canCreateDelayedMenuChannel
+            #argument: #linkedMenu
+            #labelImage: #(#ResourceRetriever #'MenuEditor::Item' #iconDelayedLinkedMenu)
+          )
+         #(#MenuItem
             #label: 'Move Up'
             #isButton: true
-            #value: #doStepUp
+            #startGroup: #right
+            #value: #doMoveUpOrDown:
             #activeHelpKey: #editMoveUp
             #enabled: #valueOfEnableMovingUpOrDown
+            #argument: #up
             #labelImage: #(#ResourceRetriever #Icon #upIcon)
           )
          #(#MenuItem
             #label: 'Move Down'
             #isButton: true
-            #value: #doStepDown
+            #value: #doMoveUpOrDown:
             #activeHelpKey: #editMoveDown
             #enabled: #valueOfEnableMovingUpOrDown
+            #argument: #down
             #labelImage: #(#ResourceRetriever #Icon #downIcon)
           )
          #(#MenuItem
             #label: 'Move In'
             #isButton: true
-            #value: #doStepIn
+            #value: #doMoveIn:
             #activeHelpKey: #editMoveIn
             #enabled: #valueOfEnableMovingIn
+            #argument: #inNext
             #labelImage: #(#ResourceRetriever #Icon #downRightIcon)
           )
          #(#MenuItem
             #label: 'Move In Above'
             #isButton: true
-            #value: #doStepInAbove
+            #value: #doMoveIn:
             #activeHelpKey: #editMoveInAbove
             #enabled: #valueOfEnableMovingInAbove
+            #argument: #inPrev
             #labelImage: #(#ResourceRetriever #Icon #upRightIcon)
           )
          #(#MenuItem
             #label: 'Move Out'
             #isButton: true
-            #value: #doStepOut
+            #value: #doMoveOut
             #activeHelpKey: #editMoveOut
             #enabled: #valueOfEnableMovingOut
             #labelImage: #(#ResourceRetriever #Icon #leftDownIcon)
@@ -2018,567 +1092,620 @@
       )
 ! !
 
-!MenuEditor class methodsFor:'queries'!
-
-getAllImageSelectorsFrom: aClass
-    "returns all image selectors implementing an image spec in class aClass"
-
-     |iconClass imageMethodSelectors r|
-
-     aClass isNil ifTrue:[
-        ^ #()
-     ].
-
-     aClass isSymbol 
-        ifTrue:  [iconClass := Smalltalk at: aClass]
-        ifFalse: [iconClass := aClass].
-     aClass isBehavior ifFalse:[
-        ^ #()
-     ].
-
-     imageMethodSelectors := OrderedCollection new.
-
-     iconClass withAllSuperclassesDo:[:cls |
-        cls class selectorsAndMethodsDo:[:sel :m | 
-            ((r := m resourceType) == #image
-            or:[r == #programImage]) ifTrue:[
-                imageMethodSelectors add:sel
-            ]
-        ]
-     ].
-
-     ^ imageMethodSelectors sort
-
-    "Modified: / 24.8.1998 / 21:42:34 / cg"
-    "Created: / 24.8.1998 / 21:53:20 / cg"
-! !
-
-!MenuEditor class methodsFor:'slices'!
-
-slicesItem
-    ^#(
-            (Basics     basicsItemSpec)
-            (Details    detailsEditSpec)
-            (Image      imageEditSpec)
+!MenuEditor class methodsFor:'menu specs - standard'!
+
+standardEditMenu
+    "This resource specification was automatically generated
+     by the MenuEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:MenuEditor andSelector:#standardEditMenu
+     (Menu new fromLiteralArrayEncoding:(MenuEditor standardEditMenu)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(#Menu
+	#(
+	 #(#MenuItem
+	    #label: 'Copy'
+	    #translateLabel: true
+	    #value: #copySelection
+	  )
+	 #(#MenuItem
+	    #label: 'Cut'
+	    #translateLabel: true
+	    #value: #cutSelection
+	  )
+	 #(#MenuItem
+	    #label: 'Paste'
+	    #translateLabel: true
+	    #value: #paste
+	  )
+	 )
+	nil
+	nil
       )
-
-!
-
-slicesLink
-    ^#(
-            (Basics     basicsLinkSpec)
-            (Details    detailsEditSpec)
-            (Image      imageEditSpec)
-      )
-
 !
 
-slicesMenu
-    ^#(
-            (Basics     basicsMenuSpec)
-            (Details    detailsEditSpec)
-            (Image      imageEditSpec)
+standardFileMenu
+    "This resource specification was automatically generated
+     by the MenuEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:MenuEditor andSelector:#standardFileMenu
+     (Menu new fromLiteralArrayEncoding:(MenuEditor standardFileMenu)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(#Menu
+	#(
+	 #(#MenuItem
+	    #label: 'New'
+	    #translateLabel: true
+	    #value: #menuNew
+	  )
+	 #(#MenuItem
+	    #label: '-'
+	  )
+	 #(#MenuItem
+	    #label: 'Open...'
+	    #translateLabel: true
+	    #value: #menuOpen
+	  )
+	 #(#MenuItem
+	    #label: '-'
+	  )
+	 #(#MenuItem
+	    #label: 'Save'
+	    #translateLabel: true
+	    #value: #menuSave
+	  )
+	 #(#MenuItem
+	    #label: 'Save As...'
+	    #translateLabel: true
+	    #value: #menuSaveAs
+	  )
+	 #(#MenuItem
+	    #label: '-'
+	  )
+	 #(#MenuItem
+	    #label: 'Exit'
+	    #translateLabel: true
+	    #value: #closeRequest
+	  )
+	 )
+	nil
+	nil
       )
-
 !
 
-slicesRootMenu
-    ^#(
-            (Basics   basicsRootSpec)
+standardHelpMenu
+    "This resource specification was automatically generated
+     by the MenuEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:MenuEditor andSelector:#standardHelpMenu
+     (Menu new fromLiteralArrayEncoding:(MenuEditor standardHelpMenu)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(#Menu
+	#(
+	 #(#MenuItem
+	    #label: 'Documentation'
+	    #translateLabel: true
+	    #value: #openDocumentation
+	  )
+	 #(#MenuItem
+	    #label: '-'
+	  )
+	 #(#MenuItem
+	    #label: 'About this Application'
+	    #translateLabel: true
+	    #value: #openAboutThisApplication
+	  )
+	 )
+	nil
+	nil
       )
-
-!
-
-slicesSeparatorMenu
-    ^#(
-            (Basics   basicsSeparatorSpec)
-      )
-
 ! !
 
 !MenuEditor methodsFor:'accessing'!
 
-submenuTest
-    "return the submenu assigned to item test;
-     this is dynamically constructed, to reflect the current
-     edited menu."
-
-    |menu cls|
-
-    menu := treeView asMenu.
-    menu ifNotNil:[
-        (menu := treeView asMenu) allItemsDo:[:anItem|
-            anItem value:nil.
-            anItem enabled:true.
-        ].
-
-        cls := self resolveName:specClass.
-        menu findGuiResourcesIn:cls.
-        menu receiver:nil.
+helpTool
+    "get the help tool application
+    "
+  ^ wizards at:#help ifAbsentPut:[ |tool|
+	tool := UIHelpTool new createBuilder.
+	tool masterApplication:self.
+	tool modifiedHolder: self valueOfEnablingCommitButtons.
+	tool builder window:(ApplicationSubView new client:tool).
+	tool masterApplication:self.
+	tool
+    ]
+!
+
+imageTool
+    "get the image tool application
+    "
+  ^ wizards at:#image ifAbsentPut:[ |tool|
+	tool := ResourceEditor new createBuilder.
+	tool masterApplication:self.
+	tool modifiedChannel: self valueOfEnablingCommitButtons.
+	tool builder window:(ApplicationSubView new client:tool).
+	tool
+    ]
+!
+
+useHelpTool:aHelpTool
+    "take the help dictionaries from aHelpTool into my helpTool
+    "
+    |tool|
+
+    tool := self helpTool.
+
+    tool buildFromClass:(aHelpTool specClass).
+    tool   dictionaries:(aHelpTool dictionaries).
+    tool     dictionary:(aHelpTool dictionary).
+! !
+
+!MenuEditor methodsFor:'actions'!
+
+accept
+    "accept modifications
+    "
+    self accept:true.
+!
+
+accept:ok
+    "ok if true the modifications are accepted
+     than reload from item
+    "
+    |selectedItem rscRetrHolder helpKeyHolder helpTool imageTool acceptChannel|
+
+    selectedItem := self selectedItem.
+
+    selectedItem ifNotNil:[
+        self withoutNotifyDo:[
+            rscRetrHolder := aspects at:#resourceRetriever.
+            helpKeyHolder := aspects at:#activeHelpKey.
+            imageTool     := self imageTool.
+            helpTool      := self helpTool.
+            acceptChannel := self acceptChannel.
+
+            acceptChannel triggerValue:true.
+            acceptChannel setValue:false.
+
+            ok ifTrue:[
+                rscRetrHolder value:(imageTool resourceRetriever).
+                helpKeyHolder value:(helpTool  helpKey).
+                selectedItem  fromAspects:aspects.
+                modified := true.
+
+                selectedItem isRootItem ifTrue:[
+                    "/ update specSelector
+                    specSelector := selectedItem rawLabel.
+                ].    
+            ].
+            selectedItem toAspects:aspects.
+            helpTool     setHelpKey:(helpKeyHolder value).
+            imageTool    resourceRetriever:(rscRetrHolder value).
+        ]
     ].
-    ^ menu
+    self updateChannels.
+    self clearModified.
+!
+
+cancel
+    "reload aspects from current selected item; reset modification flag
+    "
+    self accept:false.
 !
 
-useHelpTool: aHelpTool
-    "take the help dictionaries from aHelpTool into my helpTool"
-
-    self helpTool buildFromClass: aHelpTool specClass.
-    self helpTool dictionaries:   aHelpTool dictionaries.
-    self helpTool dictionary:     aHelpTool dictionary
-
-
+indicatorClickedAt:atLine
+    "indicator clicked at line number; toggle expand of item at line
+    "
+    |item|
+
+    item := listOfItems at:atLine ifAbsent:nil.
+    item ifNotNil:[ item toggleExpand ].
 ! !
 
 !MenuEditor methodsFor:'aspects'!
 
-hasAnySingleSelection
-
-    ^builder booleanValueAspectFor: #hasAnySingleSelection
+canCreateDelayedMenuChannel
+    "boolean holder, true if the current selected item accepts a delayed menu
+    "
+    ^ builder booleanValueAspectFor:#canCreateDelayedMenuChannel
 !
 
-hasValidSelection
-
-    ^builder booleanValueAspectFor: #hasValidSelection
+hasSelectionChannel
+    "boolean holder, true if any item is selected
+    "
+    ^ builder booleanValueAspectFor:#hasSelectionChannel
 !
 
-listOfImages
-    "get a list of the images
+hasSingleSelectionChannel
+    "boolean holder, true if one item is selected
+    "
+    ^ builder booleanValueAspectFor:#hasSingleSelectionChannel
+!
+
+listOfItems
+    "returns the hierarchical list of menuItems
     "
-    |list|
-
-    (list := builder bindingAt:#listOfImages) isNil ifTrue:[
-        builder aspectAt:#listOfImages put: (list := List new).
-    ].
-    ^ list
-
-
+    ^ listOfItems
+!
+
+listOfTabs
+    "returns the list of current shown tab-labels retrieved
+     from the current selected item.
+    "
+    ^ listOfTabs
+!
+
+selectionHolder
+    "value holder, which keeps the current selected items
+    "
+    ^ selectionHolder
 !
 
-selectionOfImage
-    "get selection of list of the images as value"
-
+tabHolder
+    "value holder, which keeps the current selected tab label or nil
+    "
+    ^ tabHolder
+!
+
+wizardHolder
+    "holder, which keeps the current wizard window
+    "
     |holder|
-    (holder := builder bindingAt:#selectionOfImage) isNil ifTrue:[
-        builder aspectAt:#selectionOfImage put: (holder := nil asValue).
+
+    holder := builder bindingAt:#wizardHolder.
+
+    holder ifNil:[
+	holder := nil asValue.
+	builder aspectAt:#wizardHolder put:holder.
     ].
     ^ holder
-
-
-!
-
-tabCanvasHolder
-    "keep the canvas for the current selected item or nil
-    "
-    |holder|
-
-    (holder := builder bindingAt:#tabCanvasHolder) isNil ifTrue:[
-        builder aspectAt:#tabCanvasHolder put: (holder := ValueHolder new).
-    ].
-    ^ holder
-
-
-!
-
-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 := nil asValue).
-    ].
-    ^ holder
-
-
-!
-
-treeView
-    "get a tree view representing hierarchically the menu items"
-
-    ^ treeView
 ! !
 
 !MenuEditor methodsFor:'building'!
 
-buildFromClass:aClass andSelector:aSelector
-
-    self isStandAlone ifTrue:[
-        self helpTool buildFromClass:specClass
-    ].              
-    treeView buildFromClass: aClass andSelector: aSelector.
-
+buildFromClass:aSpecClass andSelector:aSpecSelector
+    "rebuild menu from a class and selector
+    "
+    |cls menu|
+
+    menu := nil.
+
+    self isStandAlone ifTrue:[ self helpTool buildFromClass:aSpecClass ].              
+
+    aSpecSelector notNil ifTrue:[
+	aSpecClass ifNotNil:[
+	    cls  := self resolveName:aSpecClass.
+	    menu := cls perform:aSpecSelector ifNotUnderstood:nil.
+
+	    menu ifNotNil:[
+		(menu isMemberOf:Menu) ifFalse:[
+		    menu := Menu new fromLiteralArrayEncoding:menu
+		].
+	    ]
+	].
+    ].
+    self buildFromMenu:menu selector:aSpecSelector.
+!
+
+buildFromMenu:aMenu selector:aSelector
+    "rebuild menu from a Menu
+    "
+    |root menu|
+
+    aMenu isCollection ifTrue:[menu := aMenu decodeAsLiteralArray]
+		      ifFalse:[menu := aMenu].
+
+    self valueOfEnablingCommitButtons value:false.
+    root := listOfItems root.
+
+    self withoutNotifyDo:[
+	selectionHolder setValue:#().
+	root menu:aMenu labeled:(aSelector ? specSelector).
+    ].
+    self selectedItem:root.
     self updateHistory.
-    self updateInfoLabel.
-
 !
 
 buildFromResourceSpec:aResourceSpec
-    |spec|
-
-    spec := aResourceSpec isCollection ifTrue:[aResourceSpec decodeAsLiteralArray]
-                                      ifFalse:[aResourceSpec].
-
-    self buildFromMenu:spec  
+    "rebuild menu from a resource spec
+    "
+    self buildFromMenu:aResourceSpec selector:nil
 ! !
 
 !MenuEditor methodsFor:'change & update'!
 
+selectedSuperItems
+    "returns collection of superItems derived from selection
+    "
+    |selection size root|
+
+    selectedSuperItems ifNotNil:[ ^ selectedSuperItems ].
+
+    selection := selectionHolder value.
+    size      := selection size.
+
+    size <= 1 ifTrue:[
+        selectedSuperItems := selection ? #().
+      ^ selectedSuperItems
+    ].
+
+    root := listOfItems root.
+
+    (selection includesIdentical:root) ifTrue:[
+        selectedSuperItems := Array with:root.
+      ^ selectedSuperItems  
+    ].
+    selectedSuperItems := OrderedCollection new.
+
+    selection do:[:anItem|
+        anItem parentsDetect:[:el| selection includesIdentical:el ]
+                      ifNone:[ selectedSuperItems add:anItem ].
+    ].
+    ^ selectedSuperItems
+!
+
+selectionChanged
+    "called if the selection has changed
+    "
+    |newTabList selection|
+
+    selection := selectionHolder value.
+
+    selection size == 1 ifTrue:[
+        selectedSuperItems := selection.
+
+        newTabList := selection first slices collect:[:el| '   ', el first, '   ' ].
+        newTabList = listOfTabs ifFalse:[
+            listOfTabs contents:newTabList.
+        ].
+    ] ifFalse:[
+        "must compute selected super items on request
+        "
+        selectedSuperItems := nil.
+    ].
+    self cancel.
+    self tabChanged.
+    self updateChannels.
+!
+
+tabChanged
+    "called if the tab changed
+    "
+    |tab selector item canvas wizardHolder|
+
+    wizardHolder := self wizardHolder.
+    item := self selectedItem.
+    item ifNil:[ ^ wizardHolder value:nil ].
+
+    tab := tabHolder value.
+
+    tab ifNotNil:[
+        tab := tab withoutSeparators.
+        tab := item slices detect:[:el| el first = tab ] ifNone:nil.
+    ].
+    tab ifNil:[
+        ^ tabHolder value:( listOfTabs at:1 ifAbsent:nil )
+    ].
+    selector := tab last.
+
+    selector == #help  ifTrue:[ ^ wizardHolder value:(self helpTool  window) ].
+    selector == #image ifTrue:[ ^ wizardHolder value:(self imageTool window) ].
+
+    canvas := wizards at:(item class name, selector) asSymbol
+              ifAbsentPut:[ SimpleView new client:self
+                                             spec:(item class perform:selector)
+                                          builder:(self builder)
+                          ].
+
+    wizardHolder value:canvas.
+!
+
 update:something with:aParameter from:changedObject
-    super update:something with:aParameter from:changedObject.
-
-    changedObject == (aspects at:#retriever) ifTrue:[
-        self updateImageView.
-    ].
-
-    "Modified: / 24.8.1998 / 21:47:48 / cg"
+    "Invoked when an object that I depend upon sends a change notification.
+    "
+    notifyDisabledCounter ~~ 0 ifTrue:[ ^ self ].
+
+    changedObject == selectionHolder ifTrue:[ ^ self selectionChanged ].
+    changedObject == tabHolder       ifTrue:[ ^ self tabChanged ].
+
+    super update:something with:aParameter from:changedObject
 !
 
 updateChannels
-    "update channels"
-
-    |node parent next prev state canPaste selectedNodes firstParent
-     enableMovingOut enableMovingIn indexOfLast|
-
-    enableMovingOut := enableMovingIn := false.
-
-    state := false.   
-    node  := treeView selectedNode.
-
-    node notNil ifTrue:[
-        "/ single node selected
-        self hasAnySingleSelection value:true.
-        canPaste := self valueOfCanPaste value.
-
-        (parent := node parent) notNil ifTrue:[
-            next := parent childAt:((parent indexOfChild:node) + 1).
-            prev := parent childAt:((parent indexOfChild:node) - 1).
-            self valueOfEnableMovingIn       value:(next notNil and:[next hasChildren]).
-            self valueOfEnableMovingInAbove  value:(prev notNil and:[prev hasChildren]).
-            self valueOfEnableMovingUpOrDown value:(parent children size > 1).
-            self valueOfEnableMovingOut      value:parent parent notNil.
-            self hasValidSelection           value:true.  
-            self valueOfCanPaste             value:canPaste. 
-          ^ self
-        ].
+    "update all channels
+    "
+    |selection sizeOfSel selectedItem|
+
+    super updateChannels.
+
+    selection := selectionHolder value.
+    sizeOfSel := selection size.
+
+    sizeOfSel == 1 ifTrue:[selectedItem := selection at:1]
+		  ifFalse:[selectedItem := nil].
+
+    self hasSelectionChannel       value:(sizeOfSel ~~ 0).
+    self hasSingleSelectionChannel value:(selectedItem notNil).
+
+    selectedItem isNil ifTrue:[
+	self valueOfEnableMovingIn       value:false.
+	self valueOfEnableMovingOut      value:false.
+	self valueOfEnableMovingUpOrDown value:false.
+	self valueOfEnableMovingInAbove  value:false.
+	self canCreateDelayedMenuChannel value:false.
     ] ifFalse:[
-        "/ multiple nodes selected
-        canPaste := false.
-
-        self hasAnySingleSelection value:false.
-
-        treeView numberOfSelections ~~ 0 ifTrue:[
-            canPaste := false.
-            state    := (treeView isInSelection:1) not.
-
-            selectedNodes := treeView selectedNodes.
-
-            "/ see if all selected nodes have a common parent.
-            firstParent := selectedNodes first parent.
-            (selectedNodes conform:[:eachNode | eachNode parent == firstParent]) ifTrue:[
-                "/ yes - they have
-"/               next := firstParent childAt:((firstParent indexOfChild:node) + 1).
-"/               self valueOfEnableMovingIn       value:(next notNil and:[next hasChildren]).
-                enableMovingOut := firstParent parent notNil.
-"/ self halt.
-
-                indexOfLast := (selectedNodes collect:[:eachNode | firstParent indexOfChild:eachNode]) max.
-                next := firstParent childAt:(indexOfLast + 1).
-                enableMovingIn := (next notNil and:[next hasChildren]).
-            ] ifFalse:[
-"/ self halt.
-            ].
-        ]
-    ].          
-    self valueOfEnableMovingUpOrDown value:false.
-    self valueOfEnableMovingIn       value:enableMovingIn.
-    self valueOfEnableMovingOut      value:enableMovingOut.
-    self hasValidSelection           value:state.     
-    self valueOfCanPaste             value:canPaste. 
-!
-
-updateImageView
-    "update the image view
-    "
-    |cls newList icon|
-
-    self isImageViewSelected ifFalse:[
-        ^ self
+	self valueOfEnableMovingUpOrDown value:(selectedItem canMoveUpOrDown).
+	self valueOfEnableMovingOut      value:(selectedItem canMoveOut).
+	self valueOfEnableMovingIn       value:(selectedItem canMoveInNext).
+	self valueOfEnableMovingInAbove  value:(selectedItem canMoveInAbove).
+	self canCreateDelayedMenuChannel value:(selectedItem canAddDelayedMenu).
     ].
-    cls := self currentImageRetrieverClass.
-
-    lastImageRetriever == cls ifTrue:[
-        newList := self listOfImages
-    ] ifFalse:[
-        cls notNil ifTrue:[
-            self withWaitCursorDo:[
-                lastImageRetriever := cls.
-
-                newList := self class getAllImageSelectorsFrom:cls.
-                newList := newList collect: [:sel| |img| 
-                                img := cls perform: sel. 
-                                img height > 32 ifTrue:[
-                                    img := img magnifiedBy: 32 / img extent y
-                                ].
-                                LabelAndIcon icon:img string:sel
-                           ].
-                ].
-        ] ifFalse:[
-            newList := #()
-        ].
-        self listOfImages contents:newList.
-    ].
-
-    icon := (aspects at:#icon) value.
-
-    icon notNil ifTrue:[
-        icon := newList detect:[:el| el string == icon] ifNone:nil.
-    ].
-    self selectionOfImage value:icon.
 ! !
 
 !MenuEditor methodsFor:'defaults'!
 
 aboutImage
     "the image to be displayed in my about-box;
-     If nil is returned, thhe ST/X default image is used."
-
-    ^ Image fromFile:'bitmaps/xpmBitmaps/misc_tools/setup_menus.xpm'
-
-    "Created: / 25.7.1998 / 20:48:12 / cg"
-    "Modified: / 27.7.1998 / 10:21:55 / cg"
-! !
-
-!MenuEditor methodsFor:'event handling'!
-
-doesNotUnderstand: aMessage
-    "detour incoming messages to the tree view"
-
-    ^ aMessage sendTo:treeView
-! !
-
-!MenuEditor methodsFor:'private'!
-
-currentImageRetrieverClass
-    "returns the current class which provides the images dependent on
-     the retriver or the current spec.
+     If nil is returned, the ST/X default image is used.
     "
-    |clsName|
-
-    clsName := (aspects at: #retriever) value.
-
-    clsName size == 0 ifTrue:[
-        clsName := specClass.
-        clsName isNil ifTrue:[^ nil].
-    ].
-    ^ Smalltalk at:clsName ifAbsent:nil
-!
-
-helpKey
-    "get the help key of the selected menu item"
-
-    |node|
-
-    (node := treeView selectedNode) notNil ifTrue:[
-        ^ node contents activeHelpKey
-    ].
-    ^ nil
-!
-
-helpTool
-    "get the help tool application
+    ^ self class aboutImage
+! !
+
+!MenuEditor methodsFor:'drag & drop'!
+
+canDrop:aContext
+    "return true, if the DropContext can be dropped into
+     the hierachical list of items
     "
-    |helpView helpTool|
-
-    helpTool := listOfCanvas at:#help ifAbsent:nil.
-
-    helpTool isNil ifTrue:[
-        helpTool := UIHelpTool new createBuilder.
-        helpTool masterApplication:self.
-        helpTool modifiedHolder: self valueOfEnablingCommitButtons.
-        helpView := ApplicationSubView new client:helpTool.
-        helpTool builder window:helpView.
-        helpTool masterApplication:self.
-        listOfCanvas at:#help put:helpTool.
+    |objects modified|
+
+    modified := self valueOfEnablingCommitButtons value.
+    modified ifTrue:[^ false].
+
+    self selectedItem ifNil:[^ false].
+
+    aContext sourceWidget == aContext targetWidget ifTrue:[
+	^ false
     ].
-    ^ helpTool
-
-
-! !
-
-!MenuEditor methodsFor:'queries'!
-
-isHelpToolSelected
-    "return true if current selection is help tool
+
+    objects := aContext dropObjects.
+    objects isEmpty ifTrue:[ ^ false ].
+
+    objects do:[:el|
+	el theObject class == MenuItem ifFalse:[^ false].
+    ].
+    ^ true
+!
+
+doDrop:aDropContext
+    "drop the DropContext into the hierachical list of items
     "
-    ^ typeOfCanvas == #help
-
-!
-
-isImageViewSelected
-    "return true if current selection is help tool
-    "
-    ^ typeOfCanvas == #imageEditSpec
-
-!
-
-preferredExtent
-
-    ^super preferredExtent max: (Screen current width//3)@(Screen current height//2.5)
-
-
-! !
-
-!MenuEditor methodsFor:'selection'!
-
-imageSelected
-    |imgSel|
-
-    imgSel := self selectionOfImage value.
-    imgSel notNil ifTrue:[
-        (aspects at: #icon) value: imgSel string
-    ]
+    |objects|
+
+    (self canDrop:aDropContext) ifFalse:[^ false].
+
+    objects := aDropContext dropObjects collect:[:el| el theObject ].
+    self doPaste:objects.
+  ^ true
 !
 
-menuChanged
-
-    |node item myClass oldLabel oldSlices newList index|
-
-    node := treeView selectedNode.
-
-    node isNil ifTrue:[
-        slices := nil.
-        index  := 0.
-    ] ifFalse:[
-        oldSlices := slices.
-        myClass   := self class.
-        item      := node contents.
-
-        item isSeparator ifFalse:[
-            node parent isNil ifFalse:[
-                node hasChildren ifTrue:[
-                    slices := #slicesMenu
-                ] ifFalse:[
-                    item submenuChannel isNil ifTrue:[slices := #slicesItem]
-                                             ifFalse:[slices := #slicesLink]
-                ].
-                slices := listOfSlices at:slices
-                              ifAbsentPut:[(myClass perform:slices) copyWith:#('Help' #help)].
-            ] ifTrue:[
-                slices := listOfSlices at:#slicesRootMenu
-                              ifAbsentPut:[myClass perform:#slicesRootMenu].
-            ].
-        ] ifTrue:[
-            slices := myClass perform:#slicesSeparatorMenu.
-        ].
-        index := tabSelection ? 0.
-
-        slices ~~ oldSlices ifTrue:[
-            tabSelection := 0.
-            typeOfCanvas := 0.
-
-            self tabCanvasHolder value:nil.
-
-            newList := slices collect:[:el| el first].
-
-            index ~~ 0 ifTrue:[
-                oldLabel := self tabList value at:index ifAbsent:nil.
-
-                oldLabel notNil ifTrue:[
-                    index := newList indexOf:oldLabel.
-                ]
-            ].
-            self tabList value:newList.
-        ].
-        index := index max:1.
+dropObjects
+    "returns list of DropObjects
+    "
+    |obj items|
+
+    items := self selectedSuperItems.
+    items isEmpty ifTrue:[ ^ nil ].
+
+  ^ items collect:[:el|
+        obj := DropObject new:(el menuItem).
+        obj displayObject:(el rawLabel).
+        obj
     ].
-    self tabModel value:index.
-    aspects do:[:a| a removeDependent:self].
-    self cancel.
-    self updateChannels.
-    aspects do:[:a| a addDependent:self].
-
-!
-
-tabSelection:aSelection
-    "put the section aSelection into the note book
+! !
+
+!MenuEditor methodsFor:'event processing'!
+
+processEvent:anEvent
+    "filter keyboard edit-events typed into the listOfItemsView
     "
-    |view|
-
-    aSelection = tabSelection ifTrue:[^self].
-
-    (tabSelection := aSelection) isNil ifTrue:[
-        tabSelection == 0 ifTrue:[^ self].
-        tabSelection := 0.
+    |evView inView rawKey key|
+
+    anEvent isKeyPressEvent ifFalse:[^ false].
+
+    evView := anEvent targetView.
+    evView ifNil:[ ^ false ].
+
+    inView := evView isSameOrComponentOf:listOfItemsView.
+    inView ifFalse:[^ false].
+
+    key    := anEvent key.
+    rawKey := anEvent rawKey.
+
+    (    key == #Delete
+     or:[key == #BackSpace
+     or:[key == #Cut]]
+    ) ifTrue:[
+        self doCut.
+      ^ true.  
     ].
 
-    "/ before bringing up the new notebook page,
-    "/ we must disable all now invisible input fields ...
-    "/ (otherwise, those would fire on #accept.
-
-    (view := self tabCanvasHolder value) notNil ifTrue:[
-        view allSubViewsDo:[:aComponent |
-            aComponent isInputField ifTrue:[
-                aComponent disableIfInvisible:true
-            ]
-        ]
-    ].
-
-    tabSelection == 0 ifTrue:[
-        ^ self tabCanvasHolder value:nil.
+    key == #Copy  ifTrue:[ self doCopy.  ^ true ].
+    key == #Paste ifTrue:[ self doPaste. ^ true ].
+
+  ^ false
+! !
+
+!MenuEditor methodsFor:'initialization & release'!
+
+closeRequest
+    "ask for modification
+    "
+    self valueOfEnablingCommitButtons value ifTrue:[
+        modified := true.
+        self askForListModification.
+        modified ifTrue:[^ self].
+        self clearModified.
     ].
-
-    typeOfCanvas := (slices at:tabSelection) last.
-
-    self isHelpToolSelected ifTrue:[
-        view := self helpTool window.
-    ] ifFalse:[
-        self updateImageView.
-
-        view := listOfCanvas at:typeOfCanvas
-                    ifAbsentPut:[SimpleView new client:self spec:typeOfCanvas builder:(self builder)].
-    ].
-    self tabCanvasHolder value:view.
-
-! !
-
-!MenuEditor methodsFor:'startup / release'!
+    ^ super closeRequest
+!
 
 initialize
-    "initialize value holders for the attributes of the menu components"
-
-    |holder|
-
+    "setup aspects, ...
+    "
     super initialize.
-
-    aspects at:#seperatorSelection put:(holder := SelectionInList new).
-    holder list: Item separatorList.
-    holder addDependent:self.
-
-    listOfCanvas := IdentityDictionary new.
-    listOfSlices := IdentityDictionary new.
-
-    treeView := TreeView new.
-    treeView action:[:dummy| self menuChanged ].
-
-    aspects at:#indicationEnabled  put:(BlockValue 
-                                            with:[:a | a size == 0]
-                                            argument:(aspects at:#choice)).
-    aspects at:#choiceEnabled      put:(BlockValue
-                                            with:[:a | a size == 0]
-                                            argument:(aspects at:#indication)).
-    aspects at:#choiceValueEnabled put:(BlockValue
-                                            with:[:a | a size > 0]
-                                            argument:(aspects at:#choice)).
-
-    aspects at:#retrieverClassList put:self class imageRetrieverClasses asValue.
-
-    aspects do: [:holder| holder addDependent:self].
+    notifyDisabledCounter := 0.
+
+    Item withAllSubclasses do:[:aClass|
+        aClass addBindingsTo:aspects for:self.
+    ].
+
+    selectionHolder    := #() asValue.
+    selectionHolder addDependent:self.
+
+    listOfItems := HierarchicalList new.
+    listOfItems application:self.
+    listOfItems root:(ItemRoot new).
+
+    tabHolder := nil asValue.
+    tabHolder addDependent:self.
+
+    listOfTabs := List new.
+    wizards    := IdentityDictionary new.
 !
 
-openModalOnMenu: aMenu
-    "build a tree from aMenu and open it modal"
-
-    super openModalOnResourceSpec: aMenu
+openModalOnMenu:aMenu
+    "build a tree from aMenu and open it modal
+    "
+    self openModalOnResourceSpec:aMenu
+!
+
+postBuildListOfItemsView:aView
+    listOfItemsView := aView.
 !
 
 postOpenWith:aBuilder
@@ -2586,146 +1713,222 @@
     "
     super postOpenWith: aBuilder.
     aBuilder keyboardProcessor menuBar:nil.
+    self windowGroup addPreEventHook:self.
 ! !
 
-!MenuEditor methodsFor:'user actions'!
-
-accept
-    "invoked by button 'OK' and by save requests of menu item changes"
-
-    |node item|
-
-    super accept.
-
-    (node := treeView selectedNode) notNil ifTrue:[
-        item := node contents.
-
-        self isHelpToolSelected ifTrue:[
-            self helpTool accept.
-            item activeHelpKey: self helpTool helpKey.
-            self valueOfEnablingCommitButtons value: false.
-            self clearModifiedFlag.
-        ] ifFalse:[
-            item buildFromAspects:aspects.
-            node changed.
-            specSelector := treeView selectorName.
-        ]
-    ].   
-    self updateInfoLabel.
-
+!MenuEditor methodsFor:'private'!
+
+addAndSelect:aNoneArgBlockOrItem
+    "add an item(s) derived from the block; test if add operation
+     is enabled. On success the new item(s) are returned otherwise nil.
+    "
+    |intoItem index newItem|
+
+    intoItem := self selectedItem.
+    intoItem ifNil:[ ^ nil].
+
+    self askForItemModification ifFalse:[ ^ nil ].
+
+    index := 1.
+
+    (     intoItem canAddChildren
+     and:[(intoItem isExpanded or:[intoItem isDelayedMenu]) ]
+    ) ifFalse:[
+	[ intoItem parent canAddChildren ] whileFalse:[
+	    intoItem := intoItem parent.
+	].
+	index := intoItem parent identityIndexOf:intoItem.
+	index := index + 1.
+	intoItem := intoItem parent.
+    ].
+    newItem := aNoneArgBlockOrItem value.
+
+    newItem ifNotNil:[
+	selectionHolder setValue:nil.
+	intoItem expand.
+
+	newItem isCollection ifTrue:[
+	    intoItem addAll:newItem beforeIndex:index.
+	    selectionHolder value:newItem.
+	] ifFalse:[
+	    intoItem add:newItem beforeIndex:index.
+	    selectionHolder value:(Array with:newItem).
+	].
+	modified := true.
+    ].
+    ^ newItem
 !
 
-cancel
-    "invoked by button 'Cancel'"
-    |node item|
-
-    node := treeView selectedNode.
-
-    aspects keysAndValuesDo:[:aKey :anAspect|
-        aKey ~~ #retrieverClassList ifTrue:[
-            anAspect setValue:''.  "/ to clear the field.
-            anAspect value:''
-        ]
-    ].
-
-    node notNil ifTrue:[
-        item := node contents.
-        item toAspects:aspects.
-        self helpTool helpKey:(item activeHelpKey).
-    ].
-    self updateImageView.
+clearModified
+    "clear the modifiedChannel and the commitPanel
+    "
     self valueOfEnablingCommitButtons value:false.
     self clearModifiedFlag.
 !
 
-doBrowseForImageResource
-    "opens a browser on image-resource methods"
-
-    |msg currClass w cls sel|
-
-    currClass := self currentImageRetrieverClass.
-    msg := 
-        (ResourceSelectionBrowser
-            request: 'Use Image From Class'
-            onSuperclass: nil
-            andClass: currClass
-            andSelector: (aspects at: #icon)
-            withResourceTypes: #(image fileImage programImage)).
-
-    msg notNil ifTrue:[
-        (w := msg asCollectionOfWords) size == 2 ifTrue:[
-            cls := w at:1.
-            sel := w at:2.
-            cls ~= currClass ifTrue:[
-                (aspects at: #retriever) value:cls asSymbol.
+generateMenuSpec
+    "generate and returns the current menu spec or nil
+    "
+    |menu spec|
+
+    menu := listOfItems root submenu.
+    menu ifNil:[^ nil].
+    menu := menu literalArrayEncoding.
+    spec := WriteStream on:String new.
+    UISpecification prettyPrintSpecArray:menu on:spec indent:5.
+  ^ spec contents.
+!
+
+submenuTest
+    "returns a menu on the current editing menu
+    "
+    |menu indication choice submenu retriever|
+
+    menu := listOfItems root submenu.
+    menu ifNil:[^ nil ].
+
+    menu allItemsDo:[:anItem|
+        anItem isVisible:true.
+        anItem   enabled:true.
+        anItem translateLabel:false.
+
+        anItem value ifNotNil:[
+            anItem value:[ Transcript showCR:(anItem label) ].
+        ].
+        anItem indication ifNotNil:[
+            indication ifNil:[ indication := true asValue ].
+            anItem indication:indication
+        ].
+        anItem choice ifNotNil:[
+            choice ifNil:[ choice := anItem choiceValue asValue ].
+            anItem choice:choice
+        ].
+
+        anItem submenuChannel ifNotNil:[
+            anItem submenuChannel:nil.
+            anItem submenu ifNil:[    
+                submenu ifNil:[
+                    submenu := Menu new.
+                    submenu addItem:(MenuItem labeled:'Linked Menu...').
+                ].
+                anItem submenu:submenu.
             ].
-            sel ~= (aspects at:#icon) ifTrue:[
-                (aspects at: #icon) value:sel asSymbol.
-            ].
-            self updateImageView.
+        ].
+        retriever := anItem resourceRetriever.
+        retriever ifNotNil:[
+            retriever labelText ifNotNil:[ retriever labelText:(anItem label) ]
         ].
     ].
-
-
+    menu findGuiResourcesIn:(self resolveName:specClass).
+  ^ menu
 !
 
-doEditImage
-    "opens a Image Editor on the resource retriever and the icon selector;
-     then updates the list of images and select the line of the image"
-
-    super doEditImage.
-    lastImageRetriever := nil.
-    self updateImageView.
+withoutNotifyDo:aBlock
+    "evaluate the block; all change notifications are
+     discard during the block is evaluated.
+    "
+    |blockResult|
+
+    [   notifyDisabledCounter := notifyDisabledCounter + 1.
+	blockResult := aBlock value.
+    ] valueNowOrOnUnwindDo:[
+	notifyDisabledCounter := notifyDisabledCounter - 1
+    ].    
+    ^ blockResult
+! !
+
+!MenuEditor methodsFor:'queries'!
+
+hasValidSpecClass
+    "returns true if a valid specClass exists
+    "
+    |cls|
+
+    specClass ifNil:[^ false].
+    cls := self resolveName:specClass.
+  ^ cls notNil
+! !
+
+!MenuEditor methodsFor:'selection'!
+
+canSelect:anIndex
+    "called whenever the selection changed; test whether
+     current item is not modified ....
+    "
+    |oldSelectedItem newSelectedItem|
+
+    self valueOfEnablingCommitButtons value ifFalse:[
+	^ true
+    ].
+    oldSelectedItem := self selectedItem.
+    oldSelectedItem ifNil:[^ true].
+
+    newSelectedItem := listOfItems at:anIndex ifAbsent:nil.
+    oldSelectedItem == newSelectedItem ifTrue:[
+	^ true
+    ].
+    ^ self askForItemModification
 !
 
+selectedItem
+    "returns the selected item or nil (none or multiple selected)
+    "
+    |selection|
+
+    selection := selectionHolder value.
+    selection size == 1 ifTrue:[ ^ selection first ].
+  ^ nil
+!
+
+selectedItem:anItem
+    "change selection to an item
+    "
+    |selection|
+
+    anItem notNil ifTrue:[ selection := Array with:anItem ]
+		 ifFalse:[ selection := #() ].
+
+    selectionHolder value:selection.
+! !
+
+!MenuEditor methodsFor:'user actions - building'!
+
 doNew
-
-    super doNew ifTrue: [self helpTool doNew]
+    "clear editing menu; start from scratch
+    "
+    super doNew ifTrue:[ self helpTool doNew ].
 !
 
 doPickAMenu
-
+    "pick a menu from user
+    "
     |view|
 
     self askForModification ifTrue:[
-        ((view := Screen current viewFromUser) isNil or:
-        [view == Screen current rootView]) ifTrue:[
+        (   (view := Screen current viewFromUser) isNil
+         or:[view == Screen current rootView]
+        ) ifTrue:[
             ^ self
         ].
         view specClass == MenuPanelSpec ifTrue:[
-            ^ treeView buildFromMenu: view asMenu
+            specSelector := #pickedMenu.
+          ^ self buildFromMenu:(view asMenu) selector:specSelector.
         ].
     ].
-    ^ nil
-!
-
-doRemoveImage
-    "removes the image of the selected line"
-    |cls sel|
-
-    sel := self selectionOfImage value.
-
-    sel size ~~ 0 ifTrue:[
-        cls := self currentImageRetrieverClass.
-        cls notNil ifTrue:[
-            cls class removeSelector:(sel string)
-        ].
-        (aspects at:#icon) value:nil.
-        lastImageRetriever := nil.
-        self updateImageView.
-    ] 
 !
 
 doSave
-    |cls menu spec mthd category code excla|
+    "save current editing menu to
+           class: specClass
+        selector: specSelector
+    "
+    |cls spec mthd category code excla|
 
     super doSave ifFalse: [^nil].
-
-    cls  := self resolveName: specClass.
-    menu := treeView asMenu literalArrayEncoding.
-    spec := WriteStream on:String new.
-    UISpecification prettyPrintSpecArray:menu on:spec indent:5.
-    spec := spec contents.
+    spec := self generateMenuSpec.
+    spec ifNil:[^ nil].
+
+    cls  := self resolveName:specClass.
 
     "/ if that method already exists, do not overwrite the category
 
@@ -2761,922 +1964,2653 @@
     self isStandAlone ifTrue: [self helpTool installHelpSpecsOnClass:self specClass].
 
     self updateHistory.
-    self updateInfoLabel.
-
     hasSaved := true.
     modified := false.
-
 !
 
 doSaveAs
-
-    super doSaveAs ifTrue: [treeView selectorName:specSelector]
+    "save current editing menu to class and selector
+     defined by the user.
+    "
+    super doSaveAs ifTrue:[
+	listOfItems root rawLabel:specSelector
+    ].
+!
+
+doShowMenuSpec
+    "opens a code view with the contents of the menu spec
+    "
+    |spec|
+
+    spec := self generateMenuSpec.
+
+    spec ifNotNil:[
+        CodeView openWith:spec title: 'Menu Spec'
+    ].
+! !
+
+!MenuEditor methodsFor:'user actions - creation'!
+
+doCreateDelayedMenu:what
+    |selectedItem delayedItem|
+
+    selectedItem := self selectedItem.
+    selectedItem ifNil:[^ self].
+
+    selectedItem canAddDelayedMenu      ifFalse:[ ^ self ].
+    self askForItemModification ifFalse:[ ^ self ].
+
+    what == #menu ifTrue:[ delayedItem := ItemMenu new ]
+                 ifFalse:[ delayedItem := ItemLinkedMenu new ].
+
+    delayedItem setExpanded:true.
+    delayedItem := selectedItem add:delayedItem.
+
+    delayedItem ifNotNil:[
+        self selectedItem:delayedItem.
+    ].
+!
+
+doCreateItem
+    "create a new Item
+    "
+    self addAndSelect:[ ItemAction new ].
+!
+
+doCreateLinkedMenu
+    "create a new Linked Menu
+    "
+    self addAndSelect:[ ItemLinkedMenu new ].
+!
+
+doCreateMenu
+    "create a new Menu
+    "
+    self addAndSelect:[ |item|
+	item := ItemMenu new.
+	item expand.
+	item
+    ].
+!
+
+doCreateSep
+    "create a new Separator Item
+    "
+    self addAndSelect:[ ItemSeparator new ].
+!
+
+doCreateStandardEditMenu
+    "create a standart edit menu
+    "
+    self addAndSelect:[
+	ItemMenu menu:(self class standardEditMenu) labeled:'Edit'
+    ].
 !
 
-doStepDown
-    "shift selected menu item one step down"
-
-    treeView selectedNodeChangeSequenceOrder:1.
+doCreateStandardFileMenu
+    "create a standart file menu
+    "
+    self addAndSelect:[
+	ItemMenu menu:(self class standardFileMenu) labeled:'File'
+    ].
+!
+
+doCreateStandardHelpMenu
+    "create a standart help menu
+    "
+    |item|
+
+    self addAndSelect:[
+	item := ItemMenu menu:(self class standardHelpMenu) labeled:'Help'.
+	item aspectAt:#startGroup put:#right.
+	item
+    ].
+! !
+
+!MenuEditor methodsFor:'user actions - editing'!
+
+doCopy
+    "copy selected menuItems to the clipboard
+    "
+    |clip items|
+
+    items := self selectedSuperItems.
+    items isEmpty ifTrue:[ ^ self ].
+
+    clip := OrderedCollection new.
+    items do:[:el| clip add:(el menuItem) ].
+
+    self clipboard:clip.
+    self updateAllToolInstances.
+!
+
+doCut
+    "copy selected menuItems to the clipboard and delete
+    "
+    self doCopy.
+    self doDelete.
+!
+
+doDelete
+    "delete selected menuItems
+    "
+    |selectedItem parent toDelete behind nextItem prevItem|
+
+    toDelete := self selectedSuperItems.
+    toDelete isEmpty ifTrue:[ ^ self ].
+
+    self clearModified.
+
+    selectedItem := toDelete first.
+
+    selectedItem isRootItem ifTrue:[
+        ^ selectedItem removeAll.
+    ].
+    "/ compute the new selection
+
+    prevItem := parent := selectedItem parent.
+    nextItem := nil.
+
+    parent children size ~~ 1 ifTrue:[
+        behind := false.
+
+        parent do:[:el|
+            behind ifTrue:[
+                (nextItem notNil or:[toDelete includesIdentical:el]) ifFalse:[ nextItem := el ].
+            ] ifFalse:[
+                behind := el == selectedItem.
+                (behind or:[toDelete includesIdentical:el]) ifFalse:[ prevItem := el ].
+            ]
+        ]
+    ].
+    self withoutNotifyDo:[
+        toDelete do:[:el| el remove ].
+    ].
+    self selectedItem:(nextItem ? prevItem).
     modified := true.
-
-
-
-
+    self updateChannels.
+!
+
+doPaste
+    "paste from clipboard
+    "
+    ^ self doPaste:(self clipboard)
 !
 
-doStepIn
-    "move selected menu item into next submenu"
-
-    "/ treeView selectedNodeBecomeChildOfNext.
-    treeView selectedNodesBecomeChildrenOfNext.
+doPaste:aCollection
+    "paste collection of MenuItems
+    "
+    |item loMenuItems|
+
+    aCollection size == 0 ifTrue:[ ^ self ].
+
+    item := self selectedItem.
+    item ifNil:[ ^ self ].
+
+    loMenuItems := OrderedCollection new.
+    aCollection do:[:el|
+	el class == MenuItem ifTrue:[ loMenuItems add:el ].
+    ].
+    loMenuItems isEmpty ifTrue:[ ^ self ].
+
+    self addAndSelect:[
+	loMenuItems collect:[:el| Item menuItem:el ]
+    ].
+! !
+
+!MenuEditor methodsFor:'user actions - hierarchy'!
+
+doMoveIn:aDirection
+    "move selected item into the next (#inNext) or previous (#inPrev) item
+    "
+    |item idx parent toParent|
+
+    item := self selectedItem.
+    item ifNil:[^ self].
+
+    aDirection == #inNext ifTrue:[ item canMoveInNext  ifFalse:[^ self] ]
+			 ifFalse:[ item canMoveInAbove ifFalse:[^ self] ].
+
+    self askForItemModification ifFalse:[ ^ self ].
+
+    parent := item parent.
+    idx    := parent identityIndexOf:item.
+
+    aDirection == #inNext ifTrue:[ toParent := parent at:(idx + 1) ifAbsent:nil ]
+			 ifFalse:[ toParent := parent at:(idx - 1) ifAbsent:nil ].
+
+    self withoutNotifyDo:[
+	selectionHolder setValue:#().
+	parent removeIndex:idx.
+
+	aDirection == #inNext ifTrue:[ toParent addFirst:item ]
+			     ifFalse:[ toParent  addLast:item ].
+	item makeVisible.
+    ].
+    self selectedItem:item.
     modified := true.
 !
 
-doStepInAbove
-    "move selected menu item into previous submenu"
-
-    treeView selectedNodeBecomeChildOfPrevious.
-    modified := true.
-!
-
-doStepOut
-    "move selected menu item(s) out from parent submenu"
-
-    treeView selectedNodesBecomeSistersOfParent.
+doMoveOut
+    "move selected item out of current item
+    "
+    |item parent grandParent index|
+
+    item := self selectedItem.
+    item ifNil:[^ self].
+    item canMoveOut ifFalse:[^ self].
+
+    self askForItemModification ifFalse:[ ^ self ].
+
+    parent      := item parent.
+    grandParent := parent parent.
+    index       := grandParent identityIndexOf:parent.
+
+    self withoutNotifyDo:[
+	selectionHolder setValue:#().
+	parent remove:item.
+	index > grandParent size ifTrue:[ grandParent add:item ]
+				ifFalse:[ grandParent add:item afterIndex:index ]
+    ].
+    self selectedItem:item.
     modified := true.
 !
 
-doStepUp
-    "shift selected menu item one step up"
-
-    treeView selectedNodeChangeSequenceOrder:-1.
+doMoveUpOrDown:aDirection
+    "move selected item up (#up) or down (#down)
+    "
+    |item index parent children|
+
+    item := self selectedItem.
+    item ifNil:[^ self].
+    item 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.
+    ].
+    self selectedItem:item.
     modified := true.
 ! !
 
-!MenuEditor::Item class methodsFor:'constants'!
-
-separatorList
-    "get the list of available separator types"
-
-    ^#('blank' 'single line' 'double line')
+!MenuEditor::Item class methodsFor:'defaults'!
+
+defaultLabel
+    ^ self subclassResponsibility
+! !
+
+!MenuEditor::Item class methodsFor:'image specs'!
+
+iconDelayedLinkedMenu
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self iconDelayedLinkedMenu inspect
+     ImageEditor openOnClass:self andSelector:#iconDelayedLinkedMenu
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:#'MenuEditor::Item class iconDelayedLinkedMenu'
+        ifAbsentPut:[(Depth4Image new) width: 20; height: 16; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+@@@@@@@@@@@@@@DQDQDQDQDQDR@AH"H"H"H"H"H0@@@BH"H"@@@BL@QDPBH"H"@@H#@DQDPBH@H"@"H0ADQDPBA@H"H"L@@@QDP@Q@@@@@@ADPQDQDQ@DQD 
+@RH QDQDQ@H"L@D"H QDQD@"H#@A@@@@@DP@@@@0@QDQDQA@DQDQL@D"H"H @"H"H#@BL3L3L3L3L3L0@@@@@@@@@@@@@@@a') ; colorMapFromArray:#[0 0 0 255 255 255 170 170 170 127 127 127 255 0 0]; mask:((Depth1Image new) width: 20; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'???0???0???0???0???0???0???0???0???0???0???0???0???0???0???0???0') ; yourself); yourself]
+!
+
+iconDelayedMenu
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self iconDelayedMenu inspect
+     ImageEditor openOnClass:self andSelector:#iconDelayedMenu
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:#'MenuEditor::Item class iconDelayedMenu'
+        ifAbsentPut:[(Depth2Image new) width: 20; height: 16; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@UUUUUVA*****,F***@B0Z***@+A****J,F*****0@@@@@@AUUUUUXF*****0Z****+A@@@@@LEUUUUU0Z****+B?????<@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 170 170 170 127 127 127]; mask:((Depth1Image new) width: 20; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'???0???0???0???0???0???0???0???0???0???0???0???0???0???0???0???0') ; yourself); yourself]
+!
+
+iconItem
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self iconItem inspect
+     ImageEditor openOnClass:self andSelector:#iconItem
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+	constantNamed:#'MenuEditor::Item class iconItem'
+	ifAbsentPut:[(Depth2Image new) width: 20; height: 16; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'UUUUUUUUUUUUUP@@@@@@EUUUUU Z****+A.?/;+,F:::/>0[++>:;A...++,F::?..0Z****+B?????<@@@@@@@@@@@@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 170 170 170 127 127 127]; mask:((Depth1Image new) width: 20; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@???0???0???0???0???0???0???0???0???0???0???0@@@@@@@@@@@@') ; yourself); yourself]
+!
+
+iconLinkedMenu
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self iconLinkedMenu inspect
+     ImageEditor openOnClass:self andSelector:#iconLinkedMenu
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+	constantNamed:#'MenuEditor::Item class iconLinkedMenu'
+	ifAbsentPut:[(Depth4Image new) width: 20; height: 16; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+@@@@@@@@@@@@@@QDQDQDQDQDQA@DH"H"H"H"H"HPABH@@@H"H"H"D@PQ@3L0DQDQDQ@D@@L3L0@@@@@PADPCL3L0PCADD@P"@@@3L0@3@!!@DH"H"@3L3L3@P
+AADQDQ@3L3L3@@P@@@@@@3L3LA@DQDQDQD@@L0PPABH"H"H"HC@"D@P"H"H"H"@BH!!@BDQDQDQDQDQDP@@@@@@@@@@@@@@@a') ; colorMapFromArray:#[0 0 0 127 127 127 170 170 170 255 0 0 255 255 255]; mask:((Depth1Image new) width: 20; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'???0???0???0???0???0???0???0???0???0???0???0???0???0???0???0???0') ; yourself); yourself]
+!
+
+iconMenu
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self iconMenu inspect
+     ImageEditor openOnClass:self andSelector:#iconMenu
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+	constantNamed:#'MenuEditor::Item class iconMenu'
+	ifAbsentPut:[(Depth2Image new) width: 20; height: 16; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@?????=C*****$N*****P5UUUUUC@@@@@DO?????P:****)C*****$MUUUUUP0@@@@AC?????4N*****P:****)BUUUUUT@@@@@@@b') ; colorMapFromArray:#[0 0 0 127 127 127 170 170 170 255 255 255]; mask:((Depth1Image new) width: 20; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'???0???0???0???0???0???0???0???0???0???0???0???0???0???0???0???0') ; yourself); yourself]
+!
+
+iconSeparator
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self iconSeparator inspect
+     ImageEditor openOnClass:self andSelector:#iconSeparator
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+	constantNamed:#'MenuEditor::Item class iconSeparator'
+	ifAbsentPut:[(Depth2Image new) width: 20; height: 16; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'UUUUUUUUUUUUUP@@@@@@EUUUUU Z****+A*****,F????:0[@@@@[A)UUUU,F*****0Z****+B?????<@@@@@@@@@@@@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 170 170 170 127 127 127]; mask:((Depth1Image new) width: 20; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@???0???0???0???0???0???0???0???0???0???0???0@@@@@@@@@@@@') ; yourself); yourself]
+! !
+
+!MenuEditor::Item class methodsFor:'instance creation'!
+
+classFor:aMenuItem
+
+    aMenuItem ifNil:[ ^ nil ].
+
+    aMenuItem value ifNil:[
+	aMenuItem submenu        ifNotNil:[ ^ MenuEditor::ItemMenu ].
+	aMenuItem submenuChannel ifNotNil:[ ^ MenuEditor::ItemLinkedMenu ].
+
+	(self separatorTypeOf:(aMenuItem rawLabel)) notNil ifTrue:[
+	    ^ MenuEditor::ItemSeparator
+	]
+    ].
+    ^ MenuEditor::ItemAction
 !
 
-separatorSlices
-    "get the list of menu spec values of the corresponding separator types"
-
-   ^ #(
-        ( #blank        ''  )
-        ( #single       '-' )
-        ( #double       '=' )
+menuItem:aMenuItem
+    |item cls|
+
+    cls := self classFor:aMenuItem.
+    cls ifNil:[^ nil].
+
+    item := cls new.
+    item menuItem:aMenuItem.
+  ^ item
+! !
+
+!MenuEditor::Item class methodsFor:'interface - editor'!
+
+addBindingsTo:aspects for:aMenuEditor
+    "add additional bindings to the aspects
+    "
+    aspects at:#falseChannel ifAbsentPut:[
+        false asValue
+    ].
+    aspects at:#notDelayedMenu ifAbsentPut:[
+        true asValue
+    ].
+! !
+
+!MenuEditor::Item class methodsFor:'interface - specs'!
+
+detailsEditSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:MenuEditor::Item andSelector:#detailsEditSpec
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+	#name: #detailsEditSpec
+	#window: 
+       #(#WindowSpec
+	  #label: 'Details Edit'
+	  #name: 'Details Edit'
+	  #min: #(#Point 10 10)
+	  #max: #(#Point 1280 1024)
+	  #bounds: #(#Rectangle 43 153 303 398)
+	)
+	#component: 
+       #(#SpecCollection
+	  #collection: #(
+	   #(#LabelSpec
+	      #label: 'Accelerator:'
+	      #name: 'shortcutKeyLabel'
+	      #layout: #(#AlignmentOrigin 107 0 26 0 1 0.5)
+	      #activeHelpKey: #detailsAccelerator
+	      #resizeForLabel: true
+	      #adjust: #right
+	    )
+	   #(#InputFieldSpec
+	      #name: 'shortcutKeyField'
+	      #layout: #(#LayoutFrame 110 0 15 0 -5 1.0 37 0)
+	      #activeHelpKey: #detailsAccelerator
+	      #tabable: true
+	      #model: #shortcutKeyCharacter
+	      #group: #inputGroup
+	      #type: #symbolOrNil
+	      #immediateAccept: false
+	      #acceptOnReturn: true
+	      #acceptOnTab: true
+	      #acceptChannel: #acceptChannel
+	      #modifiedChannel: #modifiedChannel
+	      #acceptOnPointerLeave: false
+	    )
+	   #(#LabelSpec
+	      #label: 'Enabled:'
+	      #name: 'enabledLabel'
+	      #layout: #(#AlignmentOrigin 107 0 51 0 1 0.5)
+	      #activeHelpKey: #detailsEnabled
+	      #resizeForLabel: true
+	      #adjust: #right
+	    )
+	   #(#InputFieldSpec
+	      #name: 'enabledField'
+	      #layout: #(#LayoutFrame 110 0 40 0 -5 1.0 62 0)
+	      #activeHelpKey: #detailsEnabled
+	      #tabable: true
+	      #model: #enabled
+	      #group: #inputGroup
+	      #type: #symbolOrNil
+	      #immediateAccept: false
+	      #acceptOnReturn: true
+	      #acceptOnTab: true
+	      #acceptChannel: #acceptChannel
+	      #modifiedChannel: #modifiedChannel
+	      #acceptOnPointerLeave: false
+	    )
+	   #(#LabelSpec
+	      #label: 'Visibility:'
+	      #name: 'visibilityLabel'
+	      #layout: #(#AlignmentOrigin 107 0 76 0 1 0.5)
+	      #activeHelpKey: #detailsVisibility
+	      #resizeForLabel: true
+	      #adjust: #right
+	    )
+	   #(#InputFieldSpec
+	      #name: 'isVisibleInputField'
+	      #layout: #(#LayoutFrame 110 0 65 0 -5 1.0 87 0)
+	      #activeHelpKey: #detailsVisibility
+	      #tabable: true
+	      #model: #isVisible
+	      #group: #inputGroup
+	      #type: #symbolOrNil
+	      #immediateAccept: false
+	      #acceptOnReturn: true
+	      #acceptOnTab: true
+	      #acceptChannel: #acceptChannel
+	      #modifiedChannel: #modifiedChannel
+	      #acceptOnPointerLeave: false
+	    )
+	   #(#LabelSpec
+	      #label: 'Aux Value'
+	      #name: 'auxLabel'
+	      #layout: #(#AlignmentOrigin 107 0 101 0 1 0.5)
+	      #activeHelpKey: #detailsAuxValue
+	      #translateLabel: true
+	      #resizeForLabel: true
+	      #adjust: #right
+	    )
+	   #(#InputFieldSpec
+	      #name: 'auxInputField'
+	      #layout: #(#LayoutFrame 110 0 90 0 -5 1.0 112 0)
+	      #activeHelpKey: #detailsAuxValue
+	      #tabable: true
+	      #model: #auxValue
+	      #group: #inputGroup
+	      #type: #smalltalkObject
+	      #immediateAccept: false
+	      #acceptOnReturn: true
+	      #acceptOnTab: true
+	      #acceptChannel: #acceptChannel
+	      #modifiedChannel: #modifiedChannel
+	      #acceptOnPointerLeave: false
+	    )
+	   #(#LabelSpec
+	      #label: 'Start Group:'
+	      #name: 'StartGroupLabel'
+	      #layout: #(#AlignmentOrigin 107 0 139 0 1 0.5)
+	      #activeHelpKey: #detailsStartGroup
+	      #resizeForLabel: true
+	      #adjust: #right
+	    )
+	   #(#PopUpListSpec
+	      #label: 'left'
+	      #name: 'StartGroupPopUp'
+	      #layout: #(#LayoutFrame 110 0 128 0 -5 1.0 150 0)
+	      #activeHelpKey: #detailsStartGroup
+	      #tabable: true
+	      #model: #startGroup
+	      #menu: 
+	     #(#left
+		#right
+	      )
+	    )
+	   #(#LabelSpec
+	      #label: 'Access Character Position:'
+	      #name: 'accessCharLabel'
+	      #layout: #(#AlignmentOrigin 217 0 170 0 1 0.5)
+	      #activeHelpKey: #detailsAccessCharaterPosition
+	      #resizeForLabel: true
+	      #adjust: #right
+	    )
+	   #(#InputFieldSpec
+	      #name: 'accessCharField'
+	      #layout: #(#LayoutFrame 220 0 159 0 -5 1.0 181 0)
+	      #activeHelpKey: #detailsAccessCharaterPosition
+	      #tabable: true
+	      #model: #accessCharacterPosition
+	      #group: #inputGroup
+	      #type: #numberOrNil
+	      #immediateAccept: false
+	      #acceptOnReturn: true
+	      #acceptOnTab: true
+	      #acceptChannel: #acceptChannel
+	      #modifiedChannel: #modifiedChannel
+	      #acceptOnPointerLeave: false
+	    )
+	   #(#LabelSpec
+	      #label: 'Font:'
+	      #name: 'fontLabel'
+	      #layout: #(#AlignmentOrigin 75 0 219 0 1 0.5)
+	      #resizeForLabel: true
+	      #adjust: #right
+	    )
+	   #(#FontMenuSpec
+	      #attributes: 
+	     #(#tabable
+		true
+	      )
+	      #name: 'fontMenu'
+	      #layout: #(#LayoutFrame 78 0 208 0 -5 1.0 230 0)
+	      #activeHelpKey: #fontMenu
+	      #model: #font
+	    )
+	   )
+         
+	)
       )
 ! !
 
-!MenuEditor::Item class methodsFor:'documentation'!
-
-documentation
-"
-    implements the contents assigned to a TreeItem. An instance
-    is associated with one item and keeps all its information
-
-    [see also:]
-        TreeItem
-        MenuEditor
-
-    [author:]
-        Claus Atzkern
-"
-
-
+!MenuEditor::Item class methodsFor:'testing'!
+
+separatorTypeOf:aString
+    |size first|
+
+    size := aString size.
+
+    size == 0 ifTrue:[ ^ #blank ].
+
+    size == 1 ifTrue:[
+	first := aString first.
+	first == $-                ifTrue:[ ^ #single ].
+	first == $=                ifTrue:[ ^ #double ].
+	first == (Character space) ifTrue:[ ^ #blank  ].
+    ].
+    ^ nil
 ! !
 
 !MenuEditor::Item methodsFor:'accessing'!
 
-activeHelpKey
-    "get the help key of the menu item"
-
-    ^activeHelpKey
+children
+    "optimize access; do not ask the model for unspecified children
+    "
+    ^ children
+!
+
+menuItem
+     "returns self as a MenuItem
+    "
+    ^ MenuItem new fromLiteralArrayEncoding:(menuItem literalArrayEncoding).
+!
+
+menuItem:aMenuItem
+    "rebuild self from a MenuItem
+    "
+    |value|
+
+    menuItem := MenuItem labeled:(self rawLabel).
+
+    MenuEditor aspects do:[:aKey|
+	value := aMenuItem perform:aKey.
+	value ifNotNil:[ self aspectAt:aKey put:value ]
+    ].
+!
+
+rawLabel
+    "returns the label assigned to the item
+    "
+    ^ menuItem rawLabel
+!
+
+rawLabel:aValue
+    "set the label assigned to the item
+    "
+    aValue isString ifTrue:[
+	(self class separatorTypeOf:aValue) ifNil:[
+	    menuItem rawLabel:aValue
+	]
+    ].
+!
+
+slices
+    "returns a sequence of supported slices
+    "
+    ^ self subclassResponsibility
 !
 
-activeHelpKey:aKey
-    "set the help key of the menu item"
-
-    activeHelpKey := aKey
+submenu
+    "returns the submenu (of class Menu) or nil
+    "
+    ^ nil
+! !
+
+!MenuEditor::Item methodsFor:'aspects'!
+
+aspectAt:aKey put:aValue
+    "set a specific aspect named aKey to the aValue
+    "
+    aKey == #rawLabel       ifTrue:[ ^ self rawLabel:aValue ].
+    aKey == #submenuChannel ifTrue:[ ^ self ].
+
+    menuItem perform:((aKey, ':') asSymbol) with:aValue.
+!
+
+fromAspects:aspects
+    "read values from aspects
+    "
+    MenuEditor aspects do:[:aKey|
+	self aspectAt:aKey put:((aspects at:aKey) value)
+    ].
+    self changed.
+!
+
+toAspects:aspects
+    "write values to aspects
+    "
+    MenuEditor aspects do:[:aKey|
+        (aspects at:aKey) value:(menuItem perform:aKey)
+    ].
+    (aspects at:#notDelayedMenu) value:(self isDelayedMenu not).
+! !
+
+!MenuEditor::Item methodsFor:'displaying'!
+
+displayLabel
+    "returns the label on default displayed on the screen
+    "
+    ^ menuItem rawLabel
+!
+
+displayOn:aGC x:x y:y h:h
+    "display the item in the graphicsContext, aGC.
+    "
+    |label|
+
+    label := self displayLabel.
+
+    label notNil ifTrue:[
+	self displayLabel:label h:(self heightOn:aGC) on:aGC x:x y:y h:h
+    ].
+!
+
+heightOn:aGC
+    "returns the height of the label on a GC
+    "
+    height ifNil:[ height := parent heightOn:aGC ].
+  ^ height
 !
 
 label
-    "get the value of the menu item"
-
-    ^label
-!
-
-label:something
-    "set the value of the menu item"
-
-    label := something ? '-'
-!
-
-separatorType
-    "get the separator type assigned to item or nil"
-
-    label size > 1 
-    ifFalse:
-    [
-        label size  == 0  ifTrue:[^#blank].
-        label first == $- ifTrue:[^#single].
-        label first == $= ifTrue:[^#double].
-    ].    
-    ^nil
-
-!
-
-startGroup:aSymbolOrNil
-    "set the startGroup attribute"
-
-    startGroup := aSymbolOrNil
-
-    "Created: / 23.8.1998 / 15:56:03 / cg"
-!
-
-submenuChannel
-    "return the value of the instance variable 'submenuChannel' (automatically generated)"
-
-    ^submenuChannel
-!
-
-submenuChannel:aChannel
-    "get the submenuChannel"
-
-    submenuChannel := aChannel
-!
-
-translateLabel:aBoolean
-    "set/clear the translate to national-language flag"
-
-    translateLabel := aBoolean
-
-    "Created: / 6.6.1998 / 17:23:33 / cg"
+    "get the rawLabel assigned to the item
+    "
+    ^ menuItem rawLabel
 !
 
-value:aSymbol
-    "set the value attribute"
-
-    value := aSymbol
-
-    "Created: / 23.8.1998 / 16:02:10 / cg"
-! !
-
-!MenuEditor::Item methodsFor:'building'!
-
-buildFromAspects:aspects
-    "read the values of the aspects into my values"
-
-    |name|
-    self isSeparator 
-    ifFalse:
-    [
-        name  := label.
-        label := (aspects at:#label) value.
-
-        (label isNil or:[self isSeparator]) ifTrue:[
-            (aspects at:#label) value:(label := name)
-        ].
-
-        enabled            := (aspects at:#enabled) value.
-        value              := (aspects at:#value) value.
-        nameKey            := (aspects at:#nameKey) value.
-        indication         := (aspects at:#indication) value.
-        choice             := (aspects at:#choice) value.
-        choiceValue        := (aspects at:#choiceValue) value.
-        shortcutKey        := (aspects at:#shortcutKey) value.
-        startGroup         := (aspects at:#startGroup) value.
-        accessCharacterPos := (aspects at:#accessCharacterPos) value.
-        showBusyCursorWhilePerforming := (aspects at:#showBusyCursorWhilePerforming) value.
-        triggerOnDown      := (aspects at:#triggerOnDown) value.
-        keepLinkedMenu     := (aspects at:#keepLinkedMenu) value ? false.
-        font               := (aspects at:#font) value.
-        argument           := (aspects at:#argument) value.
-        translateLabel     := (aspects at:#translateLabel) value.
-        isButton           := (aspects at:#isButton) value.
-        auxValue           := (aspects at:#auxValue) value.
-        horizontalLayout   := (aspects at:#horizontalLayout) value.
-
-        argument isString ifTrue:[
-            argument size > 1 ifTrue:[
-                (argument at:1) == $# ifTrue:[
-                    argument := (argument copyFrom:2) asSymbol
-                ]
-            ]
-        ].
-        submenuChannel    := (aspects at:#submenuChannel) value.
-        retriever         := (aspects at:#retriever) value.
-        icon              := (aspects at:#icon) value.
-        iconAndLabel      := (aspects at:#iconAndLabel) value.
-    ]
-    ifTrue:
-    [
-        name  := (aspects at:#seperatorSelection) selectionIndex.
-        label := (self class separatorSlices at:name) last.
-    ].
-    isVisible := (aspects at:#isVisible) value.
-    hideMenuOnActivated := (aspects at:#hideMenuOnActivated) value.
-
-    "Modified: / 14.8.1998 / 15:36:38 / cg"
+label:aLabel
+    "set the rawLabel assigned to the item
+    "
+    self rawLabel:aLabel
 !
 
-buildFromMenuItem:anItem
-    "read the attributes of anItem into my values"
-
-    |rtv|
-
-    self label:(anItem rawLabel).
-    activeHelpKey := anItem activeHelpKey.
-
-    (enabled := anItem enabled) isSymbol ifFalse:[
-        enabled := nil
-    ].
-    (value := anItem value) isSymbol ifFalse:[
-        value := nil.
-    ].
-    (indication := anItem indication) isSymbol ifFalse:[
-        indication := nil
-    ].
-    (choice := anItem choice) isSymbol ifFalse:[
-        choice := nil
-    ].
-    choiceValue         := anItem choiceValue.
-    nameKey             := anItem nameKey.
-    shortcutKey         := anItem shortcutKeyCharacter.
-    startGroup          := anItem startGroup.
-    accessCharacterPos  := anItem accessCharacterPosition.
-    showBusyCursorWhilePerforming  := anItem showBusyCursorWhilePerforming.
-    triggerOnDown       := anItem triggerOnDown.
-    keepLinkedMenu      := anItem keepLinkedMenu.
-    font                := anItem font.
-    argument            := anItem argument.
-
-    submenuChannel      := anItem submenuChannel.
-    translateLabel      := anItem translateLabel.
-    isButton            := anItem isButton.
-    isVisible           := anItem isVisible.
-    hideMenuOnActivated := anItem hideMenuOnActivated.
-    auxValue            := anItem auxValue.
-    horizontalLayout    := anItem horizontalLayout.
-
-    (((rtv := anItem adornment) notNil)
-    and:[(rtv := rtv labelImage) isKindOf:ResourceRetriever])
-    ifTrue:
-    [
-        retriever := rtv className.
-        icon      := rtv selector.
-        (iconAndLabel := rtv labelText notNil) ifTrue:[
-            label := rtv labelText.
-        ]
-    ]
-
-    "Modified: / 29.9.1998 / 11:18:25 / cg"
+widthOn:aGC
+    "returns the height of the displayLabel on a GC
+    "
+    width ifNil:[ width := self widthOf:(self displayLabel) on:aGC ].
+  ^ width
 ! !
 
-!MenuEditor::Item methodsFor:'conversion'!
-
-asMenuItem
-    "converts self to a menu item"
-
-    |item rcv|
-
-    item := MenuItem labeled:label.
-    item isVisible:isVisible.
-    item hideMenuOnActivated:hideMenuOnActivated.
-
-    self isSeparator ifFalse:[    
-        item activeHelpKey:activeHelpKey.
-        item enabled:enabled.
-        item accessCharacterPosition:accessCharacterPos.
-        item showBusyCursorWhilePerforming:showBusyCursorWhilePerforming.
-        item triggerOnDown:triggerOnDown.
-        item keepLinkedMenu:keepLinkedMenu.
-        item font:font.
-        item argument:argument.
-        item submenuChannel:submenuChannel.
-        item nameKey:nameKey.
-        item shortcutKeyCharacter:shortcutKey.
-        item startGroup:startGroup.
-        item value:value.
-        item indication:indication.
-        item choice:choice.
-        item choiceValue:choiceValue.
-        item translateLabel: translateLabel.
-        item isButton: isButton.
-        item auxValue: auxValue.
-
-        horizontalLayout == true ifTrue:[
-            item horizontalLayout:true.
-        ].
-
-        icon notNil ifTrue:[
-            rcv := ResourceRetriever new.
-            rcv className:retriever.
-            rcv selector:icon.
-            iconAndLabel == true ifTrue:[
-                rcv labelText:label
-            ].
-            item labelImage:rcv
-        ]
-    ].
-    ^item
-
-    "Modified: / 14.8.1998 / 15:36:35 / cg"
-!
-
-toAspects:aspects
-    "put my values into the values of aspects"
-
-    |type|
-    (type := self separatorType) notNil ifTrue: [
-        type := self class separatorSlices findFirst:[:el| el first == type ].
-        (aspects at:#seperatorSelection) selectionIndex:type.
-    ] ifFalse: [
-        (aspects at:#label)                value:label.
-        (aspects at:#enabled)              value:enabled.
-        (aspects at:#value)                value:value.
-        (aspects at:#nameKey)              value:nameKey.
-        (aspects at:#indication)           value:indication.
-        (aspects at:#choice)               value:choice.
-        (aspects at:#choiceValue)          value:choiceValue.
-        (aspects at:#shortcutKey)          value:shortcutKey.
-        (aspects at:#startGroup)           value:startGroup.
-        (aspects at:#accessCharacterPos)   value:accessCharacterPos.
-        (aspects at:#showBusyCursorWhilePerforming)   value:showBusyCursorWhilePerforming.
-        (aspects at:#triggerOnDown)        value:triggerOnDown.
-        (aspects at:#keepLinkedMenu)       value:(keepLinkedMenu ? false).
-        (aspects at:#font)                 value:font.
-        (aspects at:#translateLabel)       value:translateLabel.
-        (aspects at:#submenuChannel)       value:submenuChannel.
-        (aspects at:#retriever)            value:retriever.
-        (aspects at:#icon)                 value:icon.
-        (aspects at:#iconAndLabel)         value:iconAndLabel.
-        (aspects at:#isButton)             value:isButton.
-        (aspects at:#auxValue)             value:auxValue.
-        (aspects at:#horizontalLayout)     value:(horizontalLayout ? false).
-
-        (aspects at:#argument)
-            value:(argument isSymbol
-                        ifTrue: ['#', argument] 
-                        ifFalse:[argument]).
-    ].
-    (aspects at:#isVisible) value:isVisible.
-    (aspects at:#hideMenuOnActivated) value:(hideMenuOnActivated ? true).
-
-    "Modified: / 14.8.1998 / 15:37:29 / cg"
+!MenuEditor::Item methodsFor:'initialization'!
+
+initialize
+    super initialize.
+    menuItem := MenuItem label:(self class defaultLabel).
 ! !
 
 !MenuEditor::Item methodsFor:'queries'!
 
-iconFor: aNode
-    "get the icon of the menu item for the tree view"
-
-    (aNode hasChildren or: [aNode parent isNil])
-    ifTrue:
-    [
-        ^MenuEditor submenuImage
-    ]
-    ifFalse:
-    [
-        submenuChannel notNil 
-        ifTrue:
-        [
-            ^MenuEditor linkSubmenuImage
-        ]
-        ifFalse:
-        [
-            self isSeparator 
-                ifTrue:  [^MenuEditor menuSeparatorImage]
-                ifFalse: [^MenuEditor menuItemImage]
-        ]
-    ]
+isAction
+    "returns true if the item is an Action
+    "
+    ^ false
+!
+
+isDelayedMenu
+    "returns true if the item is a Delayed (Linked) Menu
+    "
+    ^ parent isAction
+!
+
+isKindOfMenu
+    "returns true if the item is a Linked Menu or Menu
+    "
+    ^ false
+!
+
+isRootItem
+    "returns true if the item is the root item
+    "
+    ^ false
+! !
+
+!MenuEditor::Item methodsFor:'queries - operation'!
+
+canAddChildren
+    "returns true if children can be added
+    "
+    ^ false
+!
+
+canAddDelayedMenu
+    "returns true if a delayed menu can be added;
+     on default false is returned
+    "
+    ^ false
+!
+
+canMoveInAbove
+    "returns true if the item can become a child of its previous sibling
+    "
+    |siblings index nextItem|
+
+    siblings := parent children.
+    siblings size > 1 ifFalse:[ ^ false ].
+
+    index    := siblings identityIndexOf:self.
+    nextItem := siblings at:(index - 1)  ifAbsent:nil.
+
+    nextItem ifNil:[^ false].
+  ^ nextItem canAddChildren
 !
 
-isSeparator
-    "return true if item is a seperator"
-
-    ^self separatorType notNil
+canMoveInNext
+    "returns true if the item can become a child of its next sibling
+    "
+    |siblings index nextItem|
+
+    siblings := parent children.
+    siblings size > 1 ifFalse:[ ^ false ].
+
+    index    := siblings identityIndexOf:self.
+    nextItem := siblings at:(index + 1)  ifAbsent:nil.
+
+    nextItem ifNil:[^ false].
+  ^ nextItem canAddChildren
+!
+
+canMoveOut
+    "returns true if the item can be moved out from its current parent
+    "
+    self   isDelayedMenu ifTrue:[^ false].
+    parent isDelayedMenu ifTrue:[^ false].
+
+  ^ parent parent notNil
 !
 
-treeViewLabel
-    "get the label of the menu item for the tree view"
-
-    ^label
-" asBoldText, 
-        (value notNil ifTrue: [': [', 
-                value ,
-                (argument isString ifTrue: [' ', (Text string: argument emphasis: #italic)] ifFalse: ['']),
-                 ']'] ifFalse: [''])
-
-
-"
+canMoveUpOrDown
+    "returns true if the item can change its vertical order in its sibling
+    "
+    ^ parent children size > 1
+! !
+
+!MenuEditor::ItemAction class methodsFor:'defaults'!
+
+defaultLabel
+    ^ 'Action'
+! !
+
+!MenuEditor::ItemAction class methodsFor:'interface - editor'!
+
+addBindingsTo:aspects for:aMenuEditor
+    "add additional bindings to the aspects
+    "
+    aspects at:#indicationEnabled  ifAbsentPut:[
+	BlockValue with:[:a | a size == 0 ] argument:(aspects at:#choice)
+    ].
+
+    aspects at:#choiceEnabled ifAbsentPut:[
+	BlockValue with:[:a | a size == 0 ] argument:(aspects at:#indication)
+    ].
+
+    aspects at:#choiceValueEnabled ifAbsentPut:[
+	BlockValue with:[:a | a size ~~ 0 ] argument:(aspects at:#choice)
+    ].
+    aspects at:#hasNoDelayedMenuValue ifAbsentPut:[
+	true asValue
+    ].
 ! !
 
-!MenuEditor::TreeView class methodsFor:'documentation'!
-
-documentation
-"
-    This tree view class provides a hierarchical representation
-    of the components of a menu.
-
-    [see also:]
-        SelectionInTreeView
-        SelectionInTree
-        TreeItem
-
-    [author:]
-        Claus Atzkern
-"
+!MenuEditor::ItemAction class methodsFor:'interface - specs'!
+
+basicsEditSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:MenuEditor::ItemAction andSelector:#basicsEditSpec
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #basicsEditSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'basicsEditSpec'
+          #name: 'basicsEditSpec'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1160 870)
+          #bounds: #(#Rectangle 9 625 349 965)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#LabelSpec
+              #label: 'Name Key:'
+              #name: 'nameKeyLabel'
+              #layout: #(#AlignmentOrigin 107 0 25 0 1 0.5)
+              #activeHelpKey: #basicsKey
+              #resizeForLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'nameKeyField'
+              #layout: #(#LayoutFrame 110 0 15 0 -5 1.0 37 0)
+              #activeHelpKey: #basicsKey
+              #tabable: true
+              #model: #nameKey
+              #group: #inputGroup
+              #type: #symbolOrNil
+              #immediateAccept: false
+              #acceptOnLeave: false
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: false
+              #acceptChannel: #acceptChannel
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: 'Label:'
+              #name: 'labelLabel'
+              #layout: #(#AlignmentOrigin 107 0 51 0 1 0.5)
+              #activeHelpKey: #basicsLabel
+              #resizeForLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'labelField'
+              #layout: #(#LayoutFrame 110 0 40 0 -5 1.0 62 0)
+              #activeHelpKey: #basicsLabel
+              #tabable: true
+              #model: #rawLabel
+              #group: #inputGroup
+              #immediateAccept: false
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: false
+              #acceptChannel: #acceptChannel
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: 'Action:'
+              #name: 'valueLabel'
+              #layout: #(#AlignmentOrigin 107 0 82 0 1 0.5)
+              #activeHelpKey: #basicsAction
+              #resizeForLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'valueField'
+              #layout: #(#LayoutFrame 110 0 71 0 -5 1.0 93 0)
+              #activeHelpKey: #basicsAction
+              #tabable: true
+              #model: #value
+              #group: #inputGroup
+              #type: #symbolOrNil
+              #immediateAccept: false
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: false
+              #acceptChannel: #acceptChannel
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: 'Argument:'
+              #name: 'argumentLabel'
+              #layout: #(#AlignmentOrigin 107 0 107 0 1 0.5)
+              #activeHelpKey: #basicsArgument
+              #resizeForLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'argumentField'
+              #layout: #(#LayoutFrame 110 0 96 0 -5 1.0 118 0)
+              #activeHelpKey: #basicsArgument
+              #tabable: true
+              #model: #argument
+              #group: #inputGroup
+              #type: #smalltalkObject
+              #immediateAccept: false
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: false
+              #acceptChannel: #acceptChannel
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: 'Indication:'
+              #name: 'indicationLabel'
+              #layout: #(#AlignmentOrigin 107 0 138 0 1 0.5)
+              #activeHelpKey: #basicsIndication
+              #visibilityChannel: #hasNoDelayedMenuValue
+              #resizeForLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'indicationField'
+              #layout: #(#LayoutFrame 110 0 127 0 -5 1.0 149 0)
+              #activeHelpKey: #basicsIndication
+              #visibilityChannel: #hasNoDelayedMenuValue
+              #enableChannel: #indicationEnabled
+              #tabable: true
+              #model: #indication
+              #group: #inputGroup
+              #type: #symbolOrNil
+              #immediateAccept: true
+              #acceptOnReturn: false
+              #acceptOnTab: false
+              #acceptOnLostFocus: false
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: 'Choice:'
+              #name: 'choiceLabel'
+              #layout: #(#AlignmentOrigin 107 0 163 0 1 0.5)
+              #activeHelpKey: #basicsChoice
+              #visibilityChannel: #hasNoDelayedMenuValue
+              #translateLabel: true
+              #resizeForLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'choiceField'
+              #layout: #(#LayoutFrame 110 0 152 0 -5 1.0 174 0)
+              #activeHelpKey: #basicsChoice
+              #visibilityChannel: #hasNoDelayedMenuValue
+              #enableChannel: #choiceEnabled
+              #tabable: true
+              #model: #choice
+              #group: #inputGroup
+              #type: #symbolOrNil
+              #immediateAccept: true
+              #acceptOnReturn: false
+              #acceptOnTab: false
+              #acceptOnLostFocus: false
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: 'Value:'
+              #name: 'choiceValueLabel'
+              #layout: #(#AlignmentOrigin 107 0 188 0 1 0.5)
+              #activeHelpKey: #basicsChoiceValue
+              #visibilityChannel: #hasNoDelayedMenuValue
+              #translateLabel: true
+              #resizeForLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'choiceValueField'
+              #layout: #(#LayoutFrame 110 0 177 0 -5 1.0 199 0)
+              #activeHelpKey: #basicsChoiceValue
+              #visibilityChannel: #hasNoDelayedMenuValue
+              #enableChannel: #choiceValueEnabled
+              #tabable: true
+              #model: #choiceValue
+              #group: #inputGroup
+              #type: #smalltalkObject
+              #immediateAccept: false
+              #acceptOnLeave: false
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: false
+              #acceptChannel: #acceptChannel
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#CheckBoxSpec
+              #label: 'Translate Label'
+              #name: 'translateLabelCheckBox'
+              #layout: #(#Point 20 213)
+              #activeHelpKey: #basicsTranslateLabel
+              #tabable: true
+              #model: #translateLabel
+            )
+           #(#CheckBoxSpec
+              #label: 'Is Button'
+              #name: 'isButtonCheckBox'
+              #layout: #(#Point 20 238)
+              #activeHelpKey: #basicsIsButton
+              #tabable: true
+              #model: #isButton
+            )
+           #(#CheckBoxSpec
+              #label: 'Hide Menu after Activation'
+              #name: 'hideMenuOnActivated'
+              #layout: #(#Point 20 263)
+              #activeHelpKey: #hideMenuOnActivated
+              #tabable: true
+              #model: #hideMenuOnActivated
+            )
+           #(#CheckBoxSpec
+              #label: 'BusyCursor while Active'
+              #name: 'showBusyCursorWhilePerforming'
+              #layout: #(#Point 20 288)
+              #activeHelpKey: #showBusyCursorWhilePerforming
+              #tabable: true
+              #model: #showBusyCursorWhilePerforming
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Trigger On Down'
+              #name: 'triggerOnDown'
+              #layout: #(#Point 20 313)
+              #activeHelpKey: #triggerOnDown
+              #visibilityChannel: #hasNoDelayedMenuValue
+              #tabable: true
+              #model: #triggerOnDown
+              #translateLabel: true
+            )
+           )
+         
+        )
+      )
 ! !
 
-!MenuEditor::TreeView methodsFor:'accessing'!
-
-canTab
-    ^ true
-!
-
-selectorName
-    "get the selector of the menu spec"
-
-    ^(listOfNodes first contents label) asSymbol
-!
-
-selectorName: aSymbol
-    "set the selector for the menu spec"
-
-    listOfNodes first contents label: aSymbol
-! !
-
-!MenuEditor::TreeView methodsFor:'building'!
-
-buildFromClass:aClass andSelector:aSelector
-    "read a menu spec from aClass and aSelector and put 
-     the encoded menu into the tree view"
-
-    |spec cls menu firstNode firstNodeLabel|
-
-    "if opened on a menu"
-    (aClass isNil and: [aSelector isNil and: [listOfNodes size > 0]]) ifTrue: [^nil].
-
-    self selection:nil.
-
-    (aClass notNil and:[aSelector notNil]) ifTrue:[
-        cls := self application resolveName:aClass.
-
-        (cls respondsTo:aSelector) ifTrue:[
-            spec := cls perform:aSelector
+!MenuEditor::ItemAction methodsFor:'accessing'!
+
+menuItem
+    |item|
+
+    item := super menuItem.
+
+    self hasDelayedMenu ifTrue:[
+        children first setDelayedAttributesTo:item.
+
+        menuItem value ifNil:[
+            menuItem value:#unspecified
         ]
     ].
-
-    spec isNil ifFalse:[
-        (spec isMemberOf:Menu) ifFalse:[
-            menu := Menu new fromLiteralArrayEncoding:spec.
-        ] ifTrue:[
-            menu := spec.
-        ].
-        firstNode := self nodeLabel:(aSelector asString).
-        self subMenu:menu parent:firstNode.
-    ] ifTrue:[
-        (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.
-        ]
-    ].
-
-    firstNode expand.
-    model root: firstNode.
-
-    firstNode hasChildren ifFalse:[
-        model add:(self nodeLabel:'Item 1') below:firstNode
-    ].
-
-
-!
-
-buildFromMenu:aMenu
-    "put aMenu into the tree view"
-
-    |node|
-
-    self selection:nil.
-
-    node := self nodeLabel:'menu'.
-    self subMenu:aMenu parent:node.
-
-    node hasChildren ifFalse:[
-        node add:(self nodeLabel:'Item 1')
-    ].
-    node expand.
-    model root:node.
+    ^ item
 !
 
 menuItem:anItem
-
-    |node|
-
-    node := self nodeLabel: anItem label.
-    node contents buildFromMenuItem:anItem.
-    self subMenu: anItem submenu parent:node.
-    ^node.
-
-
+    |submenu item|
+
+    super menuItem:anItem.
+    submenu := anItem submenu.
+
+    submenu notNil ifTrue:[
+	item := MenuEditor::ItemMenu new
+    ] ifFalse:[
+	anItem submenuChannel ifNil:[
+	    ^ self
+	].
+	item := MenuEditor::ItemLinkedMenu new
+    ].
+    item getDelayedAttributesFrom:anItem.
+    self add:item.
 !
 
-subMenu:aMenu parent:aParent
-
-    |idx grp|
-
-    aMenu isNil ifFalse:[
-        grp := aMenu groupSizes.
-        aMenu itemsDo:[:i| aParent add:(self menuItem:i)].
-
-        grp notNil ifTrue:[
-            idx := 0.
-
-            grp do:[:i|
-                idx := idx + i + 1.
-                aParent add:(self nodeLabel:nil) beforeIndex:idx.
-            ]
-        ]
-    ]
-! !
-
-!MenuEditor::TreeView methodsFor:'conversion'!
-
-asMenu
-    |menu root|
-
-    root := self root.
-
-    root hasChildren ifTrue:[
-        menu := Menu new.
-        root children do:[:aChild| menu addItem:(self asMenuItem:aChild)].
-    ].
-  ^ menu
-!
-
-asMenuItem:aNode
-
-    |menu item|
-
-    item := aNode contents asMenuItem.
-
-    aNode hasChildren ifTrue:[
-        menu := Menu new.
-        aNode children do:[:aChild| menu addItem:(self asMenuItem:aChild)].
-        item submenu:menu
-    ].
-  ^ item
-
+slices
+    ^ #(
+	    (Basics   basicsEditSpec )
+	    (Details  detailsEditSpec)
+	    (Image    image  )
+	    (Help     help)
+       )
 ! !
 
-!MenuEditor::TreeView methodsFor:'drawing basics'!
-
-redrawLabelAt:x y:yTop index:anIndex
-    "draw text label assigned to a node at x y( center)"
-
-    |isSelected y0 x0 x1 w type item|
-
-    item := (listOfNodes at:anIndex) contents.
-    type := item separatorType.
-
-    type isNil ifTrue:[
-        ^ super redrawLabelAt:x y:yTop index:anIndex
-    ].
-    isSelected := self isInSelection:anIndex.
-    x0 := x.
-
-    highlightMode == #label ifTrue:[
-        x0 := x + 4.
-
-        isSelected ifTrue:[
-            w  := 80 + 8.
-            self paint:hilightBgColor.
-            self fillRectangleX:x y:yTop width:w height:fontHeight.
-        ]
-    ] ifFalse:[
-        w := 0.
+!MenuEditor::ItemAction methodsFor:'adding & removing'!
+
+add:anItem
+    "add an item; test whether the item is a delayed menu and
+     not already a delayed menu exists.
+    "
+    (anItem isKindOfMenu and:[self canAddDelayedMenu]) ifFalse:[
+        ^ nil
     ].
-    type == #blank ifFalse:[
-        isSelected ifTrue:[self paint:hilightFgColor]
-                  ifFalse:[self paint:fgColor].
-
-        x1 := x0 + 80.
-        y0 := yTop - 1 + (fontHeight // 2).
-        self displayLineFromX:x0 y:y0 toX:x1 y:y0.
-
-        type == #double ifTrue:[
-            y0 := y0 + 2.
-            self displayLineFromX:x0 y:y0 toX:x1 y:y0.
-        ]    
-    ].
-
-    (isSelected and:[highlightMode == #label]) ifTrue:[
-        self redrawSelFrameAtX:x y:yTop toX:(x + w)
-    ].
-
+    "/ reset values not setable if a delayed menu is configured
+
+    menuItem        choice:nil.
+    menuItem    indication:nil.
+    menuItem   choiceValue:nil.
+    menuItem triggerOnDown:false.
+
+    anItem argument:(menuItem argument).
+
+    isExpanded := false.
+    anItem parent:self.
+    children := Array with:anItem.
+    self expand.
+  ^ anItem
 ! !
 
-!MenuEditor::TreeView methodsFor:'event handling'!
-
-keyPress:key x:x y:y
-    "invoked if any key was pressed"
-
-    <resource: #keyboard (#Delete #BackSpace #Cut #Copy #Paste)>
-
-    (key == #Delete or:[key == #BackSpace]) ifTrue: [^self doDelete].
-    key == #Cut   ifTrue:[^self doCut].
-    key == #Copy  ifTrue:[^self doCopy].
-    key == #Paste ifTrue:[^self doPaste].
-
-    super keyPress:key x:x y:y
-
+!MenuEditor::ItemAction methodsFor:'aspects'!
+
+aspectAt:aKey put:aValue
+    "pass the argument to the delayed menu if existant
+    "
+    aKey == #argument ifTrue:[
+        self hasDelayedMenu ifTrue:[
+            children first argument:aValue
+        ].
+        menuItem argument:aValue.
+      ^ self
+    ].
+    super aspectAt:aKey put:aValue.
+!
+
+toAspects:aspects
+    "write values to aspects
+    "
+    super toAspects:aspects.
+
+    (aspects at:#hasNoDelayedMenuValue) value:(self hasDelayedMenu not).
 ! !
 
-!MenuEditor::TreeView methodsFor:'initialization'!
+!MenuEditor::ItemAction methodsFor:'displaying'!
+
+icon
+    ^ self class iconItem
+! !
+
+!MenuEditor::ItemAction methodsFor:'initialization'!
 
 initialize
-    "initialize the tree view of the menu components"
-
     super initialize.
-
-    self multipleSelectOk:true.
-    self showDirectoryIndicator: true.
-    self showDirectoryIndicatorForRoot: false.
-    self selectConditionBlock: [:i|self application askForItemModification]. 
-    self validateDoubleClickBlock: [:node| node ~~ listOfNodes first].
-    self model iconAction: [:aNode| aNode contents iconFor: aNode].
-    self model labelAction: [:aNode| aNode contents treeViewLabel]
+    isExpanded := true.
+! !
+
+!MenuEditor::ItemAction methodsFor:'queries'!
+
+canCollapse
+    ^ false
+!
+
+hasDelayedMenu
+    "returns true if a delayed menu exists
+    "
+    ^ children size ~~ 0
+!
+
+hasIndicator
+    ^ false
+!
+
+isAction
+    ^ true
+! !
+
+!MenuEditor::ItemAction methodsFor:'queries - operation'!
+
+canAddDelayedMenu
+    "returns true if a delayed menu can be added;
+     no delayed menu exists and the indication or choice is unspecified
+    "
+    self hasDelayedMenu ifTrue:[ ^ false ].
+  ^ (menuItem indication isNil and:[menuItem choice isNil])
+! !
+
+!MenuEditor::ItemLinkedMenu class methodsFor:'defaults'!
+
+defaultLabel
+    ^ 'Linked Menu'
 ! !
 
-!MenuEditor::TreeView methodsFor:'menus'!
-
-XXdoDeleteSelectionBuffered:aBool
-    |appl idx|
-
-    appl := self topView application.
-
-    (appl hasValidSelection value and: [self askForItemModification]) ifFalse:[
-        ^ self
-    ].
-    aBool ifTrue:[
-        self doCopy
+!MenuEditor::ItemLinkedMenu class methodsFor:'interface - specs'!
+
+basicsEditSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:MenuEditor::ItemLinkedMenu andSelector:#basicsEditSpec
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #basicsEditSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'basicsEditSpec'
+          #name: 'basicsEditSpec'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1160 870)
+          #bounds: #(#Rectangle 346 355 686 695)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#LabelSpec
+              #label: 'Name Key:'
+              #name: 'nameKeyLabel'
+              #layout: #(#AlignmentOrigin 107 0 25 0 1 0.5)
+              #activeHelpKey: #basicsKey
+              #visibilityChannel: #notDelayedMenu
+              #resizeForLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'nameKeyField'
+              #layout: #(#LayoutFrame 110 0 15 0 -5 1.0 37 0)
+              #activeHelpKey: #basicsKey
+              #visibilityChannel: #notDelayedMenu
+              #tabable: true
+              #model: #nameKey
+              #group: #inputGroup
+              #type: #symbolOrNil
+              #immediateAccept: false
+              #acceptOnLeave: false
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: false
+              #acceptChannel: #acceptChannel
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: 'Label:'
+              #name: 'labelLabel'
+              #layout: #(#AlignmentOrigin 107 0 51 0 1 0.5)
+              #activeHelpKey: #basicsLabel
+              #visibilityChannel: #notDelayedMenu
+              #resizeForLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'labelField'
+              #layout: #(#LayoutFrame 110 0 40 0 -5 1.0 62 0)
+              #activeHelpKey: #basicsLabel
+              #visibilityChannel: #notDelayedMenu
+              #tabable: true
+              #model: #rawLabel
+              #group: #inputGroup
+              #immediateAccept: false
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: false
+              #acceptChannel: #acceptChannel
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: 'Menu:'
+              #name: 'menuLabel'
+              #layout: #(#AlignmentOrigin 107 0 90 0 1 0.5)
+              #activeHelpKey: #basicsLabel
+              #resizeForLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'menuField'
+              #layout: #(#LayoutFrame 110 0 79 0 -5 1.0 101 0)
+              #activeHelpKey: #basicsMenu
+              #tabable: true
+              #model: #submenuChannel
+              #group: #inputGroup
+              #type: #symbolOrNil
+              #immediateAccept: false
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: false
+              #acceptChannel: #acceptChannel
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: 'Argument:'
+              #name: 'argumentLabel'
+              #layout: #(#AlignmentOrigin 107 0 115 0 1 0.5)
+              #activeHelpKey: #basicsLabel
+              #resizeForLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'argumentField'
+              #layout: #(#LayoutFrame 110 0 104 0 -5 1.0 126 0)
+              #activeHelpKey: #basicsMenuArgument
+              #tabable: true
+              #model: #argument
+              #group: #inputGroup
+              #type: #smalltalkObject
+              #immediateAccept: false
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: false
+              #acceptChannel: #acceptChannel
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#CheckBoxSpec
+              #label: 'Translate Label'
+              #name: 'translateLabelCheckBox'
+              #layout: #(#Point 20 213)
+              #activeHelpKey: #basicsTranslateLabel
+              #visibilityChannel: #notDelayedMenu
+              #tabable: true
+              #model: #translateLabel
+            )
+           #(#CheckBoxSpec
+              #label: 'Is Button'
+              #name: 'isButtonCheckBox'
+              #layout: #(#Point 20 238)
+              #activeHelpKey: #basicsIsButton
+              #visibilityChannel: #notDelayedMenu
+              #tabable: true
+              #model: #isButton
+            )
+           #(#CheckBoxSpec
+              #label: 'Has Horizontal Layout'
+              #name: 'horizontalLayout'
+              #layout: #(#Point 20 263)
+              #activeHelpKey: #horizontalLayout
+              #tabable: true
+              #model: #horizontalLayout
+            )
+           #(#CheckBoxSpec
+              #label: 'Do not destroy linked Menu'
+              #name: 'keepLinkedMenu'
+              #layout: #(#Point 20 288)
+              #activeHelpKey: #keepLinkedMenu
+              #tabable: true
+              #model: #keepLinkedMenu
+              #translateLabel: true
+            )
+           )
+         
+        )
+      )
+! !
+
+!MenuEditor::ItemLinkedMenu methodsFor:'accessing'!
+
+argument:aValue
+    menuItem argument:aValue.
+!
+
+menuItem
+     "returns self as a MenuItem
+    "
+    |item|
+
+    item := super menuItem.
+    item submenuChannel:(self submenuChannel).
+  ^ item
+!
+
+slices
+    self isDelayedMenu ifTrue:[
+        ^ #(
+                (Basics   basicsEditSpec )
+           )
     ].
 
-    idx := 10000.
-    self selection do:[:aNumber| idx := idx min:aNumber ].
-
-    self selectedNodesRemove.
-    self selection:(idx min:(self list size)).
-    self setModified.
-
-    aBool ifTrue:[
-        "/ must update copy&paste indication
-        appl updateAllToolInstances.
-    ]
+    ^ #(
+            (Basics   basicsEditSpec )
+            (Details  detailsEditSpec)
+            (Image    image  )
+            (Help     help)
+       )
+!
+
+submenuChannel
+    ^ menuItem submenuChannel ? #unspecified
+!
+
+submenuChannel:aValue
+    menuItem submenuChannel:aValue.
+! !
+
+!MenuEditor::ItemLinkedMenu methodsFor:'aspects'!
+
+aspectAt:aKey put:aValue
+    "set a specific aspect named aKey to the aValue
+    "
+    aKey == #submenuChannel ifTrue:[ ^ self submenuChannel:aValue ].
+    super aspectAt:aKey put:aValue.
+!
+
+getDelayedAttributesFrom:aMenuItem
+    menuItem rawLabel:'Delayed'.
+
+    menuItem   submenuChannel:(aMenuItem submenuChannel).
+    menuItem horizontalLayout:(aMenuItem horizontalLayout).
+    menuItem   keepLinkedMenu:(aMenuItem keepLinkedMenu).
 !
 
-doCopy
-    |clip|
-
-    self hasSelection ifTrue:[
-        self application clipboard:(clip := OrderedCollection new).
-        self selectionDo:[:i | clip add:((listOfNodes at:i) copy)].
-        self topView application updateAllToolInstances.
-    ]
+setDelayedAttributesTo:aMenuItem
+    aMenuItem   submenuChannel:(self submenuChannel).
+    aMenuItem horizontalLayout:(menuItem horizontalLayout).
+    aMenuItem   keepLinkedMenu:(menuItem keepLinkedMenu).
+! !
+
+!MenuEditor::ItemLinkedMenu methodsFor:'displaying'!
+
+displayLabel
+    "returns the label dependent on is delayed or not
+    "
+    self isDelayedMenu ifTrue:[ ^ self submenuChannel ].
+  ^ menuItem rawLabel
 !
 
-doCreateItem
-
-    self addElement: (self nodeLabel:'Item')
+icon
+    self isDelayedMenu ifTrue:[ ^ self class iconDelayedLinkedMenu ].
+  ^ self class iconLinkedMenu
+! !
+
+!MenuEditor::ItemLinkedMenu methodsFor:'queries'!
+
+isKindOfMenu
+    ^ true
+! !
+
+!MenuEditor::ItemMenu class methodsFor:'defaults'!
+
+defaultDelayedLabel
+    ^ 'delayed'
 !
 
-doCreateLink
-
-    |node item|
-
-    node := self nodeLabel:'Submenu Link'.
-    item := node contents.
-    item submenuChannel:#menuDefaultLink.
-    self addElement:node.
-    self setModified.
-
-
+defaultLabel
+    ^ 'Menu'
+! !
+
+!MenuEditor::ItemMenu class methodsFor:'instance creation'!
+
+menu:aMenu labeled:aString
+    |item|
+
+    item := self new.
+    item menu:aMenu labeled:aString.
+  ^ item
+! !
+
+!MenuEditor::ItemMenu class methodsFor:'interface - specs'!
+
+basicsEditSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:MenuEditor::ItemMenu andSelector:#basicsEditSpec
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #basicsEditSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'basicsEditSpec'
+          #name: 'basicsEditSpec'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1160 870)
+          #bounds: #(#Rectangle 810 135 1150 475)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#LabelSpec
+              #label: 'Name Key:'
+              #name: 'nameKeyLabel'
+              #layout: #(#AlignmentOrigin 107 0 25 0 1 0.5)
+              #activeHelpKey: #basicsKey
+              #visibilityChannel: #notDelayedMenu
+              #resizeForLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'nameKeyField'
+              #layout: #(#LayoutFrame 110 0 15 0 -5 1.0 37 0)
+              #activeHelpKey: #basicsKey
+              #visibilityChannel: #notDelayedMenu
+              #tabable: true
+              #model: #nameKey
+              #group: #inputGroup
+              #type: #symbolOrNil
+              #immediateAccept: false
+              #acceptOnLeave: false
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: false
+              #acceptChannel: #acceptChannel
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: 'Label:'
+              #name: 'labelLabel'
+              #layout: #(#AlignmentOrigin 107 0 51 0 1 0.5)
+              #activeHelpKey: #basicsLabel
+              #visibilityChannel: #notDelayedMenu
+              #resizeForLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'labelField'
+              #layout: #(#LayoutFrame 110 0 40 0 -5 1.0 62 0)
+              #activeHelpKey: #basicsLabel
+              #visibilityChannel: #notDelayedMenu
+              #tabable: true
+              #model: #rawLabel
+              #group: #inputGroup
+              #immediateAccept: false
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: false
+              #acceptChannel: #acceptChannel
+              #modifiedChannel: #modifiedChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#CheckBoxSpec
+              #label: 'Translate Label'
+              #name: 'translateLabelCheckBox'
+              #layout: #(#Point 20 213)
+              #activeHelpKey: #basicsTranslateLabel
+              #visibilityChannel: #notDelayedMenu
+              #tabable: true
+              #model: #translateLabel
+            )
+           #(#CheckBoxSpec
+              #label: 'Is Button'
+              #name: 'isButtonCheckBox'
+              #layout: #(#Point 20 238)
+              #activeHelpKey: #basicsIsButton
+              #visibilityChannel: #notDelayedMenu
+              #tabable: true
+              #model: #isButton
+            )
+           #(#CheckBoxSpec
+              #label: 'Has Horizontal Layout'
+              #name: 'horizontalLayout'
+              #layout: #(#Point 20 263)
+              #activeHelpKey: #horizontalLayout
+              #tabable: true
+              #model: #horizontalLayout
+            )
+           )
+         
+        )
+      )
+! !
+
+!MenuEditor::ItemMenu methodsFor:'accessing'!
+
+argument:aValue
+    "/ ignorred.
 !
 
-doCreateMenu
-    |node|
-
-    node := self nodeLabel:'Submenu'.
-    node parent: self selectedNode.        
-    node add:(self nodeLabel:'Item 1').
-    self addElement:node
+menu:aMenu labeled:aString
+    |expanded item menu|
+
+    self criticalDo:[
+	self isRootItem ifTrue:[ expanded := true ]
+		       ifFalse:[ expanded := isExpanded ].
+
+	self removeAll.
+	self rawLabel:aString.
+
+	aMenu ifNotNil:[
+	    aMenu isCollection ifTrue:[ menu := Menu new fromLiteralArrayEncoding:aMenu ]
+			      ifFalse:[ menu := aMenu ].
+
+	    menu numberOfItems == 0 ifTrue:[
+		menu := nil
+	    ].
+	].
+	menu ifNotNil:[
+	    isExpanded := false.        "/ discard change notifications
+	    children   := OrderedCollection new.
+
+	    menu itemsDo:[:el|
+		item := self class menuItem:el.
+		item parent:self.
+		children add:item.
+	    ].
+	    expanded ifTrue:[ self expand ].
+	].
+	isExpanded := expanded.
+    ].        
+    self changed
 !
 
-doCreateSep
-
-    self addElement:(self nodeLabel:nil)
+menuItem
+    "returns self as a MenuItem
+    "
+    |item|
+
+    item := super menuItem.
+    item submenu:(self submenu).
+  ^ item
 !
 
-doCreateStandardEditMenu
-
-    |node|
-    node := self nodeLabel:'Edit'.
-    node parent: self selectedNode.        
-    node add:(self nodeLabel:'Copy'  selector:#copySelection).
-    node add:(self nodeLabel:'Cut'   selector:#cutSelection).
-    node add:(self nodeLabel:'Paste' selector:#paste).
-    self addElement:node
-
-    "Created: / 23.8.1998 / 15:52:16 / cg"
-    "Modified: / 23.8.1998 / 15:59:36 / cg"
+menuItem:anItem
+
+    super menuItem:anItem.
+    self  menu:(anItem submenu) labeled:nil.
+!
+
+slices
+    self isDelayedMenu ifTrue:[
+        ^ #(
+                (Basics   basicsEditSpec )
+           )
+    ].
+
+    ^ #(
+            (Basics   basicsEditSpec )
+            (Details  detailsEditSpec)
+            (Image    image  )
+            (Help     help)
+       )
+!
+
+submenu
+    |menu|
+
+    menu := Menu new.
+
+    children size ~~ 0 ifTrue:[
+	children do:[:el| menu addItem:(el menuItem) ].
+    ].
+    ^ menu
+! !
+
+!MenuEditor::ItemMenu methodsFor:'aspects'!
+
+getDelayedAttributesFrom:aMenuItem
+
+    self menu:(aMenuItem submenu) labeled:nil.
+    menuItem horizontalLayout:(aMenuItem horizontalLayout).
+!
+
+setDelayedAttributesTo:aMenuItem
+    aMenuItem          submenu:(self submenu).
+    aMenuItem horizontalLayout:(menuItem horizontalLayout).
+! !
+
+!MenuEditor::ItemMenu methodsFor:'displaying'!
+
+displayLabel
+    "returns the label dependent on is delayed or not
+    "
+    self isDelayedMenu ifTrue:[ ^ self class defaultDelayedLabel ].
+  ^ menuItem rawLabel
+!
+
+icon
+    self isDelayedMenu ifTrue:[ ^ self class iconDelayedMenu ].
+  ^ self class iconMenu
+! !
+
+!MenuEditor::ItemMenu methodsFor:'queries'!
+
+canAddChildren
+    "children can be added
+    "
+    ^ true
+!
+
+canExpand
+    "returns true if the item is expandable
+    "
+    ^ isExpanded == false
+!
+
+hasIndicator
+    ^ true
 !
 
-doCreateStandardFileMenu
-
-    |node|
-    node := self nodeLabel:'File'.
-    node parent: self selectedNode.        
-    node add:(self nodeLabel:'New'        selector:#menuNew).
-    node add:(self nodeLabel:'-'          ).
-    node add:(self nodeLabel:'Open...'    selector:#menuOpen).
-    node add:(self nodeLabel:'-'          ).
-    node add:(self nodeLabel:'Save'       selector:#menuSave).
-    node add:(self nodeLabel:'Save As...' selector:#menuSaveAs).
-    node add:(self nodeLabel:'-'          ).
-    node add:(self nodeLabel:'Exit'       selector:#closeRequest).
-    self addElement:node
-
-    "Created: / 23.8.1998 / 15:51:55 / cg"
-    "Modified: / 23.8.1998 / 16:04:24 / cg"
+isKindOfMenu
+    ^ true
+! !
+
+!MenuEditor::ItemRoot class methodsFor:'defaults'!
+
+defaultLabel
+    ^ MenuEditor resourceType
+! !
+
+!MenuEditor::ItemRoot class methodsFor:'interface - editor'!
+
+addBindingsTo:aspects for:aMenuEditor
+    "add additional bindings to the aspects
+    "
+! !
+
+!MenuEditor::ItemRoot class methodsFor:'interface - specs'!
+
+basicsEditSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:MenuEditor::ItemRoot andSelector:#basicsEditSpec
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+	#name: #basicsEditSpec
+	#window: 
+       #(#WindowSpec
+	  #label: 'basicsEditSpec'
+	  #name: 'basicsEditSpec'
+	  #min: #(#Point 10 10)
+	  #max: #(#Point 1280 1024)
+	  #bounds: #(#Rectangle 644 547 904 593)
+	)
+	#component: 
+       #(#SpecCollection
+	  #collection: #(
+	   #(#LabelSpec
+	      #label: 'Selector:'
+	      #name: 'selectorLabel'
+	      #layout: #(#AlignmentOrigin 107 0 26 0 1 0.5)
+	      #activeHelpKey: #basicsSelector
+	      #resizeForLabel: true
+	      #adjust: #right
+	    )
+	   #(#InputFieldSpec
+	      #name: 'selectorField'
+	      #layout: #(#LayoutFrame 110 0 15 0 -5 1.0 37 0)
+	      #activeHelpKey: #basicsSelector
+	      #tabable: true
+	      #model: #rawLabel
+	      #group: #inputGroup
+	      #type: #string
+	      #immediateAccept: false
+	      #acceptOnReturn: true
+	      #acceptOnTab: true
+	      #acceptChannel: #acceptChannel
+	      #modifiedChannel: #modifiedChannel
+	      #acceptOnPointerLeave: false
+	    )
+	   )
+         
+	)
+      )
+! !
+
+!MenuEditor::ItemRoot methodsFor:'accessing'!
+
+menuItem:aMenuItem
+    "rebuild self from a MenuItem
+    "
+    |submenu selector|
+
+    aMenuItem notNil ifTrue:[
+	submenu  := aMenuItem submenu.
+	selector := aMenuItem rawLabel.
+    ] ifFalse:[
+	selector := submenu := nil.
+    ].
+    self menu:submenu labeled:selector.
 !
 
-doCreateStandardHelpMenu
-
-    |node|
-    node := self nodeLabel:'Help'.
-    node parent: self selectedNode.        
-    node contents startGroup:#right.
-    node add:(self nodeLabel:'Documentation'          selector:#openDocumentation).
-    node add:(self nodeLabel:'-').
-    node add:(self nodeLabel:'About this Application' selector:#openAboutThisApplication).
-    self addElement:node
-
-    "Created: / 23.8.1998 / 15:52:46 / cg"
-    "Modified: / 23.8.1998 / 17:30:12 / cg"
-!
-
-doCut
-    ^ self doDeleteSelectionBuffered:true
+rawLabel:aValue
+    "set the label assigned to the item
+    "
+    |value|
+
+    aValue isString ifTrue:[
+        value := aValue withoutSeparators.
+
+        (value notEmpty and:[value first isLetter]) ifTrue:[
+            menuItem rawLabel:(value asSymbol)
+        ].
+    ].
 !
 
-doDelete
-    ^ self doDeleteSelectionBuffered:false
+slices
+    ^ #(
+	    (Basics   basicsEditSpec)
+       )
+! !
+
+!MenuEditor::ItemRoot methodsFor:'adding & removing'!
+
+remove
+    "cannot remove the root item; delete all my children
+    "
+    self removeAll.
+! !
+
+!MenuEditor::ItemRoot methodsFor:'aspects'!
+
+aspectAt:aKey put:aValue
+    "discard all other than the rawLabel
+    "
+    aKey == #rawLabel ifTrue:[ self rawLabel:aValue ].
+! !
+
+!MenuEditor::ItemRoot methodsFor:'displaying'!
+
+heightOn:aGC
+    height ifNil:[ height := aGC font heightOn:aGC device ].
+  ^ height
+! !
+
+!MenuEditor::ItemRoot methodsFor:'initialization'!
+
+initialize
+    super initialize.
+    isExpanded := true.
+! !
+
+!MenuEditor::ItemRoot methodsFor:'queries'!
+
+canCollapse
+    ^ false
 !
 
-doDeleteSelectionBuffered:aBool
-    |appl nsel list item prnt|
-
-    appl := self topView application.
-
-    (appl hasValidSelection value and: [self askForItemModification]) ifFalse:[
-        ^ self
+hasIndicator
+    ^ false
+!
+
+isDelayedMenu
+    ^ false
+!
+
+isRootItem
+    ^ true
+! !
+
+!MenuEditor::ItemRoot methodsFor:'queries - operation'!
+
+canMoveInAbove
+    ^ false
+!
+
+canMoveInNext
+    ^ false
+!
+
+canMoveOut
+    ^ false
+!
+
+canMoveUpOrDown
+   ^ false
+! !
+
+!MenuEditor::ItemSeparator class methodsFor:'interface - editor'!
+
+addBindingsTo:aspects for:aMenuEditor
+    "add additional bindings to the aspects
+    "
+    |holder|
+
+    aspects at:#seperatorList  ifAbsentPut:[
+	self separatorSlices collect:[:el| el last ]
     ].
-    aBool ifTrue:[
-        self doCopy
+
+    aspects at:#seperatorSelection ifAbsentPut:[
+	holder := 0 asValue.
+	holder addDependent:aMenuEditor.
+	holder
     ].
-    list := self list.
-    nsel := list size.
-    self selection do:[:aNumber| nsel := nsel min:aNumber ].
-
-    (     (item := list at:nsel ifAbsent:nil) notNil
-     and:[(prnt := item parent) notNil
-     and:[prnt children last == item]]
-    ) ifTrue:[
-        nsel := nsel - 1
+!
+
+defaultLabel
+    ^ '-'
+!
+
+separatorSlices
+    "get the list of menu spec values of the corresponding separator types
+    "
+    ^ #(
+	( #blank        ''      'blank' )
+	( #single       '-'     'single line')
+	( #double       '='     'double line')
+      )
+! !
+
+!MenuEditor::ItemSeparator class methodsFor:'interface - specs'!
+
+basicsEditSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:MenuEditor::ItemSeparator andSelector:#basicsEditSpec
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+	#name: #basicsEditSpec
+	#window: 
+       #(#WindowSpec
+	  #label: 'basicsEditSpec'
+	  #name: 'basicsEditSpec'
+	  #min: #(#Point 10 10)
+	  #max: #(#Point 1160 870)
+	  #bounds: #(#Rectangle 160 398 420 643)
+	)
+	#component: 
+       #(#SpecCollection
+	  #collection: #(
+	   #(#LabelSpec
+	      #label: 'Separator:'
+	      #name: 'separatorLabel'
+	      #layout: #(#AlignmentOrigin 107 0 26 0 1 0.5)
+	      #resizeForLabel: true
+	      #adjust: #right
+	    )
+	   #(#ComboListSpec
+	      #name: 'seperatorList'
+	      #layout: #(#LayoutFrame 110 0 15 0 -5 1.0 37 0)
+	      #activeHelpKey: #basicsSeparatorType
+	      #tabable: true
+	      #model: #seperatorSelection
+	      #comboList: #seperatorList
+	      #useIndex: true
+	    )
+	   #(#LabelSpec
+	      #label: 'Visibility:'
+	      #name: 'visibilityLabel'
+	      #layout: #(#AlignmentOrigin 107 0 51 0 1 0.5)
+	      #resizeForLabel: true
+	      #adjust: #right
+	    )
+	   #(#InputFieldSpec
+	      #name: 'visibilityInputField'
+	      #layout: #(#LayoutFrame 110 0 40 0 -5 1.0 62 0)
+	      #activeHelpKey: #detailsVisibility
+	      #tabable: true
+	      #model: #isVisible
+	      #group: #inputGroup
+	      #type: #symbolOrNil
+	      #immediateAccept: false
+	      #acceptOnReturn: true
+	      #acceptOnTab: true
+	      #acceptChannel: #acceptChannel
+	      #modifiedChannel: #modifiedChannel
+	      #acceptOnPointerLeave: false
+	    )
+	   #(#LabelSpec
+	      #label: 'Start Group:'
+	      #name: 'startGroupLabel'
+	      #layout: #(#AlignmentOrigin 107 0 88 0 1 0.5)
+	      #resizeForLabel: true
+	      #adjust: #right
+	    )
+	   #(#PopUpListSpec
+	      #label: 'left'
+	      #name: 'startGroupPopUp'
+	      #layout: #(#LayoutFrame 110 0 77 0 -5 1.0 99 0)
+	      #activeHelpKey: #detailsStartGroup
+	      #tabable: true
+	      #model: #startGroup
+	      #menu: 
+	     #(#left
+		#right
+	      )
+	    )
+	   )
+         
+	)
+      )
+! !
+
+!MenuEditor::ItemSeparator methodsFor:'accessing'!
+
+icon
+    ^ self class iconSeparator
+!
+
+rawLabel:aValue
+    |value|
+
+    aValue isString ifTrue:[
+	value := aValue withoutSeparators.
+
+	(self class separatorTypeOf:value) ifNotNil:[
+	    menuItem rawLabel:value
+	]
     ].
-
-    self selectedNodesRemove.
-    self selection:(nsel min:(list size)).
-    self setModified.
-
-    aBool ifTrue:[
-        "/ must update copy&paste indication
-        appl updateAllToolInstances.
-    ]
+!
+
+separatorType
+    ^ self class separatorTypeOf:(menuItem rawLabel).
+!
+
+slices
+    ^ #(
+	    (Basics   basicsEditSpec)
+       )
+! !
+
+!MenuEditor::ItemSeparator methodsFor:'aspects'!
+
+fromAspects:aspects
+    "put my values into the values of aspects
+    "
+    |index slice|
+
+    index  := (aspects at:#seperatorSelection) value ? 0.
+    slice  := self class separatorSlices at:index ifAbsent:nil.
+
+    slice ifNotNil:[ slice := slice at:2 ].
+
+    (aspects at:#rawLabel) value:slice.
+  ^ super fromAspects:aspects.
 !
 
-doPaste
-    |clip|
-
-    clip := self application clipboard.
-    (clip notNil and:[self selectedNode notNil]) ifTrue:[
-        self addElement:(clip collect:[:el| el copy])
+toAspects:aspects
+    "put my values into the values of aspects
+    "
+    |index type|
+
+    type   := self separatorType.
+    index  := self class separatorSlices findFirst:[:el| el first == type ].
+
+    (aspects at:#seperatorSelection) value:index.
+  ^ super  toAspects:aspects.
+! !
+
+!MenuEditor::ItemSeparator methodsFor:'displaying'!
+
+displayOn:aGC x:x y:y h:h
+    "draw the receiver in the graphicsContext, aGC.
+    "
+    |x1 y0 type|
+
+    type := self separatorType.
+    type == #blank ifTrue:[ ^ self ].
+
+    x1 := x + (self widthOn:aGC).
+    y0 := y + (h // 2) - 1.
+
+    type == #double ifTrue:[
+	y0 := y0 + 1.
+	aGC displayLineFromX:x y:y0 toX:x1 y:y0.
+	y0 := y0 - 2
     ].
+    aGC displayLineFromX:x y:y0 toX:x1 y:y0
+!
+
+widthOn:aGC
+    width ifNil:[ width := 60 ].
+  ^ width
 ! !
 
-!MenuEditor::TreeView methodsFor:'private'!
-
-addElement: aNode
-    "add something after selection"
-
-    |label sel selParent|     
-
-    self askForItemModification ifFalse:[^ self].
-
-    self selectedNodeAdd:aNode.
-    (aNode isCollection not and:[aNode name = 'Item']) 
-    ifTrue:[
-        sel := self selectedNode.
-        selParent := sel parent.
-        label := aNode name 
-                 , 
-                 ' '
-                 ,
-                 (selParent notNil 
-                 ifTrue:[
-                     (((sel children size = 0 
-                         ifTrue: [selParent children] 
-                         ifFalse: [sel children]) 
-                     select:[:node| 
-                         |lab| 
-                         lab := node contents label. 
-                         ((node children size = 0) & 
-                         node contents submenuChannel isNil &
-                         (lab ~= '-') & (lab ~= '=') & (lab ~= ''))
-                     ]) size) printString
-                 ] 
-                 ifFalse: ['1']).  
-
-        aNode name: label string asBoldText.
-        aNode contents label: label string.
-    ].    
-    aNode isCollection ifFalse: [
-        self selectNode: aNode
-    ] ifTrue: [
-        self selection: (aNode collect: [:node| self indexOfNode: node])
+!MenuEditor::ResourceEditor class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:MenuEditor::ResourceEditor andSelector:#windowSpec
+     MenuEditor::ResourceEditor new openInterface:#windowSpec
+     MenuEditor::ResourceEditor open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+	#name: #windowSpec
+	#window: 
+       #(#WindowSpec
+	  #label: 'Image Item'
+	  #name: 'Image Item'
+	  #min: #(#Point 10 10)
+	  #max: #(#Point 1280 1024)
+	  #bounds: #(#Rectangle 333 290 621 585)
+	)
+	#component: 
+       #(#SpecCollection
+	  #collection: #(
+	   #(#LabelSpec
+	      #label: 'Retriever:'
+	      #name: 'retrieverLabel'
+	      #layout: #(#AlignmentOrigin 107 0 26 0 1 0.5)
+	      #activeHelpKey: #imageRetriever
+	      #resizeForLabel: true
+	      #adjust: #right
+	    )
+	   #(#ComboBoxSpec
+	      #name: 'retrieverHolder'
+	      #layout: #(#LayoutFrame 110 0 15 0 -20 1.0 37 0)
+	      #activeHelpKey: #imageRetriever
+	      #tabable: true
+	      #model: #retrieverHolder
+	      #type: #symbolOrNil
+	      #immediateAccept: true
+	      #acceptOnReturn: false
+	      #acceptOnTab: false
+	      #acceptOnPointerLeave: false
+	      #comboList: #retrieverList
+	      #isFilenameBox: false
+	    )
+	   #(#LabelSpec
+	      #label: 'Selector:'
+	      #name: 'iconLabel'
+	      #layout: #(#AlignmentOrigin 107 0 51 0 1 0.5)
+	      #activeHelpKey: #imageSelector
+	      #resizeForLabel: true
+	      #adjust: #right
+	    )
+	   #(#InputFieldSpec
+	      #name: 'selectorHolder'
+	      #layout: #(#LayoutFrame 110 0 40 0 -42 1.0 62 0)
+	      #activeHelpKey: #imageSelector
+	      #tabable: true
+	      #model: #selectorHolder
+	      #group: #inputGroup
+	      #type: #symbolOrNil
+	      #immediateAccept: true
+	      #acceptOnReturn: false
+	      #acceptOnTab: false
+	      #modifiedChannel: #modifiedChannel
+	      #acceptOnPointerLeave: false
+	    )
+	   #(#ActionButtonSpec
+	      #label: '...'
+	      #name: 'browseButton'
+	      #layout: #(#LayoutFrame -40 1 40 0 -20 1 62 0)
+	      #activeHelpKey: #browseResource
+	      #tabable: true
+	      #model: #doBrowseForImageResource
+	    )
+	   #(#HierarchicalListViewSpec
+	      #name: 'imageList'
+	      #layout: #(#LayoutFrame 20 0.0 67 0 -20 1.0 -30 1.0)
+	      #activeHelpKey: #imageImageList
+	      #model: #imageHolder
+	      #menu: #menuEditImage
+	      #hasHorizontalScrollBar: true
+	      #hasVerticalScrollBar: true
+	      #miniScrollerHorizontal: true
+	      #listModel: #imageList
+	      #useIndex: false
+	      #highlightMode: #label
+	      #postBuildCallback: #postBuildImageViewer:
+	    )
+	   #(#ViewSpec
+	      #name: 'Box1'
+	      #layout: #(#LayoutFrame 20 0.0 -30 1.0 -20 1.0 0 1.0)
+	      #level: 0
+	      #component: 
+	     #(#SpecCollection
+		#collection: #(
+		 #(#CheckBoxSpec
+		    #label: 'Image & Label'
+		    #name: 'iconAndLabelCheckBox'
+		    #layout: #(#AlignmentOrigin 0 0 0 0.5 0 0.5)
+		    #activeHelpKey: #imageImageAndLabel
+		    #tabable: true
+		    #model: #iconAndLabelHolder
+		  )
+		 #(#ActionButtonSpec
+		    #label: 'Image Editor'
+		    #name: 'imageEditorButton'
+		    #layout: #(#AlignmentOrigin 0 1.0 0 0.5 1 0.5)
+		    #activeHelpKey: #imageImageEditor
+		    #tabable: true
+		    #model: #doEditImage
+		  )
+		 )
+               
+	      )
+	    )
+	   )
+         
+	)
+      )
+! !
+
+!MenuEditor::ResourceEditor methodsFor:'accessing'!
+
+resourceRetriever
+    |rcv sel cls|
+
+    sel := selectorHolder value.
+    sel size == 0 ifTrue:[ ^ nil ].
+    cls := self retrieverClass.
+    cls ifNotNil:[ cls := cls name asSymbol ].
+
+    rcv := ResourceRetriever new.
+    rcv className:cls.
+    rcv  selector:sel.
+
+    iconAndLabelHolder value ifTrue:[ rcv labelText:'' ].
+  ^ rcv
+!
+
+resourceRetriever:aResourceRetriever
+    |cls sel isOn|
+
+    aResourceRetriever notNil ifTrue:[
+	cls := aResourceRetriever className.
+	cls ifNotNil:[
+	    cls isBehavior ifTrue:[cls := cls name asSymbol].
+	].
+	sel  := aResourceRetriever selector.
+	isOn := aResourceRetriever labelText notNil.
+    ] ifFalse:[
+	cls := sel := nil.
+	isOn := false.
     ].
-    self setModified.
+
+    retrieverHolder value:cls.
+    selectorHolder  value:sel.
+    iconAndLabelHolder value:isOn.
+!
+
+retrieverClass
+    |cls|
+
+    cls  := retrieverHolder value.
+
+    cls size ~~ 0 ifTrue:[
+	cls := Smalltalk at:cls ifAbsent:nil.
+
+	(cls notNil and:[cls isBehavior]) ifTrue:[
+	    ^ cls
+	].
+    ].
+    ^ nil
+! !
+
+!MenuEditor::ResourceEditor methodsFor:'actions'!
+
+doBrowseForImageResource
+    "opens a browser on image-resource methods"
+
+    |msg|
+
+    msg := ResourceSelectionBrowser
+		 request:'Use Image From Class'
+	    onSuperclass:nil
+		andClass:(self retrieverClass)
+	     andSelector:(selectorHolder value)
+       withResourceTypes:#(image fileImage programImage).
+
+    msg ifNil:[ ^ self ].
+    msg := msg asCollectionOfWords.
+    msg size == 2 ifFalse:[ ^ self ].
+
+    retrieverHolder value:(msg first asSymbol).
+    selectorHolder  value:(msg last  asSymbol).
+!
+
+doEditImage
+    |item|
+
+    item := imageHolder value.
+    item ifNotNil:[ item doEdit ].
+! !
+
+!MenuEditor::ResourceEditor methodsFor:'aspects'!
+
+iconAndLabelHolder
+    ^ iconAndLabelHolder
+!
+
+imageHolder
+    ^ imageHolder.
 !
 
-askForItemModification
-
-    ^self topView application askForItemModification
+imageList
+    ^ imageList.
+!
+
+modifiedChannel
+    ^ builder booleanValueAspectFor: #modifiedChannel
+!
+
+modifiedChannel:aChannel
+    builder aspectAt:#modifiedChannel put:aChannel.
+!
+
+retrieverHolder
+    ^ retrieverHolder
+!
+
+retrieverList
+    |list|
+
+    list := builder bindingAt:#retrieverList.
+
+    list ifNil:[
+	list := MenuEditor imageRetrieverClasses asList.
+	builder aspectAt:#retrieverList put:list.
+    ].
+    ^ list
 !
 
-nodeLabel:aLabel
-
-    ^TreeItem new contents: ((MenuEditor::Item new label:aLabel) translateLabel:true)
-
-    "Modified: / 6.6.1998 / 17:22:35 / cg"
+selectorHolder
+    ^ selectorHolder.
+! !
+
+!MenuEditor::ResourceEditor methodsFor:'change & update'!
+
+retrieverChanged
+    "called if the retriever changed
+    "
+    |retriever list name|
+
+    retriever := self retrieverClass.
+    imageHolder setValue:nil.
+
+    imageList root fromClass:retriever.
+    self selectorChanged.
+
+    (retriever notNil and:[imageList size ~~ 0]) ifTrue:[
+        list := self retrieverList.
+        name := retriever name.
+
+        (list includes:name) ifFalse:[
+            list add:(name asSymbol).
+        ]
+    ].
 !
 
-nodeLabel:aLabel selector:aSelector
-
-    ^TreeItem new contents: (((MenuEditor::Item new label:aLabel) value:aSelector) translateLabel:true)
-
-    "Modified: / 6.6.1998 / 17:22:35 / cg"
-    "Created: / 23.8.1998 / 15:58:59 / cg"
+selectorChanged
+    |item selector line|
+
+    imageList isEmpty ifTrue:[^ self].
+
+    selector := selectorHolder value.
+    selector size == 0 ifTrue:[ ^ imageHolder value:nil ].
+
+    item     := nil.
+    selector := selector asSymbol.
+
+    imageList do:[:anItem| |sel|
+	sel := anItem selector.
+	selector == sel ifTrue:[
+	    ^ imageHolder value:anItem
+	].
+	item ifNil:[
+	    (sel startsWith:selector) ifTrue:[ item := anItem ]
+	]
+    ].
+    imageHolder value:nil.
+
+    item ifNotNil:[
+	line := imageList identityIndexOf:item.
+	imageViewer scrollToLine:line
+    ].
 !
 
-selectedNodeAdd:something
-
-    |node numChildren|
-
-    something notNil ifTrue:[
-        (node := self selectedNode) notNil ifTrue:[
-            numChildren := node children size.
-
-            node parent notNil ifTrue:[
-                node isCollapsable ifTrue:[
-                    model add:something afterIndex:numChildren below:node
-                ] ifFalse:[
-                    model add:something after:node
-                ]
-            ] ifFalse:[
-                model add:something afterIndex:numChildren below:(self root)
-            ]
-        ]
-    ]
-
-
+update:what with:aPara from:aModel
+    "Invoked when an object that I depend upon sends a change notification."
+
+    |item|
+
+    self modifiedChannel value:true.
+
+    aModel == retrieverHolder ifTrue:[ ^ self retrieverChanged ].
+    aModel == selectorHolder  ifTrue:[ ^ self selectorChanged  ].
+
+    aModel == imageHolder ifTrue:[
+	item := imageHolder value.
+	item ifNotNil:[ selectorHolder value:(item label) ].
+      ^ self
+    ].
+    super update:what with:aPara from:aModel
+! !
+
+!MenuEditor::ResourceEditor methodsFor:'initialization'!
+
+initialize
+    super initialize.
+
+    iconAndLabelHolder := true asValue.
+    iconAndLabelHolder addDependent:self.
+
+    imageHolder := nil asValue.
+
+    selectorHolder := nil asValue.
+    selectorHolder addDependent:self.
+
+    imageList := HierarchicalList new.
+    imageList application:self.
+    imageList root:(MenuEditor::ResourceEditorItem new).
+    imageList showRoot:false.
+
+    imageHolder := nil asValue.
+    imageHolder addDependent:self.
+
+    retrieverHolder := nil asValue.
+    retrieverHolder addDependent:self.
+!
+
+postBuildImageViewer:aWidget
+    imageViewer := aWidget.
+! !
+
+!MenuEditor::ResourceEditorItem class methodsFor:'instance creation'!
+
+fromClass:aClass selector:aSelector
+    |item|
+
+    item := self new.
+    item fromClass:aClass selector:aSelector.
+  ^ item
+! !
+
+!MenuEditor::ResourceEditorItem methodsFor:'accessing'!
+
+icon
+    ^ icon
+!
+
+label
+    ^ selector
 !
 
-setModified 
-    |app|
-
-    (app := self topView application) modified: true.
-    app updateChannels
+selector
+    ^ selector
+! !
+
+!MenuEditor::ResourceEditorItem methodsFor:'instance creation'!
+
+fromClass:aClass
+    |r item|
+
+    (aClass notNil and:[aClass isBehavior]) ifFalse:[
+	^ self collapse.
+    ].
+    aClass == selector ifTrue:[
+	^ self expand
+    ].
+    self collapse.
+
+    selector := aClass.
+    children := SortedCollection sortBlock:[:a :b| a label < b label ].
+
+    self application withWaitCursorDo:[
+	aClass withAllSuperclassesDo:[:aClass|
+	    aClass class selectorsAndMethodsDo:[:sel :m| 
+		((r := m resourceType) == #image or:[r == #programImage]) ifTrue:[
+		    item := self class fromClass:aClass selector:sel.
+		    item parent:self.
+		    children add:item
+		]
+	    ]
+	].
+	self expand
+    ].
+!
+
+fromClass:aClass selector:aSelector
+    |w h magnify|
+
+    selector := aSelector asSymbol.
+    icon  := aClass perform:selector.
+
+    w := icon width.
+    h := icon height.
+
+    w > 32 ifTrue:[
+	magnify := 32 / w.
+	h > 32 ifTrue:[ magnify := (32 / h) max:magnify ].
+    ] ifFalse:[
+	h > 32 ifFalse:[^ self].
+	magnify := 32 / h.
+    ].
+    icon := icon magnifiedBy: magnify.
+!
+
+initialize
+    super initialize.
+    children := #().
+! !
+
+!MenuEditor::ResourceEditorItem methodsFor:'user operations'!
+
+doEdit
+    "open image browser on self
+    "
+    |parent|
+
+    parent := self parent.
+
+    parent ifNotNil:[
+	ImageEditor openOnClass:(parent selector) andSelector:selector
+    ].
 ! !
 
 !MenuEditor class methodsFor:'documentation'!
@@ -3684,4 +4618,5 @@
 version
     ^ '$Header$'
 ! !
+
 MenuEditor initialize!