gnome: add new person dialog

Add ability to right-click on a contact method
without an associated contact and add them to
an addressbook (backend).

Issue: #77709

Change-Id: Ic2e14c19bd5eb1d2e730ce7c994116f23b79e276
diff --git a/src/utils/menus.cpp b/src/utils/menus.cpp
new file mode 100644
index 0000000..a729bd3
--- /dev/null
+++ b/src/utils/menus.cpp
@@ -0,0 +1,85 @@
+/*
+ *  Copyright (C) 2015 Savoir-faire Linux Inc.
+ *  Author: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
+ *
+ *  Additional permission under GNU GPL version 3 section 7:
+ *
+ *  If you modify this program, or any covered work, by linking or
+ *  combining it with the OpenSSL project's OpenSSL library (or a
+ *  modified version of that library), containing parts covered by the
+ *  terms of the OpenSSL or SSLeay licenses, Savoir-faire Linux Inc.
+ *  grants you additional permission to convey the resulting work.
+ *  Corresponding Source for a non-source form of such a combination
+ *  shall include the source code for the parts of OpenSSL used as well
+ *  as that of the covered work.
+ */
+
+#include "menus.h"
+
+#include <contactmethod.h>
+#include "../createcontactdialog.h"
+
+/**
+ * checks if the given contact method is already associated with a contact
+ */
+gboolean
+contact_method_has_contact(ContactMethod *cm)
+{
+    g_return_val_if_fail(cm, FALSE);
+
+    return cm->contact() != NULL;
+}
+
+static void
+create_new_contact(GtkWidget *item, ContactMethod *contactmethod)
+{
+    // we get the parent widget which should be stored in the item object
+    GtkWidget *parent = GTK_WIDGET(g_object_get_data(G_OBJECT(item), "parent-widget"));
+    auto dialog = create_contact_dialog_new(contactmethod, parent);
+    gtk_dialog_run(GTK_DIALOG(dialog));
+    gtk_widget_destroy(dialog);
+}
+
+/**
+ * creates a menu item with 2 options:
+ *  - create a new contact with the given contact method
+ *  TODO: - add given contact method to existing contact
+ */
+GtkWidget * menu_item_contact_add_to(ContactMethod *cm, GtkWidget *parent)
+{
+    g_return_val_if_fail(cm, NULL);
+
+    auto add_to = gtk_menu_item_new_with_mnemonic("_Add to");
+
+    auto add_to_menu = gtk_menu_new();
+    gtk_menu_item_set_submenu(GTK_MENU_ITEM(add_to), add_to_menu);
+
+    /* TODO: uncomment when feature added */
+    // auto existing = gtk_menu_item_new_with_mnemonic("_Existing contact");
+    // gtk_menu_shell_append(GTK_MENU_SHELL(add_to_menu), existing);
+
+    auto new_contact = gtk_menu_item_new_with_mnemonic("_New contact");
+    gtk_menu_shell_append(GTK_MENU_SHELL(add_to_menu), new_contact);
+
+    /* save the parent widget in the item object, so we can retrieve
+     * it in the callback */
+    g_object_set_data(G_OBJECT(new_contact), "parent-widget", parent);
+
+    g_signal_connect(new_contact, "activate", G_CALLBACK(create_new_contact), cm);
+
+    return add_to;
+}