Initial support for search steps in navigator. Navugator shortcut changed.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Sat, 24 Jan 2015 01:58:51 +0000
changeset 377 c686ea588575
parent 376 55bc1e532591
child 378 359fd8380abd
Initial support for search steps in navigator. Navugator shortcut changed. Now Ctrl-Shift-T (not yet configurable) opens a Navigator in browser. Ctrl-F opens either class search dialog or text search.
Make.proto
Make.spec
SmallSense__AbstractListDialog.st
SmallSense__AbstractSearchProcessor.st
SmallSense__CompositeProcessor.st
SmallSense__ImplementorSearchProcessor.st
SmallSense__Navigator.st
SmallSense__NavigatorStep.st
SmallSense__PluggableSearchProcessor.st
abbrev.stc
bc.mak
extensions.st
libInit.cc
smallsense.rc
stx_goodies_smallsense.st
--- a/Make.proto	Fri Jan 23 19:19:02 2015 +0100
+++ b/Make.proto	Sat Jan 24 01:58:51 2015 +0000
@@ -34,7 +34,7 @@
 # add the path(es) here:,
 # ********** OPTIONAL: MODIFY the next lines ***
 # LOCALINCLUDES=-Ifoo -Ibar
-LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/helpers -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/lint -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/parser -I$(INCLUDE_TOP)/stx/goodies/regex -I$(INCLUDE_TOP)/stx/goodies/sunit -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libbasic2 -I$(INCLUDE_TOP)/stx/libbasic3 -I$(INCLUDE_TOP)/stx/libcomp -I$(INCLUDE_TOP)/stx/libhtml -I$(INCLUDE_TOP)/stx/libjava -I$(INCLUDE_TOP)/stx/libjava/tools -I$(INCLUDE_TOP)/stx/libtool -I$(INCLUDE_TOP)/stx/libview -I$(INCLUDE_TOP)/stx/libview2 -I$(INCLUDE_TOP)/stx/libwidg -I$(INCLUDE_TOP)/stx/libwidg2
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/helpers -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/lint -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/parser -I$(INCLUDE_TOP)/stx/goodies/regex -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libbasic2 -I$(INCLUDE_TOP)/stx/libbasic3 -I$(INCLUDE_TOP)/stx/libcomp -I$(INCLUDE_TOP)/stx/libhtml -I$(INCLUDE_TOP)/stx/libjava -I$(INCLUDE_TOP)/stx/libjava/tools -I$(INCLUDE_TOP)/stx/libtool -I$(INCLUDE_TOP)/stx/libview -I$(INCLUDE_TOP)/stx/libview2 -I$(INCLUDE_TOP)/stx/libwidg -I$(INCLUDE_TOP)/stx/libwidg2
 
 
 # if you need any additional defines for embedded C code,
@@ -134,7 +134,6 @@
 	cd ../../libview && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd ../../libview2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd ../refactoryBrowser/browser && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
-	cd ../sunit && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd ../../libwidg && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd ../refactoryBrowser/lint && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd ../../libhtml && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
@@ -173,6 +172,7 @@
 $(OUTDIR)SmallSense__EditSupport.$(O) SmallSense__EditSupport.$(H): SmallSense__EditSupport.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__Info.$(O) SmallSense__Info.$(H): SmallSense__Info.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__Manager.$(O) SmallSense__Manager.$(H): SmallSense__Manager.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)SmallSense__NavigatorStep.$(O) SmallSense__NavigatorStep.$(H): SmallSense__NavigatorStep.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__PO.$(O) SmallSense__PO.$(H): SmallSense__PO.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libwidg2/HierarchicalItem.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__ParseTreeIndex.$(O) SmallSense__ParseTreeIndex.$(H): SmallSense__ParseTreeIndex.st $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/OrderedCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/SequenceableCollection.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__ParseTreeIndexEntry.$(O) SmallSense__ParseTreeIndexEntry.$(H): SmallSense__ParseTreeIndexEntry.st $(INCLUDE_TOP)/stx/libbasic/Magnitude.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -212,6 +212,7 @@
 $(OUTDIR)SmallSense__MethodPO.$(O) SmallSense__MethodPO.$(H): SmallSense__MethodPO.st $(INCLUDE_TOP)/stx/goodies/smallsense/SmallSense__PO.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libwidg2/HierarchicalItem.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__PackagePO.$(O) SmallSense__PackagePO.$(H): SmallSense__PackagePO.st $(INCLUDE_TOP)/stx/goodies/smallsense/SmallSense__PO.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libwidg2/HierarchicalItem.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__PluggablePO.$(O) SmallSense__PluggablePO.$(H): SmallSense__PluggablePO.st $(INCLUDE_TOP)/stx/goodies/smallsense/SmallSense__PO.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libwidg2/HierarchicalItem.$(H) $(STCHDR)
+$(OUTDIR)SmallSense__PluggableSearchProcessor.$(O) SmallSense__PluggableSearchProcessor.$(H): SmallSense__PluggableSearchProcessor.st $(INCLUDE_TOP)/stx/goodies/smallsense/SmallSense__AbstractSearchProcessor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__SmalltalkCompletionEngine.$(O) SmallSense__SmalltalkCompletionEngine.$(H): SmallSense__SmalltalkCompletionEngine.st $(INCLUDE_TOP)/stx/goodies/smallsense/SmallSense__CompletionEngine.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__SmalltalkEditSupport.$(O) SmallSense__SmalltalkEditSupport.$(H): SmallSense__SmalltalkEditSupport.st $(INCLUDE_TOP)/stx/goodies/smallsense/SmallSense__EditSupport.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__SmalltalkInferencer.$(O) SmallSense__SmalltalkInferencer.$(H): SmallSense__SmalltalkInferencer.st $(INCLUDE_TOP)/stx/goodies/smallsense/SmallSense__SmalltalkParseNodeVisitor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
--- a/Make.spec	Fri Jan 23 19:19:02 2015 +0100
+++ b/Make.spec	Sat Jan 24 01:58:51 2015 +0000
@@ -65,6 +65,7 @@
 	SmallSense::EditSupport \
 	SmallSense::Info \
 	SmallSense::Manager \
+	SmallSense::NavigatorStep \
 	SmallSense::PO \
 	SmallSense::ParseTreeIndex \
 	SmallSense::ParseTreeIndexEntry \
@@ -104,6 +105,7 @@
 	SmallSense::MethodPO \
 	SmallSense::PackagePO \
 	SmallSense::PluggablePO \
+	SmallSense::PluggableSearchProcessor \
 	SmallSense::SmalltalkCompletionEngine \
 	SmallSense::SmalltalkEditSupport \
 	SmallSense::SmalltalkInferencer \
@@ -146,6 +148,7 @@
     $(OUTDIR_SLASH)SmallSense__EditSupport.$(O) \
     $(OUTDIR_SLASH)SmallSense__Info.$(O) \
     $(OUTDIR_SLASH)SmallSense__Manager.$(O) \
