[evolution-patches] (Calendar) Patch to add menu items to r-click menu in meetings/tasks page



Hi,

I have attached the patch. Please review it.

-Srini.
Index: calendar/gui/e-cal-popup.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-cal-popup.c,v
retrieving revision 1.15
diff -u -p -r1.15 e-cal-popup.c
--- calendar/gui/e-cal-popup.c	18 Aug 2005 11:20:23 -0000	1.15
+++ calendar/gui/e-cal-popup.c	19 Aug 2005 05:59:59 -0000
@@ -24,16 +24,28 @@
 #endif
 
 #include <string.h>
+#include <fcntl.h>
 #include <stdlib.h>
 
 #include <glib.h>
 
+#include <libgnomevfs/gnome-vfs-mime-handlers.h>
+#include <libgnomevfs/gnome-vfs-mime.h>
+
 #include "e-cal-popup.h"
 #include <libedataserverui/e-source-selector.h>
 
+#include <camel/camel-mime-part.h>
+#include <camel/camel-stream-fs.h>
+#include "e-util/e-util.h"
+#include "e-util/e-i18n.h"
+#include "e-util/e-mktemp.h"
+#include "e-util/e-dialog-utils.h"
+
 #include "gui/e-calendar-view.h"
 #include "gui/e-cal-model.h"
 #include "itip-utils.h"
+#include "e-attachment.h"
 
 static GObjectClass *ecalp_parent;
 
@@ -72,11 +84,344 @@ ecalp_target_free(EPopup *ep, EPopupTarg
 	((EPopupClass *)ecalp_parent)->target_free(ep, t);
 }
 
