aboutsummaryrefslogtreecommitdiff
path: root/src/textview.c
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-02-04 08:35:17 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-02-04 08:35:17 +0000
commit6e3390d6104c8de11448741242641d1bcb0a85f5 (patch)
tree26f9724bda324dd17c563afc4df8e1c9e0a0ff2c /src/textview.c
parentf5a3ca3e0ac9785f556ce22fea4f78dd9ab3c7fc (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.c82
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)