summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorb0ric <b0risov.alexandr@rambler.ru>2009-08-07 17:15:47 +0300
committerb0ric <b0risov.alexandr@rambler.ru>2009-08-07 17:15:47 +0300
commit88db5cdceabf042f5e5d5695bf984900f8396225 (patch)
treea5b53bc578a5621d0e62f5d17ffb22c2d0e964d8
parent180da16f3c1592d1515de2e647144a37cc23c1b9 (diff)
Search bug fix
-rw-r--r--callbacks.c4
-rw-r--r--interface.c108
-rw-r--r--interface.h4
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*/