diff options
-rw-r--r-- | calendar/gui/dialogs/Makefile.am | 7 | ||||
-rw-r--r-- | calendar/gui/dialogs/comp-editor.c | 236 | ||||
-rw-r--r-- | calendar/gui/dialogs/comp-editor.h | 2 | ||||
-rw-r--r-- | calendar/gui/dialogs/event-editor.c | 3 | ||||
-rw-r--r-- | calendar/gui/dialogs/task-editor.c | 3 | ||||
-rw-r--r-- | calendar/gui/e-cal-model-calendar.c | 3 | ||||
-rw-r--r-- | calendar/gui/e-calendar-table.c | 2 | ||||
-rw-r--r-- | calendar/gui/e-calendar-view.c | 12 | ||||
-rw-r--r-- | calendar/gui/e-day-view-main-item.c | 25 | ||||
-rw-r--r-- | calendar/gui/e-day-view-top-item.c | 11 | ||||
-rw-r--r-- | calendar/gui/e-day-view.c | 8 | ||||
-rw-r--r-- | calendar/gui/e-day-view.h | 1 | ||||
-rw-r--r-- | calendar/gui/e-itip-control.c | 6 | ||||
-rw-r--r-- | calendar/gui/e-week-view-event-item.c | 21 | ||||
-rw-r--r-- | calendar/gui/e-week-view.c | 5 | ||||
-rw-r--r-- | calendar/gui/e-week-view.h | 1 | ||||
-rw-r--r-- | calendar/gui/itip-utils.c | 65 | ||||
-rw-r--r-- | calendar/gui/itip-utils.h | 2 |
18 files changed, 383 insertions, 30 deletions
diff --git a/calendar/gui/dialogs/Makefile.am b/calendar/gui/dialogs/Makefile.am index 00bc9865b9..11cdf3bd6d 100644 --- a/calendar/gui/dialogs/Makefile.am +++ b/calendar/gui/dialogs/Makefile.am @@ -26,6 +26,12 @@ libcal_dialogs_la_SOURCES = \ alarm-dialog.h \ alarm-list-dialog.c \ alarm-list-dialog.h \ + cal-attachment-bar.c \ + cal-attachment-bar.h \ + cal-attachment-select-file.c \ + cal-attachment-select-file.h \ + cal-attachment.c \ + cal-attachment.h \ cal-prefs-dialog.c \ cal-prefs-dialog.h \ calendar-setup.c \ @@ -80,6 +86,7 @@ libcal_dialogs_la_SOURCES = \ glade_DATA = \ alarm-dialog.glade \ alarm-list-dialog.glade \ + cal-attachment.glade \ cal-prefs-dialog.glade \ e-delegate-dialog.glade \ event-page.glade \ diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c index 7a4040db78..401ea63b9b 100644 --- a/calendar/gui/dialogs/comp-editor.c +++ b/calendar/gui/dialogs/comp-editor.c @@ -29,6 +29,7 @@ #include <glib.h> #include <gdk/gdkkeysyms.h> #include <gtk/gtkstock.h> +#include <libgnome/libgnome.h> #include <libgnome/gnome-i18n.h> #include <libgnomeui/gnome-uidefs.h> #include <libgnomeui/gnome-dialog.h> @@ -47,6 +48,11 @@ #include "recur-comp.h" #include "comp-editor.h" +#include "cal-attachment-bar.h" +#include "widgets/misc/e-expander.h" + + + /* Private part of the CompEditor structure */ @@ -68,6 +74,17 @@ struct _CompEditorPrivate { /* Notebook to hold the pages */ GtkNotebook *notebook; + + /* Attachment handling */ + GtkWidget *attachment_bar; + GtkWidget *attachment_scrolled_window; + GtkWidget *attachment_expander; + GtkWidget *attachment_expander_label; + GtkWidget *attachment_expander_icon; + GtkWidget *attachment_expander_num; + + guint32 attachment_bar_visible : 1; + gboolean changed; gboolean needs_send; @@ -242,6 +259,11 @@ save_comp (CompEditor *editor) /* send timezones */ g_hash_table_foreach (timezones, (GHFunc) send_timezone, editor); g_hash_table_destroy (timezones); + + /* Attachments*/ + + e_cal_component_set_attachment_list (priv->comp, + cal_attachment_bar_get_attachment_list ((CalAttachmentBar *) priv->attachment_bar)); /* send the component to the server */ if (!cal_comp_is_on_server (priv->comp, priv->client)) { @@ -382,11 +404,83 @@ response_cb (GtkWidget *widget, int response, gpointer data) } } +static void +attachment_bar_changed_cb (CalAttachmentBar *bar, + void *data) +{ + CompEditor *editor = COMP_EDITOR (data); + + guint attachment_num = cal_attachment_bar_get_num_attachments ( + CAL_ATTACHMENT_BAR (editor->priv->attachment_bar)); + if (attachment_num) { + gchar *num_text = g_strdup_printf ( + ngettext ("<b>%d</b> File Attached", "<b>%d</b> Files Attached", attachment_num), + attachment_num); + gtk_label_set_markup (GTK_LABEL (editor->priv->attachment_expander_num), + num_text); + g_free (num_text); + + gtk_widget_show (editor->priv->attachment_expander_icon); + + } else { + gtk_label_set_text (GTK_LABEL (editor->priv->attachment_expander_num), ""); + gtk_widget_hide (editor->priv->attachment_expander_icon); + } + + + /* Mark the editor as changed so it prompts about unsaved + changes on close */ + comp_editor_set_changed (editor, TRUE); + +} + +static void +attachment_bar_icon_clicked_cb (CalAttachmentBar *bar, void *data) +{ + GnomeIconList *icon_list; + GList *p; + int num; + char *attach_file_url; + GError *error = NULL; + + icon_list = GNOME_ICON_LIST (bar); + p = gnome_icon_list_get_selection (icon_list); + if (p) { + num = GPOINTER_TO_INT (p->data); + attach_file_url = cal_attachment_bar_get_nth_attachment_filename (bar, num); + /* launch the url now */ + /* TODO should send GError and handle error conditions + * here */ + gnome_url_show (attach_file_url, &error); + if (error) + g_message ("DEBUG: Launch failed :(\n"); + g_free (attach_file_url); } +} + +static void +attachment_expander_activate_cb (EExpander *expander, + void *data) +{ + CompEditor *editor = COMP_EDITOR (data); + gboolean show = e_expander_get_expanded (expander); + + /* Update the expander label */ + if (show) + gtk_label_set_text_with_mnemonic (GTK_LABEL (editor->priv->attachment_expander_label), + _("Hide _Attachment Bar (drop attachments here)")); + else + gtk_label_set_text_with_mnemonic (GTK_LABEL (editor->priv->attachment_expander_label), + _("Show _Attachment Bar (drop attachments here)")); + +} + /* Creates the basic in the editor */ static void setup_widgets (CompEditor *editor) { CompEditorPrivate *priv; + GtkWidget *expander_hbox; + GdkPixbuf *attachment_pixbuf; priv = editor->priv; @@ -402,6 +496,59 @@ setup_widgets (CompEditor *editor) gtk_dialog_set_response_sensitive (GTK_DIALOG (editor), GTK_RESPONSE_OK, FALSE); g_signal_connect (editor, "response", G_CALLBACK (response_cb), editor); + + /*Attachments */ + priv->attachment_scrolled_window = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (priv->attachment_scrolled_window), + GTK_SHADOW_IN); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->attachment_scrolled_window), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + + priv->attachment_bar = cal_attachment_bar_new (NULL); + GTK_WIDGET_SET_FLAGS (priv->attachment_bar, GTK_CAN_FOCUS); + gtk_container_add (GTK_CONTAINER (priv->attachment_scrolled_window), + priv->attachment_bar); + gtk_widget_show (priv->attachment_bar); + g_signal_connect (priv->attachment_bar, "changed", + G_CALLBACK (attachment_bar_changed_cb), editor); + g_signal_connect (GNOME_ICON_LIST (priv->attachment_bar), "button-release-event", + G_CALLBACK (attachment_bar_icon_clicked_cb), NULL); + priv->attachment_expander_label = + gtk_label_new_with_mnemonic (_("Show _Attachment Bar (drop attachments here)")); + priv->attachment_expander_num = gtk_label_new (""); + gtk_label_set_use_markup (GTK_LABEL (priv->attachment_expander_num), TRUE); + gtk_misc_set_alignment (GTK_MISC (priv->attachment_expander_label), 0.0, 0.5); + gtk_misc_set_alignment (GTK_MISC (priv->attachment_expander_num), 1.0, 0.5); + expander_hbox = gtk_hbox_new (FALSE, 0); + + attachment_pixbuf = e_icon_factory_get_icon ("stock_attach", E_ICON_SIZE_MENU); + priv->attachment_expander_icon = gtk_image_new_from_pixbuf (attachment_pixbuf); + gtk_misc_set_alignment (GTK_MISC (priv->attachment_expander_icon), 1, 0.5); + gtk_widget_set_size_request (priv->attachment_expander_icon, 100, -1); + g_object_unref (attachment_pixbuf); + + gtk_box_pack_start (GTK_BOX (expander_hbox), priv->attachment_expander_label, + TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (expander_hbox), priv->attachment_expander_icon, + TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (expander_hbox), priv->attachment_expander_num, + TRUE, TRUE, 0); + gtk_widget_show_all (expander_hbox); + gtk_widget_hide (priv->attachment_expander_icon); + + priv->attachment_expander = e_expander_new (""); + e_expander_set_label_widget (E_EXPANDER (priv->attachment_expander), expander_hbox); + + gtk_container_add (GTK_CONTAINER (priv->attachment_expander), + priv->attachment_scrolled_window); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editor)->vbox), priv->attachment_expander, + FALSE, FALSE, GNOME_PAD_SMALL); + gtk_widget_show (priv->attachment_expander); + e_expander_set_expanded (E_EXPANDER (priv->attachment_expander), FALSE); + g_signal_connect_after (priv->attachment_expander, "activate", + G_CALLBACK (attachment_expander_activate_cb), editor); + + } /* Object initialization function for the calendar component editor */ @@ -1044,6 +1191,15 @@ fill_widgets (CompEditor *editor) priv = editor->priv; + /*Check if attachments are available here and set them*/ + if (e_cal_component_has_attachments (priv->comp)) { + GSList *attachment_list = NULL; + e_cal_component_get_attachment_list (priv->comp, &attachment_list); + cal_attachment_bar_set_attachment_list + ((CalAttachmentBar *)priv->attachment_bar, attachment_list); + e_expander_set_expanded (E_EXPANDER (priv->attachment_expander), TRUE); + } + for (l = priv->pages; l != NULL; l = l->next) comp_editor_page_fill_widgets (l->data, priv->comp); } @@ -1085,6 +1241,8 @@ static void real_edit_comp (CompEditor *editor, ECalComponent *comp) { CompEditorPrivate *priv; + char *source_url; + const char *uid; g_return_if_fail (editor != NULL); g_return_if_fail (IS_COMP_EDITOR (editor)); @@ -1105,6 +1263,13 @@ real_edit_comp (CompEditor *editor, ECalComponent *comp) set_title_from_comp (editor); set_icon_from_comp (editor); + e_cal_component_get_uid (comp, &uid); + source_url = g_strconcat (e_cal_get_uri (priv->client), "/", NULL); + /* The source_url and uid will be preserved by the callee and freed when + * the latter gets destroyed */ + cal_attachment_bar_set_source_url (priv->attachment_bar, source_url); + cal_attachment_bar_set_comp_uid (priv->attachment_bar, g_strdup (uid)); + fill_widgets (editor); listen_for_changes (editor); @@ -1122,21 +1287,56 @@ real_send_comp (CompEditor *editor, ECalComponentItipMethod method) priv = editor->priv; - if (itip_send_comp (method, priv->comp, priv->client, NULL)) { - tmp_comp = priv->comp; - g_object_ref (tmp_comp); - comp_editor_edit_comp (editor, tmp_comp); - g_object_unref (tmp_comp); - - comp_editor_set_changed (editor, TRUE); - save_comp (editor); + if (!e_cal_component_has_attachments (priv->comp)) { + if (itip_send_comp (method, priv->comp, priv->client, + NULL, NULL)) { + tmp_comp = priv->comp; + g_object_ref (tmp_comp); + comp_editor_edit_comp (editor, tmp_comp); + g_object_unref (tmp_comp); + + comp_editor_set_changed (editor, TRUE); + save_comp (editor); - return TRUE; + return TRUE; + } + + } else { + /* Clone the component with attachments set to CID:... */ + ECalComponent *send_comp; + int num_attachments, i; + GSList *attach_list = NULL; + GSList *mime_attach_list; + + send_comp = e_cal_component_clone (priv->comp); + num_attachments = e_cal_component_get_num_attachments (send_comp); + + for (i = 0; i < num_attachments ; i++) { + attach_list = g_slist_append (attach_list, g_strdup ("CID:...")); + } + e_cal_component_set_attachment_list (send_comp, attach_list); + + /* mime_attach_list is freed by itip_send_comp */ + mime_attach_list = comp_editor_get_mime_attach_list (editor); + if (itip_send_comp (method, send_comp, priv->client, + NULL, mime_attach_list)) { + tmp_comp = priv->comp; + g_object_ref (tmp_comp); + comp_editor_edit_comp (editor, tmp_comp); + g_object_unref (tmp_comp); + + comp_editor_set_changed (editor, TRUE); + save_comp (editor); + g_object_unref (send_comp); + return TRUE; + } + g_object_unref (send_comp); } comp_editor_set_changed (editor, TRUE); + + return FALSE; - return FALSE; } @@ -1261,6 +1461,22 @@ comp_editor_close (CompEditor *editor) return close; } + +/* Utility function to get the mime-attachment list from the attachment + * bar for sending the comp via itip. The list and its contents must + * be freed by the caller. + */ +GSList * +comp_editor_get_mime_attach_list (CompEditor *editor) +{ + GSList *mime_attach_list; + + mime_attach_list = cal_attachment_bar_get_mime_attach_list + ((CalAttachmentBar *)editor->priv->attachment_bar); + + return mime_attach_list; +} + /* Brings attention to a window by raising it and giving it focus */ static void raise_and_focus (GtkWidget *widget) diff --git a/calendar/gui/dialogs/comp-editor.h b/calendar/gui/dialogs/comp-editor.h index 39966c70a7..ea6811e5a3 100644 --- a/calendar/gui/dialogs/comp-editor.h +++ b/calendar/gui/dialogs/comp-editor.h @@ -26,6 +26,7 @@ #include "../itip-utils.h" #include "comp-editor-page.h" #include "evolution-shell-component-utils.h" +#include "cal-attachment-bar.h" G_BEGIN_DECLS @@ -90,6 +91,7 @@ gboolean comp_editor_save_comp (CompEditor *editor, void comp_editor_delete_comp (CompEditor *editor); gboolean comp_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method); +GSList *comp_editor_get_mime_attach_list (CompEditor *editor); gboolean comp_editor_close (CompEditor *editor); void comp_editor_focus (CompEditor *editor); diff --git a/calendar/gui/dialogs/event-editor.c b/calendar/gui/dialogs/event-editor.c index a4edd680f9..1f266325bf 100644 --- a/calendar/gui/dialogs/event-editor.c +++ b/calendar/gui/dialogs/event-editor.c @@ -302,7 +302,8 @@ event_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method) gboolean result; client = e_meeting_store_get_e_cal (priv->model); - result = itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, client, NULL); + result = itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, + client, NULL, NULL); g_object_unref (comp); if (!result) diff --git a/calendar/gui/dialogs/task-editor.c b/calendar/gui/dialogs/task-editor.c index a0e251f8b8..a513bc25cf 100644 --- a/calendar/gui/dialogs/task-editor.c +++ b/calendar/gui/dialogs/task-editor.c @@ -286,7 +286,8 @@ task_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method) gboolean result; client = e_meeting_store_get_e_cal (priv->model); - result = itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, client, NULL); + result = itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, + client, NULL, NULL); g_object_unref (comp); if (!result) diff --git a/calendar/gui/e-cal-model-calendar.c b/calendar/gui/e-cal-model-calendar.c index 5284332f72..b64dce21c6 100644 --- a/calendar/gui/e-cal-model-calendar.c +++ b/calendar/gui/e-cal-model-calendar.c @@ -379,7 +379,8 @@ ecmc_set_value_at (ETableModel *etm, int col, int row, const void *value) if (e_cal_modify_object (comp_data->client, comp_data->icalcomp, CALOBJ_MOD_ALL, NULL)) { if (itip_organizer_is_user (comp, comp_data->client) && send_component_dialog (NULL, comp_data->client, comp, FALSE)) - itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, comp_data->client, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, + comp_data->client, NULL, NULL); } else { g_warning (G_STRLOC ": Could not modify the object!"); diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c index e7847fe107..1141635308 100644 --- a/calendar/gui/e-calendar-table.c +++ b/calendar/gui/e-calendar-table.c @@ -1092,7 +1092,7 @@ e_calendar_table_on_forward (EPopup *ep, EPopupItem *pitem, void *data) comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp)); - itip_send_comp (E_CAL_COMPONENT_METHOD_PUBLISH, comp, comp_data->client, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_PUBLISH, comp, comp_data->client, NULL, NULL); g_object_unref (comp); } diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c index c935cb3f6d..4d151e25fa 100644 --- a/calendar/gui/e-calendar-view.c +++ b/calendar/gui/e-calendar-view.c @@ -370,7 +370,7 @@ e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart send_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)), client, comp, TRUE)) { itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, - client, NULL); + client, NULL, NULL); } } else { g_message (G_STRLOC ": Could not create the object!"); @@ -667,7 +667,7 @@ e_calendar_view_cut_clipboard (ECalendarView *cal_view) && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)), event->comp_data->client, comp, TRUE)) itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, - event->comp_data->client, NULL); + event->comp_data->client, NULL, NULL); e_cal_component_get_uid (comp, &uid); e_cal_remove_object (event->comp_data->client, uid, &error); @@ -823,7 +823,7 @@ delete_event (ECalendarView *cal_view, ECalendarViewEvent *event) event->comp_data->client, comp, TRUE)) itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, - event->comp_data->client, NULL); + event->comp_data->client, NULL, NULL); e_cal_component_get_uid (comp, &uid); if (!uid || !*uid) { @@ -933,7 +933,7 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view) e_cal_component_free_datetime (&range.datetime); } - itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, event->comp_data->client, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, event->comp_data->client, NULL, NULL); } e_cal_remove_object_with_mod (event->comp_data->client, uid, rid, CALOBJ_MOD_THIS, &error); @@ -1235,7 +1235,7 @@ on_forward (EPopup *ep, EPopupItem *pitem, void *data) comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); - itip_send_comp (E_CAL_COMPONENT_METHOD_PUBLISH, comp, event->comp_data->client, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_PUBLISH, comp, event->comp_data->client, NULL, NULL); g_list_free (selected); g_object_unref (comp); @@ -1661,7 +1661,7 @@ e_calendar_view_modify_and_send (ECalComponent *comp, if (e_cal_modify_object (client, e_cal_component_get_icalcomponent (comp), mod, NULL)) { if (itip_organizer_is_user (comp, client) && send_component_dialog (toplevel, client, comp, new)) - itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, client, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, client, NULL, NULL); } else { g_message (G_STRLOC ": Could not update the object!"); } diff --git a/calendar/gui/e-day-view-main-item.c b/calendar/gui/e-day-view-main-item.c index 9b2a40b9fe..f384fdbd66 100644 --- a/calendar/gui/e-day-view-main-item.c +++ b/calendar/gui/e-day-view-main-item.c @@ -468,6 +468,7 @@ e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, gint num_icons, icon_x, icon_y, icon_x_inc, icon_y_inc; gint max_icon_w, max_icon_h; gboolean draw_reminder_icon, draw_recurrence_icon, draw_timezone_icon, draw_meeting_icon; + gboolean draw_attach_icon; GSList *categories_list, *elem; ECalComponentTransparency transparency; @@ -590,6 +591,7 @@ e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, draw_recurrence_icon = FALSE; draw_timezone_icon = FALSE; draw_meeting_icon = FALSE; + draw_attach_icon = FALSE; icon_x = item_x + E_DAY_VIEW_BAR_WIDTH + E_DAY_VIEW_ICON_X_PAD; icon_y = item_y + E_DAY_VIEW_EVENT_BORDER_HEIGHT + E_DAY_VIEW_ICON_Y_PAD; @@ -603,7 +605,10 @@ e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, draw_recurrence_icon = TRUE; num_icons++; } - + if (e_cal_component_has_attachments (comp)) { + draw_attach_icon = TRUE; + num_icons++; + } /* If the DTSTART or DTEND are in a different timezone to our current timezone, we display the timezone icon. */ if (event->different_timezone) { @@ -678,7 +683,25 @@ e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, icon_x += icon_x_inc; icon_y += icon_y_inc; } + if (draw_attach_icon) { + max_icon_w = item_x + item_w - icon_x + - E_DAY_VIEW_EVENT_BORDER_WIDTH; + max_icon_h = item_y + item_h - icon_y + - E_DAY_VIEW_EVENT_BORDER_HEIGHT; + gdk_gc_set_clip_mask (gc, NULL); + gdk_draw_pixbuf (drawable, gc, + day_view->attach_icon, + 0, 0, icon_x, icon_y, + MIN (E_DAY_VIEW_ICON_WIDTH, + max_icon_w), + MIN (E_DAY_VIEW_ICON_HEIGHT, + max_icon_h), + GDK_RGB_DITHER_NORMAL, + 0, 0); + icon_x += icon_x_inc; + icon_y += icon_y_inc; + } if (draw_timezone_icon) { max_icon_w = item_x + item_w - icon_x - E_DAY_VIEW_EVENT_BORDER_WIDTH; diff --git a/calendar/gui/e-day-view-top-item.c b/calendar/gui/e-day-view-top-item.c index c84ed2859c..a733a7ec17 100644 --- a/calendar/gui/e-day-view-top-item.c +++ b/calendar/gui/e-day-view-top-item.c @@ -534,6 +534,17 @@ e_day_view_top_item_draw_long_event (EDayViewTopItem *dvtitem, icon_x -= icon_x_inc; } + if (icon_x <= max_icon_x && e_cal_component_has_attachments (comp)) { + gdk_gc_set_clip_mask (gc, NULL); + gdk_draw_pixbuf (drawable, gc, + day_view->attach_icon, + 0, 0, icon_x, icon_y, + E_DAY_VIEW_ICON_WIDTH, + E_DAY_VIEW_ICON_HEIGHT, + GDK_RGB_DITHER_NORMAL, + 0, 0); + icon_x -= icon_x_inc; + } if (icon_x <= max_icon_x && e_cal_component_has_alarms (comp)) { gdk_gc_set_clip_mask (gc, NULL); gdk_draw_pixbuf (drawable, gc, diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c index f675d797ad..fb5de111ee 100644 --- a/calendar/gui/e-day-view.c +++ b/calendar/gui/e-day-view.c @@ -1098,6 +1098,7 @@ e_day_view_realize (GtkWidget *widget) day_view->recurrence_icon = e_icon_factory_get_icon ("stock_refresh", E_ICON_SIZE_MENU); day_view->timezone_icon = e_icon_factory_get_icon ("stock_timezone", E_ICON_SIZE_MENU); day_view->meeting_icon = e_icon_factory_get_icon ("stock_people", E_ICON_SIZE_MENU); + day_view->attach_icon = e_icon_factory_get_icon ("stock_attach", E_ICON_SIZE_MENU); /* Set the canvas item colors. */ @@ -1184,6 +1185,8 @@ e_day_view_unrealize (GtkWidget *widget) day_view->timezone_icon = NULL; g_object_unref (day_view->meeting_icon); day_view->meeting_icon = NULL; + g_object_unref (day_view->attach_icon); + day_view->attach_icon = NULL; if (GTK_WIDGET_CLASS (e_day_view_parent_class)->unrealize) (*GTK_WIDGET_CLASS (e_day_view_parent_class)->unrealize)(widget); @@ -4282,7 +4285,8 @@ e_day_view_reshape_long_event (EDayView *day_view, num_icons++; if (e_cal_component_has_organizer (comp)) num_icons++; - + if (e_cal_component_has_attachments (comp)) + num_icons++; e_cal_component_get_categories_list (comp, &categories_list); for (elem = categories_list; elem; elem = elem->next) { char *category; @@ -4447,6 +4451,8 @@ e_day_view_reshape_day_event (EDayView *day_view, num_icons++; if (e_cal_component_has_recurrences (comp)) num_icons++; + if (e_cal_component_has_attachments (comp)) + num_icons++; if (event->different_timezone) num_icons++; if (e_cal_component_has_organizer (comp)) diff --git a/calendar/gui/e-day-view.h b/calendar/gui/e-day-view.h index 1d87d57211..4c563e4dbd 100644 --- a/calendar/gui/e-day-view.h +++ b/calendar/gui/e-day-view.h @@ -327,6 +327,7 @@ struct _EDayView GdkPixbuf *recurrence_icon; GdkPixbuf *timezone_icon; GdkPixbuf *meeting_icon; + GdkPixbuf *attach_icon; /* Colors for drawing. */ GdkColor colors[E_DAY_VIEW_COLOR_LAST]; diff --git a/calendar/gui/e-itip-control.c b/calendar/gui/e-itip-control.c index 2ea9ed758b..77116834a1 100644 --- a/calendar/gui/e-itip-control.c +++ b/calendar/gui/e-itip-control.c @@ -2024,7 +2024,7 @@ send_item (EItipControl *itip) comp = get_real_item (itip); if (comp != NULL) { - itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, priv->current_ecal, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, priv->current_ecal, NULL, NULL); g_object_unref (comp); dialog = gnome_ok_dialog (_("Item sent!\n")); } else { @@ -2070,7 +2070,7 @@ send_freebusy (EItipControl *itip) for (l = comp_list; l; l = l->next) { ECalComponent *comp = E_CAL_COMPONENT (l->data); - itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, priv->current_ecal, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, priv->current_ecal, NULL, NULL); g_object_unref (comp); } @@ -2510,7 +2510,7 @@ ok_clicked_cb (GtkWidget *widget, gpointer data) g_slist_free (list); e_cal_component_rescan (comp); - itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, priv->current_ecal, priv->top_level); + itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, priv->current_ecal, priv->top_level, NULL); g_object_unref (comp); } diff --git a/calendar/gui/e-week-view-event-item.c b/calendar/gui/e-week-view-event-item.c index d088a416d5..e4ace7961e 100644 --- a/calendar/gui/e-week-view-event-item.c +++ b/calendar/gui/e-week-view-event-item.c @@ -596,7 +596,7 @@ e_week_view_event_item_draw_icons (EWeekViewEventItem *wveitem, GdkGC *gc; gint num_icons = 0, icon_x_inc; gboolean draw_reminder_icon = FALSE, draw_recurrence_icon = FALSE; - gboolean draw_timezone_icon = FALSE; + gboolean draw_timezone_icon = FALSE, draw_attach_icon = FALSE; GSList *categories_list, *elem; week_view = E_WEEK_VIEW (GTK_WIDGET (GNOME_CANVAS_ITEM (wveitem)->canvas)->parent); @@ -619,7 +619,12 @@ e_week_view_event_item_draw_icons (EWeekViewEventItem *wveitem, draw_recurrence_icon = TRUE; num_icons++; } - + + if (e_cal_component_has_attachments (comp)) { + draw_attach_icon = TRUE; + num_icons++; + } + if (event->different_timezone) { draw_timezone_icon = TRUE; num_icons++; @@ -653,6 +658,18 @@ e_week_view_event_item_draw_icons (EWeekViewEventItem *wveitem, icon_x += icon_x_inc; } + if (draw_attach_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) { + gdk_gc_set_clip_mask (gc, NULL); + gdk_draw_pixbuf (drawable, gc, + week_view->attach_icon, + 0, 0, icon_x, icon_y, + E_WEEK_VIEW_ICON_WIDTH, + E_WEEK_VIEW_ICON_HEIGHT, + GDK_RGB_DITHER_NORMAL, + 0, 0); + icon_x += icon_x_inc; + } + if (draw_recurrence_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) { gdk_gc_set_clip_mask (gc, NULL); gdk_draw_pixbuf (drawable, gc, diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c index 17ebc66370..5ddc16ff28 100644 --- a/calendar/gui/e-week-view.c +++ b/calendar/gui/e-week-view.c @@ -699,6 +699,7 @@ e_week_view_realize (GtkWidget *widget) week_view->reminder_icon = e_icon_factory_get_icon ("stock_bell", E_ICON_SIZE_MENU); week_view->recurrence_icon = e_icon_factory_get_icon ("stock_refresh", E_ICON_SIZE_MENU); week_view->timezone_icon = e_icon_factory_get_icon ("stock_timezone", E_ICON_SIZE_MENU); + week_view->attach_icon = e_icon_factory_get_icon ("stock_attach", E_ICON_SIZE_MENU); } static void @@ -737,6 +738,8 @@ e_week_view_unrealize (GtkWidget *widget) week_view->recurrence_icon = NULL; g_object_unref (week_view->timezone_icon); week_view->timezone_icon = NULL; + g_object_unref (week_view->attach_icon); + week_view->attach_icon = NULL; if (GTK_WIDGET_CLASS (e_week_view_parent_class)->unrealize) (*GTK_WIDGET_CLASS (e_week_view_parent_class)->unrealize)(widget); @@ -2578,6 +2581,8 @@ e_week_view_reshape_event_span (EWeekView *week_view, num_icons++; if (e_cal_component_has_recurrences (comp)) num_icons++; + if (e_cal_component_has_attachments (comp)) + num_icons++; if (event->different_timezone) num_icons++; diff --git a/calendar/gui/e-week-view.h b/calendar/gui/e-week-view.h index 2b63748704..58ff08aa22 100644 --- a/calendar/gui/e-week-view.h +++ b/calendar/gui/e-week-view.h @@ -281,6 +281,7 @@ struct _EWeekView /* The icons. */ GdkPixbuf *reminder_icon; GdkPixbuf *recurrence_icon; + GdkPixbuf *attach_icon; GdkPixbuf *timezone_icon; /* Colors for drawing. */ diff --git a/calendar/gui/itip-utils.c b/calendar/gui/itip-utils.c index 9679cdcb45..36ddbea045 100644 --- a/calendar/gui/itip-utils.c +++ b/calendar/gui/itip-utils.c @@ -42,6 +42,7 @@ #include "e-util/e-passwords.h" #include "calendar-config.h" #include "itip-utils.h" +#include "dialogs/cal-attachment.h" #define GNOME_EVOLUTION_COMPOSER_OAFIID "OAFIID:GNOME_Evolution_Mail_Composer:" BASE_VERSION @@ -823,9 +824,64 @@ comp_compliant (ECalComponentItipMethod method, ECalComponent *comp, ECal *clien return clone; } +static gboolean +append_cal_attachments (GNOME_Evolution_Composer composer_server, ECalComponent + *comp, GSList *attach_list) +{ + CORBA_char *content_type = NULL, *filename = NULL, *description = NULL; + CORBA_Environment ev; + GNOME_Evolution_Composer_AttachmentData *attach_data = NULL; + struct CalMimeAttach *mime_attach; + GSList *l; + gboolean retval = TRUE; + + CORBA_exception_init (&ev); + + for (l = attach_list; l ; l = l->next) { + mime_attach = (struct CalMimeAttach *) l->data; + + filename = CORBA_string_dup (mime_attach->filename); + content_type = CORBA_string_dup (mime_attach->content_type); + description = CORBA_string_dup (mime_attach->description); + + attach_data = GNOME_Evolution_Composer_AttachmentData__alloc (); + attach_data->_length = mime_attach->length; + attach_data->_maximum = attach_data->_length; + attach_data->_buffer = CORBA_sequence_CORBA_char_allocbuf (attach_data->_length); + memcpy (attach_data->_buffer, mime_attach->encoded_data, attach_data->_length); + + GNOME_Evolution_Composer_attachData (composer_server, + content_type, filename, description, + TRUE, attach_data, + &ev); + if (BONOBO_EX (&ev)) { + g_warning ("Unable to add attachments in composer"); + retval = FALSE; + } + + CORBA_exception_free (&ev); + if (content_type != NULL) + CORBA_free (content_type); + if (filename != NULL) + CORBA_free (filename); + if (description != NULL) + CORBA_free (description); + if (attach_data != NULL) { + CORBA_free (attach_data->_buffer); + CORBA_free (attach_data); + } + g_free (mime_attach->filename); + g_free (mime_attach->content_type); + g_free (mime_attach->description); + g_free (mime_attach->encoded_data); + } + + return retval; +} + gboolean itip_send_comp (ECalComponentItipMethod method, ECalComponent *send_comp, - ECal *client, icalcomponent *zones) + ECal *client, icalcomponent *zones, GSList *attachments_list) { GNOME_Evolution_Composer composer_server; ECalComponent *comp = NULL; @@ -932,7 +988,12 @@ itip_send_comp (ECalComponentItipMethod method, ECalComponent *send_comp, g_warning ("Unable to place iTip message in composer"); goto cleanup; } - + + if (attachments_list) { + if (append_cal_attachments (composer_server, comp, attachments_list)) + retval = TRUE; + } + if (method == E_CAL_COMPONENT_METHOD_PUBLISH) { GNOME_Evolution_Composer_show (composer_server, &ev); if (BONOBO_EX (&ev)) diff --git a/calendar/gui/itip-utils.h b/calendar/gui/itip-utils.h index 936adfec8e..bfbd4ab6fc 100644 --- a/calendar/gui/itip-utils.h +++ b/calendar/gui/itip-utils.h @@ -29,7 +29,7 @@ gboolean itip_sentby_is_user (ECalComponent *comp); const gchar *itip_strip_mailto (const gchar *address); gboolean itip_send_comp (ECalComponentItipMethod method, ECalComponent *comp, - ECal *client, icalcomponent *zones); + ECal *client, icalcomponent *zones, GSList *attachments_list); gboolean itip_publish_comp (ECal *client, gchar* uri, gchar* username, gchar* password, ECalComponent **pub_comp); |