'Remove contact' option in contactsview

Tuleap: #298
Change-Id: I69c933829416a6dc77096ea504cef95a54af9aa4
diff --git a/src/backends/edscontactbackend.cpp b/src/backends/edscontactbackend.cpp
index c099aed..39a2d96 100644
--- a/src/backends/edscontactbackend.cpp
+++ b/src/backends/edscontactbackend.cpp
@@ -114,8 +114,11 @@
 
 bool EdsContactEditor::remove(const Person* item)
 {
-    mediator()->removeItem(item);
-    return true;
+    bool ret = collection_->removePerson(item);
+    if (ret) {
+        mediator()->removeItem(item);
+    }
+    return ret;
 }
 
 bool EdsContactEditor::edit( Person* item)
@@ -380,7 +383,7 @@
             if (p) {
                 g_debug("removing: %s", p->formattedName().toUtf8().constData());
                 deactivate(p);
-                editor<Person>()->remove(p);
+                mediator_->removeItem(p);
             } else {
                 g_warning("person with given UID doesn't exist: %s", uid);
             }
@@ -429,6 +432,7 @@
     return (CollectionInterface::SupportedFeatures::NONE |
             CollectionInterface::SupportedFeatures::LOAD |
             CollectionInterface::SupportedFeatures::ADD  |
+            CollectionInterface::SupportedFeatures::REMOVE  |
             CollectionInterface::SupportedFeatures::SAVE );
 }
 
@@ -479,6 +483,34 @@
     return ret;
 }
 
+bool EdsContactBackend::removePerson(const Person *item)
+{
+    g_return_val_if_fail(client_.get(), false);
+
+    g_debug("removing person");
+
+    GError *error = NULL;
+
+    bool ret = e_book_client_remove_contact_by_uid_sync(
+        E_BOOK_CLIENT(client_.get()),
+        item->uid(),
+        cancellable_.get(),
+        &error
+    );
+
+    if(!ret) {
+        if(error) {
+            g_warning("could not delete contact: %s", error->message);
+            g_clear_error(&error);
+        }
+        else {
+            g_warning("could not delete contact");
+        }
+    }
+
+    return ret;
+}
+
 bool EdsContactBackend::savePerson(const Person *item)
 {
     g_return_val_if_fail(client_.get(), false);
diff --git a/src/backends/edscontactbackend.h b/src/backends/edscontactbackend.h
index f67d38d..bbeb0fb 100644
--- a/src/backends/edscontactbackend.h
+++ b/src/backends/edscontactbackend.h
@@ -80,6 +80,7 @@
     void parseContact(EContact *contact);
     void lastContactAdded();
     bool addNewPerson(Person *item);
+    bool removePerson(const Person *item);
     bool savePerson(const Person *item);
 
 private:
diff --git a/src/contactsview.cpp b/src/contactsview.cpp
index 26067e0..62031a7 100644
--- a/src/contactsview.cpp
+++ b/src/contactsview.cpp
@@ -249,6 +249,52 @@
     gtk_clipboard_set_text(clip, text, -1);
 }
 
+
+static gboolean
+remove_contact_dialog(GtkWidget *widget, Person *person)
+{
+    gboolean response = FALSE;
+    GtkWidget *dialog = gtk_message_dialog_new(NULL,
+                            (GtkDialogFlags)(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT),
+                            GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL,
+                            _("Are you sure you want to delete contact \"%s\"?"
+                            " It will be removed from your system's addressbook."),
+                            person->formattedName().toUtf8().constData());
+
+    gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
+
+    /* get parent window so we can center on it */
+    GtkWidget *parent = gtk_widget_get_toplevel(GTK_WIDGET(widget));
+    if (gtk_widget_is_toplevel(parent)) {
+        gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent));
+        gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT);
+    }
+
+    switch (gtk_dialog_run(GTK_DIALOG(dialog))) {
+        case GTK_RESPONSE_OK:
+            response = TRUE;
+            break;
+        default:
+            response = FALSE;
+            break;
+    }
+
+    gtk_widget_destroy(dialog);
+
+    return response;
+}
+
+static void
+remove_contact(GtkWidget *item, G_GNUC_UNUSED gpointer user_data)
+{
+    gpointer data = g_object_get_data(G_OBJECT(item), COPY_DATA_KEY);
+    g_return_if_fail(data);
+    Person* person = (Person *)data;
+    if (remove_contact_dialog(item, person)) {
+        person->remove();
+    }
+}
+
 static gboolean
 contacts_popup_menu(G_GNUC_UNUSED GtkWidget *widget, GdkEventButton *event, GtkTreeView *treeview)
 {
@@ -291,10 +337,10 @@
 
             /* copy name */
             gchar *name = g_strdup_printf("%s", c->formattedName().toUtf8().constData());
-            GtkWidget *item = gtk_menu_item_new_with_mnemonic(_("_Copy name"));
-            gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
-            g_object_set_data_full(G_OBJECT(item), COPY_DATA_KEY, name, (GDestroyNotify)g_free);
-            g_signal_connect(item,
+            GtkWidget *copy_name_item = gtk_menu_item_new_with_mnemonic(_("_Copy name"));
+            gtk_menu_shell_append(GTK_MENU_SHELL(menu), copy_name_item);
+            g_object_set_data_full(G_OBJECT(copy_name_item), COPY_DATA_KEY, name, (GDestroyNotify)g_free);
+            g_signal_connect(copy_name_item,
                              "activate",
                              G_CALLBACK(copy_contact_info),
                              NULL);
@@ -310,6 +356,16 @@
                                 G_CALLBACK(copy_contact_info),
                                 NULL);
             }
+
+            /* delete contact */
+            GtkWidget *remove_contact_item = gtk_menu_item_new_with_mnemonic(_("_Remove contact"));
+            gtk_menu_shell_append(GTK_MENU_SHELL(menu), remove_contact_item);
+            g_object_set_data_full(G_OBJECT(remove_contact_item), COPY_DATA_KEY, c, (GDestroyNotify)g_free);
+            g_signal_connect(remove_contact_item,
+                             "activate",
+                             G_CALLBACK(remove_contact),
+                             NULL);
+
         }
     } else if (depth > 2) {
         /* copy number */