* Added folder view CSM
authorSergio Villar Senin <svillar@igalia.com>
Mon, 23 Apr 2007 17:37:22 +0000 (17:37 +0000)
committerSergio Villar Senin <svillar@igalia.com>
Mon, 23 Apr 2007 17:37:22 +0000 (17:37 +0000)
* Refactored the show details code
* Added support to show the msg details from Main view
* Added a missing license information to a file
* Implemented the folder count method in ModestTnyAccount

pmo-trunk-r1640

src/gnome/modest-main-window.c
src/maemo/modest-main-window-ui.h
src/maemo/modest-main-window.c
src/maemo/ui/modest-main-window-ui.xml
src/modest-tny-account.c
src/modest-ui-actions.c
src/modest-ui-actions.h
src/widgets/modest-msg-view-details-dialog.c

index 62a0bf9..97beef2 100644 (file)
@@ -561,7 +561,7 @@ on_header_view_button_press_event (ModestHeaderView *header_view,
                ModestWindowPrivate *parent_priv;
        
                parent_priv = MODEST_WINDOW_GET_PRIVATE (self);
                ModestWindowPrivate *parent_priv;
        
                parent_priv = MODEST_WINDOW_GET_PRIVATE (self);
-               menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/HeaderViewContextMenu");
+               menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/HeaderViewCSM");
 
                return show_context_popup_menu (self,
                                                GTK_TREE_VIEW (header_view), 
 
                return show_context_popup_menu (self,
                                                GTK_TREE_VIEW (header_view), 
@@ -582,7 +582,7 @@ on_folder_view_button_press_event (ModestFolderView *folder_view,
                ModestWindowPrivate *parent_priv;
        
                parent_priv = MODEST_WINDOW_GET_PRIVATE (self);
                ModestWindowPrivate *parent_priv;
        
                parent_priv = MODEST_WINDOW_GET_PRIVATE (self);
-               menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/FolderViewContextMenu");
+               menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/FolderViewCSM");
 
                return show_context_popup_menu (self,
                                                GTK_TREE_VIEW (folder_view), 
 
                return show_context_popup_menu (self,
                                                GTK_TREE_VIEW (folder_view), 
index bc8cd41..381db7b 100644 (file)
@@ -62,7 +62,7 @@ static const GtkActionEntry modest_action_entries [] = {
        { "EmailForward",     NULL,  N_("mcen_me_inbox_forward"),          NULL,      NULL,   G_CALLBACK (modest_ui_actions_on_forward) },
        { "EmailDelete",      NULL,  N_("mcen_me_inbox_delete"),    NULL,      NULL,   G_CALLBACK (modest_ui_actions_on_delete) },
        { "EmailContents",    NULL,  N_("mcen_me_inbox_retrieve_contents"), NULL,      NULL,   NULL },
        { "EmailForward",     NULL,  N_("mcen_me_inbox_forward"),          NULL,      NULL,   G_CALLBACK (modest_ui_actions_on_forward) },
        { "EmailDelete",      NULL,  N_("mcen_me_inbox_delete"),    NULL,      NULL,   G_CALLBACK (modest_ui_actions_on_delete) },
        { "EmailContents",    NULL,  N_("mcen_me_inbox_retrieve_contents"), NULL,      NULL,   NULL },
-       { "EmailDetails",     NULL,  N_("mcen_me_inbox_messagedetails"),        NULL,      NULL,   G_CALLBACK (modest_ui_actions_on_message_details) },
+       { "EmailDetails",     NULL,  N_("mcen_me_inbox_messagedetails"),        NULL,      NULL,   G_CALLBACK (modest_ui_actions_on_details) },
        { "EmailPurgeAttachments", NULL, N_("mcen_me_inbox_remove_attachments"), NULL,  NULL,   NULL },
        
 
        { "EmailPurgeAttachments", NULL, N_("mcen_me_inbox_remove_attachments"), NULL,  NULL,   NULL },
        
 
index 3e85f7c..6012e9e 100644 (file)
@@ -124,8 +124,20 @@ typedef struct _GetMsgAsyncHelper {
 /* globals */
 static GtkWindowClass *parent_class = NULL;
 
 /* globals */
 static GtkWindowClass *parent_class = NULL;
 
-/* uncomment the following if you have defined any signals */
-/* static guint signals[LAST_SIGNAL] = {0}; */
+
+/* Private actions */
+static const GtkActionEntry modest_folder_view_action_entries [] = {
+
+       /* Folder View CSM actions */
+       { "FolderViewCSMNewFolder", NULL, N_("FIXME: New Folder"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_new_folder) },
+       { "FolderViewCSMRenameFolder", NULL, N_("mcen_me_user_renamefolder"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_rename_folder) },
+       { "FolderViewCSMPasteMsgs", NULL, N_("FIXME: Paste"), NULL, NULL, NULL },
+       { "FolderViewCSMDeleteFolder", NULL, N_("FIXME: Delete"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_delete_folder) },
+       { "FolderViewCSMSearchMessages", NULL, N_("mcen_me_inbox_search"), NULL, NULL, NULL },
+       { "FolderViewCSMHelp", NULL, N_("mcen_me_inbox_help"), NULL, NULL, NULL },
+};
+
+/************************************************************************/
 
 GType
 modest_main_window_get_type (void)
 
 GType
 modest_main_window_get_type (void)
@@ -292,7 +304,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);
 
        g_signal_connect (G_OBJECT(priv->folder_view), "folder-display-name-changed",
                          G_CALLBACK(modest_ui_actions_on_folder_display_name_changed), self);
 
-       menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/FolderViewContextMenu");
+       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);
 
        /* header view */
        gtk_widget_tap_and_hold_setup (GTK_WIDGET (priv->folder_view), menu, NULL, 0);
 
        /* header view */
@@ -364,6 +376,11 @@ modest_main_window_new (void)
                                      G_N_ELEMENTS (modest_action_entries),
                                      self);
 
                                      G_N_ELEMENTS (modest_action_entries),
                                      self);
 
+       gtk_action_group_add_actions (action_group,
+                                     modest_folder_view_action_entries,
+                                     G_N_ELEMENTS (modest_folder_view_action_entries),
+                                     self);
+
        gtk_action_group_add_toggle_actions (action_group,
                                             modest_toggle_action_entries,
                                             G_N_ELEMENTS (modest_toggle_action_entries),
        gtk_action_group_add_toggle_actions (action_group,
                                             modest_toggle_action_entries,
                                             G_N_ELEMENTS (modest_toggle_action_entries),
@@ -602,7 +619,7 @@ modest_main_window_show_toolbar (ModestWindow *self,
                reply_button = gtk_ui_manager_get_widget (parent_priv->ui_manager, 
                                                          "/ToolBar/ToolbarMessageReply");
                menu = gtk_ui_manager_get_widget (parent_priv->ui_manager,
                reply_button = gtk_ui_manager_get_widget (parent_priv->ui_manager, 
                                                          "/ToolBar/ToolbarMessageReply");
                menu = gtk_ui_manager_get_widget (parent_priv->ui_manager,
-                                                 "/ToolbarReplyContextMenu");
+                                                 "/ToolbarReplyCSM");
                gtk_widget_tap_and_hold_setup (GTK_WIDGET (reply_button), menu, NULL, 0);
 
                /* Set send & receive button tap and hold menu */
                gtk_widget_tap_and_hold_setup (GTK_WIDGET (reply_button), menu, NULL, 0);
 
                /* Set send & receive button tap and hold menu */
@@ -893,11 +910,29 @@ on_configuration_key_changed (ModestConf* conf,
        if (priv->contents_style != MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS)
                return;
 
        if (priv->contents_style != MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS)
                return;
 
-       account = TNY_ACCOUNT (modest_folder_view_get_selected (priv->folder_view));
-       if (account) 
-               if (account &&
-                   strcmp (tny_account_get_id (account), MODEST_LOCAL_FOLDERS_ACCOUNT_ID) == 0) {
-                       /* TODO: change device name */
-               }
-       
+       account = (TnyAccount *) modest_folder_view_get_selected (priv->folder_view);
+       if (TNY_IS_ACCOUNT (account) &&
+           !strcmp (tny_account_get_id (account), MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
+               GList *children;
+               GtkLabel *label;
+               const gchar *device_name;
+               gchar *new_text;
+               
+               /* Get label */
+               children = gtk_container_get_children (GTK_CONTAINER (priv->details_widget));
+               label = GTK_LABEL (children->data);
+               
+               device_name = modest_conf_get_string (modest_runtime_get_conf(),
+                                                     MODEST_CONF_DEVICE_NAME, NULL);
+               
+               new_text = g_strdup_printf ("%s: %s",
+                                           _("mcen_fi_localroot_description"),
+                                           device_name);
+               
+               gtk_label_set_text (label, new_text);
+               gtk_widget_show (GTK_WIDGET (label));
+               
+               g_free (new_text);
+               g_list_free (children);
+       }
 }
 }
index 2b739c9..15311e8 100644 (file)
     <toolitem action="ToolbarSendReceive"/>
   </toolbar>
 
     <toolitem action="ToolbarSendReceive"/>
   </toolbar>
 
-  <popup name="HeaderViewContextMenu">
+  <popup name="HeaderViewCSM">
     <menuitem action="EmailReply"/>
     <menuitem action="EmailForward"/>
   </popup>
   
     <menuitem action="EmailReply"/>
     <menuitem action="EmailForward"/>
   </popup>
   
-  <popup name="FolderViewContextMenu">
-    <menuitem action="EmailNewFolder"/>
-    <menuitem action="FoldersDelete"/>
-    <menuitem action="FoldersRename"/>
-    <menuitem action="FoldersMoveToTrash"/>
+  <popup name="FolderViewCSM">
+    <menuitem action="FolderViewCSMNewFolder"/>
+    <menuitem action="FolderViewCSMRenameFolder"/>
+    <separator/>
+    <menuitem action="FolderViewCSMPasteMsgs"/>
+    <separator/>
+    <menuitem action="FolderViewCSMDeleteFolder"/>
+    <separator/>
+    <menuitem action="FolderViewCSMSearchMessages"/>
+    <menuitem action="FolderViewCSMHelp"/>
   </popup>
 
   </popup>
 
-  <popup name="ToolbarReplyContextMenu">
+  <popup name="ToolbarReplyCSM">
     <menuitem action="ToolbarMessageForward"/>
     <menuitem action="ToolbarMessageReplyAll"/>
     <menuitem action="ToolbarMessageReply"/>
     <menuitem action="ToolbarMessageForward"/>
     <menuitem action="ToolbarMessageReplyAll"/>
     <menuitem action="ToolbarMessageReply"/>
index 0b2a71d..eee8fa1 100644 (file)
@@ -275,6 +275,7 @@ typedef gint (*TnyStatsFunc) (TnyFolderStats *stats);
 typedef struct _RecurseFoldersHelper {
        TnyStatsFunc function;
        guint sum;
 typedef struct _RecurseFoldersHelper {
        TnyStatsFunc function;
        guint sum;
+       guint folders;
 } RecurseFoldersHelper;
 
 static void
 } RecurseFoldersHelper;
 
 static void
@@ -288,6 +289,8 @@ recurse_folders (TnyFolderStore *store,
        tny_folder_store_get_folders (store, folders, query, NULL);
        iter = tny_list_create_iterator (folders);
 
        tny_folder_store_get_folders (store, folders, query, NULL);
        iter = tny_list_create_iterator (folders);
 
+       helper->folders += tny_list_get_length (folders);
+
        while (!tny_iterator_is_done (iter))
        {
                TnyFolderStats *stats;
        while (!tny_iterator_is_done (iter))
        {
                TnyFolderStats *stats;
@@ -296,7 +299,8 @@ recurse_folders (TnyFolderStore *store,
                folder = TNY_FOLDER (tny_iterator_get_current (iter));
                stats = tny_folder_get_stats (folder);
 
                folder = TNY_FOLDER (tny_iterator_get_current (iter));
                stats = tny_folder_get_stats (folder);
 
-               helper->sum += helper->function (stats);
+               if (helper->function)
+                       helper->sum += helper->function (stats);
 
                recurse_folders (TNY_FOLDER_STORE (folder), query, helper);
            
 
                recurse_folders (TNY_FOLDER_STORE (folder), query, helper);
            
@@ -311,9 +315,24 @@ recurse_folders (TnyFolderStore *store,
 gint 
 modest_tny_account_get_folder_count (TnyAccount *self)
 {
 gint 
 modest_tny_account_get_folder_count (TnyAccount *self)
 {
+       RecurseFoldersHelper *helper;
+       gint retval;
+
        g_return_val_if_fail (TNY_IS_ACCOUNT (self), -1);
 
        g_return_val_if_fail (TNY_IS_ACCOUNT (self), -1);
 
-       return 8;
+       /* Create helper */
+       helper = g_malloc0 (sizeof (RecurseFoldersHelper));
+       helper->function = NULL;
+       helper->sum = 0;
+       helper->folders = 0;
+
+       recurse_folders (TNY_FOLDER_STORE (self), NULL, helper);
+
+       retval = helper->folders;
+
+       g_free (helper);
+
+       return retval;
 }
 
 gint
 }
 
 gint
index 82c1237..13866f5 100644 (file)
@@ -87,8 +87,7 @@ static void     read_msg_func          (gpointer data, gpointer user_data);
 static void     get_msg_cb             (TnyFolder *folder, TnyMsg *msg,        GError **err, 
                                        gpointer user_data);
 static void     reply_forward          (ReplyForwardAction action, ModestWindow *win);
 static void     get_msg_cb             (TnyFolder *folder, TnyMsg *msg,        GError **err, 
                                        gpointer user_data);
 static void     reply_forward          (ReplyForwardAction action, ModestWindow *win);
-static void     modest_ui_actions_message_details_cb (gpointer msg_data, 
-                                                     gpointer helper_data);
+
 static gchar*   ask_for_folder_name    (GtkWindow *parent_window, const gchar *title);
 
 
 static gchar*   ask_for_folder_name    (GtkWindow *parent_window, const gchar *title);
 
 
@@ -930,12 +929,6 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
        } else if (TNY_IS_ACCOUNT (folder_store)) {
 
                modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
        } else if (TNY_IS_ACCOUNT (folder_store)) {
 
                modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
-
-/*             if (selected) { */
-                       
-/*             } else { */
-/*                     /\* TODO *\/ */
-/*             }        */
        }
 }
 
        }
 }
 
@@ -1616,17 +1609,12 @@ modest_ui_actions_on_change_fullscreen (GtkAction *action,
 }
 
 static void
 }
 
 static void
-modest_ui_actions_message_details_cb (gpointer msg_data, 
-                                     gpointer helper_data)
+show_header_details (TnyHeader *header, 
+                    GtkWindow *window)
 {
        GtkWidget *dialog;
 {
        GtkWidget *dialog;
-       TnyMsg *msg = (TnyMsg *) msg_data;
-       TnyHeader *header;
-       GetMsgAsyncHelper *helper = (GetMsgAsyncHelper *) helper_data;
-       
-       header = tny_msg_get_header (msg);
        
        
-       dialog = modest_msg_view_details_dialog_new (GTK_WINDOW (helper->window), header);
+       dialog = modest_msg_view_details_dialog_new (window, header);
        g_object_unref (header);
        gtk_widget_show_all (dialog);
 
        g_object_unref (header);
        gtk_widget_show_all (dialog);
 
@@ -1636,35 +1624,69 @@ modest_ui_actions_message_details_cb (gpointer msg_data,
 }
 
 void     
 }
 
 void     
-modest_ui_actions_on_message_details (GtkAction *action, 
-                                     ModestWindow *win)
+modest_ui_actions_on_details (GtkAction *action, 
+                             ModestWindow *win)
 {
        TnyList * headers_list;
 {
        TnyList * headers_list;
-       GetMsgAsyncHelper *helper;
-
-       headers_list = get_selected_headers (win);
-       if (!headers_list)
-               return;
-
-       helper = g_slice_new0 (GetMsgAsyncHelper);
-       helper->window = win;
-       helper->func = modest_ui_actions_message_details_cb;
-       helper->iter = tny_list_create_iterator (headers_list);
-       helper->user_data = NULL;
+       TnyIterator *iter;
+       TnyHeader *header;              
 
        if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
                TnyMsg *msg;
 
                msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
 
        if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
                TnyMsg *msg;
 
                msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
-               if (!msg)
+               if (!msg) {
                        return;
                        return;
-               else {
-                       modest_ui_actions_message_details_cb (msg, helper);
+               } else {
+                       headers_list = get_selected_headers (win);
+                       if (!headers_list)
+                               return;
+
+                       iter = tny_list_create_iterator (headers_list);
+
+                       header = TNY_HEADER (tny_iterator_get_current (iter));
+                       show_header_details (header, GTK_WINDOW (win));
+                       g_object_unref (header);
+
+                       g_object_unref (iter);
+               }
+       } else if (MODEST_IS_MAIN_WINDOW (win)) {
+               GtkWidget *folder_view, *header_view;
+
+               /* Check which widget has the focus */
+               folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
+                                                                   MODEST_WIDGET_TYPE_FOLDER_VIEW);
+               if (gtk_widget_is_focus (folder_view)) {
+                       TnyFolder *folder;
+
+                       folder = modest_folder_view_get_selected (folder_view);
+
+                       /* Show only when it's a folder */
+                       if (!folder || !TNY_IS_FOLDER (folder))
+                               return;
+
+                       /* TODO */
+               } else {
+                       header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
+                                                                          MODEST_WIDGET_TYPE_HEADER_VIEW);
+                       if (!gtk_widget_is_focus (header_view))
+                               return;
+
+                       headers_list = get_selected_headers (win);
+                       if (!headers_list)
+                               return;
+
+                       iter = tny_list_create_iterator (headers_list);
+                       while (!tny_iterator_is_done (iter)) {
+
+                               header = TNY_HEADER (tny_iterator_get_current (iter));
+                               show_header_details (header, GTK_WINDOW (win));
+                               g_object_unref (header);
+
+                               tny_iterator_next (iter);
+                       }
+                       g_object_unref (iter);
                }
                }
-       } else {
-               /* here we should add an implementation to run the message details dialog
-                  from the main window */
-               g_return_if_reached ();
        }
 }
 
        }
 }
 
@@ -1739,7 +1761,7 @@ modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
           the focus. This callback could be called even if the folder
           view has not the focus, because the handled signal could be
           emitted when the folder view is redrawn */
           the focus. This callback could be called even if the folder
           view has not the focus, because the handled signal could be
           emitted when the folder view is redrawn */
-       if (GTK_WIDGET_HAS_FOCUS (folder_view)) {
+       if (gtk_widget_is_focus (GTK_WIDGET (folder_view))) {
                if (display_name)
                        gtk_window_set_title (window, display_name);
                else
                if (display_name)
                        gtk_window_set_title (window, display_name);
                else
index 86c1cc7..a386b97 100644 (file)
@@ -69,7 +69,7 @@ void     modest_ui_actions_on_next          (GtkAction *action, ModestWindow *ma
 
 void     modest_ui_actions_on_prev          (GtkAction *action, ModestWindow *main_window);
 
 
 void     modest_ui_actions_on_prev          (GtkAction *action, ModestWindow *main_window);
 
-void     modest_ui_actions_on_message_details (GtkAction *action, ModestWindow *win);
+void     modest_ui_actions_on_details       (GtkAction *action, ModestWindow *win);
 
 
 /**
 
 
 /**
index 0100f0b..7cb1380 100644 (file)
@@ -1,4 +1,31 @@
-/* connection-specific-smtp-window.c */
+/* Copyright (c) 2006, Nokia Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Nokia Corporation nor the names of its
+ *   contributors may be used to endorse or promote products derived from
+ *   this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
 
 #include "modest-msg-view-details-dialog.h"
 
 
 #include "modest-msg-view-details-dialog.h"