diff options
author | b0ric <b0risov.alexandr@rambler.ru> | 2009-08-07 17:15:47 +0300 |
---|---|---|
committer | b0ric <b0risov.alexandr@rambler.ru> | 2009-08-07 17:15:47 +0300 |
commit | 88db5cdceabf042f5e5d5695bf984900f8396225 (patch) | |
tree | a5b53bc578a5621d0e62f5d17ffb22c2d0e964d8 | |
parent | 180da16f3c1592d1515de2e647144a37cc23c1b9 (diff) |
Search bug fix
-rw-r--r-- | callbacks.c | 4 | ||||
-rw-r--r-- | interface.c | 108 | ||||
-rw-r--r-- | interface.h | 4 |
3 files changed, 81 insertions, 35 deletions
diff --git a/callbacks.c b/callbacks.c index a2f94f8..89325f7 100644 --- a/callbacks.c +++ b/callbacks.c @@ -149,7 +149,7 @@ void find_next_btn_click(GtkWidget *widget, gpointer entry) const gchar *find_text = NULL; find_text = gtk_entry_get_text(GTK_ENTRY(entry)); - find_next(find_text); + find_other(find_text, SEARCH_FORWARD); } void find_prev_btn_click(GtkWidget *widget, gpointer entry) @@ -157,7 +157,7 @@ void find_prev_btn_click(GtkWidget *widget, gpointer entry) const gchar *find_text = NULL; find_text = gtk_entry_get_text(GTK_ENTRY(entry)); - find_prev(find_text); + find_other(find_text, SEARCH_BACKWARD); } void clear_btn_click(GtkWidget *widget, gpointer find_entry) diff --git a/interface.c b/interface.c index e44ed96..ef0b732 100644 --- a/interface.c +++ b/interface.c @@ -16,6 +16,9 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <stdlib.h> +#include <string.h> +#include <ctype.h> #include "interface.h" #include "callbacks.h" #include "word.h" @@ -31,6 +34,9 @@ static GtkWidget *clear_btn; static GtkWidget *statusbar; static int current_highlighted_end; static int current_highlighted_start; +static gboolean gtk_text_iter_search_word(const GtkTextIter *, const gchar *str, + GtkTextSearchFlags, GtkTextIter *, + GtkTextIter *, const GtkTextIter *, int); void create_main_window() { @@ -239,18 +245,18 @@ void search_sentences(const gchar *word) gtk_text_buffer_get_end_iter(buffer, &find_end); gtk_text_buffer_remove_tag_by_name(buffer, "green-bg", &find_start, &find_end); gtk_text_buffer_remove_tag_by_name(buffer, "yellow-bg", &find_start, &find_end); - while (gtk_text_iter_forward_search(&find_start, word, GTK_TEXT_SEARCH_TEXT_ONLY| + while (gtk_text_iter_search_word(&find_start, word, GTK_TEXT_SEARCH_TEXT_ONLY| GTK_TEXT_SEARCH_VISIBLE_ONLY, &match_start, - &match_end, NULL)) { + &match_end, NULL, SEARCH_FORWARD)) { gtk_text_buffer_apply_tag_by_name(buffer, "yellow-bg", &match_start, &match_end); offset = gtk_text_iter_get_offset(&match_end); gtk_text_buffer_get_iter_at_offset(buffer, &find_start, offset); } gtk_text_buffer_get_start_iter(buffer, &find_start); gtk_text_buffer_get_end_iter(buffer, &find_end); - if (gtk_text_iter_forward_search(&find_start, word, GTK_TEXT_SEARCH_TEXT_ONLY| + if (gtk_text_iter_search_word(&find_start, word, GTK_TEXT_SEARCH_TEXT_ONLY| GTK_TEXT_SEARCH_VISIBLE_ONLY, &match_start, - &match_end, NULL)) { + &match_end, NULL, SEARCH_FORWARD)) { gtk_text_buffer_apply_tag_by_name(buffer, "green-bg", &match_start, &match_end); current_highlighted_end = gtk_text_iter_get_offset(&match_end); current_highlighted_start = gtk_text_iter_get_offset(&match_start); @@ -288,33 +294,58 @@ void clear_search_tags() gtk_text_buffer_remove_tag_by_name(buffer, "green-bg", &find_start, &find_end); } -void find_next(const gchar *word) +/* We won't need this abomination if GTK developers implement + * SEARCH_CASE_INSENSITIVE flag in GtkTextSearchFlags struct + * which is in their TODO list + */ +gboolean gtk_text_iter_search_word(const GtkTextIter *iter, const gchar *str, + GtkTextSearchFlags flags, GtkTextIter *match_start, + GtkTextIter *match_end, const GtkTextIter *limit, + const int direction) { - GtkTextBuffer *buffer; - GtkTextIter find_start, find_end; - GtkTextIter match_start, match_end; - - - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sentences_text)); - gtk_text_buffer_get_start_iter(buffer, &find_start); - gtk_text_buffer_get_end_iter(buffer, &find_end); - gtk_text_buffer_remove_tag_by_name(buffer, "green-bg", &find_start, &find_end); - gtk_text_buffer_get_iter_at_offset(buffer, &find_start, current_highlighted_end); - if (gtk_text_iter_forward_search(&find_start, word, GTK_TEXT_SEARCH_TEXT_ONLY| - GTK_TEXT_SEARCH_VISIBLE_ONLY, &match_start, - &match_end, NULL)) { - gtk_text_buffer_apply_tag_by_name(buffer, "green-bg", &match_start, &match_end); - current_highlighted_start = gtk_text_iter_get_offset(&match_start); - current_highlighted_end = gtk_text_iter_get_offset(&match_end); - gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(sentences_text), &match_start, 0.0, TRUE, 0.5, 0.5); - } else { - gtk_text_buffer_get_end_iter(buffer, &find_end); - current_highlighted_start = gtk_text_iter_get_offset(&find_end); - current_highlighted_end = gtk_text_iter_get_offset(&find_end); + GtkTextIter match_start_wcap, match_end_wcap; + gboolean result = FALSE; + int offset, offset_wcap; + gchar *str_wcap; + + str_wcap = malloc((strlen(str)+1)*sizeof(gchar)); + strcpy(str_wcap, str); + /* We've lowered only first letter, so there are only two variants*/ + *str_wcap = toupper(*str_wcap); + if (direction == SEARCH_FORWARD) { + if (gtk_text_iter_forward_search(iter, str, flags, match_start, match_end, limit)) + offset = gtk_text_iter_get_offset(match_start); + else + offset = -1; + if (gtk_text_iter_forward_search(iter, str_wcap, flags, &match_start_wcap, &match_end_wcap, limit)) + offset_wcap = gtk_text_iter_get_offset(&match_start_wcap); + else + offset_wcap = -1; + if (((offset_wcap < offset)||(offset == -1))&&(offset_wcap != -1)) { + *match_start = match_start_wcap; + *match_end = match_end_wcap; + } + } else if (direction == SEARCH_BACKWARD) { + if (gtk_text_iter_backward_search(iter, str, flags, match_start, match_end, limit)) + offset = gtk_text_iter_get_offset(match_start); + else + offset = -1; + if (gtk_text_iter_backward_search(iter, str_wcap, flags, &match_start_wcap, &match_end_wcap, limit)) + offset_wcap = gtk_text_iter_get_offset(&match_start_wcap); + else + offset_wcap = -1; + if (offset < offset_wcap) { + *match_start = match_start_wcap; + *match_end = match_end_wcap; + } } + free(str_wcap); + if ((offset_wcap != -1)||(offset != -1)) + result = TRUE; + return result; } -void find_prev(const gchar *word) +void find_other(const gchar *word, const int direction) { GtkTextBuffer *buffer; GtkTextIter find_start, find_end; @@ -324,18 +355,29 @@ void find_prev(const gchar *word) gtk_text_buffer_get_start_iter(buffer, &find_start); gtk_text_buffer_get_end_iter(buffer, &find_end); gtk_text_buffer_remove_tag_by_name(buffer, "green-bg", &find_start, &find_end); - gtk_text_buffer_get_iter_at_offset(buffer, &find_end, current_highlighted_start); - if (gtk_text_iter_backward_search(&find_end, word, GTK_TEXT_SEARCH_TEXT_ONLY| + if (direction == SEARCH_FORWARD) { + gtk_text_buffer_get_iter_at_offset(buffer, &find_start, current_highlighted_end); + } else if (direction == SEARCH_BACKWARD) { + gtk_text_buffer_get_iter_at_offset(buffer, &find_start, current_highlighted_start); + } + if (gtk_text_iter_search_word(&find_start, word, GTK_TEXT_SEARCH_TEXT_ONLY| GTK_TEXT_SEARCH_VISIBLE_ONLY, &match_start, - &match_end, NULL)) { + &match_end, NULL, direction)) { gtk_text_buffer_apply_tag_by_name(buffer, "green-bg", &match_start, &match_end); current_highlighted_start = gtk_text_iter_get_offset(&match_start); current_highlighted_end = gtk_text_iter_get_offset(&match_end); gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(sentences_text), &match_start, 0.0, TRUE, 0.5, 0.5); } else { - gtk_text_buffer_get_start_iter(buffer, &find_start); - current_highlighted_start = gtk_text_iter_get_offset(&find_start); - current_highlighted_end = gtk_text_iter_get_offset(&find_start); + if (direction == SEARCH_FORWARD) { + gtk_text_buffer_get_end_iter(buffer, &find_end); + current_highlighted_start = gtk_text_iter_get_offset(&find_end); + current_highlighted_end = gtk_text_iter_get_offset(&find_end); + } else if (direction == SEARCH_BACKWARD) { + gtk_text_buffer_get_start_iter(buffer, &find_start); + current_highlighted_start = gtk_text_iter_get_offset(&find_start); + current_highlighted_end = gtk_text_iter_get_offset(&find_start); + } } } + diff --git a/interface.h b/interface.h index 2b444ea..6fc00aa 100644 --- a/interface.h +++ b/interface.h @@ -22,6 +22,9 @@ #include <gtk/gtk.h> #include "listview.h" +#define SEARCH_FORWARD 0 +#define SEARCH_BACKWARD 1 + GtkWidget *main_window; void create_main_window(); void add_sentence(char *); @@ -33,5 +36,6 @@ void set_find_text(gchar *); void clear_search_tags(); void find_next(const gchar *word); void find_prev(const gchar *word); +void find_other(const gchar *word, const int direction); #endif /*INTERFACE_H*/ |