#FEATURE by cg
class: MethodFinderWindow
added: #waitForBackgroundSearchFinished
comment/format in: #openOnSelectorPattern:
changed:
#markMatchingClasses:classesWithSelector:
#searchPatternMatchesInBackground
#selectedImplementorsHolder
#windowSpec
--- a/MethodFinderWindow.st Wed May 04 07:51:59 2016 +0200
+++ b/MethodFinderWindow.st Wed May 04 22:39:03 2016 +0200
@@ -98,7 +98,7 @@
)
(ComboListSpec
name: 'allowedArgments'
- layout: (LayoutFrame 0 0.34000000000000002 1 0 0 0.64000000000000012 28 0)
+ layout: (LayoutFrame 0 0.34000000000000002 1 0 0 0.64000000000000024 28 0)
model: argCountHolder
comboList: argCountList
useIndex: true
@@ -106,7 +106,7 @@
(LabelSpec
label: 'Answer'
name: 'MessageAnswerLabel'
- layout: (LayoutFrame 0 0.64000000000000012 0 0 0 1 28 0)
+ layout: (LayoutFrame 0 0.64000000000000024 0 0 0 1 28 0)
translateLabel: true
)
(HorizontalPanelViewSpec
@@ -261,7 +261,7 @@
)
(ViewSpec
name: 'MatchActionBox'
- layout: (LayoutFrame 0 0 -70 0.5 0 1 -20 0.5)
+ layout: (LayoutFrame 0 0 -70 0.5 0 1 10 0.5)
component:
(SpecCollection
collection: (
@@ -274,7 +274,7 @@
)
(InputFieldSpec
name: 'EntryField1'
- layout: (LayoutFrame 0 0 -25 1 0 0.5 0 1)
+ layout: (LayoutFrame 2 0 -54 1 -2 1 -29 1)
model: selectorPattern
immediateAccept: true
acceptOnReturn: true
@@ -295,13 +295,12 @@
)
(SequenceViewSpec
name: 'ResultList'
- layout: (LayoutFrame 0 0 -15 0.5 0 1 0 1)
+ layout: (LayoutFrame 0 0 15 0.5 0 1 0 1)
model: selectedImplementorsHolder
menu: resultListMenu
hasHorizontalScrollBar: true
hasVerticalScrollBar: true
autoHideScrollBars: true
- valueChangeSelector: updateImplementorsOf:
useIndex: true
sequenceList: resultHolder
)
@@ -343,7 +342,7 @@
)
)
- handles: (Any 0.37391304347826088 1.0)
+ handles: (Any 0.37391304347826093 1.0)
)
)
@@ -487,6 +486,8 @@
app allButOpen.
app selectorPattern value:selector.
app openWindow.
+ "/ app waitForBackgroundSearchFinished.
+
^ app
"
@@ -831,13 +832,15 @@
searchProcess :=
[
- |list counts firsts seconds selectors resultList|
+ |list counts firsts seconds selectors resultList idx match|
self withCursor:Cursor execute do:[
pattern includesMatchCharacters ifFalse:[
- pattern := '*',pattern,'*'
+ list := SystemBrowser findImplementorsOf:pattern in:Smalltalk allClasses ignoreCase:true.
+ ] ifTrue:[
+ match := '*',pattern,'*'.
+ list := SystemBrowser findImplementorsMatching:match in:Smalltalk allClasses ignoreCase:true.
].
- list := SystemBrowser findImplementorsMatching:pattern in:Smalltalk allClasses ignoreCase:true.
].
counts := IdentityDictionary new.
@@ -875,7 +878,13 @@
]
].
].
- self enqueueDelayedAction:[ self updateListAfterPatternSearch: resultList ]
+ self enqueueDelayedAction:[ self updateListAfterPatternSearch: resultList ].
+ "/ is it in the list?
+ idx := resultSelectors indexOf:pattern.
+ idx ~~ 0 ifTrue:[
+ self enqueueDelayedAction:[ self selectedImplementorsHolder value:idx ].
+ ].
+
] fork.
"Created: / 01-06-2012 / 13:16:54 / cg"
@@ -942,6 +951,14 @@
self resultHolder value:resultList.
"Created: / 01-06-2012 / 13:17:34 / cg"
+!
+
+waitForBackgroundSearchFinished
+ | p |
+
+ (p := searchProcess) isNil ifTrue:[^ self].
+ p isDead ifTrue:[^ self].
+ p waitUntilTerminated
! !
!MethodFinderWindow methodsFor:'aspects'!
@@ -1069,6 +1086,7 @@
(holder := builder bindingAt:#selectedImplementorsHolder) isNil ifTrue:[
holder := ValueHolder new.
+ holder onChangeEvaluate:[self updateImplementorsOf:holder value].
builder aspectAt:#selectedImplementorsHolder put:holder
].
^ holder
@@ -1213,10 +1231,10 @@
recClass := receiver value class.
unmarkedClassList := anOrderedCollection copy.
unmarkedClassList do:[:classAndMethod |
- |class|
+ |className class sel|
- class := Compiler
- evaluate:(classAndMethod upToAll:aSelector).
+ className := classAndMethod copyButLast:aSelector size.
+ class := Smalltalk classNamed:className. "/ Compiler evaluate:className.
"/ (recClass == class)