added a selector filter (to the image resource tab)
authorClaus Gittinger <cg@exept.de>
Wed, 03 Aug 2011 10:59:52 +0200
changeset 2850 3a5c3b8eedff
parent 2849 e061cea3416f
child 2851 860e0292c5ce
added a selector filter (to the image resource tab) makes it easier to find an icon in big image libraries
MenuEditor.st
--- a/MenuEditor.st	Mon Jul 25 17:31:32 2011 +0200
+++ b/MenuEditor.st	Wed Aug 03 10:59:52 2011 +0200
@@ -27,6 +27,21 @@
 	privateIn:MenuEditor
 !
 
+ApplicationModel subclass:#ImageResourceEditor
+	instanceVariableNames:'selectorHolder iconAndLabelHolder retrieverHolder imageHolder
+		imageList selectorFilterHolder imageListView'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:MenuEditor
+!
+
+HierarchicalItem subclass:#ImageResourceEditorItem
+	instanceVariableNames:'selector icon'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:MenuEditor::ImageResourceEditor
+!
+
 MenuEditor::Item subclass:#ActionItem
 	instanceVariableNames:''
 	classVariableNames:''
@@ -55,21 +70,6 @@
 	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::RegularMenuItem subclass:#RootItem
 	instanceVariableNames:''
 	classVariableNames:''
@@ -242,6 +242,12 @@
 !
 
 helpSpec
+    ^super helpSpec addPairsFrom:(self localFlyHelpSpecStrings)
+
+    "Modified: / 03-08-2011 / 10:13:37 / cg"
+!
+
+localFlyHelpSpecStrings
     "This resource specification was automatically generated
      by the UIHelpTool of ST/X."
 
@@ -254,7 +260,22 @@
 
     <resource: #help>
 
-    ^ super helpSpec addPairsFrom:#(
+    ^ #(
+
+#editCut
+'Cut Item'
+
+#editCopy
+'Copy Item'
+
+#editPaste
+'Paste Item'
+
+#fileSaveSpec
+'Save Menuspec'
+
+#addMenuSlice
+'Add Menuslice'
 
 #addDelayedMenu
 'Add a new delayed menu to item.'
@@ -412,71 +433,11 @@
 #triggerOnDown
 'If on, the items action is performed on mouse-button press (default is: on button-release).'
 
+#selectorFilter
+'In the list below, only matching selectors are shown'
 )
 
-    "Modified: / 21-10-2010 / 14:18:03 / cg"
-!
-
-localFlyHelpSpecStrings
-    "This resource specification was automatically generated
-     by the UIHelpTool of ST/X."
-
-    "Do not manually edit this!! If it is corrupted,
-     the UIHelpTool may not be able to read the specification."
-
-    "
-     UIHelpTool openOnClass:MenuEditor
-    "
-
-    <resource: #help>
-
-    ^ #(
-
-#editCut
-'Cut Item'
-
-#editCopy
-'Copy Item'
-
-#editPaste
-'Paste Item'
-
-#fileLoad
-'Load Menuspec from Method'
-
-#fileSave
-'Save Menuspec as Method'
-
-#fileSaveSpec
-'Save Menuspec'
-
-#fileSaveAs
-'Save Menuspec as Method...'
-
-#addMenuSeparator
-'Add Separator'
-
-#addMenuItem
-'Add Item'
-
-#addMenuSlice
-'Add Menuslice'
-
-#addSubMenu
-'Add Submenu'
-
-#addDelayedMenu
-'Add Delayed Menu'
-
-#addDelayedSubMenuLink
-'Add Delayed Linked Menu'
-
-#addSubMenuLink
-'Add Linked Submenu'
-
-#fileNew
-'New Menuspec'
-)
+    "Modified: / 03-08-2011 / 10:17:05 / cg"
 ! !
 
 !MenuEditor class methodsFor:'image specs'!
@@ -1668,15 +1629,21 @@
 !
 
 imageTool