+    $(OUTDIR_SLASH)SmallSense__NavigatorStep.$(O) \
     $(OUTDIR_SLASH)SmallSense__PO.$(O) \
     $(OUTDIR_SLASH)SmallSense__ParseTreeIndex.$(O) \
     $(OUTDIR_SLASH)SmallSense__ParseTreeIndexEntry.$(O) \
@@ -185,6 +188,7 @@
     $(OUTDIR_SLASH)SmallSense__MethodPO.$(O) \
     $(OUTDIR_SLASH)SmallSense__PackagePO.$(O) \
     $(OUTDIR_SLASH)SmallSense__PluggablePO.$(O) \
+    $(OUTDIR_SLASH)SmallSense__PluggableSearchProcessor.$(O) \
     $(OUTDIR_SLASH)SmallSense__SmalltalkCompletionEngine.$(O) \
     $(OUTDIR_SLASH)SmallSense__SmalltalkEditSupport.$(O) \
     $(OUTDIR_SLASH)SmallSense__SmalltalkInferencer.$(O) \
--- a/SmallSense__AbstractListDialog.st	Fri Jan 23 19:19:02 2015 +0100
+++ b/SmallSense__AbstractListDialog.st	Sat Jan 24 01:58:51 2015 +0000
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
 "
 stx:goodies/smallsense - A productivity plugin for Smalltalk/X IDE
 Copyright (C) 2013-2014 Jan Vrany
@@ -25,7 +27,7 @@
 		matchingObjectsTree matchingObjectsSelectionHolder
 		matchingObjectsLabelHolder matchingObjectsUpdateJob
 		matchPatternHolder matchPatternView environmentHolder
-		filterHolder filter'
+		filterHolder filter nextSearchStepVisibleHolder'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'SmallSense-Core-Interface-Search'
@@ -64,16 +66,16 @@
      the UIPainter may not be able to read the specification."
 
     "
-     UIPainter new openOnClass:SmallSense::AbstractSearchDialog andSelector:#contentPaneSpec
-     SmallSense::AbstractSearchDialog new openInterface:#contentPaneSpec
+     UIPainter new openOnClass:SmallSense::AbstractListDialog andSelector:#contentPaneSpec
+     SmallSense::AbstractListDialog new openInterface:#contentPaneSpec
     "
 
     <resource: #canvas>
 
-    ^
+    ^ 
     #(FullSpec
        name: contentPaneSpec
-       window:
+       window: 
       (WindowSpec
          label: 'Search...'
          name: 'Search...'
@@ -81,7 +83,7 @@
          bounds: (Rectangle 0 0 708 404)
          menu: mainMenuSpec
        )
-       component:
+       component: 
       (SpecCollection
          collection: (
           (VerticalPanelViewSpec
@@ -89,12 +91,12 @@
              layout: (LayoutFrame 0 0 0 0 0 1 0 1)
              horizontalLayout: fit
              verticalLayout: topSpaceFit
-             component:
+             component: 
             (SpecCollection
                collection: (
                 (ViewSpec
                    name: 'Box1'
-                   component:
+                   component: 
                   (SpecCollection
                      collection: (
                       (LabelSpec
@@ -111,7 +113,7 @@
                          minorKey: optionsShowHideRightAlignedPaneSpec
                        )
                       )
-
+                    
                    )
                    extent: (Point 708 30)
                  )
@@ -123,16 +125,34 @@
                    acceptOnTab: true
                    acceptOnPointerLeave: true
                    entryCompletionBlock: matchPatternCompletionBlock
-                   extent: (Point 706 25)
+                   extent: (Point 706 24)
+                   usePreferredHeight: true
                    postBuildCallback: postBuildMatchPatternView:
-                   usePreferredHeight: true
                  )
-                (LabelSpec
-                   label: 'Matching items:'
-                   name: 'MatchingLabel'
-                   translateLabel: true
-                   labelChannel: matchingObjectsLabelHolder
-                   adjust: left
+                (ViewSpec
+                   name: 'Box2'
+                   component: 
+                  (SpecCollection
+                     collection: (
+                      (LabelSpec
+                         label: 'Matching items:'
+                         name: 'MatchingLabel'
+                         layout: (LayoutFrame 0 0 0 0 -25 1 0 1)
+                         translateLabel: true
+                         labelChannel: matchingObjectsLabelHolder
+                         adjust: left
+                       )
+                      (LabelSpec
+                         label: '->'
+                         name: 'Label1'
+                         layout: (LayoutFrame -25 1 0 0 0 1 0 1)
+                         visibilityChannel: nextSearchStepVisibleHolder
+                         translateLabel: true
+                         labelChannel: nextSearchStepLabel
+                       )
+                      )
+                    
+                   )
                    extent: (Point 708 25)
                  )
                 (HierarchicalListViewSpec
@@ -151,15 +171,15 @@
                    showLeftIndicators: false
                    useDefaultIcons: false
                    showRoot: false
-                   extent: (Point 708 302)
+                   extent: (Point 708 303)
                    postBuildCallback: postBuildMatchingObjectsView:
                  )
                 )
-
+              
              )
            )
           )
-
+        
        )
      )
 ! !
@@ -456,6 +476,23 @@
 
     "Created: / 08-03-2013 / 15:40:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 27-04-2014 / 23:41:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+nextSearchStepLabel
+    ^ OperatingSystem isUNIXlike ifTrue:[ '→' ] ifFalse:[ '->' ].
+
+    "Created: / 23-01-2015 / 21:59:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+nextSearchStepVisibleHolder
+    <resource: #uiAspect>
+
+    nextSearchStepVisibleHolder isNil ifTrue:[
+        nextSearchStepVisibleHolder := false asValue.
+    ].
+    ^ nextSearchStepVisibleHolder.
+
+    "Modified: / 23-01-2015 / 22:00:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !AbstractListDialog methodsFor:'aspects-queries'!
@@ -647,6 +684,29 @@
 
 !AbstractListDialog methodsFor:'event processing'!
 
