diff options
author | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-02-23 09:24:19 +0000 |
---|---|---|
committer | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-02-23 09:24:19 +0000 |
commit | 2cc9146cfb6ecee1257317bbee17987a78b22611 (patch) | |
tree | 9c94b9aca0c41def8c9391cab43f23f9bbbc75e8 | |
parent | e04f6d71cb0f782c82855677d9c3fbabf8b29f51 (diff) |
gtkutils.c: modified the find text API.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@123 ee746299-78ed-0310-b773-934348b2243d
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | ChangeLog.ja | 10 | ||||
-rw-r--r-- | src/gtkutils.c | 148 | ||||
-rw-r--r-- | src/gtkutils.h | 36 | ||||
-rw-r--r-- | src/textview.c | 55 |
5 files changed, 103 insertions, 156 deletions
@@ -1,5 +1,15 @@ 2005-02-23 + * src/gtkutils.[ch]: removed unused functions. + gtkut_text_buffer_match_string() + gtkut_text_buffer_find(): changed the API to use iterator. + gtkut_text_buffer_find_backward(): new. + * src/textview.c: + textview_search_string() + textview_search_string_backward(): use new API. + +2005-02-23 + * src/logwindow.c src/prefs_common.[ch]: re-enabled the line number limit, and made the value configurable. diff --git a/ChangeLog.ja b/ChangeLog.ja index 52e84167..b616b468 100644 --- a/ChangeLog.ja +++ b/ChangeLog.ja @@ -1,5 +1,15 @@ 2005-02-23 + * src/gtkutils.[ch]: 未使用の関数を削除。 + gtkut_text_buffer_match_string() + gtkut_text_buffer_find(): API を iterator を使用するように変更。 + gtkut_text_buffer_find_backward(): 新規。 + * src/textview.c: + textview_search_string() + textview_search_string_backward(): 新しい API を使用。 + +2005-02-23 + * src/logwindow.c src/prefs_common.[ch]: 行数制限を再度有効にし、値を設定可能にした。 diff --git a/src/gtkutils.c b/src/gtkutils.c index 158d1dfb..fc990a28 100644 --- a/src/gtkutils.c +++ b/src/gtkutils.c @@ -510,19 +510,20 @@ void gtkut_container_remove(GtkContainer *container, GtkWidget *widget) gtk_container_remove(container, widget); } -#warning FIXME_GTK2 -gboolean gtkut_text_buffer_match_string(GtkTextBuffer *textbuf, gint pos, +gboolean gtkut_text_buffer_match_string(GtkTextBuffer *textbuf, + const GtkTextIter *iter, gunichar *wcs, gint len, gboolean case_sens) { GtkTextIter start_iter, end_iter; - gchar *utf8str; - gint match_count = 0; + gchar *utf8str, *p; + gint match_count; - gtk_text_buffer_get_iter_at_offset(textbuf, &start_iter, pos); - gtk_text_buffer_get_iter_at_offset(textbuf, &end_iter, pos + len); + start_iter = end_iter = *iter; + gtk_text_iter_forward_chars(&end_iter, len); - utf8str = gtk_text_buffer_get_text(textbuf, &start_iter, &end_iter, FALSE); + utf8str = gtk_text_buffer_get_text(textbuf, &start_iter, &end_iter, + FALSE); if (!utf8str) return FALSE; if ((gint)g_utf8_strlen(utf8str, -1) != len) { @@ -530,19 +531,18 @@ gboolean gtkut_text_buffer_match_string(GtkTextBuffer *textbuf, gint pos, return FALSE; } - for (; match_count < len; match_count++) { - gchar *ptr; - gunichar ch; + for (p = utf8str, match_count = 0; + *p != '\0' && match_count < len; + p = g_utf8_next_char(p), match_count++) { + gunichar wc; - ptr = g_utf8_offset_to_pointer(utf8str, match_count); - if (!ptr) break; - ch = g_utf8_get_char(ptr); + wc = g_utf8_get_char(p); if (case_sens) { - if (ch != wcs[match_count]) + if (wc != wcs[match_count]) break; } else { - if (g_unichar_tolower(ch) != + if (g_unichar_tolower(wc) != g_unichar_tolower(wcs[match_count])) break; } @@ -556,125 +556,73 @@ gboolean gtkut_text_buffer_match_string(GtkTextBuffer *textbuf, gint pos, return FALSE; } -guint gtkut_text_buffer_str_compare_n(GtkTextBuffer *textbuf, - guint pos1, guint pos2, - guint len, guint text_len) -{ - guint i; - - for (i = 0; i < len && pos1 + i < text_len && pos2 + i < text_len; i++) { - GtkTextIter start_iter, end_iter; - gchar *utf8str1, *utf8str2; - - gtk_text_buffer_get_iter_at_offset(textbuf, &start_iter, - pos1 + i); - gtk_text_buffer_get_iter_at_offset(textbuf, &end_iter, - pos1 + i + 1); - utf8str1 = gtk_text_buffer_get_text(textbuf, - &start_iter, - &end_iter, - FALSE); - - gtk_text_buffer_get_iter_at_offset(textbuf, &start_iter, - pos2 + i); - gtk_text_buffer_get_iter_at_offset(textbuf, &end_iter, - pos2 + i + 1); - utf8str2 = gtk_text_buffer_get_text(textbuf, - &start_iter, - &end_iter, - FALSE); - - if (!utf8str1 || !utf8str2 || strcmp(utf8str1, utf8str2) != 0) { - g_free(utf8str1); - g_free(utf8str2); - break; - } - - g_free(utf8str1); - g_free(utf8str2); - } - - return i; -} - -guint gtkut_text_buffer_str_compare(GtkTextBuffer *textbuf, - guint start_pos, guint text_len, - const gchar *str) +gboolean gtkut_text_buffer_find(GtkTextBuffer *buffer, const GtkTextIter *iter, + const gchar *str, gboolean case_sens, + GtkTextIter *match_pos) { gunichar *wcs; - guint len = 0; + gint len; glong items_read = 0, items_written = 0; - gboolean result; GError *error = NULL; - - if (!str) return 0; + GtkTextIter iter_; + gboolean found = FALSE; 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 0; - len = (guint)items_written; + if (!wcs || items_written <= 0) return FALSE; + len = (gint)items_written; - if (len > text_len - start_pos) - result = FALSE; - else - result = gtkut_text_buffer_match_string(textbuf, start_pos, - wcs, len, TRUE); + iter_ = *iter; + do { + found = gtkut_text_buffer_match_string + (buffer, &iter_, wcs, len, case_sens); + if (found) { + *match_pos = iter_; + break; + } + } while (gtk_text_iter_forward_char(&iter_)); g_free(wcs); - return result ? len : 0; + return found; } -gint gtkut_text_buffer_find(GtkTextBuffer *buffer, guint start_pos, - const gchar *str, gboolean case_sens) +gboolean gtkut_text_buffer_find_backward(GtkTextBuffer *buffer, + const GtkTextIter *iter, + const gchar *str, gboolean case_sens, + GtkTextIter *match_pos) { - gint pos; gunichar *wcs; gint len; glong items_read = 0, items_written = 0; GError *error = NULL; - GtkTextIter iter; - gint found_pos = -1; + GtkTextIter iter_; + gboolean found = FALSE; 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; + if (!wcs || items_written <= 0) return FALSE; 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; + iter_ = *iter; + while (gtk_text_iter_backward_char(&iter_)) { + found = gtkut_text_buffer_match_string + (buffer, &iter_, wcs, len, case_sens); + if (found) { + *match_pos = iter_; 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) -{ - if (gtkut_text_buffer_str_compare - (textbuf, start_pos, text_len, "http://") || - gtkut_text_buffer_str_compare - (textbuf, start_pos, text_len, "ftp://") || - gtkut_text_buffer_str_compare - (textbuf, start_pos, text_len, "https://") || - gtkut_text_buffer_str_compare - (textbuf, start_pos, text_len, "www.")) - return TRUE; - - return FALSE; + return found; } gchar *gtkut_text_view_get_selection(GtkTextView *textview) diff --git a/src/gtkutils.h b/src/gtkutils.h index 2b5fd1c7..0483be94 100644 --- a/src/gtkutils.h +++ b/src/gtkutils.h @@ -142,27 +142,21 @@ void gtkut_editable_disable_im (GtkEditable *editable); void gtkut_container_remove (GtkContainer *container, GtkWidget *widget); -gboolean gtkut_text_buffer_match_string (GtkTextBuffer *text, - gint pos, - gunichar *wcs, - gint len, - gboolean case_sens); -guint gtkut_text_buffer_str_compare_n (GtkTextBuffer *text, - guint pos1, - guint pos2, - guint len, - guint text_len); -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); +gboolean gtkut_text_buffer_match_string (GtkTextBuffer *buffer, + const GtkTextIter *iter, + gunichar *wcs, + gint len, + gboolean case_sens); +gboolean gtkut_text_buffer_find (GtkTextBuffer *buffer, + const GtkTextIter *iter, + const gchar *str, + gboolean case_sens, + GtkTextIter *match_pos); +gboolean gtkut_text_buffer_find_backward(GtkTextBuffer *buffer, + const GtkTextIter *iter, + const gchar *str, + gboolean case_sens, + GtkTextIter *match_pos); gchar *gtkut_text_view_get_selection (GtkTextView *textview); diff --git a/src/textview.c b/src/textview.c index 48f6e90c..17968e98 100644 --- a/src/textview.c +++ b/src/textview.c @@ -1273,9 +1273,8 @@ gboolean textview_search_string(TextView *textview, const gchar *str, { GtkTextView *text = GTK_TEXT_VIEW(textview->text); GtkTextBuffer *buffer; - GtkTextIter iter, end_iter; + GtkTextIter iter, match_pos; GtkTextMark *mark; - gint pos; gint len; g_return_val_if_fail(str != NULL, FALSE); @@ -1287,12 +1286,14 @@ gboolean textview_search_string(TextView *textview, const gchar *str, 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_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); + if (gtkut_text_buffer_find(buffer, &iter, str, case_sens, + &match_pos)) { + GtkTextIter end = match_pos; + + gtk_text_iter_forward_chars(&end, len); + /* place "insert" at the last character */ + gtk_text_buffer_select_range(buffer, &end, &match_pos); gtk_text_view_scroll_to_mark(text, mark, 0.0, FALSE, 0.0, 0.0); return TRUE; } @@ -1305,47 +1306,31 @@ gboolean textview_search_string_backward(TextView *textview, const gchar *str, { GtkTextView *text = GTK_TEXT_VIEW(textview->text); GtkTextBuffer *buffer; - GtkTextIter iter, end_iter; + GtkTextIter iter, match_pos; GtkTextMark *mark; - gint pos; - gunichar *wcs; gint len; - glong items_read = 0, items_written = 0; - GError *error = NULL; - gboolean found = FALSE; g_return_val_if_fail(str != NULL, 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 (!wcs || items_written <= 0) return FALSE; - len = (gint)items_written; + len = g_utf8_strlen(str, -1); + g_return_val_if_fail(len >= 0, FALSE); 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 (gtkut_text_buffer_find_backward(buffer, &iter, str, case_sens, + &match_pos)) { + GtkTextIter end = match_pos; + + gtk_text_iter_forward_chars(&end, len); + gtk_text_buffer_select_range(buffer, &match_pos, &end); + gtk_text_view_scroll_to_mark(text, mark, 0.0, FALSE, 0.0, 0.0); + return TRUE; } - g_free(wcs); - return found; + return FALSE; } void textview_scroll_one_line(TextView *textview, gboolean up) |