aboutsummaryrefslogtreecommitdiffstats
path: root/composer
diff options
context:
space:
mode:
Diffstat (limited to 'composer')
-rw-r--r--composer/ChangeLog16
-rw-r--r--composer/e-msg-composer-attachment-bar.c139
-rw-r--r--composer/e-msg-composer-attachment.c57
-rw-r--r--composer/e-msg-composer.c18
4 files changed, 127 insertions, 103 deletions
diff --git a/composer/ChangeLog b/composer/ChangeLog
index 577eb84dc6..a3aeabc391 100644
--- a/composer/ChangeLog
+++ b/composer/ChangeLog
@@ -1,5 +1,16 @@
2001-12-11 Jeffrey Stedfast <fejj@ximian.com>
+ * e-msg-composer-attachment.c (e_msg_composer_attachment_edit):
+ Attach to the parent widget's destroy signal - when that gets
+ destroyed, we need to cancel the editor dialog too. Also connect
+ to our parent window's "hide" signal so that when the composer
+ gets hidden (ie, it's being sent), we also close the dialogs.
+
+ * e-msg-composer.c (init): Default composer->enable_autosave to
+ TRUE.
+
+2001-12-11 Jeffrey Stedfast <fejj@ximian.com>
+
* e-msg-composer-select-file.c (confirm): If multiple-selection is
enabled but nothing is slected, fall back to using the filename in
the entry box as the "selected" file.
@@ -52,6 +63,11 @@
* e-msg-composer.c (drag_data_received): Allow drag & drop for
vcards.
+2001-11-30 Jeffrey Stedfast <fejj@ximian.com>
+
+ * e-msg-composer.c (setup_ui): Change the FileSend tooltip the be
+ the same as the FileSendLater tooltip if we are in offline mode.
+
2001-11-14 Larry Ewing <lewing@ximian.com>
* e-msg-composer.c (create_composer): popup failure dialog if we
diff --git a/composer/e-msg-composer-attachment-bar.c b/composer/e-msg-composer-attachment-bar.c
index 16c68bf910..59e872d64c 100644
--- a/composer/e-msg-composer-attachment-bar.c
+++ b/composer/e-msg-composer-attachment-bar.c
@@ -91,11 +91,11 @@ static gchar *
size_to_string (gulong size)
{
gchar *size_string;
-
+
/* FIXME: The following should probably go into a separate module, as
we might have to do the same thing in other places as well. Also,
I am not sure this will be OK for all the languages. */
-
+
if (size < 1e3L) {
if (size == 1)
size_string = g_strdup (_("1 byte"));
@@ -104,7 +104,7 @@ size_to_string (gulong size)
(guint) size);
} else {
gdouble displayed_size;
-
+
if (size < 1e6L) {
displayed_size = (gdouble) size / 1.0e3;
size_string = g_strdup_printf (_("%.1fK"),
@@ -119,7 +119,7 @@ size_to_string (gulong size)
displayed_size);
}
}
-
+
return size_string;
}
@@ -130,11 +130,13 @@ free_attachment_list (EMsgComposerAttachmentBar *bar)
{
EMsgComposerAttachmentBarPrivate *priv;
GList *p;
-
+
priv = bar->priv;
-
+
for (p = priv->attachments; p != NULL; p = p->next)
gtk_object_unref (GTK_OBJECT (p->data));
+
+ priv->attachments = NULL;
}
static void
@@ -203,9 +205,9 @@ remove_attachment (EMsgComposerAttachmentBar *bar,
bar->priv->attachments = g_list_remove (bar->priv->attachments,
attachment);
bar->priv->num_attachments--;
-
+
gtk_object_unref (GTK_OBJECT (attachment));
-
+
gtk_signal_emit (GTK_OBJECT (bar), signals[CHANGED]);
}
@@ -218,7 +220,7 @@ pixbuf_for_mime_type (const char *mime_type)
const char *icon_name;
char *filename = NULL;
GdkPixbuf *pixbuf;
-
+
icon_name = gnome_vfs_mime_get_value (mime_type, "icon-filename");
if (icon_name) {
if (*icon_name == '/') {
@@ -256,14 +258,14 @@ update (EMsgComposerAttachmentBar *bar)
EMsgComposerAttachmentBarPrivate *priv;
EIconList *icon_list;
GList *p;
-
+
priv = bar->priv;
icon_list = E_ICON_LIST (bar);
-
+
e_icon_list_freeze (icon_list);
-
+
e_icon_list_clear (icon_list);
-
+
/* FIXME could be faster, but we don't care. */
for (p = priv->attachments; p != NULL; p = p->next) {
EMsgComposerAttachment *attachment;
@@ -382,7 +384,7 @@ update (EMsgComposerAttachmentBar *bar)
g_free (desc);
g_free (label);
}
-
+
e_icon_list_thaw (icon_list);
}
@@ -394,13 +396,13 @@ remove_selected (EMsgComposerAttachmentBar *bar)
GList *attachment_list;
GList *p;
gint num;
-
+
icon_list = E_ICON_LIST (bar);
-
+
/* Weee! I am especially proud of this piece of cheesy code: it is
truly awful. But unless one attaches a huge number of files, it
will not be as greedy as intended. FIXME of course. */
-
+
attachment_list = NULL;
p = e_icon_list_get_selection (icon_list);
for (; p != NULL; p = p->next) {
@@ -409,12 +411,12 @@ remove_selected (EMsgComposerAttachmentBar *bar)
(g_list_nth (bar->priv->attachments, num)->data);
attachment_list = g_list_prepend (attachment_list, attachment);
}
-
+
for (p = attachment_list; p != NULL; p = p->next)
remove_attachment (bar, E_MSG_COMPOSER_ATTACHMENT (p->data));
-
+
g_list_free (attachment_list);
-
+
update (bar);
}
@@ -425,13 +427,13 @@ edit_selected (EMsgComposerAttachmentBar *bar)
EMsgComposerAttachment *attachment;
GList *selection;
gint num;
-
+
icon_list = E_ICON_LIST (bar);
-
+
selection = e_icon_list_get_selection (icon_list);
num = GPOINTER_TO_INT (selection->data);
attachment = g_list_nth (bar->priv->attachments, num)->data;
-
+
e_msg_composer_attachment_edit (attachment, GTK_WIDGET (bar));
}
@@ -468,7 +470,7 @@ add_cb (GtkWidget *widget,
gpointer data)
{
g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (data));
-
+
add_from_user (E_MSG_COMPOSER_ATTACHMENT_BAR (data));
}
@@ -477,9 +479,9 @@ properties_cb (GtkWidget *widget,
gpointer data)
{
EMsgComposerAttachmentBar *bar;
-
+
g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (data));
-
+
bar = E_MSG_COMPOSER_ATTACHMENT_BAR (data);
edit_selected (data);
}
@@ -489,9 +491,9 @@ remove_cb (GtkWidget *widget,
gpointer data)
{
EMsgComposerAttachmentBar *bar;
-
+
g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (data));
-
+
bar = E_MSG_COMPOSER_ATTACHMENT_BAR (data);
remove_selected (bar);
}
@@ -511,12 +513,12 @@ static GtkWidget *
get_icon_context_menu (EMsgComposerAttachmentBar *bar)
{
EMsgComposerAttachmentBarPrivate *priv;
-
+
priv = bar->priv;
if (priv->icon_context_menu == NULL)
priv->icon_context_menu = gnome_popup_menu_new
(icon_context_menu_info);
-
+
return priv->icon_context_menu;
}
@@ -526,7 +528,7 @@ popup_icon_context_menu (EMsgComposerAttachmentBar *bar,
GdkEventButton *event)
{
GtkWidget *menu;
-
+
menu = get_icon_context_menu (bar);
gnome_popup_menu_do_popup (menu, NULL, NULL, event, bar);
}
@@ -542,11 +544,11 @@ static GtkWidget *
get_context_menu (EMsgComposerAttachmentBar *bar)
{
EMsgComposerAttachmentBarPrivate *priv;
-
+
priv = bar->priv;
if (priv->context_menu == NULL)
priv->context_menu = gnome_popup_menu_new (context_menu_info);
-
+
return priv->context_menu;
}
@@ -555,7 +557,7 @@ popup_context_menu (EMsgComposerAttachmentBar *bar,
GdkEventButton *event)
{
GtkWidget *menu;
-
+
menu = get_context_menu (bar);
gnome_popup_menu_do_popup (menu, NULL, NULL, event, bar);
}
@@ -567,11 +569,11 @@ static void
destroy (GtkObject *object)
{
EMsgComposerAttachmentBar *bar;
-
+
bar = E_MSG_COMPOSER_ATTACHMENT_BAR (object);
-
+
free_attachment_list (bar);
-
+
if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
@@ -586,24 +588,23 @@ button_press_event (GtkWidget *widget,
EMsgComposerAttachmentBar *bar;
EIconList *icon_list;
gint icon_number;
-
+
bar = E_MSG_COMPOSER_ATTACHMENT_BAR (widget);
icon_list = E_ICON_LIST (widget);
-
+
if (event->button != 3)
return GTK_WIDGET_CLASS (parent_class)->button_press_event
(widget, event);
-
- icon_number = e_icon_list_get_icon_at (icon_list,
- event->x, event->y);
-
+
+ icon_number = e_icon_list_get_icon_at (icon_list, event->x, event->y);
+
if (icon_number >= 0) {
e_icon_list_select_icon (icon_list, icon_number);
popup_icon_context_menu (bar, icon_number, event);
} else {
popup_context_menu (bar, event);
}
-
+
return TRUE;
}
@@ -616,19 +617,19 @@ class_init (EMsgComposerAttachmentBarClass *class)
GtkObjectClass *object_class;
GtkWidgetClass *widget_class;
EIconListClass *icon_list_class;
-
+
object_class = GTK_OBJECT_CLASS (class);
widget_class = GTK_WIDGET_CLASS (class);
icon_list_class = E_ICON_LIST_CLASS (class);
-
+
parent_class = gtk_type_class (e_icon_list_get_type ());
-
+
object_class->destroy = destroy;
-
+
widget_class->button_press_event = button_press_event;
-
+
/* Setup signals. */
-
+
signals[CHANGED] =
gtk_signal_new ("changed",
GTK_RUN_LAST,
@@ -637,7 +638,7 @@ class_init (EMsgComposerAttachmentBarClass *class)
changed),
gtk_marshal_NONE__NONE,
GTK_TYPE_NONE, 0);
-
+
gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
}
@@ -647,21 +648,21 @@ init (EMsgComposerAttachmentBar *bar)
EMsgComposerAttachmentBarPrivate *priv;
guint icon_size, icon_height;
GdkFont *font;
-
+
priv = g_new (EMsgComposerAttachmentBarPrivate, 1);
-
+
priv->attachments = NULL;
priv->context_menu = NULL;
priv->icon_context_menu = NULL;
-
+
priv->num_attachments = 0;
-
+
bar->priv = priv;
-
+
/* FIXME partly hardcoded. We should compute height from the font, and
allow at least 2 lines for every item. */
icon_size = ICON_WIDTH + ICON_SPACING + ICON_BORDER + ICON_TEXT_SPACING;
-
+
font = GTK_WIDGET (bar)->style->font;
icon_height = icon_size + ((font->ascent + font->descent) * 2);
icon_size += 24;
@@ -674,7 +675,7 @@ GtkType
e_msg_composer_attachment_bar_get_type (void)
{
static GtkType type = 0;
-
+
if (type == 0) {
static const GtkTypeInfo info = {
"EMsgComposerAttachmentBar",
@@ -686,10 +687,10 @@ e_msg_composer_attachment_bar_get_type (void)
/* reserved_2 */ NULL,
(GtkClassInitFunc) NULL,
};
-
+
type = gtk_type_unique (e_icon_list_get_type (), &info);
}
-
+
return type;
}
@@ -698,25 +699,25 @@ e_msg_composer_attachment_bar_new (GtkAdjustment *adj)
{
EMsgComposerAttachmentBar *new;
EIconList *icon_list;
-
+
gdk_rgb_init ();
gtk_widget_push_visual (gdk_rgb_get_visual ());
gtk_widget_push_colormap (gdk_rgb_get_cmap ());
new = gtk_type_new (e_msg_composer_attachment_bar_get_type ());
gtk_widget_pop_visual ();
gtk_widget_pop_colormap ();
-
+
icon_list = E_ICON_LIST (new);
-
+
e_icon_list_construct (icon_list, ICON_WIDTH, 0);
-
+
e_icon_list_set_separators (icon_list, ICON_SEPARATORS);
e_icon_list_set_row_spacing (icon_list, ICON_ROW_SPACING);
e_icon_list_set_col_spacing (icon_list, ICON_COL_SPACING);
e_icon_list_set_icon_border (icon_list, ICON_BORDER);
e_icon_list_set_text_spacing (icon_list, ICON_TEXT_SPACING);
e_icon_list_set_selection_mode (icon_list, GTK_SELECTION_MULTIPLE);
-
+
return GTK_WIDGET (new);
}
@@ -773,7 +774,7 @@ e_msg_composer_attachment_bar_to_multipart (EMsgComposerAttachmentBar *bar,
{
EMsgComposerAttachmentBarPrivate *priv;
GList *p;
-
+
g_return_if_fail (bar != NULL);
g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (bar));
g_return_if_fail (multipart != NULL);
@@ -795,7 +796,7 @@ e_msg_composer_attachment_bar_get_num_attachments (EMsgComposerAttachmentBar *ba
{
g_return_val_if_fail (bar != NULL, 0);
g_return_val_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (bar), 0);
-
+
return bar->priv->num_attachments;
}
@@ -805,7 +806,7 @@ e_msg_composer_attachment_bar_attach (EMsgComposerAttachmentBar *bar,
const gchar *file_name)
{
g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (bar));
-
+
if (file_name == NULL)
add_from_user (bar);
else
@@ -817,6 +818,6 @@ e_msg_composer_attachment_bar_attach_mime_part (EMsgComposerAttachmentBar *bar,
CamelMimePart *part)
{
g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (bar));
-
+
add_from_mime_part (bar, part);
}
diff --git a/composer/e-msg-composer-attachment.c b/composer/e-msg-composer-attachment.c
index 8304fb445f..046ab1bfdd 100644
--- a/composer/e-msg-composer-attachment.c
+++ b/composer/e-msg-composer-attachment.c
@@ -1,7 +1,7 @@
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* e-msg-composer-attachment.c
*
- * Copyright (C) 1999 Ximian, Inc.
+ * Copyright (C) 1999,2001 Ximian, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
@@ -185,6 +185,7 @@ e_msg_composer_attachment_new (const char *file_name,
file_name, g_strerror (errno));
return NULL;
}
+
wrapper = camel_data_wrapper_new ();
camel_data_wrapper_construct_from_stream (wrapper, stream);
camel_object_unref (CAMEL_OBJECT (stream));
@@ -323,49 +324,47 @@ connect_widget (GladeXML *gui,
}
static void
-close_cb (GtkWidget *widget,
- gpointer data)
+close_cb (GtkWidget *widget, gpointer data)
{
EMsgComposerAttachment *attachment;
DialogData *dialog_data;
-
+
dialog_data = (DialogData *) data;
attachment = dialog_data->attachment;
-
+
gtk_widget_destroy (glade_xml_get_widget (attachment->editor_gui,
"dialog"));
gtk_object_unref (GTK_OBJECT (attachment->editor_gui));
attachment->editor_gui = NULL;
-
+
destroy_dialog_data (dialog_data);
}
static void
-ok_cb (GtkWidget *widget,
- gpointer data)
+ok_cb (GtkWidget *widget, gpointer data)
{
DialogData *dialog_data;
EMsgComposerAttachment *attachment;
- gchar *str;
+ char *str;
dialog_data = (DialogData *) data;
attachment = dialog_data->attachment;
-
+
str = e_utf8_gtk_entry_get_text (dialog_data->file_name_entry);
camel_mime_part_set_filename (attachment->body, str);
g_free (str);
-
+
str = e_utf8_gtk_entry_get_text (dialog_data->description_entry);
camel_mime_part_set_description (attachment->body, str);
g_free (str);
-
+
str = e_utf8_gtk_entry_get_text (dialog_data->mime_type_entry);
camel_mime_part_set_content_type (attachment->body, str);
camel_data_wrapper_set_mime_type (
camel_medium_get_content_object (CAMEL_MEDIUM (attachment->body)), str);
g_free (str);
-
+
switch (gtk_toggle_button_get_active (dialog_data->disposition_checkbox)) {
case 0:
camel_mime_part_set_disposition (attachment->body, "attachment");
@@ -377,7 +376,7 @@ ok_cb (GtkWidget *widget,
/* Hmmmm? */
break;
}
-
+
changed (attachment);
close_cb (widget, data);
}
@@ -388,7 +387,7 @@ file_name_focus_out_cb (GtkWidget *widget,
gpointer data)
{
DialogData *dialog_data;
-
+
dialog_data = (DialogData *) data;
update_mime_type (dialog_data);
}
@@ -400,32 +399,32 @@ e_msg_composer_attachment_edit (EMsgComposerAttachment *attachment,
{
DialogData *dialog_data;
GladeXML *editor_gui;
-
+
g_return_if_fail (attachment != NULL);
g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT (attachment));
-
+
if (attachment->editor_gui != NULL) {
GtkWidget *window;
-
+
window = glade_xml_get_widget (attachment->editor_gui,
"dialog");
gdk_window_show (window->window);
return;
}
-
+
editor_gui = glade_xml_new (E_GLADEDIR "/e-msg-composer-attachment.glade",
NULL);
if (editor_gui == NULL) {
g_warning ("Cannot load `e-msg-composer-attachment.glade'");
return;
}
-
+
attachment->editor_gui = editor_gui;
-
+
gtk_window_set_transient_for
(GTK_WINDOW (glade_xml_get_widget (editor_gui, "dialog")),
GTK_WINDOW (gtk_widget_get_toplevel (parent)));
-
+
dialog_data = g_new (DialogData, 1);
dialog_data->attachment = attachment;
dialog_data->dialog = glade_xml_get_widget (editor_gui, "dialog");
@@ -437,12 +436,12 @@ e_msg_composer_attachment_edit (EMsgComposerAttachment *attachment,
glade_xml_get_widget (editor_gui, "mime_type_entry"));
dialog_data->disposition_checkbox = GTK_TOGGLE_BUTTON (
glade_xml_get_widget (editor_gui, "disposition_checkbox"));
-
+
if (attachment != NULL) {
CamelContentType *content_type;
char *type;
const char *disposition;
-
+
set_entry (editor_gui, "file_name_entry",
camel_mime_part_get_filename (attachment->body));
set_entry (editor_gui, "description_entry",
@@ -451,15 +450,19 @@ e_msg_composer_attachment_edit (EMsgComposerAttachment *attachment,
type = header_content_type_simple (content_type);
set_entry (editor_gui, "mime_type_entry", type);
g_free (type);
-
+
disposition = camel_mime_part_get_disposition (attachment->body);
gtk_toggle_button_set_active (dialog_data->disposition_checkbox,
disposition && !g_strcasecmp (disposition, "inline"));
}
-
+
connect_widget (editor_gui, "ok_button", "clicked", ok_cb, dialog_data);
connect_widget (editor_gui, "close_button", "clicked", close_cb, dialog_data);
-
+
connect_widget (editor_gui, "file_name_entry", "focus_out_event",
file_name_focus_out_cb, dialog_data);
+
+ gtk_signal_connect (GTK_OBJECT (parent), "destroy", close_cb, dialog_data);
+ gtk_signal_connect (GTK_OBJECT (gtk_widget_get_toplevel (parent)), "hide",
+ close_cb, dialog_data);
}
diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c
index b81dd7aac1..605c587664 100644
--- a/composer/e-msg-composer.c
+++ b/composer/e-msg-composer.c
@@ -347,7 +347,7 @@ build_message (EMsgComposer *composer)
if (composer->send_html) {
clear_current_images (composer);
-
+
data = get_text (composer->persist_stream_interface, "text/html");
if (!data) {
/* The component has probably died */
@@ -401,7 +401,7 @@ build_message (EMsgComposer *composer)
add_inlined_images (composer, html_with_images);
clear_current_images (composer);
-
+
current = CAMEL_DATA_WRAPPER (html_with_images);
} else
current = CAMEL_DATA_WRAPPER (body);
@@ -415,7 +415,7 @@ build_message (EMsgComposer *composer)
camel_data_wrapper_set_mime_type (CAMEL_DATA_WRAPPER (multipart),
"multipart/alternative");
}
-
+
/* Generate a random boundary. */
camel_multipart_set_boundary (multipart, NULL);
@@ -431,16 +431,16 @@ build_message (EMsgComposer *composer)
if (composer->is_alternative) {
int i;
-
+
for (i = camel_multipart_get_number (multipart); i > 1; i--) {
part = camel_multipart_get_part (multipart, i - 1);
camel_medium_remove_header (CAMEL_MEDIUM (part), "Content-Disposition");
}
}
-
+
current = CAMEL_DATA_WRAPPER (multipart);
}
-
+
if (composer->pgp_sign || composer->pgp_encrypt) {
part = camel_mime_part_new ();
camel_medium_set_content_object (CAMEL_MEDIUM (part), current);
@@ -462,6 +462,8 @@ build_message (EMsgComposer *composer)
camel_internet_address_get (from, 0, NULL, &pgpid);
}
+ printf ("build_message(): pgpid = '%s'\n", pgpid);
+
mail_crypto_pgp_mime_part_sign (&part, pgpid, CAMEL_CIPHER_HASH_SHA1, &ex);
if (from)
@@ -1108,7 +1110,7 @@ autosave_save_draft (EMsgComposer *composer)
CamelMimeMessage *message;
CamelStream *stream;
char *file;
- gint fd;
+ int fd;
gboolean success = TRUE;
fd = composer->autosave_fd;
@@ -2270,6 +2272,8 @@ init (EMsgComposer *composer)
composer->has_changed = FALSE;
composer->charset = NULL;
+
+ composer->enable_autosave = TRUE;
composer->autosave_file = NULL;
composer->autosave_fd = -1;
}