SmallSense__AbstractSearchDialog.st
changeset 330 055633bb5ceb
parent 329 0c0024acfccc
child 331 eaf776286738
--- a/SmallSense__AbstractSearchDialog.st	Mon Apr 28 08:36:50 2014 +0100
+++ b/SmallSense__AbstractSearchDialog.st	Tue Apr 29 00:11:40 2014 +0100
@@ -2,21 +2,23 @@
 
 "{ NameSpace: SmallSense }"
 
-SimpleDialog subclass:#AbstractSearchDialog
-	instanceVariableNames:'acceptEnabledHolder matchingObjectsView matchingObjectsTree
-		matchingObjectsSelectionHolder matchPatternHolder
-		matchingUpdateJob matchPatternView environmentHolder filterHolder
-		filter matchingLabelHolder'
+AbstractDIalog subclass:#AbstractSearchDialog
+	instanceVariableNames:'matchingObjectsView matchingObjectsTree
+		matchingObjectsSelectionHolder matchingObjectsLabelHolder
+		matchingObjectsUpdateJob matchPatternHolder matchPatternView
+		environmentHolder filterHolder filter recentlySearchedPatterns
+		recentlySearchedObjects'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'SmallSense-Core-Interface-Search'
 !
 
-AbstractSearchDialog class instanceVariableNames:'lastMatchPattern lastSearchedObjects'
+AbstractSearchDialog class instanceVariableNames:'recentlySearchedPatterns recentlySearchedObjects'
 
 "
  The following class instance variables are inherited by this class:
 
+	SmallSense::AbstractDIalog - 
 	SimpleDialog - 
 	ApplicationModel - ClassResources
 	Model - 
@@ -26,25 +28,27 @@
 
 !AbstractSearchDialog class methodsFor:'accessing'!
 
-lastMatchPattern
-    ^ lastMatchPattern
+recentlySearchedObjects
+    recentlySearchedObjects isNil ifTrue:[ 
+        recentlySearchedObjects := OrderedSet new.
+    ].
+    ^ recentlySearchedObjects
+
+    "Created: / 28-04-2014 / 23:13:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-lastMatchPattern:something
-    lastMatchPattern := something.
-!
+recentlySearchedPatterns
+    recentlySearchedPatterns isNil ifTrue:[ 
+        recentlySearchedPatterns := OrderedSet new.
+    ].
+    ^ recentlySearchedPatterns
 
-lastSearchedObjects
-    ^ lastSearchedObjects
-!
-
-lastSearchedObjects:something
-    lastSearchedObjects := something.
+    "Created: / 28-04-2014 / 23:13:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !AbstractSearchDialog class methodsFor:'interface specs'!
 
-windowSpec
+dialogSpec
     "This resource specification was automatically generated
      by the UIPainter of ST/X."
 
@@ -52,16 +56,15 @@
      the UIPainter may not be able to read the specification."
 
     "
-     UIPainter new openOnClass:SmallSense::AbstractSearchDialog andSelector:#windowSpec
-     SmallSense::AbstractSearchDialog new openInterface:#windowSpec
-     SmallSense::AbstractSearchDialog open
+     UIPainter new openOnClass:SmallSense::AbstractSearchDialog andSelector:#dialogSpec
+     SmallSense::AbstractSearchDialog new openInterface:#dialogSpec
     "
 
     <resource: #canvas>
 
     ^ 
     #(FullSpec
-       name: windowSpec
+       name: 'dialogSpec'
        window: 
       (WindowSpec
          label: 'Search...'
@@ -75,7 +78,7 @@
          collection: (
           (VerticalPanelViewSpec
              name: 'ContentAndOptionsPanel'
-             layout: (LayoutFrame 10 0 0 0 -10 1 -40 1)
+             layout: (LayoutFrame 10 0 0 0 -10 1 0 1)
              horizontalLayout: fit
              verticalLayout: topSpaceFit
              horizontalSpace: 3
@@ -97,11 +100,6 @@
               
              )
            )
-          (UISubSpecification
-             name: 'ButtonsPane'
-             layout: (LayoutFrame 10 0 -40 1 -10 1 0 1)
-             minorKey: buttonsPaneSpec
-           )
           )
         
        )
@@ -110,72 +108,6 @@
 
 !AbstractSearchDialog class methodsFor:'interface specs-content'!
 
