/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2007 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2009 Hiroyuki Yamamoto and the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
static void compose_insert_sig (Compose *compose,
gboolean replace);
-static gchar *compose_get_signature_str (Compose *compose);
static ComposeInsertResult compose_insert_file (Compose *compose,
const gchar *file);
static void compose_remove_header_entries(Compose *compose);
static void compose_update_priority_menu_item(Compose * compose);
-#if USE_ASPELL
+#if USE_ENCHANT
static void compose_spell_menu_changed (void *data);
#endif
static void compose_add_field_list ( Compose *compose,
gpointer data);
static void compose_toggle_autowrap_cb (GtkToggleAction *action,
gpointer data);
+static void compose_toggle_autoindent_cb(GtkToggleAction *action,
+ gpointer data);
static void compose_toggle_ruler_cb (GtkToggleAction *action,
gpointer data);
}
-#if USE_ASPELL
+#if USE_ENCHANT
static void compose_check_all (GtkAction *action, gpointer data);
static void compose_highlight_all (GtkAction *action, gpointer data);
static void compose_check_backwards (GtkAction *action, gpointer data);
static MsgInfo *compose_msginfo_new_from_compose(Compose *compose);
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
static void compose_set_dictionaries_from_folder_prefs(Compose *compose,
FolderItem *folder_item);
#endif
/* menus */
{"Message", NULL, N_("_Message") },
{"Edit", NULL, N_("_Edit") },
-#if USE_ASPELL
+#if USE_ENCHANT
{"Spelling", NULL, N_("_Spelling") },
#endif
{"Options", NULL, N_("_Options") },
{"Edit/WrapAllLines", NULL, N_("Wrap all long _lines"), "<control><alt>L", NULL, G_CALLBACK(compose_wrap_all_cb) }, /* 1 */
/* {"Edit/---", NULL, "---" }, */
{"Edit/ExtEditor", NULL, N_("Edit with e_xternal editor"), "<shift><control>X", NULL, G_CALLBACK(compose_ext_editor_cb) },
-#if USE_ASPELL
+#if USE_ENCHANT
/* Spelling menu */
{"Spelling/CheckAllSel", NULL, N_("_Check all or check selection"), NULL, NULL, G_CALLBACK(compose_check_all) },
{"Spelling/HighlightAll", NULL, N_("_Highlight all misspelled words"), NULL, NULL, G_CALLBACK(compose_highlight_all) },
static GtkToggleActionEntry compose_toggle_entries[] =
{
{"Edit/AutoWrap", NULL, N_("Aut_o wrapping"), "<shift><control>L", NULL, G_CALLBACK(compose_toggle_autowrap_cb) }, /* TOGGLE */
+ {"Edit/AutoIndent", NULL, N_("Auto _indent"), NULL, NULL, G_CALLBACK(compose_toggle_autoindent_cb) }, /* TOGGLE */
{"Options/Sign", NULL, N_("Si_gn"), NULL, NULL, G_CALLBACK(compose_toggle_sign_cb) }, /* Toggle */
{"Options/Encrypt", NULL, N_("_Encrypt"), NULL, NULL, G_CALLBACK(compose_toggle_encrypt_cb) }, /* Toggle */
{"Options/RequestRetRcpt", NULL, N_("_Request Return Receipt"), NULL, NULL, G_CALLBACK(compose_toggle_return_receipt_cb) }, /* TOGGLE */
{"Options/Priority/High", NULL, N_("Hi_gh"), NULL, NULL, PRIORITY_HIGH }, /* RADIO compose_set_priority_cb */
{"Options/Priority/Normal", NULL, N_("_Normal"), NULL, NULL, PRIORITY_NORMAL }, /* RADIO compose_set_priority_cb */
{"Options/Priority/Low", NULL, N_("Lo_w"), NULL, NULL, PRIORITY_LOW }, /* RADIO compose_set_priority_cb */
- {"Options/Priority/Lowest", NULL, N_("Lowest"), NULL, NULL, PRIORITY_LOWEST }, /* RADIO compose_set_priority_cb */
+ {"Options/Priority/Lowest", NULL, N_("_Lowest"), NULL, NULL, PRIORITY_LOWEST }, /* RADIO compose_set_priority_cb */
};
static GtkRadioActionEntry compose_radio_enc_entries[] =
{
- ENC_ACTION(CS_AUTO, C_AUTO, "_Automatic"), /* RADIO compose_set_encoding_cb */
- ENC_ACTION(CS_US_ASCII, C_US_ASCII, "7bit ASCII (US-ASC_II)"), /* RADIO compose_set_encoding_cb */
- ENC_ACTION(CS_UTF_8, C_UTF_8, "Unicode (_UTF-8)"), /* RADIO compose_set_encoding_cb */
+ ENC_ACTION(CS_AUTO, C_AUTO, N_("_Automatic")), /* RADIO compose_set_encoding_cb */
+ ENC_ACTION(CS_US_ASCII, C_US_ASCII, N_("7bit ASCII (US-ASC_II)")), /* RADIO compose_set_encoding_cb */
+ ENC_ACTION(CS_UTF_8, C_UTF_8, N_("Unicode (_UTF-8)")), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Western/"CS_ISO_8859_1, C_ISO_8859_1, "ISO-8859-_1"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Western/"CS_ISO_8859_15, C_ISO_8859_15, "ISO-8859-15"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Western/"CS_WINDOWS_1252, C_WINDOWS_1252, "Windows-1252"), /* RADIO compose_set_encoding_cb */
- ENC_ACTION(CS_ISO_8859_2, C_ISO_8859_2, "Central European (ISO-8859-_2)"), /* RADIO compose_set_encoding_cb */
+ ENC_ACTION(CS_ISO_8859_2, C_ISO_8859_2, N_("Central European (ISO-8859-_2)")), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Baltic/"CS_ISO_8859_13, C_ISO_8859_13, "ISO-8859-13"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Baltic/"CS_ISO_8859_4, C_ISO_8859_14, "ISO-8859-_4"), /* RADIO compose_set_encoding_cb */
- ENC_ACTION(CS_ISO_8859_7, C_ISO_8859_7, "Greek (ISO-8859-_7)"), /* RADIO compose_set_encoding_cb */
+ ENC_ACTION(CS_ISO_8859_7, C_ISO_8859_7, N_("Greek (ISO-8859-_7)")), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Hebrew/"CS_ISO_8859_8, C_ISO_8859_8, "ISO-8859-_8"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Hebrew/"CS_WINDOWS_1255, C_WINDOWS_1255, "Windows-1255"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Arabic/"CS_ISO_8859_6, C_ISO_8859_6, "ISO-8859-_6"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Arabic/"CS_WINDOWS_1256, C_WINDOWS_1256, "Windows-1256"), /* RADIO compose_set_encoding_cb */
- ENC_ACTION(CS_ISO_8859_9, C_ISO_8859_9, "Turkish (ISO-8859-_9)"), /* RADIO compose_set_encoding_cb */
+ ENC_ACTION(CS_ISO_8859_9, C_ISO_8859_9, N_("Turkish (ISO-8859-_9)")), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Cyrillic/"CS_ISO_8859_5, C_ISO_8859_5, "ISO-8859-_5"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Cyrillic/"CS_KOI8_R, C_KOI8_R, "KOI8-_R"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Cyrillic/"CS_KOI8_U, C_KOI8_U, "KOI8-_U"), /* RADIO compose_set_encoding_cb */
cmark); \
}
+static void compose_set_save_to(Compose *compose, const gchar *folderidentifier)
+{
+ GtkEditable *entry;
+ if (folderidentifier) {
+ combobox_unset_popdown_strings(GTK_COMBO_BOX(compose->savemsg_combo));
+ prefs_common.compose_save_to_history = add_history(
+ prefs_common.compose_save_to_history, folderidentifier);
+ combobox_set_popdown_strings(GTK_COMBO_BOX(compose->savemsg_combo),
+ prefs_common.compose_save_to_history);
+ }
+
+ entry = GTK_EDITABLE(gtk_bin_get_child(GTK_BIN(compose->savemsg_combo)));
+ if (folderidentifier)
+ gtk_entry_set_text(GTK_ENTRY(entry), folderidentifier);
+ else
+ gtk_entry_set_text(GTK_ENTRY(entry), "");
+}
+
+static gchar *compose_get_save_to(Compose *compose)
+{
+ GtkEditable *entry;
+ gchar *result = NULL;
+ entry = GTK_EDITABLE(gtk_bin_get_child(GTK_BIN(compose->savemsg_combo)));
+ result = gtk_editable_get_chars(entry, 0, -1);
+
+ if (result) {
+ combobox_unset_popdown_strings(GTK_COMBO_BOX(compose->savemsg_combo));
+ prefs_common.compose_save_to_history = add_history(
+ prefs_common.compose_save_to_history, result);
+ combobox_set_popdown_strings(GTK_COMBO_BOX(compose->savemsg_combo),
+ prefs_common.compose_save_to_history);
+ }
+ return result;
+}
+
Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderItem *item,
GPtrArray *attach_files, GList *listAddress )
{
tmp = malloc(strlen(item->prefs->compose_override_from_format)+1);
pref_get_unescaped_pref(tmp, item->prefs->compose_override_from_format);
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
quote_fmt_init(dummyinfo, NULL, NULL, FALSE, compose->account, FALSE,
compose->gtkaspell);
#else
compose_create_tags(textview, compose);
undo_block(compose->undostruct);
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
compose_set_dictionaries_from_folder_prefs(compose, item);
#endif
pref_get_unescaped_pref(tmp, subject_format);
subject = gtk_editable_get_chars(GTK_EDITABLE(compose->subject_entry), 0, -1);
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
quote_fmt_init(dummyinfo, NULL, subject, FALSE, compose->account, FALSE,
compose->gtkaspell);
#else
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), prefs_common.savemsg);
folderidentifier = folder_item_get_identifier(item);
- gtk_entry_set_text(GTK_ENTRY(compose->savemsg_entry), folderidentifier);
+ compose_set_save_to(compose, folderidentifier);
g_free(folderidentifier);
}
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), TRUE);
folderidentifier = folder_item_get_identifier(msginfo->folder);
- gtk_entry_set_text(GTK_ENTRY(compose->savemsg_entry), folderidentifier);
+ compose_set_save_to(compose, folderidentifier);
g_free(folderidentifier);
}
tmp = malloc(strlen(msginfo->folder->prefs->reply_override_from_format)+1);
pref_get_unescaped_pref(tmp, msginfo->folder->prefs->reply_override_from_format);
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
quote_fmt_init(compose->replyinfo, NULL, NULL, FALSE, compose->account, FALSE,
compose->gtkaspell);
#else
compose_create_tags(textview, compose);
undo_block(compose->undostruct);
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
compose_set_dictionaries_from_folder_prefs(compose, msginfo->folder);
#endif
compose_force_encryption(compose, account, FALSE);
}
+ privacy_msginfo_get_signed_state(compose->replyinfo);
+ if (MSG_IS_SIGNED(compose->replyinfo->flags) && account->default_sign_reply) {
+ compose_force_signing(compose, account);
+ }
+
SIGNAL_BLOCK(textbuf);
if (account->auto_sig)
tmp = malloc(strlen(msginfo->folder->prefs->forward_override_from_format)+1);
pref_get_unescaped_pref(tmp, msginfo->folder->prefs->forward_override_from_format);
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
quote_fmt_init(full_msginfo, NULL, NULL, FALSE, compose->account, FALSE,
compose->gtkaspell);
#else
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), TRUE);
folderidentifier = folder_item_get_identifier(msginfo->folder);
- gtk_entry_set_text(GTK_ENTRY(compose->savemsg_entry), folderidentifier);
+ compose_set_save_to(compose, folderidentifier);
g_free(folderidentifier);
}
tmp = malloc(strlen(msginfo->folder->prefs->forward_override_from_format)+1);
pref_get_unescaped_pref(tmp, msginfo->folder->prefs->forward_override_from_format);
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
quote_fmt_init(msginfo, NULL, NULL, FALSE, compose->account, FALSE,
compose->gtkaspell);
#else
gchar *privacy_system = NULL;
int priority = PRIORITY_NORMAL;
MsgInfo *replyinfo = NULL, *fwdinfo = NULL;
+ gboolean autowrap = prefs_common.autowrap;
+ gboolean autoindent = prefs_common.auto_indent;
g_return_val_if_fail(msginfo != NULL, NULL);
g_return_val_if_fail(msginfo->folder != NULL, NULL);
param = atoi(&queueheader_buf[strlen("X-Sylpheed-Encrypt:")]);
use_encryption = param;
}
+ if (!procheader_get_header_from_msginfo(msginfo, queueheader_buf,
+ sizeof(queueheader_buf), "X-Claws-Auto-Wrapping:")) {
+ param = atoi(&queueheader_buf[strlen("X-Claws-Auto-Wrapping:")]);
+ autowrap = param;
+ }
+ if (!procheader_get_header_from_msginfo(msginfo, queueheader_buf,
+ sizeof(queueheader_buf), "X-Claws-Auto-Indent:")) {
+ param = atoi(&queueheader_buf[strlen("X-Claws-Auto-Indent:")]);
+ autoindent = param;
+ }
if (!procheader_get_header_from_msginfo(msginfo, queueheader_buf,
sizeof(queueheader_buf), "X-Claws-Privacy-System:")) {
privacy_system = g_strdup(&queueheader_buf[strlen("X-Claws-Privacy-System:")]);
g_return_val_if_fail(account != NULL, NULL);
compose = compose_create(account, msginfo->folder, COMPOSE_REEDIT, batch);
-
+
+ cm_toggle_menu_set_active_full(compose->ui_manager, "Menu/Edit/AutoWrap", autowrap);
+ cm_toggle_menu_set_active_full(compose->ui_manager, "Menu/Edit/AutoIndent", autoindent);
+ compose->autowrap = autowrap;
compose->replyinfo = replyinfo;
compose->fwdinfo = fwdinfo;
/* Set message save folder */
if (!procheader_get_header_from_msginfo(msginfo, queueheader_buf, sizeof(queueheader_buf), "SCF:")) {
- gint startpos = 0;
-
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), TRUE);
- gtk_editable_delete_text(GTK_EDITABLE(compose->savemsg_entry), 0, -1);
- gtk_editable_insert_text(GTK_EDITABLE(compose->savemsg_entry), &queueheader_buf[4], strlen(&queueheader_buf[4]), &startpos);
+ compose_set_save_to(compose, &queueheader_buf[4]);
}
if (!procheader_get_header_from_msginfo(msginfo, queueheader_buf, sizeof(queueheader_buf), "RRCPT:")) {
gint active = atoi(&queueheader_buf[strlen("RRCPT:")]);
return NULL;
}
- compose->sig_str = compose_get_signature_str(compose);
+ compose->sig_str = account_get_signature_str(compose->account);
return compose;
}
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), prefs_common.savemsg);
folderidentifier = folder_item_get_identifier(item);
- gtk_entry_set_text(GTK_ENTRY(compose->savemsg_entry), folderidentifier);
+ compose_set_save_to(compose, folderidentifier);
g_free(folderidentifier);
}
case A_ADDRBOOK:
compose_address_cb(NULL, compose);
break;
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
case A_CHECK_SPELLING:
compose_check_all(NULL, compose);
break;
}
if (qmark != NULL) {
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
quote_fmt_init(msginfo, NULL, NULL, FALSE, compose->account, FALSE,
compose->gtkaspell);
#else
while (*trimmed_body == '\n')
trimmed_body++;
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
quote_fmt_init(msginfo, quote_str, trimmed_body, FALSE, compose->account, FALSE,
compose->gtkaspell);
#else
}
g_free(compose->sig_str);
- compose->sig_str = compose_get_signature_str(compose);
+ compose->sig_str = account_get_signature_str(compose->account);
cur_pos = gtk_text_iter_get_offset(&iter);
else
gtk_text_buffer_get_iter_at_offset(buffer, &iter,
compose->set_cursor_pos);
-
+
+ compose->set_cursor_pos = -1;
gtk_text_buffer_place_cursor(buffer, &iter);
g_signal_handlers_unblock_by_func(G_OBJECT(buffer),
G_CALLBACK(compose_changed_cb),
UNBLOCK_WRAP();
}
-static gchar *compose_get_signature_str(Compose *compose)
-{
- gchar *sig_body = NULL;
- gchar *sig_str = NULL;
- gchar *utf8_sig_str = NULL;
-
- g_return_val_if_fail(compose->account != NULL, NULL);
-
- if (!compose->account->sig_path)
- return NULL;
-
- if (compose->account->sig_type == SIG_FILE) {
- if (!is_file_or_fifo_exist(compose->account->sig_path)) {
- g_warning("can't open signature file: %s\n",
- compose->account->sig_path);
- return NULL;
- }
- }
-
- if (compose->account->sig_type == SIG_COMMAND)
- sig_body = get_command_output(compose->account->sig_path);
- else {
- gchar *tmp;
-
- tmp = file_read_to_str(compose->account->sig_path);
- if (!tmp)
- return NULL;
- sig_body = normalize_newlines(tmp);
- g_free(tmp);
- }
-
- if (compose->account->sig_sep) {
- sig_str = g_strconcat("\n", compose->account->sig_sep, "\n", sig_body,
- NULL);
- g_free(sig_body);
- } else
- sig_str = g_strconcat("\n", sig_body, NULL);
-
- if (sig_str) {
- if (g_utf8_validate(sig_str, -1, NULL) == TRUE)
- utf8_sig_str = sig_str;
- else {
- utf8_sig_str = conv_codeset_strdup
- (sig_str, conv_get_locale_charset_str_no_utf8(),
- CS_INTERNAL);
- g_free(sig_str);
- }
- }
-
- return utf8_sig_str;
-}
-
static ComposeInsertResult compose_insert_file(Compose *compose, const gchar *file)
{
GtkTextView *text;
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,
}
/* don't join itemized lines */
- if (compose_is_itemized(buffer, &end)) {
+ if (compose_itemized_length(buffer, &end) > 0) {
return FALSE;
}
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;
/* 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;
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 && compose->autoindent) {
+ 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 && compose->autoindent) {
+ 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 (compose->autoindent && 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;
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);
undo_unblock(compose->undostruct);
}
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
/* use account's dict info if set */
if (compose->gtkaspell) {
if (account->enable_default_dictionary)
for (list = compose->header_list; list; list = list->next) {
gchar *header;
gchar *entry;
- header = gtk_editable_get_chars(GTK_EDITABLE(GTK_BIN(((ComposeHeaderEntry *)list->data)->combo)->child), 0, -1);
+ header = gtk_editable_get_chars(GTK_EDITABLE(gtk_bin_get_child(GTK_BIN((((ComposeHeaderEntry *)list->data)->combo)))), 0, -1);
entry = gtk_editable_get_chars(GTK_EDITABLE(((ComposeHeaderEntry *)list->data)->entry), 0, -1);
g_strstrip(entry);
g_strstrip(header);
gchar *entry;
gchar *header;
entry = gtk_editable_get_chars(GTK_EDITABLE(((ComposeHeaderEntry *)list->data)->entry), 0, -1);
- header = gtk_editable_get_chars(GTK_EDITABLE(GTK_BIN(((ComposeHeaderEntry *)list->data)->combo)->child), 0, -1);
+ header = gtk_editable_get_chars(GTK_EDITABLE(gtk_bin_get_child(GTK_BIN((((ComposeHeaderEntry *)list->data)->combo)))), 0, -1);
g_strstrip(entry);
g_strstrip(header);
if (strcmp(entry, compose->account->auto_cc)
gchar *entry;
gchar *header;
entry = gtk_editable_get_chars(GTK_EDITABLE(((ComposeHeaderEntry *)list->data)->entry), 0, -1);
- header = gtk_editable_get_chars(GTK_EDITABLE(GTK_BIN(((ComposeHeaderEntry *)list->data)->combo)->child), 0, -1);
+ header = gtk_editable_get_chars(GTK_EDITABLE(gtk_bin_get_child(GTK_BIN((((ComposeHeaderEntry *)list->data)->combo)))), 0, -1);
g_strstrip(entry);
g_strstrip(header);
if (strcmp(entry, compose->account->auto_bcc)
first_to_address = TRUE;
for (list = compose->header_list; list; list = list->next) {
headerentry = ((ComposeHeaderEntry *)list->data);
- headerentryname = gtk_entry_get_text(GTK_ENTRY(GTK_BIN(headerentry->combo)->child));
+ headerentryname = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((headerentry->combo)))));
if (g_utf8_collate(headerentryname, to_hdr) == 0) {
const gchar *entstr = gtk_entry_get_text(GTK_ENTRY(headerentry->entry));
first_cc_address = TRUE;
for (list = compose->header_list; list; list = list->next) {
headerentry = ((ComposeHeaderEntry *)list->data);
- headerentryname = gtk_entry_get_text(GTK_ENTRY(GTK_BIN(headerentry->combo)->child));
+ headerentryname = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((headerentry->combo)))));
if (g_utf8_collate(headerentryname, cc_hdr) == 0) {
const gchar *strg = gtk_entry_get_text(GTK_ENTRY(headerentry->entry));
"X-Claws-End-Special-Headers:", "X-Claws-Account-Id:",
"X-Sylpheed-Privacy", "X-Sylpheed-Sign:", "X-Sylpheed-Encrypt",
"X-Sylpheed-End-Special-Headers:", "X-Sylpheed-Account-Id:",
+ "X-Claws-Auto-Wrapping:", "X-Claws-Auto-Indent:",
NULL
};
if ((fp = g_fopen(compose->redirect_filename, "rb")) == NULL) {
MimeInfo *mimemsg, *mimetext;
gint line;
const gchar *src_codeset = CS_INTERNAL;
+ gchar *from_addr = NULL;
+ gchar *from_name = NULL;
if (action == COMPOSE_WRITE_FOR_SEND)
attach_parts = TRUE;
g_free(buf);
+ if (strlen(gtk_entry_get_text(GTK_ENTRY(compose->from_name))) != 0) {
+ gchar *spec = gtk_editable_get_chars(GTK_EDITABLE(compose->from_name), 0, -1);
+ /* extract name and address */
+ if (strstr(spec, " <") && strstr(spec, ">")) {
+ from_addr = g_strdup(strrchr(spec, '<')+1);
+ *(strrchr(from_addr, '>')) = '\0';
+ from_name = g_strdup(spec);
+ *(strrchr(from_name, '<')) = '\0';
+ } else {
+ from_name = NULL;
+ from_addr = NULL;
+ }
+ g_free(spec);
+ }
/* sign message if sending */
if (action == COMPOSE_WRITE_FOR_SEND && compose->use_signing &&
privacy_system_can_sign(compose->privacy_system))
- if (!privacy_sign(compose->privacy_system, mimemsg, compose->account))
+ if (!privacy_sign(compose->privacy_system, mimemsg,
+ compose->account, from_addr)) {
+ g_free(from_name);
+ g_free(from_addr);
return -2;
-
+ }
+ g_free(from_name);
+ g_free(from_addr);
procmime_write_mimeinfo(mimemsg, fp);
procmime_mimeinfo_free_all(mimemsg);
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn))) {
gchar *savefolderid;
- savefolderid = gtk_editable_get_chars(GTK_EDITABLE(compose->savemsg_entry), 0, -1);
+ savefolderid = compose_get_save_to(compose);
err |= (fprintf(fp, "SCF:%s\n", savefolderid) < 0);
g_free(savefolderid);
}
g_free(folderid);
}
+ err |= (fprintf(fp, "X-Claws-Auto-Wrapping:%d\n", compose->autowrap) < 0);
+ err |= (fprintf(fp, "X-Claws-Auto-Indent:%d\n", compose->autoindent) < 0);
+
/* end of headers */
err |= (fprintf(fp, "X-Claws-End-Special-Headers: 1\n") < 0);
mimepart->tmp = FALSE; /* or we destroy our attachment */
mimepart->offset = 0;
- stat(ainfo->file, &statbuf);
+ g_stat(ainfo->file, &statbuf);
mimepart->length = statbuf.st_size;
type = g_strdup(ainfo->content_type);
mimepart->disposition = DISPOSITIONTYPE_INLINE;
} else {
if (ainfo->name) {
- g_hash_table_insert(mimepart->typeparameters,
- g_strdup("name"), g_strdup(ainfo->name));
+ if (mimepart->type == MIMETYPE_APPLICATION &&
+ !strcmp2(mimepart->subtype, "octet-stream"))
+ g_hash_table_insert(mimepart->typeparameters,
+ g_strdup("name"), g_strdup(ainfo->name));
g_hash_table_insert(mimepart->dispositionparameters,
g_strdup("filename"), g_strdup(ainfo->name));
mimepart->disposition = DISPOSITIONTYPE_ATTACHMENT;
for (list = compose->header_list; list; list = list->next) {
headerentry = ((ComposeHeaderEntry *)list->data);
- headerentryname = gtk_entry_get_text(GTK_ENTRY(GTK_BIN(headerentry->combo)->child));
+ headerentryname = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((headerentry->combo)))));
if (!g_utf8_collate(trans_fieldname, headerentryname)) {
str = gtk_editable_get_chars(GTK_EDITABLE(headerentry->entry), 0, -1);
headerentry = ((ComposeHeaderEntry *)list->data);
- tmp = g_strdup(gtk_entry_get_text(GTK_ENTRY(GTK_BIN(headerentry->combo)->child)));
+ tmp = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((headerentry->combo))))));
g_strstrip(tmp);
if (*tmp == '\0' || strchr(tmp, ' ') != NULL || strchr(tmp, '\r') != NULL || strchr(tmp, '\n') != NULL) {
g_free(tmp);
string++;
}
gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
- g_signal_connect(G_OBJECT(GTK_BIN(combo)->child), "grab_focus",
+ g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN((combo)))), "grab_focus",
G_CALLBACK(compose_grab_focus_cb), compose);
gtk_widget_show(combo);
gtk_table_attach(GTK_TABLE(compose->header_table), combo, 0, 1,
GTK_SHRINK, GTK_FILL, 0, 0);
if (compose->header_last) {
const gchar *last_header_entry = gtk_entry_get_text(
- GTK_ENTRY(GTK_BIN(compose->header_last->combo)->child));
+ GTK_ENTRY(gtk_bin_get_child(GTK_BIN((compose->header_last->combo)))));
string = headers;
while (*string != NULL) {
if (!strcmp(*string, last_header_entry))
string++;
}
if (standard_header)
- header = gtk_entry_get_text(GTK_ENTRY(GTK_BIN(compose->header_last->combo)->child));
+ header = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((compose->header_last->combo)))));
}
if (!compose->header_last || !standard_header) {
switch(compose->account->protocol) {
}
}
if (header)
- gtk_entry_set_text(GTK_ENTRY(GTK_BIN(combo)->child), header);
+ gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((combo)))), header);
- g_signal_connect_after(G_OBJECT(GTK_BIN(combo)->child), "grab_focus",
+ g_signal_connect_after(G_OBJECT(gtk_bin_get_child(GTK_BIN((combo)))), "grab_focus",
G_CALLBACK(compose_grab_focus_cb), compose);
/* Entry field */
last_header = compose->header_last;
- gtk_entry_set_text(GTK_ENTRY(GTK_BIN(last_header->combo)->child), header);
+ gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((last_header->combo)))), header);
gtk_entry_set_text(GTK_ENTRY(last_header->entry), text);
}
gtk_widget_show(header_table);
gtk_container_set_border_width(GTK_CONTAINER(header_table), BORDER_WIDTH);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(header_scrolledwin), header_table);
- gtk_viewport_set_shadow_type(GTK_VIEWPORT(GTK_BIN(header_scrolledwin)->child), GTK_SHADOW_NONE);
+ gtk_viewport_set_shadow_type(GTK_VIEWPORT(gtk_bin_get_child(GTK_BIN((header_scrolledwin)))), GTK_SHADOW_NONE);
count = 0;
/* option menu for selecting accounts */
{
GtkWidget *table;
GtkWidget *savemsg_checkbtn;
- GtkWidget *savemsg_entry;
+ GtkWidget *savemsg_combo;
GtkWidget *savemsg_select;
guint rowcount = 0;
g_signal_connect(G_OBJECT(savemsg_checkbtn), "toggled",
G_CALLBACK(compose_savemsg_checkbtn_cb), compose);
- savemsg_entry = gtk_entry_new();
- gtk_widget_show(savemsg_entry);
- gtk_table_attach_defaults(GTK_TABLE(table), savemsg_entry, 1, 2, rowcount, rowcount + 1);
- gtk_editable_set_editable(GTK_EDITABLE(savemsg_entry), prefs_common.savemsg);
- g_signal_connect_after(G_OBJECT(savemsg_entry), "grab_focus",
+ savemsg_combo = gtk_combo_box_entry_new_text();
+ compose->savemsg_checkbtn = savemsg_checkbtn;
+ compose->savemsg_combo = savemsg_combo;
+ gtk_widget_show(savemsg_combo);
+
+ if (prefs_common.compose_save_to_history)
+ combobox_set_popdown_strings(GTK_COMBO_BOX(savemsg_combo),
+ prefs_common.compose_save_to_history);
+
+ gtk_table_attach(GTK_TABLE(table), savemsg_combo, 1, 2, rowcount, rowcount + 1, GTK_FILL|GTK_EXPAND, GTK_SHRINK, 0, 0);
+ gtk_widget_set_sensitive(GTK_WIDGET(savemsg_combo), prefs_common.savemsg);
+ g_signal_connect_after(G_OBJECT(savemsg_combo), "grab_focus",
G_CALLBACK(compose_grab_focus_cb), compose);
if (account_get_special_folder(compose->account, F_OUTBOX)) {
folderidentifier = folder_item_get_identifier(account_get_special_folder
(compose->account, F_OUTBOX));
- gtk_entry_set_text(GTK_ENTRY(savemsg_entry), folderidentifier);
+ compose_set_save_to(compose, folderidentifier);
g_free(folderidentifier);
}
rowcount++;
- compose->savemsg_checkbtn = savemsg_checkbtn;
- compose->savemsg_entry = savemsg_entry;
-
return table;
}
static void compose_savemsg_checkbtn_cb(GtkWidget *widget, Compose *compose)
{
- gtk_editable_set_editable(GTK_EDITABLE(compose->savemsg_entry),
+ gtk_widget_set_sensitive(GTK_WIDGET(compose->savemsg_combo),
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn)));
}
path = folder_item_get_identifier(dest);
- gtk_entry_set_text(GTK_ENTRY(compose->savemsg_entry), path);
+ compose_set_save_to(compose, path);
g_free(path);
}
{
gint prev_autowrap;
GtkTextBuffer *buffer = GTK_TEXT_VIEW(text)->buffer;
-#if USE_ASPELL
+#if USE_ENCHANT
if (event->button == 3) {
GtkTextIter iter;
GtkTextIter sel_start, sel_end;
return FALSE;
}
-#if USE_ASPELL
+#if USE_ENCHANT
static void compose_spell_menu_changed(void *data)
{
Compose *compose = (Compose *)data;
if (parent_item == NULL) {
parent_item = compose->aspell_options_menu;
- gtk_menu_item_remove_submenu(GTK_MENU_ITEM(parent_item));
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(parent_item), NULL);
} else
compose->aspell_options_menu = parent_item;
GtkWidget *tmpl_menu;
GtkActionGroup *action_group = NULL;
-#if USE_ASPELL
+#if USE_ENCHANT
GtkAspell * gtkaspell = NULL;
#endif
&geometry, GDK_HINT_MAX_SIZE);
if (!geometry.min_width) {
geometry.min_width = 600;
- geometry.min_height = 480;
+ geometry.min_height = 440;
}
gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL,
&geometry, GDK_HINT_MIN_SIZE);
#ifndef GENERIC_UMPC
if (compose_force_window_origin)
- gtk_widget_set_uposition(window, prefs_common.compose_x,
+ gtk_window_move(GTK_WINDOW(window), prefs_common.compose_x,
prefs_common.compose_y);
#endif
g_signal_connect(G_OBJECT(window), "delete_event",
gtk_action_group_add_radio_actions(action_group, compose_radio_enc_entries,
G_N_ELEMENTS(compose_radio_enc_entries), C_AUTO, G_CALLBACK(compose_set_encoding_cb), (gpointer)compose);
+#ifndef MAEMO
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_MENUBAR)
+#else
+ MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_POPUP)
+#endif
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu", "Message", "Message", GTK_UI_MANAGER_MENU)
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu", "Edit", "Edit", GTK_UI_MANAGER_MENU)
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu", "Spelling", "Spelling", GTK_UI_MANAGER_MENU)
#endif
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu", "Options", "Options", GTK_UI_MANAGER_MENU)
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Edit", "WrapPara", "Edit/WrapPara", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Edit", "WrapAllLines", "Edit/WrapAllLines", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Edit", "AutoWrap", "Edit/AutoWrap", GTK_UI_MANAGER_MENUITEM)
+ MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Edit", "AutoIndent", "Edit/AutoIndent", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Edit", "Separator3", "Edit/---", GTK_UI_MANAGER_SEPARATOR)
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Edit", "ExtEditor", "Edit/ExtEditor", GTK_UI_MANAGER_MENUITEM)
-#if USE_ASPELL
+#if USE_ENCHANT
/* Spelling menu */
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Spelling", "CheckAllSel", "Spelling/CheckAllSel", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Spelling", "HighlightAll", "Spelling/HighlightAll", GTK_UI_MANAGER_MENUITEM)
gtk_widget_show_all(menubar);
gtk_window_add_accel_group(GTK_WINDOW(window), gtk_ui_manager_get_accel_group(compose->ui_manager));
+#ifndef MAEMO
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
+#else
+ hildon_window_set_menu(HILDON_WINDOW(window), GTK_MENU(menubar));
+#endif
if (prefs_common.toolbar_detachable) {
handlebox = gtk_handle_box_new();
/* pane between attach clist and text */
paned = gtk_vpaned_new();
- gtk_paned_set_gutter_size(GTK_PANED(paned), 12);
gtk_container_add(GTK_CONTAINER(vbox2), paned);
#ifdef MAEMO
if( maemo_mainwindow_is_fullscreen(mainwindow_get_mainwindow()->window) )
compose->boundary = NULL;
compose->autowrap = prefs_common.autowrap;
-
+ compose->autoindent = prefs_common.auto_indent;
compose->use_signing = FALSE;
compose->use_encryption = FALSE;
compose->privacy_system = NULL;
compose->exteditor_tag = -1;
compose->draft_timeout_tag = -2; /* inhibit auto-drafting while loading */
-#if USE_ASPELL
+#if USE_ENCHANT
cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Spelling", FALSE);
if (mode != COMPOSE_REDIRECT) {
if (prefs_common.enable_aspell && prefs_common.dictionary &&
strcmp(prefs_common.dictionary, "")) {
- gtkaspell = gtkaspell_new(prefs_common.aspell_path,
- prefs_common.dictionary,
+ gtkaspell = gtkaspell_new(prefs_common.dictionary,
prefs_common.alt_dictionary,
conv_get_locale_charset_str(),
prefs_common.misspelled_col,
gtkaspell_checkers_strerror());
gtkaspell_checkers_reset_error();
} else {
- if (!gtkaspell_set_sug_mode(gtkaspell,
- prefs_common.aspell_sugmode)) {
- debug_print("Aspell: could not set "
- "suggestion mode %s\n",
- gtkaspell_checkers_strerror());
- gtkaspell_checkers_reset_error();
- }
-
cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Spelling", TRUE);
}
}
compose_select_account(compose, account, TRUE);
cm_toggle_menu_set_active_full(compose->ui_manager, "Menu/Edit/AutoWrap", prefs_common.autowrap);
+ cm_toggle_menu_set_active_full(compose->ui_manager, "Menu/Edit/AutoIndent", prefs_common.auto_indent);
if (account->set_autocc && account->auto_cc && mode != COMPOSE_REEDIT)
compose_entry_append(compose, account->auto_cc, COMPOSE_CC);
cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Options/ReplyMode", compose->mode == COMPOSE_REPLY);
if (account->protocol != A_NNTP)
- gtk_entry_set_text(GTK_ENTRY(GTK_BIN(compose->header_last->combo)->child),
+ gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((compose->header_last->combo)))),
prefs_common_translated_header_name("To:"));
else
- gtk_entry_set_text(GTK_ENTRY(GTK_BIN(compose->header_last->combo)->child),
+ gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((compose->header_last->combo)))),
prefs_common_translated_header_name("Newsgroups:"));
addressbook_set_target_compose(compose);
gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
Compose *compose = (Compose *) data;
if (active) {
- printf("activated %d\n", value);
compose->priority = value;
}
}
systemid = g_object_get_data(G_OBJECT(amenu->data), "privacy_system");
if (systemid != NULL) {
- if (strcmp(systemid, compose->privacy_system) == 0) {
+ if (strcmp(systemid, compose->privacy_system) == 0 &&
+ GTK_IS_CHECK_MENU_ITEM(amenu->data)) {
menuitem = GTK_WIDGET(amenu->data);
can_sign = privacy_system_can_sign(systemid);
found = TRUE;
break;
}
- } else if (strlen(compose->privacy_system) == 0) {
+ } else if (strlen(compose->privacy_system) == 0 &&
+ GTK_IS_CHECK_MENU_ITEM(amenu->data)) {
menuitem = GTK_WIDGET(amenu->data);
can_sign = FALSE;
}
if (tmpl->from && *tmpl->from != '\0') {
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
quote_fmt_init(msginfo, NULL, NULL, FALSE, compose->account, FALSE,
compose->gtkaspell);
#else
}
if (tmpl->to && *tmpl->to != '\0') {
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
quote_fmt_init(msginfo, NULL, NULL, FALSE, compose->account, FALSE,
compose->gtkaspell);
#else
}
if (tmpl->cc && *tmpl->cc != '\0') {
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
quote_fmt_init(msginfo, NULL, NULL, FALSE, compose->account, FALSE,
compose->gtkaspell);
#else
}
if (tmpl->bcc && *tmpl->bcc != '\0') {
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
quote_fmt_init(msginfo, NULL, NULL, FALSE, compose->account, FALSE,
compose->gtkaspell);
#else
/* process the subject */
if (tmpl->subject && *tmpl->subject != '\0') {
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
quote_fmt_init(msginfo, NULL, NULL, FALSE, compose->account, FALSE,
compose->gtkaspell);
#else
if (addressbook_get_target_compose() == compose)
addressbook_set_target_compose(NULL);
-#if USE_ASPELL
+#if USE_ENCHANT
if (compose->gtkaspell) {
gtkaspell_delete(compose->gtkaspell);
compose->gtkaspell = NULL;
}
#endif
- prefs_common.compose_width = compose->scrolledwin->allocation.width;
- prefs_common.compose_height = compose->window->allocation.height;
+ if (!compose->batch) {
+ prefs_common.compose_width = compose->scrolledwin->allocation.width;
+ prefs_common.compose_height = compose->window->allocation.height;
+ }
if (!gtk_widget_get_parent(compose->paned))
gtk_widget_destroy(compose->paned);
}
g_list_free(strlist);
gtk_combo_box_set_active(GTK_COMBO_BOX(mimetype_entry), 0);
- mimetype_entry = GTK_BIN(mimetype_entry)->child;
+ mimetype_entry = gtk_bin_get_child(GTK_BIN((mimetype_entry)));
label = gtk_label_new(_("Encoding"));
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
*cancelled = TRUE;
gtk_main_quit();
}
+ if (event && event->keyval == GDK_Return) {
+ *cancelled = FALSE;
+ gtk_main_quit();
+ }
return FALSE;
}
compose_set_ext_editor_sensitive(compose, FALSE);
+#ifndef G_OS_WIN32
compose->exteditor_ch = g_io_channel_unix_new(pipe_fds[0]);
+#else
+ compose->exteditor_ch = g_io_channel_win32_new_fd(pipe_fds[0]);
+#endif
compose->exteditor_tag = g_io_add_watch(compose->exteditor_ch,
G_IO_IN,
compose_input_cb,
g_snprintf(buf, sizeof(buf), prefs_common_get_ext_editor_cmd(), file);
} else {
if (prefs_common_get_ext_editor_cmd())
- g_warning("External editor command line is invalid: '%s'\n",
+ g_warning("External editor command-line is invalid: '%s'\n",
prefs_common_get_ext_editor_cmd());
g_snprintf(buf, sizeof(buf), DEFAULT_EDITOR_CMD, file);
}
gtk_text_buffer_set_text(buffer, "", -1);
compose_insert_file(compose, compose->exteditor_file);
compose_changed_cb(NULL, compose);
+ compose_draft((gpointer)compose, COMPOSE_AUTO_SAVE);
if (claws_unlink(compose->exteditor_file) < 0)
FILE_OP_ERROR(compose->exteditor_file, "unlink");
g_signal_connect(G_OBJECT(compose->savemsg_checkbtn), "toggled",
G_CALLBACK(compose_savemsg_checkbtn_cb), compose);
- gtk_editable_delete_text(GTK_EDITABLE(compose->savemsg_entry), 0, -1);
+ compose_set_save_to(compose, NULL);
if (account_get_special_folder(compose->account, F_OUTBOX)) {
folderidentifier = folder_item_get_identifier(account_get_special_folder
(compose->account, F_OUTBOX));
- gtk_entry_set_text(GTK_ENTRY(compose->savemsg_entry), folderidentifier);
+ compose_set_save_to(compose, folderidentifier);
g_free(folderidentifier);
}
}
toolbar_comp_set_sensitive(compose, allow);
cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Message", allow);
cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Edit", allow);
-#if USE_ASPELL
+#if USE_ENCHANT
cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Spelling", allow);
#endif
cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Options", allow);
{
gchar *filepath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
DRAFTED_AT_EXIT, NULL);
- FILE *fp = fopen(filepath, "ab");
+ FILE *fp = g_fopen(filepath, "ab");
if (fp) {
fprintf(fp, "%s\t%d\n", folder_item_get_identifier(info->folder),
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn))) {
gchar *savefolderid;
- savefolderid = gtk_editable_get_chars(GTK_EDITABLE(compose->savemsg_entry), 0, -1);
+ savefolderid = compose_get_save_to(compose);
err |= (fprintf(fp, "SCF:%s\n", savefolderid) < 0);
g_free(savefolderid);
}
g_free(folderid);
}
+ err |= (fprintf(fp, "X-Claws-Auto-Wrapping:%d\n", compose->autowrap) < 0);
+ err |= (fprintf(fp, "X-Claws-Auto-Indent:%d\n", compose->autoindent) < 0);
+
/* end of headers */
err |= (fprintf(fp, "X-Claws-End-Special-Headers: 1\n") < 0);
{
gchar *filepath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
DRAFTED_AT_EXIT, NULL);
- FILE *fp = fopen(filepath, "rb");
+ FILE *fp = g_fopen(filepath, "rb");
gchar buf[1024];
if (fp) {
static void compose_save_cb(GtkAction *action, gpointer data)
{
- compose_draft(data, COMPOSE_KEEP_EDITING);
+ Compose *compose = (Compose *)data;
+ compose_draft(compose, COMPOSE_KEEP_EDITING);
+ compose->rmode = COMPOSE_REEDIT;
}
static void compose_attach_from_list(Compose *compose, GList *file_list, gboolean free_data)
Compose *compose = (Compose *)data;
gtkut_widget_get_uposition(widget, &x, &y);
- prefs_common.compose_x = x;
- prefs_common.compose_y = y;
-
+ if (!compose->batch) {
+ prefs_common.compose_x = x;
+ prefs_common.compose_y = y;
+ }
if (compose->sending || compose->updating)
return TRUE;
compose_close_cb(NULL, compose);
#endif
if (compose->modified) {
+ gboolean reedit = (compose->rmode == COMPOSE_REEDIT);
if (!g_mutex_trylock(compose->mutex)) {
/* we don't want to lock the mutex once it's available,
* because as the only other part of compose.c locking
debug_print("couldn't lock mutex, probably sending\n");
return;
}
- val = alertpanel(_("Discard message"),
+ if (!reedit) {
+ val = alertpanel(_("Discard message"),
_("This message has been modified. Discard it?"),
_("_Discard"), _("_Save to Drafts"), GTK_STOCK_CANCEL);
+ } else {
+ val = alertpanel(_("Save changes"),
+ _("This message has been modified. Save the latest changes?"),
+ _("_Don't save"), _("+_Save to Drafts"), GTK_STOCK_CANCEL);
+ }
g_mutex_unlock(compose->mutex);
switch (val) {
case G_ALERTDEFAULT:
- if (prefs_common.autosave)
+ if (prefs_common.autosave && !reedit)
compose_remove_draft(compose);
break;
case G_ALERTALTERNATE:
if (contents == NULL)
return;
-
- undo_paste_clipboard(GTK_TEXT_VIEW(compose->text), compose->undostruct);
-
+
/* we shouldn't delete the selection when middle-click-pasting, or we
* can't mid-click-paste our own selection */
if (clip != GDK_SELECTION_PRIMARY) {
+ undo_paste_clipboard(GTK_TEXT_VIEW(compose->text), compose->undostruct);
gtk_text_buffer_delete_selection(buffer, FALSE, TRUE);
}
* used for mid-click-pasting */
start = gtk_text_iter_get_offset(insert_place);
gtk_text_buffer_insert(buffer, insert_place, contents, strlen(contents));
+ if (prefs_common.primary_paste_unselects)
+ gtk_text_buffer_select_range(buffer, insert_place, insert_place);
}
if (!wrap) {
#ifdef GENERIC_UMPC
if (GTK_IS_TEXT_VIEW(widget)
&& gtk_paned_get_child1(GTK_PANED(compose->paned)) != compose->edit_vbox) {
- gtk_widget_ref(compose->notebook);
- gtk_widget_ref(compose->edit_vbox);
+ g_object_ref(compose->notebook);
+ g_object_ref(compose->edit_vbox);
gtk_container_remove(GTK_CONTAINER(compose->paned), compose->notebook);
gtk_container_remove(GTK_CONTAINER(compose->paned), compose->edit_vbox);
gtk_paned_add1(GTK_PANED(compose->paned), compose->edit_vbox);
gtk_paned_add2(GTK_PANED(compose->paned), compose->notebook);
- gtk_widget_unref(compose->notebook);
- gtk_widget_unref(compose->edit_vbox);
+ g_object_unref(compose->notebook);
+ g_object_unref(compose->edit_vbox);
g_signal_handlers_block_by_func(G_OBJECT(widget),
G_CALLBACK(compose_grab_focus_cb),
compose);
compose);
} else if (!GTK_IS_TEXT_VIEW(widget)
&& gtk_paned_get_child1(GTK_PANED(compose->paned)) != compose->notebook) {
- gtk_widget_ref(compose->notebook);
- gtk_widget_ref(compose->edit_vbox);
+ g_object_ref(compose->notebook);
+ g_object_ref(compose->edit_vbox);
gtk_container_remove(GTK_CONTAINER(compose->paned), compose->notebook);
gtk_container_remove(GTK_CONTAINER(compose->paned), compose->edit_vbox);
gtk_paned_add1(GTK_PANED(compose->paned), compose->notebook);
gtk_paned_add2(GTK_PANED(compose->paned), compose->edit_vbox);
- gtk_widget_unref(compose->notebook);
- gtk_widget_unref(compose->edit_vbox);
+ g_object_unref(compose->notebook);
+ g_object_unref(compose->edit_vbox);
g_signal_handlers_block_by_func(G_OBJECT(widget),
G_CALLBACK(compose_grab_focus_cb),
compose);
compose->autowrap = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
}
+static void compose_toggle_autoindent_cb(GtkToggleAction *action,
+ gpointer data)
+{
+ Compose *compose = (Compose *)data;
+ compose->autoindent = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
+}
+
static void compose_toggle_sign_cb(GtkToggleAction *action, gpointer data)
{
Compose *compose = (Compose *)data;
Compose *compose = (Compose *)user_data;
GList *list, *tmp;
- if (gdk_atom_name(data->type) &&
- !strcmp(gdk_atom_name(data->type), "text/uri-list")
- && gtk_drag_get_source_widget(context) !=
+ if (((gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "text/uri-list"))
+#ifdef G_OS_WIN32
+ || (gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "DROPFILES_DND"))
+#endif
+ ) && gtk_drag_get_source_widget(context) !=
summary_get_main_widget(mainwindow_get_mainwindow()->summaryview)) {
list = uri_list_extract_filenames((const gchar *)data->data);
for (tmp = list; tmp != NULL; tmp = tmp->next) {
/* strangely, testing data->type == gdk_atom_intern("text/uri-list", TRUE)
* does not work */
+ debug_print("drop: %s (%s)\n", gdk_atom_name(data->type)?gdk_atom_name(data->type):"nul",
+ (gchar *)(data->data?data->data:"nul"));
+#ifndef G_OS_WIN32
if (gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "text/uri-list")) {
+#else
+ if (gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "DROPFILES_DND")) {
+#endif
AlertValue val = G_ALERTDEFAULT;
list = uri_list_extract_filenames((const gchar *)data->data);
-
+ debug_print("list: %p (%s)\n", list,
+ (gchar *)(data->data?data->data:"nul"));
if (list == NULL && strstr((gchar *)(data->data), "://")) {
/* Assume a list of no files, and data has ://, is a remote link */
gchar *tmpdata = g_strstrip(g_strdup((const gchar *)data->data));
gtk_text_buffer_delete_mark(buffer, mark);
} else {
if (strcmp(text, "\n") || compose->automatic_break
- || gtk_text_iter_starts_line(iter))
+ || gtk_text_iter_starts_line(iter)) {
+ GtkTextIter before_ins;
gtk_text_buffer_insert(buffer, iter, text, len);
- else {
+ if (!strstr(text, "\n") && gtk_text_iter_has_tag(iter, compose->no_join_tag)) {
+ before_ins = *iter;
+ gtk_text_iter_backward_chars(&before_ins, len);
+ gtk_text_buffer_remove_tag_by_name(buffer, "no_join", &before_ins, iter);
+ }
+ } else {
/* check if the preceding is just whitespace or quote */
GtkTextIter start_line;
gchar *tmp = NULL, *quote = NULL;
gtk_text_iter_set_line_offset(&start_line, 0);
tmp = gtk_text_buffer_get_text(buffer, &start_line, iter, FALSE);
g_strstrip(tmp);
+
if (*tmp == '\0') {
is_normal = 1;
} else {
return FALSE;
}
-#if USE_ASPELL
+#if USE_ENCHANT
static void compose_check_all(GtkAction *action, gpointer data)
{
Compose *compose = (Compose *)data;
}
g_return_val_if_fail(compose, FALSE);
gtkut_widget_get_uposition(compose->window, &x, &y);
- prefs_common.compose_x = x;
- prefs_common.compose_y = y;
+ if (!compose->batch) {
+ prefs_common.compose_x = x;
+ prefs_common.compose_y = y;
+ }
g_mutex_unlock(compose->mutex);
compose_destroy(compose);
return FALSE;
GSList *new_msglist = NULL;
MsgInfo *tmp_msginfo = NULL;
gboolean originally_enc = FALSE;
+ gboolean originally_sig = FALSE;
Compose *compose = NULL;
g_return_if_fail(msgview != NULL);
new_msglist = g_slist_append(NULL, tmp_msginfo);
originally_enc = MSG_IS_ENCRYPTED(orig_msginfo->flags);
+ privacy_msginfo_get_signed_state(orig_msginfo);
+ originally_sig = MSG_IS_SIGNED(orig_msginfo->flags);
+
tmp_msginfo->folder = orig_msginfo->folder;
tmp_msginfo->msgnum = orig_msginfo->msgnum;
if (orig_msginfo->tags)
compose_force_encryption(compose, compose->account, FALSE);
}
+ if (compose && originally_sig && compose->account->default_sign_reply) {
+ compose_force_signing(compose, compose->account);
+ }
+
g_free(body);
}
for (list = compose->header_list; list; list = list->next) {
gchar *header = gtk_editable_get_chars(
GTK_EDITABLE(
- GTK_BIN(((ComposeHeaderEntry *)list->data)->combo)->child), 0, -1);
+ gtk_bin_get_child(GTK_BIN((((ComposeHeaderEntry *)list->data)->combo)))), 0, -1);
gchar *entry = gtk_editable_get_chars(
GTK_EDITABLE(((ComposeHeaderEntry *)list->data)->entry), 0, -1);
return newmsginfo;
}
-#ifdef USE_ASPELL
+#ifdef USE_ENCHANT
/* update compose's dictionaries from folder dict settings */
static void compose_set_dictionaries_from_folder_prefs(Compose *compose,
FolderItem *folder_item)