Tools__NewSystemBrowser.st
branchjv
changeset 16445 6bc184e74f9c
parent 16408 bc62fb9a8df6
parent 16444 08693ccf142e
child 16459 85d703589d34
--- a/Tools__NewSystemBrowser.st	Wed May 04 08:21:04 2016 +0200
+++ b/Tools__NewSystemBrowser.st	Thu May 05 06:48:38 2016 +0200
@@ -431,7 +431,7 @@
 'Search class'
 
 #gotoClassEntryField
-'Goto class (uppercase) or method which implements this selector (lowercase)'
+'Goto class (uppercase) or method which implements this selector (lowercase).\Use "*foo" to search for names ending with "foo",\"foo*" for names beginning with foo.\Otherwise, names which contain "foo" are listed.'
 
 "/#gotoClassEntryField
 "/'Goto Class'
@@ -3956,7 +3956,7 @@
              name: 'HorizontalPanel1'
              layout: (LayoutFrame 0 0 0 0 0 1 0 1)
              level: 1
-             horizontalLayout: fitSpace
+             horizontalLayout: fit
              verticalLayout: center
              horizontalSpace: 2
              verticalSpace: 2
@@ -3973,7 +3973,7 @@
                    acceptOnPointerLeave: false
                    acceptIfUnchanged: true
                    entryCompletionBlock: searchCompletionBlock
-                   extent: (Point 292 24)
+                   extent: (Point 296 24)
                    postBuildCallback: searchFieldCreated:
                  )
                 )
@@ -5491,7 +5491,7 @@
 
                                       (SubChannelInfoSpec
                                          subAspect: menuHolder
-                                         aspect: classMenu
+                                         aspect: classMenuForSmallLint
                                        )
                                       (SubChannelInfoSpec
                                          subAspect: meta
@@ -18614,18 +18614,18 @@
     onlyShowJavaClassesHolder onChangeEvaluate:[ updateClassAndNameList value. updateList value].
 
     box enterField 
-        origin:(0 @ check corner y);
-        onKey:#CursorDown leaveWith:[
-            |listView|
-            
-            listView := box listView.
-            listView windowGroup focusView:listView byTab:true.
-            listView hasSelection ifFalse:[
-                listView selectFirst
-            ] ifTrue:[
-                listView selectNext
-            ].
-        ].
+"/        onKey:#CursorDown leaveWith:[
+"/            |listView|
+"/            
+"/            listView := box listView.
+"/            listView windowGroup focusView:listView byTab:true.
+"/            listView hasSelection ifFalse:[
+"/                listView selectFirst
+"/            ] ifTrue:[
+"/                listView selectNext
+"/            ].
+"/        ];
+        origin:(0 @ check corner y).
     box listView origin:(0 @ check corner y).
 
     box extent:(400 @ 550).
@@ -19339,6 +19339,14 @@
     "Created: / 18.2.2000 / 12:17:07 / cg"
 !
 
+classMenuForSmallLint
+    "somehow I need this indirection; otherwise,
+     aspects are fetched too early (with no class selected),
+     and the CVS menus are all disabled"
+     
+    ^ [ self classMenu ]
+!
+
 cvsRepositoryMenusAreShown
     ^ ConfigurableFeatures includesFeature: #CVSSupportEnabled
 
@@ -23532,12 +23540,12 @@
 !
 
 methodRefersToSelfOrInstanceVariable:aMethod
-    |tree|
+    |parser|
     
-    tree := aMethod parseTree.
-    tree isNil ifTrue:[^ true]. "/ actually: don't know.
-    tree halt.
-    ^ false.
+    parser := Parser parseMethod:aMethod source in:aMethod mclass ignoreErrors:true ignoreWarnings:true.
+    ^ parser usedInstVars notEmptyOrNil
+        or:[ parser messagesSentToSelf notEmptyOrNil
+        or:[ parser messagesSentToSuper notEmptyOrNil]]
 !
 
 selectedClassNameInCodeViewOrNil
@@ -24866,6 +24874,7 @@
 
 updateToolBarButtonEnablement
     self hasClassOrMethodSelectedHolder value:self hasClassOrMethodSelected.
+    self updateLintEnablement.
 !
 
 variableSelectionChanged
