diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | ChangeLog.ja | 5 | ||||
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | src/gtkutils.c | 35 | ||||
-rw-r--r-- | src/gtkutils.h | 4 | ||||
-rw-r--r-- | src/textview.c | 82 |
6 files changed, 93 insertions, 40 deletions
@@ -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) |