]> git.0d.be Git - empathy.git/blob - src/empathy-import-dialog.c
include telepathy-glib.h
[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/telepathy-glib.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, TRUE, TRUE, 0);
70   gtk_widget_show (widget);
71
72   priv->iw = iw;
73
74   gtk_dialog_add_buttons (GTK_DIALOG (self),
75       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
76       _("_Import"), GTK_RESPONSE_OK,
77       NULL);
78 }
79
80 static void
81 import_dialog_show_warning_message (EmpathyImportDialog *self)
82 {
83   GtkWidget *hbox, *vbox, *w;
84
85   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
86   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
87
88   w = gtk_label_new (_("No accounts to import could be found. Empathy "
89           "currently only supports importing accounts from Pidgin."));
90   gtk_label_set_line_wrap  (GTK_LABEL (w), TRUE);
91   gtk_label_set_selectable (GTK_LABEL (w), TRUE);
92   gtk_misc_set_alignment   (GTK_MISC  (w), 0.0, 0.0);
93   gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
94
95   w = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
96       GTK_ICON_SIZE_DIALOG);
97   gtk_misc_set_alignment (GTK_MISC (w), 0.5, 0.0);
98   gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
99
100   gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
101
102   w = gtk_dialog_get_content_area (GTK_DIALOG (self));
103   gtk_box_pack_start (GTK_BOX (w), hbox, FALSE, FALSE, 0);
104
105   gtk_box_set_spacing (GTK_BOX (w), 14); /* 14 + 2 * 5 = 24 */
106
107   gtk_dialog_add_button (GTK_DIALOG (self), GTK_STOCK_CLOSE,
108       GTK_RESPONSE_CLOSE);
109
110   gtk_widget_show_all (w);
111 }
112
113 static void
114 impl_signal_response (GtkDialog *dialog,
115     gint response_id)
116 {
117   EmpathyImportDialogPriv *priv = GET_PRIV (dialog);
118
119   if (response_id == GTK_RESPONSE_OK)
120     empathy_import_widget_add_selected_accounts (priv->iw);
121
122   gtk_widget_destroy (GTK_WIDGET (dialog));
123 }
124
125 static void
126 do_get_property (GObject *object,
127     guint property_id,
128     GValue *value,
129     GParamSpec *pspec)
130 {
131   EmpathyImportDialogPriv *priv = GET_PRIV (object);
132
133   switch (property_id)
134     {
135     case PROP_PARENT:
136       g_value_set_object (value, priv->parent_window);
137       break;
138     case PROP_SHOW_WARNING:
139       g_value_set_boolean (value, priv->show_warning);
140       break;
141     case PROP_CMS:
142       g_value_set_object (value, priv->cms);
143       break;
144     default:
145       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
146     }
147 }
148
149 static void
150 do_set_property (GObject *object,
151     guint property_id,
152     const GValue *value,
153     GParamSpec *pspec)
154 {
155   EmpathyImportDialogPriv *priv = GET_PRIV (object);
156
157   switch (property_id)
158     {
159     case PROP_PARENT:
160       priv->parent_window = g_value_get_object (value);
161       break;
162     case PROP_SHOW_WARNING:
163       priv->show_warning = g_value_get_boolean (value);
164       break;
165     case PROP_CMS:
166       priv->cms = g_value_dup_object (value);
167       break;
168     default:
169       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
170     }
171 }
172
173 static void
174 do_constructed (GObject *obj)
175 {
176   EmpathyImportDialog *self = EMPATHY_IMPORT_DIALOG (obj);
177   EmpathyImportDialogPriv *priv = GET_PRIV (self);
178   gboolean have_accounts;
179
180   have_accounts = empathy_import_accounts_to_import ();
181
182   if (!have_accounts)
183     {
184       if (priv->show_warning)
185         {
186           import_dialog_show_warning_message (self);
187         }
188       else
189         DEBUG ("No accounts to import; closing dialog silently.");
190     }
191   else
192     {
193       import_dialog_add_import_widget (self);
194     }
195
196   if (priv->parent_window)
197     gtk_window_set_transient_for (GTK_WINDOW (self), priv->parent_window);
198 }
199
200 static void
201 empathy_import_dialog_init (EmpathyImportDialog *self)
202 {
203   EmpathyImportDialogPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
204       EMPATHY_TYPE_IMPORT_DIALOG, EmpathyImportDialogPriv);
205
206   self->priv = priv;
207
208   gtk_container_set_border_width (GTK_CONTAINER (self), 5);
209   gtk_window_set_title (GTK_WINDOW (self), _("Import Accounts"));
210   gtk_window_set_modal (GTK_WINDOW (self), TRUE);
211 }
212 static void
213 do_dispose (GObject *obj)
214 {
215   EmpathyImportDialogPriv *priv = GET_PRIV (obj);
216
217   g_clear_object (&priv->cms);
218
219   G_OBJECT_CLASS (empathy_import_dialog_parent_class)->dispose (obj);
220 }
221
222 static void
223 empathy_import_dialog_class_init (EmpathyImportDialogClass *klass)
224 {
225   GObjectClass *oclass = G_OBJECT_CLASS (klass);
226   GtkDialogClass *gtkclass = GTK_DIALOG_CLASS (klass);
227   GParamSpec *param_spec;
228
229   oclass->constructed = do_constructed;
230   oclass->get_property = do_get_property;
231   oclass->set_property = do_set_property;
232   oclass->dispose = do_dispose;
233
234   gtkclass->response = impl_signal_response;
235
236   param_spec = g_param_spec_object ("parent-window",
237       "parent-window", "The parent window",
238       GTK_TYPE_WINDOW,
239       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
240   g_object_class_install_property (oclass, PROP_PARENT, param_spec);
241
242   param_spec = g_param_spec_boolean ("show-warning",
243       "show-warning", "Whether a warning should be shown when there are no "
244        "sources for importing accounts.",
245       FALSE,
246       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
247   g_object_class_install_property (oclass, PROP_SHOW_WARNING, param_spec);
248
249   param_spec = g_param_spec_object ("cms",
250       "EmpathyConnectionManagers", "EmpathyConnectionManager",
251       EMPATHY_TYPE_CONNECTION_MANAGERS,
252       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
253   g_object_class_install_property (oclass, PROP_CMS, param_spec);
254
255   g_type_class_add_private (klass, sizeof (EmpathyImportDialogPriv));
256 }
257
258 GtkWidget *
259 empathy_import_dialog_new (GtkWindow *parent,
260     gboolean warning,
261     EmpathyConnectionManagers *cms)
262 {
263   g_return_val_if_fail (EMPATHY_IS_CONNECTION_MANAGERS (cms), NULL);
264
265   return g_object_new (EMPATHY_TYPE_IMPORT_DIALOG,
266       "parent-window", parent,
267       "show-warning", warning,
268       "cms", cms,
269       NULL);
270 }