]> git.0d.be Git - empathy.git/blob - libempathy-gtk/empathy-contact-dialogs.c
Remove the autogen.sh script and use gnome-autogen.sh instead.
[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_process_pending (EMPATHY_CONTACT_LIST (manager),
74                                                       contact, TRUE);
75         }
76         else if (response == GTK_RESPONSE_NO) {
77                 empathy_contact_list_process_pending (EMPATHY_CONTACT_LIST (manager),
78                                                       contact, FALSE);
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                                                      CONTACT_WIDGET_TYPE_SUBSCRIPTION);
114         gtk_box_pack_end (GTK_BOX (hbox_subscription),
115                           contact_widget,
116                           TRUE, TRUE,
117                           0);
118
119         g_object_set_data (G_OBJECT (dialog), "contact_widget", contact_widget);
120         subscription_dialogs = g_list_prepend (subscription_dialogs, dialog);
121
122         g_signal_connect (dialog, "response",
123                           G_CALLBACK (subscription_dialog_response_cb),
124                           contact_widget);
125
126         if (parent) {
127                 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
128         }
129
130         gtk_widget_show (dialog);
131 }
132
133 /*
134  *  Information dialog
135  */
136
137 static void
138 contact_information_response_cb (GtkDialog *dialog,
139                                  gint       response,
140                                  GtkWidget *contact_widget)
141 {
142         information_dialogs = g_list_remove (information_dialogs, dialog);
143         gtk_widget_destroy (GTK_WIDGET (dialog));
144 }
145
146 void
147 empathy_contact_information_dialog_show (EmpathyContact *contact,
148                                          GtkWindow      *parent,
149                                          gboolean        edit)
150 {
151         GtkWidget                *dialog;
152         GtkWidget                *button;
153         GtkWidget                *contact_widget;
154         GList                    *l;
155         EmpathyContactWidgetType  type;
156
157         g_return_if_fail (EMPATHY_IS_CONTACT (contact));
158
159         l = g_list_find_custom (information_dialogs,
160                                 contact,
161                                 (GCompareFunc) contact_dialogs_find);
162         if (l) {
163                 gtk_window_present (GTK_WINDOW (l->data));
164                 return;
165         }
166
167         type = edit ? CONTACT_WIDGET_TYPE_EDIT : CONTACT_WIDGET_TYPE_SHOW;
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         contact_widget = empathy_contact_widget_new (contact, type);
185         gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
186                             contact_widget,
187                             TRUE, TRUE, 0);
188
189         g_object_set_data (G_OBJECT (dialog), "contact_widget", contact_widget);
190         information_dialogs = g_list_prepend (information_dialogs, dialog);
191
192         g_signal_connect (dialog, "response",
193                           G_CALLBACK (contact_information_response_cb),
194                           contact_widget);
195
196         if (parent) {
197                 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
198         }
199
200         gtk_widget_show (dialog);
201 }
202
203 /*
204  *  New contact dialog
205  */
206
207 static void
208 new_contact_response_cb (GtkDialog *dialog,
209                          gint       response,
210                          GtkWidget *contact_widget)
211 {
212         EmpathyContactManager *manager;
213         EmpathyContact         *contact;
214
215         manager = empathy_contact_manager_new ();
216         contact = empathy_contact_widget_get_contact (contact_widget);
217
218         if (contact && response == GTK_RESPONSE_OK) {
219                 empathy_contact_list_add (EMPATHY_CONTACT_LIST (manager),
220                                           contact,
221                                           _("I would like to add you to my contact list."));
222         }
223
224         new_contact_dialog = NULL;
225         gtk_widget_destroy (GTK_WIDGET (dialog));
226         g_object_unref (manager);
227 }
228
229 void
230 empathy_new_contact_dialog_show (GtkWindow *parent)
231 {
232         GtkWidget *dialog;
233         GtkWidget *button;
234         GtkWidget *contact_widget;
235
236         if (new_contact_dialog) {
237                 gtk_window_present (GTK_WINDOW (new_contact_dialog));
238                 return;
239         }
240
241         /* Create dialog */
242         dialog = gtk_dialog_new ();
243         gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
244         gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
245         gtk_window_set_title (GTK_WINDOW (dialog), _("New contact"));
246
247         /* Cancel button */
248         button = gtk_button_new_with_label (GTK_STOCK_CANCEL);
249         gtk_button_set_use_stock (GTK_BUTTON (button), TRUE);
250         gtk_dialog_add_action_widget (GTK_DIALOG (dialog),
251                                       button,
252                                       GTK_RESPONSE_CANCEL);
253         gtk_widget_show (button);
254         
255         /* Add button */
256         button = gtk_button_new_with_label (GTK_STOCK_ADD);
257         gtk_button_set_use_stock (GTK_BUTTON (button), TRUE);
258         gtk_dialog_add_action_widget (GTK_DIALOG (dialog),
259                                       button,
260                                       GTK_RESPONSE_OK);
261         gtk_widget_show (button);
262
263         /* Contact info widget */
264         contact_widget = empathy_contact_widget_new (NULL, CONTACT_WIDGET_TYPE_ADD);
265         gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
266                             contact_widget,
267                             TRUE, TRUE, 0);
268
269         new_contact_dialog = dialog;
270
271         g_signal_connect (dialog, "response",
272                           G_CALLBACK (new_contact_response_cb),
273                           contact_widget);
274
275         if (parent) {
276                 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
277         }
278
279         gtk_widget_show (dialog);
280 }
281