d0df4a97d644ee2859b190506b59426add830720
[modest] / src / hildon2 / modest-mailboxes-window.c
1 /* Copyright (c) 2009, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  *   notice, this list of conditions and the following disclaimer in the
12  *   documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Nokia Corporation nor the names of its
14  *   contributors may be used to endorse or promote products derived from
15  *   this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #include <modest-mailboxes-window.h>
31 #include <modest-osso-state-saving.h>
32 #include <libosso.h>
33 #include <hildon/hildon-pannable-area.h>
34 #include <modest-window-mgr.h>
35 #include <modest-signal-mgr.h>
36 #include <modest-runtime.h>
37 #include <modest-platform.h>
38 #include <modest-maemo-utils.h>
39 #include <modest-icon-names.h>
40 #include <modest-ui-constants.h>
41 #include <modest-account-mgr.h>
42 #include <modest-account-mgr-helpers.h>
43 #include <modest-defs.h>
44 #include <modest-ui-actions.h>
45 #include <modest-window.h>
46 #include <hildon/hildon-program.h>
47 #include <hildon/hildon-banner.h>
48 #include <hildon/hildon-button.h>
49 #include <tny-account-store-view.h>
50 #include <modest-header-window.h>
51 #include <modest-ui-dimming-rules.h>
52 #include <modest-ui-dimming-manager.h>
53 #include <modest-window-priv.h>
54 #include "modest-text-utils.h"
55 #include "modest-tny-account.h"
56
57 /* 'private'/'protected' functions */
58 static void modest_mailboxes_window_class_init  (ModestMailboxesWindowClass *klass);
59 static void modest_mailboxes_window_init        (ModestMailboxesWindow *obj);
60 static void modest_mailboxes_window_finalize    (GObject *obj);
61
62 static void connect_signals (ModestMailboxesWindow *self);
63 static void modest_mailboxes_window_disconnect_signals (ModestWindow *self);
64
65 static void on_mailbox_activated (ModestFolderView *mailboxes_view,
66                                   TnyFolder *folder,
67                                   gpointer userdata);
68 typedef struct _ModestMailboxesWindowPrivate ModestMailboxesWindowPrivate;
69 struct _ModestMailboxesWindowPrivate {
70
71         GtkWidget *folder_view;
72         GtkWidget *top_vbox;
73         GtkWidget *new_message_button;
74
75         /* signals */
76         GSList *sighandlers;
77
78         gchar *current_store_account;
79 };
80 #define MODEST_MAILBOXES_WINDOW_GET_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE((o), \
81                                                                           MODEST_TYPE_MAILBOXES_WINDOW, \
82                                                                           ModestMailboxesWindowPrivate))
83
84 /* globals */
85 static GtkWindowClass *parent_class = NULL;
86
87 /************************************************************************/
88
89 GType
90 modest_mailboxes_window_get_type (void)
91 {
92         static GType my_type = 0;
93         if (!my_type) {
94                 static const GTypeInfo my_info = {
95                         sizeof(ModestMailboxesWindowClass),
96                         NULL,           /* base init */
97                         NULL,           /* base finalize */
98                         (GClassInitFunc) modest_mailboxes_window_class_init,
99                         NULL,           /* class finalize */
100                         NULL,           /* class data */
101                         sizeof(ModestMailboxesWindow),
102                         1,              /* n_preallocs */
103                         (GInstanceInitFunc) modest_mailboxes_window_init,
104                         NULL
105                 };
106                 my_type = g_type_register_static (MODEST_TYPE_HILDON2_WINDOW,
107                                                   "ModestMailboxesWindow",
108                                                   &my_info, 0);
109         }
110         return my_type;
111 }
112
113 static void
114 modest_mailboxes_window_class_init (ModestMailboxesWindowClass *klass)
115 {
116         GObjectClass *gobject_class;
117         gobject_class = (GObjectClass*) klass;
118         ModestWindowClass *modest_window_class = (ModestWindowClass *) klass;
119
120         parent_class            = g_type_class_peek_parent (klass);
121         gobject_class->finalize = modest_mailboxes_window_finalize;
122
123         g_type_class_add_private (gobject_class, sizeof(ModestMailboxesWindowPrivate));
124         
125         modest_window_class->disconnect_signals_func = modest_mailboxes_window_disconnect_signals;
126 }
127
128 static void
129 modest_mailboxes_window_init (ModestMailboxesWindow *obj)
130 {
131         ModestMailboxesWindowPrivate *priv;
132
133         priv = MODEST_MAILBOXES_WINDOW_GET_PRIVATE(obj);
134
135         priv->sighandlers = NULL;
136         
137         priv->folder_view = NULL;
138
139         priv->top_vbox = NULL;
140
141         priv->current_store_account = NULL;
142 }
143
144 static void
145 modest_mailboxes_window_finalize (GObject *obj)
146 {
147         ModestMailboxesWindowPrivate *priv;
148
149         priv = MODEST_MAILBOXES_WINDOW_GET_PRIVATE(obj);
150
151         if (priv->current_store_account) {
152                 g_free (priv->current_store_account);
153                 priv->current_store_account = NULL;
154         }
155
156         /* Sanity check: shouldn't be needed, the window mgr should
157            call this function before */
158         modest_mailboxes_window_disconnect_signals (MODEST_WINDOW (obj));       
159
160         G_OBJECT_CLASS(parent_class)->finalize (obj);
161 }
162
163 static void
164 modest_mailboxes_window_disconnect_signals (ModestWindow *self)
165 {
166         ModestMailboxesWindowPrivate *priv;
167         priv = MODEST_MAILBOXES_WINDOW_GET_PRIVATE(self);
168
169         modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers);
170         priv->sighandlers = NULL;
171 }
172
173 static void
174 on_visible_account_changed (ModestFolderView *mailboxes_view,
175                             const gchar *account_id,
176                             gpointer user_data)
177 {
178         if (account_id) {
179                 TnyAccount *acc = 
180                         modest_tny_account_store_get_tny_account_by (modest_runtime_get_account_store(),
181                                                                      MODEST_TNY_ACCOUNT_STORE_QUERY_ID,
182                                                                      account_id);
183                 if (acc) {
184                         const gchar *name;
185                         gchar *title = NULL;
186
187                         name = modest_tny_account_get_parent_modest_account_name_for_server_account (acc);
188                         title = modest_account_mgr_get_display_name (modest_runtime_get_account_mgr(),
189                                                                      name);
190                         if (title) {
191                                 gtk_window_set_title (GTK_WINDOW (user_data), title);
192                                 g_free (title);
193                         } else {
194                                 gtk_window_set_title (GTK_WINDOW (user_data), _("mcen_ap_name"));
195                         }
196                         g_object_unref (acc);
197                 }
198         } else {
199                 gtk_window_set_title (GTK_WINDOW (user_data), _("mcen_ap_name"));
200         }
201 }
202
203 static void
204 connect_signals (ModestMailboxesWindow *self)
205 {
206         ModestMailboxesWindowPrivate *priv;
207
208         priv = MODEST_MAILBOXES_WINDOW_GET_PRIVATE(self);
209
210         /* mailboxes view */
211         priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, 
212                                                        G_OBJECT (priv->folder_view), "folder-activated", 
213                                                        G_CALLBACK (on_mailbox_activated), self);
214
215         priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
216                                                        G_OBJECT (priv->folder_view),
217                                                        "visible-account-changed",
218                                                        G_CALLBACK (on_visible_account_changed), self);
219
220         priv->sighandlers = 
221                 modest_signal_mgr_connect (priv->sighandlers,
222                                            G_OBJECT (priv->new_message_button),
223                                            "clicked",
224                                            G_CALLBACK (modest_ui_actions_on_new_msg), self);
225
226 }
227
228 ModestWindow *
229 modest_mailboxes_window_new (const gchar *account)
230 {
231         ModestMailboxesWindow *self = NULL;     
232         ModestMailboxesWindowPrivate *priv = NULL;
233         HildonProgram *app;
234         GdkPixbuf *window_icon;
235         GtkWidget *pannable;
236         GtkWidget *action_area_box;
237         GdkPixbuf *new_message_pixbuf;
238         guint accel_key;
239         GdkModifierType accel_mods;
240         GtkAccelGroup *accel_group;
241         
242         self  = MODEST_MAILBOXES_WINDOW(g_object_new(MODEST_TYPE_MAILBOXES_WINDOW, NULL));
243         priv = MODEST_MAILBOXES_WINDOW_GET_PRIVATE(self);
244
245         pannable = hildon_pannable_area_new ();
246         priv->folder_view  = modest_platform_create_folder_view (NULL);
247         modest_folder_view_set_cell_style (MODEST_FOLDER_VIEW (priv->folder_view),
248                                            MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT);
249         modest_folder_view_set_filter (MODEST_FOLDER_VIEW (priv->folder_view), 
250                                        MODEST_FOLDER_VIEW_FILTER_HIDE_ACCOUNTS);
251
252         action_area_box = hildon_tree_view_get_action_area_box (GTK_TREE_VIEW (priv->folder_view));
253         priv->new_message_button = hildon_button_new (0, HILDON_BUTTON_ARRANGEMENT_HORIZONTAL);
254
255         hildon_button_set_title (HILDON_BUTTON (priv->new_message_button), _("mcen_ti_new_message"));
256         new_message_pixbuf = modest_platform_get_icon ("general_add", MODEST_ICON_SIZE_BIG);
257         hildon_button_set_image (HILDON_BUTTON (priv->new_message_button), gtk_image_new_from_pixbuf (new_message_pixbuf));
258         g_object_unref (new_message_pixbuf);
259
260         gtk_box_pack_start (GTK_BOX (action_area_box), priv->new_message_button, TRUE, TRUE, 0);
261         gtk_widget_show_all (priv->new_message_button);
262         hildon_tree_view_set_action_area_visible (GTK_TREE_VIEW (priv->folder_view), TRUE);
263         
264         /* Set account store */
265         tny_account_store_view_set_account_store (TNY_ACCOUNT_STORE_VIEW (priv->folder_view),
266                                                   TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
267
268         priv->top_vbox = gtk_vbox_new (0, FALSE);
269
270         gtk_container_add (GTK_CONTAINER (pannable), priv->folder_view);
271         gtk_box_pack_end (GTK_BOX (priv->top_vbox), pannable, TRUE, TRUE, 0);
272         gtk_container_add (GTK_CONTAINER (self), priv->top_vbox);
273
274         gtk_widget_show (priv->folder_view);
275         gtk_widget_show (pannable);
276         gtk_widget_show (priv->top_vbox);
277
278         connect_signals (MODEST_MAILBOXES_WINDOW (self));
279
280         /* Load previous osso state, for instance if we are being restored from 
281          * hibernation:  */
282         modest_osso_load_state ();
283
284         /* Get device name */
285         modest_maemo_utils_get_device_name ();
286
287         app = hildon_program_get_instance ();
288         hildon_program_add_window (app, HILDON_WINDOW (self));
289         
290         /* Set window icon */
291         window_icon = modest_platform_get_icon (MODEST_APP_ICON, MODEST_ICON_SIZE_BIG);
292         if (window_icon) {
293                 gtk_window_set_icon (GTK_WINDOW (self), window_icon);
294                 g_object_unref (window_icon);
295         }
296
297         /* Dont't restore settings here, 
298          * because it requires a gtk_widget_show(), 
299          * and we don't want to do that until later,
300          * so that the UI is not visible for non-menu D-Bus activation.
301          */
302
303         /* Register edit modes */
304         accel_group = gtk_accel_group_new ();
305         gtk_accelerator_parse ("<Control>n", &accel_key, &accel_mods);
306         gtk_widget_add_accelerator (priv->new_message_button, "clicked", accel_group,
307                                     accel_key, accel_mods, 0);
308         gtk_window_add_accel_group (GTK_WINDOW (self), accel_group);
309
310         return MODEST_WINDOW(self);
311 }
312
313 ModestFolderView *
314 modest_mailboxes_window_get_folder_view (ModestMailboxesWindow *self)
315 {
316         ModestMailboxesWindowPrivate *priv = NULL;
317
318         g_return_val_if_fail (MODEST_IS_MAILBOXES_WINDOW(self), FALSE);
319
320         priv = MODEST_MAILBOXES_WINDOW_GET_PRIVATE (self);
321         
322         return MODEST_FOLDER_VIEW (priv->folder_view);
323 }
324
325 void
326 modest_mailboxes_window_set_account (ModestMailboxesWindow *self,
327                                      const gchar *account_name)
328 {
329         ModestMailboxesWindowPrivate *priv = NULL;
330         ModestAccountMgr *mgr;
331         ModestAccountSettings *settings = NULL;
332         ModestServerAccountSettings *store_settings = NULL;
333
334         g_return_if_fail (MODEST_IS_MAILBOXES_WINDOW(self));
335
336         priv = MODEST_MAILBOXES_WINDOW_GET_PRIVATE (self);
337
338         /* Get account data */
339         mgr = modest_runtime_get_account_mgr ();
340
341         settings = modest_account_mgr_load_account_settings (mgr, account_name);
342         if (!settings)
343                 goto free_refs;
344
345         store_settings = modest_account_settings_get_store_settings (settings);
346         if (!store_settings)
347                 goto free_refs;
348
349         if (priv->current_store_account != NULL)
350                 g_free (priv->current_store_account);
351         priv->current_store_account = g_strdup (modest_server_account_settings_get_account_name (store_settings));
352
353         modest_folder_view_set_account_id_of_visible_server_account
354                 (MODEST_FOLDER_VIEW (priv->folder_view),
355                  priv->current_store_account);
356
357         modest_window_set_active_account (MODEST_WINDOW (self), account_name);
358
359 free_refs:
360         if (store_settings)
361                 g_object_unref (store_settings);
362         if (settings)
363                 g_object_unref (settings);
364
365 }
366
367 static void
368 on_mailbox_activated (ModestFolderView *mailboxes_view,
369                       TnyFolder *folder,
370                       gpointer userdata)
371 {
372         ModestMailboxesWindowPrivate *priv = NULL;
373 /*      ModestWindow *headerwin; */
374         ModestMailboxesWindow *self = (ModestMailboxesWindow *) userdata;
375
376         g_return_if_fail (MODEST_IS_MAILBOXES_WINDOW(self));
377
378         priv = MODEST_MAILBOXES_WINDOW_GET_PRIVATE (self);
379
380         if (!folder)
381                 return;
382
383         if (!TNY_IS_FOLDER (folder))
384                 return;
385
386         g_message ("MAILBOX SELECTED");
387
388 /*      headerwin = modest_header_window_new (mailboxes, modest_window_get_active_account (MODEST_WINDOW (self))); */
389
390 /*      if (modest_window_mgr_register_window (modest_runtime_get_window_mgr (), */
391 /*                                             MODEST_WINDOW (headerwin), */
392 /*                                             MODEST_WINDOW (self))) { */
393 /*              gtk_widget_show (GTK_WIDGET (headerwin)); */
394 /*      } else { */
395 /*              gtk_widget_destroy (GTK_WIDGET (headerwin)); */
396 /*              headerwin = NULL; */
397 /*      } */
398 }
399