aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog22
-rw-r--r--mail/Makefile.am3
-rw-r--r--mail/component-factory.c84
-rw-r--r--mail/folder-browser-factory.c9
-rw-r--r--mail/folder-browser.c48
-rw-r--r--mail/mail-ops.c92
-rw-r--r--mail/mail.h1
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);