+/* Standard menu code */
+
+static char *
+temp_save_part(CamelMimePart *part, char *path, gboolean file)
+{
+	const char *filename;
+	char *tmpdir, *mfilename = NULL;
+	CamelStream *stream;
+	CamelDataWrapper *wrapper;
+
+	if (!path) {
+		tmpdir = e_mkdtemp("evolution-tmp-XXXXXX");
+		if (tmpdir == NULL) {
+			return NULL;
+		}
+
+		filename = camel_mime_part_get_filename (part);
+		if (filename == NULL) {
+			/* This is the default filename used for temporary file creation */
+			filename = _("Unknown");
+		} else {
+			mfilename = g_strdup(filename);
+			e_filename_make_safe(mfilename);
+			filename = mfilename;
+		}
+
+		path = g_build_filename(tmpdir, filename, NULL);
+		g_free(tmpdir);
+		g_free(mfilename);
+	} else if (!file) {
+		tmpdir = path;
+		filename = camel_mime_part_get_filename (part);
+		if (filename == NULL) {
+			/* This is the default filename used for temporary file creation */
+			filename = _("Unknown");
+		} else {
+			mfilename = g_strdup(filename);
+			e_filename_make_safe(mfilename);
+			filename = mfilename;
+		}
+		
+		path = g_build_filename(tmpdir, filename, NULL);
+		g_free(mfilename);
+	}
+
+	wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part));
+	stream = camel_stream_fs_new_with_name (path, O_RDWR|O_CREAT|O_TRUNC, 0600);
+
+	if (!stream) {
+		/* TODO handle error conditions */
+		g_message ("DEBUG: could not open the file to write\n");
+		return NULL;
+	}
+
+	if (camel_data_wrapper_decode_to_stream (wrapper, (CamelStream *) stream) == -1) {
+		camel_stream_close (stream);
+		camel_object_unref (stream);
+		g_message ("DEBUG: could not write to file\n");
+		return NULL;
+	}
+
+	camel_stream_close(stream);
+	camel_object_unref(stream);
+
+	return path;
+}
+
+static void
+ecalp_part_popup_saveas(EPopup *ep, EPopupItem *item, void *data)
+{
+	EPopupTarget *t = ep->target;
+	CamelMimePart *part = NULL;
+	char *file, *filename, *mfilename = NULL;
+
+	part = ((EAttachment *) ((ECalPopupTargetAttachments *) t)->attachments->data)->body;
+	filename = camel_mime_part_get_filename (part);
+	if (filename == NULL) {
+		/* This is the default filename used for temporary file creation */
+		filename = _("Unknown");
+	} else {
+		mfilename = g_strdup(filename);
+		e_filename_make_safe(mfilename);
+		filename = mfilename;
+	}	
+	file = e_file_dialog_save (_("Save As..."), filename);
+	
+	if (file)
+		temp_save_part (part, file, TRUE);
+		
+	g_free (file);
+	g_free (mfilename);
+}
+
+static void
+ecalp_part_popup_save_selected(EPopup *ep, EPopupItem *item, void *data)
+{
+	GSList *parts;
+	EPopupTarget *t = ep->target;
+	char *dir, *path;
+	
+	dir = e_file_dialog_save_folder (_("Select folder to save selected attachments..."));
+	parts = ((ECalPopupTargetAttachments *) t)->attachments;
+	
+	for (;parts; parts=parts->next) {
+		path = temp_save_part (((EAttachment *)parts->data)->body, dir, FALSE);
+		/* Probably we 'll do some reporting in next release, like listing the saved files and locations */
+		g_free (path);
+	}
+}
+
+static void
+ecalp_part_popup_set_background(EPopup *ep, EPopupItem *item, void *data)
+{
+	EPopupTarget *t = ep->target;
+	GConfClient *gconf;
+	char *str, *filename, *path, *extension;
+	unsigned int i=1;
+	CamelMimePart *part = NULL;
+
+	part = ((EAttachment *) ((ECalPopupTargetAttachments *) t)->attachments->data)->body;
+	
+	filename = g_strdup(camel_mime_part_get_filename(part));
+	   
+	/* if filename is blank, create a default filename based on MIME type */
+	if (!filename || !filename[0]) {
+		CamelContentType *ct;
+
+		ct = camel_mime_part_get_content_type(part);
+		g_free (filename);
+		filename = g_strdup_printf (_("untitled_image.%s"), ct->subtype);
+	}
+
+	e_filename_make_safe(filename);
+	
+	path = g_build_filename(g_get_home_dir(), ".gnome2", "wallpapers", filename, NULL);
+	
+	extension = strrchr(filename, '.');
+	if (extension)
+		*extension++ = 0;
+	
+	/* if file exists, stick a (number) on the end */
+	while (g_file_test(path, G_FILE_TEST_EXISTS)) {
+		char *name;
+		name = g_strdup_printf(extension?"%s (%d).%s":"%s (%d)", filename, i++, extension);
+		g_free(path);
+		path = g_build_filename(g_get_home_dir(), ".gnome2", "wallpapers", name, NULL);
+		g_free(name);
+	}
+	
+	g_free(filename);
+	
+	if (temp_save_part(part, path, TRUE)) {
+		gconf = gconf_client_get_default();
+		
+		/* if the filename hasn't changed, blank the filename before 
+		*  setting it so that gconf detects a change and updates it */
+		if ((str = gconf_client_get_string(gconf, "/desktop/gnome/background/picture_filename", NULL)) != NULL 
+		     && strcmp (str, path) == 0) {
+			gconf_client_set_string(gconf, "/desktop/gnome/background/picture_filename", "", NULL);
+		}
+		
+		g_free (str);
+		gconf_client_set_string(gconf, "/desktop/gnome/background/picture_filename", path, NULL);
+		
+		/* if GNOME currently doesn't display a picture, set to "wallpaper"
+		 * display mode, otherwise leave it alone */
+		if ((str = gconf_client_get_string(gconf, "/desktop/gnome/background/picture_options", NULL)) == NULL 
+		     || strcmp(str, "none") == 0) {
+			gconf_client_set_string(gconf, "/desktop/gnome/background/picture_options", "wallpaper", NULL);
+		}
+		
+		gconf_client_suggest_sync(gconf, NULL);
+		
+		g_free(str);
+		g_object_unref(gconf);
+	}
+	
+	g_free(path);
+}
+
+static const EPopupItem ecalp_standard_part_apps_bar = { E_POPUP_BAR, "99.object" };
+
+static ECalPopupItem ecalp_attachment_object_popups[] = {
+	{ E_POPUP_ITEM, "00.attach.00", N_("_Save As..."), ecalp_part_popup_saveas, NULL, "stock_save-as", E_CAL_POPUP_ATTACHMENTS_ONE },
+	{ E_POPUP_ITEM, "00.attach.10", N_("Set as _Background"), ecalp_part_popup_set_background, NULL, NULL, E_CAL_POPUP_ATTACHMENTS_IMAGE },
+	{ E_POPUP_ITEM, "00.attach.20", N_("_Save Selected"), ecalp_part_popup_save_selected, NULL, "stock_save-as", E_CAL_POPUP_ATTACHMENTS_MULTIPLE },
+	{ E_POPUP_BAR, "05.attach", },
+};
+
+static void
+ecalp_apps_open_in(EPopup *ep, EPopupItem *item, void *data)
+{
+	char *path;
+	EPopupTarget *target = ep->target;
+	CamelMimePart *part;
+
+	part = ((EAttachment *) ((ECalPopupTargetAttachments *) target)->attachments->data)->body;
+
+	path = temp_save_part(part, NULL, FALSE);
+	if (path) {
+		GnomeVFSMimeApplication *app = item->user_data;
+		char *uri;
+		GList *uris = NULL;
+		
+		uri = gnome_vfs_get_uri_from_local_path(path);
+		uris = g_list_append(uris, uri);
+
+		gnome_vfs_mime_application_launch(app, uris);
+
+		g_free(uri);
+		g_list_free(uris);
+		g_free(path);
+	}
+}
+
+static void
+ecalp_apps_popup_free(EPopup *ep, GSList *free_list, void *data)
+{
+	while (free_list) {
+		GSList *n = free_list->next;
+		EPopupItem *item = free_list->data;
+
+		g_free(item->path);
+		g_free(item->label);
+		g_free(item);
+		g_slist_free_1(free_list);
+
+		free_list = n;
+	}
+}
+
+static void
+ecalp_standard_items_free(EPopup *ep, GSList *items, void *data)
+{
+	g_slist_free(items);
+}
+
+static void 
+ecalp_standard_menu_factory (EPopup *ecalp, void *data)
+{
+	int i, len;
+	EPopupItem *items;
+	GSList *menus = NULL;
+	GList *apps = NULL;
+	char *mime_type = NULL;
+	const char *filename = NULL;
+
+	switch (ecalp->target->type) {
+	case E_CAL_POPUP_TARGET_ATTACHMENTS: {
+		ECalPopupTargetAttachments *t = (ECalPopupTargetAttachments *)ecalp->target;
+		GSList *list = t->attachments;
+		EAttachment *attachment;
+
+		items = ecalp_attachment_object_popups;
+		len = G_N_ELEMENTS(ecalp_attachment_object_popups);
+
+		if (g_slist_length(list) != 1 || !((EAttachment *)list->data)->is_available_local) {
+			break;
+		}
+
+		/* Only one attachment selected */
+		attachment = list->data;
+		mime_type = camel_data_wrapper_get_mime_type((CamelDataWrapper *)attachment->body);
+		filename = camel_mime_part_get_filename(attachment->body);
+
+
+		break; }		
+	default:
+		items = NULL;
+		len = 0;	
+	}
+
+	if (mime_type) {
+		apps = gnome_vfs_mime_get_all_applications(mime_type);
+		
+		if (apps == NULL && strcmp(mime_type, "application/octet-stream") == 0) {
+			const char *name_type;
+			
+			if (filename) {
+				/* GNOME-VFS will misidentify TNEF attachments as MPEG */
+				if (!strcmp (filename, "winmail.dat"))
+					name_type = "application/vnd.ms-tnef";
+				else
+					name_type = gnome_vfs_mime_type_from_name(filename);
+				if (name_type)
+					apps = gnome_vfs_mime_get_all_applications(name_type);
+			}
+		}
+		g_free (mime_type);
+
+		if (apps) {
+			GString *label = g_string_new("");
+			GSList *open_menus = NULL;
+			GList *l;
+
+			menus = g_slist_prepend(menus, (void *)&ecalp_standard_part_apps_bar);
+
+			for (l = apps, i = 0; l; l = l->next, i++) {
+				GnomeVFSMimeApplication *app = l->data;
+				EPopupItem *item;
+
+				if (app->requires_terminal)
+					continue;
+
+				item = g_malloc0(sizeof(*item));
+				item->type = E_POPUP_ITEM;
+				item->path = g_strdup_printf("99.object.%02d", i);
+				item->label = g_strdup_printf(_("Open in %s..."), app->name);
+				item->activate = ecalp_apps_open_in;
+				item->user_data = app;
+
+				open_menus = g_slist_prepend(open_menus, item);
+			}
+
+			if (open_menus)
+				e_popup_add_items(ecalp, open_menus, NULL, ecalp_apps_popup_free, NULL);
+
+			g_string_free(label, TRUE);
+			g_list_free(apps);
+		}
+	}
+
+	for (i=0;i<len;i++) {
+		if ((items[i].visible & ecalp->target->mask) == 0)
+			menus = g_slist_prepend(menus, &items[i]);
+	}
+
+	if (menus)
+		e_popup_add_items(ecalp, menus, NULL, ecalp_standard_items_free, NULL);
+}
+
 static void
 ecalp_class_init(GObjectClass *klass)
 {
 	klass->finalize = ecalp_finalise;
 	((EPopupClass *)klass)->target_free = ecalp_target_free;
+
+	e_popup_class_add_factory((EPopupClass *)klass, NULL, ecalp_standard_menu_factory, NULL);
 }
 
 GType
