aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-02-21 09:09:16 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-02-21 09:09:16 +0000
commit395c06fc87e6097136ff4d868062c22c5af4c0b3 (patch)
tree8aefd3591666cb08ce51bece8b653cf1232a2cbe
parent892b884e8b5a8c3425b19cb531898fbeca2c06a3 (diff)
compose.c: improved auto-wrapping.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@118 ee746299-78ed-0310-b773-934348b2243d
-rw-r--r--ChangeLog11
-rw-r--r--ChangeLog.ja12
-rw-r--r--src/compose.c71
3 files changed, 89 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 1ad7df7a..f1acb696 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
2005-02-21
+ * src/compose.c:
+ compose_join_next_line(): consider tab width. Keep cursor position
+ as much as possible.
+ compose_wrap_paragraph(): remove trailing spaces on wrapping.
+ compose_insert_sig(): don't select text when placing cursor.
+ compose_insert_file(): disable autowrap while inserting text.
+ compose_undo_cb()
+ compose_redo_cb(): disable autowrap while performing undo/redo.
+
+2005-02-21
+
* src/summaryview.c: summary_ctree_create(): changed indent size to
12.
diff --git a/ChangeLog.ja b/ChangeLog.ja
index 8d26c6d4..c58da046 100644
--- a/ChangeLog.ja
+++ b/ChangeLog.ja
@@ -1,5 +1,17 @@
2005-02-21
+ * src/compose.c:
+ compose_join_next_line(): タブ幅を考慮。カーソル位置をできるだけ
+ 保持するようにした。
+ compose_wrap_paragraph(): 折り返し時に行末の空白を削除。
+ compose_insert_sig(): カーソルを配置するときにテキストを選択しない
+ ようにした。
+ compose_undo_cb()
+ compose_redo_cb(): undo/redo の実行時は自動整形を無効にするように
+ した。
+
+2005-02-21
+
* src/summaryview.c: summary_ctree_create(): インデントサイズを 12
に変更。
diff --git a/src/compose.c b/src/compose.c
index 92b44d48..c4f5663f 100644
--- a/src/compose.c
+++ b/src/compose.c
@@ -1528,7 +1528,7 @@ static void compose_insert_sig(Compose *compose, gboolean replace)
cur_pos = gtk_text_buffer_get_char_count(buffer);
gtk_text_buffer_get_iter_at_offset(buffer, &iter, cur_pos);
- gtk_text_buffer_move_mark(buffer, mark, &iter);
+ gtk_text_buffer_place_cursor(buffer, &iter);
}
static gchar *compose_get_signature_str(Compose *compose)
@@ -1588,6 +1588,7 @@ static void compose_insert_file(Compose *compose, const gchar *file)
gchar buf[BUFFSIZE];
gint len;
FILE *fp;
+ gboolean prev_autowrap;
g_return_if_fail(file != NULL);
@@ -1602,6 +1603,9 @@ static void compose_insert_file(Compose *compose, const gchar *file)
cur_encoding = conv_get_locale_charset_str();
+ prev_autowrap = compose->autowrap;
+ compose->autowrap = FALSE;
+
while (fgets(buf, sizeof(buf), fp) != NULL) {
gchar *str;
@@ -1621,6 +1625,10 @@ static void compose_insert_file(Compose *compose, const gchar *file)
g_free(str);
}
+ compose->autowrap = prev_autowrap;
+ if (compose->autowrap)
+ compose_wrap_all(compose);
+
fclose(fp);
}
@@ -1885,7 +1893,12 @@ static gboolean compose_get_line_break_pos(GtkTextBuffer *buffer,
wc = g_utf8_get_char(p);
if (i >= quote_len && !g_unichar_isspace(wc))
break;
- col += g_unichar_iswide(wc) ? 2 : 1;
+ if (g_unichar_iswide(wc))
+ col += 2;
+ else if (*p == '\t')
+ col += 8;
+ else
+ col++;
p = g_utf8_next_char(p);
}
@@ -1911,7 +1924,12 @@ static gboolean compose_get_line_break_pos(GtkTextBuffer *buffer,
}
wc = g_utf8_get_char(p);
- col += g_unichar_iswide(wc) ? 2 : 1;
+ if (g_unichar_iswide(wc))
+ col += 2;
+ else if (*p == '\t')
+ col += 8;
+ else
+ col++;
if (pos > 0 && col > max_col) {
do_break = TRUE;
break;
@@ -1942,6 +1960,7 @@ static gboolean compose_join_next_line(GtkTextBuffer *buffer,
gchar *next_quote_str;
gunichar wc1, wc2;
gint quote_len;
+ gboolean keep_cursor = FALSE;
if (!gtk_text_iter_forward_line(&iter_) ||
gtk_text_iter_ends_line(&iter_))
@@ -1982,8 +2001,15 @@ static gboolean compose_join_next_line(GtkTextBuffer *buffer,
gtk_text_iter_forward_char(&cur);
next = cur;
}
- if (!gtk_text_iter_equal(&prev, &next))
+ if (!gtk_text_iter_equal(&prev, &next)) {
+ GtkTextMark *mark;
+
+ mark = gtk_text_buffer_get_insert(buffer);
+ gtk_text_buffer_get_iter_at_mark(buffer, &cur, mark);
+ if (gtk_text_iter_equal(&prev, &cur))
+ keep_cursor = TRUE;
gtk_text_buffer_delete(buffer, &prev, &next);
+ }
iter_ = prev;
/* insert space if required */
@@ -1994,8 +2020,13 @@ static gboolean compose_join_next_line(GtkTextBuffer *buffer,
str = gtk_text_buffer_get_text(buffer, &prev, &next, FALSE);
pango_default_break(str, -1, NULL, attrs, 3);
if (!attrs[1].is_line_break ||
- (!g_unichar_iswide(wc1) || !g_unichar_iswide(wc2)))
+ (!g_unichar_iswide(wc1) || !g_unichar_iswide(wc2))) {
gtk_text_buffer_insert(buffer, &iter_, " ", 1);
+ if (keep_cursor) {
+ gtk_text_iter_backward_char(&iter_);
+ gtk_text_buffer_place_cursor(buffer, &iter_);
+ }
+ }
g_free(str);
*iter = iter_;
@@ -2056,7 +2087,29 @@ static void compose_wrap_paragraph(Compose *compose, GtkTextIter *par_iter)
if (compose_get_line_break_pos(buffer, &iter, &break_pos,
prefs_common.linewrap_len,
quote_len)) {
+ GtkTextIter prev, next, cur;
+
gtk_text_buffer_insert(buffer, &break_pos, "\n", 1);
+
+ /* remove trailing spaces */
+ cur = break_pos;
+ gtk_text_iter_backward_char(&cur);
+ prev = next = cur;
+ while (!gtk_text_iter_starts_line(&cur)) {
+ gunichar wc;
+
+ gtk_text_iter_backward_char(&cur);
+ wc = gtk_text_iter_get_char(&cur);
+ if (!g_unichar_isspace(wc))
+ break;
+ prev = cur;
+ }
+ if (!gtk_text_iter_equal(&prev, &next)) {
+ gtk_text_buffer_delete(buffer, &prev, &next);
+ break_pos = next;
+ gtk_text_iter_forward_char(&break_pos);
+ }
+
if (quote_str)
gtk_text_buffer_insert(buffer, &break_pos,
quote_str, -1);
@@ -5292,12 +5345,20 @@ static void compose_destroy_cb(GtkWidget *widget, Compose *compose)
static void compose_undo_cb(Compose *compose)
{
+ gboolean prev_autowrap = compose->autowrap;
+
+ compose->autowrap = FALSE;
undo_undo(compose->undostruct);
+ compose->autowrap = prev_autowrap;
}
static void compose_redo_cb(Compose *compose)
{
+ gboolean prev_autowrap = compose->autowrap;
+
+ compose->autowrap = FALSE;
undo_redo(compose->undostruct);
+ compose->autowrap = prev_autowrap;
}
static void compose_cut_cb(Compose *compose)