diff options
Diffstat (limited to 'filter/filter-folder.c')
-rw-r--r-- | filter/filter-folder.c | 124 |
1 files changed, 109 insertions, 15 deletions
diff --git a/filter/filter-folder.c b/filter/filter-folder.c index 100b4fe253..5b862a986a 100644 --- a/filter/filter-folder.c +++ b/filter/filter-folder.c @@ -20,6 +20,8 @@ #include <config.h> +#define SHELL + #include <glib.h> #include <libgnome/gnome-defs.h> #include <libgnome/gnome-i18n.h> @@ -28,7 +30,9 @@ #include <gal/widgets/e-unicode.h> #include "filter-folder.h" -#include "shell/evolution-folder-selector-button.h" +#ifdef SHELL +#include "shell/evolution-shell-client.h" +#endif #include "e-util/e-sexp.h" #define d(x) @@ -41,7 +45,9 @@ static GtkWidget *get_widget(FilterElement *fe); static void build_code(FilterElement *fe, GString *out, struct _FilterPart *ff); static void format_sexp(FilterElement *, GString *); +#ifdef SHELL extern EvolutionShellClient *global_shell_client; +#endif static void filter_folder_class_init (FilterFolderClass *class); static void filter_folder_init (FilterFolder *gspaper); @@ -109,6 +115,7 @@ filter_folder_finalise (GtkObject *obj) FilterFolder *o = (FilterFolder *)obj; g_free (o->uri); + g_free (o->name); ((GtkObjectClass *)(parent_class))->finalize(obj); } @@ -128,10 +135,12 @@ filter_folder_new (void) } void -filter_folder_set_value(FilterFolder *ff, const char *uri) +filter_folder_set_value(FilterFolder *ff, const char *uri, const char *name) { g_free(ff->uri); ff->uri = g_strdup(uri); + g_free(ff->name); + ff->name = g_strdup(name); } static gboolean @@ -173,6 +182,7 @@ xml_encode (FilterElement *fe) xmlSetProp (value, "type", "folder"); work = xmlNewChild (value, NULL, "folder", NULL); + xmlSetProp (work, "name", ff->name); xmlSetProp (work, "uri", ff->uri); return value; @@ -192,7 +202,12 @@ xml_decode (FilterElement *fe, xmlNodePtr node) n = node->childs; while (n) { if (!strcmp (n->name, "folder")) { - char *uri; + char *uri, *name; + + name = xmlGetProp (n, "name"); + g_free (ff->name); + ff->name = g_strdup (name); + xmlFree (name); uri = xmlGetProp (n, "uri"); g_free (ff->uri); @@ -207,12 +222,88 @@ xml_decode (FilterElement *fe, xmlNodePtr node) } static void -folder_selected (EvolutionFolderSelectorButton *button, - GNOME_Evolution_Folder *folder, - FilterFolder *ff) +button_clicked (GtkButton *button, FilterFolder *ff) { - g_free (ff->uri); - ff->uri = g_strdup (folder->physicalUri); +#ifdef SHELL + const char *allowed_types[] = { "mail", NULL }; + char *def, *physical_uri, *evolution_uri; + gchar *s; + + def = ff->uri ? ff->uri : ""; + + gtk_widget_set_sensitive((GtkWidget *)button, FALSE); + gtk_object_ref((GtkObject *)ff); + + evolution_shell_client_user_select_folder (global_shell_client, + GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))), + _("Select Folder"), + def, allowed_types, + &evolution_uri, + &physical_uri); + + if (GTK_OBJECT_DESTROYED(button)) { + g_free(physical_uri); + g_free(evolution_uri); + gtk_object_unref((GtkObject *)ff); + return; + } + + gtk_widget_set_sensitive((GtkWidget *)button, TRUE); + + if (physical_uri != NULL && physical_uri[0] != '\0') { + g_free (ff->uri); + ff->uri = physical_uri; + + g_free (ff->name); + ff->name = g_strdup (g_basename (evolution_uri)); + s = e_utf8_to_gtk_string (GTK_WIDGET (button), ff->name); + gtk_label_set_text (GTK_LABEL (GTK_BIN (button)->child), s); + g_free (s); + } else { + g_free (physical_uri); + } + g_free (evolution_uri); + + gtk_object_unref((GtkObject *)ff); + +#else + GnomeDialog *gd; + GtkEntry *entry; + char *uri, *str; + + gd = (GnomeDialog *)gnome_dialog_new(_("Enter folder URI"), + GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, + NULL); + gtk_window_set_policy(GTK_WINDOW(gd), FALSE, TRUE, FALSE); + entry = (GtkEntry *)gtk_entry_new(); + if (ff->uri) { + e_utf8_gtk_entry_set_text(entry, ff->uri); + } + gtk_box_pack_start((GtkBox *)gd->vbox, (GtkWidget *)entry, TRUE, TRUE, 3); + gtk_widget_show((GtkWidget *)entry); + switch (gnome_dialog_run(gd)) { + case 0: + g_free(ff->uri); + g_free(ff->name); + uri = e_utf8_gtk_entry_get_text(entry); + ff->uri = uri; + str = strstr(uri, "//"); + if (str) + str = strchr(str+2, '/'); + if (str) + str++; + else + str = uri; + ff->name = g_strdup(str); + s = e_utf8_to_gtk_string ((GtkWidget *) button, ff->name); + gtk_label_set_text((GtkLabel *)GTK_BIN(button)->child, s); + g_free (s); + case 1: + gnome_dialog_close(gd); + case -1: + /* nothing */ + } +#endif gdk_window_raise (GTK_WIDGET (gtk_widget_get_ancestor (GTK_WIDGET (button), GTK_TYPE_WINDOW))->window); } @@ -220,17 +311,20 @@ folder_selected (EvolutionFolderSelectorButton *button, static GtkWidget * get_widget (FilterElement *fe) { - static const char *allowed_types[] = { "mail", NULL }; FilterFolder *ff = (FilterFolder *)fe; GtkWidget *button; + GtkWidget *label; - button = evolution_folder_selector_button_new (global_shell_client, - _("Select Folder"), - ff->uri, - allowed_types); - + if (ff->name && ff->name[0]) + label = gtk_label_new (g_basename (ff->name)); + else + label = gtk_label_new (_("<click here to select a folder>")); + + button = gtk_button_new (); + gtk_container_add (GTK_CONTAINER (button), label); gtk_widget_show (button); - gtk_signal_connect (GTK_OBJECT (button), "selected", folder_selected, ff); + gtk_widget_show (label); + gtk_signal_connect (GTK_OBJECT (button), "clicked", button_clicked, ff); return button; } |