diff options
-rw-r--r-- | mail/ChangeLog | 22 | ||||
-rw-r--r-- | mail/Makefile.am | 3 | ||||
-rw-r--r-- | mail/component-factory.c | 84 | ||||
-rw-r--r-- | mail/folder-browser-factory.c | 9 | ||||
-rw-r--r-- | mail/folder-browser.c | 48 | ||||
-rw-r--r-- | mail/mail-ops.c | 92 | ||||
-rw-r--r-- | mail/mail.h | 1 |
7 files changed, 245 insertions, 14 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 116fc6c7a8..152da07598 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,25 @@ +2000-05-27 Not Zed <NotZed@HelixCode.com> + + * Makefile.am (SHELL_OBJS): Include mail storage so we can + initialise folders. + + * component-factory.c (create_test_storage): Parses vfolder + defintions and adds them to the storage. Definetly needs more + work. + + * folder-browser-factory.c (control_activate): Add the VFolder + druid menu item. + (control_deactivate): And remove it. + + * mail-ops.c (vfolder_editor_clicked): For editing vfolder + definitions (rather like filters, oddly enough :). Tries to + update the shell but it doesn't seem to work properly - requires a + mail component restart to take effect. + + * folder-browser.c (folder_browser_load_folder): Handle vfolder: + urls' appropriately and map to camel. Still needs a way to tell + the vfolder what folders to search! (all vfolders come up empty!). + 2000-05-28 Christopher James Lahey <clahey@helixcode.com> * message-list.c, message-list.h: Added a COL_DELETED and made it diff --git a/mail/Makefile.am b/mail/Makefile.am index 7d78ab5ea6..2c3bb34251 100644 --- a/mail/Makefile.am +++ b/mail/Makefile.am @@ -33,7 +33,8 @@ SHELL_OBJS = \ $(top_builddir)/shell/Evolution-common.o \ $(top_builddir)/shell/Evolution-stubs.o \ $(top_builddir)/shell/Evolution-skels.o \ - $(top_builddir)/shell/evolution-shell-component.o + $(top_builddir)/shell/evolution-shell-component.o \ + $(top_builddir)/shell/evolution-storage.o evolution_mail_SOURCES = \ $(EVOLUTION_MAIL_CORBA_GENERATED) \ diff --git a/mail/component-factory.c b/mail/component-factory.c index 5983c4548a..749fc3c080 100644 --- a/mail/component-factory.c +++ b/mail/component-factory.c @@ -27,12 +27,18 @@ #include <bonobo.h> +#include "Evolution.h" +#include "evolution-storage.h" + #include "evolution-shell-component.h" #include "folder-browser.h" #include "mail.h" /* YUCK FIXME */ +#include "filter/filter-driver.h" #include "component-factory.h" +static void create_test_storage (EvolutionShellComponent *shell_component); + #ifdef USING_OAF #define COMPONENT_FACTORY_ID "OAFIID:evolution-shell-component-factory:evolution-mail:0ea887d5-622b-4b8c-b525-18aa1cbe18a6" @@ -65,6 +71,10 @@ create_view (EvolutionShellComponent *shell_component, g_assert (folder_browser_widget != NULL); g_assert (IS_FOLDER_BROWSER (folder_browser_widget)); + /* dum de dum, hack to let the folder browser know the storage its in */ + gtk_object_set_data((GtkObject *)folder_browser_widget, "e-storage", + gtk_object_get_data((GtkObject *)shell_component, "e-storage")); + /* FIXME: This never fails. :-/ */ folder_browser_set_uri (FOLDER_BROWSER (folder_browser_widget), physical_uri); @@ -76,6 +86,8 @@ owner_set_cb (EvolutionShellComponent *shell_component, Evolution_Shell shell_interface) { g_print ("evolution-mail: Yeeeh! We have an owner!\n"); /* FIXME */ + + create_test_storage (shell_component); } @@ -110,3 +122,75 @@ component_factory_init (void) exit (1); } } + +static void +create_test_storage (EvolutionShellComponent *shell_component) +{ + Evolution_Shell corba_shell; + EvolutionStorage *storage; + + corba_shell = evolution_shell_component_get_owner (shell_component); + if (corba_shell == CORBA_OBJECT_NIL) { + g_warning ("We have no shell!?"); + return; + } + + storage = evolution_storage_new ("storage_name"); + if (evolution_storage_register_on_shell (storage, corba_shell) + != EVOLUTION_STORAGE_OK) { + g_warning ("Cannot register storage"); + return; + } + + /* save the storage for later */ + gtk_object_set_data((GtkObject *)shell_component, "e-storage", storage); + + /* this is totally not the way we want to do this - but the + filter stuff needs work before we can remove it */ + { + FilterDriver *fe; + int i, count; + char *user, *system; + extern char *evolution_dir; + + fe = filter_driver_new(); + user = g_strdup_printf ("%s/vfolders.xml", evolution_dir); + system = g_strdup_printf("%s/evolution/vfoldertypes.xml", EVOLUTION_DATADIR); + filter_driver_set_rules(fe, system, user); + g_free(user); + g_free(system); + count = filter_driver_rule_count(fe); + for (i=0;i<count;i++) { + struct filter_option *fo; + GString *query; + struct filter_desc *desc = NULL; + char *desctext, descunknown[64]; + char *name; + + fo = filter_driver_rule_get(fe, i); + if (fo == NULL) + continue; + query = g_string_new(""); + if (fo->description) + desc = fo->description->data; + if (desc) + desctext = desc->data; + else { + sprintf(descunknown, "volder-%p", fo); + desctext = descunknown; + } + g_string_sprintf(query, "vfolder:/%s/vfolder/%s?", evolution_dir, desctext); + filter_driver_expand_option(fe, query, NULL, fo); + name = g_strdup_printf("/%s", desctext); + printf("Adding new vfolder: %s\n", query->str); + evolution_storage_new_folder (storage, name, + "mail", + query->str, + name+1); + g_string_free(query, TRUE); + g_free(name); + } + gtk_object_unref((GtkObject *)fe); + } +} + diff --git a/mail/folder-browser-factory.c b/mail/folder-browser-factory.c index 23e5550594..2be6a06179 100644 --- a/mail/folder-browser-factory.c +++ b/mail/folder-browser-factory.c @@ -70,12 +70,18 @@ control_activate (BonoboControl *control, BonoboUIHandler *uih) GNOME_STOCK_PIXMAP_TRASH, 0, 0, expunge_folder, folder_browser); - bonobo_ui_handler_menu_new_item (uih, "/Tools/Filter Druid ...", N_("_Filter Druid"), + bonobo_ui_handler_menu_new_item (uih, "/Tools/Filter Druid ...", N_("_Filter Druid ..."), NULL, -1, BONOBO_UI_HANDLER_PIXMAP_NONE, 0, 0, 0, filter_edit, folder_browser); + bonobo_ui_handler_menu_new_item (uih, "/Tools/Vfolder Druid ...", N_("_Vfolder Druid ..."), + NULL, -1, + BONOBO_UI_HANDLER_PIXMAP_NONE, + 0, + 0, 0, vfolder_edit, folder_browser); + toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_BOTH); @@ -99,6 +105,7 @@ control_deactivate (BonoboControl *control, BonoboUIHandler *uih) bonobo_ui_handler_menu_remove (uih, "/File/Mail"); bonobo_ui_handler_menu_remove (uih, "/Tools/Expunge"); bonobo_ui_handler_menu_remove (uih, "/Tools/Filter Druid ..."); + bonobo_ui_handler_menu_remove (uih, "/Tools/VFolder Druid ..."); bonobo_ui_handler_dock_remove (uih, "/Toolbar"); } diff --git a/mail/folder-browser.c b/mail/folder-browser.c index 297279c73f..f435d0cf50 100644 --- a/mail/folder-browser.c +++ b/mail/folder-browser.c @@ -67,35 +67,59 @@ folder_browser_load_folder (FolderBrowser *fb, const char *name) { char *store_name, *msg; CamelStore *store; - CamelFolder *new_folder; + CamelFolder *new_folder = NULL; CamelException *ex; gboolean new_folder_exists = FALSE; - if (strncmp (name, "file:", 5) != 0) { + ex = camel_exception_new (); + + if (!strncmp(name, "vfolder:", 8)) { + char *query, *newquery; + store_name = g_strdup(name); + query = strchr(store_name, '?'); + if (query) { + *query++ = 0; + } else { + query = ""; + } + newquery = g_strdup_printf("mbox?%s", query); + store = camel_session_get_store (session, store_name, ex); + + if (store) { + new_folder = camel_store_get_folder (store, newquery, ex); + } + g_free(newquery); + g_free(store_name); + + /* FIXME: Add the mbox folders we search!!! */ + } else if (!strncmp(name, "file:", 5)) { + /* Change "file:" to "mbox:". */ + store_name = g_strdup_printf ("mbox:%s", name + 5); + store = camel_session_get_store (session, store_name, ex); + g_free (store_name); + if (store) { + new_folder = camel_store_get_folder (store, "mbox", ex); + } + } else { char *msg; msg = g_strdup_printf ("Can't open URI %s", name); gnome_error_dialog (msg); g_free (msg); + camel_exception_free (ex); return FALSE; } - - /* Change "file:" to "mbox:". */ - store_name = g_strdup_printf ("mbox:%s", name + 5); - - ex = camel_exception_new (); - store = camel_session_get_store (session, store_name, ex); - g_free (store_name); - if (store) { - new_folder = camel_store_get_folder (store, "mbox", ex); + + if (store) gtk_object_unref (GTK_OBJECT (store)); - } if (camel_exception_get_id (ex)) { msg = g_strdup_printf ("Unable to get folder %s: %s\n", name, camel_exception_get_description (ex)); gnome_error_dialog (msg); camel_exception_free (ex); + if (new_folder) + gtk_object_unref((GtkObject *)new_folder); return FALSE; } diff --git a/mail/mail-ops.c b/mail/mail-ops.c index 606532a5ef..873dc7e6ab 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -32,6 +32,10 @@ #include "filter/filter-editor.h" #include "filter/filter-driver.h" +/* FIXME: is there another way to do this? */ +#include "Evolution.h" +#include "evolution-storage.h" + #ifndef HAVE_MKSTEMP #include <fcntl.h> #include <sys/stat.h> @@ -511,4 +515,92 @@ void filter_edit (GtkWidget *button, gpointer user_data) gtk_widget_show((GtkWidget *)fe); } +static void +vfolder_editor_clicked(FilterEditor *fe, int button, FolderBrowser *fb) +{ + printf("closing dialog\n"); + if (button == 0) { + char *user; + + user = g_strdup_printf ("%s/vfolders.xml", evolution_dir); + filter_editor_save_rules(fe, user); + printf("saving vfolders to '%s'\n", user); + g_free(user); + + /* FIXME: this is also not the way to do this, see also + component-factory.c */ + { + EvolutionStorage *storage; + FilterDriver *fe; + int i, count; + char *user, *system; + extern char *evolution_dir; + + storage = gtk_object_get_data((GtkObject *)fb, "e-storage"); + + fe = filter_driver_new(); + user = g_strdup_printf ("%s/vfolders.xml", evolution_dir); + system = g_strdup_printf("%s/evolution/vfoldertypes.xml", EVOLUTION_DATADIR); + filter_driver_set_rules(fe, system, user); + g_free(user); + g_free(system); + count = filter_driver_rule_count(fe); + for (i=0;i<count;i++) { + struct filter_option *fo; + GString *query; + struct filter_desc *desc = NULL; + char *desctext, descunknown[64]; + char *name; + + fo = filter_driver_rule_get(fe, i); + if (fo == NULL) + continue; + query = g_string_new(""); + if (fo->description) + desc = fo->description->data; + if (desc) + desctext = desc->data; + else { + sprintf(descunknown, "volder-%p", fo); + desctext = descunknown; + } + g_string_sprintf(query, "vfolder:/%s/vfolder/%s?", evolution_dir, desctext); + filter_driver_expand_option(fe, query, NULL, fo); + name = g_strdup_printf("/%s", desctext); + printf("Adding new vfolder: %s\n", query->str); + evolution_storage_new_folder (storage, name, + "mail", + query->str, + name+1); + g_string_free(query, TRUE); + g_free(name); + } + gtk_object_unref((GtkObject *)fe); + } + + } + if (button != -1) { + gnome_dialog_close((GnomeDialog *)fe); + } +} + +void vfolder_edit (GtkWidget *button, gpointer user_data) +{ + FolderBrowser *fb = FOLDER_BROWSER(user_data); + FilterEditor *fe; + char *user, *system; + + printf("Editing vfolders ...\n"); + fe = filter_editor_new(); + + user = g_strdup_printf ("%s/vfolders.xml", evolution_dir); + system = g_strdup_printf("%s/evolution/vfoldertypes.xml", EVOLUTION_DATADIR); + filter_editor_set_rule_files(fe, system, user); + g_free(user); + g_free(system); + gnome_dialog_append_buttons((GnomeDialog *)fe, GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, 0); + gtk_signal_connect((GtkObject *)fe, "clicked", vfolder_editor_clicked, fb); + gtk_widget_show((GtkWidget *)fe); +} + diff --git a/mail/mail.h b/mail/mail.h index a7c1a9f3aa..cfbe74b801 100644 --- a/mail/mail.h +++ b/mail/mail.h @@ -55,6 +55,7 @@ void delete_msg (GtkWidget *button, gpointer user_data); void expunge_folder (GtkWidget *button, gpointer user_data); void filter_edit (GtkWidget *button, gpointer user_data); +void vfolder_edit (GtkWidget *button, gpointer user_data); /* session */ void session_init (void); |