root/trunk/src/tmut-folder-selector.c

Revision 76 (checked in by pvanhoof, 7 months ago)
        • Implemented simple account management
        • Implemented a new account store
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-folder-selector.h"
27 #include "tmut-shell-window.h"
28 #include "tmut-shell-child.h"
29 #include "tmut-account-store.h"
30
31 #include <tny-gtk-folder-store-tree-model.h>
32 #include <tny-gtk-account-list-model.h>
33
34 static GObjectClass *parent_class = NULL;
35
36 typedef struct _TMutFolderSelectorPriv TMutFolderSelectorPriv;
37
38 struct _TMutFolderSelectorPriv {
39         GtkTreeView *folders_treeview;
40         TMutShellWindow *shell;
41         TnyFolderStore *current;
42         TnyAccountStore *account_store;
43         gint account_created_signal, account_deleted_signal;
44 };
45
46 typedef enum {
47         TMUT_FOLDER_SELECTOR_FOLDER_SELECTED,
48         TMUT_FOLDER_SELECTOR_LAST_SIGNAL
49 } TMutFolderSelectorSignal;
50
51 static guint tmut_folder_selector_signals [TMUT_FOLDER_SELECTOR_LAST_SIGNAL];
52
53 #define TMUT_FOLDER_SELECTOR_GET_PRIVATE(o) \
54         (G_TYPE_INSTANCE_GET_PRIVATE ((o), TMUT_TYPE_FOLDER_SELECTOR, TMutFolderSelectorPriv))
55
56 TnyFolderStore*
57 tmut_folder_selector_get_current (TMutFolderSelector *self)
58 {
59         TMutFolderSelectorPriv *priv = TMUT_FOLDER_SELECTOR_GET_PRIVATE (self);
60
61         if (!priv->current)
62                 return NULL;
63
64         return TNY_FOLDER_STORE (g_object_ref (priv->current));
65 }
66
67 static void
68 disconnect_account_store (TMutFolderSelectorPriv *priv)
69 {
70         g_signal_handler_disconnect (priv->account_store, priv->account_created_signal);
71         g_signal_handler_disconnect (priv->account_store, priv->account_deleted_signal);
72         g_object_unref (priv->account_store);
73         priv->account_store = NULL;
74 }
75
76 static void
77 on_account_created (TMutAccountStore *store, TnyAccount *account, TMutFolderSelector *self)
78 {
79         TMutFolderSelectorPriv *priv = TMUT_FOLDER_SELECTOR_GET_PRIVATE (self);
80         TnyList *model = TNY_LIST (gtk_tree_view_get_model (priv->folders_treeview));
81         tny_list_prepend (model, (GObject *) account);
82 }
83
84
85 static void
86 on_account_deleted (TMutAccountStore *store, TnyAccount *account, TMutFolderSelector *self)
87 {
88         TMutFolderSelectorPriv *priv = TMUT_FOLDER_SELECTOR_GET_PRIVATE (self);
89         TnyList *model = TNY_LIST (gtk_tree_view_get_model (priv->folders_treeview));
90         tny_list_remove (model, (GObject *) account);
91 }
92
93 static void
94 tmut_folder_selector_set_account_store (TnyAccountStoreView *self, TnyAccountStore *account_store)
95 {
96         TMutFolderSelectorPriv *priv = TMUT_FOLDER_SELECTOR_GET_PRIVATE (self);
97         TnyFolderStoreQuery *query;
98         GtkTreeModel *model = NULL;
99
100         query = tny_folder_store_query_new ();
101         tny_folder_store_query_add_item (query, NULL,
102                 TNY_FOLDER_STORE_QUERY_OPTION_SUBSCRIBED);
103         model = tny_gtk_folder_store_tree_model_new (query);
104
105         if (priv->account_store)
106                 disconnect_account_store (priv);
107         priv->account_store = TNY_ACCOUNT_STORE (g_object_ref (account_store));
108
109         tny_account_store_get_accounts (priv->account_store, TNY_LIST (model),
110                 TNY_ACCOUNT_STORE_STORE_ACCOUNTS);
111
112         priv->account_created_signal = g_signal_connect (G_OBJECT (priv->account_store), "account_created",
113                 G_CALLBACK (on_account_created), self);
114         priv->account_deleted_signal = g_signal_connect (G_OBJECT (priv->account_store), "account_deleted",
115                 G_CALLBACK (on_account_deleted), self);
116
117         gtk_tree_view_set_model (priv->folders_treeview, model);
118
119         g_object_unref (model);
120
121         return;
122 }
123
124
125 static void
126 on_folder_changed (GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
127 {
128         TMutFolderSelector *self = TMUT_FOLDER_SELECTOR (user_data);
129         TMutFolderSelectorPriv *priv = TMUT_FOLDER_SELECTOR_GET_PRIVATE (self);
130         GtkTreeSelection *selection = gtk_tree_view_get_selection (treeview);
131         GtkTreeModel *model;
132         GtkTreeIter iter;
133
134         if (gtk_tree_selection_get_selected (selection, &model, &iter))
135         {
136                 gint type;
137                 gtk_tree_model_get (model, &iter,
138                         TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN,
139                         &type, -1);
140                 if (type != TNY_FOLDER_TYPE_ROOT)
141                 {
142                         TnyFolder *folder;
143                         TMutFolderSelector *selector;
144
145                         gtk_tree_model_get (model, &iter,
146                                 TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN,
147                                 &folder, -1);
148                         if (!folder)
149                                 return;
150
151                         priv->current = TNY_FOLDER_STORE (g_object_ref (folder));
152
153                         g_object_ref (self);
154                         g_signal_emit (G_OBJECT (self),
155                                 tmut_folder_selector_signals [TMUT_FOLDER_SELECTOR_FOLDER_SELECTED], 0);
156                         g_object_unref (self);
157
158                         g_object_unref (folder);
159                 }
160         }
161
162         return;
163 }
164
165
166 static void
167 tmut_folder_selector_instance_init (GTypeInstance *instance, gpointer g_class)
168 {
169         TMutFolderSelector *self = (TMutFolderSelector *) instance;
170         TMutFolderSelectorPriv *priv = TMUT_FOLDER_SELECTOR_GET_PRIVATE (self);
171         GtkVBox *vbox = GTK_VBOX (self);
172         GtkCellRenderer *renderer;
173         GtkTreeViewColumn *column;
174         GtkTreeSelection *select;
175         GtkWidget *sw;
176
177         priv->account_store = NULL;
178         priv->account_created_signal = -1;
179         priv->account_deleted_signal = -1;
180
181         priv->current = NULL;
182         sw = gtk_scrolled_window_new (NULL, NULL);
183         gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
184                 GTK_SHADOW_NONE);
185         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
186                 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
187         gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
188         gtk_widget_show (sw);
189         priv->folders_treeview = GTK_TREE_VIEW (gtk_tree_view_new ());
190         gtk_tree_view_set_headers_visible (priv->folders_treeview, FALSE);
191         gtk_tree_view_set_rules_hint (priv->folders_treeview, TRUE);
192         gtk_tree_view_set_fixed_height_mode (priv->folders_treeview, TRUE);
193         gtk_widget_show (GTK_WIDGET (priv->folders_treeview));
194         gtk_container_add (GTK_CONTAINER (sw), GTK_WIDGET (priv->folders_treeview));
195         renderer = gtk_cell_renderer_text_new ();
196         column = gtk_tree_view_column_new_with_attributes (_("Folder"), renderer,
197                         "text", TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, NULL);
198         gtk_tree_view_column_set_sort_column_id (column,
199                 TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN);
200         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
201         gtk_tree_view_append_column (GTK_TREE_VIEW(priv->folders_treeview), column);
202         select = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->folders_treeview));
203         gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
204
205         g_signal_connect (G_OBJECT (priv->folders_treeview), "row-activated",
206                 G_CALLBACK (on_folder_changed), self);
207
208         return;
209 }
210
211
212 static void
213 tmut_folder_selector_finalize (GObject *object)
214 {
215         TMutFolderSelectorPriv *priv = TMUT_FOLDER_SELECTOR_GET_PRIVATE (object);
216
217         if (priv->account_store)
218                 disconnect_account_store (priv);
219
220         (*parent_class->finalize) (object);
221
222         return;
223 }
224
225 TMutShellWindow*
226 tmut_folder_selector_get_window (TMutShellChild *self)
227 {
228         TMutFolderSelectorPriv *priv = TMUT_FOLDER_SELECTOR_GET_PRIVATE (self);
229         return priv->shell;
230 }
231
232 void 
233 tmut_folder_selector_set_window (TMutShellChild *self, TMutShellWindow *window)
234 {
235         TMutFolderSelectorPriv *priv = TMUT_FOLDER_SELECTOR_GET_PRIVATE (self);
236         priv->shell = window;
237         return;
238 }
239
240 static void
241 tmut_shell_child_init (gpointer g, gpointer iface_data)
242 {
243         TMutShellChildIface *klass = (TMutShellChildIface *)g;
244
245         klass->get_window= tmut_folder_selector_get_window;
246         klass->set_window= tmut_folder_selector_set_window;
247
248         return;
249 }
250
251 static void
252 tny_account_store_view_init (gpointer g, gpointer iface_data)
253 {
254         TnyAccountStoreViewIface *klass = (TnyAccountStoreViewIface *)g;
255
256         klass->set_account_store= tmut_folder_selector_set_account_store;
257
258         return;
259 }
260
261 static void
262 tmut_folder_selector_class_init (TMutFolderSelectorClass *class)
263 {
264         GObjectClass *object_class;
265
266         parent_class = g_type_class_peek_parent (class);
267         object_class = (GObjectClass*) class;
268
269         object_class->finalize = tmut_folder_selector_finalize;
270
271         g_type_class_add_private (object_class, sizeof (TMutFolderSelectorPriv));
272
273         return;
274 }
275
276 static void
277 tmut_folder_selector_base_init (gpointer g_class)
278 {
279         static gboolean tmut_folder_selector_initialized = FALSE;
280
281         if (!tmut_folder_selector_initialized)
282         {
283                 tmut_folder_selector_signals[TMUT_FOLDER_SELECTOR_FOLDER_SELECTED] =
284                    g_signal_new ("folder_selected",
285                         TMUT_TYPE_FOLDER_SELECTOR,
286                         G_SIGNAL_RUN_FIRST,
287                         G_STRUCT_OFFSET (TMutFolderSelectorClass, folder_selected),
288                         NULL, NULL,
289                         g_cclosure_marshal_VOID__VOID,
290                         G_TYPE_NONE, 0);
291
292                 tmut_folder_selector_initialized = TRUE;
293         }
294 }
295
296 /**
297  * tmut_folder_selector_new:
298  *
299  *
300  * Return value: A new #TnySummarySelector instance implemented for TMUT
301  **/
302 TMutFolderSelector*
303 tmut_folder_selector_new (void)
304 {
305         TMutFolderSelector *self = g_object_new (TMUT_TYPE_FOLDER_SELECTOR, NULL);
306
307         return TMUT_FOLDER_SELECTOR (self);
308 }
309
310 GType
311 tmut_folder_selector_get_type (void)
312 {
313         static GType type = 0;
314
315         if (G_UNLIKELY(type == 0))
316         {
317                 static const GTypeInfo info =
318                 {
319                   sizeof (TMutFolderSelectorClass),
320                   tmut_folder_selector_base_init,   /* base_init */
321                   NULL,   /* base_finalize */
322                   (GClassInitFunc) tmut_folder_selector_class_init,   /* class_init */
323                   NULL,   /* class_finalize */
324                   NULL,   /* class_data */
325                   sizeof (TMutFolderSelector),
326                   0,      /* n_preallocs */
327                   tmut_folder_selector_instance_init    /* instance_init */
328                 };
329
330                 static const GInterfaceInfo tny_account_store_view_info =
331                 {
332                   (GInterfaceInitFunc) tny_account_store_view_init, /* interface_init */
333                   NULL,         /* interface_finalize */
334                   NULL          /* interface_data */
335                 };
336
337                 static const GInterfaceInfo tmut_shell_child_info =
338                 {
339                   (GInterfaceInitFunc) tmut_shell_child_init, /* interface_init */
340                   NULL,         /* interface_finalize */
341                   NULL          /* interface_data */
342                 };
343
344                 type = g_type_register_static (GTK_TYPE_VBOX,
345                         "TMutFolderSelector",
346                         &info, 0);
347
348                 g_type_add_interface_static (type, TNY_TYPE_ACCOUNT_STORE_VIEW,
349                         &tny_account_store_view_info);
350
351                 g_type_add_interface_static (type, TMUT_TYPE_SHELL_CHILD,
352                         &tmut_shell_child_info);
353
354         }
355
356         return type;
357 }
358
Note: See TracBrowser for help on using the browser.