]> git.0d.be Git - empathy.git/blob - src/empathy-import-dialog.c
Pass EmpathyConnectionManagers to the import widget
[empathy.git] / src / empathy-import-dialog.c
1 /*
2  * Copyright (C) 2008-2009 Collabora Ltd.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public
15  * License along with this program; if not, write to the
16  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
17  * Boston, MA  02110-1301  USA
18  *
19  * Authors: Jonny Lamb <jonny.lamb@collabora.co.uk>
20  *          Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
21  */
22
23 #include <config.h>
24
25 #include <glib.h>
26 #include <gtk/gtk.h>
27 #include <glib/gi18n-lib.h>
28
29 #include <telepathy-glib/util.h>
30
31 #include "empathy-import-dialog.h"
32 #include "empathy-import-pidgin.h"
33 #include "empathy-import-widget.h"
34
35 #define DEBUG_FLAG EMPATHY_DEBUG_OTHER
36 #include <libempathy/empathy-debug.h>
37 #include <libempathy/empathy-utils.h>
38 #include <libempathy-gtk/empathy-ui-utils.h>
39
40 enum {
41   PROP_PARENT = 1,
42   PROP_SHOW_WARNING,
43   PROP_CMS,
44 };
45
46 typedef struct {
47   GtkWindow *parent_window;
48
49   EmpathyImportWidget *iw;
50
51   gboolean show_warning;
52   EmpathyConnectionManagers *cms;
53 } EmpathyImportDialogPriv;
54
55 G_DEFINE_TYPE (EmpathyImportDialog, empathy_import_dialog, GTK_TYPE_DIALOG)
56 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyImportDialog)
57
58 static void
59 import_dialog_add_import_widget (EmpathyImportDialog *self)
60 {
61   EmpathyImportWidget *iw;
62   EmpathyImportDialogPriv *priv = GET_PRIV (self);
63   GtkWidget *widget, *area;
64
65   area = gtk_dialog_get_content_area (GTK_DIALOG (self));
66
67   iw = empathy_import_widget_new (EMPATHY_IMPORT_APPLICATION_ALL, priv->cms);
68   widget = empathy_import_widget_get_widget (iw);
69   gtk_box_pack_start (GTK_BOX (area), widget, FALSE, FALSE, 0);
70   gtk_widget_show (widget);
71
72   priv->iw = iw;
73
74   gtk_dialog_add_buttons (GTK_DIALOG (self), GTK_STOCK_CANCEL,
75       GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
76 }
77
78 static void
79 import_dialog_show_warning_message (EmpathyImportDialog *self)
80 {
81   GtkWidget *hbox, *vbox, *w;
82
83   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
84   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
85
86   w = gtk_label_new (_("No accounts to import could be found. Empathy "
87           "currently only supports importing accounts from Pidgin."));
88   gtk_label_set_line_wrap  (GTK_LABEL (w), TRUE);
89   gtk_label_set_selectable (GTK_LABEL (w), TRUE);
90   gtk_misc_set_alignment   (GTK_MISC  (w), 0.0, 0.0);
91   gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
92
93   w = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
94       GTK_ICON_SIZE_DIALOG);
95   gtk_misc_set_alignment (GTK_MISC (w), 0.5, 0.0);
96   gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
97
98   gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
99
100   w = gtk_dialog_get_content_area (GTK_DIALOG (self));
101   gtk_box_pack_start (GTK_BOX (w), hbox, FALSE, FALSE, 0);
102
103   gtk_box_set_spacing (GTK_BOX (w), 14); /* 14 + 2 * 5 = 24 */
104
105   gtk_dialog_add_button (GTK_DIALOG (self), GTK_STOCK_CLOSE,
106       GTK_RESPONSE_CLOSE);
107
108   gtk_widget_show_all (w);
109 }
110
111 static void
112 impl_signal_response (GtkDialog *dialog,
113     gint response_id)
114 {
115   EmpathyImportDialogPriv *priv = GET_PRIV (dialog);
116
117   if (response_id == GTK_RESPONSE_OK)
118     empathy_import_widget_add_selected_accounts (priv->iw);
119
120   gtk_widget_destroy (GTK_WIDGET (dialog));
121 }
122
123 static void
124 do_get_property (GObject *object,
125     guint property_id,
126     GValue *value,
127     GParamSpec *pspec)
128 {
129   EmpathyImportDialogPriv *priv = GET_PRIV (object);
130
131   switch (property_id)
132     {
133     case PROP_PARENT:
134       g_value_set_object (value, priv->parent_window);
135       break;
136     case PROP_SHOW_WARNING:
137       g_value_set_boolean (value, priv->show_warning);
138       break;
139     case PROP_CMS:
140       g_value_set_object (value, priv->cms);
141       break;
142     default:
143       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
144     }
145 }
146
147 static void
148 do_set_property (GObject *object,
149     guint property_id,
150     const GValue *value,
151     GParamSpec *pspec)
152 {
153   EmpathyImportDialogPriv *priv = GET_PRIV (object);
154
155   switch (property_id)
156     {
157     case PROP_PARENT:
158       priv->parent_window = g_value_get_object (value);
159       break;
160     case PROP_SHOW_WARNING:
161       priv->show_warning = g_value_get_boolean (value);
162       break;
163     case PROP_CMS:
164       priv->cms = g_value_dup_object (value);
165       break;
166     default:
167       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
168     }
169 }
170
171 static void
172 do_constructed (GObject *obj)
173 {
174   EmpathyImportDialog *self = EMPATHY_IMPORT_DIALOG (obj);
175   EmpathyImportDialogPriv *priv = GET_PRIV (self);
176   gboolean have_accounts;
177
178   have_accounts = empathy_import_accounts_to_import ();
179
180   if (!have_accounts)
181     {
182       if (priv->show_warning)
183         {
184           import_dialog_show_warning_message (self);
185         }
186       else
187         DEBUG ("No accounts to import; closing dialog silently.");
188     }
189   else
190     {
191       import_dialog_add_import_widget (self);
192     }
193
194   if (priv->parent_window)
195     gtk_window_set_transient_for (GTK_WINDOW (self), priv->parent_window);
196 }
197
198 static void
199 empathy_import_dialog_init (EmpathyImportDialog *self)
200 {
201   EmpathyImportDialogPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
202       EMPATHY_TYPE_IMPORT_DIALOG, EmpathyImportDialogPriv);
203
204   self->priv = priv;
205
206   gtk_container_set_border_width (GTK_CONTAINER (self), 5);
207   gtk_window_set_title (GTK_WINDOW (self), _("Import Accounts"));
208   gtk_window_set_modal (GTK_WINDOW (self), TRUE);
209 }
210 static void
211 do_dispose (GObject *obj)
212 {
213   EmpathyImportDialogPriv *priv = GET_PRIV (obj);
214
215   g_clear_object (&priv->cms);
216
217   G_OBJECT_CLASS (empathy_import_dialog_parent_class)->dispose (obj);
218 }
219
220 static void
221 empathy_import_dialog_class_init (EmpathyImportDialogClass *klass)
222 {
223   GObjectClass *oclass = G_OBJECT_CLASS (klass);
224   GtkDialogClass *gtkclass = GTK_DIALOG_CLASS (klass);
225   GParamSpec *param_spec;
226
227   oclass->constructed = do_constructed;
228   oclass->get_property = do_get_property;
229   oclass->set_property = do_set_property;
230   oclass->dispose = do_dispose;
231
232   gtkclass->response = impl_signal_response;
233
234   param_spec = g_param_spec_object ("parent-window",
235       "parent-window", "The parent window",
236       GTK_TYPE_WINDOW,
237       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
238   g_object_class_install_property (oclass, PROP_PARENT, param_spec);
239
240   param_spec = g_param_spec_boolean ("show-warning",
241       "show-warning", "Whether a warning should be shown when there are no "
242        "sources for importing accounts.",
243       FALSE,
244       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
245   g_object_class_install_property (oclass, PROP_SHOW_WARNING, param_spec);
246
247   param_spec = g_param_spec_object ("cms",
248       "EmpathyConnectionManagers", "EmpathyConnectionManager",
249       EMPATHY_TYPE_CONNECTION_MANAGERS,
250       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
251   g_object_class_install_property (oclass, PROP_CMS, param_spec);
252
253   g_type_class_add_private (klass, sizeof (EmpathyImportDialogPriv));
254 }
255
256 GtkWidget *
257 empathy_import_dialog_new (GtkWindow *parent,
258     gboolean warning,
259     EmpathyConnectionManagers *cms)
260 {
261   g_return_val_if_fail (EMPATHY_IS_CONNECTION_MANAGERS (cms), NULL);
262
263   return g_object_new (EMPATHY_TYPE_IMPORT_DIALOG,
264       "parent-window", parent,
265       "show-warning", warning,
266       "cms", cms,
267       NULL);
268 }