+handlesKeyPress: key inView: view
+    view == matchingObjectsView ifTrue:[ 
+        ^ key == #CursorLeft or:[ key == #CursorRight ]
+    ].
+    ^ false
+
+    "Created: / 23-01-2015 / 22:35:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+keyPress: key x:x y:y view: view
+    view == matchingObjectsView ifTrue:[ 
+        key == #CursorRight ifTrue:[ 
+            ^ self keyPressCursorRightInMatchingObjectsView.
+        ].
+        key == #CursorLeft ifTrue:[ 
+            ^ self keyPressCursorLeftInMatchingObjectsView.
+        ].
+    ].
+    ^ false
+
+    "Created: / 23-01-2015 / 22:36:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 keyPressCursorDownInPatternView
 
     matchingObjectsView hasSelection ifFalse:[
@@ -657,6 +717,22 @@
     matchingObjectsView windowGroup focusView:matchingObjectsView byTab:true.
 
     "Created: / 22-04-2014 / 11:59:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+keyPressCursorLeftInMatchingObjectsView
+    matchingObjectsView windowGroup focusView:matchPatternView byTab:true.
+    matchPatternView keyPress: #CursorLeft x: 0 y: 0.
+    ^ true
+
+    "Created: / 23-01-2015 / 22:41:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+keyPressCursorRightInMatchingObjectsView
+    matchingObjectsView windowGroup focusView:matchPatternView byTab:true.
+    matchPatternView keyPress: #CursorRight x: 0 y: 0.
+    ^ true
+
+    "Created: / 23-01-2015 / 22:41:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !AbstractListDialog methodsFor:'events'!
--- a/SmallSense__AbstractSearchProcessor.st	Fri Jan 23 19:19:02 2015 +0100
+++ b/SmallSense__AbstractSearchProcessor.st	Sat Jan 24 01:58:51 2015 +0000
@@ -88,6 +88,26 @@
 
 !AbstractSearchProcessor methodsFor:'accessing'!
 
+canDoNextStepFor: aPO
+    "Return true if navigation can take a next step for given PO
+     (i.e., if user can 'dive in'), false otherwise.
+     To be overriden by subclasses to avoid excessive processor creation."
+
+    ^ (self processorForNextStepFor: aPO) notNil.
+
+    "Created: / 23-01-2015 / 22:16:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+processorForNextStepFor: aPO
+    "Return a processor for next navigation step for given PO.
+     If nil is returned, then there's no next step (i.e.,
+     a user connot 'dive in')"
+
+    ^ nil
+
+    "Created: / 23-01-2015 / 22:04:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 recentlySearchedObjectPOs
     ^ self class recentlySearchedObjectPOs asArray reversed
 
--- a/SmallSense__CompositeProcessor.st	Fri Jan 23 19:19:02 2015 +0100
+++ b/SmallSense__CompositeProcessor.st	Sat Jan 24 01:58:51 2015 +0000
@@ -78,6 +78,26 @@
 
 !CompositeProcessor methodsFor:'accessing'!
 
+canDoNextStepFor: aPO
+    "Return true if navigation can take a next step for given PO
+     (i.e., if user can 'dive in'), false otherwise.
+     To be overriden by subclasses to avoid excessive processor creation."
+
+    ^ aPO context canDoNextStepFor: aPO
+
+    "Created: / 23-01-2015 / 22:26:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+processorForNextStepFor: aPO
+    "Return a processor for next navigation step for given PO.
+     If nil is returned, then there's no next step (i.e.,
+     a user connot 'dive in')"
+
+    ^ aPO context processorForNextStepFor: aPO
+
+    "Created: / 23-01-2015 / 22:26:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 processors
     ^ processors
 !
--- a/SmallSense__ImplementorSearchProcessor.st	Fri Jan 23 19:19:02 2015 +0100
+++ b/SmallSense__ImplementorSearchProcessor.st	Sat Jan 24 01:58:51 2015 +0000
@@ -50,6 +50,50 @@
 "
 ! !
 
+!ImplementorSearchProcessor methodsFor:'accessing'!
+
+canDoNextStepFor: aPO
+    "Return true if navigation can take a next step for given PO
+     (i.e., if user can 'dive in'), false otherwise.
+     To be overriden by subclasses to avoid excessive processor creation."
+
+    self assert: aPO class == MethodPO.
+    ^ aPO classes size > 1
+
+    "Created: / 23-01-2015 / 22:17:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+processorForNextStepFor: aPO
+    "Return a processor for next navigation step for given PO.
+     If nil is returned, then there's no next step (i.e.,
+     a user connot 'dive in')"
+
+    | selector |
+
+    self assert: aPO class == MethodPO.
+    aPO classes size == 1 ifTrue:[ ^ nil ].
+    selector := aPO selector.
+    ^ PluggableSearchProcessor 
+            search:
+                [ :pattern :filter :env :level | 
+
+                    ((aPO classes 
+                        select:[:cls | pattern isNil or:[ pattern match: cls nameWithoutNameSpacePrefix relax: level ] ])  
+                        asArray sort:[ :a :b | a nameWithoutNameSpacePrefix < b nameWithoutNameSpacePrefix ])
+                        collect:[ :cls | cls compiledMethodAt: selector ]
+
+                ]
+            presentation:             
+                [ :method | 
+                    PluggablePO new
+                        label: (method mclass nameWithoutNameSpacePrefix) , ((' >> ', selector) asText colorizeAllWith: Color gray darker);
+                        subject: method.                        
+                ].
+
+    "Created: / 23-01-2015 / 22:06:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-01-2015 / 00:44:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !ImplementorSearchProcessor methodsFor:'accessing - presentation'!
 
 label
--- a/SmallSense__Navigator.st	Fri Jan 23 19:19:02 2015 +0100
+++ b/SmallSense__Navigator.st	Sat Jan 24 01:58:51 2015 +0000
@@ -21,7 +21,7 @@
 "{ NameSpace: SmallSense }"
 
 AbstractSearchDialog subclass:#Navigator
-	instanceVariableNames:''
+	instanceVariableNames:'steps'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'SmallSense-Core-Interface-Search'
@@ -50,14 +50,104 @@
 "
 ! !
 
+!Navigator methodsFor:'change & update'!
+
+update:something with:aParameter from:changedObject
+    "Invoked when an object that I depend upon sends a change notification."
+
+    changedObject == matchingObjectsSelectionHolder ifTrue:[
+        self updateMextSearchStepVisibility.
+    ].
+    ^ super update:something with:aParameter from:changedObject
+
+    "Created: / 23-01-2015 / 22:21:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+updateMatchingIgnorePattern
+    steps size == 1 ifTrue:[
+        ^ super updateMatchingIgnorePattern 
+    ].
+    self updateMatchingObjectPOs: (self matchingObjectPOsForPattern: nil)
+
+    "Created: / 24-01-2015 / 00:50:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+updateMextSearchStepVisibility
+    "raise an error: this method should be implemented (TODO)"
+
+    | selection |
+
+    selection := self matchingObjectsSelection.
+    matchingObjectsMultiselect ifTrue:[ 
+        selection := selection size == 1 ifTrue:[ selection anElement ] ifFalse:[ nil ]
+    ].
+    selection notNil ifTrue:[ 
+        self nextSearchStepVisibleHolder value: (processor canDoNextStepFor: selection)
+    ] ifFalse:[ 
+        self nextSearchStepVisibleHolder value: false.
+    ].
+
+    "Created: / 23-01-2015 / 22:21:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!Navigator methodsFor:'event processing'!
+
+keyPressCursorRightInMatchingObjectsView
+   self nextSearchStepVisibleHolder value ifTrue:[ 
+       self step.
+       ^ true.
+   ].
+   ^ super keyPressCursorRightInMatchingObjectsView
+
+    "Created: / 23-01-2015 / 22:45:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !Navigator methodsFor:'initialization'!
 
 initialize
     super initialize.
