@@ -855,7 +855,7 @@ bool TextEditInput::edit(int key, int screenWidth, int charWidth) {
855855bool TextEditInput::find (const char *word, bool next) {
856856 bool result = false ;
857857 bool allUpper = true ;
858- int len = strlen (word);
858+ int len = word == NULL ? 0 : strlen (word);
859859 for (int i = 0 ; i < len; i++) {
860860 if (islower (word[i])) {
861861 allUpper = false ;
@@ -1569,13 +1569,17 @@ char *TextEditInput::getWordBeforeCursor() {
15691569 return result;
15701570}
15711571
1572- bool TextEditInput::replaceNext (const char *buffer) {
1572+ bool TextEditInput::replaceNext (const char *buffer, bool skip ) {
15731573 bool changed = false ;
15741574 if (_state.select_start != _state.select_end &&
15751575 _buf._buffer != NULL && buffer != NULL ) {
15761576 int start, end;
15771577 char *selection = getSelection (&start, &end);
1578- stb_textedit_paste (&_buf, &_state, buffer, strlen (buffer));
1578+ if (!skip) {
1579+ stb_textedit_paste (&_buf, &_state, buffer, strlen (buffer));
1580+ } else {
1581+ _state.cursor ++;
1582+ }
15791583 changed = find (selection, false );
15801584 free (selection);
15811585 }
@@ -1867,24 +1871,37 @@ bool TextEditHelpWidget::edit(int key, int screenWidth, int charWidth) {
18671871 result = TextEditInput::edit (key, screenWidth, charWidth);
18681872 _editor->find (_buf._buffer , key == SB_KEY_ENTER);
18691873 break ;
1870- case kSearchReplace :
1874+ case kEnterReplace :
18711875 result = TextEditInput::edit (key, screenWidth, charWidth);
18721876 if (key == SB_KEY_ENTER) {
18731877 _buf.clear ();
1874- _mode = kReplace ;
1878+ _mode = kEnterReplaceWith ;
18751879 } else {
18761880 _editor->find (_buf._buffer , false );
18771881 }
18781882 break ;
1879- case kReplace :
1883+ case kEnterReplaceWith :
18801884 if (key == SB_KEY_ENTER) {
1881- if (!_editor->replaceNext (_buf._buffer )) {
1882- _mode = kReplaceDone ;
1883- }
1885+ _mode = kReplace ;
18841886 } else {
18851887 result = TextEditInput::edit (key, screenWidth, charWidth);
18861888 }
18871889 break ;
1890+ case kReplace :
1891+ switch (key) {
1892+ case SB_KEY_ENTER:
1893+ if (!_editor->replaceNext (_buf._buffer , false )) {
1894+ _mode = kReplaceDone ;
1895+ }
1896+ break ;
1897+ case ' ' :
1898+ if (!_editor->replaceNext (_buf._buffer , true )) {
1899+ // skip to next
1900+ _mode = kReplaceDone ;
1901+ }
1902+ break ;
1903+ }
1904+ break ;
18881905 case kGotoLine :
18891906 result = TextEditInput::edit (key, screenWidth, charWidth);
18901907 if (key == SB_KEY_ENTER) {
@@ -2150,7 +2167,7 @@ void TextEditHelpWidget::createOutline() {
21502167
21512168void TextEditHelpWidget::createSearch (bool replace) {
21522169 if (_mode != kSearch ) {
2153- reset (replace ? kSearchReplace : kSearch );
2170+ reset (replace ? kEnterReplace : kSearch );
21542171 }
21552172
21562173 char *text = _editor->getTextSelection (false );
@@ -2189,8 +2206,8 @@ void TextEditHelpWidget::createStackTrace(const char *error, int line, StackTrac
21892206void TextEditHelpWidget::paste (const char *text) {
21902207 switch (_mode) {
21912208 case kSearch :
2192- case kSearchReplace :
2193- case kReplace :
2209+ case kEnterReplace :
2210+ case kEnterReplaceWith :
21942211 case kLineEdit :
21952212 TextEditInput::paste (text);
21962213 break ;
0 commit comments