@@ -28400,6 +28409,101 @@
     "Modified: / 27-11-2014 / 10:20:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+setupSmalllintBrowser:browser byRuleFor:result
+    "configure a just created smallLint browser"
+    
+    |selectedClassesHolder selectedMethodHolder methodGenerator 
+     ruleGenerator prevSelectedClasses prevMeta|
+
+    selectedClassesHolder := browser selectedClasses.
+    selectedMethodHolder := browser selectedMethods.
+    
+    ruleGenerator :=
+        Iterator on:[:whatToDo|
+            result failedRules do:whatToDo
+        ].
+
+    methodGenerator :=
+        Iterator on: [:whatToDo|
+            | selectedRules selectedClasses failedMethods |
+
+            selectedClasses := selectedClassesHolder value.
+            selectedClasses notEmptyOrNil ifTrue:[
+                selectedRules := browser selectedLintRules value.
+                failedMethods := OrderedCollection new.
+                selectedRules ? #() do:[:rule|
+                    failedMethods addAll:
+                        (rule failedMethodsInAnyOf: selectedClasses meta: self hasMetaSelected)
+                ].
+                failedMethods do:[:mth|
+                    whatToDo
+                        value:mth containingClass
+                        value:mth category
+                        value:mth selector
+                        value:mth
+                    ]
+            ]
+        ].
+
+    browser lintRuleListGenerator value:ruleGenerator.
+    browser selectorListGenerator value:methodGenerator.
+
+    selectedClassesHolder onChangeEvaluate:[
+"/        |selectedRules selectedClasses meta|
+"/  
+"/        selectedRules := browser selectedLintRules value ? #().
+"/        selectedClasses := selectedClassesHolder value ? #().
+"/        meta := self hasMetaSelected. 
+"/
+"/        "/ really a new class selection (in contrast to just toggling meta)
+"/        ((prevSelectedClasses ~= selectedClasses)
+"/        and:[ prevMeta = meta ]) ifTrue:[
+"/            "/ only one?
+"/            selectedClasses size == 1 ifTrue:[
+"/                "/ hello!! anyone out there?
+"/                (selectedRules
+"/                    contains:[:rule |        
+"/                        (rule failedMethodsInAnyOf: selectedClasses meta: meta)]
+"/                ) ifFalse:[
+"/                    "/ no - try opposite meta side            
+"/                    (selectedRules
+"/                        contains:[:rule |        
+"/                            (rule failedMethodsInAnyOf: (selectedClasses collect:[:c | meta ifTrue:[c theMetaclass] ifFalse:[c theNonMetaclass]])
+"/                                  meta: meta not)]
+"/                    ) ifTrue:[
+"/                        "/ yes - toggle meta            
+"/                        self halt.
+"/                    ]                                
+"/                ].    
+"/            ].    
+"/        ].    
+"/
+        browser selectorListGenerator changed:#value.
+    ].
+    
+    browser selectedLintRules
+        onChangeSend: #changed to: browser selectorListGenerator.
+    browser meta
+        onChangeSend: #changed to: browser selectorListGenerator.
+
+    selectedMethodHolder onChangeEvaluate:[
+        "/ update the info, depending on the rule's information
+        "/ self halt.
+    ].
+    
+    "/ cg: does not work - why?
+    result failedRules size == 1 ifTrue:[
+        "/ autoselect the first one
+        browser selectedLintRules value: result failedRules.
+    ].
+
+    "Modified: / 22-07-2009 / 15:51:56 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Created: / 02-02-2010 / 20:05:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 25-08-2010 / 10:30:33 / Jan Vrany <enter your email here>"
+    "Modified: / 01-03-2012 / 19:52:57 / cg"
+    "Modified: / 27-11-2014 / 10:26:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 smalllintRulesOrDefault
     "Return last run rules or default ruleset if no checks has been run so far"
 
@@ -28567,7 +28671,10 @@
                 progressFeedBackInto:[:classBeingChecked |
                     count := count + 1.
                     ProgressNotification new
-                        messageText: ('Checking: %1 (%2)' withCRs bindWith:ruleName with:ruleClassName "with:classBeingChecked name");
+                        messageText: (('Checking: ' withColor:Color grey)
+                                      , ruleName 
+                                      , ((' (',ruleClassName,')')withColor:Color grey)
+                                      , ' in ',classBeingChecked name);
                         parameter: ((count-1) / numOverAll * 100);
                         raiseRequest.
                 ].
