diff options
Diffstat (limited to 'mail')
-rw-r--r-- | mail/e-mail-attachment-bar.c | 153 | ||||
-rw-r--r-- | mail/em-format-html-display.c | 106 |
2 files changed, 114 insertions, 145 deletions
diff --git a/mail/e-mail-attachment-bar.c b/mail/e-mail-attachment-bar.c index 97f5a7fb00..0043dc383f 100644 --- a/mail/e-mail-attachment-bar.c +++ b/mail/e-mail-attachment-bar.c @@ -44,6 +44,8 @@ struct _EMailAttachmentBarPrivate { GtkWidget *tree_frame; GtkWidget *status_icon; GtkWidget *status_label; + GtkWidget *save_all_button; + GtkWidget *save_one_button; gint active_view; guint expanded : 1; @@ -93,7 +95,9 @@ mail_attachment_bar_update_status (EMailAttachmentBar *bar) { EAttachmentView *view; EAttachmentStore *store; + GtkActivatable *activatable; GtkExpander *expander; + GtkAction *action; GtkLabel *label; gint num_attachments; guint64 total_size; @@ -116,6 +120,14 @@ mail_attachment_bar_update_status (EMailAttachmentBar *bar) gtk_label_set_markup (label, markup); g_free (markup); + activatable = GTK_ACTIVATABLE (bar->priv->save_all_button); + action = gtk_activatable_get_related_action (activatable); + gtk_action_set_visible (action, (num_attachments > 1)); + + activatable = GTK_ACTIVATABLE (bar->priv->save_one_button); + action = gtk_activatable_get_related_action (activatable); + gtk_action_set_visible (action, (num_attachments == 1)); + g_free (display_size); } @@ -237,6 +249,16 @@ mail_attachment_bar_dispose (GObject *object) priv->status_label = NULL; } + if (priv->save_all_button != NULL) { + g_object_unref (priv->save_all_button); + priv->save_all_button = NULL; + } + + if (priv->save_one_button != NULL) { + g_object_unref (priv->save_one_button); + priv->save_one_button = NULL; + } + /* Chain up to parent's dispose() method. */ G_OBJECT_CLASS (parent_class)->dispose (object); } @@ -273,6 +295,22 @@ mail_attachment_bar_constructed (GObject *object) G_OBJECT (priv->vbox), "visible"); } +static void +mail_attachment_bar_size_request (GtkWidget *widget, + GtkRequisition *requisition) +{ + /* XXX This works around GtkHTMLEmbedded brokenness. + * Once we finally move to WebKit, remove this. */ + if (!GTK_WIDGET_VISIBLE (widget)) { + requisition->width = 0; + requisition->height = 0; + return; + } + + /* Chain up to parent's size_request() method. */ + GTK_WIDGET_CLASS (parent_class)->size_request (widget, requisition); +} + static EAttachmentViewPrivate * mail_attachment_bar_get_private (EAttachmentView *view) { @@ -381,6 +419,7 @@ static void mail_attachment_bar_class_init (EMailAttachmentBarClass *class) { GObjectClass *object_class; + GtkWidgetClass *widget_class; parent_class = g_type_class_peek_parent (class); g_type_class_add_private (class, sizeof (EMailAttachmentBarPrivate)); @@ -391,6 +430,9 @@ mail_attachment_bar_class_init (EMailAttachmentBarClass *class) object_class->dispose = mail_attachment_bar_dispose; object_class->constructed = mail_attachment_bar_constructed; + widget_class = GTK_WIDGET_CLASS (class); + widget_class->size_request = mail_attachment_bar_size_request; + g_object_class_install_property ( object_class, PROP_ACTIVE_VIEW, @@ -436,10 +478,12 @@ mail_attachment_bar_iface_init (EAttachmentViewIface *iface) static void mail_attachment_bar_init (EMailAttachmentBar *bar) { + EAttachmentView *view; GtkTreeSelection *selection; GtkSizeGroup *size_group; GtkWidget *container; GtkWidget *widget; + GtkAction *action; bar->priv = E_MAIL_ATTACHMENT_BAR_GET_PRIVATE (bar); bar->priv->model = e_attachment_store_new (); @@ -449,12 +493,55 @@ mail_attachment_bar_init (EMailAttachmentBar *bar) /* Keep the expander label and save button the same height. */ size_group = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL); + /* Construct the Attachment Views */ + + container = GTK_WIDGET (bar); + + widget = gtk_vbox_new (FALSE, 0); + gtk_box_pack_end (GTK_BOX (container), widget, FALSE, FALSE, 0); + bar->priv->vbox = g_object_ref (widget); + gtk_widget_show (widget); + + container = bar->priv->vbox; + + widget = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (widget), GTK_SHADOW_IN); + gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0); + bar->priv->icon_frame = g_object_ref (widget); + gtk_widget_show (widget); + + container = widget; + + widget = e_attachment_icon_view_new (); + GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS); + gtk_icon_view_set_model (GTK_ICON_VIEW (widget), bar->priv->model); + gtk_container_add (GTK_CONTAINER (container), widget); + bar->priv->icon_view = g_object_ref (widget); + gtk_widget_show (widget); + + container = bar->priv->vbox; + + widget = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (widget), GTK_SHADOW_IN); + gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0); + bar->priv->tree_frame = g_object_ref (widget); + gtk_widget_show (widget); + + container = widget; + + widget = e_attachment_tree_view_new (); + GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS); + gtk_tree_view_set_model (GTK_TREE_VIEW (widget), bar->priv->model); + gtk_container_add (GTK_CONTAINER (container), widget); + bar->priv->tree_view = g_object_ref (widget); + gtk_widget_show (widget); + /* Construct the Controls */ container = GTK_WIDGET (bar); widget = gtk_hbox_new (FALSE, 12); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); + gtk_box_pack_end (GTK_BOX (container), widget, FALSE, FALSE, 0); gtk_widget_show (widget); container = widget; @@ -465,6 +552,27 @@ mail_attachment_bar_init (EMailAttachmentBar *bar) bar->priv->expander = g_object_ref (widget); gtk_widget_show (widget); + /* The "Save All" button proxies the "save-all" action from + * one of the two attachment views. Doesn't matter which. */ + widget = gtk_button_new (); + view = E_ATTACHMENT_VIEW (bar->priv->icon_view); + action = e_attachment_view_get_action (view, "save-all"); + gtk_button_set_image (GTK_BUTTON (widget), gtk_image_new ()); + gtk_activatable_set_related_action (GTK_ACTIVATABLE (widget), action); + gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); + bar->priv->save_all_button = g_object_ref (widget); + gtk_widget_show (widget); + + /* Same deal with the "Save" button. */ + widget = gtk_button_new (); + view = E_ATTACHMENT_VIEW (bar->priv->icon_view); + action = e_attachment_view_get_action (view, "save-one"); + gtk_button_set_image (GTK_BUTTON (widget), gtk_image_new ()); + gtk_activatable_set_related_action (GTK_ACTIVATABLE (widget), action); + gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); + bar->priv->save_one_button = g_object_ref (widget); + gtk_widget_show (widget); + widget = gtk_alignment_new (1.0, 0.5, 0.0, 0.0); gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0); gtk_widget_show (widget); @@ -500,49 +608,6 @@ mail_attachment_bar_init (EMailAttachmentBar *bar) bar->priv->status_label = g_object_ref (widget); gtk_widget_show (widget); - /* Construct the Attachment Views */ - - container = GTK_WIDGET (bar); - - widget = gtk_vbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - bar->priv->vbox = g_object_ref (widget); - gtk_widget_show (widget); - - container = bar->priv->vbox; - - widget = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (widget), GTK_SHADOW_IN); - gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0); - bar->priv->icon_frame = g_object_ref (widget); - gtk_widget_show (widget); - - container = widget; - - widget = e_attachment_icon_view_new (); - GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS); - gtk_icon_view_set_model (GTK_ICON_VIEW (widget), bar->priv->model); - gtk_container_add (GTK_CONTAINER (container), widget); - bar->priv->icon_view = g_object_ref (widget); - gtk_widget_show (widget); - - container = bar->priv->vbox; - - widget = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (widget), GTK_SHADOW_IN); - gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0); - bar->priv->tree_frame = g_object_ref (widget); - gtk_widget_show (widget); - - container = widget; - - widget = e_attachment_tree_view_new (); - GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS); - gtk_tree_view_set_model (GTK_TREE_VIEW (widget), bar->priv->model); - gtk_container_add (GTK_CONTAINER (container), widget); - bar->priv->tree_view = g_object_ref (widget); - gtk_widget_show (widget); - selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW (bar->priv->tree_view)); diff --git a/mail/em-format-html-display.c b/mail/em-format-html-display.c index 1bbe282394..346efff92a 100644 --- a/mail/em-format-html-display.c +++ b/mail/em-format-html-display.c @@ -1319,6 +1319,8 @@ efhd_attachment_button(EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObje parent = gtk_widget_get_toplevel (GTK_WIDGET (efh->html)); parent = GTK_WIDGET_TOPLEVEL (parent) ? parent : NULL; + gtk_widget_show (efhd->priv->attachment_bar); + view = E_ATTACHMENT_VIEW (efhd->priv->attachment_bar); store = e_attachment_view_get_store (view); e_attachment_store_add_attachment (store, info->attachment); @@ -1326,38 +1328,6 @@ efhd_attachment_button(EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObje info->attachment, (GAsyncReadyCallback) e_attachment_load_handle_error, parent); -#if 0 /* KILL-BONOBO */ - file = camel_mime_part_get_filename(info->puri.part); - - new = info->attachment; - - if (!file) { - file = "attachment.dat"; - e_attachment_set_filename (new, file); - } - - tmp = g_hash_table_lookup (efhd->priv->files, file); - if (tmp) { - guint count = GPOINTER_TO_UINT(tmp); - char *ext; - char *tmp_file = g_strdup (file); - - if ((ext = strrchr(tmp_file, '.'))) { - ext[0] = 0; - new_file = g_strdup_printf("%s(%d).%s", tmp_file, count++, ext+1); - } else { - new_file = g_strdup_printf("%s(%d)", tmp_file, count++); - } - - g_free (tmp_file); - g_hash_table_insert (efhd->priv->files, g_strdup(file), GUINT_TO_POINTER(count)); - e_attachment_set_filename (new, new_file); - g_free (new_file); - } else { - g_hash_table_insert (efhd->priv->files, g_strdup(file), GUINT_TO_POINTER(1)); - } -#endif - e_attachment_set_encrypted (info->attachment, info->encrypt); e_attachment_set_signed (info->attachment, info->sign); } @@ -1477,73 +1447,6 @@ efhd_attachment_frame(EMFormat *emf, CamelStream *stream, EMFormatPURI *puri) } static void -attachments_save_all_clicked (GtkWidget *widget, EMFormatHTMLDisplay *efhd) -{ -#if 0 /* KILL-BONOBO */ - GSList *attachment_parts; - guint n_attachment_parts; - gpointer parent; - - attachment_parts = e_attachment_bar_get_parts ( - E_ATTACHMENT_BAR (efhd->priv->attachment_bar)); - n_attachment_parts = g_slist_length (attachment_parts); - g_return_if_fail (n_attachment_parts > 0); - - parent = gtk_widget_get_toplevel (widget); - parent = GTK_WIDGET_TOPLEVEL (parent) ? parent : NULL; - - if (n_attachment_parts == 1) - em_utils_save_part ( - parent, _("Save attachment as"), - attachment_parts->data); - else - em_utils_save_parts ( - parent, _("Select folder to save all attachments"), - attachment_parts); - - g_slist_free (attachment_parts); -#endif -} - -#if 0 /* KILL-BONOBO -- Move this to EAttachmentView */ -static void -efhd_bar_save_selected(EPopup *ep, EPopupItem *item, void *data) -{ - EMFormatHTMLDisplay *efhd = (EMFormatHTMLDisplay *)data; - GSList *attachment_parts, *tmp; - GSList *parts = NULL; - GtkWidget *widget; - gpointer parent; - - widget = efhd->priv->attachment_bar; - parent = gtk_widget_get_toplevel (widget); - parent = GTK_WIDGET_TOPLEVEL (parent) ? parent : NULL; - - attachment_parts = e_attachment_bar_get_selected(E_ATTACHMENT_BAR(widget)); - - for (tmp = attachment_parts; tmp; tmp=tmp->next) { - EAttachment *attachment = tmp->data; - CamelMimePart *mime_part; - - mime_part = e_attachment_get_mime_part (attachment); - parts = g_slist_prepend (parts, mime_part); - } - - parts = g_slist_reverse(parts); - em_utils_save_parts(parent, _("Select folder to save selected attachments..."), parts); - g_slist_free (parts); - - g_slist_foreach(attachment_parts, (GFunc)g_object_unref, NULL); - g_slist_free (attachment_parts); -} - -static EPopupItem efhd_bar_menu_items[] = { - { E_POPUP_BAR, "05.display", }, - { E_POPUP_ITEM, "05.display.01", N_("_Save Selected..."), efhd_bar_save_selected, NULL, NULL, EM_POPUP_ATTACHMENTS_MULTIPLE}, -}; -#endif - -static void efhd_bar_resize (EMFormatHTML *efh, GtkAllocation *event) { @@ -1569,15 +1472,16 @@ efhd_add_bar (EMFormatHTML *efh, { EMFormatHTMLDisplay *efhd = (EMFormatHTMLDisplay *)efh; struct _EMFormatHTMLDisplayPrivate *priv = efhd->priv; + GtkRequisition requisition; GtkWidget *widget; widget = e_mail_attachment_bar_new (); gtk_container_add (GTK_CONTAINER (eb), widget); priv->attachment_bar = g_object_ref (widget); - gtk_widget_show (widget); + gtk_widget_hide (widget); g_signal_connect_swapped ( - widget, "size-allocate", + eb, "size-allocate", G_CALLBACK (efhd_bar_resize), efh); return TRUE; |