Skip to content

Commit 9f63f4a

Browse files
committed
Move incremental search to FindReplaceHandler
1 parent b18b037 commit 9f63f4a

6 files changed

Lines changed: 117 additions & 132 deletions

File tree

src/editor/Editor.cpp

Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ Editor::Editor()
3131
fSearchLastResult(-1, -1),
3232
fSearchLast(""),
3333
fSearchLastFlags(0),
34-
fIncrementalSearch(false),
3534
fNumberMarginEnabled(false),
3635
fFoldMarginEnabled(false),
3736
fBookmarkMarginEnabled(false),
@@ -482,63 +481,6 @@ Editor::ResetFindReplace()
482481
}
483482

484483

485-
/**
486-
* Works like Find(), except it's always case insensitive, looks forward and
487-
* includes the result in next search. It also saves selection in case the
488-
* search is cancelled. Search term is managed by the parent control/window.
489-
* After first call editor is put in incremental search mode so subsequent calls
490-
* do not reset saved selection.
491-
*/
492-
void
493-
Editor::IncrementalSearch(std::string term)
494-
{
495-
Sci::Guard<SearchTarget, SearchFlags> guard(this);
496-
497-
int length = SendMessage(SCI_GETLENGTH);
498-
Sci_Position anchor = SendMessage(SCI_GETANCHOR);
499-
Sci_Position current = SendMessage(SCI_GETCURRENTPOS);
500-
501-
if(fIncrementalSearch == false) {
502-
fIncrementalSearch = true;
503-
fSavedSelection = { anchor, current };
504-
}
505-
506-
Sci_Position start = (anchor < current) ? anchor : current;
507-
bool found;
508-
found = _Find(term, start, length, false, false, false);
509-
510-
if(found == false) {
511-
found = _Find(term, 0, start, false, false, false);
512-
}
513-
// nothing found
514-
if(found == false) {
515-
Set<Selection>(fSavedSelection);
516-
}
517-
}
518-
519-
520-
void
521-
Editor::IncrementalSearchCancel()
522-
{
523-
fIncrementalSearch = false;
524-
Set<Selection>(fSavedSelection);
525-
}
526-
527-
528-
/**
529-
* Ends incremental search mode and sets up internal state so "Find next" works
530-
* correctly.
531-
*/
532-
void
533-
Editor::IncrementalSearchCommit(std::string term)
534-
{
535-
fIncrementalSearch = false;
536-
fSearchLastMessage.MakeEmpty();
537-
fSearchLastMessage.AddBool("wrapAround", true);
538-
fSearchLastMessage.AddString("findText", term.c_str());
539-
}
540-
541-
542484
/**
543485
* Jumps to line maintaining distance from window edges - in other words swaps
544486
* the current line without changing caret position on the screen.

src/editor/Editor.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,6 @@ class Editor : public BScintillaView {
8383
bool regex = false);
8484
void ReplaceAndFind();
8585
void ResetFindReplace();
86-
void IncrementalSearch(std::string term);
87-
void IncrementalSearchCancel();
88-
void IncrementalSearchCommit(std::string term);
8986

9087
void UpdateLineNumberWidth();
9188

@@ -143,8 +140,6 @@ class Editor : public BScintillaView {
143140
int fSearchLastFlags;
144141
bool fNewSearch;
145142
BMessage fSearchLastMessage;
146-
bool fIncrementalSearch;
147-
Scintilla::Range fSavedSelection;
148143

149144
bool fNumberMarginEnabled;
150145
bool fFoldMarginEnabled;

src/editor/EditorWindow.cpp

Lines changed: 5 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -59,21 +59,9 @@ const float kWindowStagger = 17.0f;
5959
Preferences* EditorWindow::fPreferences = nullptr;
6060

6161

62-
namespace {
63-
enum {
64-
INCREMENTAL_SEARCH_CHAR = 'incs',
65-
INCREMENTAL_SEARCH_BACKSPACE = 'incb',
66-
INCREMENTAL_SEARCH_CANCEL = 'ince',
67-
INCREMENTAL_SEARCH_COMMIT = 'incc'
68-
};
69-
}
70-
71-
7262
EditorWindow::EditorWindow(bool stagger)
7363
:
74-
BWindow(fPreferences->fWindowRect, gAppName, B_DOCUMENT_WINDOW, 0),
75-
fIncrementalSearchTerm(""),
76-
fIncrementalSearchFilter(new BMessageFilter(B_KEY_DOWN, _IncrementalSearchFilter))
64+
BWindow(fPreferences->fWindowRect, gAppName, B_DOCUMENT_WINDOW, 0)
7765
{
7866
fActivatedGuard = false;
7967

@@ -271,9 +259,9 @@ EditorWindow::EditorWindow(bool stagger)
271259

272260
EditorWindow::~EditorWindow()
273261
{
274-
delete fFindReplaceHandler;
262+
RemoveCommonFilter(fFindReplaceHandler->IncrementalSearchFilter());
275263

276-
RemoveCommonFilter(fIncrementalSearchFilter.get());
264+
delete fFindReplaceHandler;
277265
}
278266

279267

@@ -498,27 +486,6 @@ EditorWindow::MessageReceived(BMessage* message)
498486
}
499487

500488
switch(message->what) {
501-
case INCREMENTAL_SEARCH_CHAR: {
502-
const char* character = message->GetString("character", "");
503-
fIncrementalSearchTerm.append(character);
504-
fEditor->IncrementalSearch(fIncrementalSearchTerm);
505-
} break;
506-
case INCREMENTAL_SEARCH_BACKSPACE: {
507-
if(!fIncrementalSearchTerm.empty()) {
508-
fIncrementalSearchTerm.pop_back();
509-
fEditor->IncrementalSearch(fIncrementalSearchTerm);
510-
}
511-
} break;
512-
case INCREMENTAL_SEARCH_CANCEL: {
513-
fEditor->IncrementalSearchCancel();
514-
fIncrementalSearchTerm = "";
515-
RemoveCommonFilter(fIncrementalSearchFilter.get());
516-
} break;
517-
case INCREMENTAL_SEARCH_COMMIT: {
518-
fEditor->IncrementalSearchCommit(fIncrementalSearchTerm);
519-
fIncrementalSearchTerm = "";
520-
RemoveCommonFilter(fIncrementalSearchFilter.get());
521-
} break;
522489
case SAVE_FILE: {
523490
_Save();
524491
message->SendReply((uint32) B_OK);
@@ -614,8 +581,8 @@ EditorWindow::MessageReceived(BMessage* message)
614581
fEditor->ReplaceAndFind();
615582
} break;
616583
case MAINMENU_SEARCH_INCREMENTAL: {
617-
RemoveCommonFilter(fIncrementalSearchFilter.get());
618-
AddCommonFilter(fIncrementalSearchFilter.get());
584+
RemoveCommonFilter(fFindReplaceHandler->IncrementalSearchFilter());
585+
AddCommonFilter(fFindReplaceHandler->IncrementalSearchFilter());
619586
} break;
620587
case MAINMENU_SEARCH_BOOKMARKS: {
621588
if(fBookmarksWindow == nullptr) {
@@ -1368,28 +1335,3 @@ EditorWindow::OnSavePoint(bool left)
13681335
fToolbar->SetActionEnabled(MAINMENU_FILE_RELOAD, fModified);
13691336
fToolbar->SetActionEnabled(MAINMENU_FILE_SAVE, fModified);
13701337
}
1371-
1372-
1373-
filter_result
1374-
EditorWindow::_IncrementalSearchFilter(BMessage* message, BHandler** target,
1375-
BMessageFilter* messageFilter)
1376-
{
1377-
if(message->what == B_KEY_DOWN) {
1378-
BLooper *looper = messageFilter->Looper();
1379-
const char* bytes;
1380-
message->FindString("bytes", &bytes);
1381-
if(bytes[0] == B_RETURN) {
1382-
looper->PostMessage(INCREMENTAL_SEARCH_COMMIT);
1383-
} else if(bytes[0] == B_ESCAPE) {
1384-
looper->PostMessage(INCREMENTAL_SEARCH_CANCEL);
1385-
} else if(bytes[0] == B_BACKSPACE) {
1386-
looper->PostMessage(INCREMENTAL_SEARCH_BACKSPACE);
1387-
} else {
1388-
BMessage msg(INCREMENTAL_SEARCH_CHAR);
1389-
msg.AddString("character", &bytes[0]);
1390-
messageFilter->Looper()->PostMessage(&msg);
1391-
}
1392-
return B_SKIP_MESSAGE;
1393-
}
1394-
return B_DISPATCH_MESSAGE;
1395-
}

src/editor/EditorWindow.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,6 @@ class EditorWindow : public BWindow {
162162
static Preferences* fPreferences;
163163
FilePreferences fFilePreferences;
164164

165-
std::string fIncrementalSearchTerm;
166-
std::unique_ptr<BMessageFilter> fIncrementalSearchFilter;
167-
168165
void _PopulateOpenRecentMenu();
169166
void _PopulateLanguageMenu();
170167
void _ReloadFile(entry_ref* ref = nullptr);
@@ -180,9 +177,6 @@ class EditorWindow : public BWindow {
180177
void _OpenTerminal(const char* path);
181178

182179
void OnSavePoint(bool left);
183-
184-
static filter_result _IncrementalSearchFilter(BMessage* message,
185-
BHandler** target, BMessageFilter* messageFilter);
186180
};
187181

188182

src/editor/FindReplaceHandler.cpp

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66

77
#include "FindReplaceHandler.h"
88

9+
#include <Looper.h>
910
#include <Message.h>
11+
#include <MessageFilter.h>
1012
#include <Messenger.h>
1113
#include <ScintillaView.h>
1214

@@ -25,6 +27,13 @@ FindReplaceHandler::FindReplaceHandler(BScintillaView* editor,
2527
fSearchLast(""),
2628
fSearchLastFlags(0)
2729
{
30+
fIncrementalSearchFilter = new IncrementalSearchMessageFilter(this);
31+
}
32+
33+
34+
FindReplaceHandler::~FindReplaceHandler()
35+
{
36+
delete fIncrementalSearchFilter;
2837
}
2938

3039

@@ -38,6 +47,26 @@ FindReplaceHandler::MessageReceived(BMessage* message)
3847
const int length = fEditor->SendMessage(SCI_GETLENGTH);
3948
const Sci_Position anchor = fEditor->SendMessage(SCI_GETANCHOR);
4049
const Sci_Position current = fEditor->SendMessage(SCI_GETCURRENTPOS);
50+
51+
const auto incrementalSearch = [&]() {
52+
if(fIncrementalSearch == false) {
53+
fIncrementalSearch = true;
54+
fSavedSelection = { anchor, current };
55+
}
56+
Sci_Position start = std::min(anchor, current);
57+
Sci_Position pos = _Find(fIncrementalSearchTerm, start, length, false, false, false);
58+
59+
if(pos == -1) {
60+
pos = _Find(fIncrementalSearchTerm, 0, start, false, false, false);
61+
}
62+
63+
if(pos == -1) {
64+
Set<Selection>(fSavedSelection);
65+
} else {
66+
Set<Selection>(Get<SearchTarget>());
67+
}
68+
};
69+
4170
switch(message->what) {
4271
case REPLACEFIND:
4372
// fallthrough
@@ -144,10 +173,68 @@ FindReplaceHandler::MessageReceived(BMessage* message)
144173
message->SendReply(&reply, fReplyHandler);
145174
}
146175
} break;
176+
case INCREMENTAL_SEARCH_CHAR: {
177+
const char* character = message->GetString("character", "");
178+
fIncrementalSearchTerm.append(character);
179+
incrementalSearch();
180+
} break;
181+
case INCREMENTAL_SEARCH_BACKSPACE: {
182+
if(!fIncrementalSearchTerm.empty()) {
183+
fIncrementalSearchTerm.pop_back();
184+
incrementalSearch();
185+
}
186+
} break;
187+
case INCREMENTAL_SEARCH_CANCEL: {
188+
fIncrementalSearch = false;
189+
fIncrementalSearchTerm = "";
190+
Set<Selection>(fSavedSelection);
191+
Looper()->RemoveCommonFilter(fIncrementalSearchFilter);
192+
} break;
193+
case INCREMENTAL_SEARCH_COMMIT: {
194+
fIncrementalSearch = false;
195+
search_info si = {};
196+
si.wrapAround = true;
197+
si.find = fIncrementalSearchTerm;
198+
fIncrementalSearchTerm = "";
199+
Looper()->RemoveCommonFilter(fIncrementalSearchFilter);
200+
} break;
201+
}
202+
}
203+
204+
205+
FindReplaceHandler::IncrementalSearchMessageFilter::IncrementalSearchMessageFilter(BHandler* handler)
206+
:
207+
BMessageFilter(B_KEY_DOWN),
208+
fHandler(handler)
209+
{
210+
}
211+
212+
213+
filter_result
214+
FindReplaceHandler::IncrementalSearchMessageFilter::Filter(BMessage* message, BHandler** target)
215+
{
216+
if(message->what == B_KEY_DOWN) {
217+
BLooper *looper = Looper();
218+
const char* bytes;
219+
message->FindString("bytes", &bytes);
220+
if(bytes[0] == B_RETURN) {
221+
looper->PostMessage(INCREMENTAL_SEARCH_COMMIT, fHandler);
222+
} else if(bytes[0] == B_ESCAPE) {
223+
looper->PostMessage(INCREMENTAL_SEARCH_CANCEL, fHandler);
224+
} else if(bytes[0] == B_BACKSPACE) {
225+
looper->PostMessage(INCREMENTAL_SEARCH_BACKSPACE, fHandler);
226+
} else {
227+
BMessage msg(INCREMENTAL_SEARCH_CHAR);
228+
msg.AddString("character", &bytes[0]);
229+
Looper()->PostMessage(&msg, fHandler);
230+
}
231+
return B_SKIP_MESSAGE;
147232
}
233+
return B_DISPATCH_MESSAGE;
148234
}
149235

150236

237+
151238
Sci_Position
152239
FindReplaceHandler::_Find(std::string search, Sci_Position start,
153240
Sci_Position end, bool matchCase, bool matchWord, bool regex)

src/editor/FindReplaceHandler.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include <Handler.h>
1212
#include <Message.h>
13+
#include <MessageFilter.h>
1314

1415
#include "ScintillaUtils.h"
1516

@@ -27,9 +28,30 @@ class FindReplaceHandler : public BHandler {
2728
};
2829
FindReplaceHandler(BScintillaView* editor,
2930
BHandler* replyHandler = nullptr);
31+
~FindReplaceHandler();
3032
virtual void MessageReceived(BMessage* message);
3133

34+
BMessageFilter* IncrementalSearchFilter() const { return fIncrementalSearchFilter; }
35+
3236
private:
37+
enum {
38+
INCREMENTAL_SEARCH_CHAR = 'incs',
39+
INCREMENTAL_SEARCH_BACKSPACE = 'incb',
40+
INCREMENTAL_SEARCH_CANCEL = 'ince',
41+
INCREMENTAL_SEARCH_COMMIT = 'incc'
42+
};
43+
44+
class IncrementalSearchMessageFilter : public BMessageFilter
45+
{
46+
public:
47+
IncrementalSearchMessageFilter(BHandler* handler);
48+
49+
virtual filter_result Filter(BMessage* message, BHandler** target);
50+
51+
private:
52+
BHandler *fHandler;
53+
};
54+
3355
struct search_info {
3456
bool inSelection : 1;
3557
bool matchCase : 1;
@@ -73,8 +95,11 @@ class FindReplaceHandler : public BHandler {
7395
int fSearchLastFlags;
7496
bool fNewSearch;
7597
search_info fSearchLastInfo;
98+
7699
bool fIncrementalSearch;
100+
std::string fIncrementalSearchTerm;
77101
Scintilla::Range fSavedSelection;
102+
BMessageFilter* fIncrementalSearchFilter;
78103
};
79104

80105

0 commit comments

Comments
 (0)