@@ -28603,151 +28710,7 @@
         label:labelOrNil
         forSpec: #smallLintByRuleResultBrowserSpec
         setupWith:[:browser |
-            |methodGenerator classGenerator ruleGenerator|
-
-            ruleGenerator :=
-                Iterator on:[:whatToDo|
-                    result failedRules do:whatToDo].
-
-            methodGenerator :=
-                Iterator on: [:whatToDo|
-                    | selectedRules selectedClasses failedMethods |
-
-                    selectedClasses := browser selectedClasses value.
-                    selectedRules := browser selectedLintRules value.
-                    failedMethods := OrderedCollection new.
-                    selectedClasses isEmptyOrNil ifFalse:
-                        [selectedRules ? #() do:
-                            [:rule|
-                            failedMethods addAll:
-                                (rule failedMethodsInAnyOf: selectedClasses meta: self hasMetaSelected)].
-                    failedMethods do:
-                        [:mth|
-                        whatToDo
-                            value:mth containingClass
-                            value:mth category
-                            value:mth selector
-                            value:mth]]].
-
-            browser lintRuleListGenerator value:ruleGenerator.
-            browser selectorListGenerator value:methodGenerator.
-
-"/            browser selectedClasses
-"/                onChangeSend: #changed to: browser selectorListGenerator.
-            browser selectedClasses onChangeEvaluate:[
-                browser selectorListGenerator changed:#value.
-            ].
-            browser selectedLintRules
-                onChangeSend: #changed to: browser selectorListGenerator.
-            browser meta
-                onChangeSend: #changed to: browser selectorListGenerator.
-
-            "/ cg: does not work - why?
-            result failedRules size == 1 ifTrue:[
-                "/ autoselect the first one
-                browser selectedLintRules value: result failedRules.
-            ].
-
-            "/self halt.
-            "
-            theMethodList isNil ifTrue:[
-                methodsOrMethodGeneratorBlock isBlock ifTrue:[
-                    theMethodList := methodsOrMethodGeneratorBlock value.
-                ] ifFalse:[
-                    theMethodList := methodsOrMethodGeneratorBlock copy.
-                ].
-            ].
-            perClassInfo := perClassInfoHolder value.
-            perMethodInfo := perMethodInfoHolder value.
-
-            methodGenerator := Iterator on:[:whatToDo |
-                                            theMethodList isNil ifTrue:[
-                                                methodsOrMethodGeneratorBlock isBlock ifTrue:[
-                                                    theMethodList := methodsOrMethodGeneratorBlock value.
-                                                ] ifFalse:[
-                                                    theMethodList := methodsOrMethodGeneratorBlock copy.
-                                                ].
-                                            ].
-                                            perClassInfo := perClassInfoHolder value.
-                                            perMethodInfo := perMethodInfoHolder value.
-
-                                            theMethodNameList := theMethodList collect:[:eachMethod | eachMethod mclass -> eachMethod selector].
-                                            theMethodNameList do:[:mAssoc |
-                                                |methodClass methodSelector method|
-
-                                                methodClass := mAssoc key.
-                                                methodSelector := mAssoc value.
-                                                methodClass notNil ifTrue:[
-                                                    method := methodClass compiledMethodAt:methodSelector.
-                                                    method notNil ifTrue:[
-                                                        whatToDo
-                                                            value:methodClass
-                                                            value:method category
-                                                            value:methodSelector
-                                                            value:method.
-                                                    ].
-                                                ].
-                                            ].
-                                            methodsOrMethodGeneratorBlock isBlock ifTrue:[
-                                                theMethodList := nil.
-                                            ].
-                                            whatToDo
-                                                value:nil
-                                                value:nil
-                                                value:nil
-                                                value:nil.
-                                      ].
-
-            sortHow notNil ifTrue:[brwsr sortBy value:sortHow].
-
-            brwsr selectorListGenerator value:methodGenerator.
-            perClassInfo notNil ifTrue:[
-                classGenerator := perClassInfo keys.
-                brwsr classListGenerator value:classGenerator.
-                brwsr meta value:false.
-            ].
-
-            perClassInfo notNil ifTrue:[
-                brwsr selectedClasses
-                    onChangeEvaluate:[
-                        |class infoText|
-
-                        brwsr selectedMethods value:nil.
-                        class := brwsr theSingleSelectedClass.
-                        class notNil ifTrue:[
-                            brwsr meta value:false.
-                            infoText := perClassInfoHolder value at:class theNonMetaclass ifAbsent:nil.
-                            infoText isNil ifTrue:[
-                                infoText := perClassInfo at:class theMetaclass ifAbsent:nil
-                            ]
-                        ].
-                        brwsr methodInfo value:infoText.
-                    ]
-            ].
-
-            perMethodInfo notNil ifTrue:[
-                brwsr selectedMethods
-                    onChangeEvaluate:[
-                        |mthd infoText|
-
-                        brwsr selectedClasses value:nil.
-                        mthd := brwsr theSingleSelectedMethod.
-                        mthd notNil ifTrue:[
-                            infoText := perMethodInfo at:mthd ifAbsent:nil
-                        ].
-                        brwsr methodInfo value:infoText.
-                    ]
-            ] ifFalse:[
-                (doSelect and:[theMethodList size == 1]) ifTrue:[
-                    brwsr selectMethods:(Array with:theMethodList first).
-                    brwsr methodsSelectionChanged.
-                ]
-            ].
-
-            methodsOrMethodGeneratorBlock isBlock ifTrue:[
-                theMethodList := nil
-            ]
-            "
+            self setupSmalllintBrowser:browser byRuleFor:result.
         ]
 
     "Modified: / 22-07-2009 / 15:51:56 / Jan Vrany <vranyj1@fel.cvut.cz>"
