2007-06-10 Johannes Schmid <johannes.schmid@openismus.com>
[modest] / src / maemo / modest-main-window.c
index 58c2495..43b8a84 100644 (file)
 
 #define MODEST_MAIN_WINDOW_ACTION_GROUP_ADDITIONS "ModestMainWindowActionAdditions"
 
+#define XALIGN 0.5
+#define YALIGN 0.5
+#define XSPACE 1
+#define YSPACE 0
+
 /* 'private'/'protected' functions */
 static void modest_main_window_class_init    (ModestMainWindowClass *klass);
 static void modest_main_window_init          (ModestMainWindow *obj);
@@ -117,6 +122,10 @@ static void on_refresh_account_action_activated   (GtkAction *action,
 
 static void on_send_receive_csm_activated         (GtkMenuItem *item,
                                                   gpointer user_data);
+
+
+static GtkWidget * create_empty_view (void);
+
 /* list my signals */
 enum {
        /* MY_SIGNAL_1, */
@@ -131,6 +140,7 @@ struct _ModestMainWindowPrivate {
        GtkWidget *main_paned;
        GtkWidget *main_vbox;
        GtkWidget *contents_widget;
+       GtkWidget *empty_view;
 
        /* Progress observers */
        GtkWidget        *progress_bar;
@@ -153,6 +163,9 @@ struct _ModestMainWindowPrivate {
        /* Optimized view enabled */
        gboolean optimized_view;
 
+       /* Optimized view enabled */
+       gboolean send_receive_in_progress;
+
        ModestHeaderView *header_view;
        ModestFolderView *folder_view;
 
@@ -189,10 +202,24 @@ static const GtkActionEntry modest_folder_view_action_entries [] = {
        { "FolderViewCSMRenameFolder", NULL, N_("mcen_me_user_renamefolder"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_rename_folder) },
        { "FolderViewCSMPasteMsgs", NULL, N_("mcen_me_inbox_paste"), NULL, NULL, NULL },
        { "FolderViewCSMDeleteFolder", NULL, N_("mcen_me_inbox_delete"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_delete_folder) },
-       { "FolderViewCSMSearchMessages", NULL, N_("mcen_me_inbox_search"), NULL, NULL, NULL },
+       { "FolderViewCSMSearchMessages", NULL, N_("mcen_me_inbox_search"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_search_messages) },
        { "FolderViewCSMHelp", NULL, N_("mcen_me_inbox_help"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_help) },
 };
 
+static const GtkActionEntry modest_header_view_action_entries [] = {
+
+       /* Header View CSM actions */
+       { "HeaderViewCSMOpen",          NULL,  N_("mcen_me_inbox_open"),        NULL,       NULL, G_CALLBACK (modest_ui_actions_on_new_folder) },
+       { "HeaderViewCSMReply",         NULL,  N_("mcen_me_inbox_reply"),       NULL,      NULL, G_CALLBACK (modest_ui_actions_on_reply) },
+       { "HeaderViewCSMReplyAll",      NULL,  N_("mcen_me_inbox_replytoall"),  NULL,      NULL, G_CALLBACK (modest_ui_actions_on_reply_all) },
+       { "HeaderViewCSMForward",       NULL,  N_("mcen_me_inbox_forward"),     NULL,      NULL, G_CALLBACK (modest_ui_actions_on_forward) },
+       { "HeaderViewCSMCut",           NULL,  N_("mcen_me_inbox_cut"),         "<CTRL>X", NULL, G_CALLBACK (modest_ui_actions_on_cut) },
+       { "HeaderViewCSMCopy",          NULL,  N_("mcen_me_inbox_copy"),        "<CTRL>C", NULL, G_CALLBACK (modest_ui_actions_on_copy) },
+       { "HeaderViewCSMPaste",         NULL,  N_("mcen_me_inbox_paste"),       "<CTRL>V", NULL, G_CALLBACK (modest_ui_actions_on_paste) },
+       { "HeaderViewCSMDelete",        NULL,  N_("mcen_me_inbox_delete"),      NULL,      NULL, G_CALLBACK (modest_ui_actions_on_delete) },
+       { "HeaderViewCSMCancelSending", NULL,  N_("mcen_me_outbox_cancelsend"), NULL,      NULL, NULL },
+       { "HeaderViewCSMHelp",          NULL,  N_("mcen_me_inbox_help"),        NULL,      NULL, G_CALLBACK (modest_ui_actions_on_help) },
+};
 
 static const GtkToggleActionEntry modest_main_window_toggle_action_entries [] = {
        { "ToolbarToggleView", MODEST_STOCK_SPLIT_VIEW, N_("gqn_toolb_rss_fldonoff"), "<CTRL>t", NULL, G_CALLBACK (modest_ui_actions_toggle_folders_view), FALSE },
@@ -255,6 +282,7 @@ modest_main_window_init (ModestMainWindow *obj)
        priv->contents_widget  = NULL;
        priv->accounts_popup  = NULL;
        priv->details_widget  = NULL;
+       priv->empty_view  = NULL;
 
        priv->progress_widgets  = NULL;
        priv->progress_bar = NULL;
@@ -266,6 +294,7 @@ modest_main_window_init (ModestMainWindow *obj)
        priv->merge_ids = NULL;
 
        priv->optimized_view  = FALSE;
+       priv->send_receive_in_progress  = FALSE;
        priv->progress_bar_timeout = 0;
 }
 
@@ -314,7 +343,6 @@ modest_main_window_get_child_widget (ModestMainWindow *self,
 }
 
 
-
 static void
 restore_settings (ModestMainWindow *self)
 {
@@ -440,9 +468,19 @@ _folder_view_csm_menu_activated (GtkWidget *widget, gpointer user_data)
        g_return_if_fail (MODEST_IS_MAIN_WINDOW (user_data));
 
        /* Update dimmed */     
-       modest_window_check_dimming_rules (MODEST_WINDOW (user_data));  
+       modest_window_check_dimming_rules_group (MODEST_WINDOW (user_data), "ModestMenuDimmingRules");  
 }
 
+static void
+_header_view_csm_menu_activated (GtkWidget *widget, gpointer user_data)
+{
+       g_return_if_fail (MODEST_IS_MAIN_WINDOW (user_data));
+
+       /* Update visibility */
+
+       /* Update dimmed */     
+       modest_window_check_dimming_rules_group (MODEST_WINDOW (user_data), "ModestMenuDimmingRules");  
+}
 
 static void
 connect_signals (ModestMainWindow *self)
@@ -462,6 +500,7 @@ connect_signals (ModestMainWindow *self)
        g_signal_connect (G_OBJECT(priv->folder_view), "folder-display-name-changed",
                          G_CALLBACK(modest_ui_actions_on_folder_display_name_changed), self);
 
+       /* Folder view CSM */
        menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/FolderViewCSM");
        gtk_widget_tap_and_hold_setup (GTK_WIDGET (priv->folder_view), menu, NULL, 0);
        g_signal_connect (G_OBJECT(priv->folder_view), "tap-and-hold",
@@ -479,6 +518,13 @@ connect_signals (ModestMainWindow *self)
        g_signal_connect (G_OBJECT(priv->header_view), "key-press-event",
                          G_CALLBACK(on_inner_widgets_key_pressed), self);
 
+       /* Header view CSM */
+       menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/HeaderViewCSM");
+       gtk_widget_tap_and_hold_setup (GTK_WIDGET (priv->header_view), menu, NULL, 0);
+       g_signal_connect (G_OBJECT(priv->header_view), "tap-and-hold",
+                         G_CALLBACK(_header_view_csm_menu_activated),
+                         self);
+       
        /* window */
        g_signal_connect (G_OBJECT(self), "delete-event", G_CALLBACK(on_delete_event), self);
        g_signal_connect (G_OBJECT (self), "window-state-event",
@@ -518,7 +564,7 @@ connect_signals (ModestMainWindow *self)
 gboolean
 sync_accounts_cb (ModestMainWindow *win)
 {
-       modest_ui_actions_do_send_receive (NULL, MODEST_WINDOW (win));
+       modest_ui_actions_on_send_receive (NULL, MODEST_WINDOW (win));
        return FALSE; /* Do not call this idle handler again. */
 }
 #endif
@@ -570,7 +616,8 @@ modest_main_window_new (void)
        ModestMainWindowPrivate *priv = NULL;
        ModestWindowPrivate *parent_priv = NULL;
        GtkWidget *folder_win = NULL;
-       ModestDimmingRulesGroup *rules_group = NULL;
+       ModestDimmingRulesGroup *menu_rules_group = NULL;
+       ModestDimmingRulesGroup *toolbar_rules_group = NULL;
        GtkActionGroup *action_group = NULL;
        GError *error = NULL;
        TnyFolderStoreQuery *query = NULL;
@@ -588,7 +635,8 @@ modest_main_window_new (void)
        action_group = gtk_action_group_new ("ModestMainWindowActions");
        gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
 
-       rules_group = modest_dimming_rules_group_new ("ModestCommonDimmingRules");
+       menu_rules_group = modest_dimming_rules_group_new ("ModestMenuDimmingRules");
+       toolbar_rules_group = modest_dimming_rules_group_new ("ModestToolbarDimmingRules");
 
        /* Add common actions */
        gtk_action_group_add_actions (action_group,
@@ -601,6 +649,11 @@ modest_main_window_new (void)
                                      G_N_ELEMENTS (modest_folder_view_action_entries),
                                      self);
 
+       gtk_action_group_add_actions (action_group,
+                                     modest_header_view_action_entries,
+                                     G_N_ELEMENTS (modest_header_view_action_entries),
+                                     self);
+
        gtk_action_group_add_toggle_actions (action_group,
                                             modest_toggle_action_entries,
                                             G_N_ELEMENTS (modest_toggle_action_entries),
@@ -624,14 +677,20 @@ modest_main_window_new (void)
        }
 
        /* Add common dimming rules */
-       modest_dimming_rules_group_add_rules (rules_group, 
-                                             modest_dimming_entries,
-                                             G_N_ELEMENTS (modest_dimming_entries),
+       modest_dimming_rules_group_add_rules (menu_rules_group, 
+                                             modest_main_window_menu_dimming_entries,
+                                             G_N_ELEMENTS (modest_main_window_menu_dimming_entries),
+                                             self);
+       modest_dimming_rules_group_add_rules (toolbar_rules_group, 
+                                             modest_main_window_toolbar_dimming_entries,
+                                             G_N_ELEMENTS (modest_main_window_toolbar_dimming_entries),
                                              self);
 
        /* Insert dimming rules group for this window */
-       modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, rules_group);                                                     
-       g_object_unref (rules_group);
+       modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, menu_rules_group);
+       modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, toolbar_rules_group);
+       g_object_unref (menu_rules_group);
+       g_object_unref (toolbar_rules_group);
        
        /* Add accelerators */
        gtk_window_add_accel_group (GTK_WINDOW (self), 
@@ -670,7 +729,10 @@ modest_main_window_new (void)
        if (!priv->header_view)
                g_printerr ("modest: cannot instantiate header view\n");
        modest_header_view_set_style (priv->header_view, MODEST_HEADER_VIEW_STYLE_TWOLINES);
-       
+
+       /* Empty view */ 
+       priv->empty_view = create_empty_view ();
+                
        /* Create scrolled windows */
        folder_win = gtk_scrolled_window_new (NULL, NULL);
        priv->contents_widget = gtk_scrolled_window_new (NULL, NULL);
@@ -1203,7 +1265,21 @@ set_alignment (GtkWidget *widget,
 }
 
 static GtkWidget *
-create_details_widget (TnyFolderStore *folder_store)
+create_empty_view (void)
+{
+       GtkLabel *label = NULL;
+       GtkWidget *align = NULL;
+
+       align = gtk_alignment_new(XALIGN, YALIGN, XSPACE, YSPACE);
+       label = GTK_LABEL(gtk_label_new (_("mcen_ia_nomessages")));
+       gtk_label_set_justify (label, GTK_JUSTIFY_CENTER);      
+       gtk_container_add (GTK_CONTAINER (align), GTK_WIDGET(label));
+
+       return GTK_WIDGET(align);
+}
+
+static GtkWidget *
+create_details_widget (TnyAccount *account)
 {
        GtkWidget *vbox;
        gchar *label;
@@ -1212,22 +1288,19 @@ create_details_widget (TnyFolderStore *folder_store)
 
        /* Account description: */
        
-       if (modest_tny_folder_store_is_virtual_local_folders (folder_store)) {
+       if (modest_tny_account_is_virtual_local_folders (account)) {
                /* Local folders: */
        
                /* Get device name */
                gchar *device_name = modest_conf_get_string (modest_runtime_get_conf(),
                                                      MODEST_CONF_DEVICE_NAME, NULL);
    
-               label = g_strdup_printf ("%s: %s",
-                                        _("mcen_fi_localroot_description"),
+               label = g_strdup_printf (_("mcen_fi_localroot_description"),
                                         device_name);
                gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new (label), FALSE, FALSE, 0);
                g_free (device_name);
                g_free (label);
-       } else if (TNY_IS_ACCOUNT (folder_store)) {
-               TnyAccount *account = TNY_ACCOUNT(folder_store);
-               
+       } else {
                if(!strcmp (tny_account_get_id (account), MODEST_MMC_ACCOUNT_ID)) {
                        gtk_box_pack_start (GTK_BOX (vbox), 
                                gtk_label_new (tny_account_get_name (account)), 
@@ -1236,15 +1309,18 @@ create_details_widget (TnyFolderStore *folder_store)
                        /* Other accounts, such as IMAP and POP: */
                        
                        GString *proto;
+                       gchar *tmp;
        
                        /* Put proto in uppercase */
                        proto = g_string_new (tny_account_get_proto (account));
                        proto = g_string_ascii_up (proto);
-       
-                       label = g_strdup_printf ("%s %s: %s", 
-                                                proto->str,
-                                                _("mcen_fi_remoteroot_account"),
-                                                tny_account_get_name (account));
+                       
+                       /* note: mcen_fi_localroot_description is something like "%s account"
+                        * however, we should display "%s account: %s"... therefore, ugly tmp */
+                       tmp   = g_strdup_printf (_("mcen_fi_remoteroot_account"),proto->str);
+                       label = g_strdup_printf ("%s: %s", tmp,tny_account_get_name (account));
+                       g_free (tmp);
+
                        gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new (label), FALSE, FALSE, 0);
                        g_string_free (proto, TRUE);
                        g_free (label);
@@ -1252,7 +1328,7 @@ create_details_widget (TnyFolderStore *folder_store)
        }
 
        /* Message count */
-       
+       TnyFolderStore *folder_store = TNY_FOLDER_STORE (account);
        label = g_strdup_printf ("%s: %d", _("mcen_fi_rootfolder_messages"), 
                                 modest_tny_folder_store_get_message_count (folder_store));
        gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new (label), FALSE, FALSE, 0);
@@ -1265,7 +1341,7 @@ create_details_widget (TnyFolderStore *folder_store)
        g_free (label);
 
        /* Size / Date */
-       if (modest_tny_folder_store_is_virtual_local_folders (folder_store)) {
+       if (modest_tny_account_is_virtual_local_folders (account)) {
                /* FIXME: format size */
                label = g_strdup_printf ("%s: %d", _("mcen_fi_rootfolder_size"), 
                                         modest_tny_folder_store_get_local_size (folder_store));
@@ -1274,28 +1350,22 @@ create_details_widget (TnyFolderStore *folder_store)
        } else if (TNY_IS_ACCOUNT(folder_store)) {
                TnyAccount *account = TNY_ACCOUNT(folder_store);
                
-               if (!strcmp (tny_account_get_id (account), MODEST_MMC_ACCOUNT_ID)) {
-                       gtk_box_pack_start (GTK_BOX (vbox), 
-                               gtk_label_new (tny_account_get_name (account)),
-                               FALSE, FALSE, 0);
-               } else {
-                       time_t last_updated;
-                       gchar *last_updated_string;
-                       /* Get last updated from configuration */
-                       last_updated = modest_account_mgr_get_int (modest_runtime_get_account_mgr (), 
-                                                                 tny_account_get_id (account), 
-                                                                 MODEST_ACCOUNT_LAST_UPDATED, 
-                                                                 TRUE);
-                       if (last_updated > 0) 
-                               last_updated_string = modest_text_utils_get_display_date(last_updated);
-                       else
-                               last_updated_string = g_strdup (_("FIXME: Never"));
-       
-                       label = g_strdup_printf ("%s: %s", _("mcen_ti_lastupdated"), last_updated_string);
-                       gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new (label), FALSE, FALSE, 0);
-                       g_free (last_updated_string);
-                       g_free (label);
-               }
+               time_t last_updated;
+               gchar *last_updated_string;
+               /* Get last updated from configuration */
+               last_updated = modest_account_mgr_get_int (modest_runtime_get_account_mgr (), 
+                                                         tny_account_get_id (account), 
+                                                         MODEST_ACCOUNT_LAST_UPDATED, 
+                                                         TRUE);
+               if (last_updated > 0) 
+                       last_updated_string = modest_text_utils_get_display_date(last_updated);
+               else
+                       last_updated_string = g_strdup (_("FIXME: Never"));
+
+               label = g_strdup_printf ("%s: %s", _("mcen_ti_lastupdated"), last_updated_string);
+               gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new (label), FALSE, FALSE, 0);
+               g_free (last_updated_string);
+               g_free (label);
        }
 
        /* Set alignment */
@@ -1305,6 +1375,39 @@ create_details_widget (TnyFolderStore *folder_store)
 }
 
 void 
+modest_main_window_notify_send_receive_initied (ModestMainWindow *self)
+{
+       GtkAction *action = NULL;
+       GtkWidget *widget = NULL;
+
+       g_return_if_fail (MODEST_IS_MAIN_WINDOW (self));
+
+        action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveAllMenu");        
+       gtk_action_set_sensitive (action, FALSE);
+        action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveCancelSendingMenu");      
+       gtk_action_set_sensitive (action, FALSE);
+        widget = modest_window_get_action_widget (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsMenuAdditions");      
+       gtk_widget_set_sensitive (widget, FALSE);
+} 
+
+void 
+modest_main_window_notify_send_receive_completed (ModestMainWindow *self)
+{
+       GtkAction *action = NULL;
+       GtkWidget *widget = NULL;
+
+       g_return_if_fail (MODEST_IS_MAIN_WINDOW (self));
+
+        action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveAllMenu");        
+       gtk_action_set_sensitive (action, TRUE);
+        action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveCancelSendingMenu");      
+       gtk_action_set_sensitive (action, TRUE);
+        widget = modest_window_get_action_widget (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsMenuAdditions");      
+       gtk_widget_set_sensitive (widget, TRUE);
+} 
+
+
+void 
 modest_main_window_set_contents_style (ModestMainWindow *self, 
                                       ModestMainWindowContentsStyle style)
 {
@@ -1318,15 +1421,20 @@ modest_main_window_set_contents_style (ModestMainWindow *self,
           set if there are details, because it could happen when we're
           selecting different accounts consecutively */
        if ((priv->contents_style == style) &&
-           (priv->contents_style == MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS))
+           (priv->contents_style != MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS))
                return;
 
        /* Remove previous child. Delete it if it was an account
           details widget */
        GtkWidget *content = gtk_bin_get_child (GTK_BIN (priv->contents_widget));
        if (content) {
-               if (priv->contents_style != MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS)
+               if (priv->contents_style == MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS)
                        g_object_ref (content);
+               else if (priv->contents_style == MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY) {
+                       g_object_ref (priv->empty_view);
+                       gtk_container_remove (GTK_CONTAINER (content), priv->empty_view);
+               }
+               
                gtk_container_remove (GTK_CONTAINER (priv->contents_widget), content);
        }
 
@@ -1341,13 +1449,18 @@ modest_main_window_set_contents_style (ModestMainWindow *self,
                /* TODO: show here account details */
                TnyFolderStore *selected_folderstore = 
                        modest_folder_view_get_selected (priv->folder_view);
-                       
-               priv->details_widget = create_details_widget (selected_folderstore);
+               if (TNY_IS_ACCOUNT (selected_folderstore)) {    
+                       priv->details_widget = create_details_widget (
+                               TNY_ACCOUNT (selected_folderstore));
 
-               wrap_in_scrolled_window (priv->contents_widget, 
-                                priv->details_widget);
+                       wrap_in_scrolled_window (priv->contents_widget, 
+                                        priv->details_widget);
+               }
                break;
        }
+       case MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY:
+               wrap_in_scrolled_window (priv->contents_widget, GTK_WIDGET (priv->empty_view));
+               break;
        default:
                g_return_if_reached ();
        }
@@ -1375,7 +1488,7 @@ on_configuration_key_changed (ModestConf* conf,
 
        account = (TnyAccount *) modest_folder_view_get_selected (priv->folder_view);
        if (TNY_IS_ACCOUNT (account) &&
-           !strcmp (tny_account_get_id (account), MODEST_ACTUAL_LOCAL_FOLDERS_ACCOUNT_ID)) {
+           !strcmp (tny_account_get_id (account), MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
                GList *children;
                GtkLabel *label;
                const gchar *device_name;