aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--addressbook/ChangeLog30
-rw-r--r--addressbook/gui/component/select-names/e-select-names.c372
-rw-r--r--addressbook/gui/component/select-names/select-names.glade72
3 files changed, 97 insertions, 377 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog
index 16bd72790b..25855fb26f 100644
--- a/addressbook/ChangeLog
+++ b/addressbook/ChangeLog
@@ -1,3 +1,33 @@
+2002-07-16 Chris Toshok <toshok@ximian.com>
+
+ * gui/component/select-names/select-names.glade: remove the option
+ menu and browse button, and add a custom widget placeholder for
+ the folder-selector.
+
+ * gui/component/select-names/e-select-names.c
+ (addressbook_model_set_uri): move the "append /addressbook.db"
+ stuff here.
+ (e_addressbook_create_ebook_table): remove the code setting
+ initial uri from here.
+ (e_select_names_folder_free): gone.
+ (e_select_names_option_activated): gone.
+ (add_menu_item): gone.
+ (update_option_menu): gone.
+ (new_folder): gone.
+ (removed_folder): gone.
+ (folder_browse): gone.
+ (hookup_listner): gone.
+ (add_additional_select_names_uris): gone.
+ (e_select_names_hookup_listners): gone.
+ (e_addressbook_create_folder_selector): new function, create the
+ folder selector button.
+ (folder_selected): new function, callback for the folder selector.
+ just calls addresbook_model_set_uri.
+ (e_select_names_init): get the folder selector and initialize it
+ to show /local/Contacts. also, set the model's uri here to the
+ same folder. nuke the code involving the old option menu and
+ browse button.
+
2002-07-08 Peter Williams <peterw@ximian.com>
* gui/component/select-names/Makefile.am (idl_DATA): Install the
diff --git a/addressbook/gui/component/select-names/e-select-names.c b/addressbook/gui/component/select-names/e-select-names.c
index 3f5c32d38e..f22c189dcc 100644
--- a/addressbook/gui/component/select-names/e-select-names.c
+++ b/addressbook/gui/component/select-names/e-select-names.c
@@ -39,6 +39,7 @@
#include <addressbook/gui/component/addressbook-storage.h>
#include <addressbook/gui/component/addressbook.h>
#include <shell/evolution-shell-client.h>
+#include <shell/evolution-folder-selector-button.h>
#include "e-select-names.h"
#include <addressbook/backend/ebook/e-card-simple.h>
@@ -55,6 +56,8 @@ static void e_select_names_get_arg (GtkObject *object, GtkArg *arg, guint arg_id
static void e_select_names_destroy (GtkObject *object);
static void update_query (GtkWidget *widget, ESelectNames *e_select_names);
+extern EvolutionShellClient *global_shell_client;
+
static GnomeDialogClass *parent_class = NULL;
#define PARENT_TYPE gnome_dialog_get_type()
@@ -72,15 +75,6 @@ typedef struct {
GtkWidget *button;
} ESelectNamesChild;
-struct _ESelectNamesFolder {
- char *description;
- char *display_name;
- char *uri;
- char *physicalUri;
- char *path;
- int count;
-};
-
GtkType
e_select_names_get_type (void)
{
@@ -136,6 +130,7 @@ e_select_names_class_init (ESelectNamesClass *klass)
</ETableSpecification>"
GtkWidget *e_addressbook_create_ebook_table(char *name, char *string1, char *string2, int num1, int num2);
+GtkWidget *e_addressbook_create_folder_selector(char *name, char *string1, char *string2, int num1, int num2);
static void
set_book(EBook *book, EBookStatus status, ESelectNames *esn)
@@ -161,9 +156,10 @@ set_book_with_model_data(EBook *book, EBookStatus status, EAddressbookModel *mod
}
static void
-addressbook_model_set_uri(ESelectNames *e_select_names, EAddressbookModel *model, const char *uri, ESelectNamesFolder *e_folder)
+addressbook_model_set_uri(ESelectNames *e_select_names, EAddressbookModel *model, const char *uri)
{
EBook *book;
+ char *book_uri;
/* If uri == the current uri, then we don't have to do anything */
book = e_addressbook_model_get_ebook (model);
@@ -173,16 +169,24 @@ addressbook_model_set_uri(ESelectNames *e_select_names, EAddressbookModel *model
return;
}
+ if (!strncmp (uri, "file:", 5)) {
+ book_uri = g_strconcat (uri, "/addressbook.db", NULL);
+ }
+ else {
+ book_uri = g_strdup (uri);
+ }
+
book = e_book_new();
if (e_select_names) {
gtk_object_ref(GTK_OBJECT(e_select_names));
gtk_object_ref(GTK_OBJECT(model));
- addressbook_load_uri(book, uri, (EBookCallback) set_book, e_select_names);
- e_select_names->current_folder = e_folder;
+ addressbook_load_uri(book, book_uri, (EBookCallback) set_book, e_select_names);
} else {
gtk_object_ref(GTK_OBJECT(model));
- addressbook_load_uri(book, uri, (EBookCallback) set_book_with_model_data, model);
+ addressbook_load_uri(book, book_uri, (EBookCallback) set_book_with_model_data, model);
}
+
+ g_free (book_uri);
}
static void *
@@ -327,21 +331,11 @@ e_addressbook_create_ebook_table(char *name, char *string1, char *string2, int n
ETableModel *without;
EAddressbookModel *model;
GtkWidget *table;
- char *filename;
- char *uri;
char *spec;
model = e_addressbook_model_new ();
adapter = E_TABLE_MODEL (e_addressbook_table_adapter_new (model));
- filename = gnome_util_prepend_user_home("evolution/local/Contacts/addressbook.db");
- uri = g_strdup_printf("file://%s", filename);
-
- addressbook_model_set_uri(NULL, model, uri, NULL);
-
- g_free(uri);
- g_free(filename);
-
gtk_object_set(GTK_OBJECT(model),
"editable", FALSE,
NULL);
@@ -366,135 +360,17 @@ e_addressbook_create_ebook_table(char *name, char *string1, char *string2, int n
return table;
}
-static void
-e_select_names_folder_free(ESelectNamesFolder *e_folder)
-{
- g_free(e_folder->description );
- g_free(e_folder->display_name);
- g_free(e_folder->uri);
- g_free(e_folder->physicalUri);
- g_free(e_folder->path);
- g_free(e_folder);
-}
-
-static void
-e_select_names_option_activated(GtkWidget *widget, ESelectNames *e_select_names)
-{
- ESelectNamesFolder *e_folder = gtk_object_get_data (GTK_OBJECT (widget), "EsnChoiceFolder");
-
- addressbook_model_set_uri(e_select_names, e_select_names->model, e_folder->uri, e_folder);
-}
-
-typedef struct {
- ESelectNames *names;
- GtkWidget *menu;
- int count;
-} NamesAndMenu;
-
-static void
-add_menu_item (gpointer key,
- gpointer value,
- gpointer user_data)
-{
- GtkWidget *menu;
- GtkWidget *item;
- ESelectNamesFolder *e_folder;
- NamesAndMenu *nnm;
- ESelectNames *e_select_names;
- gchar *label;
-
- nnm = user_data;
- e_folder = value;
- menu = nnm->menu;
- e_select_names = nnm->names;
-
- label = e_utf8_to_locale_string (_(e_folder->display_name));
- item = gtk_menu_item_new_with_label (label);
- g_free (label);
-
- gtk_menu_append (GTK_MENU (menu), item);
- gtk_object_set_data (GTK_OBJECT (item), "EsnChoiceFolder", e_folder);
-
- gtk_signal_connect (GTK_OBJECT (item), "activate",
- GTK_SIGNAL_FUNC (e_select_names_option_activated),
- e_select_names);
-
- e_folder->count = nnm->count++;
-}
-
-static void
-update_option_menu(ESelectNames *e_select_names)
-{
- GtkWidget *menu;
- GtkWidget *option;
-
- option = glade_xml_get_widget (e_select_names->gui,
- "optionmenu-folder");
- if (option) {
- NamesAndMenu nnm;
- menu = gtk_menu_new ();
-
- nnm.names = e_select_names;
- nnm.menu = menu;
- nnm.count = 0;
-
- g_hash_table_foreach (e_select_names->folders,
- add_menu_item,
- &nnm);
-
- gtk_widget_show_all (menu);
-
- gtk_option_menu_set_menu (GTK_OPTION_MENU (option),
- menu);
- gtk_option_menu_set_history (GTK_OPTION_MENU (option), 0);
- gtk_widget_set_sensitive (option, TRUE);
- }
-}
-
-static void
-new_folder (EvolutionStorageListener *storage_listener,
- const char *path,
- const GNOME_Evolution_Folder *folder,
- ESelectNames *e_select_names)
+GtkWidget *
+e_addressbook_create_folder_selector(char *name, char *string1, char *string2, int num1, int num2)
{
- if (!strcmp(folder->type, "contacts")
- || !strcmp(folder->type, "ldap-contacts")) {
- ESelectNamesFolder *e_folder = g_new(ESelectNamesFolder, 1);
- e_folder->description = g_strdup(folder->description );
- if (!strcmp (folder->type, "ldap-contacts"))
- e_folder->display_name = g_strdup_printf ("%s [LDAP]", folder->displayName);
- else
- e_folder->display_name = g_strdup(folder->displayName);
-
- if (!strncmp (folder->physicalUri, "file:", 5))
- e_folder->uri = g_strdup_printf ("%s/addressbook.db", folder->physicalUri);
- else
- e_folder->uri = g_strdup(folder->physicalUri);
- e_folder->physicalUri = g_strdup(folder->physicalUri);
- e_folder->path = g_strdup (path);
- e_folder->count = -1;
- g_hash_table_insert(e_select_names->folders,
- e_folder->path, e_folder);
- g_hash_table_insert(e_select_names->folders_by_uri,
- e_folder->physicalUri, e_folder);
- update_option_menu(e_select_names);
- }
+ return (GtkWidget *)gtk_type_new (EVOLUTION_TYPE_FOLDER_SELECTOR_BUTTON);
}
static void
-removed_folder (EvolutionStorageListener *storage_listener,
- const char *path,
+folder_selected (EvolutionFolderSelectorButton *button, GNOME_Evolution_Folder *folder,
ESelectNames *e_select_names)
{
- ESelectNamesFolder *e_folder;
-
- if ((e_folder = g_hash_table_lookup(e_select_names->folders, path))) {
- g_hash_table_remove(e_select_names->folders_by_uri,
- e_folder->physicalUri);
- g_hash_table_remove(e_select_names->folders, path);
- e_select_names_folder_free(e_folder);
- update_option_menu(e_select_names);
- }
+ addressbook_model_set_uri(e_select_names, e_select_names->model, folder->physicalUri);
}
static void
@@ -581,181 +457,6 @@ select_entry_changed (GtkWidget *widget, ESelectNames *e_select_names)
}
}
-extern EvolutionShellClient *global_shell_client;
-
-static void
-folder_browse (GtkWidget *widget, ESelectNames *e_select_names)
-{
- const char *allowed_types[] = { "contacts", NULL };
- GNOME_Evolution_Folder *folder;
- const char *current_uri = "";
- ESelectNamesFolder *e_folder;
-
- if (e_select_names->current_folder && e_select_names->current_folder->physicalUri) {
- current_uri = e_select_names->current_folder->physicalUri;
- }
-
- evolution_shell_client_user_select_folder (global_shell_client,
- GTK_WINDOW (gtk_widget_get_toplevel (widget)),
- _("Find contact in"), current_uri,
- allowed_types,
- &folder);
- if (!folder)
- return;
-
- if ((e_folder = g_hash_table_lookup(e_select_names->folders_by_uri, folder->physicalUri))) {
- GtkWidget *option;
-
- option = glade_xml_get_widget (e_select_names->gui,
- "optionmenu-folder");
- if (e_folder->count != -1 && option) {
- gtk_option_menu_set_history (GTK_OPTION_MENU (option), e_folder->count);
- }
-
- addressbook_model_set_uri(e_select_names, e_select_names->model, e_folder->uri, e_folder);
- }
-}
-
-
-static void
-hookup_listener (ESelectNames *e_select_names,
- GNOME_Evolution_Storage storage,
- EvolutionStorageListener *listener,
- CORBA_Environment *ev)
-{
- GNOME_Evolution_StorageListener corba_listener;
-
- g_return_if_fail (storage != CORBA_OBJECT_NIL);
-
- corba_listener = evolution_storage_listener_corba_objref(listener);
-
- gtk_signal_connect(GTK_OBJECT(listener), "new_folder",
- GTK_SIGNAL_FUNC(new_folder), e_select_names);
- gtk_signal_connect(GTK_OBJECT(listener), "removed_folder",
- GTK_SIGNAL_FUNC(removed_folder), e_select_names);
-
- GNOME_Evolution_Storage_addListener(storage, corba_listener, ev);
-
- if (ev->_major != CORBA_NO_EXCEPTION) {
- g_warning ("e_select_names_init: Exception adding listener to "
- "remote GNOME_Evolution_Storage interface.\n");
- return;
- }
-}
-
-static void
-add_additional_select_names_uris (ESelectNames *e_select_names, CORBA_Environment *ev)
-{
- Bonobo_ConfigDatabase config_db;
- guint32 num_additional_uris;
- int i;
- gboolean flag;
-
- config_db = addressbook_config_database (ev);
-
- num_additional_uris = bonobo_config_get_ulong_with_default (config_db, "/Addressbook/additional_select_names_folders/num", 0, &flag);
- for (i = 0; i < num_additional_uris; i ++) {
- ESelectNamesFolder *e_folder;
- char *config_path;
- char *path;
- char *name;
- char *uri;
-
- config_path = g_strdup_printf ("/Addressbook/additional_select_names_folders/folder_%d_path", i);
- path = bonobo_config_get_string (config_db, config_path, ev);
- g_free (config_path);
-
- config_path = g_strdup_printf ("/Addressbook/additional_select_names_folders/folder_%d_name", i);
- name = bonobo_config_get_string (config_db, config_path, ev);
- g_free (config_path);
-
- config_path = g_strdup_printf ("/Addressbook/additional_select_names_folders/folder_%d_uri", i);
- uri = bonobo_config_get_string (config_db, config_path, ev);
- g_free (config_path);
-
- if (!path || !name || !uri) {
- g_free (path);
- g_free (name);
- g_free (uri);
- continue;
- }
-
- e_folder = g_new(ESelectNamesFolder, 1);
- e_folder->description = g_strdup("");
- e_folder->display_name = g_strdup(name);
- if (!strncmp (uri, "file:", 5))
- e_folder->uri = g_strdup_printf ("%s/addressbook.db", uri);
- else
- e_folder->uri = g_strdup(uri);
- g_hash_table_insert(e_select_names->folders,
- g_strdup(path), e_folder);
- }
-
- if (num_additional_uris)
- update_option_menu(e_select_names);
-}
-
-static void
-e_select_names_hookup_shell_listeners (ESelectNames *e_select_names)
-{
- EvolutionStorage *other_contact_storage;
- GNOME_Evolution_Storage storage;
- CORBA_Environment ev;
-
- CORBA_exception_init(&ev);
-
- storage = (GNOME_Evolution_Storage) (evolution_shell_client_get_local_storage(addressbook_component_get_shell_client()));
- e_select_names->local_listener = evolution_storage_listener_new();
-
- /* This should really never happen, but a bug report (ximian #5193) came in w/ a backtrace suggesting that it did in
- fact happen to someone, so the best we can do is try to avoid crashing in this case. */
- if (storage == CORBA_OBJECT_NIL) {
- GtkWidget *oh_shit;
-
-#if 0
- oh_shit = gnome_error_dialog (_("Evolution is unable to get the addressbook local storage.\n"
- "This may have been caused by the evolution-addressbook component crashing.\n"
- "To help us better understand and ultimately resolve this problem,\n"
- "please send an e-mail to Jon Trowbridge <trow@ximian.com> with a\n"
- "detailed description of the circumstances under which this error\n"
- "occurred. Thank you."));
-#endif
-
- oh_shit = gnome_error_dialog (_("Evolution is unable to get the addressbook local storage.\n"
- "Under normal circumstances, this should never happen.\n"
- "You may need to exit and restart Evolution in order to\n"
- "correct this problem."));
- gtk_widget_show (oh_shit);
- return;
- }
- else {
- hookup_listener (e_select_names, storage, e_select_names->local_listener, &ev);
- bonobo_object_release_unref(storage, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("e_select_names_init: Exception unref'ing "
- "remote GNOME_Evolution_Storage interface.\n");
- CORBA_exception_free (&ev);
- return;
- }
- }
-
- other_contact_storage = addressbook_get_other_contact_storage ();
- if (other_contact_storage) {
- storage = bonobo_object_corba_objref (BONOBO_OBJECT (other_contact_storage));
- e_select_names->other_contacts_listener = evolution_storage_listener_new();
-
- hookup_listener (e_select_names, storage, e_select_names->other_contacts_listener, &ev);
- }
-
- /* XXX kludge to fill in folders for the exchange plugin. we
- latch onto a set of bonobo-conf settings that are
- maintained by the plugin and do the right magic to get the
- folders displayed in the option menu */
- add_additional_select_names_uris (e_select_names, &ev);
-
- CORBA_exception_free(&ev);
-}
-
GtkWidget *e_select_names_create_categories (gchar *name,
gchar *string1, gchar *string2,
gint int1, gint int2);
@@ -780,6 +481,9 @@ e_select_names_init (ESelectNames *e_select_names)
{
GladeXML *gui;
GtkWidget *widget, *button;
+ const char *selector_types[] = { "contacts", "ldap-contacts", NULL };
+ char *filename;
+ char *uri;
gui = glade_xml_new (EVOLUTION_GLADEDIR "/select-names.glade", NULL);
e_select_names->gui = gui;
@@ -837,21 +541,29 @@ e_select_names_init (ESelectNames *e_select_names)
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(update_query), e_select_names);
- button = glade_xml_get_widget (gui, "button-browse");
- if (button && GTK_IS_BUTTON (button))
- gtk_signal_connect(GTK_OBJECT(button), "clicked",
- GTK_SIGNAL_FUNC(folder_browse), e_select_names);
-
- e_select_names->folders = g_hash_table_new(g_str_hash, g_str_equal);
- e_select_names->folders_by_uri = g_hash_table_new(g_str_hash, g_str_equal);
-
- e_select_names_hookup_shell_listeners (e_select_names);
+ button = glade_xml_get_widget (gui, "folder-selector");
+ evolution_folder_selector_button_construct (EVOLUTION_FOLDER_SELECTOR_BUTTON (button),
+ global_shell_client,
+ _("Find contact in"),
+ "evolution:/local/Contacts",
+ selector_types);
+ if (button && EVOLUTION_IS_FOLDER_SELECTOR_BUTTON (button))
+ gtk_signal_connect(GTK_OBJECT(button), "selected",
+ GTK_SIGNAL_FUNC(folder_selected), e_select_names);
gtk_signal_connect (GTK_OBJECT (e_table_scrolled_get_table (e_select_names->table)), "double_click",
GTK_SIGNAL_FUNC (add_address), e_select_names);
gtk_signal_connect (GTK_OBJECT (e_table_scrolled_get_table (e_select_names->table)), "selection_change",
GTK_SIGNAL_FUNC (selection_change), e_select_names);
selection_change (e_table_scrolled_get_table (e_select_names->table), e_select_names);
+
+ filename = gnome_util_prepend_user_home("evolution/local/Contacts");
+ uri = g_strdup_printf("file://%s", filename);
+
+ addressbook_model_set_uri(e_select_names, e_select_names->model, uri);
+
+ g_free(uri);
+ g_free(filename);
}
static void e_select_names_child_free(char *key, ESelectNamesChild *child, ESelectNames *e_select_names)
diff --git a/addressbook/gui/component/select-names/select-names.glade b/addressbook/gui/component/select-names/select-names.glade
index 22f3778bc8..e46d745b67 100644
--- a/addressbook/gui/component/select-names/select-names.glade
+++ b/addressbook/gui/component/select-names/select-names.glade
@@ -137,7 +137,7 @@
<name>table5</name>
<border_width>3</border_width>
<rows>2</rows>
- <columns>3</columns>
+ <columns>2</columns>
<homogeneous>False</homogeneous>
<row_spacing>3</row_spacing>
<column_spacing>3</column_spacing>
@@ -152,7 +152,6 @@
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
- <default_focus_target>optionmenu-folder</default_focus_target>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
@@ -196,50 +195,6 @@
</widget>
<widget>
- <class>GtkOptionMenu</class>
- <name>optionmenu-folder</name>
- <can_focus>True</can_focus>
- <items></items>
- <initial_choice>0</initial_choice>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-browse</name>
- <can_focus>True</can_focus>
- <label>_Browse...</label>
- <relief>GTK_RELIEF_NORMAL</relief>
- <child>
- <left_attach>2</left_attach>
- <right_attach>3</right_attach>
- <top_attach>0</top_attach>
- <bottom_attach>1</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
- </widget>
-
- <widget>
<class>GtkAlignment</class>
<name>alignment5</name>
<xalign>7.45058e-09</xalign>
@@ -248,7 +203,7 @@
<yscale>1</yscale>
<child>
<left_attach>1</left_attach>
- <right_attach>3</right_attach>
+ <right_attach>2</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
@@ -270,6 +225,29 @@
<last_modification_time>Tue, 19 Feb 2002 23:06:24 GMT</last_modification_time>
</widget>
</widget>
+
+ <widget>
+ <class>Custom</class>
+ <name>folder-selector</name>
+ <creation_function>e_addressbook_create_folder_selector</creation_function>
+ <int1>0</int1>
+ <int2>0</int2>
+ <last_modification_time>Mon, 15 Jul 2002 02:21:32 GMT</last_modification_time>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ </widget>
</widget>
</widget>