aboutsummaryrefslogtreecommitdiff
path: root/src/addressbook.c
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2010-02-10 09:31:53 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2010-02-10 09:31:53 +0000
commit3f9703a3fd35f7d8b835c62869c0db74bd213e2f (patch)
treeacbaf735dc3a1d98d0322f6a5634ea51c7c1b707 /src/addressbook.c
parent6ab1d3cf538aa7f6c5385f7010e9a2d7e71b8dc0 (diff)
added a new filter match type: is (not) in addressbook.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@2461 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src/addressbook.c')
-rw-r--r--src/addressbook.c87
1 files changed, 83 insertions, 4 deletions
diff --git a/src/addressbook.c b/src/addressbook.c
index f7d9e9b5..2c95c580 100644
--- a/src/addressbook.c
+++ b/src/addressbook.c
@@ -333,6 +333,9 @@ static void addressbook_list_select_set (GList *row_list);
static void addressbook_import_ldif_cb (void);
static void addressbook_import_csv_cb (void);
+static void addressbook_modified (void);
+
+
static GtkItemFactoryEntry addressbook_entries[] =
{
{N_("/_File"), NULL, NULL, 0, "<Branch>"},
@@ -408,6 +411,7 @@ static GtkItemFactoryEntry addressbook_list_popup_entries[] =
{N_("/_Paste"), NULL, addressbook_paste_address_cb, 0, NULL}
};
+
void addressbook_open(Compose *target)
{
if (!addrbook.window) {
@@ -2181,7 +2185,7 @@ static void addressbook_edit_address_cb(gpointer data, guint action, GtkWidget *
if (addressbook_edit_person(abf, NULL, person, TRUE) == NULL)
return;
addressbook_reopen();
- invalidate_address_completion();
+ addressbook_modified();
return;
}
} else if (obj->type == ADDR_ITEM_PERSON) {
@@ -2191,7 +2195,7 @@ static void addressbook_edit_address_cb(gpointer data, guint action, GtkWidget *
if (addressbook_edit_person(abf, NULL, person, FALSE) == NULL)
return;
addressbook_reopen();
- invalidate_address_completion();
+ addressbook_modified();
return;
} else if (obj->type == ADDR_ITEM_GROUP) {
ItemGroup *itemGrp = (ItemGroup *)obj;
@@ -3237,7 +3241,7 @@ void addressbook_export_to_file( void ) {
}
/* Notify address completion of new data */
- invalidate_address_completion();
+ addressbook_modified();
}
}
@@ -4151,7 +4155,7 @@ static void addressbook_import_ldif_cb(void)
}
/* Notify address completion */
- invalidate_address_completion();
+ addressbook_modified();
}
/*
@@ -4191,9 +4195,84 @@ static void addressbook_import_csv_cb(void)
}
/* Notify address completion */
+ addressbook_modified();
+}
+
+/* **********************************************************************
+* Address Book Fast Search.
+* ***********************************************************************
+*/
+
+static GHashTable *addr_table;
+
+static gint load_address(const gchar *name, const gchar *address,
+ const gchar *nickname)
+{
+ gchar *addr;
+
+ if (!address)
+ return -1;
+
+ addr = g_ascii_strdown(address, -1);
+
+ if (g_hash_table_lookup(addr_table, addr) == NULL)
+ g_hash_table_insert(addr_table, addr, addr);
+ else
+ g_free(addr);
+
+ return 0;
+}
+
+static void addressbook_modified(void)
+{
+ if (addr_table) {
+ hash_free_strings(addr_table);
+ g_hash_table_destroy(addr_table);
+ addr_table = NULL;
+ }
+
invalidate_address_completion();
}
+gboolean addressbook_has_address(const gchar *address)
+{
+ GSList *list, *cur;
+ gchar *addr;
+ gboolean found = FALSE;
+
+ if (!address)
+ return FALSE;
+
+ debug_print("addressbook_has_address: check if addressbook has address: %s\n", address);
+
+ list = address_list_append(NULL, address);
+ if (!list)
+ return FALSE;
+
+ if (!addr_table) {
+ addr_table = g_hash_table_new(g_str_hash, g_str_equal);
+ addressbook_load_completion(load_address);
+ }
+
+ for (cur = list; cur != NULL; cur = cur->next) {
+ addr = g_ascii_strdown((gchar *)cur->data, -1);
+
+ if (g_hash_table_lookup(addr_table, addr)) {
+ found = TRUE;
+ debug_print("'%s' is in addressbook\n", addr);
+ } else {
+ found = FALSE;
+ g_free(addr);
+ break;
+ }
+ g_free(addr);
+ }
+
+ slist_free_strings(list);
+
+ return found;
+}
+
/*
* End of Source.
*/