#FEATURE
authorClaus Gittinger <cg@exept.de>
Sun, 17 Jan 2016 02:26:31 +0100
changeset 5554 f389396b26a6
parent 5553 f684e07a633d
child 5555 7390d495b02c
#FEATURE class: TextView changed: #openSearchBoxAndSearch #searchDialogSpec added option to either search+replace all, or only the next occurrance of the search string.
TextView.st
--- a/TextView.st	Sat Jan 16 13:04:14 2016 +0100
+++ b/TextView.st	Sun Jan 17 02:26:31 2016 +0100
@@ -512,25 +512,29 @@
                    translateLabel: true
                    extent: (Point 420 24)
                  )
-                (ViewSpec
-                   name: 'ReplaceBox'
+                (HorizontalPanelViewSpec
+                   name: 'HorizontalPanel1'
+                   horizontalLayout: leftFit
+                   verticalLayout: fit
+                   ignoreInvisibleComponents: false
+                   elementsChangeSize: true
                    component: 
                   (SpecCollection
                      collection: (
                       (CheckBoxSpec
-                         label: 'Global Replace With:'
+                         label: 'Replace By:'
                          name: 'CheckBox4'
-                         layout: (LayoutFrame 0 0 0 0 180 0 23 0)
                          activeHelpKey: replaceText
                          level: 0
                          enableChannel: replaceEnabled
                          tabable: true
                          model: replaceBoolean
                          translateLabel: true
+                         resizeForLabel: true
+                         useDefaultExtent: true
                        )
                       (InputFieldSpec
                          name: 'ReplaceEntryField'
-                         layout: (LayoutFrame 180 0 0 0 -2 1 22 0)
                          activeHelpKey: replaceText
                          visibilityChannel: replaceBoolean
                          enableChannel: replaceBoolean
@@ -538,12 +542,24 @@
                          acceptOnReturn: true
                          acceptOnTab: true
                          acceptOnPointerLeave: true
+                         extent: (Point 290 24)
                        )
                       )
                     
                    )
                    extent: (Point 420 24)
                  )
+                (CheckBoxSpec
+                   label: 'Replace All (to End of Text)'
+                   name: 'CheckBox8'
+                   activeHelpKey: searchAtBeginOfLineOnly
+                   level: 0
+                   visibilityChannel: replaceBoolean
+                   tabable: true
+                   model: replaceAllBoolean
+                   translateLabel: true
+                   extent: (Point 420 24)
+                 )
                 )
               
              )
@@ -2211,6 +2227,7 @@
      fwd ign match initialString
      bindings bldr doSearch modal searchVariableHolder selectedVariable searchFullWordHolder
      replaceBooleanEnabledHolder replaceBooleanHolder replaceTextHolder
+     replaceAllBooleanHolder
      searchAtBeginOfLineOnlyHolder|
 
     searchBarActionBlock notNil ifTrue:[
@@ -2232,6 +2249,7 @@
     searchFullWordHolder := false asValue.
     searchAtBeginOfLineOnlyHolder := false asValue.
     replaceBooleanHolder := false asValue.
+    replaceAllBooleanHolder := false asValue.
     replaceTextHolder := '' asValue.
     replaceBooleanEnabledHolder := self isReadOnly not asValue.
 
@@ -2268,7 +2286,10 @@
                                 and:[selectedVariable notNil]].
 
         isVariableSearch ifTrue:[
-            searchAction := [self searchVariableWithSyntaxElement:selectedVariable forward:fwd].
+            searchAction := 
+                [
+                    self searchVariableWithSyntaxElement:selectedVariable forward:fwd
+                ].
         ] ifFalse:[
             lastSearchWasVariableSearch := false.
             LastSearchIgnoredCase := lastSearchIgnoredCase := (caseHolder value not).
@@ -2277,19 +2298,20 @@
             LastSearchWasWrapAtEndOfText := wrapAtEndHolder value.
             pattern := patternHolder value.
             pattern notEmptyOrNil ifTrue:[
-                searchAction := [
-                    self searchUsingSpec:(
-                        ListView::SearchSpec new
-                            pattern:pattern
-                            ignoreCase:lastSearchIgnoredCase
-                            match: lastSearchWasMatch 
-                            regexMatch:matchWithRegexHolder value 
-                            variable: searchVariableHolder value
-                            fullWord: searchFullWordHolder value
-                            forward:fwd
-                            atBeginOfLineOnly:searchAtBeginOfLineOnlyHolder value
-                            wrapAtEnd:wrapAtEndHolder value).
-                ]
+                searchAction := 
+                    [
+                        self searchUsingSpec:(
+                            ListView::SearchSpec new
+                                pattern:pattern
+                                ignoreCase:lastSearchIgnoredCase
+                                match: lastSearchWasMatch 
+                                regexMatch:matchWithRegexHolder value 
+                                variable: searchVariableHolder value
+                                fullWord: searchFullWordHolder value
+                                forward:fwd
+                                atBeginOfLineOnly:searchAtBeginOfLineOnlyHolder value
+                                wrapAtEnd:wrapAtEndHolder value).
+                    ]
             ]
         ].
 