-    processor := CompositeProcessor 
+    steps := OrderedCollection new: 3.
+    self push: 
+        (NavigatorStep for: 
+            (CompositeProcessor 
                     with: ClassSearchProcessor new 
-                    with: ImplementorSearchProcessor new.
+                    with: ImplementorSearchProcessor new))
+        update: false.
 
     "Created: / 10-01-2015 / 07:03:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-01-2015 / 00:25:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!Navigator methodsFor:'private-steps'!
+
+push: aNavigatorStep
+    self push: aNavigatorStep update: true
+
+    "Created: / 23-01-2015 / 21:01:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-01-2015 / 00:24:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+push: aNavigatorStep update: update
+    steps addLast: aNavigatorStep.
+    processor := aNavigatorStep processor.
+    update ifTrue:[ 
+        self matchPatternHolder value: nil.
+        self updateMatching
+    ].
+
+    "Created: / 24-01-2015 / 00:24:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+step
+    | selection step |
+
+    selection := self matchingObjectsSelection.
+    matchingObjectsMultiselect ifTrue:[ 
+        selection := selection size == 1 ifTrue:[ selection anElement ] ifFalse:[ nil ]
+    ].
+    step := NavigatorStep for: (processor processorForNextStepFor: selection).
+    self push: step.
+
+    "Created: / 23-01-2015 / 22:48:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SmallSense__NavigatorStep.st	Sat Jan 24 01:58:51 2015 +0000
@@ -0,0 +1,74 @@
+"
+stx:goodies/smallsense - A productivity plugin for Smalltalk/X IDE
+Copyright (C) 2013-2014 Jan Vrany
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+"
+"{ Package: 'stx:goodies/smallsense' }"
+
+"{ NameSpace: SmallSense }"
+
+Object subclass:#NavigatorStep
+	instanceVariableNames:'processor'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'SmallSense-Core-Interface-Search'
+!
+
+!NavigatorStep class methodsFor:'documentation'!
+
+copyright
+"
+stx:goodies/smallsense - A productivity plugin for Smalltalk/X IDE
+Copyright (C) 2013-2014 Jan Vrany
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+"
+! !
+
+!NavigatorStep class methodsFor:'instance creation'!
+
+for: anAbstractSearchProcessor
+    ^ self new initializeWithProcessor: anAbstractSearchProcessor
+
+    "Created: / 23-01-2015 / 21:00:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!NavigatorStep methodsFor:'accessing'!
+
+processor
+    ^ processor
+! !
+
+!NavigatorStep methodsFor:'initialization'!
+
+initializeWithProcessor: anAbstractSearchProcessor
+    processor := anAbstractSearchProcessor
+
+    "Created: / 23-01-2015 / 20:59:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SmallSense__PluggableSearchProcessor.st	Sat Jan 24 01:58:51 2015 +0000
@@ -0,0 +1,110 @@
+"
+stx:goodies/smallsense - A productivity plugin for Smalltalk/X IDE
+Copyright (C) 2013-2014 Jan Vrany
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+"
+"{ Package: 'stx:goodies/smallsense' }"
+
+"{ NameSpace: SmallSense }"
+
+AbstractSearchProcessor subclass:#PluggableSearchProcessor
+	instanceVariableNames:'label search presentation'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'SmallSense-Core-Interface-Search'
+!
+
+!PluggableSearchProcessor class methodsFor:'documentation'!
+
+copyright
+"
+stx:goodies/smallsense - A productivity plugin for Smalltalk/X IDE
+Copyright (C) 2013-2014 Jan Vrany
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+"
+! !
+
+!PluggableSearchProcessor class methodsFor:'instance creation'!
+
+search: searchBlock presentation: presentBlock
+    ^ self new initializeWithSearch: searchBlock presentation: presentBlock
+
+    "Created: / 24-01-2015 / 00:14:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!PluggableSearchProcessor methodsFor:'accessing'!
+
+label:something
+    label := something.
+! !
+
+!PluggableSearchProcessor methodsFor:'accessing - presentation'!
+
+label
+    "Return a label for this processor. This one is used as section label
+     in Spotter"
+
+    ^ label
+
+    "Created: / 24-01-2015 / 00:09:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!PluggableSearchProcessor methodsFor:'initialization'!
+
+initializeWithSearch: searchBlock presentation: presentBlock
+    search := searchBlock.
+    presentation := presentBlock
+
+    "Created: / 24-01-2015 / 00:15:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!PluggableSearchProcessor methodsFor:'searching'!
+
+matchingObjectPOsFor:objects
+    "superclass SmallSense::AbstractSearchProcessor says that I am responsible to implement this method"
+
+    | pos |
+
+    pos := objects collect: presentation.
+    pos isSequenceable ifFalse:[ 
+        pos := pos asArray.
+    ].
+    ^ pos sort:[ :a :b | a label == b label ]
+
+    "Created: / 24-01-2015 / 00:17:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+matchingObjectsForPattern:pattern filter:filter inEnvironment:environment relax:level
+    "superclass SmallSense::AbstractSearchProcessor says that I am responsible to implement this method"
+
+    ^ search value: pattern value: filter value: environment value: level
+
+    "Created: / 24-01-2015 / 00:16:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/abbrev.stc	Fri Jan 23 19:19:02 2015 +0100
+++ b/abbrev.stc	Sat Jan 24 01:58:51 2015 +0000
@@ -3,8 +3,6 @@
 # it provides information about a classes filename, category and especially namespace.
 SmallSense::AbstractDIalog SmallSense__AbstractDIalog stx:goodies/smallsense 'SmallSense-Core-Interface-Search' 1
 SmallSense::AbstractSearchProcessor SmallSense__AbstractSearchProcessor stx:goodies/smallsense 'SmallSense-Core-Interface-Search' 1
-SmallSense::AbstractTestCase SmallSense__AbstractTestCase stx:goodies/smallsense 'SmallSense-Tests' 1
-SmallSense::BaseTestClass SmallSense__BaseTestClass stx:goodies/smallsense 'SmallSense-Tests-Obsolete' 1
 SmallSense::CodeHighlightingService SmallSense__CodeHighlightingService stx:goodies/smallsense 'SmallSense-Core-Services' 0
 SmallSense::CodeNavigationService SmallSense__CodeNavigationService stx:goodies/smallsense 'SmallSense-Core-Services' 0
 SmallSense::CompletionContext SmallSense__CompletionContext stx:goodies/smallsense 'SmallSense-Core' 0
@@ -16,8 +14,8 @@
 SmallSense::EditService SmallSense__EditService stx:goodies/smallsense 'SmallSense-Core-Services' 0
 SmallSense::EditSupport SmallSense__EditSupport stx:goodies/smallsense 'SmallSense-Core-Services' 0
 SmallSense::Info SmallSense__Info stx:goodies/smallsense 'SmallSense-Smalltalk-Types-Info' 0
-SmallSense::JavaCompletionEngineEnvironmentResource SmallSense__JavaCompletionEngineEnvironmentResource stx:goodies/smallsense 'SmallSense-Tests' 1
 SmallSense::Manager SmallSense__Manager stx:goodies/smallsense 'SmallSense-Smalltalk-Types-Info' 0
