]> git.0d.be Git - empathy.git/blob - libempathy-gtk/empathy-contact-dialogs.c
More flexible API for EmpathyContactWidget, we now have flags to set
[empathy.git] / libempathy-gtk / empathy-contact-dialogs.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3  * Copyright (C) 2007 Collabora Ltd.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of the
8  * License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public
16  * License along with this program; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  *
20  * Authors: Xavier Claessens <xclaesse@gmail.com>
21  */
22
23 #include <config.h>
24
25 #include <string.h>
26 #include <stdlib.h>
27
28 #include <gtk/gtk.h>
29 #include <glade/glade.h>
30 #include <glib/gi18n.h>
31
32 #include <libempathy/empathy-contact-manager.h>
33 #include <libempathy/empathy-contact-list.h>
34
35 #include "empathy-contact-dialogs.h"
36 #include "empathy-contact-widget.h"
37 #include "empathy-ui-utils.h"
38
39 static GList *subscription_dialogs = NULL;
40 static GList *information_dialogs = NULL;
41 static GtkWidget *new_contact_dialog = NULL;
42
43
44 static gint
45 contact_dialogs_find (GtkDialog      *dialog,
46                       EmpathyContact *contact)
47 {
48         GtkWidget     *contact_widget;
49         EmpathyContact *this_contact;
50
51         contact_widget = g_object_get_data (G_OBJECT (dialog), "contact_widget");
52         this_contact = empathy_contact_widget_get_contact (contact_widget);
53
54         return !empathy_contact_equal (contact, this_contact);
55 }
56
57 /*
58  *  Subscription dialog
59  */
60
61 static void
62 subscription_dialog_response_cb (GtkDialog *dialog,
63                                  gint       response,
64                                  GtkWidget *contact_widget)
65 {
66         EmpathyContactManager *manager;
67         EmpathyContact        *contact;
68
69         manager = empathy_contact_manager_new ();
70         contact = empathy_contact_widget_get_contact (contact_widget);
71
72         if (response == GTK_RESPONSE_YES) {
73                 empathy_contact_list_add (EMPATHY_CONTACT_LIST (manager),
74                                           contact, "");
75         }
76         else if (response == GTK_RESPONSE_NO) {
77                 empathy_contact_list_remove (EMPATHY_CONTACT_LIST (manager),
78                                              contact, "");
79         }
80
81         subscription_dialogs = g_list_remove (subscription_dialogs, dialog);
82         gtk_widget_destroy (GTK_WIDGET (dialog));
83         g_object_unref (manager);
84 }
85
86 void
87 empathy_subscription_dialog_show (EmpathyContact *contact,
88                                   GtkWindow     *parent)
89 {
90         GtkWidget *dialog;
91         GtkWidget *hbox_subscription;
92         GtkWidget *contact_widget;
93         GList     *l;
94
95         g_return_if_fail (EMPATHY_IS_CONTACT (contact));
96
97         l = g_list_find_custom (subscription_dialogs,
98                                 contact,
99                                 (GCompareFunc) contact_dialogs_find);
100         if (l) {
101                 gtk_window_present (GTK_WINDOW (l->data));
102                 return;
103         }
104
105         empathy_glade_get_file_simple ("empathy-contact-dialogs.glade",
106                                       "subscription_request_dialog",
107                                       NULL,
108                                       "subscription_request_dialog", &dialog,
109                                       "hbox_subscription", &hbox_subscription,
110                                       NULL);
111
112         contact_widget = empathy_contact_widget_new (contact,
113                                                      EMPATHY_CONTACT_WIDGET_EDIT_ALIAS |
114                                                      EMPATHY_CONTACT_WIDGET_EDIT_GROUPS);
115         gtk_box_pack_end (GTK_BOX (hbox_subscription),
116                           contact_widget,
117                           TRUE, TRUE,
118                           0);
119
120         g_object_set_data (G_OBJECT (dialog), "contact_widget", contact_widget);
121         subscription_dialogs = g_list_prepend (subscription_dialogs, dialog);
122
123         g_signal_connect (dialog, "response",
124                           G_CALLBACK (subscription_dialog_response_cb),
125                           contact_widget);
126
127         if (parent) {
128                 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
129         }
130
131         gtk_widget_show (dialog);
132 }
133
134 /*
135  *  Information dialog
136  */
137
138 static void
139 contact_information_response_cb (GtkDialog *dialog,
140                                  gint       response,
141                                  GtkWidget *contact_widget)
142 {
143         information_dialogs = g_list_remove (information_dialogs, dialog);
144         gtk_widget_destroy (GTK_WIDGET (dialog));
145 }
146
147 void
148 empathy_contact_information_dialog_show (EmpathyContact *contact,
149                                          GtkWindow      *parent,
150                                          gboolean        edit,
151                                          gboolean        edit_groups)
152 {
153         GtkWidget                *dialog;
154         GtkWidget                *button;
155         GtkWidget                *contact_widget;
156         GList                    *l;
157         EmpathyContactWidgetFlags flags = 0;
158
159         g_return_if_fail (EMPATHY_IS_CONTACT (contact));
160
161         l = g_list_find_custom (information_dialogs,
162                                 contact,
163                                 (GCompareFunc) contact_dialogs_find);
164         if (l) {
165                 gtk_window_present (GTK_WINDOW (l->data));
166                 return;
167         }
168
169         /* Create dialog */
170         dialog = gtk_dialog_new ();
171         gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
172         gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
173         gtk_window_set_title (GTK_WINDOW (dialog), _("Contact information"));
174
175         /* Close button */
176         button = gtk_button_new_with_label (GTK_STOCK_CLOSE);
177         gtk_button_set_use_stock (GTK_BUTTON (button), TRUE);
178         gtk_dialog_add_action_widget (GTK_DIALOG (dialog),
179                                       button,
180                                       GTK_RESPONSE_CLOSE);
181         gtk_widget_show (button);
182
183         /* Contact info widget */
184         if (edit) {
185                 flags |= EMPATHY_CONTACT_WIDGET_EDIT_ALIAS;
186                 if (empathy_contact_is_user (contact)) {
187                         flags |= EMPATHY_CONTACT_WIDGET_EDIT_ACCOUNT |
188                                  EMPATHY_CONTACT_WIDGET_EDIT_AVATAR;
189                 }
190         }
191         if (edit_groups) {
192                 flags |= EMPATHY_CONTACT_WIDGET_EDIT_GROUPS;
193         }
194         contact_widget = empathy_contact_widget_new (contact, flags);
195         gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
196                             contact_widget,
197                             TRUE, TRUE, 0);
198
199         g_object_set_data (G_OBJECT (dialog), "contact_widget", contact_widget);
200         information_dialogs = g_list_prepend (information_dialogs, dialog);
201
202         g_signal_connect (dialog, "response",
203                           G_CALLBACK (contact_information_response_cb),
204                           contact_widget);
205
206         if (parent) {
207                 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
208         }
209
210         gtk_widget_show (dialog);
211 }
212
213 /*
214  *  New contact dialog
215  */
216
217 static void
218 new_contact_response_cb (GtkDialog *dialog,
219                          gint       response,
220                          GtkWidget *contact_widget)
221 {
222         EmpathyContactManager *manager;
223         EmpathyContact         *contact;
224
225         manager = empathy_contact_manager_new ();
226         contact = empathy_contact_widget_get_contact (contact_widget);
227
228         if (contact && response == GTK_RESPONSE_OK) {
229                 empathy_contact_list_add (EMPATHY_CONTACT_LIST (manager),
230                                           contact,
231                                           _("I would like to add you to my contact list."));
232         }
233
234         new_contact_dialog = NULL;
235         gtk_widget_destroy (GTK_WIDGET (dialog));
236         g_object_unref (manager);
237 }
238
239 void
240 empathy_new_contact_dialog_show (GtkWindow *parent)
241 {
242         GtkWidget *dialog;
243         GtkWidget *button;
244         GtkWidget *contact_widget;
245
246         if (new_contact_dialog) {
247                 gtk_window_present (GTK_WINDOW (new_contact_dialog));
248                 return;
249         }
250
251         /* Create dialog */
252         dialog = gtk_dialog_new ();
253         gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
254         gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
255         gtk_window_set_title (GTK_WINDOW (dialog), _("New contact"));
256
257         /* Cancel button */
258         button = gtk_button_new_with_label (GTK_STOCK_CANCEL);
259         gtk_button_set_use_stock (GTK_BUTTON (button), TRUE);
260         gtk_dialog_add_action_widget (GTK_DIALOG (dialog),
261                                       button,
262                                       GTK_RESPONSE_CANCEL);
263         gtk_widget_show (button);
264         
265         /* Add button */
266         button = gtk_button_new_with_label (GTK_STOCK_ADD);
267         gtk_button_set_use_stock (GTK_BUTTON (button), TRUE);
268         gtk_dialog_add_action_widget (GTK_DIALOG (dialog),
269                                       button,
270                                       GTK_RESPONSE_OK);
271         gtk_widget_show (button);
272
273         /* Contact info widget */
274         contact_widget = empathy_contact_widget_new (NULL,
275                                                      EMPATHY_CONTACT_WIDGET_EDIT_ALIAS |
276                                                      EMPATHY_CONTACT_WIDGET_EDIT_ACCOUNT |
277                                                      EMPATHY_CONTACT_WIDGET_EDIT_ID |
278                                                      EMPATHY_CONTACT_WIDGET_EDIT_GROUPS);
279         gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
280                             contact_widget,
281                             TRUE, TRUE, 0);
282
283         new_contact_dialog = dialog;
284
285         g_signal_connect (dialog, "response",
286                           G_CALLBACK (new_contact_response_cb),
287                           contact_widget);
288
289         if (parent) {
290                 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
291         }
292
293         gtk_widget_show (dialog);
294 }
295