diff options
Diffstat (limited to 'addressbook/gui/merging/eab-contact-merging.c')
-rw-r--r-- | addressbook/gui/merging/eab-contact-merging.c | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/addressbook/gui/merging/eab-contact-merging.c b/addressbook/gui/merging/eab-contact-merging.c new file mode 100644 index 0000000000..38a3c188b2 --- /dev/null +++ b/addressbook/gui/merging/eab-contact-merging.c @@ -0,0 +1,197 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Code for checking for duplicates when doing EContact work. + * + * Authors: + * Christopher James Lahey <clahey@ximian.com> + * Chris Toshok <toshok@ximian.com> + * + * Copyright (C) 2001, 2002, 2003, Ximian, Inc. + */ + +#include <config.h> + +#include "eab-contact-merging.h" +#include "eab-contact-compare.h" +#include <glade/glade.h> +#include <gtk/gtksignal.h> +#include "addressbook/gui/widgets/eab-contact-display.h" + +typedef enum { + E_CONTACT_MERGING_ADD, + E_CONTACT_MERGING_COMMIT +} EContactMergingOpType; + +typedef struct { + EContactMergingOpType op; + EBook *book; + EContact *contact; + EBookIdCallback id_cb; + EBookCallback cb; + gpointer closure; +} EContactMergingLookup; + +static void +free_lookup (EContactMergingLookup *lookup) +{ + g_object_unref (lookup->book); + g_object_unref (lookup->contact); + + g_free (lookup); +} + +static void +final_id_cb (EBook *book, EBookStatus status, const char *id, gpointer closure) +{ + EContactMergingLookup *lookup = closure; + + if (lookup->id_cb) + lookup->id_cb (lookup->book, status, id, lookup->closure); + + free_lookup (lookup); +} + +static void +final_cb (EBook *book, EBookStatus status, gpointer closure) +{ + EContactMergingLookup *lookup = closure; + + if (lookup->cb) + lookup->cb (lookup->book, status, lookup->closure); + + free_lookup (lookup); +} + +static void +doit (EContactMergingLookup *lookup) +{ + if (lookup->op == E_CONTACT_MERGING_ADD) + e_book_async_add_contact (lookup->book, lookup->contact, final_id_cb, lookup); + else if (lookup->op == E_CONTACT_MERGING_COMMIT) + e_book_async_commit_contact (lookup->book, lookup->contact, final_cb, lookup); +} + +static void +cancelit (EContactMergingLookup *lookup) +{ + if (lookup->op == E_CONTACT_MERGING_ADD) { + if (lookup->id_cb) + final_id_cb (lookup->book, E_BOOK_ERROR_CANCELLED, NULL, lookup); + } else if (lookup->op == E_CONTACT_MERGING_COMMIT) { + if (lookup->cb) + final_cb (lookup->book, E_BOOK_ERROR_CANCELLED, lookup); + } +} + +static void +response (GtkWidget *dialog, int response, EContactMergingLookup *lookup) +{ + gtk_widget_destroy (dialog); + + switch (response) { + case 0: + doit (lookup); + break; + case 1: + cancelit (lookup); + break; + } +} + +static void +match_query_callback (EContact *contact, EContact *match, EABContactMatchType type, gpointer closure) +{ + EContactMergingLookup *lookup = closure; + + if ((gint) type <= (gint) EAB_CONTACT_MATCH_VAGUE) { + doit (lookup); + } else { + GladeXML *ui; + + GtkWidget *widget; + + if (lookup->op == E_CONTACT_MERGING_ADD) + ui = glade_xml_new (EVOLUTION_GLADEDIR "/eab-contact-duplicate-detected.glade", NULL, NULL); + else if (lookup->op == E_CONTACT_MERGING_COMMIT) + ui = glade_xml_new (EVOLUTION_GLADEDIR "/eab-contact-merging-commit-duplicate-detected.glade", NULL, NULL); + else { + doit (lookup); + return; + } + + widget = glade_xml_get_widget (ui, "custom-old-contact"); + eab_contact_display_render (EAB_CONTACT_DISPLAY (widget), + match, EAB_CONTACT_DISPLAY_RENDER_COMPACT); + + widget = glade_xml_get_widget (ui, "custom-new-contact"); + eab_contact_display_render (EAB_CONTACT_DISPLAY (widget), + contact, EAB_CONTACT_DISPLAY_RENDER_COMPACT); + + widget = glade_xml_get_widget (ui, "dialog-duplicate-contact"); + + g_signal_connect (widget, "response", + G_CALLBACK (response), lookup); + + gtk_widget_show_all (widget); + } +} + +gboolean +eab_merging_book_add_contact (EBook *book, + EContact *contact, + EBookIdCallback cb, + gpointer closure) +{ + EContactMergingLookup *lookup; + + lookup = g_new (EContactMergingLookup, 1); + + lookup->op = E_CONTACT_MERGING_ADD; + lookup->book = g_object_ref (book); + lookup->contact = g_object_ref (contact); + lookup->id_cb = cb; + lookup->closure = closure; + + eab_contact_locate_match_full (book, contact, NULL, match_query_callback, lookup); + + return TRUE; +} + +gboolean +eab_merging_book_commit_contact (EBook *book, + EContact *contact, + EBookCallback cb, + gpointer closure) +{ + EContactMergingLookup *lookup; + GList *avoid; + + lookup = g_new (EContactMergingLookup, 1); + + lookup->op = E_CONTACT_MERGING_COMMIT; + lookup->book = g_object_ref (book); + lookup->contact = g_object_ref (contact); + lookup->cb = cb; + lookup->closure = closure; + + avoid = g_list_append (NULL, contact); + + eab_contact_locate_match_full (book, contact, avoid, match_query_callback, lookup); + + g_list_free (avoid); + + return TRUE; +} + +GtkWidget * +_eab_contact_merging_create_contact_display(gchar *name, + gchar *string1, gchar *string2, + gint int1, gint int2); + +GtkWidget * +_eab_contact_merging_create_contact_display(gchar *name, + gchar *string1, gchar *string2, + gint int1, gint int2) +{ + return eab_contact_display_new(); +} |