+SmallSense::NavigatorStep SmallSense__NavigatorStep stx:goodies/smallsense 'SmallSense-Core-Interface-Search' 0
 SmallSense::PO SmallSense__PO stx:goodies/smallsense 'SmallSense-Core-Interface-PO' 0
 SmallSense::ParseTreeIndex SmallSense__ParseTreeIndex stx:goodies/smallsense 'SmallSense-Core-Index' 0
 SmallSense::ParseTreeIndexEntry SmallSense__ParseTreeIndexEntry stx:goodies/smallsense 'SmallSense-Core-Index' 0
@@ -32,9 +30,7 @@
 SmallSense::SmalltalkQuickFixer SmallSense__SmalltalkQuickFixer stx:goodies/smallsense 'SmallSense-Smalltalk-Lint' 0
 SmallSense::SmalltalkSyntaxHighlighter SmallSense__SmalltalkSyntaxHighlighter stx:goodies/smallsense 'SmallSense-Smalltalk' 3
 SmallSense::SmalltalkUnacceptedMethodEnvironment SmallSense__SmalltalkUnacceptedMethodEnvironment stx:goodies/smallsense 'SmallSense-Smalltalk-Lint' 0
-SmallSense::TestCase SmallSense__TestCase stx:goodies/smallsense 'SmallSense-Tests-Obsolete' 1
 SmallSense::TokenPatternMatcher SmallSense__TokenPatternMatcher stx:goodies/smallsense 'SmallSense-Utils-Matcher' 0
-SmallSense::TokenPatternMatcherTests SmallSense__TokenPatternMatcherTests stx:goodies/smallsense 'SmallSense-Tests' 1
 SmallSense::TokenPatternParser SmallSense__TokenPatternParser stx:goodies/smallsense 'SmallSense-Utils-Matcher' 0
 SmallSense::TokenPatternToken SmallSense__TokenPatternToken stx:goodies/smallsense 'SmallSense-Utils-Matcher' 0
 SmallSense::TokenPatternTokenSet SmallSense__TokenPatternTokenSet stx:goodies/smallsense 'SmallSense-Utils-Matcher' 0
@@ -48,11 +44,8 @@
 SmallSense::ClassPO SmallSense__ClassPO stx:goodies/smallsense 'SmallSense-Core-Interface-PO' 0
 SmallSense::ClassSearchProcessor SmallSense__ClassSearchProcessor stx:goodies/smallsense 'SmallSense-Core-Interface-Search' 1
 SmallSense::ClassType SmallSense__ClassType stx:goodies/smallsense 'SmallSense-Smalltalk-Types' 0
-SmallSense::CompletionEngineTests SmallSense__CompletionEngineTests stx:goodies/smallsense 'SmallSense-Tests' 1
 SmallSense::CompositeProcessor SmallSense__CompositeProcessor stx:goodies/smallsense 'SmallSense-Core-Interface-Search' 1
 SmallSense::ConstantPO SmallSense__ConstantPO stx:goodies/smallsense 'SmallSense-Core-Interface-PO' 0
-SmallSense::EditSupportTests SmallSense__EditSupportTests stx:goodies/smallsense 'SmallSense-Tests' 1
-SmallSense::FinderTests SmallSense__FinderTests stx:goodies/smallsense 'SmallSense-Tests-Obsolete' 1
 SmallSense::GenericEditSupport SmallSense__GenericEditSupport stx:goodies/smallsense 'SmallSense-Core-Services' 0
 SmallSense::ImplementorSearchProcessor SmallSense__ImplementorSearchProcessor stx:goodies/smallsense 'SmallSense-Core-Interface-Search' 1
 SmallSense::JavaEditSupport SmallSense__JavaEditSupport stx:goodies/smallsense 'SmallSense-Java' 0
@@ -62,34 +55,43 @@
 SmallSense::MethodPO SmallSense__MethodPO stx:goodies/smallsense 'SmallSense-Core-Interface-PO' 0
 SmallSense::PackagePO SmallSense__PackagePO stx:goodies/smallsense 'SmallSense-Core-Interface-PO' 0
 SmallSense::PluggablePO SmallSense__PluggablePO stx:goodies/smallsense 'SmallSense-Core-Interface-PO' 0
-SmallSense::RecognizerTests SmallSense__RecognizerTests stx:goodies/smallsense 'SmallSense-Tests-Obsolete' 1
+SmallSense::PluggableSearchProcessor SmallSense__PluggableSearchProcessor stx:goodies/smallsense 'SmallSense-Core-Interface-Search' 1
 SmallSense::SmalltalkCompletionEngine SmallSense__SmalltalkCompletionEngine stx:goodies/smallsense 'SmallSense-Smalltalk' 0
 SmallSense::SmalltalkEditSupport SmallSense__SmalltalkEditSupport stx:goodies/smallsense 'SmallSense-Smalltalk' 0
 SmallSense::SmalltalkInferencer SmallSense__SmalltalkInferencer stx:goodies/smallsense 'SmallSense-Smalltalk-Types-Inference' 0
 SmallSense::SmalltalkParseNodeFinder SmallSense__SmalltalkParseNodeFinder stx:goodies/smallsense 'SmallSense-Smalltalk' 0
-SmallSense::SmalltalkParserTests SmallSense__SmalltalkParserTests stx:goodies/smallsense 'SmallSense-Tests-Obsolete' 1
 SmallSense::SnippetPO SmallSense__SnippetPO stx:goodies/smallsense 'SmallSense-Core-Interface-PO' 0
 SmallSense::UnionType SmallSense__UnionType stx:goodies/smallsense 'SmallSense-Smalltalk-Types' 0
 SmallSense::UnknownType SmallSense__UnknownType stx:goodies/smallsense 'SmallSense-Smalltalk-Types' 1
 SmallSense::VariableBindingPO SmallSense__VariableBindingPO stx:goodies/smallsense 'SmallSense-Java-Interface-PO' 0
 SmallSense::VariablePO SmallSense__VariablePO stx:goodies/smallsense 'SmallSense-Core-Interface-PO' 0
 SmallSense::AbstractJavaCompletionEngineSimple SmallSense__AbstractJavaCompletionEngineSimple stx:goodies/smallsense 'SmallSense-Java' 2
-SmallSense::AbstractJavaCompletionEngineTests SmallSense__AbstractJavaCompletionEngineTests stx:goodies/smallsense 'SmallSense-Tests' 1
 SmallSense::AbstractSearchDialog SmallSense__AbstractSearchDialog stx:goodies/smallsense 'SmallSense-Core-Interface-Search' 2
 SmallSense::AbstractSelectDialog SmallSense__AbstractSelectDialog stx:goodies/smallsense 'SmallSense-Core-Interface-Search' 1
 SmallSense::GroovyEditSupport SmallSense__GroovyEditSupport stx:goodies/smallsense 'SmallSense-Groovy' 0
 SmallSense::JavaCompletionEngine SmallSense__JavaCompletionEngine stx:goodies/smallsense 'SmallSense-Java' 0
 SmallSense::JavaConstructorPO SmallSense__JavaConstructorPO stx:goodies/smallsense 'SmallSense-Java-Interface-PO' 0
-SmallSense::JavaEditSupportTests SmallSense__JavaEditSupportTests stx:goodies/smallsense 'SmallSense-Tests' 1
 SmallSense::MethodKeywordRestPO SmallSense__MethodKeywordRestPO stx:goodies/smallsense 'SmallSense-Core-Interface-PO' 0
-SmallSense::SmalltalkCompletionEngineTests SmallSense__SmalltalkCompletionEngineTests stx:goodies/smallsense 'SmallSense-Tests' 1
-SmallSense::SmalltalkEditSupportTests SmallSense__SmalltalkEditSupportTests stx:goodies/smallsense 'SmallSense-Tests' 1
 SmallSense::ClassSearchDialog SmallSense__ClassSearchDialog stx:goodies/smallsense 'SmallSense-Core-Interface-Search' 2
-SmallSense::GroovyCompletionEngineSimpleTests SmallSense__GroovyCompletionEngineSimpleTests stx:goodies/smallsense 'SmallSense-Tests' 1
 SmallSense::JavaCompletionEngineSimple SmallSense__JavaCompletionEngineSimple stx:goodies/smallsense 'SmallSense-Java' 2
-SmallSense::JavaCompletionEngineTests SmallSense__JavaCompletionEngineTests stx:goodies/smallsense 'SmallSense-Tests' 1
 SmallSense::MethodSearchDialog SmallSense__MethodSearchDialog stx:goodies/smallsense 'SmallSense-Core-Interface-Search' 2
 SmallSense::Navigator SmallSense__Navigator stx:goodies/smallsense 'SmallSense-Core-Interface-Search' 2
 SmallSense::PackageSelectDialog SmallSense__PackageSelectDialog stx:goodies/smallsense 'SmallSense-Core-Interface-Search' 1
 SmallSense::ProtocolSelectDialog SmallSense__ProtocolSelectDialog stx:goodies/smallsense 'SmallSense-Core-Interface-Search' 1
 SmallSense::GroovyCompletionEngineSimple SmallSense__GroovyCompletionEngineSimple stx:goodies/smallsense 'SmallSense-Groovy' 2
+SmallSense::AbstractJavaCompletionEngineTests SmallSense__AbstractJavaCompletionEngineTests stx:goodies/smallsense 'SmallSense-Tests' 1
+SmallSense::AbstractTestCase SmallSense__AbstractTestCase stx:goodies/smallsense 'SmallSense-Tests' 1
+SmallSense::BaseTestClass SmallSense__BaseTestClass stx:goodies/smallsense 'SmallSense-Tests-Obsolete' 1
+SmallSense::CompletionEngineTests SmallSense__CompletionEngineTests stx:goodies/smallsense 'SmallSense-Tests' 1
+SmallSense::EditSupportTests SmallSense__EditSupportTests stx:goodies/smallsense 'SmallSense-Tests' 1
+SmallSense::FinderTests SmallSense__FinderTests stx:goodies/smallsense 'SmallSense-Tests-Obsolete' 1
+SmallSense::GroovyCompletionEngineSimpleTests SmallSense__GroovyCompletionEngineSimpleTests stx:goodies/smallsense 'SmallSense-Tests' 1
+SmallSense::JavaCompletionEngineEnvironmentResource SmallSense__JavaCompletionEngineEnvironmentResource stx:goodies/smallsense 'SmallSense-Tests' 1
+SmallSense::JavaCompletionEngineTests SmallSense__JavaCompletionEngineTests stx:goodies/smallsense 'SmallSense-Tests' 1
+SmallSense::JavaEditSupportTests SmallSense__JavaEditSupportTests stx:goodies/smallsense 'SmallSense-Tests' 1
+SmallSense::RecognizerTests SmallSense__RecognizerTests stx:goodies/smallsense 'SmallSense-Tests-Obsolete' 1
+SmallSense::SmalltalkCompletionEngineTests SmallSense__SmalltalkCompletionEngineTests stx:goodies/smallsense 'SmallSense-Tests' 1
+SmallSense::SmalltalkEditSupportTests SmallSense__SmalltalkEditSupportTests stx:goodies/smallsense 'SmallSense-Tests' 1
+SmallSense::SmalltalkParserTests SmallSense__SmalltalkParserTests stx:goodies/smallsense 'SmallSense-Tests-Obsolete' 1
+SmallSense::TestCase SmallSense__TestCase stx:goodies/smallsense 'SmallSense-Tests-Obsolete' 1
+SmallSense::TokenPatternMatcherTests SmallSense__TokenPatternMatcherTests stx:goodies/smallsense 'SmallSense-Tests' 1
--- a/bc.mak	Fri Jan 23 19:19:02 2015 +0100
+++ b/bc.mak	Sat Jan 24 01:58:51 2015 +0000
@@ -35,7 +35,7 @@
 
 
 
-LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\helpers -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\lint -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\parser -I$(INCLUDE_TOP)\stx\goodies\regex -I$(INCLUDE_TOP)\stx\goodies\sunit -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libbasic2 -I$(INCLUDE_TOP)\stx\libbasic3 -I$(INCLUDE_TOP)\stx\libcomp -I$(INCLUDE_TOP)\stx\libhtml -I$(INCLUDE_TOP)\stx\libjava -I$(INCLUDE_TOP)\stx\libjava\tools -I$(INCLUDE_TOP)\stx\libtool -I$(INCLUDE_TOP)\stx\libview -I$(INCLUDE_TOP)\stx\libview2 -I$(INCLUDE_TOP)\stx\libwidg -I$(INCLUDE_TOP)\stx\libwidg2
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\helpers -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\lint -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\parser -I$(INCLUDE_TOP)\stx\goodies\regex -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libbasic2 -I$(INCLUDE_TOP)\stx\libbasic3 -I$(INCLUDE_TOP)\stx\libcomp -I$(INCLUDE_TOP)\stx\libhtml -I$(INCLUDE_TOP)\stx\libjava -I$(INCLUDE_TOP)\stx\libjava\tools -I$(INCLUDE_TOP)\stx\libtool -I$(INCLUDE_TOP)\stx\libview -I$(INCLUDE_TOP)\stx\libview2 -I$(INCLUDE_TOP)\stx\libwidg -I$(INCLUDE_TOP)\stx\libwidg2
 LOCALDEFINES=
 
 STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
@@ -62,7 +62,6 @@
 	pushd ..\..\libview & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\libview2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\refactoryBrowser\browser & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
