vfolder gui! So you can define them,k they show up in the list (well,

after a restart), but they always come up empty - doesn't search any
folders yet.

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!).

svn path=/trunk/; revision=3241
This commit is contained in:
Not Zed
2000-05-28 06:18:11 +00:00
committed by Michael Zucci
parent d11f78c349
commit 5b887fe6dc
7 changed files with 245 additions and 14 deletions
+22
View File
@@ -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
+2 -1
View File
@@ -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) \
+84
View File
@@ -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);
}
}
+8 -1
View File
@@ -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");
}
+36 -12
View File
@@ -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;
}
+92
View File
@@ -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);
}
+1
View File
@@ -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);