Revision: 909 http://svn.sourceforge.net/geany/?rev=909&view=rev Author: ntrel Date: 2006-10-21 03:50:45 -0700 (Sat, 21 Oct 2006)
Log Message: ----------- Make search bar automatically wraparound if necessary. Detect when Find has searched all text and display a 'not found' message on the status bar.
Modified Paths: -------------- trunk/ChangeLog trunk/src/document.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2006-10-20 16:40:12 UTC (rev 908) +++ trunk/ChangeLog 2006-10-21 10:50:45 UTC (rev 909) @@ -1,3 +1,11 @@ +2006-10-21 Nick Treleaven nick.treleaven@btinternet.com + + * src/document.c: + Make search bar automatically wraparound if necessary. + Detect when Find has searched all text and display a 'not found' + message on the status bar. + + 2006-10-20 Nick Treleaven nick.treleaven@btinternet.com
* src/interface.c, src/main.c, geany.glade:
Modified: trunk/src/document.c =================================================================== --- trunk/src/document.c 2006-10-20 16:40:12 UTC (rev 908) +++ trunk/src/document.c 2006-10-21 10:50:45 UTC (rev 909) @@ -861,43 +861,49 @@ }
-#define SEARCH_NOT_FOUND_TXT _("The document has been searched completely but the match "%s" was not found. Wrap search around the document?") - /* special search function, used from the find entry in the toolbar */ -void document_find_next(gint idx, const gchar *text, gint flags, gboolean find_button, gboolean inc) +void document_find_next(gint idx, const gchar *text, gint flags, gboolean find_button, + gboolean inc) { - gint selection_end, search_pos; + gint start_pos, search_pos; + struct TextToFind ttf;
g_return_if_fail(text != NULL); - if (idx == -1 || ! *text) return; + if (! DOC_IDX_VALID(idx) || ! *text) return;
- selection_end = sci_get_selection_end(doc_list[idx].sci); - if (!inc && sci_can_copy(doc_list[idx].sci)) - { // there's a selection so go to the end - sci_goto_pos(doc_list[idx].sci, selection_end, TRUE); + start_pos = (inc) ? sci_get_selection_start(doc_list[idx].sci) : + sci_get_selection_end(doc_list[idx].sci); // equal if no selection + + // search cursor to end + ttf.chrg.cpMin = start_pos; + ttf.chrg.cpMax = sci_get_length(doc_list[idx].sci); + ttf.lpstrText = (gchar *)text; + search_pos = sci_find_text(doc_list[idx].sci, flags, &ttf); + + // if no match, search start to cursor + if (search_pos == -1) + { + ttf.chrg.cpMin = 0; + ttf.chrg.cpMax = start_pos + strlen(text); + search_pos = sci_find_text(doc_list[idx].sci, flags, &ttf); }
- sci_set_search_anchor(doc_list[idx].sci); - search_pos = sci_search_next(doc_list[idx].sci, flags, text); if (search_pos != -1) { + sci_set_selection_start(doc_list[idx].sci, ttf.chrgText.cpMin); + sci_set_selection_end(doc_list[idx].sci, ttf.chrgText.cpMax); sci_scroll_caret(doc_list[idx].sci); } else { if (find_button) { - if (dialogs_show_question(SEARCH_NOT_FOUND_TXT, text)) - { - sci_goto_pos(doc_list[idx].sci, 0, FALSE); - document_find_next(idx, text, flags, TRUE, inc); - } + gchar *msg = g_strdup_printf(_(""%s" was not found."), text); + ui_set_statusbar(msg, FALSE); + g_free(msg); } - else - { - utils_beep(); - sci_goto_pos(doc_list[idx].sci, 0, FALSE); - } + utils_beep(); + sci_goto_pos(doc_list[idx].sci, start_pos, FALSE); // clear selection } }
@@ -936,11 +942,31 @@ } else { - if (dialogs_show_question(SEARCH_NOT_FOUND_TXT, text)) + gint sci_len = sci_get_length(doc_list[idx].sci); + + // if we just searched the whole text, give up searching. + if ((selection_end == 0 && ! search_backwards) || + (selection_end == sci_len && search_backwards)) { - sci_goto_pos(doc_list[idx].sci, (search_backwards) ? sci_get_length(doc_list[idx].sci) : 0, TRUE); - return document_find_text(idx, text, flags, search_backwards); + gchar *msg = g_strdup_printf(_(""%s" was not found."), text); + ui_set_statusbar(msg, FALSE); + g_free(msg); + utils_beep(); + return -1; } + + // we searched only part of the document, so ask whether to wraparound. + if (dialogs_show_question_full(GTK_STOCK_FIND, GTK_STOCK_CANCEL, + _("Wrap search and find again?"), + _(""%s" was not found."), text)) + { + gint ret; + sci_goto_pos(doc_list[idx].sci, (search_backwards) ? sci_len : 0, TRUE); + ret = document_find_text(idx, text, flags, search_backwards); + if (ret == -1) // return to original cursor position if not found + sci_goto_pos(doc_list[idx].sci, selection_end, FALSE); + return ret; + } } return search_pos; }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.