-	pushd ..\sunit & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\libwidg & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\refactoryBrowser\lint & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\libhtml & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
@@ -98,6 +97,7 @@
 $(OUTDIR)SmallSense__EditSupport.$(O) SmallSense__EditSupport.$(H): SmallSense__EditSupport.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__Info.$(O) SmallSense__Info.$(H): SmallSense__Info.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__Manager.$(O) SmallSense__Manager.$(H): SmallSense__Manager.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)SmallSense__NavigatorStep.$(O) SmallSense__NavigatorStep.$(H): SmallSense__NavigatorStep.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__PO.$(O) SmallSense__PO.$(H): SmallSense__PO.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libwidg2\HierarchicalItem.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__ParseTreeIndex.$(O) SmallSense__ParseTreeIndex.$(H): SmallSense__ParseTreeIndex.st $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\OrderedCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\SequenceableCollection.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__ParseTreeIndexEntry.$(O) SmallSense__ParseTreeIndexEntry.$(H): SmallSense__ParseTreeIndexEntry.st $(INCLUDE_TOP)\stx\libbasic\Magnitude.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -137,6 +137,7 @@
 $(OUTDIR)SmallSense__MethodPO.$(O) SmallSense__MethodPO.$(H): SmallSense__MethodPO.st $(INCLUDE_TOP)\stx\goodies\smallsense\SmallSense__PO.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libwidg2\HierarchicalItem.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__PackagePO.$(O) SmallSense__PackagePO.$(H): SmallSense__PackagePO.st $(INCLUDE_TOP)\stx\goodies\smallsense\SmallSense__PO.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libwidg2\HierarchicalItem.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__PluggablePO.$(O) SmallSense__PluggablePO.$(H): SmallSense__PluggablePO.st $(INCLUDE_TOP)\stx\goodies\smallsense\SmallSense__PO.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libwidg2\HierarchicalItem.$(H) $(STCHDR)
+$(OUTDIR)SmallSense__PluggableSearchProcessor.$(O) SmallSense__PluggableSearchProcessor.$(H): SmallSense__PluggableSearchProcessor.st $(INCLUDE_TOP)\stx\goodies\smallsense\SmallSense__AbstractSearchProcessor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__SmalltalkCompletionEngine.$(O) SmallSense__SmalltalkCompletionEngine.$(H): SmallSense__SmalltalkCompletionEngine.st $(INCLUDE_TOP)\stx\goodies\smallsense\SmallSense__CompletionEngine.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__SmalltalkEditSupport.$(O) SmallSense__SmalltalkEditSupport.$(H): SmallSense__SmalltalkEditSupport.st $(INCLUDE_TOP)\stx\goodies\smallsense\SmallSense__EditSupport.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__SmalltalkInferencer.$(O) SmallSense__SmalltalkInferencer.$(H): SmallSense__SmalltalkInferencer.st $(INCLUDE_TOP)\stx\goodies\smallsense\SmallSense__SmalltalkParseNodeVisitor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
--- a/extensions.st	Fri Jan 23 19:19:02 2015 +0100
+++ b/extensions.st	Sat Jan 24 01:58:51 2015 +0000
@@ -589,6 +589,37 @@
     "Created: / 25-11-2013 / 12:27:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!Tools::NewSystemBrowser methodsFor:'menu actions-searching-SmallSense'!
+
+searchMenuOpenNavigatorOnDeclarations
+    "Open a SmallSense navigator on definitions (i.e.,
+     navugating to a class or or method implementor)"
+
+    | result |    
+
+    result := SmallSense::Navigator open.
+    result isBehavior ifTrue:[ 
+        self switchToClass: result.
+        ^ self
+    ].
+    result isMethod ifTrue:[ 
+        self switchToClass: result mclass selector: result selector.
+        ^ self
+    ].
+    result isCollection ifTrue:[ 
+        (result allSatisfy:[:e|e isMethod]) ifTrue:[ 
+            self  spawnMethodBrowserForSearch:[ result ] 
+                  sortBy:#class 
+                  in:#newBuffer 
+                  label:(resources string: 'Implementors of %1' with: result anElement selector storeString)
+        ].
+        ^ self
+    ].
+    ^ self
+
+    "Created: / 23-01-2015 / 20:31:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !Tools::NewSystemBrowser methodsFor:'private-searching-smallsense'!
 
 smallSenseSearchCompletion:patternString
@@ -725,30 +756,9 @@
             | key |
 
             key := anEvent key.
-            key == #Find ifTrue:[ 
-                (anEvent targetView isSameOrComponentOf:self codeView) ifFalse:[ 
-                    | result |    
-
-                    result := SmallSense::Navigator open.
-                    result isBehavior ifTrue:[ 
-                        self switchToClass: result.
-                        ^ true
-                    ].
-                    result isMethod ifTrue:[ 
-                        self switchToClass: result mclass selector: result selector.
-                        ^ true
-                    ].
-                    result isCollection ifTrue:[ 
-                        (result allSatisfy:[:e|e isMethod]) ifTrue:[ 
-                            self  spawnMethodBrowserForSearch:[ result ] 
-                                  sortBy:#class 
-                                  in:#newBuffer 
-                                  label:(resources string: 'Implementors of %1' with: result anElement selector storeString)
-                        ].
-                        ^ true
-                    ].
-                    ^ true
-                ].
+            key == #CtrlT ifTrue:[ 
+                self searchMenuOpenNavigatorOnDeclarations.
+                ^ true
             ].
         ]
     ].
@@ -759,7 +769,7 @@
     "
 
     "Created: / 10-01-2015 / 13:37:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 14-01-2015 / 16:30:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-01-2015 / 01:47:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !Tools::NewSystemBrowser class methodsFor:'utilities'!
--- a/libInit.cc	Fri Jan 23 19:19:02 2015 +0100
+++ b/libInit.cc	Sat Jan 24 01:58:51 2015 +0000
@@ -41,6 +41,7 @@
 _SmallSense__EditSupport_Init(pass,__pRT__,snd);
 _SmallSense__Info_Init(pass,__pRT__,snd);
 _SmallSense__Manager_Init(pass,__pRT__,snd);
+_SmallSense__NavigatorStep_Init(pass,__pRT__,snd);
 _SmallSense__PO_Init(pass,__pRT__,snd);
 _SmallSense__ParseTreeIndex_Init(pass,__pRT__,snd);
 _SmallSense__ParseTreeIndexEntry_Init(pass,__pRT__,snd);
@@ -80,6 +81,7 @@
 _SmallSense__MethodPO_Init(pass,__pRT__,snd);
 _SmallSense__PackagePO_Init(pass,__pRT__,snd);
 _SmallSense__PluggablePO_Init(pass,__pRT__,snd);
+_SmallSense__PluggableSearchProcessor_Init(pass,__pRT__,snd);
 _SmallSense__SmalltalkCompletionEngine_Init(pass,__pRT__,snd);
 _SmallSense__SmalltalkEditSupport_Init(pass,__pRT__,snd);
 _SmallSense__SmalltalkInferencer_Init(pass,__pRT__,snd);
--- a/smallsense.rc	Fri Jan 23 19:19:02 2015 +0100
+++ b/smallsense.rc	Sat Jan 24 01:58:51 2015 +0000
@@ -25,7 +25,7 @@
       VALUE "LegalCopyright", "Copyright Jan Vrany 2013-2014\0"
       VALUE "ProductName", "SmallSense\0"
       VALUE "ProductVersion", "6.2.5.0\0"
