added a selector filter (to the image resource tab)
makes it easier to find an icon in big image libraries
--- 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