# HG changeset patch # User Claus Gittinger # Date 1312361992 -7200 # Node ID 3a5c3b8eedff0cbdee0a4bdf9140f203d7e83d17 # Parent e061cea3416fb0f4cd9e1851500881f720c874de added a selector filter (to the image resource tab) makes it easier to find an icon in big image libraries diff -r e061cea3416f -r 3a5c3b8eedff 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 @@ - ^ 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 - " - - - - ^ #( - -#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 + " + + + + ^ + #(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 - " - - - - ^ - #(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