-buttonsPaneSpec
-    "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:SmallSense::AbstractSearchDialog andSelector:#buttonPaneSpec
-     SmallSense::AbstractSearchDialog new openInterface:#buttonPaneSpec
-    "
-
-    <resource: #canvas>
-
-    ^ 
-    #(FullSpec
-       name: 'buttonPaneSpec'
-       window: 
-      (WindowSpec
-         label: 'Search...'
-         name: 'Search...'
-         min: (Point 10 10)
-         bounds: (Rectangle 0 0 708 40)
-         menu: mainMenuSpec
-       )
-       component: 
-      (SpecCollection
-         collection: (
-          (HorizontalPanelViewSpec
-             name: 'Buttons'
-             layout: (LayoutFrame 0 0 0 0 0 1 0 1)
-             horizontalLayout: right
-             verticalLayout: center
-             horizontalSpace: 3
-             verticalSpace: 3
-             reverseOrderIfOKAtLeft: true
-             component: 
-            (SpecCollection
-               collection: (
-                (ActionButtonSpec
-                   label: 'Close'
-                   name: 'Button2'
-                   translateLabel: true
-                   model: doCancel
-                   extent: (Point 125 22)
-                 )
-                (ActionButtonSpec
-                   label: 'OK'
-                   name: 'Button1'
-                   translateLabel: true
-                   model: doAccept
-                   enableChannel: acceptEnabledHolder
-                   extent: (Point 125 22)
-                 )
-                )
-              
-             )
-           )
-          )
-        
-       )
-     )
-
-    "Created: / 27-04-2014 / 23:33:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
 contentPaneSpec
     "This resource specification was automatically generated
      by the UIPainter of ST/X."
@@ -192,7 +124,7 @@
 
     ^ 
     #(FullSpec
-       name: 'contentPaneSpec'
+       name: contentPaneSpec
        window: 
       (WindowSpec
          label: 'Search...'
@@ -226,15 +158,16 @@
                    acceptOnReturn: true
                    acceptOnTab: true
                    acceptOnPointerLeave: true
+                   entryCompletionBlock: matchPatternCompletionBlock
                    extent: (Point 706 25)
-                   postBuildCallback: postBuilderMatchPatternView:
+                   postBuildCallback: postBuildMatchPatternView:
                    usePreferredHeight: true
                  )
                 (LabelSpec
                    label: 'Matching items:'
                    name: 'MatchingLabel'
                    translateLabel: true
-                   labelChannel: matchingLabelHolder
+                   labelChannel: matchingObjectsLabelHolder
                    adjust: left
                    extent: (Point 708 25)
                  )
@@ -358,29 +291,26 @@
     ^self matchPatternHolder value: aString
 
     "Created: / 11-03-2013 / 15:21:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+recentlySearchedObjects
+    ^ recentlySearchedObjects
+!
+
+recentlySearchedObjects:aCollection
+    recentlySearchedObjects := aCollection.
+!
+
+recentlySearchedPatterns
+    ^ recentlySearchedPatterns
+!
+
+recentlySearchedPatterns:aCollection
+    recentlySearchedPatterns := aCollection.
 ! !
 
 !AbstractSearchDialog methodsFor:'aspects'!
 
-acceptEnabledHolder
-    <resource: #uiAspect>
-
-    "automatically generated by UIPainter ..."
-
-    "*** the code below creates a default model when invoked."
-    "*** (which may not be the one you wanted)"
-    "*** Please change as required and accept it in the browser."
-    "*** (and replace this comment by something more useful ;-)"
-
-    acceptEnabledHolder isNil ifTrue:[
-        acceptEnabledHolder := true asValue.
-"/ if your app needs to be notified of changes, uncomment one of the lines below:
-"/       acceptEnabledHolder addDependent:self.
-"/       acceptEnabledHolder onChangeSend:#acceptEnabledHolderChanged to:self.
-    ].
-    ^ acceptEnabledHolder.
-!
-
 environmentHolder
     "return/create the 'registryHolder' value holder (automatically generated)"
 
@@ -444,6 +374,12 @@
     ].
 !
 
+matchPatternCompletionBlock
+    ^ self subclassResponsibility
+
+    "Created: / 28-04-2014 / 22:30:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 matchPatternHolder
     <resource: #uiAspect>
 
@@ -457,7 +393,7 @@
     "Modified (format): / 08-03-2013 / 14:05:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-matchingLabelHolder
+matchingObjectsLabelHolder
     <resource: #uiAspect>
 
     "automatically generated by UIPainter ..."
@@ -467,15 +403,15 @@
     "*** Please change as required and accept it in the browser."
     "*** (and replace this comment by something more useful ;-)"
 
-    matchingLabelHolder isNil ifTrue:[
-        matchingLabelHolder := ValueHolder with:(resources string:'Matching items:').
+    matchingObjectsLabelHolder isNil ifTrue:[
+        matchingObjectsLabelHolder := ValueHolder with:(resources string:'Matching items:').
 "/ if your app needs to be notified of changes, uncomment one of the lines below:
 "/       matchingLabelHolder addDependent:self.
 "/       matchingLabelHolder onChangeSend:#matchingLabelHolderChanged to:self.
     ].
-    ^ matchingLabelHolder.
+    ^ matchingObjectsLabelHolder.
 
-    "Modified: / 18-03-2013 / 12:54:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 28-04-2014 / 22:29:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 matchingObjectsSelectionHolder
@@ -522,20 +458,13 @@
 
 !AbstractSearchDialog methodsFor:'change & update'!
 
-savePattern
-    self lastMatchPattern: self pattern.
-
-    "Created: / 11-03-2013 / 15:45:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 28-04-2014 / 00:09:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
 update:something with:aParameter from:changedObject
     "Invoked when an object that I depend upon sends a change notification."
 
     "stub code automatically generated - please change as required"
 
     changedObject == matchPatternHolder ifTrue:[
-        matchingUpdateJob restart.
+        matchingObjectsUpdateJob restart.
         ^ self.
     ].
     changedObject == matchingObjectsSelectionHolder ifTrue:[
@@ -544,8 +473,9 @@
     ].
     changedObject == accept ifTrue:[
         accept value ifTrue:[
-            self savePattern.
+            recentlySearchedPatterns add: self pattern.
             acceptedValue := matchingObjectsSelectionHolder value collect:[:e|e subject].
+            recentlySearchedObjects addAll: acceptedValue.
         ].
         ^ self.
     ].
@@ -560,7 +490,7 @@
     ].
     super update:something with:aParameter from:changedObject
 