-      VALUE "ProductDate", "Mon, 12 Jan 2015 09:42:27 GMT\0"
+      VALUE "ProductDate", "Sat, 24 Jan 2015 01:53:31 GMT\0"
     END
 
   END
--- a/stx_goodies_smallsense.st	Fri Jan 23 19:19:02 2015 +0100
+++ b/stx_goodies_smallsense.st	Sat Jan 24 01:58:51 2015 +0000
@@ -90,8 +90,7 @@
         #'stx:goodies/refactoryBrowser/lint'    "RBBasicLintRule - extended"
         #'stx:goodies/refactoryBrowser/parser'    "RBBlockNode - extended"
         #'stx:goodies/regex'    "Regex::RxCharSetParser - superclass of SmallSense::TokenPatternParser::TokenSpecParser"
-        #'stx:goodies/sunit'    "TestAsserter - superclass of SmallSense::AbstractJavaCompletionEngineTests"
-        #'stx:libbasic'    "Collection - extended"
+        #'stx:libbasic'    "Autoload - superclass of SmallSense::AbstractJavaCompletionEngineTests"
         #'stx:libcomp'    "AbstractSyntaxHighlighter - superclass of SmallSense::SmalltalkParser"
         #'stx:libhtml'    "HTMLDocumentFrame - extended"
         #'stx:libtool'    "AbstractSettingsApplication - superclass of SmallSense::SettingsAppl"
@@ -139,8 +138,6 @@
         "<className> or (<className> attributes...) in load order"
         #'SmallSense::AbstractDIalog'
         #'SmallSense::AbstractSearchProcessor'
-        (#'SmallSense::AbstractTestCase' autoload)
-        (#'SmallSense::BaseTestClass' autoload)
         #'SmallSense::CodeHighlightingService'
         #'SmallSense::CodeNavigationService'
         #'SmallSense::CompletionContext'
@@ -152,8 +149,8 @@
         #'SmallSense::EditService'
         #'SmallSense::EditSupport'
         #'SmallSense::Info'
-        (#'SmallSense::JavaCompletionEngineEnvironmentResource' autoload)
         #'SmallSense::Manager'
+        #'SmallSense::NavigatorStep'
         #'SmallSense::PO'
         #'SmallSense::ParseTreeIndex'
         #'SmallSense::ParseTreeIndexEntry'
@@ -168,9 +165,7 @@
         #'SmallSense::SmalltalkQuickFixer'
         #'SmallSense::SmalltalkSyntaxHighlighter'
         #'SmallSense::SmalltalkUnacceptedMethodEnvironment'
-        (#'SmallSense::TestCase' autoload)
         #'SmallSense::TokenPatternMatcher'
-        (#'SmallSense::TokenPatternMatcherTests' autoload)
         #'SmallSense::TokenPatternParser'
         #'SmallSense::TokenPatternToken'
         #'SmallSense::TokenPatternTokenSet'
@@ -184,11 +179,8 @@
         #'SmallSense::ClassPO'
         #'SmallSense::ClassSearchProcessor'
         #'SmallSense::ClassType'
-        (#'SmallSense::CompletionEngineTests' autoload)
         #'SmallSense::CompositeProcessor'
         #'SmallSense::ConstantPO'
-        (#'SmallSense::EditSupportTests' autoload)
-        (#'SmallSense::FinderTests' autoload)
         #'SmallSense::GenericEditSupport'
         #'SmallSense::ImplementorSearchProcessor'
         #'SmallSense::JavaEditSupport'
@@ -198,37 +190,46 @@
         #'SmallSense::MethodPO'
         #'SmallSense::PackagePO'
         #'SmallSense::PluggablePO'
-        (#'SmallSense::RecognizerTests' autoload)
+        #'SmallSense::PluggableSearchProcessor'
         #'SmallSense::SmalltalkCompletionEngine'
         #'SmallSense::SmalltalkEditSupport'
         #'SmallSense::SmalltalkInferencer'
         #'SmallSense::SmalltalkParseNodeFinder'
-        (#'SmallSense::SmalltalkParserTests' autoload)
         #'SmallSense::SnippetPO'
         #'SmallSense::UnionType'
         #'SmallSense::UnknownType'
         #'SmallSense::VariableBindingPO'
         #'SmallSense::VariablePO'
         #'SmallSense::AbstractJavaCompletionEngineSimple'
-        (#'SmallSense::AbstractJavaCompletionEngineTests' autoload)
         #'SmallSense::AbstractSearchDialog'
         #'SmallSense::AbstractSelectDialog'
         #'SmallSense::GroovyEditSupport'
         #'SmallSense::JavaCompletionEngine'
         #'SmallSense::JavaConstructorPO'
-        (#'SmallSense::JavaEditSupportTests' autoload)
         #'SmallSense::MethodKeywordRestPO'
-        (#'SmallSense::SmalltalkCompletionEngineTests' autoload)
-        (#'SmallSense::SmalltalkEditSupportTests' autoload)
         #'SmallSense::ClassSearchDialog'
-        (#'SmallSense::GroovyCompletionEngineSimpleTests' autoload)
         #'SmallSense::JavaCompletionEngineSimple'
-        (#'SmallSense::JavaCompletionEngineTests' autoload)
         #'SmallSense::MethodSearchDialog'
         #'SmallSense::Navigator'
         #'SmallSense::PackageSelectDialog'
         #'SmallSense::ProtocolSelectDialog'
         #'SmallSense::GroovyCompletionEngineSimple'
+        (#'SmallSense::AbstractJavaCompletionEngineTests' autoload)
+        (#'SmallSense::AbstractTestCase' autoload)
+        (#'SmallSense::BaseTestClass' autoload)
+        (#'SmallSense::CompletionEngineTests' autoload)
+        (#'SmallSense::EditSupportTests' autoload)
+        (#'SmallSense::FinderTests' autoload)
+        (#'SmallSense::GroovyCompletionEngineSimpleTests' autoload)
+        (#'SmallSense::JavaCompletionEngineEnvironmentResource' autoload)
+        (#'SmallSense::JavaCompletionEngineTests' autoload)
+        (#'SmallSense::JavaEditSupportTests' autoload)
+        (#'SmallSense::RecognizerTests' autoload)
+        (#'SmallSense::SmalltalkCompletionEngineTests' autoload)
+        (#'SmallSense::SmalltalkEditSupportTests' autoload)
+        (#'SmallSense::SmalltalkParserTests' autoload)
+        (#'SmallSense::TestCase' autoload)
+        (#'SmallSense::TokenPatternMatcherTests' autoload)
     )
 !
 
@@ -302,6 +303,7 @@
         #'Tools::LintService' showInfoWindowForLine:
         #'Tools::NewSystemBrowser' #'stx_goodies_smallsense_askForMethodCategory:title:okLabel:list:recentList:initialAnswer:'
         #'Tools::NewSystemBrowser' #'stx_goodies_smallsense_processEvent:'
+        #'Tools::NewSystemBrowser' searchMenuOpenNavigatorOnDeclarations
     )
 ! !