@@ -169,7 +514,6 @@ needs_to_accept (icalcomponent *icalcomp
 	icalproperty *prop;
 	icalparameter *param;
 	icalparameter_partstat status;
-	const char *delto = NULL;
 	
 	prop = get_attendee_prop (icalcomp, user_email);
 
@@ -371,8 +715,16 @@ e_cal_popup_target_new_attachments(ECalP
 	t->attachments = attachments;
 	if (len > 0)
 		mask &= ~ E_CAL_POPUP_ATTACHMENTS_MANY;
-	if (len == 1)
+
+	if (len == 1 && ((EAttachment *)attachments->data)->is_available_local) {
+		if (camel_content_type_is(((CamelDataWrapper *) ((EAttachment *) attachments->data)->body)->mime_type, "image", "*"))
+			mask &= ~ E_CAL_POPUP_ATTACHMENTS_IMAGE;
 		mask &= ~ E_CAL_POPUP_ATTACHMENTS_ONE;
+	}
+
+	if (len > 1)
+		mask &= ~ E_CAL_POPUP_ATTACHMENTS_MULTIPLE;
+	
 	t->target.mask = mask;
 
 	return t;
@@ -439,6 +791,8 @@ static const EPopupHookTargetMask ecalph
 	{ "one", E_CAL_POPUP_ATTACHMENTS_ONE },
 	{ "many", E_CAL_POPUP_ATTACHMENTS_MANY },
 	{ "modify", E_CAL_POPUP_ATTACHMENTS_MODIFY },
+	{ "multiple", E_CAL_POPUP_ATTACHMENTS_MULTIPLE },
+	{ "image", E_CAL_POPUP_ATTACHMENTS_IMAGE },
 	{ 0 }
 };
 
Index: calendar/gui/e-cal-popup.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-cal-popup.h,v
retrieving revision 1.9
diff -u -p -r1.9 e-cal-popup.h
--- calendar/gui/e-cal-popup.h	18 Aug 2005 11:20:23 -0000	1.9
+++ calendar/gui/e-cal-popup.h	19 Aug 2005 05:59:59 -0000
@@ -112,7 +112,9 @@ enum _e_cal_popup_target_source_t {
 enum _e_cal_popup_target_attachments_t {
 	E_CAL_POPUP_ATTACHMENTS_ONE = 1<<0, /* only 1 selected */
 	E_CAL_POPUP_ATTACHMENTS_MANY = 1<<1, /* one or more selected */
-	E_CAL_POPUP_ATTACHMENTS_MODIFY =1<<2, /* check for modify operation */
+	E_CAL_POPUP_ATTACHMENTS_MODIFY = 1<<2, /* check for modify operation */
+	E_CAL_POPUP_ATTACHMENTS_MULTIPLE = 1<<3,
+	E_CAL_POPUP_ATTACHMENTS_IMAGE = 1<<4,
 };
 
 typedef struct _ECalPopupTargetSelect ECalPopupTargetSelect;
Index: calendar/gui/e-calendar-table.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-calendar-table.c,v
retrieving revision 1.138
diff -u -p -r1.138 e-calendar-table.c
--- calendar/gui/e-calendar-table.c	5 Aug 2005 12:15:33 -0000	1.138
+++ calendar/gui/e-calendar-table.c	19 Aug 2005 05:59:59 -0000
@@ -1009,7 +1009,7 @@ e_calendar_table_on_save_as (EPopup *ep,
 	if (comp_data == NULL)
 		return;
 	
-	filename = e_file_dialog_save (_("Save as..."));
+	filename = e_file_dialog_save (_("Save as..."), NULL);
 	if (filename == NULL)
 		return;
 	
Index: calendar/gui/e-calendar-view.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-calendar-view.c,v
retrieving revision 1.90
diff -u -p -r1.90 e-calendar-view.c
--- calendar/gui/e-calendar-view.c	5 Aug 2005 12:15:34 -0000	1.90
+++ calendar/gui/e-calendar-view.c	19 Aug 2005 06:00:00 -0000
@@ -1102,7 +1102,7 @@ on_save_as (EPopup *ep, EPopupItem *pite
 	if (!selected)
 		return;
 
-	filename = e_file_dialog_save (_("Save as..."));
+	filename = e_file_dialog_save (_("Save as..."), NULL);
 	if (filename == NULL)
 		return;
 	
Index: calendar/gui/dialogs/comp-editor.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/comp-editor.c,v
retrieving revision 1.149
diff -u -p -r1.149 comp-editor.c
--- calendar/gui/dialogs/comp-editor.c	18 Aug 2005 11:20:23 -0000	1.149
+++ calendar/gui/dialogs/comp-editor.c	19 Aug 2005 06:00:01 -0000
@@ -141,6 +141,7 @@ static void page_dates_changed_cb (GtkOb
 
 static void obj_modified_cb (ECal *client, GList *objs, gpointer data);
 static void obj_removed_cb (ECal *client, GList *uids, gpointer data);
+static gboolean open_attachment (EAttachmentBar *bar, CompEditor *editor);
 
 G_DEFINE_TYPE (CompEditor, comp_editor, GTK_TYPE_DIALOG);
 
@@ -991,8 +992,8 @@ attachment_bar_changed_cb (EAttachmentBa
 
 }
 
-static	gboolean 
-attachment_bar_icon_clicked_cb (EAttachmentBar *bar, GdkEvent *event, CompEditor *editor)
+static gboolean 
+open_attachment (EAttachmentBar *bar, CompEditor *editor)
 {
 	GnomeIconList *icon_list;
 	GList *p;
@@ -1000,7 +1001,7 @@ attachment_bar_icon_clicked_cb (EAttachm
 	char *attach_file_url;
 	GError *error = NULL;
 	
-	if (E_IS_ATTACHMENT_BAR (bar) && event->type == GDK_2BUTTON_PRESS) {
+	if (E_IS_ATTACHMENT_BAR (bar)) {
 		icon_list = GNOME_ICON_LIST (bar);
 		p = gnome_icon_list_get_selection (icon_list);
 		if (p) {
@@ -1036,9 +1037,28 @@ attachment_bar_icon_clicked_cb (EAttachm
 		return FALSE;
 }
 
+static	gboolean 
+attachment_bar_icon_clicked_cb (EAttachmentBar *bar, GdkEvent *event, CompEditor *editor)
+{
+	if (E_IS_ATTACHMENT_BAR (bar) && event->type == GDK_2BUTTON_PRESS) 
+		if (open_attachment (bar, editor))
+				return TRUE;
+	return FALSE;
+}
+
 /* Callbacks.  */
 
 static void
+cab_open(EPopup *ep, EPopupItem *item, void *data)
+{
+	EAttachmentBar *bar = data;
+	CompEditor *editor = COMP_EDITOR (gtk_widget_get_toplevel (GTK_WIDGET (bar)));
+	
+	if (!open_attachment (bar, editor))
+		g_message ("\n Open failed");
+}
+
+static void
 cab_add(EPopup *ep, EPopupItem *item, void *data)
 {
 	EAttachmentBar *bar = data;
@@ -1077,10 +1097,11 @@ cab_remove(EPopup *ep, EPopupItem *item,
 
 /* Popup menu handling.  */
 static EPopupItem cab_popups[] = {
-	{ E_POPUP_ITEM, "10.attach", N_("_Remove"), cab_remove, NULL, GTK_STOCK_REMOVE, E_CAL_POPUP_ATTACHMENTS_MANY | E_CAL_POPUP_ATTACHMENTS_MODIFY },
-	{ E_POPUP_ITEM, "20.attach", N_("_Properties"), cab_properties, NULL, GTK_STOCK_PROPERTIES, E_CAL_POPUP_ATTACHMENTS_ONE },
-	{ E_POPUP_BAR, "30.attach.00", NULL, NULL, NULL, NULL, E_CAL_POPUP_ATTACHMENTS_MANY|E_CAL_POPUP_ATTACHMENTS_ONE },
-	{ E_POPUP_ITEM, "30.attach.01", N_("_Add attachment..."), cab_add, NULL, GTK_STOCK_ADD, E_CAL_POPUP_ATTACHMENTS_MODIFY },
+	{ E_POPUP_ITEM, "10.attach", N_("_Open"), cab_open, NULL, GTK_STOCK_OPEN, E_CAL_POPUP_ATTACHMENTS_ONE},
+	{ E_POPUP_ITEM, "20.attach", N_("_Remove"), cab_remove, NULL, GTK_STOCK_REMOVE, E_CAL_POPUP_ATTACHMENTS_MANY | E_CAL_POPUP_ATTACHMENTS_MODIFY },
+	{ E_POPUP_ITEM, "30.attach", N_("_Properties"), cab_properties, NULL, GTK_STOCK_PROPERTIES, E_CAL_POPUP_ATTACHMENTS_ONE },
+	{ E_POPUP_BAR, "40.attach.00", NULL, NULL, NULL, NULL, E_CAL_POPUP_ATTACHMENTS_MANY|E_CAL_POPUP_ATTACHMENTS_ONE },
+	{ E_POPUP_ITEM, "40.attach.01", N_("_Add attachment..."), cab_add, NULL, GTK_STOCK_ADD, E_CAL_POPUP_ATTACHMENTS_MODIFY},
 };
 
 static void
@@ -1121,7 +1142,7 @@ cab_popup(EAttachmentBar *bar, GdkEventB
 	ECalPopup *ecp;
 	ECalPopupTargetAttachments *t;
 	GtkMenu *menu;
-       CompEditor *editor = COMP_EDITOR (gtk_widget_get_toplevel (GTK_WIDGET (bar)));
+	CompEditor *editor = COMP_EDITOR (gtk_widget_get_toplevel (GTK_WIDGET (bar)));
 
         attachments = e_attachment_bar_get_attachment(bar, id);
 
@@ -1162,14 +1183,17 @@ button_press_event (GtkWidget *widget, G
 {
 	EAttachmentBar *bar = (EAttachmentBar *)widget;
 	GnomeIconList *icon_list = GNOME_ICON_LIST(widget);
-	int icon_number;
+	int icon_number = -1;
+	
 	if (event->button != 3)
 		return FALSE;
 	
-	icon_number = gnome_icon_list_get_icon_at (icon_list, event->x, event->y);
-	if (icon_number >= 0) {
-		gnome_icon_list_unselect_all(icon_list);
-		gnome_icon_list_select_icon (icon_list, icon_number);
+	if (!gnome_icon_list_get_selection (icon_list)) {
+		icon_number = gnome_icon_list_get_icon_at (icon_list, event->x, event->y);
+		if (icon_number >= 0) {
+			gnome_icon_list_unselect_all(icon_list);
+			gnome_icon_list_select_icon (icon_list, icon_number);
+		}
 	}
 
 	cab_popup(bar, event, icon_number);
@@ -2009,7 +2033,6 @@ set_attachment_list (CompEditor *editor,
 {
 	GSList *p = NULL;
 	const char *comp_uid= NULL;
-	const char *local_store = e_cal_get_local_attachment_store (editor->priv->client);
 
 	e_cal_component_get_uid (editor->priv->comp, &comp_uid);
 
Index: e-util/e-dialog-utils.c
===================================================================
RCS file: /cvs/gnome/evolution/e-util/e-dialog-utils.c,v
retrieving revision 1.21
diff -u -p -r1.21 e-dialog-utils.c
--- e-util/e-dialog-utils.c	25 Aug 2004 10:59:00 -0000	1.21
+++ e-util/e-dialog-utils.c	19 Aug 2005 06:00:02 -0000
@@ -42,6 +42,7 @@
 #include <gtk/gtkfilesel.h>
 #endif
 
+#include <gconf/gconf-client.h>
 #include <libgnome/gnome-i18n.h>
 #include <libgnome/gnome-util.h>
 
@@ -250,6 +251,8 @@ save_ok (GtkWidget *widget, gpointer dat
 	char **filename = data;
 	const char *path;
 	int btn = GTK_RESPONSE_YES;
+	GConfClient *gconf = gconf_client_get_default();
+	char *dir;
 	
 	fs = gtk_widget_get_toplevel (widget);
 #ifdef USE_GTKFILECHOOSER
@@ -272,9 +275,14 @@ save_ok (GtkWidget *widget, gpointer dat
 		btn = gtk_dialog_run (GTK_DIALOG (dlg));
 		gtk_widget_destroy (dlg);
 	}
-	
-	if (btn == GTK_RESPONSE_YES)
+
+	if (btn == GTK_RESPONSE_YES) {
+		dir = g_path_get_dirname (path);
+		gconf_client_set_string(gconf, "/apps/evolution/mail/save_dir", dir, NULL);
+		g_free (dir);
 		*filename = g_strdup (path);
+	}
+	g_object_unref(gconf);
 	
 	gtk_main_quit ();
 }
@@ -291,10 +299,19 @@ filechooser_response (GtkWidget *fc, gin
 #endif
 
 char *
-e_file_dialog_save (const char *title)
+e_file_dialog_save (const char *title, const char *fname)
 {
 	GtkWidget *selection;
 	char *path, *filename = NULL;
+	char *dir, *gdir = NULL;
+	GConfClient *gconf;
+
+	gconf = gconf_client_get_default();
+	dir = gdir = gconf_client_get_string(gconf, "/apps/evolution/mail/save_dir", NULL);
+	g_object_unref(gconf);
+
+	if (dir == NULL)
+		dir = (char *)g_get_home_dir();
 
 #ifdef USE_GTKFILECHOOSER
 	selection = gtk_file_chooser_dialog_new (title,
@@ -304,12 +321,15 @@ e_file_dialog_save (const char *title)
 						 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
 						 NULL);
 	gtk_dialog_set_default_response (GTK_DIALOG (selection), GTK_RESPONSE_ACCEPT);
-	gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (selection), g_get_home_dir ());
+	gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (selection), dir);
+
+	if (fname)
+		gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER (selection), fname);
 
 	g_signal_connect (G_OBJECT (selection), "response", G_CALLBACK (filechooser_response), &filename);
 #else
 	selection = gtk_file_selection_new (title);
-	path = g_strdup_printf ("%s/", g_get_home_dir ());
+	path = g_strdup_printf ("%s/", dir);
 	gtk_file_selection_set_filename (GTK_FILE_SELECTION (selection), path);
 	g_free (path);
 
@@ -322,6 +342,86 @@ e_file_dialog_save (const char *title)
 	gtk_main ();
 	
 	gtk_widget_destroy (GTK_WIDGET (selection));
+	g_free (gdir);
+	
+	return filename;
+}
+
+static void
+save_folder_ok (GtkWidget *widget, gpointer data)
+{
+	GtkWidget *fs;
+	char **filename = data;
+	const char *path;
+	GConfClient *gconf = gconf_client_get_default();
+	
+	fs = gtk_widget_get_toplevel (widget);
+#ifdef USE_GTKFILECHOOSER
+	path = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (fs));
+#else
+	path = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
+#endif
+	
+	gconf_client_set_string(gconf, "/apps/evolution/mail/save_dir", path, NULL);
+	g_object_unref(gconf);
+	*filename = g_strdup (path);
+	
+	gtk_main_quit ();
+}
+
+#ifdef USE_GTKFILECHOOSER
+static void
+folderchooser_response (GtkWidget *fc, gint response_id, gpointer data)
+{
+	if (response_id == GTK_RESPONSE_ACCEPT)
+		save_folder_ok (fc, data);
+	else
+		gtk_widget_destroy (fc);
+}
+#endif
+
+char *
+e_file_dialog_save_folder (const char *title)
+{
+	GtkWidget *selection;
+	char *path, *filename = NULL;
+	char *dir, *gdir = NULL;
+	GConfClient *gconf;
+
+	gconf = gconf_client_get_default();
+	dir = gdir = gconf_client_get_string(gconf, "/apps/evolution/mail/save_dir", NULL);
+	g_object_unref(gconf);
+
+	if (dir == NULL)
+		dir = (char *)g_get_home_dir();
+
+#ifdef USE_GTKFILECHOOSER
+	selection = gtk_file_chooser_dialog_new (title,
+						 NULL,
+						 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+						 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+						 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+						 NULL);
+	gtk_dialog_set_default_response (GTK_DIALOG (selection), GTK_RESPONSE_ACCEPT);
+	gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (selection), dir);
+
+	g_signal_connect (G_OBJECT (selection), "response", G_CALLBACK (folderchooser_response), &filename);
+#else
+	selection = gtk_file_selection_new (title);
+	path = g_strdup_printf ("%s/", dir);
+	gtk_file_selection_set_filename (GTK_FILE_SELECTION (selection), path);
+	g_free (path);
+
+	g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (selection)->ok_button), "clicked", G_CALLBACK (save_folder_ok), &filename);
+	g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (selection)->cancel_button), "clicked", G_CALLBACK (gtk_main_quit), NULL);
+#endif
+	
+	gtk_widget_show (GTK_WIDGET (selection));
+	gtk_grab_add (GTK_WIDGET (selection));
+	gtk_main ();
+	
+	gtk_widget_destroy (GTK_WIDGET (selection));
+	g_free (gdir);
 	
 	return filename;
 }
Index: e-util/e-dialog-utils.h
===================================================================
RCS file: /cvs/gnome/evolution/e-util/e-dialog-utils.h,v
retrieving revision 1.9
diff -u -p -r1.9 e-dialog-utils.h
--- e-util/e-dialog-utils.h	25 Mar 2003 15:47:45 -0000	1.9
+++ e-util/e-dialog-utils.h	19 Aug 2005 06:00:02 -0000
@@ -39,7 +39,9 @@ void  e_dialog_set_transient_for     (Gt
 void  e_dialog_set_transient_for_xid (GtkWindow       *dialog,
 				      GdkNativeWindow  xid);
 
-char *e_file_dialog_save             (const char      *title);
+char *e_file_dialog_save             (const char      *title, const char *fname);
+
+char *e_file_dialog_save_folder	     (const char      *title);
 
 
 #endif


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]