Added dimming rules for folder window
[modest] / src / hildon2 / modest-folder-window.c
1 /* Copyright (c) 2008, 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-folder-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-edit-toolbar.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
55 typedef enum {
56         EDIT_MODE_COMMAND_NONE = 0,
57         EDIT_MODE_COMMAND_MOVE = 1,
58         EDIT_MODE_COMMAND_DELETE = 2,
59         EDIT_MODE_COMMAND_RENAME = 3,
60 } EditModeCommand;
61
62 /* 'private'/'protected' functions */
63 static void modest_folder_window_class_init  (ModestFolderWindowClass *klass);
64 static void modest_folder_window_init        (ModestFolderWindow *obj);
65 static void modest_folder_window_finalize    (GObject *obj);
66
67 static void connect_signals (ModestFolderWindow *self);
68 static void modest_folder_window_disconnect_signals (ModestWindow *self);
69
70 static gboolean on_zoom_minus_plus_not_implemented (ModestWindow *window);
71 static void on_folder_activated (ModestFolderView *folder_view,
72                                  TnyFolder *folder,
73                                  gpointer userdata);
74 static void add_to_menu (ModestFolderWindow *self,
75                          HildonAppMenu *menu,
76                          gchar *label,
77                          GCallback callback,
78                          ModestDimmingRulesGroup *group,
79                          GCallback dimming_callback);
80 static void setup_menu (ModestFolderWindow *self,
81                         ModestDimmingRulesGroup *group);
82
83 static void set_edit_mode (ModestFolderWindow *self,
84                            EditModeCommand command);
85 static void edit_toolbar_button_clicked (HildonEditToolbar *toolbar,
86                                          ModestFolderWindow *self);
87 static void edit_toolbar_arrow_clicked (HildonEditToolbar *toolbar,
88                                         ModestFolderWindow *self);
89 static void set_delete_edit_mode (GtkButton *button,
90                                   ModestFolderWindow *self);
91 static void set_moveto_edit_mode (GtkButton *button,
92                                   ModestFolderWindow *self);
93 static void set_rename_edit_mode (GtkButton *button,
94                                   ModestFolderWindow *self);
95 static gboolean modest_folder_window_toggle_menu (HildonWindow *window,
96                                                   guint button,
97                                                   guint32 time);
98
99 typedef struct _ModestFolderWindowPrivate ModestFolderWindowPrivate;
100 struct _ModestFolderWindowPrivate {
101
102         GtkWidget *folder_view;
103         GtkWidget *edit_toolbar;
104         GtkWidget *top_vbox;
105         GtkWidget *app_menu;
106
107         gboolean edit_mode;
108         EditModeCommand edit_command;
109
110         /* signals */
111         GSList *sighandlers;
112
113         /* Display state */
114         osso_display_state_t display_state;
115 };
116 #define MODEST_FOLDER_WINDOW_GET_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE((o), \
117                                                                           MODEST_TYPE_FOLDER_WINDOW, \
118                                                                           ModestFolderWindowPrivate))
119
120 /* globals */
121 static GtkWindowClass *parent_class = NULL;
122
123 /************************************************************************/
124
125 GType
126 modest_folder_window_get_type (void)
127 {
128         static GType my_type = 0;
129         if (!my_type) {
130                 static const GTypeInfo my_info = {
131                         sizeof(ModestFolderWindowClass),
132                         NULL,           /* base init */
133                         NULL,           /* base finalize */
134                         (GClassInitFunc) modest_folder_window_class_init,
135                         NULL,           /* class finalize */
136                         NULL,           /* class data */
137                         sizeof(ModestFolderWindow),
138                         1,              /* n_preallocs */
139                         (GInstanceInitFunc) modest_folder_window_init,
140                         NULL
141                 };
142                 my_type = g_type_register_static (MODEST_TYPE_WINDOW,
143                                                   "ModestFolderWindow",
144                                                   &my_info, 0);
145         }
146         return my_type;
147 }
148
149 static void
150 modest_folder_window_class_init (ModestFolderWindowClass *klass)
151 {
152         GObjectClass *gobject_class;
153         gobject_class = (GObjectClass*) klass;
154         ModestWindowClass *modest_window_class = (ModestWindowClass *) klass;
155         HildonWindowClass *hildon_window_class = (HildonWindowClass *) klass;
156
157         parent_class            = g_type_class_peek_parent (klass);
158         gobject_class->finalize = modest_folder_window_finalize;
159
160         g_type_class_add_private (gobject_class, sizeof(ModestFolderWindowPrivate));
161         
162         hildon_window_class->toggle_menu = modest_folder_window_toggle_menu;
163
164         modest_window_class->zoom_minus_func = on_zoom_minus_plus_not_implemented;
165         modest_window_class->zoom_plus_func = on_zoom_minus_plus_not_implemented;
166         modest_window_class->disconnect_signals_func = modest_folder_window_disconnect_signals;
167 }
168
169 static void
170 modest_folder_window_init (ModestFolderWindow *obj)
171 {
172         ModestFolderWindowPrivate *priv;
173
174         priv = MODEST_FOLDER_WINDOW_GET_PRIVATE(obj);
175
176         priv->sighandlers = NULL;
177         priv->display_state = OSSO_DISPLAY_ON;
178         
179         priv->folder_view = NULL;
180
181         priv->top_vbox = NULL;
182         priv->edit_mode = FALSE;
183         priv->edit_command = EDIT_MODE_COMMAND_NONE;
184         priv->edit_toolbar = NULL;
185         
186         modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(),
187                                             GTK_WINDOW(obj),
188                                             "applications_email_folderview");
189 }
190
191 static void
192 modest_folder_window_finalize (GObject *obj)
193 {
194         ModestFolderWindowPrivate *priv;
195
196         priv = MODEST_FOLDER_WINDOW_GET_PRIVATE(obj);
197
198         /* Sanity check: shouldn't be needed, the window mgr should
199            call this function before */
200         modest_folder_window_disconnect_signals (MODEST_WINDOW (obj));  
201
202         G_OBJECT_CLASS(parent_class)->finalize (obj);
203 }
204
205 static void
206 modest_folder_window_disconnect_signals (ModestWindow *self)
207 {       
208         ModestFolderWindowPrivate *priv;        
209         priv = MODEST_FOLDER_WINDOW_GET_PRIVATE(self);
210
211         modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers);
212         priv->sighandlers = NULL;       
213 }
214
215 static void
216 connect_signals (ModestFolderWindow *self)
217 {       
218         ModestFolderWindowPrivate *priv;
219         
220         priv = MODEST_FOLDER_WINDOW_GET_PRIVATE(self);
221
222         /* folder view */
223         priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, 
224                                                        G_OBJECT (priv->folder_view), "folder-activated", 
225                                                        G_CALLBACK (on_folder_activated), self);
226
227         /* TODO: connect folder view activate */
228         
229         /* window */
230
231         /* we don't register this in sighandlers, as it should be run after disconnecting all signals,
232          * in destroy stage */
233
234         
235 }
236
237 static void 
238 osso_display_event_cb (osso_display_state_t state, 
239                        gpointer data)
240 {
241         ModestFolderWindowPrivate *priv = MODEST_FOLDER_WINDOW_GET_PRIVATE (data);
242
243         priv->display_state = state;
244
245         /* Stop blinking if the screen becomes on */
246         if (priv->display_state == OSSO_DISPLAY_ON)
247                 modest_platform_remove_new_mail_notifications (TRUE);
248 }
249
250 ModestWindow *
251 modest_folder_window_new (TnyFolderStoreQuery *query)
252 {
253         ModestFolderWindow *self = NULL;        
254         ModestFolderWindowPrivate *priv = NULL;
255         HildonProgram *app;
256         GdkPixbuf *window_icon;
257         GtkWidget *pannable;
258         ModestWindowPrivate *parent_priv = NULL;
259         ModestDimmingRulesGroup *menu_rules_group = NULL;
260         
261         self  = MODEST_FOLDER_WINDOW(g_object_new(MODEST_TYPE_FOLDER_WINDOW, NULL));
262         priv = MODEST_FOLDER_WINDOW_GET_PRIVATE(self);
263         parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
264
265         parent_priv->ui_dimming_manager = modest_ui_dimming_manager_new();
266         menu_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_MENU, FALSE);
267
268         pannable = hildon_pannable_area_new ();
269         priv->folder_view  = modest_platform_create_folder_view (query);
270         modest_folder_view_set_cell_style (MODEST_FOLDER_VIEW (priv->folder_view),
271                                            MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT);
272
273         setup_menu (self, menu_rules_group);
274
275         modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, menu_rules_group);
276         g_object_unref (menu_rules_group);
277
278         /* Set account store */
279         tny_account_store_view_set_account_store (TNY_ACCOUNT_STORE_VIEW (priv->folder_view),
280                                                   TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
281
282         priv->top_vbox = gtk_vbox_new (0, FALSE);
283
284         gtk_container_add (GTK_CONTAINER (pannable), priv->folder_view);
285         gtk_box_pack_end (GTK_BOX (priv->top_vbox), pannable, TRUE, TRUE, 0);
286         gtk_container_add (GTK_CONTAINER (self), priv->top_vbox);
287
288         gtk_widget_show (priv->folder_view);
289         gtk_widget_show (pannable);
290         gtk_widget_show (priv->top_vbox);
291
292         connect_signals (MODEST_FOLDER_WINDOW (self));
293
294         /* Load previous osso state, for instance if we are being restored from 
295          * hibernation:  */
296         modest_osso_load_state ();
297
298         /* Get device name */
299         modest_maemo_utils_get_device_name ();
300
301         app = hildon_program_get_instance ();
302         hildon_program_add_window (app, HILDON_WINDOW (self));
303         
304         /* Set window icon */
305         window_icon = modest_platform_get_icon (MODEST_APP_ICON, MODEST_ICON_SIZE_BIG);
306         if (window_icon) {
307                 gtk_window_set_icon (GTK_WINDOW (self), window_icon);
308                 g_object_unref (window_icon);
309         }
310
311         /* Listen for changes in the screen, we don't want to show a
312            led pattern when the display is on for example */
313         osso_hw_set_display_event_cb (modest_maemo_utils_get_osso_context (),
314                                       osso_display_event_cb,
315                                       self); 
316
317         /* Dont't restore settings here, 
318          * because it requires a gtk_widget_show(), 
319          * and we don't want to do that until later,
320          * so that the UI is not visible for non-menu D-Bus activation.
321          */
322
323         return MODEST_WINDOW(self);
324 }
325
326 static gboolean
327 on_zoom_minus_plus_not_implemented (ModestWindow *window)
328 {
329         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW (window), FALSE);
330
331         hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_cannot_zoom_here"));
332         return FALSE;
333
334 }
335
336 gboolean
337 modest_folder_window_screen_is_on (ModestFolderWindow *self)
338 {
339         ModestFolderWindowPrivate *priv = NULL;
340
341         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(self), FALSE);
342
343         priv = MODEST_FOLDER_WINDOW_GET_PRIVATE (self);
344         
345         return (priv->display_state == OSSO_DISPLAY_ON) ? TRUE : FALSE;
346 }
347
348 ModestFolderView *
349 modest_folder_window_get_folder_view (ModestFolderWindow *self)
350 {
351         ModestFolderWindowPrivate *priv = NULL;
352
353         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(self), FALSE);
354
355         priv = MODEST_FOLDER_WINDOW_GET_PRIVATE (self);
356         
357         return MODEST_FOLDER_VIEW (priv->folder_view);
358 }
359
360 void
361 modest_folder_window_set_account (ModestFolderWindow *self,
362                                   const gchar *account_name)
363 {
364         ModestFolderWindowPrivate *priv = NULL;
365         ModestAccountMgr *mgr;
366         ModestAccountSettings *settings = NULL;
367         ModestServerAccountSettings *store_settings = NULL;
368
369         g_return_if_fail (MODEST_IS_FOLDER_WINDOW(self));
370
371         priv = MODEST_FOLDER_WINDOW_GET_PRIVATE (self);
372         
373         /* Get account data */
374         mgr = modest_runtime_get_account_mgr ();
375
376         settings = modest_account_mgr_load_account_settings (mgr, account_name);
377         if (!settings)
378                 goto free_refs;
379
380         store_settings = modest_account_settings_get_store_settings (settings);
381         if (!store_settings)
382                 goto free_refs;
383
384         modest_folder_view_set_account_id_of_visible_server_account 
385                 (MODEST_FOLDER_VIEW (priv->folder_view),
386                  modest_server_account_settings_get_account_name (store_settings));
387
388         modest_window_set_active_account (MODEST_WINDOW (self), account_name);
389         gtk_window_set_title (GTK_WINDOW (self), 
390                               modest_account_settings_get_display_name (settings));
391
392 free_refs:
393         if (store_settings) 
394                 g_object_unref (store_settings);
395         if (settings)
396                 g_object_unref (settings);
397
398 }
399
400 static void add_to_menu (ModestFolderWindow *self,
401                          HildonAppMenu *menu,
402                          gchar *label,
403                          GCallback callback,
404                          ModestDimmingRulesGroup *group,
405                          GCallback dimming_callback)
406 {
407         GtkWidget *button;
408
409         button = gtk_button_new_with_label (label);
410         g_signal_connect_after (G_OBJECT (button), "clicked",
411                                 callback, (gpointer) self);
412         if (dimming_callback)
413                 modest_dimming_rules_group_add_widget_rule (group,
414                                                             button,
415                                                             dimming_callback,
416                                                             MODEST_WINDOW (self));
417         hildon_app_menu_append (menu, GTK_BUTTON (button));
418 }
419
420 static void setup_menu (ModestFolderWindow *self,
421                         ModestDimmingRulesGroup *group)
422 {
423         ModestFolderWindowPrivate *priv = NULL;
424
425         g_return_if_fail (MODEST_IS_FOLDER_WINDOW(self));
426
427         priv = MODEST_FOLDER_WINDOW_GET_PRIVATE (self);
428
429         priv->app_menu = hildon_app_menu_new ();
430
431         /* folders actions */
432         add_to_menu (self, HILDON_APP_MENU (priv->app_menu), _("TODO: new folder"),
433                      G_CALLBACK (modest_ui_actions_on_new_folder),
434                      group, NULL);
435         add_to_menu (self, HILDON_APP_MENU (priv->app_menu), _("mcen_me_user_renamefolder"),
436                      G_CALLBACK (set_rename_edit_mode),
437                      group, NULL);
438         add_to_menu (self, HILDON_APP_MENU (priv->app_menu), _("TODO: move folder"),
439                      G_CALLBACK (set_moveto_edit_mode),
440                      group, NULL);
441         add_to_menu (self, HILDON_APP_MENU (priv->app_menu), _("TODO: delete folder"),
442                      G_CALLBACK (set_delete_edit_mode),
443                      group, NULL);
444
445         /* new message */
446         add_to_menu (self, HILDON_APP_MENU (priv->app_menu), _("mcen_me_viewer_newemail"),
447                      G_CALLBACK (modest_ui_actions_on_new_msg),
448                      group, NULL);
449
450         /* send receive actions should be only one visible always */
451         add_to_menu (self, HILDON_APP_MENU (priv->app_menu), _("mcen_me_inbox_sendandreceive"),
452                      G_CALLBACK (modest_ui_actions_on_send_receive),
453                      group, G_CALLBACK (modest_ui_dimming_rules_on_send_receive_all));
454         add_to_menu (self, HILDON_APP_MENU (priv->app_menu), _("mcen_me_outbox_cancelsend"),
455                      G_CALLBACK (modest_ui_actions_cancel_send),
456                      group, G_CALLBACK (modest_ui_dimming_rules_on_cancel_sending_all));
457
458         /* Settings menu buttons */
459         add_to_menu (self, HILDON_APP_MENU (priv->app_menu), _("TODO: new account"),
460                      G_CALLBACK (modest_ui_actions_on_new_account),
461                      group, NULL);
462         add_to_menu (self, HILDON_APP_MENU (priv->app_menu), _("TODO: edit accounts"),
463                      G_CALLBACK (modest_ui_actions_on_accounts),
464                      group, NULL);
465         add_to_menu (self, HILDON_APP_MENU (priv->app_menu), _("mcen_me_inbox_options"),
466                      G_CALLBACK (modest_ui_actions_on_settings),
467                      group, NULL);
468         add_to_menu (self, HILDON_APP_MENU (priv->app_menu), _("mcen_me_inbox_globalsmtpservers"),
469                      G_CALLBACK (modest_ui_actions_on_smtp_servers),
470                      group, G_CALLBACK (modest_ui_dimming_rules_on_tools_smtp_servers));
471         
472         hildon_stackable_window_set_main_menu (HILDON_STACKABLE_WINDOW (self), 
473                                                HILDON_APP_MENU (priv->app_menu));
474 }
475
476 static gboolean 
477 modest_folder_window_toggle_menu (HildonWindow *window,
478                                   guint button,
479                                   guint32 time)
480 {
481         ModestFolderWindowPrivate *priv = NULL;
482
483         priv = MODEST_FOLDER_WINDOW_GET_PRIVATE (window);
484
485         modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
486
487         gtk_widget_queue_resize (priv->app_menu);
488
489         return HILDON_WINDOW_CLASS (parent_class)->toggle_menu (window, button, time);
490 }
491
492 static void
493 on_folder_activated (ModestFolderView *folder_view,
494                      TnyFolder *folder,
495                      gpointer userdata)
496 {
497         ModestFolderWindowPrivate *priv = NULL;
498         ModestWindow *headerwin;
499         ModestFolderWindow *self = (ModestFolderWindow *) userdata;
500
501         g_return_if_fail (MODEST_IS_FOLDER_WINDOW(self));
502
503         priv = MODEST_FOLDER_WINDOW_GET_PRIVATE (self);
504
505         if (!folder)
506                 return;
507
508         if (!TNY_IS_FOLDER (folder))
509                 return;
510
511         headerwin = modest_header_window_new (folder);
512         modest_window_mgr_register_window (modest_runtime_get_window_mgr (), 
513                                            MODEST_WINDOW (headerwin),
514                                            MODEST_WINDOW (self));
515
516         modest_window_set_active_account (MODEST_WINDOW (headerwin), 
517                                           modest_window_get_active_account (MODEST_WINDOW (self)));
518         gtk_widget_show (GTK_WIDGET (headerwin));
519 }
520
521 static void
522 set_edit_mode (ModestFolderWindow *self,
523                EditModeCommand command)
524 {
525         ModestFolderWindowPrivate *priv;
526
527         priv = MODEST_FOLDER_WINDOW_GET_PRIVATE (self);
528         if (priv->edit_toolbar) {
529                 gtk_widget_destroy (priv->edit_toolbar);
530                 priv->edit_toolbar = NULL;
531         }
532
533         if (command == EDIT_MODE_COMMAND_NONE) {
534                 if (priv->edit_mode) {
535                         priv->edit_mode = FALSE;
536                         priv->edit_command = command;
537                         g_object_set (G_OBJECT (priv->folder_view), 
538                                       "hildon-ui-mode", HILDON_UI_MODE_NORMAL, 
539                                       NULL);
540                         gtk_widget_queue_resize (priv->folder_view);
541                         gtk_window_unfullscreen (GTK_WINDOW (self));
542                 }
543         } else {
544                 if (!priv->edit_mode) {
545                         GtkTreeSelection *selection;
546
547                         g_object_set (G_OBJECT (priv->folder_view),
548                                       "hildon-ui-mode", HILDON_UI_MODE_EDIT,
549                                       NULL);
550                         selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->folder_view));
551                         gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
552                         gtk_tree_selection_unselect_all (selection);
553
554                         priv->edit_mode = TRUE;
555                         priv->edit_command = command;
556
557                         /* Setup toolbar */
558                         priv->edit_toolbar = hildon_edit_toolbar_new ();
559                         switch (command) {
560                         case EDIT_MODE_COMMAND_DELETE:
561                                 hildon_edit_toolbar_set_label (HILDON_EDIT_TOOLBAR (priv->edit_toolbar),
562                                                                _("TODO: Select folder to delete"));
563                                 hildon_edit_toolbar_set_button_label (HILDON_EDIT_TOOLBAR (priv->edit_toolbar),
564                                                                       _("TODO: Delete"));
565                                 break;
566                         case EDIT_MODE_COMMAND_MOVE:
567                                 hildon_edit_toolbar_set_label (HILDON_EDIT_TOOLBAR (priv->edit_toolbar),
568                                                                _("TODO: Select folder to move"));
569                                 hildon_edit_toolbar_set_button_label (HILDON_EDIT_TOOLBAR (priv->edit_toolbar),
570                                                                       _("TODO: Move"));
571                                 break;
572                         case EDIT_MODE_COMMAND_RENAME:
573                                 hildon_edit_toolbar_set_label (HILDON_EDIT_TOOLBAR (priv->edit_toolbar),
574                                                                _("TODO: Select folder to rename"));
575                                 hildon_edit_toolbar_set_button_label (HILDON_EDIT_TOOLBAR (priv->edit_toolbar),
576                                                                       _("TODO: Rename"));
577                                 break;
578                         case EDIT_MODE_COMMAND_NONE:
579                                 g_assert ("Shouldn't reach");
580                         }
581                         gtk_box_pack_start (GTK_BOX (priv->top_vbox), priv->edit_toolbar, FALSE, FALSE, 0);
582                         g_signal_connect (G_OBJECT (priv->edit_toolbar), "button-clicked",
583                                           G_CALLBACK (edit_toolbar_button_clicked), (gpointer) self);
584                         g_signal_connect (G_OBJECT (priv->edit_toolbar), "arrow-clicked",
585                                           G_CALLBACK (edit_toolbar_arrow_clicked), (gpointer) self);
586                         gtk_widget_show (priv->edit_toolbar);
587
588                         gtk_widget_queue_resize (priv->folder_view);
589                         gtk_window_fullscreen (GTK_WINDOW (self));
590                 }
591         }
592 }
593
594 static void
595 edit_toolbar_button_clicked (HildonEditToolbar *toolbar,
596                              ModestFolderWindow *self)
597 {
598         ModestFolderWindowPrivate *priv = MODEST_FOLDER_WINDOW_GET_PRIVATE (self);
599
600         switch (priv->edit_command) {
601         case EDIT_MODE_COMMAND_DELETE:
602                 if (modest_ui_actions_on_edit_mode_delete_folder (MODEST_WINDOW (self)))
603                         set_edit_mode (self, EDIT_MODE_COMMAND_NONE);
604                 break;
605         case EDIT_MODE_COMMAND_MOVE:
606                 if (modest_ui_actions_on_edit_mode_move_to (MODEST_WINDOW (self)))
607                         set_edit_mode (self, EDIT_MODE_COMMAND_NONE);
608                 break;
609         case EDIT_MODE_COMMAND_RENAME:
610                 if (modest_ui_actions_on_edit_mode_rename_folder (MODEST_WINDOW (self)))
611                         set_edit_mode (self, EDIT_MODE_COMMAND_NONE);
612                 break;
613         case EDIT_MODE_COMMAND_NONE:
614                         g_assert_not_reached ();
615         }
616 }
617
618 static void
619 edit_toolbar_arrow_clicked (HildonEditToolbar *toolbar,
620                             ModestFolderWindow *self)
621 {
622         set_edit_mode (self, EDIT_MODE_COMMAND_NONE);
623 }
624
625 static void
626 set_delete_edit_mode (GtkButton *button,
627                       ModestFolderWindow *self)
628 {
629         set_edit_mode (self, EDIT_MODE_COMMAND_DELETE);
630 }
631
632 static void
633 set_moveto_edit_mode (GtkButton *button,
634                       ModestFolderWindow *self)
635 {
636         set_edit_mode (self, EDIT_MODE_COMMAND_MOVE);
637 }
638
639 static void
640 set_rename_edit_mode (GtkButton *button,
641                       ModestFolderWindow *self)
642 {
643         set_edit_mode (self, EDIT_MODE_COMMAND_RENAME);
644 }
645