diff options
Diffstat (limited to 'interface.c')
-rw-r--r-- | interface.c | 108 |
1 files changed, 75 insertions, 33 deletions
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); + } } } + |