-    "Modified: / 28-04-2014 / 00:12:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-04-2014 / 23:17:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 updateAcceptEnabled
@@ -571,27 +501,35 @@
 !
 
 updateMatchingLabelToNormal
-    self matchingLabelHolder value: (resources string: 'Matching items:').
+    self matchingObjectsLabelHolder value: (resources string: 'Matching items:').
 
     "Created: / 18-03-2013 / 14:02:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 28-04-2014 / 00:22:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-04-2014 / 22:29:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 updateMatchingLabelToSearching
-    self matchingLabelHolder value: (resources string: 'Searching...').
+    self matchingObjectsLabelHolder value: (resources string: 'Searching...').
 
     "Created: / 18-03-2013 / 14:01:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-04-2014 / 22:29:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 updateMatchingObjects
-    [
-        self updateMatchingLabelToSearching.
-        self computeMatchingObjects.
-    ] ensure:[
-        self updateMatchingLabelToNormal.
-    ]
+    | pattern environment |
+
+    self matchPatternHolder value notEmptyOrNil ifTrue:[ 
+        pattern := StringPattern fromString: self matchPatternHolder value.
+        environment := self environment.
+"/        [
+"/            self updateMatchingLabelToSearching.
+            self computeMatchingObjectsForPattern: pattern inEnvironment: environment
+"/        ] ensure:[
+"/            self updateMatchingLabelToNormal.
+"/        ]
+    ].
 
     "Created: / 27-04-2014 / 23:48:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-04-2014 / 23:23:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 updateNoResults: root
@@ -618,6 +556,17 @@
     "Created: / 22-04-2014 / 11:59:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!AbstractSearchDialog methodsFor:'events'!
+
+closeCancel
+    "cancel was pressed. close the dialog"
+
+    accept setValue: nil.
+    ^ super closeCancel.
+
+    "Created: / 28-04-2014 / 23:56:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !AbstractSearchDialog methodsFor:'forced actions'!
 
 doAcceptByDoubleClick
@@ -640,12 +589,22 @@
 
 commonPostOpen
 "/    self updateMatching.
-    self pattern: self lastMatchPattern.
+    recentlySearchedPatterns notEmptyOrNil ifTrue:[
+        matchPatternView contents: self recentlySearchedPatterns last.
+    ].
     matchPatternView selectAll.
     self updateAcceptEnabled.
 
     "Created: / 08-03-2013 / 13:15:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 28-04-2014 / 00:22:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-04-2014 / 23:15:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+postBuildMatchPatternView:aView
+    matchPatternView := aView scrolledView.
+"/    matchPatternView delegate: self.
+    matchPatternView onKey:#CursorDown leaveWith:[ self keyPressCursorDownInPatternView ]
+
+    "Created: / 28-04-2014 / 22:27:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 postBuildMatchingObjectsView:aView
@@ -653,14 +612,6 @@
     matchingObjectsView delegate: self.
 
     "Created: / 22-04-2014 / 13:21:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-postBuilderMatchPatternView:aView
-    matchPatternView := aView scrolledView.
-"/    matchPatternView delegate: self.
-    matchPatternView onKey:#CursorDown leaveWith:[ self keyPressCursorDownInPatternView ]
-
-    "Modified: / 22-04-2014 / 11:59:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !AbstractSearchDialog methodsFor:'initialization'!
@@ -680,9 +631,12 @@
 
     self accept addDependent: self.
     self matchingObjectsTree. "/force its initialization
-    matchingUpdateJob := BackgroundJob named: 'SmallSense search dialog updater' on:[self updateMatchingObjects]
+    matchingObjectsUpdateJob := BackgroundJob named: 'SmallSense search dialog updater' on:[self updateMatchingObjects].
 
-    "Modified: / 27-04-2014 / 23:48:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    recentlySearchedPatterns := self class recentlySearchedPatterns.
+    recentlySearchedObjects := self class recentlySearchedObjects.
+
+    "Modified: / 28-04-2014 / 23:14:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !AbstractSearchDialog methodsFor:'menu actions'!
@@ -761,9 +715,10 @@
 
 !AbstractSearchDialog methodsFor:'searching'!
 
-computeMatchingObjects
+computeMatchingObjectsForPattern: pattern inEnvironment: environment
+
     self subclassResponsibility
 
-    "Created: / 27-04-2014 / 23:48:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 28-04-2014 / 23:20:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !