aboutsummaryrefslogtreecommitdiff
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
parentf5a3ca3e0ac9785f556ce22fea4f78dd9ab3c7fc (diff)
reimplemented message text search.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@90 ee746299-78ed-0310-b773-934348b2243d
-rw-r--r--ChangeLog5
-rw-r--r--ChangeLog.ja5
-rw-r--r--configure.in2
-rw-r--r--src/gtkutils.c35
-rw-r--r--src/gtkutils.h4
-rw-r--r--src/textview.c82
6 files changed, 93 insertions, 40 deletions
diff --git a/ChangeLog b/ChangeLog
index 2feceb9d..fe2e074d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2005-02-04
+ * src/textview.c
+ src/gtkutils.[ch]: reimplemented message text search.
+
+2005-02-04
+
* src/gtkutils.[ch]: gtkut_widget_set_small_font_size(): new.
* src/prefs_account.c
src/prefs_common.c: made the font size of supplementary
diff --git a/ChangeLog.ja b/ChangeLog.ja
index 3af6a9c7..59bc530a 100644
--- a/ChangeLog.ja
+++ b/ChangeLog.ja
@@ -1,5 +1,10 @@
2005-02-04
+ * src/textview.c
+ src/gtkutils.[ch]: メッセージテキスト検索を再実装。
+
+2005-02-04
+
* src/gtkutils.[ch]: gtkut_widget_set_small_font_size(): 新規。
* src/prefs_account.c
src/prefs_common.c: 補足説明のフォントサイズを小さくし、
diff --git a/configure.in b/configure.in
index 6470e040..8bde23ce 100644
--- a/configure.in
+++ b/configure.in
@@ -9,7 +9,7 @@ MINOR_VERSION=9
MICRO_VERSION=1
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=
+EXTRA_VERSION=+svn
VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION
dnl set $target
diff --git a/src/gtkutils.c b/src/gtkutils.c
index 25fe87c7..81d07b61 100644
--- a/src/gtkutils.c
+++ b/src/gtkutils.c
@@ -530,7 +530,7 @@ gboolean gtkut_text_buffer_match_string(GtkTextBuffer *textbuf, gint pos,
return FALSE;
}
- for (; match_count < len; pos++, match_count++) {
+ for (; match_count < len; match_count++) {
gchar *ptr;
gunichar ch;
@@ -628,6 +628,39 @@ guint gtkut_text_buffer_str_compare(GtkTextBuffer *textbuf,
return result ? len : 0;
}
+gint gtkut_text_buffer_find(GtkTextBuffer *buffer, guint start_pos,
+ const gchar *str, gboolean case_sens)
+{
+ gint pos;
+ gunichar *wcs;
+ gint len;
+ glong items_read = 0, items_written = 0;
+ GError *error = NULL;
+ GtkTextIter iter;
+ gint found_pos = -1;
+
+ 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 (!wcs || items_written <= 0) return -1;
+ len = (gint)items_written;
+
+ gtk_text_buffer_get_iter_at_offset(buffer, &iter, start_pos);
+ do {
+ pos = gtk_text_iter_get_offset(&iter);
+ if (gtkut_text_buffer_match_string
+ (buffer, pos, wcs, len, case_sens) == TRUE) {
+ found_pos = pos;
+ break;
+ }
+ } while (gtk_text_iter_forward_char(&iter));
+
+ g_free(wcs);
+ return found_pos;
+}
+
gboolean gtkut_text_buffer_is_uri_string(GtkTextBuffer *textbuf,
guint start_pos, guint text_len)
{
diff --git a/src/gtkutils.h b/src/gtkutils.h
index 75c125d9..2b5fd1c7 100644
--- a/src/gtkutils.h
+++ b/src/gtkutils.h
@@ -156,6 +156,10 @@ guint gtkut_text_buffer_str_compare (GtkTextBuffer *text,
guint start_pos,
guint text_len,
const gchar *str);
+gint gtkut_text_buffer_find (GtkTextBuffer *text,
+ guint start_pos,
+ const gchar *str,
+ gboolean case_sens);
gboolean gtkut_text_buffer_is_uri_string(GtkTextBuffer *text,
guint start_pos,
guint text_len);
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)