diff options
author | JP Rosevear <jpr@ximian.com> | 2003-12-06 05:46:18 +0800 |
---|---|---|
committer | JP Rosevear <jpr@src.gnome.org> | 2003-12-06 05:46:18 +0800 |
commit | 4b5f82028ea07df810b81cf04bfe9e4792e1ecb2 (patch) | |
tree | bf0683a9d181cf802f4e11ad424b1b5c31ea7518 | |
parent | b57968e1216d9bdeddb8e6e3fbc8e61ce101cc17 (diff) | |
download | gsoc2013-evolution-4b5f82028ea07df810b81cf04bfe9e4792e1ecb2.tar.gz gsoc2013-evolution-4b5f82028ea07df810b81cf04bfe9e4792e1ecb2.tar.zst gsoc2013-evolution-4b5f82028ea07df810b81cf04bfe9e4792e1ecb2.zip |
no more custom widget for the selection of the search source
2003-12-05 JP Rosevear <jpr@ximian.com>
* gui/component/select-names/select-names.glade: no more custom
widget for the selection of the search source
* gui/component/select-names/e-select-names.h: add member
* gui/component/select-names/e-select-names.etspec: update model
column
* gui/component/select-names/e-select-names.c (find_first_source):
find the first source in the list
(addressbook_model_set_source): we have the source to set directly
now
(source_selected): listen for the source item to change
(e_select_names_init): create a source option menu and hook it up
(e_select_names_dispose): destroy the source list
(e_select_names_new): do away with the config setup here
* gui/component/select-names/e-select-names-manager.h: update
members
* gui/component/select-names/e-select-names-manager.c
(update_completion_books): add books based on source uid
(config_completion_books_changed_cb): handle the completion list
changing
(config_min_query_length_changed_cb): handle minimum query length
changing
(e_select_names_manager_new): we don't do the settings stuff here
any more
(e_select_names_manager_init): do the initial set up here for the
book loaded and listen for changes
(e_select_names_manager_dispose): destroy the new stuff
* gui/component/select-names/e-select-names-config.[hc]: config
information
* gui/component/select-names/e-select-names-config-keys.h: the
config keys
* gui/component/select-names/e-select-names-bonobo.c
(impl_SelectNames_activate_dialog): do away with the shell client
stuff
* gui/component/select-names/Makefile.am: build new files
svn path=/trunk/; revision=23654
12 files changed, 439 insertions, 209 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index 392d90a69a..2623783e93 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,3 +1,49 @@ +2003-12-05 JP Rosevear <jpr@ximian.com> + + * gui/component/select-names/select-names.glade: no more custom + widget for the selection of the search source + + * gui/component/select-names/e-select-names.h: add member + + * gui/component/select-names/e-select-names.etspec: update model + column + + * gui/component/select-names/e-select-names.c (find_first_source): + find the first source in the list + (addressbook_model_set_source): we have the source to set directly + now + (source_selected): listen for the source item to change + (e_select_names_init): create a source option menu and hook it up + (e_select_names_dispose): destroy the source list + (e_select_names_new): do away with the config setup here + + * gui/component/select-names/e-select-names-manager.h: update + members + + * gui/component/select-names/e-select-names-manager.c + (update_completion_books): add books based on source uid + (config_completion_books_changed_cb): handle the completion list + changing + (config_min_query_length_changed_cb): handle minimum query length + changing + (e_select_names_manager_new): we don't do the settings stuff here + any more + (e_select_names_manager_init): do the initial set up here for the + book loaded and listen for changes + (e_select_names_manager_dispose): destroy the new stuff + + * gui/component/select-names/e-select-names-config.[hc]: config + information + + * gui/component/select-names/e-select-names-config-keys.h: the + config keys + + * gui/component/select-names/e-select-names-bonobo.c + (impl_SelectNames_activate_dialog): do away with the shell client + stuff + + * gui/component/select-names/Makefile.am: build new files + 2003-12-05 Chris Toshok <toshok@ximian.com> * gui/widgets/e-addressbook-model.c (book_view_loaded): call diff --git a/addressbook/gui/component/select-names/Makefile.am b/addressbook/gui/component/select-names/Makefile.am index b2a5e9e1aa..5b8a822149 100644 --- a/addressbook/gui/component/select-names/Makefile.am +++ b/addressbook/gui/component/select-names/Makefile.am @@ -54,6 +54,9 @@ libeselectnames_la_SOURCES = \ e-select-names-bonobo.h \ e-select-names-completion.c \ e-select-names-completion.h \ + e-select-names-config.c \ + e-select-names-config.h \ + e-select-names-config-keys.h \ e-select-names-manager.c \ e-select-names-manager.h \ e-select-names-model.c \ diff --git a/addressbook/gui/component/select-names/e-select-names-bonobo.c b/addressbook/gui/component/select-names/e-select-names-bonobo.c index c4fe9d257d..1977abe95f 100644 --- a/addressbook/gui/component/select-names/e-select-names-bonobo.c +++ b/addressbook/gui/component/select-names/e-select-names-bonobo.c @@ -489,27 +489,13 @@ impl_SelectNames_activate_dialog (PortableServer_Servant servant, const CORBA_char *section_id, CORBA_Environment *ev) { -#if 0 /* FIXME */ ESelectNamesBonobo *select_names; ESelectNamesBonoboPrivate *priv; - EvolutionShellClient *shell_client; - GNOME_Evolution_Shell shell; select_names = E_SELECT_NAMES_BONOBO (bonobo_object (servant)); priv = select_names->priv; - shell = bonobo_activation_activate_from_id ( - "OAFIID:GNOME_Evolution_Shell:" BASE_VERSION, - Bonobo_ACTIVATION_FLAG_EXISTING_ONLY, - NULL, ev); - if (BONOBO_EX (ev)) - return; - - shell_client = evolution_shell_client_new (shell); - e_select_names_manager_activate_dialog (priv->manager, shell_client, - section_id); - g_object_unref (shell_client); -#endif + e_select_names_manager_activate_dialog (priv->manager, section_id); } diff --git a/addressbook/gui/component/select-names/e-select-names-config-keys.h b/addressbook/gui/component/select-names/e-select-names-config-keys.h new file mode 100644 index 0000000000..e0f08c3019 --- /dev/null +++ b/addressbook/gui/component/select-names/e-select-names-config-keys.h @@ -0,0 +1,39 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Authors : + * JP Rosevear <jpr@ximian.com> + * + * Copyright 2003, Ximian, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +#ifndef _E_SELECT_NAMES_CONFIG_KEYS_H_ +#define _E_SELECT_NAMES_CONFIG_KEYS_H_ + +#include <glib.h> + +G_BEGIN_DECLS + +#define SELECT_NAMES_CONFIG_PREFIX "/apps/evolution/addressbook/completion" + +/* Display settings */ +#define SELECT_NAMES_CONFIG_COMPLETION_BOOKS SELECT_NAMES_CONFIG_PREFIX "/books" +#define SELECT_NAMES_CONFIG_LAST_COMPLETION_BOOK SELECT_NAMES_CONFIG_PREFIX "/last_book" +#define SELECT_NAMES_CONFIG_MIN_QUERY_LENGTH SELECT_NAMES_CONFIG_PREFIX "/minimum_query_length" + +G_END_DECLS + +#endif diff --git a/addressbook/gui/component/select-names/e-select-names-config.c b/addressbook/gui/component/select-names/e-select-names-config.c new file mode 100644 index 0000000000..1792a8a061 --- /dev/null +++ b/addressbook/gui/component/select-names/e-select-names-config.c @@ -0,0 +1,146 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* + * Authors : + * Damon Chaplin <damon@ximian.com> + * Rodrigo Moya <rodrigo@ximian.com> + * + * Copyright 2000, Ximian, Inc. + * Copyright 2000, Ximian, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string.h> + +#include "e-select-names-config-keys.h" +#include "e-select-names-config.h" + +static GConfClient *config = NULL; + +static void +do_cleanup (void) +{ + g_object_unref (config); + config = NULL; +} + +static void +e_select_names_config_init (void) +{ + if (config) + return; + + config = gconf_client_get_default (); + g_atexit ((GVoidFunc) do_cleanup); + + gconf_client_add_dir (config, SELECT_NAMES_CONFIG_PREFIX, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); +} + +void +e_select_names_config_remove_notification (guint id) +{ + gconf_client_notify_remove (config, id); +} + +/* The current list of completion books */ +GSList * +e_select_names_config_get_completion_books (void) +{ + e_select_names_config_init (); + + return gconf_client_get_list (config, SELECT_NAMES_CONFIG_COMPLETION_BOOKS, GCONF_VALUE_STRING, NULL); +} + +void +e_select_names_config_set_completion_books (GSList *selected) +{ + e_select_names_config_init (); + + gconf_client_set_list (config, SELECT_NAMES_CONFIG_COMPLETION_BOOKS, GCONF_VALUE_STRING, selected, NULL); +} + +guint +e_select_names_config_add_notification_completion_books (GConfClientNotifyFunc func, gpointer data) +{ + guint id; + + e_select_names_config_init (); + + id = gconf_client_notify_add (config, SELECT_NAMES_CONFIG_COMPLETION_BOOKS, func, data, NULL, NULL); + + return id; +} + +char * +e_select_names_config_get_last_completion_book (void) +{ + e_select_names_config_init (); + + return gconf_client_get_string (config, SELECT_NAMES_CONFIG_LAST_COMPLETION_BOOK, NULL); +} + +void +e_select_names_config_set_last_completion_book (const char *last_completion_book) +{ + e_select_names_config_init (); + + gconf_client_set_string (config, SELECT_NAMES_CONFIG_LAST_COMPLETION_BOOK, last_completion_book, NULL); +} + +guint +e_select_names_config_add_notification_last_completion_book (GConfClientNotifyFunc func, gpointer data) +{ + guint id; + + e_select_names_config_init (); + + id = gconf_client_notify_add (config, SELECT_NAMES_CONFIG_LAST_COMPLETION_BOOK, func, data, NULL, NULL); + + return id; +} + +gint +e_select_names_config_get_min_query_length (void) +{ + e_select_names_config_init (); + + return gconf_client_get_int (config, SELECT_NAMES_CONFIG_MIN_QUERY_LENGTH, NULL); +} + + +void +e_select_names_config_set_min_query_length (gint day_end_hour) +{ + e_select_names_config_init (); + + gconf_client_set_int (config, SELECT_NAMES_CONFIG_MIN_QUERY_LENGTH, day_end_hour, NULL); +} + +guint +e_select_names_config_add_notification_min_query_length (GConfClientNotifyFunc func, gpointer data) +{ + guint id; + + e_select_names_config_init (); + + id = gconf_client_notify_add (config, SELECT_NAMES_CONFIG_MIN_QUERY_LENGTH, func, data, NULL, NULL); + + return id; +} diff --git a/addressbook/gui/component/select-names/e-select-names-config.h b/addressbook/gui/component/select-names/e-select-names-config.h new file mode 100644 index 0000000000..9247e43337 --- /dev/null +++ b/addressbook/gui/component/select-names/e-select-names-config.h @@ -0,0 +1,48 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Authors : + * Damon Chaplin <damon@ximian.com> + * Rodrigo Moya <rodrigo@ximian.com> + * + * Copyright 2000, Ximian, Inc. + * Copyright 2000, Ximian, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +#ifndef _E_SELECT_NAMES_CONFIG_H_ +#define _E_SELECT_NAMES_CONFIG_H_ + +#include <gconf/gconf-client.h> + +void e_select_names_config_remove_notification (guint id); + +/* The current list of completion uris */ +GSList *e_select_names_config_get_completion_books (void); +void e_select_names_config_set_completion_books (GSList *selected); +guint e_select_names_config_add_notification_completion_books (GConfClientNotifyFunc func, gpointer data); + +/* The last completion book */ +char *e_select_names_config_get_last_completion_book (void); +void e_select_names_config_set_last_completion_book (const char *last_completion_book); +guint e_select_names_config_add_notification_last_completion_book (GConfClientNotifyFunc func, gpointer data); + + +/* The minimum query length */ +gint e_select_names_config_get_min_query_length (void); +void e_select_names_config_set_min_query_length (gint day_end_hour); +guint e_select_names_config_add_notification_min_query_length (GConfClientNotifyFunc func, gpointer data); + +#endif /* _E_SELECT_NAMES_CONFIG_H_ */ diff --git a/addressbook/gui/component/select-names/e-select-names-manager.c b/addressbook/gui/component/select-names/e-select-names-manager.c index b7b91b42d0..41b355eea8 100644 --- a/addressbook/gui/component/select-names/e-select-names-manager.c +++ b/addressbook/gui/component/select-names/e-select-names-manager.c @@ -16,6 +16,7 @@ #include <gal/e-text/e-entry.h> #include <libgnome/gnome-i18n.h> +#include "e-select-names-config.h" #include "e-select-names-manager.h" #include "e-select-names-marshal.h" #include "e-select-names-model.h" @@ -372,7 +373,6 @@ e_select_names_manager_discard_saved_models (ESelectNamesManager *manager) /* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ - static void open_book_cb (EBook *book, EBookStatus status, ESelectNamesManager *manager) { @@ -391,93 +391,67 @@ open_book_cb (EBook *book, EBookStatus status, ESelectNamesManager *manager) } static void -load_completion_books (ESelectNamesManager *manager) +update_completion_books (ESelectNamesManager *manager) { -#if 0 - EFolderListItem *folders = e_folder_list_parse_xml (manager->cached_folder_list); - EFolderListItem *f; - - for (f = folders; f && f->physical_uri; f++) { - EBook *book = e_book_new (); - ESourceGroup *group; - ESource *source; + GSList *completion_uids, *l; - g_object_ref (manager); /* ref ourself before our async call */ + /* Get the selection in gconf */ + completion_uids = e_select_names_config_get_completion_books (); - /* FIXME: Store source UIDs in folder list and use those to get sources */ - group = e_source_group_new ("", f->physical_uri); - source = e_source_new ("", ""); - e_source_set_group (source, group); + /* Add all the completion books */ + for (l = completion_uids; l; l = l->next) { + char *uid = l->data; + ESource *source; + + source = e_source_list_peek_source_by_uid (manager->source_list, uid); + if (source) { + EBook *book; - addressbook_load_source (book, source, (EBookCallback)open_book_cb, manager); + book = e_book_new (); - g_object_unref (group); - g_object_unref (source); + addressbook_load_source (book, source, (EBookCallback)open_book_cb, manager); + } + + g_free (uid); } - e_folder_list_free_items (folders); -#endif + g_slist_free (completion_uids); } static void -read_completion_settings_from_db (ESelectNamesManager *manager, EConfigListener *db) +config_completion_books_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data) { - char *val; - long ival; - - val = e_config_listener_get_string (db, "/apps/evolution/addressbook/completion/uris"); - - if (val) { - g_free (manager->cached_folder_list); - manager->cached_folder_list = val; - load_completion_books(manager); + ESelectNamesManager *manager = data; + GList *l; + + for (l = manager->entries; l; l = l->next) { + ESelectNamesManagerEntry *entry = l->data; + e_select_names_completion_clear_books (E_SELECT_NAMES_COMPLETION (entry->comp)); } - ival = e_config_listener_get_long (db, "/apps/evolution/addressbook/completion/minimum_query_length"); - if (ival <= 0) ival = DEFAULT_MINIMUM_QUERY_LENGTH; + g_slist_foreach (manager->completion_uids, (GFunc)g_free, NULL); + g_slist_free (manager->completion_uids); - manager->minimum_query_length = ival; + g_list_foreach (manager->completion_books, (GFunc)g_object_unref, NULL); + g_list_free (manager->completion_books); + manager->completion_books = NULL; + + update_completion_books (manager); } static void -db_listener (EConfigListener *db, const char *key, - ESelectNamesManager *manager) +config_min_query_length_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data) { + ESelectNamesManager *manager = data; GList *l; - - if (!strcmp (key, "/apps/evolution/addressbook/completion/uris")) { - char *val = e_config_listener_get_string (db, key); - - if (!val) - return; - - if (!manager->cached_folder_list || strcmp (val, manager->cached_folder_list)) { - for (l = manager->entries; l; l = l->next) { - ESelectNamesManagerEntry *entry = l->data; - e_select_names_completion_clear_books (E_SELECT_NAMES_COMPLETION (entry->comp)); - } - - g_list_foreach (manager->completion_books, (GFunc)g_object_unref, NULL); - g_list_free (manager->completion_books); - manager->completion_books = NULL; - - g_free (manager->cached_folder_list); - manager->cached_folder_list = val; - load_completion_books (manager); - } - } - else if (!strcmp (key, "/apps/evolution/addressbook/completion/minimum_query_length")) { - long ival = e_config_listener_get_long (db, key); - - if (ival <= 0) - ival = DEFAULT_MINIMUM_QUERY_LENGTH; - - manager->minimum_query_length = ival; - - for (l = manager->entries; l; l = l->next) { - ESelectNamesManagerEntry *entry = l->data; - e_select_names_completion_set_minimum_query_length (E_SELECT_NAMES_COMPLETION(entry->comp), - manager->minimum_query_length); - } + + manager->minimum_query_length = e_select_names_config_get_min_query_length (); + if (manager->minimum_query_length <= 0) + manager->minimum_query_length = DEFAULT_MINIMUM_QUERY_LENGTH; + + for (l = manager->entries; l; l = l->next) { + ESelectNamesManagerEntry *entry = l->data; + e_select_names_completion_set_minimum_query_length (E_SELECT_NAMES_COMPLETION(entry->comp), + manager->minimum_query_length); } } @@ -490,15 +464,6 @@ ESelectNamesManager * e_select_names_manager_new (void) { ESelectNamesManager *manager = g_object_new (E_TYPE_SELECT_NAMES_MANAGER, NULL); - EConfigListener *db; - - db = eab_get_config_database(); - - manager->listener_id = g_signal_connect (db, - "key_changed", - G_CALLBACK (db_listener), manager); - - read_completion_settings_from_db (manager, db); return manager; } @@ -654,10 +619,25 @@ e_select_names_manager_activate_dialog (ESelectNamesManager *manager, static void e_select_names_manager_init (ESelectNamesManager *manager) { + guint not; + manager->sections = NULL; manager->entries = NULL; + + manager->source_list = e_source_list_new_for_gconf_default ("/apps/evolution/addressbook/sources"); + + manager->completion_uids = e_select_names_config_get_completion_books (); manager->completion_books = NULL; - manager->cached_folder_list = NULL; + + manager->minimum_query_length = e_select_names_config_get_min_query_length (); + + update_completion_books (manager); + + not = e_select_names_config_add_notification_completion_books (config_completion_books_changed_cb, manager); + manager->notifications = g_list_append (manager->notifications, GUINT_TO_POINTER (not)); + + not = e_select_names_config_add_notification_min_query_length (config_min_query_length_changed_cb, manager); + manager->notifications = g_list_append (manager->notifications, GUINT_TO_POINTER (not)); } static void @@ -684,22 +664,35 @@ e_select_names_manager_dispose (GObject *object) manager->entries = NULL; } + if (manager->source_list) { + g_object_unref (manager->source_list); + manager->source_list = NULL; + } + + if (manager->completion_uids) { + GSList *l; + + for (l = manager->completion_uids; l; l = l->next) + g_free (l->data); + g_slist_free (manager->completion_uids); + manager->completion_uids = NULL; + } + if (manager->completion_books) { g_list_foreach (manager->completion_books, (GFunc) g_object_unref, NULL); g_list_free (manager->completion_books); manager->completion_books = NULL; } - if (manager->listener_id) { - g_signal_handler_disconnect (eab_get_config_database(), manager->listener_id); - manager->listener_id = 0; - } - - if (manager->cached_folder_list) { - g_free (manager->cached_folder_list); - manager->cached_folder_list = NULL; + if (manager->notifications) { + GList *l; + + for (l = manager->notifications; l; l = l->next) + e_select_names_config_remove_notification (GPOINTER_TO_UINT (l->data)); + g_list_free (manager->notifications); + manager->notifications = NULL; } - + if (G_OBJECT_CLASS (parent_class)->dispose) G_OBJECT_CLASS (parent_class)->dispose (object); } diff --git a/addressbook/gui/component/select-names/e-select-names-manager.h b/addressbook/gui/component/select-names/e-select-names-manager.h index f5fb4aa451..18bead5512 100644 --- a/addressbook/gui/component/select-names/e-select-names-manager.h +++ b/addressbook/gui/component/select-names/e-select-names-manager.h @@ -32,13 +32,13 @@ struct _ESelectNamesManager { ESelectNames *names; + ESourceList *source_list; + GSList *completion_uids; GList *completion_books; - + int minimum_query_length; - gulong listener_id; - - char *cached_folder_list; + GList *notifications; }; struct _ESelectNamesManagerClass { diff --git a/addressbook/gui/component/select-names/e-select-names.c b/addressbook/gui/component/select-names/e-select-names.c index 488ed10f0a..3925857447 100644 --- a/addressbook/gui/component/select-names/e-select-names.c +++ b/addressbook/gui/component/select-names/e-select-names.c @@ -36,6 +36,7 @@ #include <addressbook/gui/component/addressbook-component.h> #include <addressbook/gui/component/addressbook.h> +#include "e-select-names-config.h" #include "e-select-names.h" #include "e-select-names-table-model.h" #include <gal/widgets/e-categories-master-list-option-menu.h> @@ -106,7 +107,6 @@ e_select_names_class_init (ESelectNamesClass *klass) } 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 search_result (EABModel *model, EBookViewStatus status, ESelectNames *esn) @@ -126,36 +126,37 @@ set_book(EBook *book, EBookStatus status, ESelectNames *esn) g_object_unref(esn); } +static ESource * +find_first_source (ESourceList *source_list) +{ + GSList *groups, *sources, *l, *m; + + groups = e_source_list_peek_groups (source_list); + for (l = groups; l; l = l->next) { + ESourceGroup *group = l->data; + + sources = e_source_group_peek_sources (group); + for (m = sources; m; m = m->next) { + ESource *source = m->data; + + return source; + } + } + + return NULL; +} + static void -addressbook_model_set_uri(ESelectNames *e_select_names, EABModel *model, const char *uri) +addressbook_model_set_source (ESelectNames *e_select_names, EABModel *model, ESource *source) { EBook *book; - ESourceGroup *group; - ESource *source; - - /* If uri == the current uri, then we don't have to do anything */ - book = eab_model_get_ebook (model); - if (book) { - const gchar *current_uri = e_book_get_uri (book); - if (current_uri && !strcmp (uri, current_uri)) { - return; - } - } book = e_book_new(); g_object_ref(e_select_names); g_object_ref(model); - /* FIXME: Store source UIDs in last_used etc. and use that to get sources */ - group = e_source_group_new ("", uri); - source = e_source_new ("", ""); - e_source_set_group (source, group); - addressbook_load_source (book, source, (EBookCallback) set_book, e_select_names); - - g_object_unref (group); - g_object_unref (source); } static void * @@ -331,23 +332,12 @@ e_addressbook_create_ebook_table(char *name, char *string1, char *string2, int n return table; } -GtkWidget * -e_addressbook_create_folder_selector(char *name, char *string1, char *string2, int num1, int num2) -{ - return gtk_label_new ("FIXME"); -} - -#if 0 /* FIXME */ static void -folder_selected (EvolutionFolderSelectorButton *button, GNOME_Evolution_Folder *folder, - ESelectNames *e_select_names) +source_selected (ESourceOptionMenu *menu, ESource *source, ESelectNames *e_select_names) { - addressbook_model_set_uri(e_select_names, e_select_names->model, folder->physicalUri); - - e_config_listener_set_string (eab_get_config_database(), - "/apps/evolution/addressbook/select_names/last_used_uri", folder->physicalUri); + addressbook_model_set_source (e_select_names, e_select_names->model, source); + e_select_names_config_set_last_completion_book (e_source_peek_uid (source)); } -#endif static void update_query (GtkWidget *widget, ESelectNames *e_select_names) @@ -479,11 +469,25 @@ static void e_select_names_init (ESelectNames *e_select_names) { GladeXML *gui; - GtkWidget *widget, *button; - + GtkWidget *widget, *button, *table, *esom; + ESource *source = NULL; + char *uid; + + /* FIXME What to do on error/NULL ? */ + e_select_names->source_list = e_source_list_new_for_gconf_default ("/apps/evolution/addressbook/sources"); + gui = glade_xml_new (EVOLUTION_GLADEDIR "/select-names.glade", NULL, NULL); e_select_names->gui = gui; + /* Add the source menu */ + esom = e_source_option_menu_new (e_select_names->source_list); + g_signal_connect (esom, "source_selected", G_CALLBACK (source_selected), e_select_names); + gtk_widget_show (esom); + + table = glade_xml_get_widget (gui, "show_contacts_table"); + gtk_table_attach (GTK_TABLE (table), esom, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); + + /* Set up the rest of the widgets */ e_select_names->children = g_hash_table_new(g_str_hash, g_str_equal); e_select_names->child_count = 0; e_select_names->def = NULL; @@ -559,19 +563,25 @@ e_select_names_init (ESelectNames *e_select_names) g_signal_connect(button, "clicked", G_CALLBACK(update_query), e_select_names); - button = glade_xml_get_widget (gui, "folder-selector"); -#if 0 /* FIXME */ - if (button && EVOLUTION_IS_FOLDER_SELECTOR_BUTTON (button)) - g_signal_connect(button, "selected", - G_CALLBACK(folder_selected), e_select_names); -#endif - gtk_widget_show (button); - g_signal_connect (e_table_scrolled_get_table (e_select_names->table), "double_click", G_CALLBACK (add_address), e_select_names); g_signal_connect (e_table_scrolled_get_table (e_select_names->table), "selection_change", G_CALLBACK (selection_change), e_select_names); selection_change (e_table_scrolled_get_table (e_select_names->table), e_select_names); + + /* Select a source for to display initially */ + uid = e_select_names_config_get_last_completion_book (); + if (uid) { + source = e_source_list_peek_source_by_uid (e_select_names->source_list, uid); + g_free (uid); + } + + if (!source) + source = find_first_source (e_select_names->source_list); + + /* FIXME What if we still can't find a source? */ + e_source_option_menu_select (E_SOURCE_OPTION_MENU (esom), source); + } static void e_select_names_child_free(char *key, ESelectNamesChild *child, ESelectNames *e_select_names) @@ -590,6 +600,11 @@ e_select_names_dispose (GObject *object) { ESelectNames *e_select_names = E_SELECT_NAMES(object); + if (e_select_names->source_list) { + g_object_unref (e_select_names->source_list); + e_select_names->source_list = NULL; + } + if (e_select_names->status_id) { g_signal_handler_disconnect(e_select_names->model, e_select_names->status_id); e_select_names->status_id = 0; @@ -637,36 +652,9 @@ GtkWidget* e_select_names_new (void) { ESelectNames *e_select_names; - const char *selector_types[] = { "contacts/*", NULL }; - char *contacts_uri; - GtkWidget *button; - EConfigListener *db; - + e_select_names = g_object_new (E_TYPE_SELECT_NAMES, NULL); - db = eab_get_config_database (); - contacts_uri = e_config_listener_get_string_with_default ( - db, "/apps/evolution/addressbook/select_names/last_used_uri", - NULL, NULL); -#if notyet - if (!contacts_uri) - contacts_uri = g_strdup (e_book_get_default_book_uri ()); -#endif - - button = glade_xml_get_widget (e_select_names->gui, "folder-selector"); - -#if 0 /* FIXME */ - evolution_folder_selector_button_construct (EVOLUTION_FOLDER_SELECTOR_BUTTON (button), - shell_client, - _("Find contact in"), - contacts_uri, - selector_types); -#endif - - addressbook_model_set_uri(e_select_names, e_select_names->model, contacts_uri); - - g_free (contacts_uri); - return GTK_WIDGET (e_select_names); } diff --git a/addressbook/gui/component/select-names/e-select-names.etspec b/addressbook/gui/component/select-names/e-select-names.etspec index 114f84cc8c..7a260887ff 100644 --- a/addressbook/gui/component/select-names/e-select-names.etspec +++ b/addressbook/gui/component/select-names/e-select-names.etspec @@ -1,5 +1,5 @@ <ETableSpecification no-headers="true" cursor-mode="line"> - <ETableColumn model_col= "44" _title="Name" expansion="1.0" minimum_width="20" resizable="true" cell="string" compare="collate" search="string"/> + <ETableColumn model_col= "69" _title="Name" expansion="1.0" minimum_width="20" resizable="true" cell="string" compare="collate" search="string"/> <ETableState> <column source="0"/> <grouping> <leaf column="0" ascending="true"/> </grouping> diff --git a/addressbook/gui/component/select-names/e-select-names.h b/addressbook/gui/component/select-names/e-select-names.h index 3624e40073..e927932d13 100644 --- a/addressbook/gui/component/select-names/e-select-names.h +++ b/addressbook/gui/component/select-names/e-select-names.h @@ -26,15 +26,14 @@ #include <glade/glade.h> #include <gal/e-table/e-table.h> #include <gal/e-table/e-table-scrolled.h> +#include <libedataserver/e-source-list.h> +#include <widgets/misc/e-source-option-menu.h> #include "e-addressbook-model.h" #include "e-select-names-model.h" -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ +G_BEGIN_DECLS /* ESelectNames - A dialog displaying information about a contact. * @@ -58,6 +57,8 @@ struct _ESelectNames { GtkDialog parent; + ESourceList *source_list; + /* item specific fields */ GladeXML *gui; @@ -95,9 +96,6 @@ void e_select_names_add_section (ESelectNames *e_select_names, void e_select_names_set_default (ESelectNames *e_select_names, const char *id); -#ifdef __cplusplus -} -#endif /* __cplusplus */ - +G_END_DECLS #endif /* __E_SELECT_NAMES_H__ */ diff --git a/addressbook/gui/component/select-names/select-names.glade b/addressbook/gui/component/select-names/select-names.glade index 7ff1b4ebc7..bf63b9dfa4 100644 --- a/addressbook/gui/component/select-names/select-names.glade +++ b/addressbook/gui/component/select-names/select-names.glade @@ -2,6 +2,7 @@ <!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> <glade-interface> +<requires lib="gnome"/> <widget class="GtkDialog" id="dialog-top"> <property name="border_width">12</property> @@ -307,7 +308,7 @@ select one from the list below:</property> <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property> <child> - <widget class="GtkTable" id="table5"> + <widget class="GtkTable" id="show_contacts_table"> <property name="border_width">6</property> <property name="visible">True</property> <property name="n_rows">2</property> @@ -390,24 +391,6 @@ select one from the list below:</property> <property name="y_options">fill</property> </packing> </child> - - <child> - <widget class="Custom" id="folder-selector"> - <property name="visible">True</property> - <property name="creation_function">e_addressbook_create_folder_selector</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Mon, 15 Jul 2002 02:21:32 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> </widget> </child> |