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:
@@ -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
@@ -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) \
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user