evolution r35282 - in branches/mbarnes-composer: composer mail
- From: mbarnes svn gnome org
- To: svn-commits-list gnome org
- Subject: evolution r35282 - in branches/mbarnes-composer: composer mail
- Date: Sat, 29 Mar 2008 05:22:41 +0000 (GMT)
Author: mbarnes
Date: Sat Mar 29 05:22:40 2008
New Revision: 35282
URL: http://svn.gnome.org/viewvc/evolution?rev=35282&view=rev
Log:
More bugfixing and code cleanup.
Trim fat off the EMsgComposer API.
Removed:
branches/mbarnes-composer/composer/e-msg-composer-select-file.c
branches/mbarnes-composer/composer/e-msg-composer-select-file.h
Modified:
branches/mbarnes-composer/composer/Makefile.am
branches/mbarnes-composer/composer/e-composer-actions.c
branches/mbarnes-composer/composer/e-composer-autosave.c
branches/mbarnes-composer/composer/e-composer-private.h
branches/mbarnes-composer/composer/e-msg-composer.c
branches/mbarnes-composer/composer/e-msg-composer.h
branches/mbarnes-composer/mail/em-composer-prefs.c
branches/mbarnes-composer/mail/em-composer-utils.c
Modified: branches/mbarnes-composer/composer/Makefile.am
==============================================================================
--- branches/mbarnes-composer/composer/Makefile.am (original)
+++ branches/mbarnes-composer/composer/Makefile.am Sat Mar 29 05:22:40 2008
@@ -46,8 +46,6 @@
e-composer-private.h \
e-composer-text-header.c \
e-composer-text-header.h \
- e-msg-composer-select-file.c \
- e-msg-composer-select-file.h \
e-msg-composer.c \
e-msg-composer.h \
gconf-bridge.c \
Modified: branches/mbarnes-composer/composer/e-composer-actions.c
==============================================================================
--- branches/mbarnes-composer/composer/e-composer-actions.c (original)
+++ branches/mbarnes-composer/composer/e-composer-actions.c Sat Mar 29 05:22:40 2008
@@ -69,8 +69,6 @@
camel_url_free (url);
}
- e_msg_composer_show_attachments_ui (composer);
-
g_slist_foreach (uris, (GFunc) g_free, NULL);
g_slist_free (uris);
@@ -82,11 +80,14 @@
action_close_cb (GtkAction *action,
EMsgComposer *composer)
{
+ GtkhtmlEditor *editor;
EComposerHeaderTable *table;
const gchar *subject;
gint response;
- if (!e_msg_composer_is_dirty (composer) &&
+ editor = GTKHTML_EDITOR (composer);
+
+ if (!gtkhtml_editor_get_changed (editor) &&
!e_composer_autosave_get_saved (composer)) {
gtk_widget_destroy (GTK_WIDGET (composer));
@@ -124,14 +125,20 @@
action_pgp_encrypt_cb (GtkToggleAction *action,
EMsgComposer *composer)
{
- e_msg_composer_set_changed (composer);
+ GtkhtmlEditor *editor;
+
+ editor = GTKHTML_EDITOR (composer);
+ gtkhtml_editor_set_changed (editor, TRUE);
}
static void
action_pgp_sign_cb (GtkToggleAction *action,
EMsgComposer *composer)
{
- e_msg_composer_set_changed (composer);
+ GtkhtmlEditor *editor;
+
+ editor = GTKHTML_EDITOR (composer);
+ gtkhtml_editor_set_changed (editor, TRUE);
}
static void
@@ -173,6 +180,7 @@
GtkhtmlEditor *editor = GTKHTML_EDITOR (composer);
const gchar *filename;
gint fd;
+ GError *error = NULL;
filename = gtkhtml_editor_get_filename (editor);
if (filename == NULL) {
@@ -204,6 +212,15 @@
} else
close (fd);
+ if (!gtkhtml_editor_save (editor, filename, TRUE, &error)) {
+ e_error_run (
+ GTK_WINDOW (composer),
+ E_ERROR_NO_SAVE_FILE,
+ filename, error->message);
+ g_error_free (error);
+ return;
+ }
+
gtkhtml_editor_run_command (GTKHTML_EDITOR (composer), "saved");
e_composer_autosave_set_saved (composer, FALSE);
}
@@ -213,6 +230,7 @@
EMsgComposer *composer)
{
GtkWidget *dialog;
+ gchar *filename;
gint response;
dialog = gtk_file_chooser_dialog_new (
@@ -232,9 +250,16 @@
response = gtkhtml_editor_file_chooser_dialog_run (
GTKHTML_EDITOR (composer), dialog);
- if (response == GTK_RESPONSE_OK)
- gtk_action_activate (ACTION (SAVE));
+ if (response != GTK_RESPONSE_OK)
+ goto exit;
+
+ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+ gtkhtml_editor_set_filename (GTKHTML_EDITOR (composer), filename);
+ g_free (filename);
+
+ gtk_action_activate (ACTION (SAVE));
+exit:
gtk_widget_destroy (dialog);
}
@@ -278,14 +303,20 @@
action_smime_encrypt_cb (GtkToggleAction *action,
EMsgComposer *composer)
{
- e_msg_composer_set_changed (composer);
+ GtkhtmlEditor *editor;
+
+ editor = GTKHTML_EDITOR (composer);
+ gtkhtml_editor_set_changed (editor, TRUE);
}
static void
action_smime_sign_cb (GtkToggleAction *action,
EMsgComposer *composer)
{
- e_msg_composer_set_changed (composer);
+ GtkhtmlEditor *editor;
+
+ editor = GTKHTML_EDITOR (composer);
+ gtkhtml_editor_set_changed (editor, TRUE);
}
static void
Modified: branches/mbarnes-composer/composer/e-composer-autosave.c
==============================================================================
--- branches/mbarnes-composer/composer/e-composer-autosave.c (original)
+++ branches/mbarnes-composer/composer/e-composer-autosave.c Sat Mar 29 05:22:40 2008
@@ -233,6 +233,7 @@
gboolean
e_composer_autosave_snapshot (EMsgComposer *composer)
{
+ GtkhtmlEditor *editor;
CamelMimeMessage *message;
AutosaveState *state;
CamelStream *stream;
@@ -241,8 +242,10 @@
g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
+ editor = GTKHTML_EDITOR (composer);
+
/* If the contents are unchanged, exit early. */
- if (!e_msg_composer_is_dirty (composer))
+ if (!gtkhtml_editor_get_changed (editor))
return TRUE;
state = g_object_get_data (G_OBJECT (composer), "autosave");
@@ -302,8 +305,7 @@
}
/* Snapshot was successful; set various flags. */
- e_msg_composer_set_saved (composer);
- e_msg_composer_unset_changed (composer);
+ gtkhtml_editor_set_changed (editor, FALSE);
e_composer_autosave_set_saved (composer, TRUE);
camel_object_unref (message);
Modified: branches/mbarnes-composer/composer/e-composer-private.h
==============================================================================
--- branches/mbarnes-composer/composer/e-composer-private.h (original)
+++ branches/mbarnes-composer/composer/e-composer-private.h Sat Mar 29 05:22:40 2008
@@ -35,7 +35,6 @@
GtkWidget *header_table;
GtkActionGroup *action_group;
- gint visible_mask;
GPtrArray *extra_hdr_names, *extra_hdr_values;
GArray *gconf_bridge_binding_ids;
@@ -57,9 +56,7 @@
gchar *mime_type, *mime_body, *charset;
guint32 attachment_bar_visible : 1;
- guint32 send_html : 1;
guint32 is_alternative : 1;
- guint32 has_changed : 1;
guint32 autosaved : 1;
guint32 mode_post : 1;
Modified: branches/mbarnes-composer/composer/e-msg-composer.c
==============================================================================
--- branches/mbarnes-composer/composer/e-msg-composer.c (original)
+++ branches/mbarnes-composer/composer/e-msg-composer.c Sat Mar 29 05:22:40 2008
@@ -109,7 +109,6 @@
#include "e-composer-autosave.h"
#include "e-composer-private.h"
#include "e-composer-header-table.h"
-#include "e-msg-composer-select-file.h"
#include "evolution-shell-component-utils.h"
#include <e-util/e-icon-factory.h>
@@ -232,8 +231,6 @@
{ "text/calendar", NULL, GDK_ACTION_COPY }
};
-static const gchar *emc_draft_format_names[] = { "pgp-sign", "pgp-encrypt", "smime-sign", "smime-encrypt" };
-
static gpointer parent_class;
static guint signals[LAST_SIGNAL];
@@ -256,8 +253,6 @@
static void handle_multipart_encrypted (EMsgComposer *composer, CamelMimePart *multipart, gint depth);
static void handle_multipart_signed (EMsgComposer *composer, CamelMultipart *multipart, gint depth);
-static void set_editor_signature (EMsgComposer *composer);
-
static EDestination**
destination_list_to_vector_sized (GList *list, gint n)
{
@@ -604,7 +599,9 @@
}
static CamelMimeMessage *
-build_message (EMsgComposer *composer, gboolean save_html_object_data)
+build_message (EMsgComposer *composer,
+ gboolean html_content,
+ gboolean save_html_object_data)
{
GtkhtmlEditor *editor;
EMsgComposerPrivate *p = composer->priv;
@@ -725,7 +722,7 @@
camel_data_wrapper_set_mime_type_field (plain, type);
camel_content_type_unref (type);
- if (p->send_html) {
+ if (html_content) {
gchar *text;
gsize length;
@@ -1029,8 +1026,9 @@
}
/* Attach whether this message was written in HTML */
- camel_medium_set_header (CAMEL_MEDIUM (new), "X-Evolution-Format",
- p->send_html ? "text/html" : "text/plain");
+ camel_medium_set_header (
+ CAMEL_MEDIUM (new), "X-Evolution-Format",
+ html_content ? "text/html" : "text/plain");
return new;
@@ -1057,7 +1055,6 @@
return NULL;
}
-
static gchar *
get_file_content (EMsgComposer *composer,
const gchar *filename,
@@ -1392,21 +1389,6 @@
/* Commands. */
-static void
-show_attachments (EMsgComposer *composer,
- gboolean show)
-{
- EMsgComposerPrivate *p = composer->priv;
-
- gtk_expander_set_expanded (GTK_EXPANDER (p->attachment_expander), show);
- if (show)
- gtk_label_set_text_with_mnemonic (GTK_LABEL (composer->priv->attachment_expander_label),
- _("Hide _Attachment Bar"));
- else
- gtk_label_set_text_with_mnemonic (GTK_LABEL (composer->priv->attachment_expander_label),
- _("Show _Attachment Bar"));
-}
-
static EMsgComposer *
autosave_load_draft (const gchar *filename)
{
@@ -1492,53 +1474,65 @@
static void
attachment_bar_changed_cb (EAttachmentBar *bar,
- gpointer data)
+ EMsgComposer *composer)
{
- EMsgComposer *composer = E_MSG_COMPOSER (data);
- EMsgComposerPrivate *p = composer->priv;
+ GtkhtmlEditor *editor;
+ GtkWidget *widget;
+ guint attachment_num;
+
+ editor = GTKHTML_EDITOR (composer);
+ attachment_num = e_attachment_bar_get_num_attachments (bar);
+
+ if (attachment_num > 0) {
+ gchar *markup;
- guint attachment_num = e_attachment_bar_get_num_attachments (
- E_ATTACHMENT_BAR (p->attachment_bar));
- if (attachment_num) {
- gchar *num_text = g_strdup_printf (
- ngettext ("<b>%d</b> Attachment", "<b>%d</b> Attachments", attachment_num),
- attachment_num);
- gtk_label_set_markup (GTK_LABEL (p->attachment_expander_num),
- num_text);
- g_free (num_text);
+ markup = g_strdup_printf (
+ "<b>%d</b> %s", attachment_num, ngettext (
+ "Attachment", "Attachments", attachment_num));
+ widget = composer->priv->attachment_expander_num;
+ gtk_label_set_markup (GTK_LABEL (widget), markup);
+ g_free (markup);
- gtk_widget_show (p->attachment_expander_icon);
- show_attachments (composer, TRUE);
+ gtk_widget_show (composer->priv->attachment_expander_icon);
+
+ widget = composer->priv->attachment_expander;
+ gtk_expander_set_expanded (GTK_EXPANDER (widget), TRUE);
} else {
- gtk_label_set_text (GTK_LABEL (p->attachment_expander_num), "");
- gtk_widget_hide (p->attachment_expander_icon);
- show_attachments (composer, FALSE);
- }
+ widget = composer->priv->attachment_expander_num;
+ gtk_label_set_text (GTK_LABEL (widget), "");
+ gtk_widget_hide (composer->priv->attachment_expander_icon);
+
+ widget = composer->priv->attachment_expander;
+ gtk_expander_set_expanded (GTK_EXPANDER (widget), FALSE);
+ }
- /* Mark the composer as changed so it prompts about unsaved
- changes on close */
- e_msg_composer_set_changed (composer);
+ /* Mark the editor as changed so it prompts about unsaved
+ changes on close. */
+ gtkhtml_editor_set_changed (editor, TRUE);
}
static void
-attachment_expander_activate_cb (GtkExpander *expander,
- void *data)
+attachment_expander_notify_cb (GtkExpander *expander,
+ GParamSpec *pspec,
+ EMsgComposer *composer)
{
- EMsgComposer *composer = E_MSG_COMPOSER (data);
- gboolean show = gtk_expander_get_expanded (expander);
+ GtkLabel *label;
+ const gchar *text;
+
+ label = GTK_LABEL (composer->priv->attachment_expander_label);
/* Update the expander label */
- if (show)
- gtk_label_set_text_with_mnemonic (GTK_LABEL (composer->priv->attachment_expander_label),
- _("Hide _Attachment Bar"));
+ if (gtk_expander_get_expanded (expander))
+ text = _("Hide _Attachment Bar");
else
- gtk_label_set_text_with_mnemonic (GTK_LABEL (composer->priv->attachment_expander_label),
- _("Show _Attachment Bar"));
+ text = _("Show _Attachment Bar");
+
+ gtk_label_set_text_with_mnemonic (label, text);
}
static void
-subject_changed_cb (EMsgComposer *composer)
+msg_composer_subject_changed_cb (EMsgComposer *composer)
{
EComposerHeaderTable *table;
const gchar *subject;
@@ -1558,14 +1552,15 @@
};
static void
-update_auto_recipients (EComposerHeaderTable *table, int mode, const char *auto_addrs)
+update_auto_recipients (EComposerHeaderTable *table,
+ gint mode,
+ const gchar *auto_addrs)
{
EDestination *dest, **destv = NULL;
CamelInternetAddress *iaddr;
- GList *list, *tail, *node;
- gint i, n = 0;
-
- tail = list = NULL;
+ GList *list = NULL;
+ guint length;
+ gint i;
if (auto_addrs) {
iaddr = camel_internet_address_new ();
@@ -1585,20 +1580,7 @@
if (addr)
e_destination_set_email (dest, addr);
- node = g_list_alloc ();
- node->data = dest;
- node->next = NULL;
-
- if (tail) {
- node->prev = tail;
- tail->next = node;
- } else {
- node->prev = NULL;
- list = node;
- }
-
- tail = node;
- n++;
+ list = g_list_prepend (list, dest);
}
}
@@ -1619,27 +1601,19 @@
if (destv) {
for (i = 0; destv[i]; i++) {
if (!e_destination_is_auto_recipient (destv[i])) {
- node = g_list_alloc ();
- node->data = e_destination_copy (destv[i]);
- node->next = NULL;
-
- if (tail) {
- node->prev = tail;
- tail->next = node;
- } else {
- node->prev = NULL;
- list = node;
- }
-
- tail = node;
- n++;
+ dest = e_destination_copy (destv[i]);
+ list = g_list_prepend (list, dest);
}
}
e_destination_freev (destv);
}
- destv = destination_list_to_vector_sized (list, n);
+ list = g_list_reverse (list);
+
+ length = g_list_length (list);
+ destv = destination_list_to_vector_sized (list, length);
+
g_list_free (list);
switch (mode) {
@@ -1657,64 +1631,80 @@
}
static void
-account_changed_cb (EMsgComposer *composer)
+msg_composer_account_changed_cb (EMsgComposer *composer)
{
EMsgComposerPrivate *p = composer->priv;
EComposerHeaderTable *table;
GtkToggleAction *action;
+ ESignature *signature;
EAccount *account;
gboolean active;
+ const gchar *cc_addrs = NULL;
+ const gchar *bcc_addrs = NULL;
+ const gchar *uid;
table = e_msg_composer_get_header_table (composer);
account = e_composer_header_table_get_account (table);
- if (account) {
- action = GTK_TOGGLE_ACTION (ACTION (PGP_SIGN));
- active = account->pgp_always_sign &&
- (!account->pgp_no_imip_sign || !p->mime_type ||
- g_ascii_strncasecmp (p->mime_type, "text/calendar", 13) != 0);
- gtk_toggle_action_set_active (action, active);
-
- action = GTK_TOGGLE_ACTION (ACTION (SMIME_SIGN));
- active = account->smime_sign_default;
- gtk_toggle_action_set_active (action, active);
-
- action = GTK_TOGGLE_ACTION (ACTION (SMIME_ENCRYPT));
- active = account->smime_encrypt_default;
- gtk_toggle_action_set_active (action, active);
+ if (account == NULL)
+ goto exit;
- update_auto_recipients (table, UPDATE_AUTO_CC, account->always_cc ? account->cc_addrs : NULL);
- update_auto_recipients (table, UPDATE_AUTO_BCC, account->always_bcc ? account->bcc_addrs : NULL);
- } else {
- update_auto_recipients (table, UPDATE_AUTO_CC, NULL);
- update_auto_recipients (table, UPDATE_AUTO_BCC, NULL);
- }
+ action = GTK_TOGGLE_ACTION (ACTION (PGP_SIGN));
+ active = account->pgp_always_sign &&
+ (!account->pgp_no_imip_sign || p->mime_type == NULL ||
+ g_ascii_strncasecmp (p->mime_type, "text/calendar", 13) != 0);
+ gtk_toggle_action_set_active (action, active);
+
+ action = GTK_TOGGLE_ACTION (ACTION (SMIME_SIGN));
+ active = account->smime_sign_default;
+ gtk_toggle_action_set_active (action, active);
+
+ action = GTK_TOGGLE_ACTION (ACTION (SMIME_ENCRYPT));
+ active = account->smime_encrypt_default;
+ gtk_toggle_action_set_active (action, active);
+
+ if (account->always_cc)
+ cc_addrs = account->cc_addrs;
+ if (account->always_bcc)
+ bcc_addrs = account->bcc_addrs;
+
+ uid = account->id->sig_uid;
+ signature = uid ? mail_config_get_signature_by_uid (uid) : NULL;
+ e_composer_header_table_set_signature (table, signature);
+
+exit:
+ update_auto_recipients (table, UPDATE_AUTO_CC, cc_addrs);
+ update_auto_recipients (table, UPDATE_AUTO_BCC, bcc_addrs);
- set_editor_signature (composer);
e_msg_composer_show_sig_file (composer);
}
static void
-attach_message (EMsgComposer *composer, CamelMimeMessage *msg)
+msg_composer_attach_message (EMsgComposer *composer,
+ CamelMimeMessage *msg)
{
CamelMimePart *mime_part;
- const char *subject;
+ GString *description;
+ const gchar *subject;
EMsgComposerPrivate *p = composer->priv;
mime_part = camel_mime_part_new ();
camel_mime_part_set_disposition (mime_part, "inline");
subject = camel_mime_message_get_subject (msg);
- if (subject) {
- char *desc = g_strdup_printf (_("Attached message - %s"), subject);
- camel_mime_part_set_description (mime_part, desc);
- g_free (desc);
- } else
- camel_mime_part_set_description (mime_part, _("Attached message"));
+ description = g_string_new (_("Attached message"));
+ if (subject != NULL)
+ g_string_append_printf (description, " - %s", subject);
+ camel_mime_part_set_description (mime_part, description->str);
+ g_string_free (description, TRUE);
- camel_medium_set_content_object ((CamelMedium *)mime_part, (CamelDataWrapper *)msg);
+ camel_medium_set_content_object (
+ (CamelMedium *) mime_part, (CamelDataWrapper *) msg);
camel_mime_part_set_content_type (mime_part, "message/rfc822");
- e_attachment_bar_attach_mime_part (E_ATTACHMENT_BAR(p->attachment_bar), mime_part);
+
+ e_attachment_bar_attach_mime_part (
+ E_ATTACHMENT_BAR (p->attachment_bar), mime_part);
+
camel_object_unref (mime_part);
}
@@ -1737,33 +1727,22 @@
int
e_msg_composer_get_remote_download_count (EMsgComposer *composer)
{
- EMsgComposerPrivate *p = composer->priv;
- return e_attachment_bar_get_download_count
- (E_ATTACHMENT_BAR (p->attachment_bar));
-}
-
-static gchar *
-attachment_guess_mime_type (const char *filename)
-{
- GnomeVFSFileInfo *info;
- GnomeVFSResult result;
- gchar *type = NULL;
+ EAttachmentBar *attachment_bar;
- info = gnome_vfs_file_info_new ();
- result = gnome_vfs_get_file_info (filename, info,
- GNOME_VFS_FILE_INFO_GET_MIME_TYPE |
- GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE |
- GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
- if (result == GNOME_VFS_OK)
- type = g_strdup (gnome_vfs_file_info_get_mime_type (info));
+ g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), 0);
- gnome_vfs_file_info_unref (info);
-
- return type;
+ attachment_bar = E_ATTACHMENT_BAR (composer->priv->attachment_bar);
+ return e_attachment_bar_get_download_count (attachment_bar);
}
static void
-drop_action (EMsgComposer *composer, GdkDragContext *context, guint32 action, GtkSelectionData *selection, guint info, guint time, gboolean html_dnd)
+drop_action (EMsgComposer *composer,
+ GdkDragContext *context,
+ guint32 action,
+ GtkSelectionData *selection,
+ guint info,
+ guint time,
+ gboolean html_dnd)
{
char *tmp, *str, **urls;
CamelMimePart *mime_part;
@@ -1783,7 +1762,7 @@
msg = camel_mime_message_new ();
if (camel_data_wrapper_construct_from_stream ((CamelDataWrapper *)msg, stream) != -1) {
- attach_message (composer, msg);
+ msg_composer_attach_message (composer, msg);
success = TRUE;
delete = action == GDK_ACTION_MOVE;
}
@@ -1867,7 +1846,7 @@
msg = camel_folder_get_message (folder, uids->pdata[0], &ex);
if (msg == NULL)
goto fail;
- attach_message (composer, msg);
+ msg_composer_attach_message (composer, msg);
} else {
CamelMultipart *mp = camel_multipart_new ();
char *desc;
@@ -1927,9 +1906,6 @@
break;
}
- if (e_attachment_bar_get_num_attachments (E_ATTACHMENT_BAR(p->attachment_bar)))
- show_attachments (composer, TRUE);
-
gtk_drag_finish (context, success, delete, time);
}
@@ -1976,73 +1952,6 @@
}
static void
-drag_data_received (GtkWidget *w, GdkDragContext *context,
- int x, int y, GtkSelectionData *selection,
- guint info, guint time,
- EMsgComposer *composer)
-{
- if (selection->data == NULL || selection->length == -1)
- return;
-
- if (context->action == GDK_ACTION_ASK) {
- EMPopup *emp;
- GSList *menus = NULL;
- GtkMenu *menu;
- int i;
- struct _drop_data *m;
-
- m = g_malloc0(sizeof (*m));
- m->context = context;
- g_object_ref (context);
- m->composer = composer;
- g_object_ref (composer);
- m->action = context->action;
- m->info = info;
- m->time = time;
- m->selection = g_malloc0(sizeof (*m->selection));
- m->selection->data = g_malloc (selection->length);
- memcpy (m->selection->data, selection->data, selection->length);
- m->selection->length = selection->length;
-
- emp = em_popup_new ("org.gnome.evolution.mail.composer.popup.drop");
- for (i=0;i<sizeof (drop_popup_menu)/sizeof (drop_popup_menu[0]);i++)
- menus = g_slist_append (menus, &drop_popup_menu[i]);
-
- e_popup_add_items ((EPopup *)emp, menus, NULL, drop_popup_free, m);
- menu = e_popup_create_menu_once ((EPopup *)emp, NULL, 0);
- gtk_menu_popup (menu, NULL, NULL, NULL, NULL, 0, time);
- } else {
- drop_action (composer, context, context->action, selection, info, time, w != GTK_WIDGET (composer));
- }
-}
-
-
-static gboolean
-drag_motion (GObject *o, GdkDragContext *context, gint x, gint y, guint time, EMsgComposer *composer)
-{
- GList *targets;
- GdkDragAction action, actions = 0;
-
- for (targets = context->targets; targets; targets = targets->next) {
- int i;
-
- for (i=0;i<sizeof (drag_info)/sizeof (drag_info[0]);i++)
- if (targets->data == (gpointer)drag_info[i].atom)
- actions |= drag_info[i].actions;
- }
-
- actions &= context->actions;
- action = context->suggested_action;
- /* we default to copy */
- if (action == GDK_ACTION_ASK && (actions & (GDK_ACTION_MOVE|GDK_ACTION_COPY)) != (GDK_ACTION_MOVE|GDK_ACTION_COPY))
- action = GDK_ACTION_COPY;
-
- gdk_drag_status (context, action, time);
-
- return action != 0;
-}
-
-static void
msg_composer_dispose (GObject *object)
{
EMsgComposer *composer = E_MSG_COMPOSER (object);
@@ -2068,39 +1977,77 @@
static void
msg_composer_destroy (GtkObject *object)
{
- EMsgComposer *composer = (EMsgComposer *)object;
- EMsgComposerPrivate *p = composer->priv;
+ EMsgComposer *composer = E_MSG_COMPOSER (object);
+
+ all_composers = g_slist_remove (all_composers, object);
#if 0 /* GTKHTML-EDITOR */
- if (p->menu) {
- e_menu_update_target ((EMenu *)p->menu, NULL);
- g_object_unref (p->menu);
- p->menu = NULL;
+ if (composer->priv->menu) {
+ e_menu_update_target ((EMenu *)composer->priv->menu, NULL);
+ g_object_unref (composer->priv->menu);
+ composer->priv->menu = NULL;
}
#endif
- /* FIXME? I assume the Bonobo widget will get destroyed
- normally? */
- if (p->address_dialog != NULL) {
- gtk_widget_destroy (p->address_dialog);
- p->address_dialog = NULL;
+ if (composer->priv->address_dialog != NULL) {
+ gtk_widget_destroy (composer->priv->address_dialog);
+ composer->priv->address_dialog = NULL;
}
- if (p->notify_id) {
- GConfClient *gconf = gconf_client_get_default ();
- gconf_client_notify_remove (gconf, p->notify_id);
- p->notify_id = 0;
- g_object_unref (gconf);
+ if (composer->priv->notify_id) {
+ GConfClient *client;
+
+ client = gconf_client_get_default ();
+ gconf_client_notify_remove (client, composer->priv->notify_id);
+ composer->priv->notify_id = 0;
+ g_object_unref (client);
}
/* Chain up to parent's destroy() method. */
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
+static void
+msg_composer_map (GtkWidget *widget)
+{
+ EComposerHeaderTable *table;
+ GtkWidget *input_widget;
+ const gchar *text;
+
+ /* Chain up to parent's map() method. */
+ GTK_WIDGET_CLASS (parent_class)->map (widget);
+
+ table = e_msg_composer_get_header_table (E_MSG_COMPOSER (widget));
+
+ /* If the 'To' field is empty, focus it. */
+ input_widget =
+ e_composer_header_table_get_header (
+ table, E_COMPOSER_HEADER_TO)->input_widget;
+ text = gtk_entry_get_text (GTK_ENTRY (input_widget));
+ if (text == NULL || *text == '\0') {
+ gtk_widget_grab_focus (input_widget);
+ return;
+ }
+
+ /* If not, check the 'Subject' field. */
+ input_widget =
+ e_composer_header_table_get_header (
+ table, E_COMPOSER_HEADER_SUBJECT)->input_widget;
+ text = gtk_entry_get_text (GTK_ENTRY (input_widget));
+ if (text == NULL || *text == '\0') {
+ gtk_widget_grab_focus (input_widget);
+ return;
+ }
+
+ /* Jump to the editor as a last resort. */
+ gtkhtml_editor_run_command (GTKHTML_EDITOR (widget), "grab-focus");
+}
+
static gint
msg_composer_delete_event (GtkWidget *widget,
GdkEventAny *event)
{
+ /* This is needed for the ACTION macro. */
EMsgComposer *composer = E_MSG_COMPOSER (widget);
gtk_action_activate (ACTION (CLOSE));
@@ -2108,6 +2055,128 @@
return TRUE;
}
+static gboolean
+msg_composer_key_press_event (GtkWidget *widget,
+ GdkEventKey *event)
+{
+ EMsgComposer *composer = E_MSG_COMPOSER (widget);
+ GtkWidget *input_widget;
+
+ input_widget =
+ e_composer_header_table_get_header (
+ e_msg_composer_get_header_table (composer),
+ E_COMPOSER_HEADER_SUBJECT)->input_widget;
+
+#ifdef HAVE_XFREE
+ if (event->keyval == XF86XK_Send) {
+ g_signal_emit (G_OBJECT (composer), signals[SEND], 0);
+ return TRUE;
+ }
+#endif /* HAVE_XFREE */
+
+ if (event->keyval == GDK_Escape) {
+ gtk_action_activate (ACTION (CLOSE));
+ return TRUE;
+ }
+
+ if (event->keyval == GDK_Tab && gtk_widget_is_focus (input_widget)) {
+ gtkhtml_editor_run_command (
+ GTKHTML_EDITOR (composer), "grab-focus");
+ return TRUE;
+ }
+
+ /* Chain up to parent's key_press_event() method. */
+ return GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event);
+}
+
+static gboolean
+msg_composer_drag_motion (GtkWidget *widget,
+ GdkDragContext *context,
+ gint x,
+ gint y,
+ guint time)
+{
+ GList *targets;
+ GdkDragAction actions = 0;
+ GdkDragAction chosen_action;
+
+ targets = context->targets;
+ while (targets != NULL) {
+ gint ii;
+
+ for (ii = 0; ii < G_N_ELEMENTS (drag_info); ii++)
+ if (targets->data == (gpointer) drag_info[ii].atom)
+ actions |= drag_info[ii].actions;
+
+ targets = g_list_next (targets);
+ }
+
+ actions &= context->actions;
+ chosen_action = context->suggested_action;
+
+ /* we default to copy */
+ if (chosen_action == GDK_ACTION_ASK &&
+ (actions & (GDK_ACTION_MOVE|GDK_ACTION_COPY)) !=
+ (GDK_ACTION_MOVE|GDK_ACTION_COPY))
+ chosen_action = GDK_ACTION_COPY;
+
+ gdk_drag_status (context, chosen_action, time);
+
+ return (chosen_action != 0);
+}
+
+static void
+msg_composer_drag_data_received (GtkWidget *widget,
+ GdkDragContext *context,
+ gint x,
+ gint y,
+ GtkSelectionData *selection,
+ guint info,
+ guint time)
+{
+ EMsgComposer *composer;
+
+ /* Widget may be EMsgComposer or GtkHTML. */
+ composer = E_MSG_COMPOSER (gtk_widget_get_toplevel (widget));
+
+ if (selection->data == NULL)
+ return;
+
+ if (selection->length == -1)
+ return;
+
+ if (context->action == GDK_ACTION_ASK) {
+ EMPopup *emp;
+ GSList *menus = NULL;
+ GtkMenu *menu;
+ gint ii;
+ struct _drop_data *m;
+
+ m = g_malloc0(sizeof (*m));
+ m->context = g_object_ref (context);
+ m->composer = g_object_ref (composer);
+ m->action = context->action;
+ m->info = info;
+ m->time = time;
+ m->selection = g_malloc0(sizeof (*m->selection));
+ m->selection->data = g_malloc (selection->length);
+ memcpy (m->selection->data, selection->data, selection->length);
+ m->selection->length = selection->length;
+
+ emp = em_popup_new ("org.gnome.evolution.mail.composer.popup.drop");
+ for (ii = 0; ii < G_N_ELEMENTS (drop_popup_menu); ii++)
+ menus = g_slist_append (menus, &drop_popup_menu[ii]);
+
+ e_popup_add_items ((EPopup *)emp, menus, NULL, drop_popup_free, m);
+ menu = e_popup_create_menu_once ((EPopup *)emp, NULL, 0);
+ gtk_menu_popup (menu, NULL, NULL, NULL, NULL, 0, time);
+ } else {
+ drop_action (
+ composer, context, context->action, selection,
+ info, time, !GTK_WIDGET_TOPLEVEL (widget));
+ }
+}
+
static void
msg_composer_cut_clipboard (GtkhtmlEditor *editor)
{
@@ -2211,7 +2280,11 @@
gtk_object_class->destroy = msg_composer_destroy;
widget_class = GTK_WIDGET_CLASS (class);
+ widget_class->map = msg_composer_map;
widget_class->delete_event = msg_composer_delete_event;
+ widget_class->key_press_event = msg_composer_key_press_event;
+ widget_class->drag_motion = msg_composer_drag_motion;
+ widget_class->drag_data_received = msg_composer_drag_data_received;
editor_class = GTKHTML_EDITOR_CLASS (class);
editor_class->cut_clipboard = msg_composer_cut_clipboard;
@@ -2335,119 +2408,6 @@
}
static void
-e_msg_composer_load_config (EMsgComposer *composer, int visible_mask)
-{
- /* Override header visibility based on our visible mask.
- * XXX Move this into msg_composer_init(). */
-
- GtkToggleAction *action;
- gboolean active;
-
- /* if we're mailing, you cannot disable to so it should appear checked */
- action = GTK_TOGGLE_ACTION (ACTION (VIEW_TO));
- active = visible_mask & E_MSG_COMPOSER_VISIBLE_TO;
- gtk_toggle_action_set_active (action, active);
-
- /* ditto for post-to */
- action = GTK_TOGGLE_ACTION (ACTION (VIEW_POST_TO));
- active = visible_mask & E_MSG_COMPOSER_VISIBLE_POSTTO;
- gtk_toggle_action_set_active (action, active);
-
- /* we set these to false initially if we're posting */
- if (!(visible_mask & E_MSG_COMPOSER_VISIBLE_CC)) {
- action = GTK_TOGGLE_ACTION (ACTION (VIEW_CC));
- gtk_toggle_action_set_active (action, FALSE);
- }
-
- if (!(visible_mask & E_MSG_COMPOSER_VISIBLE_BCC)) {
- action = GTK_TOGGLE_ACTION (ACTION (VIEW_BCC));
- gtk_toggle_action_set_active (action, FALSE);
- }
-
- action = GTK_TOGGLE_ACTION (ACTION (VIEW_SUBJECT));
- gtk_toggle_action_set_active (action, TRUE);
-}
-
-static void
-map_default_cb (EMsgComposer *composer, gpointer user_data)
-{
- EComposerHeaderTable *table;
- GtkWidget *widget;
- const gchar *text;
-
- table = e_msg_composer_get_header_table (composer);
-
- /* If the 'To:' field is empty, focus it */
-
- widget = e_composer_header_table_get_header (
- table, E_COMPOSER_HEADER_TO)->input_widget;
- text = gtk_entry_get_text (GTK_ENTRY (widget));
-
- if (!text || text[0] == '\0') {
- gtk_widget_grab_focus (widget);
-
- return;
- }
-
- /* If not, check the subject field */
-
- widget = e_composer_header_table_get_header (
- table, E_COMPOSER_HEADER_SUBJECT)->input_widget;
- text = gtk_entry_get_text (GTK_ENTRY (widget));
-
- if (!text || text[0] == '\0') {
- gtk_widget_grab_focus (widget);
- return;
- }
-
- /* Jump to the editor as a last resort. */
- gtkhtml_editor_run_command (GTKHTML_EDITOR (composer), "grab-focus");
-}
-
-static void
-msg_composer_destroy_notify (gpointer data)
-{
- EMsgComposer *composer = E_MSG_COMPOSER (data);
-
- all_composers = g_slist_remove (all_composers, composer);
-}
-
-static int
-composer_key_pressed (EMsgComposer *composer,
- GdkEventKey *event)
-{
- GtkWidget *widget;
- EComposerHeaderTable *table;
-
- table = e_msg_composer_get_header_table (composer);
- widget = e_composer_header_table_get_header (
- table, E_COMPOSER_HEADER_SUBJECT)->input_widget;
-
-#ifdef HAVE_XFREE
- if (event->keyval == XF86XK_Send) {
- g_signal_emit (G_OBJECT (composer), signals[SEND], 0);
- g_signal_stop_emission_by_name (composer, "key-press-event");
- return TRUE;
- }
-#endif /* HAVE_XFREE */
-
- if (event->keyval == GDK_Escape) {
- gtk_action_activate (ACTION (CLOSE));
- g_signal_stop_emission_by_name (composer, "key-press-event");
- return TRUE;
- }
-
- if (event->keyval == GDK_Tab && gtk_widget_is_focus (widget)) {
- gtkhtml_editor_run_command (
- GTKHTML_EDITOR (composer), "grab-focus");
- g_signal_stop_emission_by_name (composer, "key-press-event");
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
msg_composer_update_preferences (GConfClient *client,
guint cnxn_id,
GConfEntry *entry,
@@ -2594,7 +2554,6 @@
return TRUE;
}
-
static int
button_press_event (GtkWidget *widget, GdkEventButton *event)
{
@@ -2629,8 +2588,17 @@
return FALSE;
}
+static void
+msg_composer_notify_header_cb (EMsgComposer *composer)
+{
+ GtkhtmlEditor *editor;
+
+ editor = GTKHTML_EDITOR (composer);
+ gtkhtml_editor_set_changed (editor, TRUE);
+}
+
static EMsgComposer *
-create_composer (int visible_mask)
+create_composer (gint visible_mask)
{
EMsgComposer *composer;
EComposerHeaderTable *table;
@@ -2642,25 +2610,18 @@
composer = g_object_new (E_TYPE_MSG_COMPOSER, NULL);
p = composer->priv;
- g_signal_connect (composer, "key-press-event",
- G_CALLBACK (composer_key_pressed),
- NULL);
-
- g_signal_connect (composer, "destroy",
- G_CALLBACK (msg_composer_destroy_notify),
- NULL);
+ client = gconf_client_get_default ();
/* DND support */
- gtk_drag_dest_set (GTK_WIDGET (composer), GTK_DEST_DEFAULT_ALL, drop_types, G_N_ELEMENTS (drop_types), GDK_ACTION_COPY|GDK_ACTION_ASK|GDK_ACTION_MOVE);
- g_signal_connect (composer, "drag_data_received", G_CALLBACK (drag_data_received), composer);
- g_signal_connect (composer, "drag-motion", G_CALLBACK (drag_motion), composer);
- e_msg_composer_load_config (composer, visible_mask);
+ gtk_drag_dest_set (
+ GTK_WIDGET (composer), GTK_DEST_DEFAULT_ALL,
+ drop_types, G_N_ELEMENTS (drop_types),
+ GDK_ACTION_COPY | GDK_ACTION_ASK | GDK_ACTION_MOVE);
setup_ui (composer);
- /* Headers */
+ /* Configure Headers */
- p->visible_mask = visible_mask;
table = E_COMPOSER_HEADER_TABLE (p->header_table);
e_composer_header_table_set_account_list (
@@ -2668,107 +2629,111 @@
e_composer_header_table_set_signature_list (
table, mail_config_get_signatures ());
- /* Configure header visibility / sensitivity */
+ /* If we're mailing, you cannot disable "To". */
+ action = GTK_TOGGLE_ACTION (ACTION (VIEW_TO));
+ active = visible_mask & E_MSG_COMPOSER_VISIBLE_TO;
+ gtk_action_set_sensitive (ACTION (VIEW_TO), active);
+ gtk_toggle_action_set_active (action, active);
+
+ /* Ditto for "Post-To". */
+ action = GTK_TOGGLE_ACTION (ACTION (VIEW_POST_TO));
+ active = visible_mask & E_MSG_COMPOSER_VISIBLE_POSTTO;
+ gtk_action_set_sensitive (ACTION (VIEW_POST_TO), active);
+ gtk_toggle_action_set_active (action, active);
+
+ /* Disable "Cc" if we're posting. */
+ if (!(visible_mask & E_MSG_COMPOSER_VISIBLE_CC)) {
+ action = GTK_TOGGLE_ACTION (ACTION (VIEW_CC));
+ gtk_toggle_action_set_active (action, FALSE);
+ }
+
+ /* Disable "Bcc" if we're posting. */
+ if (!(visible_mask & E_MSG_COMPOSER_VISIBLE_BCC)) {
+ action = GTK_TOGGLE_ACTION (ACTION (VIEW_BCC));
+ gtk_toggle_action_set_active (action, FALSE);
+ }
- gtk_action_set_sensitive (
- ACTION (VIEW_TO),
- visible_mask & E_MSG_COMPOSER_VISIBLE_TO);
- gtk_action_set_sensitive (
- ACTION (VIEW_POST_TO),
- visible_mask & E_MSG_COMPOSER_VISIBLE_POSTTO);
+ action = GTK_TOGGLE_ACTION (ACTION (VIEW_SUBJECT));
+ gtk_toggle_action_set_active (action, TRUE);
g_signal_connect_swapped (
table, "notify::account",
- G_CALLBACK (account_changed_cb), composer);
+ G_CALLBACK (msg_composer_account_changed_cb), composer);
g_signal_connect_swapped (
table, "notify::destinations-bcc",
- G_CALLBACK (e_msg_composer_set_changed), composer);
+ G_CALLBACK (msg_composer_notify_header_cb), composer);
g_signal_connect_swapped (
table, "notify::destinations-cc",
- G_CALLBACK (e_msg_composer_set_changed), composer);
+ G_CALLBACK (msg_composer_notify_header_cb), composer);
g_signal_connect_swapped (
table, "notify::destinations-to",
- G_CALLBACK (e_msg_composer_set_changed), composer);
+ G_CALLBACK (msg_composer_notify_header_cb), composer);
g_signal_connect_swapped (
table, "notify::reply-to",
- G_CALLBACK (e_msg_composer_set_changed), composer);
+ G_CALLBACK (msg_composer_notify_header_cb), composer);
g_signal_connect_swapped (
table, "notify::signature",
G_CALLBACK (e_msg_composer_show_sig_file), composer);
g_signal_connect_swapped (
table, "notify::subject",
- G_CALLBACK (subject_changed_cb), composer);
+ G_CALLBACK (msg_composer_subject_changed_cb), composer);
g_signal_connect_swapped (
table, "notify::subject",
- G_CALLBACK (e_msg_composer_set_changed), composer);
+ G_CALLBACK (msg_composer_notify_header_cb), composer);
- account_changed_cb (composer);
+ msg_composer_account_changed_cb (composer);
- gtkhtml_editor_set_html_mode (GTKHTML_EDITOR (composer), p->send_html);
+ /* Honor User Preferences */
+
+ active = gconf_client_get_bool (
+ client, COMPOSER_GCONF_SEND_HTML_KEY, NULL);
+ gtkhtml_editor_set_html_mode (GTKHTML_EDITOR (composer), active);
- /* Listen for user preference updates. */
- client = gconf_client_get_default ();
- msg_composer_update_preferences (client, 0, NULL, composer);
action = GTK_TOGGLE_ACTION (ACTION (REQUEST_READ_RECEIPT));
active = gconf_client_get_bool (
client, COMPOSER_GCONF_REQUEST_RECEIPT_KEY, NULL);
gtk_toggle_action_set_active (action, active);
+
+ /* Listen for user preference updates. */
gconf_client_add_dir (
client, COMPOSER_GCONF_PREFIX,
GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
p->notify_id = gconf_client_notify_add (
client, COMPOSER_GCONF_PREFIX, (GConfClientNotifyFunc)
msg_composer_update_preferences, composer, NULL, NULL);
- g_object_unref (client);
-
- g_signal_connect (p->attachment_bar, "button_press_event", G_CALLBACK (button_press_event), NULL);
- g_signal_connect (p->attachment_bar, "key_press_event", G_CALLBACK (key_press_event), NULL);
- g_signal_connect (p->attachment_bar, "popup-menu", G_CALLBACK (popup_menu_event), NULL);
-
- g_signal_connect (p->attachment_bar, "changed",
- G_CALLBACK (attachment_bar_changed_cb), composer);
-
- g_signal_connect_after (p->attachment_expander, "activate",
- G_CALLBACK (attachment_expander_activate_cb), composer);
-
-#if 0 /* GTKHTML-EDITOR */
- /* The engine would have the GtkHTML widget stored in "html-widget"
- * We'll use that to listen for DnD signals
- */
-
- servant = ORBit_small_get_servant (p->eeditor_engine);
- if (servant && (impl = bonobo_object (servant)))
- html_widget = g_object_get_data (G_OBJECT (impl), "html-widget");
+ msg_composer_update_preferences (client, 0, NULL, composer);
- if (html_widget) {
- g_signal_connect (html_widget, "drag_data_received", G_CALLBACK (drag_data_received), composer);
- }
-#endif /* GTKHTML-EDITOR */
+ /* Attachment Bar */
- g_signal_connect (composer, "map", (GCallback) map_default_cb, NULL);
+ g_signal_connect (
+ p->attachment_bar, "button_press_event",
+ G_CALLBACK (button_press_event), NULL);
+ g_signal_connect (
+ p->attachment_bar, "key_press_event",
+ G_CALLBACK (key_press_event), NULL);
+ g_signal_connect (
+ p->attachment_bar, "popup-menu",
+ G_CALLBACK (popup_menu_event), NULL);
+ g_signal_connect (
+ p->attachment_bar, "changed",
+ G_CALLBACK (attachment_bar_changed_cb), composer);
+ g_signal_connect_after (
+ p->attachment_expander, "notify::expanded",
+ G_CALLBACK (attachment_expander_notify_cb), composer);
+
+ g_signal_connect (
+ gtkhtml_editor_get_html (GTKHTML_EDITOR (composer)),
+ "drag_data_received",
+ G_CALLBACK (msg_composer_drag_data_received), NULL);
e_composer_autosave_register (composer);
- p->has_changed = FALSE;
-
- return composer;
-}
-
-static void
-set_editor_signature (EMsgComposer *composer)
-{
- EComposerHeaderTable *table;
- ESignature *signature;
- EAccount *account;
- const gchar *uid;
+ /* Initialization may have tripped the "changed" state. */
+ gtkhtml_editor_set_changed (GTKHTML_EDITOR (composer), FALSE);
- table = e_msg_composer_get_header_table (composer);
- account = e_composer_header_table_get_account (table);
- g_return_if_fail (account != NULL);
+ g_object_unref (client);
- uid = account->id->sig_uid;
- signature = uid ? mail_config_get_signature_by_uid (uid) : NULL;
- e_composer_header_table_set_signature (table, signature);
+ return composer;
}
/**
@@ -2777,27 +2742,34 @@
* Create a new message composer widget. The type can be
* E_MSG_COMPOSER_MAIL, E_MSG_COMPOSER_POST or E_MSG_COMPOSER_MAIL_POST.
*
- * Return value: A pointer to the newly created widget
+ * Returns: A pointer to the newly created widget
**/
EMsgComposer *
e_msg_composer_new_with_type (int type)
{
EMsgComposer *new;
+ gint visible_mask;
switch (type) {
- case E_MSG_COMPOSER_MAIL:
- new = create_composer (E_MSG_COMPOSER_VISIBLE_MASK_MAIL);
- break;
- case E_MSG_COMPOSER_POST:
- new = create_composer (E_MSG_COMPOSER_VISIBLE_MASK_POST);
- break;
- default:
- new = create_composer (E_MSG_COMPOSER_VISIBLE_MASK_MAIL | E_MSG_COMPOSER_VISIBLE_MASK_POST);
+ case E_MSG_COMPOSER_MAIL:
+ visible_mask = E_MSG_COMPOSER_VISIBLE_MASK_MAIL;
+ break;
+
+ case E_MSG_COMPOSER_POST:
+ visible_mask = E_MSG_COMPOSER_VISIBLE_MASK_POST;
+ break;
+
+ default:
+ visible_mask =
+ E_MSG_COMPOSER_VISIBLE_MASK_MAIL |
+ E_MSG_COMPOSER_VISIBLE_MASK_POST;
+ break;
}
+ new = create_composer (visible_mask);
+
if (new) {
- set_editor_signature (new);
set_editor_text (new, "", TRUE);
}
@@ -2809,7 +2781,7 @@
*
* Create a new message composer widget.
*
- * Return value: A pointer to the newly created widget
+ * Returns: A pointer to the newly created widget
**/
EMsgComposer *
e_msg_composer_new (void)
@@ -2836,36 +2808,42 @@
}
static void
-e_msg_composer_set_pending_body (EMsgComposer *composer, gchar *text, gssize len)
+e_msg_composer_set_pending_body (EMsgComposer *composer,
+ gchar *text,
+ gssize length)
{
- gchar *old;
+ g_object_set_data_full (
+ G_OBJECT (composer), "body:text",
+ text, (GDestroyNotify) g_free);
- old = g_object_get_data ((GObject *) composer, "body:text");
- g_free (old);
- g_object_set_data ((GObject *) composer, "body:text", text);
- g_object_set_data ((GObject *) composer, "body:len", GSIZE_TO_POINTER (len));
+ g_object_set_data (
+ G_OBJECT (composer), "body:length",
+ GSIZE_TO_POINTER (length));
}
static void
-e_msg_composer_flush_pending_body (EMsgComposer *composer, gboolean apply)
+e_msg_composer_flush_pending_body (EMsgComposer *composer)
{
- gchar *body;
- gssize len;
+ const gchar *body;
+ gpointer data;
+ gssize length;
- body = g_object_get_data ((GObject *) composer, "body:text");
- len = GPOINTER_TO_SIZE (g_object_get_data ((GObject *) composer, "body:len"));
- if (body) {
- if (apply)
- set_editor_text (composer, body, FALSE);
+ body = g_object_get_data (G_OBJECT (composer), "body:text");
+ data = g_object_get_data (G_OBJECT (composer), "body:length");
+ length = GPOINTER_TO_SIZE (data);
- g_object_set_data ((GObject *) composer, "body:text", NULL);
- g_free (body);
- }
+ if (body != NULL)
+ set_editor_text (composer, body, FALSE);
+
+ g_object_set_data (G_OBJECT (composer), "body:text", NULL);
}
static void
-add_attachments_handle_mime_part (EMsgComposer *composer, CamelMimePart *mime_part,
- gboolean just_inlines, gboolean related, gint depth)
+add_attachments_handle_mime_part (EMsgComposer *composer,
+ CamelMimePart *mime_part,
+ gboolean just_inlines,
+ gboolean related,
+ gint depth)
{
CamelContentType *content_type;
CamelDataWrapper *wrapper;
@@ -2878,51 +2856,59 @@
if (CAMEL_IS_MULTIPART (wrapper)) {
/* another layer of multipartness... */
- add_attachments_from_multipart (composer, (CamelMultipart *) wrapper, just_inlines, depth + 1);
+ add_attachments_from_multipart (
+ composer, (CamelMultipart *) wrapper,
+ just_inlines, depth + 1);
} else if (just_inlines) {
if (camel_mime_part_get_content_id (mime_part) ||
camel_mime_part_get_content_location (mime_part))
- e_msg_composer_add_inline_image_from_mime_part (composer, mime_part);
+ e_msg_composer_add_inline_image_from_mime_part (
+ composer, mime_part);
} else if (CAMEL_IS_MIME_MESSAGE (wrapper)) {
/* do nothing */
} else if (related && camel_content_type_is (content_type, "image", "*")) {
e_msg_composer_add_inline_image_from_mime_part (composer, mime_part);
+ } else if (camel_content_type_is (content_type, "text", "*")) {
+ /* do nothing */
} else {
- if (camel_content_type_is (content_type, "text", "*")) {
- /* do nothing */
- } else {
- e_msg_composer_attach (composer, mime_part);
- }
+ e_msg_composer_attach (composer, mime_part);
}
}
static void
-add_attachments_from_multipart (EMsgComposer *composer, CamelMultipart *multipart,
- gboolean just_inlines, gint depth)
+add_attachments_from_multipart (EMsgComposer *composer,
+ CamelMultipart *multipart,
+ gboolean just_inlines,
+ gint depth)
{
/* find appropriate message attachments to add to the composer */
CamelMimePart *mime_part;
gboolean related;
gint i, nparts;
- related = camel_content_type_is (CAMEL_DATA_WRAPPER (multipart)->mime_type, "multipart", "related");
+ related = camel_content_type_is (
+ CAMEL_DATA_WRAPPER (multipart)->mime_type,
+ "multipart", "related");
if (CAMEL_IS_MULTIPART_SIGNED (multipart)) {
- mime_part = camel_multipart_get_part (multipart, CAMEL_MULTIPART_SIGNED_CONTENT);
- add_attachments_handle_mime_part (composer, mime_part, just_inlines, related, depth);
+ mime_part = camel_multipart_get_part (
+ multipart, CAMEL_MULTIPART_SIGNED_CONTENT);
+ add_attachments_handle_mime_part (
+ composer, mime_part, just_inlines, related, depth);
} else if (CAMEL_IS_MULTIPART_ENCRYPTED (multipart)) {
- /* what should we do in this case? */
+ /* XXX What should we do in this case? */
} else {
nparts = camel_multipart_get_number (multipart);
for (i = 0; i < nparts; i++) {
mime_part = camel_multipart_get_part (multipart, i);
- add_attachments_handle_mime_part (composer, mime_part, just_inlines, related, depth);
+ add_attachments_handle_mime_part (
+ composer, mime_part, just_inlines,
+ related, depth);
}
}
}
-
/**
* e_msg_composer_add_message_attachments:
* @composer: the composer to add the attachments to.
@@ -2934,7 +2920,8 @@
* specified in @composer.
*/
void
-e_msg_composer_add_message_attachments (EMsgComposer *composer, CamelMimeMessage *message,
+e_msg_composer_add_message_attachments (EMsgComposer *composer,
+ CamelMimeMessage *message,
gboolean just_inlines)
{
CamelDataWrapper *wrapper;
@@ -2943,13 +2930,14 @@
if (!CAMEL_IS_MULTIPART (wrapper))
return;
- /* there must be attachments... */
- add_attachments_from_multipart (composer, (CamelMultipart *) wrapper, just_inlines, 0);
+ add_attachments_from_multipart (
+ composer, (CamelMultipart *) wrapper, just_inlines, 0);
}
-
static void
-handle_multipart_signed (EMsgComposer *composer, CamelMultipart *multipart, gint depth)
+handle_multipart_signed (EMsgComposer *composer,
+ CamelMultipart *multipart,
+ gint depth)
{
CamelContentType *content_type;
CamelDataWrapper *content;
@@ -2960,9 +2948,10 @@
action = GTK_TOGGLE_ACTION (ACTION (PGP_SIGN));
gtk_toggle_action_set_active (action, TRUE);
- mime_part = camel_multipart_get_part (multipart, CAMEL_MULTIPART_SIGNED_CONTENT);
+ mime_part = camel_multipart_get_part (
+ multipart, CAMEL_MULTIPART_SIGNED_CONTENT);
- if (!mime_part)
+ if (mime_part != NULL)
return;
content_type = camel_mime_part_get_content_type (mime_part);
@@ -2991,18 +2980,20 @@
handle_multipart (composer, multipart, depth);
}
} else if (camel_content_type_is (content_type, "text", "*")) {
- gssize len;
gchar *html;
+ gssize length;
- html = em_utils_part_to_html (mime_part, &len, NULL);
- e_msg_composer_set_pending_body (composer, html, len);
+ html = em_utils_part_to_html (mime_part, &length, NULL);
+ e_msg_composer_set_pending_body (composer, html, length);
} else {
e_msg_composer_attach (composer, mime_part);
}
}
static void
-handle_multipart_encrypted (EMsgComposer *composer, CamelMimePart *multipart, gint depth)
+handle_multipart_encrypted (EMsgComposer *composer,
+ CamelMimePart *multipart,
+ gint depth)
{
CamelContentType *content_type;
CamelCipherContext *cipher;
@@ -3052,11 +3043,11 @@
handle_multipart (composer, content_multipart, depth);
}
} else if (camel_content_type_is (content_type, "text", "*")) {
- gssize len;
gchar *html;
+ gssize length;
- html = em_utils_part_to_html (mime_part, &len, NULL);
- e_msg_composer_set_pending_body (composer, html, len);
+ html = em_utils_part_to_html (mime_part, &length, NULL);
+ e_msg_composer_set_pending_body (composer, html, length);
} else {
e_msg_composer_attach (composer, mime_part);
}
@@ -3065,7 +3056,9 @@
}
static void
-handle_multipart_alternative (EMsgComposer *composer, CamelMultipart *multipart, gint depth)
+handle_multipart_alternative (EMsgComposer *composer,
+ CamelMultipart *multipart,
+ gint depth)
{
/* Find the text/html part and set the composer body to it's contents */
CamelMimePart *text_part = NULL;
@@ -3116,16 +3109,18 @@
}
if (text_part) {
- gssize len;
gchar *html;
+ gssize length;
- html = em_utils_part_to_html (text_part, &len, NULL);
- e_msg_composer_set_pending_body (composer, html, len);
+ html = em_utils_part_to_html (text_part, &length, NULL);
+ e_msg_composer_set_pending_body (composer, html, length);
}
}
static void
-handle_multipart (EMsgComposer *composer, CamelMultipart *multipart, gint depth)
+handle_multipart (EMsgComposer *composer,
+ CamelMultipart *multipart,
+ gint depth)
{
gint i, nparts;
@@ -3162,12 +3157,13 @@
handle_multipart (composer, mp, depth + 1);
}
} else if (depth == 0 && i == 0) {
- gssize len;
gchar *html;
+ gssize length;
- /* Since the first part is not multipart/alternative, then this must be the body */
- html = em_utils_part_to_html (mime_part, &len, NULL);
- e_msg_composer_set_pending_body (composer, html, len);
+ /* Since the first part is not multipart/alternative,
+ * this must be the body. */
+ html = em_utils_part_to_html (mime_part, &length, NULL);
+ e_msg_composer_set_pending_body (composer, html, length);
} else if (camel_mime_part_get_content_id (mime_part) ||
camel_mime_part_get_content_location (mime_part)) {
/* special in-line attachment */
@@ -3216,7 +3212,7 @@
*
* Note: Designed to work only for messages constructed using Evolution.
*
- * Return value: A pointer to the newly created widget
+ * Returns: A pointer to the newly created widget
**/
EMsgComposer *
e_msg_composer_new_with_message (CamelMimeMessage *message)
@@ -3243,7 +3239,10 @@
postto = g_list_append (postto, g_strstrip (g_strdup (headers->value)));
}
- composer = create_composer (postto ? E_MSG_COMPOSER_VISIBLE_MASK_POST : E_MSG_COMPOSER_VISIBLE_MASK_MAIL);
+ if (postto != NULL)
+ composer = create_composer (E_MSG_COMPOSER_VISIBLE_MASK_POST);
+ else
+ composer = create_composer (E_MSG_COMPOSER_VISIBLE_MASK_MAIL);
p = composer->priv;
if (!composer) {
@@ -3485,17 +3484,17 @@
handle_multipart (composer, multipart, 0);
}
} else {
- gssize length;
gchar *html;
+ gssize length;
html = em_utils_part_to_html ((CamelMimePart *)message, &length, NULL);
e_msg_composer_set_pending_body (composer, html, length);
}
- /* We wait until now to set the body text because we need to ensure that
- * the attachment bar has all the attachments, before we request them.
- */
- e_msg_composer_flush_pending_body (composer, TRUE);
+ /* We wait until now to set the body text because we need to
+ * ensure that the attachment bar has all the attachments before
+ * we request them. */
+ e_msg_composer_flush_pending_body (composer);
set_signature_gui (composer);
@@ -3532,10 +3531,11 @@
*
* Create a new message composer widget.
*
- * Return value: A pointer to the newly created widget
+ * Returns: A pointer to the newly created widget
**/
EMsgComposer *
-e_msg_composer_new_redirect (CamelMimeMessage *message, const gchar *resent_from)
+e_msg_composer_new_redirect (CamelMimeMessage *message,
+ const gchar *resent_from)
{
EMsgComposer *composer;
EComposerHeaderTable *table;
@@ -3582,12 +3582,16 @@
void
e_msg_composer_save_draft (EMsgComposer *composer)
{
+ GtkhtmlEditor *editor;
+
g_return_if_fail (E_IS_MSG_COMPOSER (composer));
+ editor = GTKHTML_EDITOR (composer);
+
g_signal_emit (composer, signals[SAVE_DRAFT], 0, FALSE);
/* XXX This should be elsewhere. */
- e_msg_composer_unset_changed (composer);
+ gtkhtml_editor_set_changed (editor, FALSE);
e_composer_autosave_set_saved (composer, FALSE);
}
@@ -3761,9 +3765,16 @@
}
static void
-handle_uri (EMsgComposer *composer, const gchar *uri, gboolean html_dnd)
+handle_uri (EMsgComposer *composer,
+ const gchar *uri,
+ gboolean html_dnd)
{
EMsgComposerPrivate *p = composer->priv;
+ GtkhtmlEditor *editor;
+ gboolean html_content;
+
+ editor = GTKHTML_EDITOR (composer);
+ html_content = gtkhtml_editor_get_html_mode (editor);
if (!g_ascii_strncasecmp (uri, "mailto:", 7)) {
handle_mailto (composer, uri);
@@ -3775,11 +3786,11 @@
return;
if (!g_ascii_strcasecmp (url->protocol, "file")) {
- type = attachment_guess_mime_type (uri);
+ type = e_msg_composer_guess_mime_type (uri);
if (!type)
return;
- if (strncmp (type, "image", 5) || !html_dnd || (!p->send_html && !strncmp (type, "image", 5))) {
+ if (strncmp (type, "image", 5) || !html_dnd || (!html_content && !strncmp (type, "image", 5))) {
e_attachment_bar_attach (E_ATTACHMENT_BAR (p->attachment_bar),
url->path, "attachment");
}
@@ -3843,7 +3854,8 @@
* This function should only be used by the CORBA composer factory.
**/
void
-e_msg_composer_set_body (EMsgComposer *composer, const gchar *body,
+e_msg_composer_set_body (EMsgComposer *composer,
+ const gchar *body,
const gchar *mime_type)
{
EMsgComposerPrivate *p = composer->priv;
@@ -3875,7 +3887,6 @@
}
}
-
/**
* e_msg_composer_add_header:
* @composer: a composer object
@@ -3887,7 +3898,8 @@
* the message it outputs.
**/
void
-e_msg_composer_add_header (EMsgComposer *composer, const gchar *name,
+e_msg_composer_add_header (EMsgComposer *composer,
+ const gchar *name,
const gchar *value)
{
EMsgComposerPrivate *p = composer->priv;
@@ -3899,6 +3911,7 @@
g_ptr_array_add (p->extra_hdr_names, g_strdup (name));
g_ptr_array_add (p->extra_hdr_values, g_strdup (value));
}
+
/**
* e_msg_composer_modify_header :
* @composer : a composer object
@@ -3911,7 +3924,8 @@
* If not found then it creates a new header with @name and @change_value .
**/
void
-e_msg_composer_modify_header (EMsgComposer *composer, const gchar *name,
+e_msg_composer_modify_header (EMsgComposer *composer,
+ const gchar *name,
const gchar *change_value)
{
g_return_if_fail (E_IS_MSG_COMPOSER (composer));
@@ -3930,7 +3944,8 @@
* Searches for the header and if found it removes it .
**/
void
-e_msg_composer_remove_header (EMsgComposer *composer, const gchar *name)
+e_msg_composer_remove_header (EMsgComposer *composer,
+ const gchar *name)
{
EMsgComposerPrivate *p;
gint i;
@@ -3942,12 +3957,12 @@
for (i = 0; i < p->extra_hdr_names->len; i++) {
if (strcmp (p->extra_hdr_names->pdata[i], name) == 0) {
- g_print ("Hit : %s",name);
g_ptr_array_remove_index (p->extra_hdr_names, i);
g_ptr_array_remove_index (p->extra_hdr_values, i);
}
}
}
+
/**
* e_msg_composer_attach:
* @composer: a composer object
@@ -3966,11 +3981,8 @@
bar = E_ATTACHMENT_BAR (p->attachment_bar);
e_attachment_bar_attach_mime_part (bar, attachment);
-
- show_attachments (composer, TRUE);
}
-
/**
* e_msg_composer_add_inline_image_from_file:
* @composer: a composer object
@@ -3979,7 +3991,7 @@
* This reads in the image in @filename and adds it to @composer
* as an inline image, to be wrapped in a multipart/related.
*
- * Return value: the newly-created CamelMimePart (which must be reffed
+ * Returns: the newly-created CamelMimePart (which must be reffed
* if the caller wants to keep its own reference), or %NULL on error.
**/
CamelMimePart *
@@ -3990,14 +4002,12 @@
CamelStream *stream;
CamelDataWrapper *wrapper;
CamelMimePart *part;
- struct stat statbuf;
EMsgComposerPrivate *p = composer->priv;
dec_file_name = g_strdup (filename);
camel_url_decode (dec_file_name);
- /* check for regular file */
- if (g_stat (dec_file_name, &statbuf) < 0 || !S_ISREG (statbuf.st_mode))
+ if (!g_file_test (dec_file_name, G_FILE_TEST_IS_REGULAR))
return NULL;
stream = camel_stream_fs_new_with_name (dec_file_name, O_RDONLY, 0);
@@ -4009,7 +4019,9 @@
camel_object_unref (CAMEL_OBJECT (stream));
mime_type = e_msg_composer_guess_mime_type (dec_file_name);
- camel_data_wrapper_set_mime_type (wrapper, mime_type ? mime_type : "application/octet-stream");
+ if (mime_type == NULL)
+ mime_type = g_strdup ("application/octet-stream");
+ camel_data_wrapper_set_mime_type (wrapper, mime_type);
g_free (mime_type);
part = camel_mime_part_new ();
@@ -4035,7 +4047,6 @@
return part;
}
-
/**
* e_msg_composer_add_inline_image_from_mime_part:
* @composer: a composer object
@@ -4063,13 +4074,12 @@
camel_object_ref (part);
location = camel_mime_part_get_content_location (part);
- if (location) {
- g_hash_table_insert (p->inline_images_by_url,
- g_strdup (location), part);
- }
+ if (location != NULL)
+ g_hash_table_insert (
+ p->inline_images_by_url,
+ g_strdup (location), part);
}
-
/**
* e_msg_composer_get_message:
* @composer: A message composer widget
@@ -4078,34 +4088,43 @@
* CamelMimeMessage object is created on the fly; subsequent calls to this
* function will always create new objects from scratch.
*
- * Return value: A pointer to the new CamelMimeMessage object
+ * Returns: A pointer to the new CamelMimeMessage object
**/
CamelMimeMessage *
-e_msg_composer_get_message (EMsgComposer *composer, gboolean save_html_object_data)
+e_msg_composer_get_message (EMsgComposer *composer,
+ gboolean save_html_object_data)
{
+ GtkhtmlEditor *editor;
+ gboolean html_content;
+
g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
- if ( e_msg_composer_get_remote_download_count (composer) != 0) {
- if (!em_utils_prompt_user ((GtkWindow *)composer, NULL, "mail-composer:ask-send-message-pending-download", NULL)) {
+
+ if (e_msg_composer_get_remote_download_count (composer) != 0) {
+ if (!em_utils_prompt_user (GTK_WINDOW (composer), NULL,
+ "mail-composer:ask-send-message-pending-download", NULL)) {
return NULL;
}
}
- return build_message (composer, save_html_object_data);
+ editor = GTKHTML_EDITOR (composer);
+ html_content = gtkhtml_editor_get_html_mode (editor);
+
+ return build_message (composer, html_content, save_html_object_data);
}
static gchar *
-msg_composer_get_message_print_helper (EMsgComposer *composer)
+msg_composer_get_message_print_helper (EMsgComposer *composer,
+ gboolean html_content)
{
GtkToggleAction *action;
GString *string;
string = g_string_sized_new (128);
- if (composer->priv->send_html)
+ if (html_content)
g_string_append (string, "text/html");
else
g_string_append (string, "text/plain");
- composer->priv->send_html = TRUE;
action = GTK_TOGGLE_ACTION (ACTION (PGP_SIGN));
if (gtk_toggle_action_get_active (action))
@@ -4131,13 +4150,19 @@
}
CamelMimeMessage *
-e_msg_composer_get_message_print (EMsgComposer *composer, gboolean save_html_object_data)
+e_msg_composer_get_message_print (EMsgComposer *composer,
+ gboolean save_html_object_data)
{
+ GtkhtmlEditor *editor;
EMsgComposer *temp_composer;
CamelMimeMessage *msg;
+ gboolean html_content;
gchar *flags;
- msg = build_message (composer, save_html_object_data);
+ editor = GTKHTML_EDITOR (composer);
+ html_content = gtkhtml_editor_get_html_mode (editor);
+
+ msg = build_message (composer, html_content, save_html_object_data);
if (msg == NULL)
return NULL;
@@ -4145,9 +4170,10 @@
camel_object_unref (msg);
/* Override composer flags. */
- flags = msg_composer_get_message_print_helper (temp_composer);
+ flags = msg_composer_get_message_print_helper (
+ temp_composer, html_content);
- msg = build_message (temp_composer, save_html_object_data);
+ msg = build_message (temp_composer, TRUE, save_html_object_data);
if (msg != NULL)
camel_medium_set_header (
CAMEL_MEDIUM (msg), "X-Evolution-Format", flags);
@@ -4161,55 +4187,53 @@
CamelMimeMessage *
e_msg_composer_get_message_draft (EMsgComposer *composer)
{
+ GtkhtmlEditor *editor;
EComposerHeaderTable *table;
GtkToggleAction *action;
CamelMimeMessage *msg;
EAccount *account;
- gboolean old_flags[4];
- gboolean old_send_html;
+ gboolean html_content;
+ gboolean pgp_encrypt;
+ gboolean pgp_sign;
+ gboolean smime_encrypt;
+ gboolean smime_sign;
GString *flags;
- gint i;
- EMsgComposerPrivate *p = composer->priv;
+ editor = GTKHTML_EDITOR (composer);
table = e_msg_composer_get_header_table (composer);
-
- /* always save drafts as HTML to preserve formatting */
- old_send_html = p->send_html;
- p->send_html = TRUE;
+ html_content = gtkhtml_editor_get_html_mode (editor);
action = GTK_TOGGLE_ACTION (ACTION (PGP_SIGN));
- old_flags[0] = gtk_toggle_action_get_active (action);
+ pgp_sign = gtk_toggle_action_get_active (action);
gtk_toggle_action_set_active (action, FALSE);
action = GTK_TOGGLE_ACTION (ACTION (PGP_ENCRYPT));
- old_flags[1] = gtk_toggle_action_get_active (action);
+ pgp_encrypt = gtk_toggle_action_get_active (action);
gtk_toggle_action_set_active (action, FALSE);
action = GTK_TOGGLE_ACTION (ACTION (SMIME_SIGN));
- old_flags[2] = gtk_toggle_action_get_active (action);
+ smime_sign = gtk_toggle_action_get_active (action);
gtk_toggle_action_set_active (action, FALSE);
action = GTK_TOGGLE_ACTION (ACTION (SMIME_ENCRYPT));
- old_flags[3] = gtk_toggle_action_get_active (action);
+ smime_encrypt = gtk_toggle_action_get_active (action);
gtk_toggle_action_set_active (action, FALSE);
- msg = build_message (composer, TRUE);
+ msg = build_message (composer, TRUE, TRUE);
if (msg == NULL)
return NULL;
- p->send_html = old_send_html;
-
action = GTK_TOGGLE_ACTION (ACTION (PGP_SIGN));
- gtk_toggle_action_set_active (action, old_flags[0]);
+ gtk_toggle_action_set_active (action, pgp_sign);
action = GTK_TOGGLE_ACTION (ACTION (PGP_ENCRYPT));
- gtk_toggle_action_set_active (action, old_flags[1]);
+ gtk_toggle_action_set_active (action, pgp_encrypt);
action = GTK_TOGGLE_ACTION (ACTION (SMIME_SIGN));
- gtk_toggle_action_set_active (action, old_flags[2]);
+ gtk_toggle_action_set_active (action, smime_sign);
action = GTK_TOGGLE_ACTION (ACTION (SMIME_ENCRYPT));
- gtk_toggle_action_set_active (action, old_flags[3]);
+ gtk_toggle_action_set_active (action, smime_encrypt);
if (msg == NULL)
return NULL;
@@ -4217,23 +4241,25 @@
/* Attach account info to the draft. */
account = e_composer_header_table_get_account (table);
if (account && account->name)
- camel_medium_set_header (CAMEL_MEDIUM (msg), "X-Evolution-Account", account->uid);
+ camel_medium_set_header (
+ CAMEL_MEDIUM (msg),
+ "X-Evolution-Account", account->uid);
- /* build_message () set this to text/html since we set p->send_html to
- TRUE before calling e_msg_composer_get_message () */
- if (!p->send_html)
- flags = g_string_new ("text/plain");
- else
- flags = g_string_new ("text/html");
+ flags = g_string_new (html_content ? "text/html" : "text/plain");
/* This should probably only save the setting if it is
* different from the from-account default? */
- for (i=0;i<4;i++) {
- if (old_flags[i])
- g_string_append_printf (flags, ", %s", emc_draft_format_names[i]);
- }
+ if (pgp_sign)
+ g_string_append (flags, ", pgp-sign");
+ if (pgp_encrypt)
+ g_string_append (flags, ", pgp-encrypt");
+ if (smime_sign)
+ g_string_append (flags, ", smime-sign");
+ if (smime_encrypt)
+ g_string_append (flags, ", smime-encrypt");
- camel_medium_set_header (CAMEL_MEDIUM (msg), "X-Evolution-Format", flags->str);
+ camel_medium_set_header (
+ CAMEL_MEDIUM (msg), "X-Evolution-Format", flags->str);
g_string_free (flags, TRUE);
return msg;
@@ -4357,11 +4383,14 @@
GnomeVFSResult result;
gchar *type = NULL;
+ g_return_val_if_fail (filename != NULL, NULL);
+
info = gnome_vfs_file_info_new ();
- result = gnome_vfs_get_file_info (filename, info,
- GNOME_VFS_FILE_INFO_GET_MIME_TYPE |
- GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE |
- GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
+ result = gnome_vfs_get_file_info (
+ filename, info,
+ GNOME_VFS_FILE_INFO_GET_MIME_TYPE |
+ GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE |
+ GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
if (result == GNOME_VFS_OK)
type = g_strdup (gnome_vfs_file_info_get_mime_type (info));
@@ -4370,54 +4399,6 @@
return type;
}
-
-/**
- * e_msg_composer_set_changed:
- * @composer: An EMsgComposer object.
- *
- * Mark the composer as changed, so before the composer gets destroyed
- * the user will be prompted about unsaved changes.
- **/
-void
-e_msg_composer_set_changed (EMsgComposer *composer)
-{
- EMsgComposerPrivate *p = composer->priv;
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- p->has_changed = TRUE;
-}
-
-
-/**
- * e_msg_composer_unset_changed:
- * @composer: An EMsgComposer object.
- *
- * Mark the composer as unchanged, so no prompt about unsaved changes
- * will appear before destroying the composer.
- **/
-void
-e_msg_composer_unset_changed (EMsgComposer *composer)
-{
- EMsgComposerPrivate *p = composer->priv;
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- p->has_changed = FALSE;
-}
-
-gboolean
-e_msg_composer_is_dirty (EMsgComposer *composer)
-{
- GtkhtmlEditor *editor;
-
- g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
-
- editor = GTKHTML_EDITOR (composer);
-
- return composer->priv->has_changed ||
- (gtkhtml_editor_has_undo (editor) &&
- !gtkhtml_editor_run_command (editor, "is-saved"));
-}
-
/**
* e_msg_composer_get_raw_message_text:
*
@@ -4451,20 +4432,12 @@
}
void
-e_msg_composer_set_enable_autosave (EMsgComposer *composer, gboolean enabled)
+e_msg_composer_set_enable_autosave (EMsgComposer *composer,
+ gboolean enabled)
{
e_composer_autosave_set_enabled (composer, enabled);
}
-void
-e_msg_composer_drop_editor_undo (EMsgComposer *composer)
-{
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- gtkhtml_editor_drop_undo (GTKHTML_EDITOR (composer));
-}
-
-
gboolean
e_msg_composer_request_close_all (void)
{
@@ -4555,21 +4528,18 @@
}
void
-e_msg_composer_show_attachments_ui (EMsgComposer *composer)
+e_msg_composer_set_alternative (EMsgComposer *composer,
+ gboolean alt)
{
EMsgComposerPrivate *p = composer->priv;
+ GtkhtmlEditor *editor;
- if (e_attachment_bar_get_num_attachments (E_ATTACHMENT_BAR (p->attachment_bar)))
- show_attachments (composer, TRUE);
-}
+ g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-void
-e_msg_composer_set_alternative (EMsgComposer *composer, gboolean alt)
-{
- EMsgComposerPrivate *p = composer->priv;
+ editor = GTKHTML_EDITOR (composer);
p->is_alternative = alt;
- p->send_html = !alt;
+ gtkhtml_editor_set_html_mode (editor, !alt);
}
void
@@ -4775,17 +4745,6 @@
}
void
-e_msg_composer_set_saved (EMsgComposer *composer)
-{
- GtkhtmlEditor *editor;
-
- g_return_if_fail (E_IS_MSG_COMPOSER (composer));
-
- editor = GTKHTML_EDITOR (composer);
- gtkhtml_editor_run_command (editor, "saved");
-}
-
-void
e_msg_composer_set_send_options (EMsgComposer *composer,
gboolean send_enable)
{
Modified: branches/mbarnes-composer/composer/e-msg-composer.h
==============================================================================
--- branches/mbarnes-composer/composer/e-msg-composer.h (original)
+++ branches/mbarnes-composer/composer/e-msg-composer.h Sat Mar 29 05:22:40 2008
@@ -83,9 +83,6 @@
void e_msg_composer_send (EMsgComposer *composer);
void e_msg_composer_save_draft (EMsgComposer *composer);
-void e_msg_composer_show_attachments_ui
- (EMsgComposer *composer);
-
void e_msg_composer_set_alternative (EMsgComposer *composer,
gboolean alt);
@@ -129,9 +126,6 @@
void e_msg_composer_clear_inlined_table
(EMsgComposer *composer);
gchar * e_msg_composer_guess_mime_type (const gchar *filename);
-void e_msg_composer_set_changed (EMsgComposer *composer);
-void e_msg_composer_unset_changed (EMsgComposer *composer);
-gboolean e_msg_composer_is_dirty (EMsgComposer *composer);
void e_msg_composer_set_enable_autosave
(EMsgComposer *composer,
gboolean enabled);
@@ -143,7 +137,6 @@
(EMsgComposer *composer,
CamelMimeMessage *message,
gboolean just_inlines);
-void e_msg_composer_drop_editor_undo (EMsgComposer *composer);
gboolean e_msg_composer_request_close_all(void);
EMsgComposer * e_msg_composer_load_from_file (const gchar *filename);
@@ -167,7 +160,6 @@
EComposerHeaderTable *
e_msg_composer_get_header_table (EMsgComposer *composer);
-void e_msg_composer_set_saved (EMsgComposer *composer);
void e_msg_composer_set_send_options (EMsgComposer *composer,
gboolean send_enable);
GByteArray * e_msg_composer_get_raw_message_text
Modified: branches/mbarnes-composer/mail/em-composer-prefs.c
==============================================================================
--- branches/mbarnes-composer/mail/em-composer-prefs.c (original)
+++ branches/mbarnes-composer/mail/em-composer-prefs.c Sat Mar 29 05:22:40 2008
@@ -307,7 +307,8 @@
}
editor = e_signature_editor_new ();
- e_signature_editor_set_signature (editor, sig);
+ e_signature_editor_set_signature (
+ E_SIGNATURE_EDITOR (editor), sig);
parent = gtk_widget_get_toplevel ((GtkWidget *) prefs);
if (GTK_WIDGET_TOPLEVEL (parent))
Modified: branches/mbarnes-composer/mail/em-composer-utils.c
==============================================================================
--- branches/mbarnes-composer/mail/em-composer-utils.c (original)
+++ branches/mbarnes-composer/mail/em-composer-utils.c Sat Mar 29 05:22:40 2008
@@ -472,7 +472,7 @@
if (!ok)
goto done;
- e_msg_composer_set_saved (sdi->composer);
+ gtkhtml_editor_set_changed (GTKHTML_EDITOR (sdi->composer), FALSE);
if ((emcs = sdi->emcs) == NULL) {
emcs = emcs_new ();
@@ -662,13 +662,15 @@
em_utils_compose_new_message (const char *fromuri)
{
GtkWidget *composer;
+ GtkhtmlEditor *editor;
composer = (GtkWidget *) create_new_composer ("", fromuri);
if (composer == NULL)
return;
- e_msg_composer_unset_changed ((EMsgComposer *)composer);
- e_msg_composer_drop_editor_undo ((EMsgComposer *)composer);
+ editor = GTKHTML_EDITOR (composer);
+ gtkhtml_editor_set_changed (editor, FALSE);
+ gtkhtml_editor_drop_undo (editor);
gtk_widget_show (composer);
}
@@ -685,6 +687,7 @@
em_utils_compose_new_message_with_mailto (const char *url, const char *fromuri)
{
EMsgComposer *composer;
+ GtkhtmlEditor *editor;
EComposerHeaderTable *table;
EAccount *account = NULL;
@@ -700,8 +703,9 @@
&& (account = mail_config_get_account_by_source_url(fromuri)))
e_composer_header_table_set_account_name (table, account->name);
- e_msg_composer_unset_changed (composer);
- e_msg_composer_drop_editor_undo (composer);
+ editor = GTKHTML_EDITOR (composer);
+ gtkhtml_editor_set_changed (editor, FALSE);
+ gtkhtml_editor_drop_undo (editor);
gtk_widget_show ((GtkWidget *) composer);
gdk_window_raise (((GtkWidget *) composer)->window);
@@ -719,6 +723,7 @@
em_utils_post_to_folder (CamelFolder *folder)
{
EMsgComposer *composer;
+ GtkhtmlEditor *editor;
EComposerHeaderTable *table;
EAccount *account;
@@ -745,8 +750,9 @@
em_composer_utils_setup_default_callbacks (composer);
- e_msg_composer_unset_changed (composer);
- e_msg_composer_drop_editor_undo (composer);
+ editor = GTKHTML_EDITOR (composer);
+ gtkhtml_editor_set_changed (editor, FALSE);
+ gtkhtml_editor_drop_undo (editor);
gtk_widget_show ((GtkWidget *) composer);
gdk_window_raise (((GtkWidget *) composer)->window);
@@ -764,6 +770,7 @@
em_utils_post_to_url (const char *url)
{
EMsgComposer *composer;
+ GtkhtmlEditor *editor;
EComposerHeaderTable *table;
composer = e_msg_composer_new_with_type (E_MSG_COMPOSER_POST);
@@ -779,8 +786,9 @@
em_composer_utils_setup_default_callbacks (composer);
- e_msg_composer_unset_changed (composer);
- e_msg_composer_drop_editor_undo (composer);
+ editor = GTKHTML_EDITOR (composer);
+ gtkhtml_editor_set_changed (editor, FALSE);
+ gtkhtml_editor_drop_undo (editor);
gtk_widget_show ((GtkWidget *) composer);
}
@@ -791,11 +799,14 @@
edit_message (CamelMimeMessage *message, CamelFolder *drafts, const char *uid)
{
EMsgComposer *composer;
+ GtkhtmlEditor *editor;
composer = e_msg_composer_new_with_message (message);
em_composer_utils_setup_callbacks (composer, NULL, NULL, 0, 0, drafts, uid);
- e_msg_composer_unset_changed (composer);
- e_msg_composer_drop_editor_undo (composer);
+
+ editor = GTKHTML_EDITOR (composer);
+ gtkhtml_editor_set_changed (editor, FALSE);
+ gtkhtml_editor_drop_undo (editor);
gtk_widget_show (GTK_WIDGET (composer));
}
@@ -856,14 +867,17 @@
forward_attached (CamelFolder *folder, GPtrArray *messages, CamelMimePart *part, char *subject, const char *fromuri)
{
EMsgComposer *composer;
+ GtkhtmlEditor *editor;
composer = create_new_composer (subject, fromuri);
if (composer == NULL)
return;
e_msg_composer_attach (composer, part);
- e_msg_composer_unset_changed (composer);
- e_msg_composer_drop_editor_undo (composer);
+
+ editor = GTKHTML_EDITOR (editor);
+ gtkhtml_editor_set_changed (editor, FALSE);
+ gtkhtml_editor_drop_undo (editor);
gtk_widget_show (GTK_WIDGET (composer));
}
@@ -902,6 +916,7 @@
{
CamelMimeMessage *message;
EMsgComposer *composer;
+ GtkhtmlEditor *editor;
char *subject, *text;
int i;
guint32 flags;
@@ -929,8 +944,10 @@
e_msg_composer_add_message_attachments(composer, message, FALSE);
e_msg_composer_set_body_text (composer, text, len);
- e_msg_composer_unset_changed (composer);
- e_msg_composer_drop_editor_undo (composer);
+
+ editor = GTKHTML_EDITOR (composer);
+ gtkhtml_editor_set_changed (editor, FALSE);
+ gtkhtml_editor_drop_undo (editor);
gtk_widget_show (GTK_WIDGET (composer));
}
@@ -1100,14 +1117,17 @@
em_utils_redirect_message (CamelMimeMessage *message)
{
EMsgComposer *composer;
+ GtkhtmlEditor *editor;
g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message));
composer = redirect_get_composer (message);
gtk_widget_show (GTK_WIDGET (composer));
- e_msg_composer_unset_changed (composer);
- e_msg_composer_drop_editor_undo (composer);
+
+ editor = GTKHTML_EDITOR (composer);
+ gtkhtml_editor_set_changed (editor, FALSE);
+ gtkhtml_editor_drop_undo (editor);
}
static void
@@ -1501,7 +1521,7 @@
e_msg_composer_add_header (composer, "References", references);
}
- e_msg_composer_drop_editor_undo (composer);
+ gtkhtml_editor_drop_undo (GTKHTML_EDITOR (composer));
return composer;
}
@@ -1934,7 +1954,7 @@
break;
}
- e_msg_composer_drop_editor_undo (composer);
+ gtkhtml_editor_drop_undo (GTKHTML_EDITOR (composer));
}
struct _reply_data {
@@ -2049,7 +2069,8 @@
em_composer_utils_setup_callbacks (composer, folder, uid, flags, flags, NULL, NULL);
gtk_widget_show (GTK_WIDGET (composer));
- e_msg_composer_unset_changed (composer);
+
+ gtkhtml_editor_set_changed (GTKHTML_EDITOR (composer), FALSE);
}
/* Posting replies... */
@@ -2063,6 +2084,7 @@
EDestination **tov = NULL;
CamelFolder *real_folder;
EMsgComposer *composer;
+ GtkhtmlEditor *editor;
EComposerHeaderTable *table;
char *subject, *url;
EAccount *account;
@@ -2092,6 +2114,7 @@
get_reply_sender (message, to, NULL);
composer = e_msg_composer_new_with_type (E_MSG_COMPOSER_MAIL_POST);
+ editor = GTKHTML_EDITOR (composer);
/* construct the tov/ccv */
tov = em_utils_camel_address_to_destination (to);
@@ -2140,7 +2163,7 @@
e_msg_composer_add_header (composer, "References", references);
}
- e_msg_composer_drop_editor_undo (composer);
+ gtkhtml_editor_drop_undo (editor);
e_msg_composer_add_message_attachments (composer, message, TRUE);
@@ -2149,7 +2172,8 @@
em_composer_utils_setup_callbacks (composer, real_folder, real_uid, flags, flags, NULL, NULL);
gtk_widget_show (GTK_WIDGET (composer));
- e_msg_composer_unset_changed (composer);
+
+ gtkhtml_editor_set_changed (editor, FALSE);
camel_object_unref (real_folder);
camel_object_unref(to);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]