aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--ChangeLog.ja10
-rw-r--r--src/gtkutils.c148
-rw-r--r--src/gtkutils.h36
-rw-r--r--src/textview.c55
5 files changed, 103 insertions, 156 deletions
diff --git a/ChangeLog b/ChangeLog
index af22d59e..9de85abc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)