root/trunk/src/tmut-account-manager.c

Revision 90 (checked in by pvanhoof, 4 months ago)
        • The From of transport-accounts
Line 
1 /* TMut
2  * Copyright (C) 2006-2007 Philip Van Hoof <pvanhoof@gnome.org>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library 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  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with self library; if not, write to the
16  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #if HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23
24 #include <glib/gi18n-lib.h>
25
26 #include "tmut-account-manager.h"
27 #include "tmut-account-editor.h"
28 #include "tmut-shell-window.h"
29 #include "tmut-shell-child.h"
30 #include "tmut-account-store.h"
31
32 #include <tny-gtk-folder-store-tree-model.h>
33 #include <tny-gtk-account-list-model.h>
34
35 static GObjectClass *parent_class = NULL;
36
37 typedef struct _TMutAccountManagerPriv TMutAccountManagerPriv;
38
39 struct _TMutAccountManagerPriv
40 {
41         GtkComboBox *accounts_combo;
42         TMutShellWindow *shell;
43         TnyAccount *account;
44         TnyAccountStore *account_store;
45         gint account_created_signal, account_deleted_signal;
46 };
47
48 #define TMUT_ACCOUNT_MANAGER_GET_PRIVATE(o) \
49         (G_TYPE_INSTANCE_GET_PRIVATE ((o), TMUT_TYPE_ACCOUNT_MANAGER, TMutAccountManagerPriv))
50
51
52 typedef struct {
53         TMutAccountManager *self;
54 } OnEditOrNewInfo;
55
56
57 static void
58 on_account_editor_destroy (GtkWidget *widget, gpointer user_data)
59 {
60         OnEditOrNewInfo *info = (OnEditOrNewInfo *) user_data;
61         g_object_unref (info->self);
62         g_slice_free (OnEditOrNewInfo, info);
63         return;
64 }
65
66 static void
67 on_create_new_account (GtkWidget *widget, gpointer user_data)
68 {
69         TMutAccountEditor *editor = TMUT_ACCOUNT_EDITOR (widget);
70         OnEditOrNewInfo *info = (OnEditOrNewInfo *) user_data;
71         TMutAccountManagerPriv *priv = TMUT_ACCOUNT_MANAGER_GET_PRIVATE (info->self);
72         gchar **options = tmut_account_editor_get_options (editor);
73
74         tmut_account_store_create_account (TMUT_ACCOUNT_STORE (priv->account_store),
75                 tmut_account_editor_get_enabled (editor),
76                 tmut_account_editor_get_name (editor),
77                 tmut_account_editor_get_hostname (editor),
78                 tmut_account_editor_get_proto (editor),
79                 tmut_account_editor_get_account_type (editor),
80                 tmut_account_editor_get_user (editor),
81                 NULL,
82                 tmut_account_editor_get_from (editor),
83                 -1,
84                 (const char **) options);
85
86         g_strfreev (options);
87 }
88
89 static void
90 on_edit_account (GtkWidget *widget, gpointer user_data)
91 {
92         TMutAccountEditor *editor = TMUT_ACCOUNT_EDITOR (widget);
93         OnEditOrNewInfo *info = (OnEditOrNewInfo *) user_data;
94         TMutAccountManagerPriv *priv = TMUT_ACCOUNT_MANAGER_GET_PRIVATE (info->self);
95         TnyAccount *account = tmut_account_editor_get_account (editor);
96         gchar **options = tmut_account_editor_get_options (editor);
97
98         tmut_account_store_edit_account (TMUT_ACCOUNT_STORE (priv->account_store),
99                 account,
100                 tmut_account_editor_get_enabled (editor),
101                 tmut_account_editor_get_name (editor),
102                 tmut_account_editor_get_hostname (editor),
103                 tmut_account_editor_get_proto (editor),
104                 tmut_account_editor_get_user (editor),
105                 NULL,
106                 tmut_account_editor_get_from (editor),
107                 -1,
108                 (const char **) options);
109
110         g_strfreev (options);
111
112         g_object_unref (account);
113 }
114 void 
115 tmut_account_manager_on_edit_account_activated (GObject *sender, TMutAccountManager *self)
116 {
117         TMutAccountManagerPriv *priv = TMUT_ACCOUNT_MANAGER_GET_PRIVATE (self);
118
119         if (priv->account) {
120                 TMutAccountEditor *view = tmut_account_editor_new (priv->account);
121                 OnEditOrNewInfo *info;
122
123                 info = g_slice_new0 (OnEditOrNewInfo);
124                 info->self = TMUT_ACCOUNT_MANAGER (g_object_ref (self));
125
126                 g_signal_connect (G_OBJECT (view), "ok-clicked",
127                                 G_CALLBACK (on_edit_account), info);
128                 g_signal_connect (G_OBJECT (view), "destroy",
129                                 G_CALLBACK (on_account_editor_destroy), info);
130
131                 gtk_widget_show (GTK_WIDGET (view));
132                 tmut_shell_window_set_child (
133                         tmut_shell_child_get_window (TMUT_SHELL_CHILD (self)),
134                         TMUT_SHELL_CHILD (view), NULL);;
135         }
136
137         return;
138 }
139
140 void
141 tmut_account_manager_on_new_account_activated (GObject *sender, TMutAccountManager *self)
142 {
143         TMutAccountManagerPriv *priv = TMUT_ACCOUNT_MANAGER_GET_PRIVATE (self);
144         TMutAccountEditor *view = tmut_account_editor_new (NULL);
145         OnEditOrNewInfo *info;
146
147         info = g_slice_new0 (OnEditOrNewInfo);
148         info->self = TMUT_ACCOUNT_MANAGER (g_object_ref (self));
149
150         g_signal_connect (G_OBJECT (view), "ok-clicked",
151                         G_CALLBACK (on_create_new_account), info);
152         g_signal_connect (G_OBJECT (view), "destroy",
153                         G_CALLBACK (on_account_editor_destroy), info);
154
155         gtk_widget_show (GTK_WIDGET (view));
156         tmut_shell_window_set_child (
157                 tmut_shell_child_get_window (TMUT_SHELL_CHILD (self)),
158                 TMUT_SHELL_CHILD (view), NULL);
159
160         return;
161 }
162
163 void
164 tmut_account_manager_on_delete_account_activated (GObject *sender, TMutAccountManager *self)
165 {
166         TMutAccountManagerPriv *priv = TMUT_ACCOUNT_MANAGER_GET_PRIVATE (self);
167
168         if (priv->account) {
169                 tmut_account_store_delete_account (TMUT_ACCOUNT_STORE (priv->account_store),
170                         priv->account);
171                 g_object_unref (priv->account);
172                 priv->account = NULL;
173         }
174
175         return;
176 }
177
178
179
180 static void
181 popup_the_actions_account (GtkButton *button, gpointer user_data)
182 {
183         GtkMenu *menu = (GtkMenu *) user_data;
184         gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
185                         0, gtk_get_current_event_time ());
186         return;
187 }
188
189
190 static void
191 tmut_account_manager_create_menu_default (TMutAccountManager *self)
192 {
193         TMutAccountManagerPriv *priv = TMUT_ACCOUNT_MANAGER_GET_PRIVATE (self);
194         GtkMenu *menu;
195         GtkWidget *new_menuitem, *delete_menuitem, *edit_menuitem;
196         GtkButton *menu_button;
197
198         menu_button = GTK_BUTTON (gtk_button_new_with_label (_("Actions")));
199         menu = GTK_MENU (gtk_menu_new ());
200         new_menuitem = gtk_menu_item_new_with_label (_("Create new account"));
201         delete_menuitem = gtk_menu_item_new_with_label (_("Delete selected account"));
202         edit_menuitem = gtk_menu_item_new_with_label (_("Edit selected account"));
203
204         gtk_widget_show (edit_menuitem);
205         gtk_widget_show (delete_menuitem);
206         gtk_widget_show (new_menuitem);
207         gtk_widget_show (GTK_WIDGET (menu));
208         gtk_widget_show (GTK_WIDGET (menu_button));
209
210         gtk_menu_prepend (menu, edit_menuitem);
211         gtk_menu_prepend (menu, delete_menuitem);
212         gtk_menu_prepend (menu, new_menuitem);
213         gtk_menu_attach_to_widget (menu, GTK_WIDGET (menu_button), NULL);
214         gtk_box_pack_start (GTK_BOX (self), GTK_WIDGET (menu_button), FALSE, TRUE, 0);
215
216         g_signal_connect (G_OBJECT (menu_button), "clicked",
217                 G_CALLBACK (popup_the_actions_account), menu);
218
219         g_signal_connect (G_OBJECT (edit_menuitem), "activate",
220                 G_CALLBACK (tmut_account_manager_on_edit_account_activated), self);
221         g_signal_connect (G_OBJECT (delete_menuitem), "activate",
222                 G_CALLBACK (tmut_account_manager_on_delete_account_activated), self);
223         g_signal_connect (G_OBJECT (new_menuitem), "activate",
224                 G_CALLBACK (tmut_account_manager_on_new_account_activated), self);
225
226         return;
227 }
228
229
230 void 
231 tmut_account_manager_set_active_account (TMutAccountManager *self, TnyAccount *account)
232 {
233         TMutAccountManagerPriv *priv = TMUT_ACCOUNT_MANAGER_GET_PRIVATE (self);
234         priv->account = TNY_ACCOUNT (g_object_ref (account));
235         return;
236 }
237
238
239 static void
240 on_account_changed (GtkComboBox *combobox, gpointer user_data)
241 {
242         TMutAccountManager *self = TMUT_ACCOUNT_MANAGER (user_data);
243         TMutAccountManagerPriv *priv = TMUT_ACCOUNT_MANAGER_GET_PRIVATE (self);
244         GtkTreeIter iter;
245         TnyAccount *account = NULL;
246         GtkTreeModel *model = gtk_combo_box_get_model (combobox);
247
248         if (gtk_combo_box_get_active_iter (priv->accounts_combo, &iter))
249         {
250                 gtk_tree_model_get (model, &iter,
251                         TNY_GTK_ACCOUNT_LIST_MODEL_INSTANCE_COLUMN,
252                         &account, -1);
253                 if (account) {
254                         tmut_account_manager_set_active_account (TMUT_ACCOUNT_MANAGER (user_data), account);
255                         g_object_unref (account);
256                 }
257         }
258
259         return;
260 }
261
262
263 static void
264 on_account_created (TMutAccountStore *store, TnyAccount *account, TMutAccountManager *self)
265 {
266         TMutAccountManagerPriv *priv = TMUT_ACCOUNT_MANAGER_GET_PRIVATE (self);
267         TnyList *model = TNY_LIST (gtk_combo_box_get_model (priv->accounts_combo));
268         tny_list_prepend (model, (GObject *) account);
269 }
270
271
272 static void
273 on_account_deleted (TMutAccountStore *store, TnyAccount *account, TMutAccountManager *self)
274 {
275         TMutAccountManagerPriv *priv = TMUT_ACCOUNT_MANAGER_GET_PRIVATE (self);
276         gtk_combo_box_set_active (priv->accounts_combo, -1);
277         TnyList *model = TNY_LIST (gtk_combo_box_get_model (priv->accounts_combo));
278         tny_list_remove (model, (GObject *) account);
279 }
280
281
282 static void
283 disconnect_account_store (TMutAccountManagerPriv *priv)
284 {
285         g_signal_handler_disconnect (priv->account_store, priv->account_created_signal);
286         g_signal_handler_disconnect (priv->account_store, priv->account_deleted_signal);
287         g_object_unref (priv->account_store);
288         priv->account_store = NULL;
289 }
290
291 static void
292 tmut_account_manager_set_account_store (TnyAccountStoreView *self, TnyAccountStore *account_store)
293 {
294         TMutAccountManagerPriv *priv = TMUT_ACCOUNT_MANAGER_GET_PRIVATE (self);
295         TnyList *accounts = TNY_LIST (tny_gtk_account_list_model_new ());
296
297         tny_account_store_get_accounts (account_store, accounts, TNY_ACCOUNT_STORE_BOTH);
298
299         gtk_combo_box_set_model (priv->accounts_combo, GTK_TREE_MODEL (accounts));
300         gtk_combo_box_set_active (priv->accounts_combo, 0);
301
302         if (priv->account_store)
303                 disconnect_account_store (priv);
304         priv->account_store = TNY_ACCOUNT_STORE (g_object_ref (account_store));
305
306         priv->account_created_signal = g_signal_connect (G_OBJECT (priv->account_store), "account_created",
307                 G_CALLBACK (on_account_created), self);
308         priv->account_deleted_signal = g_signal_connect (G_OBJECT (priv->account_store), "account_deleted",
309                 G_CALLBACK (on_account_deleted), self);
310
311         TMUT_ACCOUNT_MANAGER_GET_CLASS (self)->create_menu (TMUT_ACCOUNT_MANAGER (self));
312
313         return;
314 }
315
316
317 static void
318 tmut_account_manager_instance_init (GTypeInstance *instance, gpointer g_class)
319 {
320         TMutAccountManager *self = (TMutAccountManager *) instance;
321         TMutAccountManagerPriv *priv = TMUT_ACCOUNT_MANAGER_GET_PRIVATE (self);
322         GtkVBox *vbox = GTK_VBOX (self);
323         GtkCellRenderer *renderer;
324         GtkLabel *label = GTK_LABEL (gtk_label_new ("Account manager"));
325
326         priv->account_store = NULL;
327         priv->account_created_signal = -1;
328         priv->account_deleted_signal = -1;
329
330         priv->account = NULL;
331
332         gtk_widget_show (GTK_WIDGET (label));
333
334         priv->accounts_combo = GTK_COMBO_BOX (gtk_combo_box_new ());
335         gtk_widget_show (GTK_WIDGET (priv->accounts_combo));
336         renderer = gtk_cell_renderer_text_new();
337         gtk_cell_layout_pack_start(GTK_CELL_LAYOUT (priv->accounts_combo), renderer, TRUE);
338         gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT (priv->accounts_combo), renderer,
339                 "text", TNY_GTK_ACCOUNT_LIST_MODEL_NAME_COLUMN, NULL);
340         gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (priv->accounts_combo),
341                 FALSE, TRUE, 0);
342
343         gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (label), TRUE, TRUE, 0);
344
345         g_signal_connect (G_OBJECT (priv->accounts_combo), "changed",
346                 G_CALLBACK (on_account_changed), self);
347
348         return;
349 }
350
351 static void
352 tmut_account_manager_finalize (GObject *object)
353 {
354         TMutAccountManagerPriv *priv = TMUT_ACCOUNT_MANAGER_GET_PRIVATE (object);
355
356         if (priv->account)
357                 g_object_unref (priv->account);
358
359         if (priv->account_store)
360                 disconnect_account_store (priv);
361
362         (*parent_class->finalize) (object);
363
364         return;
365 }
366
367 TMutShellWindow*
368 tmut_account_manager_get_window (TMutShellChild *self)
369 {
370         TMutAccountManagerPriv *priv = TMUT_ACCOUNT_MANAGER_GET_PRIVATE (self);
371         return priv->shell;
372 }
373
374 void 
375 tmut_account_manager_set_window (TMutShellChild *self, TMutShellWindow *window)
376 {
377         TMutAccountManagerPriv *priv = TMUT_ACCOUNT_MANAGER_GET_PRIVATE (self);
378         priv->shell = window;
379         return;
380 }
381
382 static void
383 tmut_shell_child_init (gpointer g, gpointer iface_data)
384 {
385         TMutShellChildIface *klass = (TMutShellChildIface *)g;
386
387         klass->get_window= tmut_account_manager_get_window;
388         klass->set_window= tmut_account_manager_set_window;
389
390         return;
391 }
392
393 static void
394 tny_account_store_view_init (gpointer g, gpointer iface_data)
395 {
396         TnyAccountStoreViewIface *klass = (TnyAccountStoreViewIface *)g;
397
398         klass->set_account_store= tmut_account_manager_set_account_store;
399
400         return;
401 }
402
403 static void
404 tmut_account_manager_class_init (TMutAccountManagerClass *class)
405 {
406         GObjectClass *object_class;
407
408         parent_class = g_type_class_peek_parent (class);
409         object_class = (GObjectClass*) class;
410
411         object_class->finalize = tmut_account_manager_finalize;
412
413         class->create_menu= tmut_account_manager_create_menu_default;
414
415         g_type_class_add_private (object_class, sizeof (TMutAccountManagerPriv));
416
417         return;
418 }
419
420 /**
421  * tmut_account_manager_new:
422  *
423  *
424  * Return value: A new #TnySummaryManager instance implemented for TMUT
425  **/
426 TMutAccountManager*
427 tmut_account_manager_new (void)
428 {
429         TMutAccountManager *self = g_object_new (TMUT_TYPE_ACCOUNT_MANAGER, NULL);
430
431         return TMUT_ACCOUNT_MANAGER (self);
432 }
433
434 GType
435 tmut_account_manager_get_type (void)
436 {
437         static GType type = 0;
438
439         if (G_UNLIKELY(type == 0))
440         {
441                 static const GTypeInfo info =
442                 {
443                   sizeof (TMutAccountManagerClass),
444                   NULL,   /* base_init */
445                   NULL,   /* base_finalize */
446                   (GClassInitFunc) tmut_account_manager_class_init,   /* class_init */
447                   NULL,   /* class_finalize */
448                   NULL,   /* class_data */
449                   sizeof (TMutAccountManager),
450                   0,      /* n_preallocs */
451                   tmut_account_manager_instance_init    /* instance_init */
452                 };
453
454                 static const GInterfaceInfo tny_account_store_view_info =
455                 {
456                   (GInterfaceInitFunc) tny_account_store_view_init, /* interface_init */
457                   NULL,         /* interface_finalize */
458                   NULL          /* interface_data */
459                 };
460
461                 static const GInterfaceInfo tmut_shell_child_info =
462                 {
463                   (GInterfaceInitFunc) tmut_shell_child_init, /* interface_init */
464                   NULL,         /* interface_finalize */
465                   NULL          /* interface_data */
466                 };
467
468                 type = g_type_register_static (GTK_TYPE_VBOX,
469                         "TMutAccountManager",
470                         &info, 0);
471
472                 g_type_add_interface_static (type, TNY_TYPE_ACCOUNT_STORE_VIEW,
473                         &tny_account_store_view_info);
474
475                 g_type_add_interface_static (type, TMUT_TYPE_SHELL_CHILD,
476                         &tmut_shell_child_info);
477
478         }
479
480         return type;
481 }
482
Note: See TracBrowser for help on using the browser.