@@ -2303,22 +2325,26 @@
 
                 selectedVariable := selectedVariable lastElementInChain.
                 self selectFromCharacterPosition:selectedVariable start to:selectedVariable stop.
-                searchAction := [selectedVariable := selectedVariable previousElement.
-                                 selectedVariable notNil ifTrue:[
-                                     self selectFromCharacterPosition:selectedVariable start to:selectedVariable stop.
-                                 ].
-                                 "/ self searchVariableWithSyntaxElement:selectedVariable forward:false
-                                ].
+                searchAction := 
+                    [
+                        selectedVariable := selectedVariable previousElement.
+                        selectedVariable notNil ifTrue:[
+                            self selectFromCharacterPosition:selectedVariable start to:selectedVariable stop.
+                        ].
+                        "/ self searchVariableWithSyntaxElement:selectedVariable forward:false
+                    ].
             ].
 
             selStart := self characterPositionOfSelection.
             self replace:(replaceTextHolder value).
 
             searchAction value.
-            [self characterPositionOfSelection ~= selStart] whileTrue:[
-                selStart := self characterPositionOfSelection.
-                self replace:(replaceTextHolder value).
-                searchAction value.
+            replaceAllBooleanHolder value ifTrue:[
+                [self characterPositionOfSelection ~= selStart] whileTrue:[
+                    selStart := self characterPositionOfSelection.
+                    self replace:(replaceTextHolder value).
+                    searchAction value.
+                ]
             ]
         ] ifFalse:[
             searchAction value.
@@ -2328,11 +2354,23 @@
     bindings := IdentityDictionary new.
     bindings at:#searchPattern put:patternHolder.
     modal ifTrue:[
-        bindings at:#nextAction put:[searchBox doAccept.].
-        bindings at:#prevAction put:[fwd := false. searchBox doAccept.].
+        bindings at:#nextAction put:[
+            replaceAllBooleanHolder value ifTrue:[
+                searchBox doAccept.
+            ] ifFalse:[
+                doSearch value:true
+            ]    
+        ].
+        bindings at:#prevAction put:[
+            replaceAllBooleanHolder value ifTrue:[
+                fwd := false. searchBox doAccept.
+            ] ifFalse:[
+                doSearch value:false
+            ]    
+        ].
     ] ifFalse:[
-        bindings at:#nextAction put:[doSearch value:true.  "searchBox doAccept."].
-        bindings at:#prevAction put:[doSearch value:false. "fwd := false. searchBox doAccept."].
+        bindings at:#nextAction put:[doSearch value:true.].
+        bindings at:#prevAction put:[doSearch value:false.].
     ].
     bindings at:#caseSensitive put:caseHolder.
     bindings at:#match put:matchHolder.
@@ -2370,6 +2408,7 @@
     
     bindings at:#replaceEnabled put:replaceBooleanEnabledHolder.
     bindings at:#replaceBoolean put:replaceBooleanHolder.
+    bindings at:#replaceAllBoolean put:replaceAllBooleanHolder.
     bindings at:#replaceTextHolder put:replaceTextHolder.
     replaceBooleanHolder onChangeEvaluate:
         [