-    "get the image tool application
-    "
-    ^ wizards at:#image ifAbsentPut:[ |tool|
-        tool := ResourceEditor new createBuilder.
-        tool masterApplication:self.
-        tool modifiedChannel: self enablingCommitButtonsHolder.
-        tool builder window:(ApplicationSubView new client:tool).
-        tool
-    ]
+    "get the image tool application"
+
+    ^ wizards 
+        at:#image 
+        ifAbsentPut:[ 
+            |tool|
+
+            tool := ImageResourceEditor new createBuilder.
+            tool masterApplication:self.
+            tool modifiedChannel: self enablingCommitButtonsHolder.
+            tool builder window:(ApplicationSubView new client:tool).
+            tool
+        ]
+
+    "Modified: / 03-08-2011 / 10:03:08 / cg"
 !
 
 savedSpec
@@ -3888,6 +3855,653 @@
     ^ parent children size > 1
 ! !
 
+!MenuEditor::ImageResourceEditor 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::ImageResourceEditor andSelector:#windowSpec
+     MenuEditor::ImageResourceEditor new openInterface:#windowSpec
+     MenuEditor::ImageResourceEditor open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(FullSpec
+        name: windowSpec
+        window: 
+       (WindowSpec
+          label: 'Image Item'
+          name: 'Image Item'
+          min: (Point 10 10)
+          bounds: (Rectangle 0 0 303 304)
+        )
+        component: 
+       (SpecCollection
+          collection: (
+           (LabelSpec
+              label: 'Retriever:'
+              name: 'retrieverLabel'
+              layout: (AlignmentOrigin 107 0 26 0 1 0.5)
+              activeHelpKey: imageRetriever
+              translateLabel: true
+              resizeForLabel: true
+              adjust: right
+            )
+           (ComboBoxSpec
+              name: 'retrieverHolder'
+              layout: (LayoutFrame 110 0 15 0 -2 1.0 37 0)
+              activeHelpKey: imageRetriever
+              tabable: true
+              model: retrieverHolder
+              type: symbolOrNil
+              immediateAccept: true
+              acceptOnReturn: false
+              acceptOnTab: false
+              acceptOnPointerLeave: false
+              entryCompletionBlock: entryCompletionForRetriever
+              comboList: retrieverList
+              isFilenameBox: false
+            )
+           (LabelSpec
+              label: 'Selector:'
+              name: 'iconLabel'
+              layout: (AlignmentOrigin 107 0 51 0 1 0.5)
+              activeHelpKey: imageSelector
+              translateLabel: true
+              resizeForLabel: true
+              adjust: right
+            )
+           (InputFieldSpec
+              name: 'selectorHolder'
+              layout: (LayoutFrame 110 0 40 0 -24 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 -22 1 40 0 -2 1 62 0)
+              activeHelpKey: browseResource
+              tabable: true
+              model: doBrowseForImageResource
+            )
+           (DividerSpec
+              name: 'Separator1'
+              layout: (LayoutFrame 0 0.0 66 0 0 1.0 70 0)
+            )
+           (ViewSpec
+              name: 'SelectorFilterBox2'
+              layout: (LayoutFrame 0 0.0 74 0 0 1.0 96 0)
+              activeHelpKey: selectorFilter
+              component: 
+             (SpecCollection
+                collection: (
+                 (LabelSpec
+                    label: 'Filter:'
+                    name: 'Label1'
+                    layout: (AlignmentOrigin 107 0 11 0 1 0.5)
+                    activeHelpKey: selectorFilter
+                    translateLabel: true
+                    resizeForLabel: true
+                    adjust: right
+                  )
+                 (InputFieldSpec
+                    name: 'EntryField1'
+                    layout: (LayoutFrame 110 0 0 0 -2 1 22 0)
+                    model: selectorFilterHolder
+                    immediateAccept: true
+                    acceptOnLeave: true
+                    acceptOnReturn: false
+                    acceptOnTab: false
+                    acceptOnPointerLeave: false
+                    activeHelpKey: selectorFilter
+                  )
+                 )
+               
+              )
+            )
+           (HierarchicalListViewSpec
+              name: 'imageList'
+              layout: (LayoutFrame 2 0.0 100 0 -2 1.0 -60 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 -60 1.0 -20 1.0 0 1.0)
+              level: 0
+              component: 
+             (SpecCollection
+                collection: (
+                 (CheckBoxSpec
+                    label: 'Image & Label'
+                    name: 'iconAndLabelCheckBox'
+                    layout: (AlignmentOrigin 0 0 17 0 0 0.5)
+                    activeHelpKey: imageImageAndLabel
+                    tabable: true
+                    model: iconAndLabelHolder
+                    translateLabel: true
+                  )
+                 (ActionButtonSpec
+                    label: 'Image Editor'
+                    name: 'imageEditorButton'
+                    layout: (AlignmentOrigin -69 1.0 17 0 0 0.5)
+                    activeHelpKey: imageImageEditor
+                    hasCharacterOrientedLabel: false
+                    foregroundColor: (Color 0.0 0.0 66.9993133440146)
+                    tabable: true
+                    model: doEditImage
+                  )
+                 (ActionButtonSpec
+                    label: 'Browse'
+                    name: 'Button1'
+                    layout: (AlignmentOrigin -69 1.0 41 0 0 0.5)
+                    activeHelpKey: imageBrowseImageClass
+                    hasCharacterOrientedLabel: false
+                    foregroundColor: (Color 0.0 0.0 66.9993133440146)
+                    tabable: true
+                    model: doBrowseImageClass
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+
+    "Modified: / 03-08-2011 / 10:16:13 / cg"
+! !
+
+!MenuEditor::ImageResourceEditor methodsFor:'accessing'!
+
+resourceRetriever
+    |rcv sel cls clsName|
+
+    sel := selectorHolder value.
+    sel size == 0 ifTrue:[ ^ nil ].
+    cls := self retrieverClass.
+    cls notNil ifTrue:[ 
+        clsName := retrieverHolder value.
+        clsName isEmptyOrNil ifTrue:[
+            clsName := cls name.
+        ].
+        clsName := clsName asSymbol.
+    ].
+
+    rcv := ResourceRetriever new.
+    rcv className:clsName.
+    rcv selector:sel.
+
+    iconAndLabelHolder value ifTrue:[ rcv labelText:'' ].
+    ^ rcv
+!
+
+resourceRetriever:aResourceRetriever
+    |className sel isOn|
+
+    aResourceRetriever notNil ifTrue:[
+        className := aResourceRetriever className.
+        className isBehavior ifTrue:[
+            className := className name asSymbol
+        ].
+        sel  := aResourceRetriever selector.
+        isOn := aResourceRetriever labelText notNil.
+    ] ifFalse:[
+        className := sel := nil.
+        isOn := false.
+    ].
+
+    retrieverHolder value:className.
+    selectorHolder  value:sel.
+    iconAndLabelHolder value:isOn.
+!
+
+retrieverClass
+    |clsName cls|
+
+    clsName  := retrieverHolder value.
+    clsName notEmptyOrNil ifTrue:[
+        cls := Smalltalk at:clsName ifAbsent:nil.
+        (cls isBehavior) ifTrue:[
+            ^ cls
+        ].
+    ].
+    ^ nil
+! !
+
+!MenuEditor::ImageResourceEditor methodsFor:'actions'!
+
+doBrowseForImageResource
+    "opens a browser on image-resource methods"
+
+    |classAndSelector|
+
+    classAndSelector := ResourceSelectionBrowser
+		request:'Use Image From Class'
+		onSuperclass:nil
+		andClass:(self retrieverClass)
+		andSelector:(selectorHolder value)
+		withResourceTypes:#(image fileImage programImage).
+
+    classAndSelector isNil ifTrue:[ ^ self ].
+
+    retrieverHolder value:(classAndSelector methodClass) name.
+    selectorHolder  value:(classAndSelector methodSelector).
+!
+
+doBrowseImageClass
+    |cls sel image|
+
+    (cls := retrieverHolder value) isNil ifTrue:[
+        Dialog warn:'No resource retriever is defined.'.
+    ] ifFalse:[
+        sel := selectorHolder value.
+
+        cls := Smalltalk classNamed:cls.
+        cls isNil ifTrue:[
+            Dialog warn:'No such resource retriever class.'.
+        ] ifFalse:[
+            (cls respondsTo:#visualFor:) ifTrue:[
+                image := cls visualFor:sel.
+                image ~~ (cls perform:sel) ifTrue:[
+                    self warn:'The image is resolved via #visualFor: from some unknown class'.
+                    sel := #visualFor:.
+                ].
+            ].
+            UserPreferences current systemBrowserClass openInClass:cls class selector:sel
+        ]
+    ]
+
+    "Created: / 20-09-2010 / 13:27:34 / cg"
+!
+
+doEditImage
+    |sel cls item image|
+
+    item := imageHolder value.
+    item notNil ifTrue:[
+        item doEdit.
+        ^ self.
+    ].
+
+    sel := selectorHolder value. 
+    sel isNil ifTrue:[
+        Dialog warn:'No selector is defined.'.
+        ^ self.
+    ].
+    cls := retrieverHolder value.
+    cls isNil ifTrue:[
+        Dialog warn:'No resource retriever is defined.'.
+        ^ self.
+    ].
+    cls := Smalltalk classNamed:cls.
+    cls isNil ifTrue:[
+        Dialog warn:'No such resource retriever class.'.
+        ^ self.
+    ].
+    (cls respondsTo:#visualFor:) ifTrue:[
+        image := cls visualFor:sel.
+        image ~~ (cls perform:sel ifNotUnderstood:nil) ifTrue:[
+            self warn:'The image is resolved via #visualFor: from some unknown class'.
+            image notNil ifTrue:[
+                ImageEditor openOnImage:image.
+            ].
+            ^ self.
+        ].
+    ].
+
+    ImageEditor openOnClass:cls andSelector:sel
+! !
+
+!MenuEditor::ImageResourceEditor methodsFor:'aspects'!
+
+entryCompletionForRetriever
+    ^ DoWhatIMeanSupport classNameEntryCompletionBlock.
+
+    "Modified: / 10-08-2006 / 12:55:22 / cg"
+!
+
+iconAndLabelHolder
+    ^ iconAndLabelHolder
+!
+
+imageHolder
+    ^ imageHolder.
+!
+
+imageList
+    ^ imageList
+!
+
+modifiedChannel
+    ^ builder booleanValueAspectFor: #modifiedChannel
+!
+
+modifiedChannel:aChannel
+    builder aspectAt:#modifiedChannel put:aChannel.
+!
+
+retrieverHolder
+    ^ retrieverHolder
+!
+
+retrieverList
+    |list cls|
+
+    list := builder bindingAt:#retrieverList.
+    list isNil ifTrue:[
+        list := MenuEditor imageRetrieverClasses asList.
+        builder aspectAt:#retrieverList put:list.
+    ].
+    (masterApplication notNil 
+     and:[(cls := masterApplication specClass) notNil]) ifTrue:[
+        list := list copyWithFirst:cls.
+    ].
+    ^ list
+!
+
+selectorFilterHolder
+    ^ selectorFilterHolder
+
+    "Created: / 03-08-2011 / 10:01:05 / cg"
+!
+
+selectorHolder
+    ^ selectorHolder.
+! !
+
+!MenuEditor::ImageResourceEditor methodsFor:'change & update'!
+
+retrieverChanged
+    |retriever list name|
+
+    retriever := self retrieverClass.
+    imageHolder setValue:nil.
+
+    self updateImageList.
+    self updateSelectedImage.
+
+    (retriever notNil and:[imageList size ~~ 0]) ifTrue:[
+        list := self retrieverList.
+        name := retriever name.
+
+        (list includes:name) ifFalse:[
+            list add:(name asSymbol).
+        ]
+    ].
+
+    "Modified: / 03-08-2011 / 10:56:58 / cg"
+!
+
+selectorChanged
+    self updateSelectedImage.
+
+    "Modified: / 03-08-2011 / 10:56:04 / cg"
+!
+
+selectorFilterChanged
+    self updateImageList.
+    self updateSelectedImage.
+
+    "Created: / 03-08-2011 / 10:58:47 / cg"
+!
+
+update:what with:aPara from:aModel
+    |item|
+
+    self modifiedChannel value:true.
+
+    aModel == retrieverHolder ifTrue:[ self retrieverChanged. ^ self ].
+    aModel == selectorHolder ifTrue:[ self selectorChanged. ^ self  ].
+    aModel == selectorFilterHolder ifTrue:[ self selectorFilterChanged. ^ self  ].
+
+    aModel == imageHolder ifTrue:[
+        item := imageHolder value.
+        item ifNotNil:[ 
+            selectorHolder value:(item label) 
+        ].
+        ^ self
+    ].
+    super update:what with:aPara from:aModel
+
+    "Modified: / 03-08-2011 / 10:58:37 / cg"
+!
+
+updateImageList
+    |retriever selectorFilterString filter|
+
+    retriever := self retrieverClass.
+
+    filter := [:sel | true].
+    (selectorFilterString := selectorFilterHolder value) notEmptyOrNil ifTrue:[
+        selectorFilterString includesMatchCharacters ifTrue:[
+            filter := [:sel | selectorFilterString match:sel ignoreCase:true].
+        ] ifFalse:[
+            filter := [:sel | sel includesString:selectorFilterString].
+        ].
+    ].
+
+    imageList root updateFromClass:retriever selectorFilter:filter.
+
+    "Created: / 03-08-2011 / 10:56:41 / cg"
+!
+
+updateSelectedImage
+    "provider or selector has changed; select it in the list"
+
+    |item selector line|
+
+    imageList isEmpty ifTrue:[^ self].
+
+    selector := selectorHolder value.
+    selector isEmptyOrNil ifTrue:[ 
+        imageHolder value:nil. 
+        ^ self 
+    ].
+
+    item     := nil.
+    selector := selector asSymbol.
+
+    imageList do:[:anItem| 
+        |sel|
+
+        sel := anItem selector.
+        selector == sel ifTrue:[
+            imageHolder value:anItem.
+            ^ self
+        ].
+        item isNil ifTrue:[
+            (sel startsWith:selector) ifTrue:[ item := anItem ]
+        ]
+    ].
+    imageHolder value:nil.
+
+    item ifNotNil:[
+        line := imageList identityIndexOf:item.
+        line ~~ 0 ifTrue:[
+            "/ imageListView scrollToLine:line
+            imageListView makeLineVisible:line
+        ]
+    ].
+
+    "Created: / 03-08-2011 / 10:55:45 / cg"
+! !
+
+!MenuEditor::ImageResourceEditor 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:(ImageResourceEditorItem new).
+    imageList showRoot:false.
+
+    imageHolder := nil asValue.
+    imageHolder addDependent:self.
+
+    retrieverHolder := nil asValue.
+    retrieverHolder addDependent:self.
+
+    selectorFilterHolder := '' asValue.
+    selectorFilterHolder addDependent:self.
+
+    "Modified: / 03-08-2011 / 10:18:46 / cg"
+!
+
+postBuildImageViewer:aWidget
+    imageListView := aWidget.
+! !
+
+!MenuEditor::ImageResourceEditor::ImageResourceEditorItem methodsFor:'accessing'!
+
+icon
+    ^ icon
+!
+
+label
+    ^ selector
+!
+
+selector
+    ^ selector
+! !
+
+!MenuEditor::ImageResourceEditor::ImageResourceEditorItem methodsFor:'instance creation'!
+
+forClass:aClass selector:aSelector
+    |w h magnify iconOrSymbol|
+
+    selector := aSelector asSymbol.
+    selector numArgs == 0 ifFalse:[^ self].
+
+    "do what the ResourceRetriever will do"
+    (aClass respondsTo:#visualFor:) ifTrue:[
+        iconOrSymbol := aClass visualFor:selector.
+    ].
+    iconOrSymbol isNil ifTrue:[
+        iconOrSymbol := aClass perform:selector.
+    ].
+    iconOrSymbol isSymbol ifTrue:[
+        icon := ToolbarIconLibrary perform:iconOrSymbol.
+    ] ifFalse:[
+        icon := iconOrSymbol.
+    ].
+
+    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.
+
+    "Modified: / 13-04-2011 / 18:56:45 / cg"
+    "Created: / 03-08-2011 / 10:47:16 / cg"
+!
+
+initialize
+    super initialize.
+    children := #().
+!
+
+updateFromClass:aClass selectorFilter:aFilterBlock
+    |r item|
+
+    (aClass notNil and:[aClass isBehavior]) ifFalse:[
+        ^ self collapse.
+    ].
+"/    aClass == selector ifTrue:[
+"/        ^ self expand
+"/    ].
+    self collapse.
+
+    selector := aClass.
+    children := OrderedCollection new.
+
+    self application withWaitCursorDo:[
+        aClass withAllSuperclassesDo:[:aClass|
+            aClass class selectorsAndMethodsDo:[:sel :m|
+                (aFilterBlock value:sel) ifTrue:[
+                    m hasResource ifTrue:[
+                        r := m resources.
+                        r notEmptyOrNil ifTrue:[
+                            ((r includesKey:#image) or:[r includesKey:#programImage]) ifTrue:[
+                                item := self class new forClass:aClass selector:sel.
+                                item parent:self.
+                                children add:item
+                            ]
+                        ]
+                    ]
+                ]
+            ]
+        ].
+        children sort:[:a :b | a label < b label ].
+        self expand
+    ].
+
+    "Created: / 03-08-2011 / 10:48:10 / cg"
+! !
+
+!MenuEditor::ImageResourceEditor::ImageResourceEditorItem methodsFor:'user operations'!
+
+doEdit
+    "open image browser on self"
+
+    |parent aClass image|
+
+    parent := self parent.
+    parent notNil ifTrue:[
+        aClass := parent selector.
+        (aClass respondsTo:#visualFor:) ifTrue:[
+            image := aClass visualFor:selector.
+            image ~~ (aClass perform:selector) ifTrue:[
+                self warn:'The image is resolved via #visualFor: from some unknown class'.
+                ImageEditor openOnImage:image.
+                ^ self.
+            ].
+        ].
+        ImageEditor openOnClass:aClass andSelector:selector.
+    ].
+! !
+
 !MenuEditor::ActionItem class methodsFor:'defaults'!
 
 defaultLabel
@@ -5112,565 +5726,6 @@
     ^ true
 ! !
 
-!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)
-          bounds: (Rectangle 0 0 303 304)
-        )
-        component: 
-       (SpecCollection
-          collection: (
-           (LabelSpec
-              label: 'Retriever:'
-              name: 'retrieverLabel'
-              layout: (AlignmentOrigin 107 0 26 0 1 0.5)
-              activeHelpKey: imageRetriever
-              translateLabel: true
-              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
-              entryCompletionBlock: entryCompletionForRetriever
-              comboList: retrieverList
-              isFilenameBox: false
-            )
-           (LabelSpec
-              label: 'Selector:'
-              name: 'iconLabel'
-              layout: (AlignmentOrigin 107 0 51 0 1 0.5)
-              activeHelpKey: imageSelector
-              translateLabel: true
-              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 -60 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 -60 1.0 -20 1.0 0 1.0)
-              level: 0
-              component: 
-             (SpecCollection
-                collection: (
-                 (CheckBoxSpec
-                    label: 'Image & Label'
-                    name: 'iconAndLabelCheckBox'
-                    layout: (AlignmentOrigin 0 0 17 0 0 0.5)
-                    activeHelpKey: imageImageAndLabel
-                    tabable: true
-                    model: iconAndLabelHolder
-                    translateLabel: true
-                  )
-                 (ActionButtonSpec
-                    label: 'Image Editor'
-                    name: 'imageEditorButton'
-                    layout: (AlignmentOrigin -69 1.0 17 0 0 0.5)
-                    activeHelpKey: imageImageEditor
-                    hasCharacterOrientedLabel: false
-                    foregroundColor: (Color 0.0 0.0 66.9993133440146)
-                    tabable: true
-                    model: doEditImage
-                  )
-                 (ActionButtonSpec
-                    label: 'Browse'
-                    name: 'Button1'
-                    layout: (AlignmentOrigin -69 1.0 45 0 0 0.5)
-                    activeHelpKey: imageBrowseImageClass
-                    hasCharacterOrientedLabel: false
-                    foregroundColor: (Color 0.0 0.0 66.9993133440146)
-                    tabable: true
-                    model: doBrowseImageClass
-                  )
-                 )
-               
-              )
-            )
-           )
-         
-        )
-      )
-! !
-
-!MenuEditor::ResourceEditor methodsFor:'accessing'!
-
-resourceRetriever
-    |rcv sel cls clsName|
-
-    sel := selectorHolder value.
-    sel size == 0 ifTrue:[ ^ nil ].
-    cls := self retrieverClass.
-    cls notNil ifTrue:[ 
-        clsName := retrieverHolder value.
-        clsName isEmptyOrNil ifTrue:[
-            clsName := cls name.
-        ].
-        clsName := clsName asSymbol.
-    ].
-
-    rcv := ResourceRetriever new.
-    rcv className:clsName.
-    rcv selector:sel.
-
-    iconAndLabelHolder value ifTrue:[ rcv labelText:'' ].
-    ^ rcv
-!
-
-resourceRetriever:aResourceRetriever
-    |className sel isOn|
-
-    aResourceRetriever notNil ifTrue:[
-        className := aResourceRetriever className.
-        className isBehavior ifTrue:[
-            className := className name asSymbol
-        ].
-        sel  := aResourceRetriever selector.
-        isOn := aResourceRetriever labelText notNil.
-    ] ifFalse:[
-        className := sel := nil.
-        isOn := false.
-    ].
-
-    retrieverHolder value:className.
-    selectorHolder  value:sel.
-    iconAndLabelHolder value:isOn.
-!
-
-retrieverClass
-    |clsName cls|
-
-    clsName  := retrieverHolder value.
-    clsName notEmptyOrNil ifTrue:[
-        cls := Smalltalk at:clsName ifAbsent:nil.
-        (cls isBehavior) ifTrue:[
-            ^ cls
-        ].
-    ].
-    ^ nil
-! !
-
-!MenuEditor::ResourceEditor methodsFor:'actions'!
-
-doBrowseForImageResource
-    "opens a browser on image-resource methods"
-
-    |classAndSelector|
-
-    classAndSelector := ResourceSelectionBrowser
-		request:'Use Image From Class'
-		onSuperclass:nil
-		andClass:(self retrieverClass)
-		andSelector:(selectorHolder value)
-		withResourceTypes:#(image fileImage programImage).
-
-    classAndSelector isNil ifTrue:[ ^ self ].
-
-    retrieverHolder value:(classAndSelector methodClass) name.
-    selectorHolder  value:(classAndSelector methodSelector).
-!
-
-doBrowseImageClass
-    |cls sel image|
-
-    (cls := retrieverHolder value) isNil ifTrue:[
-        Dialog warn:'No resource retriever is defined.'.
-    ] ifFalse:[
-        sel := selectorHolder value.
-
-        cls := Smalltalk classNamed:cls.
-        cls isNil ifTrue:[
-            Dialog warn:'No such resource retriever class.'.
-        ] ifFalse:[
-            (cls respondsTo:#visualFor:) ifTrue:[
-                image := cls visualFor:sel.
-                image ~~ (cls perform:sel) ifTrue:[
-                    self warn:'The image is resolved via #visualFor: from some unknown class'.
-                    sel := #visualFor:.
-                ].
-            ].
-            UserPreferences current systemBrowserClass openInClass:cls class selector:sel
-        ]
-    ]
-
-    "Created: / 20-09-2010 / 13:27:34 / cg"
-!
-
-doEditImage
-    |sel cls item image|
-
-    item := imageHolder value.
-    item notNil ifTrue:[
-        item doEdit.
-        ^ self.
-    ].
-
-    sel := selectorHolder value. 
-    sel isNil ifTrue:[
-        Dialog warn:'No selector is defined.'.
-        ^ self.
-    ].
-    cls := retrieverHolder value.
-    cls isNil ifTrue:[
-        Dialog warn:'No resource retriever is defined.'.
-        ^ self.
-    ].
-    cls := Smalltalk classNamed:cls.
-    cls isNil ifTrue:[
-        Dialog warn:'No such resource retriever class.'.
-        ^ self.
-    ].
-    (cls respondsTo:#visualFor:) ifTrue:[
-        image := cls visualFor:sel.
-        image ~~ (cls perform:sel ifNotUnderstood:nil) ifTrue:[
-            self warn:'The image is resolved via #visualFor: from some unknown class'.
-            image notNil ifTrue:[
-                ImageEditor openOnImage:image.
-            ].
-            ^ self.
-        ].
-    ].
-
-    ImageEditor openOnClass:cls andSelector:sel
-! !
-
-!MenuEditor::ResourceEditor methodsFor:'aspects'!
-
-entryCompletionForRetriever
-    ^ DoWhatIMeanSupport classNameEntryCompletionBlock.
-
-    "Modified: / 10-08-2006 / 12:55:22 / cg"
-!
-
-iconAndLabelHolder
-    ^ iconAndLabelHolder
-!
-
-imageHolder
-    ^ imageHolder.
-!
-
-imageList
-    ^ imageList
-!
-
-modifiedChannel
-    ^ builder booleanValueAspectFor: #modifiedChannel
-!
-
-modifiedChannel:aChannel
-    builder aspectAt:#modifiedChannel put:aChannel.
-!
-
-retrieverHolder
-    ^ retrieverHolder
-!
-
-retrieverList
-    |list cls|
-
-    list := builder bindingAt:#retrieverList.
-    list isNil ifTrue:[
-        list := MenuEditor imageRetrieverClasses asList.
-        builder aspectAt:#retrieverList put:list.
-    ].
-    (masterApplication notNil 
-     and:[(cls := masterApplication specClass) notNil]) ifTrue:[
-        list := list copyWithFirst:cls.
-    ].
-    ^ list
-!
-
-selectorHolder
-    ^ selectorHolder.
-! !
-
-!MenuEditor::ResourceEditor methodsFor:'change & update'!
-
-retrieverChanged
-    |retriever list name|
-
-    retriever := self retrieverClass.
-    imageHolder setValue:nil.
-
-    imageList root fromClass:retriever.
-    self updateImageHolder.
-
-    (retriever notNil and:[imageList size ~~ 0]) ifTrue:[
-        list := self retrieverList.
-        name := retriever name.
-
-        (list includes:name) ifFalse:[
-            list add:(name asSymbol).
-        ]
-    ].
-!
-
-selectorChanged
-    self updateImageHolder.
-!
-
-update:what with:aPara from:aModel
-    |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
-!
-
-updateImageHolder
-    |item selector line|
-
-    imageList isEmpty ifTrue:[^ self].
-
-    selector := selectorHolder value.
-    selector isEmptyOrNil ifTrue:[ 
-        imageHolder value:nil. 
-        ^ self 
-    ].
-
-    item     := nil.
-    selector := selector asSymbol.
-
-    imageList do:[:anItem| 
-        |sel|
-
-        sel := anItem selector.
-        selector == sel ifTrue:[
-            imageHolder value:anItem.
-            ^ self
-        ].
-        item isNil ifTrue:[
-            (sel startsWith:selector) ifTrue:[ item := anItem ]
-        ]
-    ].
-    imageHolder value:nil.
-
-    item ifNotNil:[
-        line := imageList identityIndexOf:item.
-        imageViewer scrollToLine:line
-    ].
-! !
-
-!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
-!
-
-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 #programImage) includes:r) ifTrue:[
-                    item := self class fromClass:aClass selector:sel.
-                    item parent:self.
-                    children add:item
-                ]
-            ]
-        ].
-        self expand
-    ].
-!
-
-fromClass:aClass selector:aSelector
-    |w h magnify iconOrSymbol|
-
-    selector := aSelector asSymbol.
-    selector numArgs == 0 ifFalse:[^ self].
-
-    "do what the ResourceRetriever will do"
-    (aClass respondsTo:#visualFor:) ifTrue:[
-        iconOrSymbol := aClass visualFor:selector.
-    ].
-    iconOrSymbol isNil ifTrue:[
-        iconOrSymbol := aClass perform:selector.
-    ].
-    iconOrSymbol isSymbol ifTrue:[
-        icon := ToolbarIconLibrary perform:iconOrSymbol.
-    ] ifFalse:[
-        icon := iconOrSymbol.
-    ].
-
-    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.
-
-    "Modified: / 13-04-2011 / 18:56:45 / cg"
-!
-
-initialize
-    super initialize.
-    children := #().
-! !
-
-!MenuEditor::ResourceEditorItem methodsFor:'user operations'!
-
-doEdit
-    "open image browser on self"
-
-    |parent aClass image|
-
-    parent := self parent.
-    parent notNil ifTrue:[
-        aClass := parent selector.
-        (aClass respondsTo:#visualFor:) ifTrue:[
-            image := aClass visualFor:selector.
-            image ~~ (aClass perform:selector) ifTrue:[
-                self warn:'The image is resolved via #visualFor: from some unknown class'.
-                ImageEditor openOnImage:image.
-                ^ self.
-            ].
-        ].
-        ImageEditor openOnClass:aClass andSelector:selector.
-    ].
-! !
-
 !MenuEditor::RootItem class methodsFor:'defaults'!
 
 defaultLabel