From 6a88758d2a6ae1dde148e8bf9ecb63914bddf754 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Thu, 24 Apr 2008 17:13:12 +0000 Subject: [PATCH] Move contact menu code to its own module. svn path=/trunk/; revision=1040 --- docs/libempathy-gtk/libempathy-gtk-docs.sgml | 1 + libempathy-gtk/Makefile.am | 4 +- libempathy-gtk/empathy-contact-list-view.c | 468 ++++++++----------- libempathy-gtk/empathy-contact-menu.c | 174 +++++++ libempathy-gtk/empathy-contact-menu.h | 40 ++ 5 files changed, 402 insertions(+), 285 deletions(-) create mode 100644 libempathy-gtk/empathy-contact-menu.c create mode 100644 libempathy-gtk/empathy-contact-menu.h diff --git a/docs/libempathy-gtk/libempathy-gtk-docs.sgml b/docs/libempathy-gtk/libempathy-gtk-docs.sgml index 3c8dde38..6256b3e9 100644 --- a/docs/libempathy-gtk/libempathy-gtk-docs.sgml +++ b/docs/libempathy-gtk/libempathy-gtk-docs.sgml @@ -31,6 +31,7 @@ + diff --git a/libempathy-gtk/Makefile.am b/libempathy-gtk/Makefile.am index 30dfce43..225c25ec 100644 --- a/libempathy-gtk/Makefile.am +++ b/libempathy-gtk/Makefile.am @@ -47,6 +47,7 @@ libempathy_gtk_la_SOURCES = \ empathy-smiley-manager.c \ empathy-cell-renderer-text.c \ empathy-spell.c \ + empathy-contact-menu.c \ totem-subtitle-encoding.c totem-subtitle-encoding.h # do not distribute generated files @@ -94,7 +95,8 @@ libempathy_gtk_headers = \ empathy-geometry.h \ empathy-smiley-manager.h \ empathy-cell-renderer-text.h \ - empathy-spell.h + empathy-spell.h \ + empathy-contact-menu.h libempathy_gtk_includedir = $(includedir)/libempathy-gtk/ libempathy_gtk_include_HEADERS = \ diff --git a/libempathy-gtk/empathy-contact-list-view.c b/libempathy-gtk/empathy-contact-list-view.c index 8f7c6547..1bc1a657 100644 --- a/libempathy-gtk/empathy-contact-list-view.c +++ b/libempathy-gtk/empathy-contact-list-view.c @@ -44,14 +44,13 @@ #include "empathy-contact-list-view.h" #include "empathy-contact-list-store.h" +#include "empathy-contact-menu.h" #include "empathy-images.h" #include "empathy-cell-renderer-expander.h" #include "empathy-cell-renderer-text.h" #include "empathy-cell-renderer-activatable.h" #include "empathy-ui-utils.h" #include "empathy-contact-dialogs.h" -//#include "empathy-chat-invite.h" -//#include "empathy-ft-window.h" #include "empathy-log-window.h" #include "empathy-gtk-enum-types.h" #include "empathy-gtk-marshal.h" @@ -69,7 +68,6 @@ typedef struct { EmpathyContactListStore *store; - GtkUIManager *ui; GtkTreeRowReference *drag_row; EmpathyContactListFeatures features; } EmpathyContactListViewPriv; @@ -158,10 +156,6 @@ static void contact_list_view_expander_cell_data_func (GtkTreeViewColum GtkTreeModel *model, GtkTreeIter *iter, EmpathyContactListView *view); -static GtkWidget * contact_list_view_get_contact_menu (EmpathyContactListView *view, - gboolean can_send_file, - gboolean can_show_log, - gboolean can_voip); static gboolean contact_list_view_button_press_event_cb (EmpathyContactListView *view, GdkEventButton *event, gpointer user_data); @@ -176,8 +170,6 @@ static void contact_list_view_row_expand_or_collapse_cb (EmpathyContactLi GtkTreeIter *iter, GtkTreePath *path, gpointer user_data); -static void contact_list_view_action_cb (GtkAction *action, - EmpathyContactListView *view); static void contact_list_view_voip_activated (EmpathyContactListView *view, EmpathyContact *contact); static gboolean contact_list_view_remove_dialog_show (GtkWindow *parent, @@ -189,76 +181,6 @@ enum { PROP_FEATURES }; -static const GtkActionEntry entries[] = { - { "ContactMenu", NULL, - N_("_Contact"), NULL, NULL, - NULL - }, - { "GroupMenu", NULL, - N_("_Group"),NULL, NULL, - NULL - }, - { "Chat", EMPATHY_IMAGE_MESSAGE, - N_("_Chat"), NULL, N_("Chat with contact"), - G_CALLBACK (contact_list_view_action_cb) - }, - { "Information", EMPATHY_IMAGE_CONTACT_INFORMATION, - N_("Infor_mation"), "I", N_("View contact information"), - G_CALLBACK (contact_list_view_action_cb) - }, - { "Rename", NULL, - N_("Re_name"), NULL, N_("Rename"), - G_CALLBACK (contact_list_view_action_cb) - }, - { "Edit", GTK_STOCK_EDIT, - N_("_Edit"), NULL, N_("Edit the groups and name for this contact"), - G_CALLBACK (contact_list_view_action_cb) - }, - { "Remove", GTK_STOCK_REMOVE, - N_("_Remove"), NULL, N_("Remove contact"), - G_CALLBACK (contact_list_view_action_cb) - }, - { "Invite", EMPATHY_IMAGE_GROUP_MESSAGE, - N_("_Invite to Chat Room"), NULL, N_("Invite to a currently open chat room"), - G_CALLBACK (contact_list_view_action_cb) - }, - { "SendFile", NULL, - N_("_Send File..."), NULL, N_("Send a file"), - G_CALLBACK (contact_list_view_action_cb) - }, - { "Log", EMPATHY_IMAGE_LOG, - N_("_View Previous Conversations"), NULL, N_("View previous conversations with this contact"), - G_CALLBACK (contact_list_view_action_cb) - }, - { "Call", EMPATHY_IMAGE_VOIP, - N_("_Call"), NULL, N_("Start a voice or video conversation with this contact"), - G_CALLBACK (contact_list_view_action_cb) - }, -}; - -static guint n_entries = G_N_ELEMENTS (entries); - -static const gchar *ui_info = - "" - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - ""; - enum DndDragType { DND_DRAG_TYPE_CONTACT_ID, DND_DRAG_TYPE_URL, @@ -334,30 +256,9 @@ empathy_contact_list_view_class_init (EmpathyContactListViewClass *klass) static void empathy_contact_list_view_init (EmpathyContactListView *view) { - EmpathyContactListViewPriv *priv; - GtkActionGroup *action_group; - GError *error = NULL; - - priv = GET_PRIV (view); - /* Get saved group states. */ empathy_contact_groups_get_all (); - /* Set up UI Manager */ - priv->ui = gtk_ui_manager_new (); - - action_group = gtk_action_group_new ("Actions"); - gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); - gtk_action_group_add_actions (action_group, entries, n_entries, view); - gtk_ui_manager_insert_action_group (priv->ui, action_group, 0); - - if (!gtk_ui_manager_add_ui_from_string (priv->ui, ui_info, -1, &error)) { - g_warning ("Could not build contact menus from string:'%s'", error->message); - g_error_free (error); - } - - g_object_unref (action_group); - gtk_tree_view_set_row_separator_func (GTK_TREE_VIEW (view), empathy_contact_list_store_row_separator_func, NULL, NULL); @@ -388,9 +289,6 @@ contact_list_view_finalize (GObject *object) priv = GET_PRIV (object); - if (priv->ui) { - g_object_unref (priv->ui); - } if (priv->store) { g_object_unref (priv->store); } @@ -1166,62 +1064,75 @@ contact_list_view_expander_cell_data_func (GtkTreeViewColumn *column, contact_list_view_cell_set_background (view, cell, is_group, is_active); } -static GtkWidget * -contact_list_view_get_contact_menu (EmpathyContactListView *view, - gboolean can_send_file, - gboolean can_show_log, - gboolean can_voip) +static gboolean +contact_list_view_remove_dialog_show (GtkWindow *parent, + const gchar *window_title, + const gchar *text) { - EmpathyContactListViewPriv *priv = GET_PRIV (view); - GtkAction *action; - - if (!(priv->features & (EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CHAT | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CALL | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_LOG | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_FT | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INVITE | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_EDIT | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INFO | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_REMOVE))) { - return NULL; - } - - /* Sort out sensitive/visible items */ - action = gtk_ui_manager_get_action (priv->ui, "/Contact/Chat"); - gtk_action_set_visible (action, priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CHAT); - - action = gtk_ui_manager_get_action (priv->ui, "/Contact/Call"); - gtk_action_set_sensitive (action, can_voip); - gtk_action_set_visible (action, priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CALL); + GtkWidget *dialog, *label, *image, *hbox; + gboolean res; + + dialog = gtk_dialog_new_with_buttons (window_title, parent, + GTK_DIALOG_MODAL, + GTK_STOCK_DELETE, GTK_RESPONSE_YES, + GTK_STOCK_CANCEL, GTK_RESPONSE_NO, + NULL); + gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE); + + label = gtk_label_new (text); + image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG); + + hbox = gtk_hbox_new (FALSE, 5); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); + gtk_box_pack_start_defaults (GTK_BOX (hbox), image); + gtk_box_pack_start_defaults (GTK_BOX (hbox), label); + gtk_box_pack_start_defaults (GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox); - action = gtk_ui_manager_get_action (priv->ui, "/Contact/Log"); - gtk_action_set_sensitive (action, can_show_log); - gtk_action_set_visible (action, priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_LOG); + gtk_widget_show (image); + gtk_widget_show (label); + gtk_widget_show (hbox); + gtk_widget_show (dialog); + + res = gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + return (res == GTK_RESPONSE_YES); +} - action = gtk_ui_manager_get_action (priv->ui, "/Contact/SendFile"); - gtk_action_set_visible (action, can_send_file && (priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_FT)); +static void +contact_list_view_group_remove_activate_cb (GtkMenuItem *menuitem, + EmpathyContactListView *view) +{ + EmpathyContactListViewPriv *priv = GET_PRIV (view); + gchar *group; - action = gtk_ui_manager_get_action (priv->ui, "/Contact/Invite"); - gtk_action_set_visible (action, priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INVITE); + group = empathy_contact_list_view_get_selected_group (view); + if (group) { + gchar *text; + GtkWindow *parent; - action = gtk_ui_manager_get_action (priv->ui, "/Contact/Edit"); - gtk_action_set_visible (action, priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_EDIT); + text = g_strdup_printf (_("Do you really want to remove the group '%s' ?"), group); + parent = empathy_get_toplevel_window (GTK_WIDGET (view)); + if (contact_list_view_remove_dialog_show (parent, _("Removing group"), text)) { + EmpathyContactList *list; - action = gtk_ui_manager_get_action (priv->ui, "/Contact/Information"); - gtk_action_set_visible (action, priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INFO); + list = empathy_contact_list_store_get_list_iface (priv->store); + empathy_contact_list_remove_group (list, group); + } - action = gtk_ui_manager_get_action (priv->ui, "/Contact/Remove"); - gtk_action_set_visible (action, priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_REMOVE); + g_free (text); + } - return gtk_ui_manager_get_widget (priv->ui, "/Contact"); + g_free (group); } GtkWidget * empathy_contact_list_view_get_group_menu (EmpathyContactListView *view) { EmpathyContactListViewPriv *priv = GET_PRIV (view); - GtkAction *action; + GtkWidget *menu; + GtkWidget *item; + GtkWidget *image; g_return_val_if_fail (EMPATHY_IS_CONTACT_LIST_VIEW (view), NULL); @@ -1230,40 +1141,147 @@ empathy_contact_list_view_get_group_menu (EmpathyContactListView *view) return NULL; } - action = gtk_ui_manager_get_action (priv->ui, "/Group/Rename"); - gtk_action_set_visible (action, priv->features & EMPATHY_CONTACT_LIST_FEATURE_GROUPS_RENAME); + menu = gtk_menu_new (); + + /* FIXME: Not implemented yet + if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_GROUPS_RENAME) { + item = gtk_menu_item_new_with_mnemonic (_("Re_name")); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show (item); + g_signal_connect (item, "activate", + G_CALLBACK (contact_list_view_group_rename_activate_cb), + view); + }*/ + + if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_GROUPS_REMOVE) { + item = gtk_image_menu_item_new_with_mnemonic (_("_Remove")); + image = gtk_image_new_from_icon_name (GTK_STOCK_REMOVE, + GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show (item); + g_signal_connect (item, "activate", + G_CALLBACK (contact_list_view_group_remove_activate_cb), + view); + } - action = gtk_ui_manager_get_action (priv->ui, "/Group/Remove"); - gtk_action_set_visible (action, priv->features & EMPATHY_CONTACT_LIST_FEATURE_GROUPS_REMOVE); + return menu; +} - return gtk_ui_manager_get_widget (priv->ui, "/Group"); +static void +contact_list_view_remove_activate_cb (GtkMenuItem *menuitem, + EmpathyContactListView *view) +{ + EmpathyContactListViewPriv *priv = GET_PRIV (view); + EmpathyContact *contact; + + contact = empathy_contact_list_view_get_selected (view); + + if (contact) { + gchar *text; + GtkWindow *parent; + + parent = empathy_get_toplevel_window (GTK_WIDGET (view)); + text = g_strdup_printf (_("Do you really want to remove the contact '%s' ?"), + empathy_contact_get_name (contact)); + if (contact_list_view_remove_dialog_show (parent, _("Removing contact"), text)) { + EmpathyContactList *list; + + list = empathy_contact_list_store_get_list_iface (priv->store); + empathy_contact_list_remove (list, contact, + _("Sorry, I don't want you in my contact list anymore.")); + } + + g_free (text); + g_object_unref (contact); + } } GtkWidget * empathy_contact_list_view_get_contact_menu (EmpathyContactListView *view, EmpathyContact *contact) { - EmpathyLogManager *log_manager; - gboolean can_show_log; - gboolean can_send_file; - gboolean can_voip; + EmpathyContactListViewPriv *priv = GET_PRIV (view); + GtkWidget *menu; + GtkMenuShell *shell; + GtkWidget *item; + GtkWidget *image; g_return_val_if_fail (EMPATHY_IS_CONTACT_LIST_VIEW (view), NULL); g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL); - log_manager = empathy_log_manager_new (); - can_show_log = empathy_log_manager_exists (log_manager, - empathy_contact_get_account (contact), - empathy_contact_get_id (contact), - FALSE); - g_object_unref (log_manager); - can_send_file = FALSE; - can_voip = empathy_contact_can_voip (contact); - - return contact_list_view_get_contact_menu (view, - can_send_file, - can_show_log, - can_voip); + if (!(priv->features & (EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CHAT | + EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CALL | + EMPATHY_CONTACT_LIST_FEATURE_CONTACT_LOG | + EMPATHY_CONTACT_LIST_FEATURE_CONTACT_FT | + EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INVITE | + EMPATHY_CONTACT_LIST_FEATURE_CONTACT_EDIT | + EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INFO | + EMPATHY_CONTACT_LIST_FEATURE_CONTACT_REMOVE))) { + return NULL; + } + + menu = gtk_menu_new (); + shell = GTK_MENU_SHELL (menu); + + /* Main items */ + if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CHAT) { + item = empathy_contact_chat_menu_item_new (contact); + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + } + if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CALL) { + item = empathy_contact_call_menu_item_new (contact); + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + } + if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_LOG) { + item = empathy_contact_log_menu_item_new (contact); + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + } + + /* Separator */ + if (priv->features & (EMPATHY_CONTACT_LIST_FEATURE_CONTACT_EDIT | + EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INFO)) { + item = gtk_separator_menu_item_new (); + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + } + + /* More items */ + if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_EDIT) { + item = empathy_contact_edit_menu_item_new (contact); + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + } + if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INFO) { + item = empathy_contact_info_menu_item_new (contact); + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + } + + /* Separator */ + if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_REMOVE) { + item = gtk_separator_menu_item_new (); + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + } + + /* Custom items */ + if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_REMOVE) { + item = gtk_image_menu_item_new_with_mnemonic (_("_Remove")); + image = gtk_image_new_from_icon_name (GTK_STOCK_REMOVE, + GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + g_signal_connect (item, "activate", + G_CALLBACK (contact_list_view_remove_activate_cb), + view); + } + + return menu; } static gboolean @@ -1413,124 +1431,6 @@ contact_list_view_row_expand_or_collapse_cb (EmpathyContactListView *view, g_free (name); } -static void -contact_list_view_action_cb (GtkAction *action, - EmpathyContactListView *view) -{ - EmpathyContactListViewPriv *priv; - EmpathyContact *contact; - const gchar *name; - gchar *group; - GtkWindow *parent; - - priv = GET_PRIV (view); - - name = gtk_action_get_name (action); - if (!name) { - return; - } - - empathy_debug (DEBUG_DOMAIN, "Action:'%s' activated", name); - - contact = empathy_contact_list_view_get_selected (view); - group = empathy_contact_list_view_get_selected_group (view); - parent = empathy_get_toplevel_window (GTK_WIDGET (view)); - - if (contact && strcmp (name, "Chat") == 0) { - empathy_chat_with_contact (contact); - } - else if (contact && strcmp (name, "Call") == 0) { - contact_list_view_voip_activated (view, contact); - } - else if (contact && strcmp (name, "Information") == 0) { - empathy_contact_information_dialog_show (contact, parent, FALSE, FALSE); - } - else if (contact && strcmp (name, "Edit") == 0) { - empathy_contact_information_dialog_show (contact, parent, TRUE, FALSE); - } - else if (contact && strcmp (name, "Remove") == 0) { - EmpathyContactList *list; - gchar *text; - - text = g_strdup_printf (_("Do you really want to remove the contact '%s' ?"), - empathy_contact_get_name (contact)); - - /* TRUE if user wants to remove the contact. FALSE otherwise.*/ - if (contact_list_view_remove_dialog_show (parent, _("Removing contact"), text)) { - list = empathy_contact_list_store_get_list_iface (priv->store); - empathy_contact_list_remove (list, contact, - _("Sorry, I don't want you in my contact list anymore.")); - } - - g_free (text); - } - else if (contact && strcmp (name, "Invite") == 0) { - } - else if (contact && strcmp (name, "SendFile") == 0) { - } - else if (contact && strcmp (name, "Log") == 0) { - empathy_log_window_show (empathy_contact_get_account (contact), - empathy_contact_get_id (contact), - FALSE, - parent); - } - else if (group && strcmp (name, "Rename") == 0) { - } - else if (group && strcmp (name, "Remove") == 0) { - EmpathyContactList *list; - gchar *text; - - text = g_strdup_printf (_("Do you really want to remove the group '%s' ?"), group); - - if (contact_list_view_remove_dialog_show (parent, _("Removing group"), text)) { - list = empathy_contact_list_store_get_list_iface (priv->store); - empathy_contact_list_remove_group (list, group); - } - - g_free (text); - } - - g_free (group); - if (contact) { - g_object_unref (contact); - } -} - -static gboolean -contact_list_view_remove_dialog_show (GtkWindow *parent, - const gchar *window_title, - const gchar *text) -{ - GtkWidget *dialog, *label, *image, *hbox; - gboolean res; - - dialog = gtk_dialog_new_with_buttons (window_title, parent, - GTK_DIALOG_MODAL, - GTK_STOCK_DELETE, GTK_RESPONSE_YES, - GTK_STOCK_CANCEL, GTK_RESPONSE_NO, - NULL); - gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE); - - label = gtk_label_new (text); - image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG); - - hbox = gtk_hbox_new (FALSE, 5); - gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); - gtk_box_pack_start_defaults (GTK_BOX (hbox), image); - gtk_box_pack_start_defaults (GTK_BOX (hbox), label); - gtk_box_pack_start_defaults (GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox); - - gtk_widget_show (image); - gtk_widget_show (label); - gtk_widget_show (hbox); - gtk_widget_show (dialog); - - res = gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - - return (res == GTK_RESPONSE_YES); -} - static void contact_list_view_voip_activated (EmpathyContactListView *view, EmpathyContact *contact) diff --git a/libempathy-gtk/empathy-contact-menu.c b/libempathy-gtk/empathy-contact-menu.c new file mode 100644 index 00000000..4509dd17 --- /dev/null +++ b/libempathy-gtk/empathy-contact-menu.c @@ -0,0 +1,174 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2008 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: Xavier Claessens + */ + +#include "config.h" + +#include + +#include +#include + +#include +#include + +#include "empathy-contact-menu.h" +#include "empathy-images.h" +#include "empathy-log-window.h" +#include "empathy-contact-dialogs.h" + +#define DEBUG_DOMAIN "ContactMenu" + +GtkWidget * +empathy_contact_chat_menu_item_new (EmpathyContact *contact) +{ + GtkWidget *item; + GtkWidget *image; + + g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL); + + item = gtk_image_menu_item_new_with_mnemonic (_("_Chat")); + image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_MESSAGE, + GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); + gtk_widget_show (image); + + g_signal_connect_swapped (item, "activate", + G_CALLBACK (empathy_chat_with_contact), + contact); + + return item; +} + +GtkWidget * +empathy_contact_call_menu_item_new (EmpathyContact *contact) +{ + GtkWidget *item; + GtkWidget *image; + + g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL); + + item = gtk_image_menu_item_new_with_mnemonic (_("_Call")); + image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_VOIP, + GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); + gtk_widget_set_sensitive (item, empathy_contact_can_voip (contact)); + gtk_widget_show (image); + + g_signal_connect_swapped (item, "activate", + G_CALLBACK (empathy_call_with_contact), + contact); + + return item; +} + +static void +contact_log_menu_item_activate_cb (EmpathyContact *contact) +{ + empathy_log_window_show (empathy_contact_get_account (contact), + empathy_contact_get_id (contact), + FALSE, NULL); +} + +GtkWidget * +empathy_contact_log_menu_item_new (EmpathyContact *contact) +{ + EmpathyLogManager *manager; + gboolean have_log; + GtkWidget *item; + GtkWidget *image; + + g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL); + + manager = empathy_log_manager_new (); + have_log = empathy_log_manager_exists (manager, + empathy_contact_get_account (contact), + empathy_contact_get_id (contact), + FALSE); + g_object_unref (manager); + + item = gtk_image_menu_item_new_with_mnemonic (_("_View Previous Conversations")); + image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_LOG, + GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); + gtk_widget_set_sensitive (item, have_log); + gtk_widget_show (image); + + g_signal_connect_swapped (item, "activate", + G_CALLBACK (contact_log_menu_item_activate_cb), + contact); + + return item; +} + +static void +contact_info_menu_item_activate_cb (EmpathyContact *contact) +{ + empathy_contact_information_dialog_show (contact, NULL, FALSE, FALSE); +} + +GtkWidget * +empathy_contact_info_menu_item_new (EmpathyContact *contact) +{ + GtkWidget *item; + GtkWidget *image; + + g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL); + + item = gtk_image_menu_item_new_with_mnemonic (_("Infor_mation")); + image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_CONTACT_INFORMATION, + GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); + gtk_widget_show (image); + + g_signal_connect_swapped (item, "activate", + G_CALLBACK (contact_info_menu_item_activate_cb), + contact); + + return item; +} + +static void +contact_edit_menu_item_activate_cb (EmpathyContact *contact) +{ + empathy_contact_information_dialog_show (contact, NULL, TRUE, FALSE); +} + +GtkWidget * +empathy_contact_edit_menu_item_new (EmpathyContact *contact) +{ + GtkWidget *item; + GtkWidget *image; + + g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL); + + item = gtk_image_menu_item_new_with_mnemonic (_("_Edit")); + image = gtk_image_new_from_icon_name (GTK_STOCK_EDIT, + GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); + gtk_widget_show (image); + + g_signal_connect_swapped (item, "activate", + G_CALLBACK (contact_edit_menu_item_activate_cb), + contact); + + return item; +} + diff --git a/libempathy-gtk/empathy-contact-menu.h b/libempathy-gtk/empathy-contact-menu.h new file mode 100644 index 00000000..4b9427b7 --- /dev/null +++ b/libempathy-gtk/empathy-contact-menu.h @@ -0,0 +1,40 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2008 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: Xavier Claessens + */ + +#ifndef __EMPATHY_CONTACT_MENU_H__ +#define __EMPATHY_CONTACT_MENU_H__ + +#include + +#include + +G_BEGIN_DECLS + +GtkWidget * empathy_contact_chat_menu_item_new (EmpathyContact *contact); +GtkWidget * empathy_contact_call_menu_item_new (EmpathyContact *contact); +GtkWidget * empathy_contact_log_menu_item_new (EmpathyContact *contact); +GtkWidget * empathy_contact_info_menu_item_new (EmpathyContact *contact); +GtkWidget * empathy_contact_edit_menu_item_new (EmpathyContact *contact); + +G_END_DECLS + +#endif /* __EMPATHY_CONTACT_MENU_H__ */ + -- 2.39.2