@@ -39958,7 +39921,7 @@
 !
 
 methodListMenuSpawnClasses:where
-    "add a buffer/open a browser showing the selected methods classes"
+    "add a buffer/open a browser showing the selected method's classes"
 
     |classes|
 
@@ -39969,7 +39932,7 @@
 !
 
 methodListMenuSpawnClassesBuffer
-    "add a buffer showing the selected methodss classes"
+    "add a buffer showing the selected method's classes"
 
     ^ self methodListMenuSpawnClasses:#newBuffer
 !
@@ -39983,24 +39946,22 @@
 !
 
 methodListMenuSpawnFullBrowser
-    "add a buffer showing the selected methodss classes"
+    "add a buffer showing the selected method's classes"
 
     ^ self methodListMenuSpawnFullBrowserIn:#newBrowser
 !
 
 methodListMenuSpawnFullBrowserBuffer
-    "add a buffer showing the selected methodss classes"
+    "add a buffer showing the selected method's classes"
 
     ^ self methodListMenuSpawnFullBrowserIn:#newBuffer
 !
 
-methodListMenuSpawnFullBrowserIn:where
+methodListMenuSpawnFullBrowserForClasses:classes methods:methods in:where
     "add a buffer/open a browser showing the selected methods classes"
 
-    |methods classes brwsr anyMeta anyNonMeta|
-
-    methods := self selectedMethodsValue.
-    classes := self selectedMethodsClasses asOrderedCollection.
+    |brwsr anyMeta anyNonMeta|
+
     brwsr := self spawnFullBrowserInClass:nil selector:nil in:where.
 
     classes size > 0 ifTrue:[
@@ -40025,6 +39986,18 @@
     ^ brwsr
 
     "Modified: / 28-02-2012 / 16:27:44 / cg"
+!
+
+methodListMenuSpawnFullBrowserIn:where
+    "add a buffer/open a browser showing the selected methods classes"
+
+    |methods classes|
+
+    methods := self selectedMethodsValue.
+    classes := self selectedMethodsClasses asOrderedCollection.
+    self methodListMenuSpawnFullBrowserForClasses:classes methods:methods in:where
+
+    "Modified: / 28-02-2012 / 16:27:44 / cg"
 ! !
 
 !NewSystemBrowser methodsFor:'menu actions-namespace'!
@@ -53767,29 +53740,39 @@
          or:[ aMatchString first isLowercase]) ifTrue:[
             implementors := SystemBrowser findImplementorsMatching:aMatchString in:(environment allClasses) ignoreCase:true.
             implementors size > 0 ifTrue:[
-                (classesMatchingCaseless isEmpty and:[implementors size == 1]) ifTrue:[
-                    answer := Dialog
-                        confirm:(resources
-                                        stringWithCRs:'No class named "%1".\But "%2" implements it. Go there ?'
-                                        with:aMatchString allBold
-                                        with:implementors first mclass name).
-                    answer ifTrue:[
-                        self switchToClass:implementors first mclass selector:implementors first selector.
-                    ].
-                    ^ self.
-                ].
+                |searchClassToken browseAllImplementorsToken|
+                
+                searchClassToken := Object new.
+                browseAllImplementorsToken := Object new.
+                
+"/                (classesMatchingCaseless isEmpty and:[implementors size == 1]) ifTrue:[
+"/                    answer := Dialog
+"/                        confirm:(resources
+"/                                        stringWithCRs:'No class named "%1".\But "%2" implements it. Go there ?'
+"/                                        with:aMatchString allBold
+"/                                        with:implementors first mclass name).
+"/                    answer ifTrue:[
+"/                        self switchToClass:implementors first mclass selector:implementors first selector.
+"/                    ].
+"/                    ^ self.
+"/                ].
                 implementors := implementors asOrderedCollection sort:[:a :b | a mclass name < b mclass name].
                 classesMatchingCaseless isEmpty ifTrue:[
-                    answer := Dialog
-                        choose:(resources
-                                        stringWithCRs:'No class named "%1.\But there are %2 implementors of it.\\Goto one of them ?'
-                                        with:aMatchString allBold
-                                        with:implementors size)
-                        fromList:(implementors collect:[:m | m mclass name])
-                        values:implementors
-                        buttons:#('No, Search for a Class' 'Show all Implementors') values:#(searchClass browseAllImplementors)
-                        lines:10 cancel:nil
-                        postBuildBlock:[:box | box minExtent:300@250].
+                    implementors size == 1 ifTrue:[
+                        answer := browseAllImplementorsToken.
+                    ] ifFalse:[                    
+                        answer := Dialog
+                            choose:(resources
+                                            stringWithCRs:'There are %2 implementors of it.\\Goto one of them ?'
+                                            with:aMatchString allBold
+                                            with:implementors size)
+                            fromList:(#('** show all **'),(implementors collect:[:m | m mclass name]))
+                            values:{browseAllImplementorsToken},implementors
+                            buttons:#('No, Search for a Class' 'Show all Implementors') 
+                            values:{searchClassToken . browseAllImplementorsToken}
+                            lines:10 cancel:nil
+                            postBuildBlock:[:box | box minExtent:300@250].
+                    ].
                 ] ifFalse:[
                     answer := Dialog
                         choose:(resources
@@ -53801,29 +53784,37 @@
                                         with:classesMatchingCaseless size)
                         fromList:({'Implementors:' colorizeAllWith:Color gray}
                                   ,(implementors collect:[:m | m mclass name])
+                                  ,'-'
                                   ,{'Classes:' colorizeAllWith:Color gray}
                                   ,classesMatchingCaseless)
-                        values:(#(nil),implementors,#(nil),classesMatchingCaseless)
-                        buttons:#('No, Search for a Class' 'Show all Implementors') values:#(searchClass browseAllImplementors)
+                        values:(#(nil),implementors,#(nil nil),classesMatchingCaseless)
+                        buttons:#('No, Search for a Class' 'Show all Implementors') 
+                        values:{ searchClassToken . browseAllImplementorsToken}
                         lines:10 cancel:nil
                         postBuildBlock:[:box | box minExtent:300@250].
                 ].
 
                 answer isNil ifTrue:[^ self].
-                answer == #browseAllImplementors ifTrue:[
-                    self
-                        spawnMethodBrowserForSearch:[
-                                SystemBrowser
-                                    findImplementorsOf:aMatchString
-                                    in:environment allClasses
-                                    ignoreCase:false.
-                            ]
-                        sortBy:#class
-                        in:#newBuffer
-                        label:(resources string:'Implementors of %1' string with:aMatchString).
+                answer == browseAllImplementorsToken ifTrue:[
+                    implementors size == 1 ifTrue:[
+                        self 
+                            methodListMenuSpawnFullBrowserForClasses:{implementors first mclass}
+                            methods:implementors in:#newBuffer
+                    ] ifFalse:[    
+                        self
+                            spawnMethodBrowserForSearch:[
+                                    SystemBrowser
+                                        findImplementorsOf:aMatchString
+                                        in:environment allClasses
+                                        ignoreCase:false.
+                                ]
+                            sortBy:#class
+                            in:#newBuffer
+                            label:(resources string:'Implementors of %1' string with:aMatchString).
+                    ].
                     ^ self
                 ].
-                answer ~~ #searchClass ifTrue:[
+                answer ~~ searchClassToken ifTrue:[
                     answer isSymbol ifTrue:[
                         self switchToClass:(environment classNamed:answer).
                     ] ifFalse:[
@@ -55987,17 +55978,17 @@
         ].
     ].
     
-    box enterField
-        onKey:#CursorDown
-        leaveWith:[
-            listView windowGroup focusView:listView byTab:true.
-            (listView hasSelection not or:[listView lineIsVisible:listView selection]) ifFalse:[
-                listView selectFirstVisibleLine
-            ] ifTrue:[
-                listView selectNext
-            ].
-            listView selectionValue isEmptyOrNil ifTrue:[listView selectNext].
-        ].
+"/    box enterField
+"/        onKey:#CursorDown
+"/        leaveWith:[
+"/            listView windowGroup focusView:listView byTab:true.
+"/            (listView hasSelection not or:[listView lineIsVisible:listView selection]) ifFalse:[
+"/                listView selectFirstVisibleLine
+"/            ] ifTrue:[
+"/                listView selectNext
+"/            ].
+"/            listView selectionValue isEmptyOrNil ifTrue:[listView selectNext].
+"/        ].
 
     box open.
     ^ retVal
@@ -58173,12 +58164,12 @@
     "get something about aMethod
      to be shown in the info line at the bottom"
 
-    |msg msg2 method|
+    |msg msg2 method wrapper|
 
     method := aMethod.
     method isNil ifTrue:[ ^ nil ].
-    method wrapper notNil ifTrue:[
-        method := method wrapper
+    (wrapper := method wrapper) notNil ifTrue:[
+        method := wrapper
     ].
     method isNil ifTrue:[
         ^ 'oops - this method is not attached to any class'.
@@ -58194,7 +58185,7 @@
                         ifFalse:[msg,'; ',msg2]
         ].
         msg isNil ifTrue:[
-            msg := Explainer methodImplementorsInfoFor:method
+            msg := Explainer methodImplementorsInfoFor:method inEnvironment:environment
         ].
     ].
     msg := (msg ? '').
@@ -58338,7 +58329,6 @@
 !NewSystemBrowser methodsFor:'private-searching'!
 
 searchCompletionBlock
-
     "Returns a class/selector name completion block that
      is used by the search field in browser's toolbar"
 
@@ -58347,11 +58337,12 @@
      (now in searchCompletionBlock_Standard)"
 
     | sel |
+
     sel := UserPreferences current at: #searchCompletionBlock ifAbsent:[nil].
     sel notNil ifTrue:[
-        ^self perform: ('searchCompletionBlock_' , sel) asSymbol ifNotUnderstood:[
-            self searchCompletionBlock_Standard
-        ].
+        ^self 
+            perform: ('searchCompletionBlock_' , sel) asSymbol 
+            ifNotUnderstood:[ self searchCompletionBlock_Standard ].
     ].
     ^self searchCompletionBlock_Standard
 
@@ -58370,35 +58361,20 @@
 !
 
 searchCompletionBlock_New
-
     "This returns a class/selector name completion block that uses
-     standard DoWhatIMeanSupport"
-
-    ^[:patternString|self searchCompletionNew: patternString]
+     JV's private search"
+
+    ^[:patternString | self searchCompletionNew: patternString]
 
     "Modified: / 04-08-2011 / 19:05:28 / cg"
     "Created: / 04-12-2011 / 22:13:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 searchCompletionBlock_Standard
-
     "This returns a class/selector name completion block that uses
      standard DoWhatIMeanSupport"
 
-    ^[:partialName| | env |
-    env := self theSingleSelectedNamespace ? #Smalltalk.
-    env = NavigatorModel nameListEntryForALL
-        ifTrue:[env := #Smalltalk].
-    env := environment at: env.
-    partialName isEmptyOrNil
-        ifTrue:
-            [#('' #())]
-        ifFalse:
-            [partialName first isUppercase
-                ifTrue:
-                    [DoWhatIMeanSupport classnameCompletion: partialName inEnvironment: env]
-                ifFalse:
-                    [DoWhatIMeanSupport selectorCompletion: partialName inEnvironment: env]]]
+    ^[:partialName | self searchCompletionStandard:partialName]
 
     "Modified: / 10-02-2010 / 08:47:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 04-08-2011 / 19:05:28 / cg"
@@ -58406,6 +58382,7 @@
 !
 
 searchCompletionNew: patternString
+    "JV's private search"
 
     | env pattern matches |
 
@@ -58433,6 +58410,37 @@
 
     "Modified: / 04-08-2011 / 19:05:28 / cg"
     "Created: / 04-12-2011 / 22:22:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+searchCompletionStandard:partialName
+    "This does a class/selector name completion using
+     standard DoWhatIMeanSupport"
+
+    | env firstLetter doMatch|
+    
+    env := self theSingleSelectedNamespace ? #Smalltalk.
+    env = NavigatorModel nameListEntryForALL ifTrue:[env := #Smalltalk].
+    env := environment at: env.
+    partialName isEmptyOrNil ifTrue: [
+        ^ #('' #())
+    ].
+    firstLetter := partialName first.
+    (partialName size > 1 
+        and:[firstLetter == $* 
+        and:[partialName second isLetter]]
+    ) ifTrue:[
+        firstLetter := partialName second
+    ].    
+    firstLetter isUppercase ifTrue:[
+        ^ DoWhatIMeanSupport classnameCompletion: partialName inEnvironment: env
+    ].
+    
+    doMatch := true.
+    "/ to allow searching for multiplication
+    partialName = '*' ifTrue:[
+        doMatch := false.
+    ].    
+    ^ DoWhatIMeanSupport selectorCompletion: partialName inEnvironment: env match:doMatch
 ! !
 
 
@@ -59342,6 +59350,7 @@
 !
 
 searchFieldCreated:anInputField
+    anInputField font:(ListView defaultFont).
     anInputField emptyFieldReplacementText:
         "/(resources string:'Class Search & History').
         (resources string:'Search Class/Selector (Ctrl-L)').
@@ -59813,7 +59822,8 @@
     cls isNil ifTrue:[^ self].
 
     (navigationState isVersionDiffBrowser
-    or:[navigationState isCheckOutputBrowser]) ifTrue:[
+    or:[navigationState isCheckOutputBrowser
+    or:[navigationState isLintResultBrowser]]) ifTrue:[
         self spawnFullBrowserInClass:cls selector:nil in:#newBuffer.
         ^ self
     ].
@@ -59851,12 +59861,14 @@
             organizerModeHolder := navigationState organizerMode.
             organizerMode := organizerModeHolder value.
 
-            "/ toggle view mode (between category and class hierarchy)
-            organizerMode == OrganizerCanvas organizerModeClassHierarchy ifTrue:[
-                newMode := OrganizerCanvas organizerModeCategory
-            ] ifFalse:[
-                organizerMode == OrganizerCanvas organizerModeCategory ifTrue:[
-                    newMode := OrganizerCanvas organizerModeClassHierarchy
+            navigationState isLintResultBrowser ifFalse:[ 
+                "/ toggle view mode (between category and class hierarchy)
+                organizerMode == OrganizerCanvas organizerModeClassHierarchy ifTrue:[
+                    newMode := OrganizerCanvas organizerModeCategory
+                ] ifFalse:[
+                    organizerMode == OrganizerCanvas organizerModeCategory ifTrue:[
+                        newMode := OrganizerCanvas organizerModeClassHierarchy
+                    ].
                 ].
             ].
             newMode notNil ifTrue:[