diff options
author | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-02-04 08:35:17 +0000 |
---|---|---|
committer | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-02-04 08:35:17 +0000 |
commit | 6e3390d6104c8de11448741242641d1bcb0a85f5 (patch) | |
tree | 26f9724bda324dd17c563afc4df8e1c9e0a0ff2c /src/textview.c | |
parent | f5a3ca3e0ac9785f556ce22fea4f78dd9ab3c7fc (diff) |
reimplemented message text search.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@90 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src/textview.c')
-rw-r--r-- | src/textview.c | 82 |
1 files changed, 44 insertions, 38 deletions
diff --git a/src/textview.c b/src/textview.c index f2dc7597..82b5ba09 100644 --- a/src/textview.c +++ b/src/textview.c @@ -1202,75 +1202,81 @@ static void textview_show_header(TextView *textview, GPtrArray *headers) gboolean textview_search_string(TextView *textview, const gchar *str, gboolean case_sens) { -#warning FIXME_GTK2 -#if 0 - GtkSText *text = GTK_STEXT(textview->text); + GtkTextView *text = GTK_TEXT_VIEW(textview->text); + GtkTextBuffer *buffer; + GtkTextIter iter, end_iter; + GtkTextMark *mark; gint pos; gint len; g_return_val_if_fail(str != NULL, FALSE); - len = get_mbs_len(str); + buffer = gtk_text_view_get_buffer(text); + + len = g_utf8_strlen(str, -1); g_return_val_if_fail(len >= 0, FALSE); - pos = textview->cur_pos; - if (pos < textview->body_pos) - pos = textview->body_pos; + mark = gtk_text_buffer_get_insert(buffer); + gtk_text_buffer_get_iter_at_mark(buffer, &iter, mark); + pos = gtk_text_iter_get_offset(&iter); - if ((pos = gtkut_stext_find(text, pos, str, case_sens)) != -1) { - gtk_editable_set_position(GTK_EDITABLE(text), pos + len); - gtk_editable_select_region(GTK_EDITABLE(text), pos, pos + len); - textview_set_position(textview, pos + len); + if ((pos = gtkut_text_buffer_find(buffer, pos, str, case_sens)) != -1) { + gtk_text_buffer_get_iter_at_offset(buffer, &end_iter, pos); + gtk_text_buffer_get_iter_at_offset(buffer, &iter, pos + len); + gtk_text_buffer_select_range(buffer, &iter, &end_iter); + gtk_text_view_scroll_to_mark(text, mark, 0.0, FALSE, 0.0, 0.0); return TRUE; } -#endif return FALSE; } gboolean textview_search_string_backward(TextView *textview, const gchar *str, gboolean case_sens) { -#warning FIXME_GTK2 -#if 0 - GtkSText *text = GTK_STEXT(textview->text); + GtkTextView *text = GTK_TEXT_VIEW(textview->text); + GtkTextBuffer *buffer; + GtkTextIter iter, end_iter; + GtkTextMark *mark; gint pos; - wchar_t *wcs; + gunichar *wcs; gint len; - gint text_len; + glong items_read = 0, items_written = 0; + GError *error = NULL; gboolean found = FALSE; g_return_val_if_fail(str != NULL, FALSE); - wcs = strdup_mbstowcs(str); - g_return_val_if_fail(wcs != NULL, FALSE); - len = wcslen(wcs); - pos = textview->cur_pos; - text_len = gtk_stext_get_length(text); - if (text_len - textview->body_pos < len) { - g_free(wcs); - return FALSE; + buffer = gtk_text_view_get_buffer(text); + + wcs = g_utf8_to_ucs4(str, -1, &items_read, &items_written, &error); + if (error != NULL) { + g_warning("An error occured while converting a string from UTF-8 to UCS-4: %s\n", error->message); + g_error_free(error); } - if (pos <= textview->body_pos || text_len - pos < len) - pos = text_len - len; - - for (; pos >= textview->body_pos; pos--) { - if (gtkut_stext_match_string(text, pos, wcs, len, case_sens) - == TRUE) { - gtk_editable_set_position(GTK_EDITABLE(text), pos); - gtk_editable_select_region(GTK_EDITABLE(text), - pos, pos + len); - textview_set_position(textview, pos - 1); + if (!wcs || items_written <= 0) return FALSE; + len = (gint)items_written; + + mark = gtk_text_buffer_get_insert(buffer); + gtk_text_buffer_get_iter_at_mark(buffer, &iter, mark); + + while (gtk_text_iter_backward_char(&iter)) { + pos = gtk_text_iter_get_offset(&iter); + if (gtkut_text_buffer_match_string + (buffer, pos, wcs, len, case_sens) == TRUE) { + gtk_text_buffer_get_iter_at_offset(buffer, &iter, pos); + gtk_text_buffer_get_iter_at_offset + (buffer, &end_iter, pos + len); + gtk_text_buffer_select_range(buffer, &iter, &end_iter); + gtk_text_view_scroll_to_mark + (text, mark, 0.0, FALSE, 0.0, 0.0); found = TRUE; break; } - if (pos == textview->body_pos) break; } g_free(wcs); return found; -#endif - return FALSE; } void textview_scroll_one_line(TextView *textview, gboolean up) |