talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit b2acc4e13a13c747325b6c3b4adc121e46bb32b4
parent cd04a0e0c0d2eff4e54e172d1d0623d15443f284
Author: Colin Leroy <colin@colino.net>
Date:   Thu, 21 Aug 2008 06:34:20 +0000

2008-08-21 [colin]	3.5.0cvs65

	* src/compose.c
		Add support for auto-indentation

Diffstat:
MChangeLog | 5+++++
MPATCHSETS | 1+
Mconfigure.ac | 2+-
Msrc/compose.c | 111+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
4 files changed, 104 insertions(+), 15 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,8 @@ +2008-08-21 [colin] 3.5.0cvs65 + + * src/compose.c + Add support for auto-indentation + 2008-08-19 [colin] 3.5.0cvs64 * src/compose.c diff --git a/PATCHSETS b/PATCHSETS @@ -3476,3 +3476,4 @@ ( cvs diff -u -r 1.60.2.60 -r 1.60.2.61 src/prefs_actions.c; cvs diff -u -r 1.49.2.112 -r 1.49.2.113 src/procmime.c; cvs diff -u -r 1.1.2.73 -r 1.1.2.74 src/wizard.c; cvs diff -u -r 1.13.2.19 -r 1.13.2.20 src/common/socket.h; cvs diff -u -r 1.1.2.2 -r 1.1.2.3 src/gtk/gtkcmctree.c; ) > 3.5.0cvs62.patchset ( cvs diff -u -r 1.274.2.267 -r 1.274.2.268 src/mainwindow.c; ) > 3.5.0cvs63.patchset ( cvs diff -u -r 1.382.2.466 -r 1.382.2.467 src/compose.c; ) > 3.5.0cvs64.patchset +( cvs diff -u -r 1.382.2.467 -r 1.382.2.468 src/compose.c; ) > 3.5.0cvs65.patchset diff --git a/configure.ac b/configure.ac @@ -11,7 +11,7 @@ MINOR_VERSION=5 MICRO_VERSION=0 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=64 +EXTRA_VERSION=65 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/compose.c b/src/compose.c @@ -3662,42 +3662,98 @@ static gchar *compose_get_quote_str(GtkTextBuffer *buffer, return NULL; } -/* return TRUE if the line is itemized */ -static gboolean compose_is_itemized(GtkTextBuffer *buffer, +/* return >0 if the line is itemized */ +static int compose_itemized_length(GtkTextBuffer *buffer, const GtkTextIter *start) { GtkTextIter iter = *start; gunichar wc; gchar ch[6]; gint clen; - + gint len = 0; if (gtk_text_iter_ends_line(&iter)) - return FALSE; + return 0; while (1) { + len++; wc = gtk_text_iter_get_char(&iter); if (!g_unichar_isspace(wc)) break; gtk_text_iter_forward_char(&iter); if (gtk_text_iter_ends_line(&iter)) - return FALSE; + return 0; } clen = g_unichar_to_utf8(wc, ch); if (clen != 1) - return FALSE; + return 0; if (!strchr("*-+", ch[0])) - return FALSE; + return 0; gtk_text_iter_forward_char(&iter); if (gtk_text_iter_ends_line(&iter)) - return FALSE; + return 0; wc = gtk_text_iter_get_char(&iter); - if (g_unichar_isspace(wc)) - return TRUE; + if (g_unichar_isspace(wc)) { + return len+1; + } + return 0; +} - return FALSE; +/* return the string at the start of the itemization */ +static gchar * compose_get_itemized_chars(GtkTextBuffer *buffer, + const GtkTextIter *start) +{ + GtkTextIter iter = *start; + gunichar wc; + gint len = 0; + GString *item_chars = g_string_new(""); + gchar *str = NULL; + + if (gtk_text_iter_ends_line(&iter)) + return NULL; + + while (1) { + len++; + wc = gtk_text_iter_get_char(&iter); + if (!g_unichar_isspace(wc)) + break; + gtk_text_iter_forward_char(&iter); + if (gtk_text_iter_ends_line(&iter)) + break; + g_string_append_unichar(item_chars, wc); + } + + str = item_chars->str; + g_string_free(item_chars, FALSE); + return str; +} + +/* return the number of spaces at a line's start */ +static int compose_left_offset_length(GtkTextBuffer *buffer, + const GtkTextIter *start) +{ + GtkTextIter iter = *start; + gunichar wc; + gint len = 0; + if (gtk_text_iter_ends_line(&iter)) + return 0; + + while (1) { + wc = gtk_text_iter_get_char(&iter); + if (!g_unichar_isspace(wc)) + break; + len++; + gtk_text_iter_forward_char(&iter); + if (gtk_text_iter_ends_line(&iter)) + return 0; + } + + gtk_text_iter_forward_char(&iter); + if (gtk_text_iter_ends_line(&iter)) + return 0; + return len; } static gboolean compose_get_line_break_pos(GtkTextBuffer *buffer, @@ -3846,7 +3902,7 @@ static gboolean compose_join_next_line(Compose *compose, } /* don't join itemized lines */ - if (compose_is_itemized(buffer, &end)) { + if (compose_itemized_length(buffer, &end) > 0) { return FALSE; } @@ -3942,6 +3998,9 @@ static gboolean compose_beautify_paragraph(Compose *compose, GtkTextIter *par_it gboolean modified_before_remove = FALSE; gint lines = 0; gboolean start = TRUE; + gint itemized_len = 0, rem_item_len = 0; + gchar *itemized_chars = NULL; + gboolean item_continuation = FALSE; if (force) { modified = TRUE; @@ -3980,6 +4039,17 @@ static gboolean compose_beautify_paragraph(Compose *compose, GtkTextIter *par_it /* move to line start */ gtk_text_iter_set_line_offset(&iter, 0); } + + itemized_len = compose_itemized_length(buffer, &iter); + + if (!itemized_len) { + itemized_len = compose_left_offset_length(buffer, &iter); + item_continuation = TRUE; + } + + if (itemized_len) + itemized_chars = compose_get_itemized_chars(buffer, &iter); + /* go until paragraph end (empty line) */ while (start || !gtk_text_iter_ends_line(&iter)) { gchar *scanpos = NULL; @@ -4060,22 +4130,35 @@ static gboolean compose_beautify_paragraph(Compose *compose, GtkTextIter *par_it prefs_common.linewrap_len, quote_len)) { GtkTextIter prev, next, cur; - if (prev_autowrap != FALSE || force) { compose->automatic_break = TRUE; modified = TRUE; gtk_text_buffer_insert(buffer, &break_pos, "\n", 1); compose->automatic_break = FALSE; + if (itemized_len) { + gtk_text_buffer_insert(buffer, &break_pos, itemized_chars, -1); + if (!item_continuation) + gtk_text_buffer_insert(buffer, &break_pos, " ", 2); + } } else if (quote_str && wrap_quote) { compose->automatic_break = TRUE; modified = TRUE; gtk_text_buffer_insert(buffer, &break_pos, "\n", 1); compose->automatic_break = FALSE; + if (itemized_len) { + gtk_text_buffer_insert(buffer, &break_pos, itemized_chars, -1); + if (!item_continuation) + gtk_text_buffer_insert(buffer, &break_pos, " ", 2); + } } else goto colorize; /* remove trailing spaces */ cur = break_pos; + rem_item_len = itemized_len; + while (rem_item_len-- > 0) + gtk_text_iter_backward_char(&cur); gtk_text_iter_backward_char(&cur); + prev = next = cur; while (!gtk_text_iter_starts_line(&cur)) { gunichar wc; @@ -4268,9 +4351,9 @@ colorize: goto end; } } - debug_print("modified, out after %d lines\n", lines); end: + g_free(itemized_chars); if (par_iter) *par_iter = iter; undo_wrapping(compose->undostruct, FALSE);