* Now header activated signal in header view also passes the path.
authorSergio Villar Senin <svillar@igalia.com>
Tue, 2 Dec 2008 16:05:09 +0000 (16:05 +0000)
committerSergio Villar Senin <svillar@igalia.com>
Tue, 2 Dec 2008 16:05:09 +0000 (16:05 +0000)
* Header view now gets the hildon 2.2 look'n'feel
* Created new header window, that shows a list of headers in fremantle
  style.
* IMplemented activate in header window, so that message window is
  properly opened. This needed some changes to remove dependency on main
  window.
* Added event for opening header window from folder window.

pmo-trunk-r6497

src/hildon2/Makefile.am
src/hildon2/modest-folder-window.c
src/hildon2/modest-header-window.c [new file with mode: 0644]
src/hildon2/modest-header-window.h [new file with mode: 0644]
src/modest-ui-actions.c
src/modest-ui-actions.h
src/widgets/modest-folder-view.c
src/widgets/modest-header-view.c
src/widgets/modest-header-view.h

index 0df3743..778c42b 100644 (file)
@@ -59,6 +59,8 @@ libmodest_ui_la_SOURCES=              \
        modest-servertype-picker.h modest-servertype-picker.c \
        modest-folder-window.c \
        modest-folder-window.h \
        modest-servertype-picker.h modest-servertype-picker.c \
        modest-folder-window.c \
        modest-folder-window.h \
+       modest-header-window.c \
+       modest-header-window.h \
        modest-icon-names.h           \
        modest-hildon2-global-settings-dialog.c \
        modest-hildon2-global-settings-dialog.h \
        modest-icon-names.h           \
        modest-hildon2-global-settings-dialog.c \
        modest-hildon2-global-settings-dialog.h \
index 6e0b656..f9a9996 100644 (file)
@@ -45,6 +45,7 @@
 #include <hildon/hildon-program.h>
 #include <hildon/hildon-banner.h>
 #include <tny-account-store-view.h>
 #include <hildon/hildon-program.h>
 #include <hildon/hildon-banner.h>
 #include <tny-account-store-view.h>
+#include <modest-header-window.h>
 
 /* 'private'/'protected' functions */
 static void modest_folder_window_class_init  (ModestFolderWindowClass *klass);
 
 /* 'private'/'protected' functions */
 static void modest_folder_window_class_init  (ModestFolderWindowClass *klass);
@@ -55,6 +56,9 @@ static void connect_signals (ModestFolderWindow *self);
 static void modest_folder_window_disconnect_signals (ModestWindow *self);
 
 static gboolean on_zoom_minus_plus_not_implemented (ModestWindow *window);
 static void modest_folder_window_disconnect_signals (ModestWindow *self);
 
 static gboolean on_zoom_minus_plus_not_implemented (ModestWindow *window);
+static void on_folder_activated (ModestFolderView *folder_view,
+                                TnyFolder *folder,
+                                gpointer userdata);
 static void add_to_menu (ModestFolderWindow *self,
                         HildonAppMenu *menu,
                         gchar *label,
 static void add_to_menu (ModestFolderWindow *self,
                         HildonAppMenu *menu,
                         gchar *label,
@@ -171,6 +175,9 @@ connect_signals (ModestFolderWindow *self)
        priv = MODEST_FOLDER_WINDOW_GET_PRIVATE(self);
 
        /* folder view */
        priv = MODEST_FOLDER_WINDOW_GET_PRIVATE(self);
 
        /* folder view */
+       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, 
+                                                      G_OBJECT (priv->folder_view), "folder-activated", 
+                                                      G_CALLBACK (on_folder_activated), self);
 
        /* TODO: connect folder view activate */
        
 
        /* TODO: connect folder view activate */
        
@@ -371,3 +378,26 @@ static void setup_menu (ModestFolderWindow *self)
        hildon_stackable_window_set_main_menu (HILDON_STACKABLE_WINDOW (self), 
                                               HILDON_APP_MENU (app_menu));
 }
        hildon_stackable_window_set_main_menu (HILDON_STACKABLE_WINDOW (self), 
                                               HILDON_APP_MENU (app_menu));
 }
+
+static void
+on_folder_activated (ModestFolderView *folder_view,
+                    TnyFolder *folder,
+                    gpointer userdata)
+{
+       ModestFolderWindowPrivate *priv = NULL;
+       ModestWindow *headerwin;
+       ModestFolderWindow *self = (ModestFolderWindow *) userdata;
+
+       g_return_if_fail (MODEST_IS_FOLDER_WINDOW(self));
+
+       priv = MODEST_FOLDER_WINDOW_GET_PRIVATE (self);
+
+       if (!folder)
+               return;
+
+       headerwin = modest_header_window_new (folder);
+       modest_window_mgr_register_window (modest_runtime_get_window_mgr (), 
+                                          MODEST_WINDOW (headerwin),
+                                          MODEST_WINDOW (self));
+       gtk_widget_show (GTK_WIDGET (headerwin));
+}
diff --git a/src/hildon2/modest-header-window.c b/src/hildon2/modest-header-window.c
new file mode 100644 (file)
index 0000000..9c876a8
--- /dev/null
@@ -0,0 +1,528 @@
+/* Copyright (c) 2008, 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-header-window.h>
+#include <modest-osso-state-saving.h>
+#include <libosso.h>
+#include <hildon/hildon-pannable-area.h>
+#include <modest-window-mgr.h>
+#include <modest-signal-mgr.h>
+#include <modest-runtime.h>
+#include <modest-platform.h>
+#include <modest-maemo-utils.h>
+#include <modest-icon-names.h>
+#include <modest-ui-constants.h>
+#include <modest-account-mgr.h>
+#include <modest-account-mgr-helpers.h>
+#include <modest-defs.h>
+#include <modest-widget-memory.h>
+#include <modest-ui-actions.h>
+#include <hildon/hildon-button.h>
+#include <hildon/hildon-program.h>
+#include <hildon/hildon-banner.h>
+
+typedef enum {
+       CONTENTS_STATE_NONE = 0,
+       CONTENTS_STATE_EMPTY = 1,
+       CONTENTS_STATE_HEADERS = 2
+} ContentsState;
+
+typedef struct _ModestHeaderWindowPrivate ModestHeaderWindowPrivate;
+struct _ModestHeaderWindowPrivate {
+
+       GtkWidget *header_view;
+       GtkWidget *empty_view;
+       GtkWidget *contents_view;
+       GtkWidget *new_message_button;
+
+       ContentsState contents_state;
+
+       TnyFolder *folder;
+
+       /* signals */
+       GSList *sighandlers;
+
+       /* Display state */
+       osso_display_state_t display_state;
+};
+#define MODEST_HEADER_WINDOW_GET_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE((o), \
+                                                                         MODEST_TYPE_HEADER_WINDOW, \
+                                                                         ModestHeaderWindowPrivate))
+
+/* 'private'/'protected' functions */
+static void modest_header_window_class_init  (ModestHeaderWindowClass *klass);
+static void modest_header_window_init        (ModestHeaderWindow *obj);
+static void modest_header_window_finalize    (GObject *obj);
+
+static void connect_signals (ModestHeaderWindow *self);
+static void modest_header_window_disconnect_signals (ModestWindow *self);
+
+static gboolean on_zoom_minus_plus_not_implemented (ModestWindow *window);
+static void add_to_menu (ModestHeaderWindow *self,
+                        HildonAppMenu *menu,
+                        gchar *label,
+                        GCallback callback);
+static void setup_menu (ModestHeaderWindow *self);
+static GtkWidget *create_empty_view (void);
+static GtkWidget *create_header_view (TnyFolder *folder);
+
+static void update_view (ModestHeaderWindow *self,
+                        TnyFolderChange *change);
+static void set_contents_state (ModestHeaderWindow *window, 
+                               ContentsState state);
+
+static void on_msg_count_changed (ModestHeaderView *header_view,
+                                 TnyFolder *folder,
+                                 TnyFolderChange *change,
+                                 ModestHeaderWindow *header_window);
+static void on_header_activated (ModestHeaderView *header_view,
+                                TnyHeader *header,
+                                GtkTreePath *path,
+                                ModestHeaderWindow *header_window);
+
+
+/* globals */
+static GtkWindowClass *parent_class = NULL;
+
+#define EMPTYVIEW_XALIGN 0.5
+#define EMPTYVIEW_YALIGN 0.0
+#define EMPTYVIEW_XSPACE 1.0
+#define EMPTYVIEW_YSPACE 0.0
+
+
+
+/************************************************************************/
+
+GType
+modest_header_window_get_type (void)
+{
+       static GType my_type = 0;
+       if (!my_type) {
+               static const GTypeInfo my_info = {
+                       sizeof(ModestHeaderWindowClass),
+                       NULL,           /* base init */
+                       NULL,           /* base finalize */
+                       (GClassInitFunc) modest_header_window_class_init,
+                       NULL,           /* class finalize */
+                       NULL,           /* class data */
+                       sizeof(ModestHeaderWindow),
+                       1,              /* n_preallocs */
+                       (GInstanceInitFunc) modest_header_window_init,
+                       NULL
+               };
+               my_type = g_type_register_static (MODEST_TYPE_WINDOW,
+                                                 "ModestHeaderWindow",
+                                                 &my_info, 0);
+       }
+       return my_type;
+}
+
+static void
+modest_header_window_class_init (ModestHeaderWindowClass *klass)
+{
+       GObjectClass *gobject_class;
+       gobject_class = (GObjectClass*) klass;
+       ModestWindowClass *modest_window_class = (ModestWindowClass *) klass;
+
+       parent_class            = g_type_class_peek_parent (klass);
+       gobject_class->finalize = modest_header_window_finalize;
+
+       g_type_class_add_private (gobject_class, sizeof(ModestHeaderWindowPrivate));
+       
+       modest_window_class->zoom_minus_func = on_zoom_minus_plus_not_implemented;
+       modest_window_class->zoom_plus_func = on_zoom_minus_plus_not_implemented;
+       modest_window_class->disconnect_signals_func = modest_header_window_disconnect_signals;
+}
+
+static void
+modest_header_window_init (ModestHeaderWindow *obj)
+{
+       ModestHeaderWindowPrivate *priv;
+
+       priv = MODEST_HEADER_WINDOW_GET_PRIVATE(obj);
+
+       priv->sighandlers = NULL;
+       priv->display_state = OSSO_DISPLAY_ON;
+       
+       priv->header_view = NULL;
+       priv->empty_view = NULL;
+       priv->contents_view = NULL;
+       priv->contents_state = CONTENTS_STATE_NONE;
+       priv->folder = NULL;
+       
+       modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(),
+                                           GTK_WINDOW(obj),
+                                           "applications_email_headerview");
+}
+
+static void
+modest_header_window_finalize (GObject *obj)
+{
+       ModestHeaderWindowPrivate *priv;
+
+       priv = MODEST_HEADER_WINDOW_GET_PRIVATE(obj);
+
+       g_object_unref (priv->header_view);
+       g_object_unref (priv->empty_view);
+       g_object_unref (priv->folder);
+
+       /* Sanity check: shouldn't be needed, the window mgr should
+          call this function before */
+       modest_header_window_disconnect_signals (MODEST_WINDOW (obj));  
+
+       G_OBJECT_CLASS(parent_class)->finalize (obj);
+}
+
+static void
+modest_header_window_disconnect_signals (ModestWindow *self)
+{      
+       ModestHeaderWindowPrivate *priv;        
+       priv = MODEST_HEADER_WINDOW_GET_PRIVATE(self);
+
+       modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers);
+       priv->sighandlers = NULL;       
+}
+
+static void
+connect_signals (ModestHeaderWindow *self)
+{      
+       ModestHeaderWindowPrivate *priv;
+       
+       priv = MODEST_HEADER_WINDOW_GET_PRIVATE(self);
+
+       /* header view */
+
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), 
+                                          "msg_count_changed",
+                                          G_CALLBACK(on_msg_count_changed), self);
+       priv->sighandlers =
+               modest_signal_mgr_connect (priv->sighandlers, G_OBJECT (priv->header_view),
+                                          "header-activated",
+                                          G_CALLBACK (on_header_activated), self);
+
+       /* TODO: connect header view activate */
+
+       /* new message button */
+
+       g_signal_connect (G_OBJECT (priv->new_message_button), "clicked",
+                         G_CALLBACK (modest_ui_actions_on_new_msg), (gpointer) self);
+       
+       /* window */
+
+       /* we don't register this in sighandlers, as it should be run after disconnecting all signals,
+        * in destroy stage */
+
+       
+}
+
+static void 
+osso_display_event_cb (osso_display_state_t state, 
+                      gpointer data)
+{
+       ModestHeaderWindowPrivate *priv = MODEST_HEADER_WINDOW_GET_PRIVATE (data);
+
+       priv->display_state = state;
+
+       /* Stop blinking if the screen becomes on */
+       if (priv->display_state == OSSO_DISPLAY_ON)
+               modest_platform_remove_new_mail_notifications (TRUE);
+}
+
+static GtkWidget *
+create_header_view (TnyFolder *folder)
+{
+       GtkWidget *header_view;
+
+       header_view  = modest_header_view_new (NULL, MODEST_HEADER_VIEW_STYLE_TWOLINES);
+       modest_header_view_set_folder (MODEST_HEADER_VIEW (header_view), folder, 
+                                      TRUE, NULL, NULL);
+       modest_widget_memory_restore (modest_runtime_get_conf (), G_OBJECT(header_view),
+                                     MODEST_CONF_HEADER_VIEW_KEY);
+
+       return header_view;
+}
+
+static GtkWidget *
+create_empty_view (void)
+{
+       GtkLabel *label = NULL;
+       GtkWidget *align = NULL;
+
+       align = gtk_alignment_new(EMPTYVIEW_XALIGN, EMPTYVIEW_YALIGN, EMPTYVIEW_XSPACE, EMPTYVIEW_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);
+}
+
+
+ModestWindow *
+modest_header_window_new (TnyFolder *folder)
+{
+       ModestHeaderWindow *self = NULL;        
+       ModestHeaderWindowPrivate *priv = NULL;
+       HildonProgram *app;
+       GdkPixbuf *window_icon;
+       GtkWidget *pannable;
+       
+       self  = MODEST_HEADER_WINDOW(g_object_new(MODEST_TYPE_HEADER_WINDOW, NULL));
+       priv = MODEST_HEADER_WINDOW_GET_PRIVATE(self);
+
+       priv->folder = g_object_ref (folder);
+
+       pannable = hildon_pannable_area_new ();
+
+       priv->header_view  = create_header_view (folder);
+       priv->empty_view = create_empty_view ();
+       g_object_ref (priv->header_view);
+       g_object_ref (priv->empty_view);
+       priv->contents_view = gtk_vbox_new (FALSE, 0);
+       priv->new_message_button = hildon_button_new (MODEST_EDITABLE_SIZE,
+                                                     HILDON_BUTTON_ARRANGEMENT_HORIZONTAL);
+       hildon_button_set_title (HILDON_BUTTON (priv->new_message_button), _("mcen_me_viewer_newemail"));
+       hildon_button_set_image (HILDON_BUTTON (priv->new_message_button), 
+                                gtk_image_new_from_stock (MODEST_STOCK_NEW_MAIL, GTK_ICON_SIZE_DIALOG));
+       hildon_button_set_title_alignment (HILDON_BUTTON (priv->new_message_button), 0.0, 0.5);
+       hildon_button_set_image_alignment (HILDON_BUTTON (priv->new_message_button), 0.0, 0.5);
+       hildon_button_set_alignment (HILDON_BUTTON (priv->new_message_button), 0.0, 0.5, 1.0, 0.0);
+       hildon_button_set_image_position (HILDON_BUTTON (priv->new_message_button), GTK_POS_LEFT);
+
+       setup_menu (self);
+
+       gtk_box_pack_start (GTK_BOX (priv->contents_view), priv->new_message_button, FALSE, FALSE, 0);
+       hildon_pannable_area_add_with_viewport (HILDON_PANNABLE_AREA (pannable), priv->contents_view);
+       gtk_container_add (GTK_CONTAINER (self), pannable);
+
+       gtk_widget_show (priv->contents_view);
+       gtk_widget_show (pannable);
+       gtk_widget_show (priv->new_message_button);
+
+       connect_signals (MODEST_HEADER_WINDOW (self));
+
+       update_view (self, NULL);
+
+       /* Load previous osso state, for instance if we are being restored from 
+        * hibernation:  */
+       modest_osso_load_state ();
+
+       /* Get device name */
+       modest_maemo_utils_get_device_name ();
+
+       app = hildon_program_get_instance ();
+       hildon_program_add_window (app, HILDON_WINDOW (self));
+       
+       /* Set window icon */
+       window_icon = modest_platform_get_icon (MODEST_APP_ICON, MODEST_ICON_SIZE_BIG);
+       if (window_icon) {
+               gtk_window_set_icon (GTK_WINDOW (self), window_icon);
+               g_object_unref (window_icon);
+       }
+
+       /* Listen for changes in the screen, we don't want to show a
+          led pattern when the display is on for example */
+       osso_hw_set_display_event_cb (modest_maemo_utils_get_osso_context (),
+                                     osso_display_event_cb,
+                                     self); 
+
+       /* Dont't restore settings here, 
+        * because it requires a gtk_widget_show(), 
+        * and we don't want to do that until later,
+        * so that the UI is not visible for non-menu D-Bus activation.
+        */
+
+       return MODEST_WINDOW(self);
+}
+
+static gboolean
+on_zoom_minus_plus_not_implemented (ModestWindow *window)
+{
+       g_return_val_if_fail (MODEST_IS_HEADER_WINDOW (window), FALSE);
+
+       hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_cannot_zoom_here"));
+       return FALSE;
+
+}
+
+gboolean
+modest_header_window_screen_is_on (ModestHeaderWindow *self)
+{
+       ModestHeaderWindowPrivate *priv = NULL;
+
+       g_return_val_if_fail (MODEST_IS_HEADER_WINDOW(self), FALSE);
+
+       priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self);
+       
+       return (priv->display_state == OSSO_DISPLAY_ON) ? TRUE : FALSE;
+}
+
+ModestHeaderView *
+modest_header_window_get_header_view (ModestHeaderWindow *self)
+{
+       ModestHeaderWindowPrivate *priv = NULL;
+
+       g_return_val_if_fail (MODEST_IS_HEADER_WINDOW(self), FALSE);
+
+       priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self);
+       
+       return MODEST_HEADER_VIEW (priv->header_view);
+}
+
+static void add_to_menu (ModestHeaderWindow *self,
+                        HildonAppMenu *menu,
+                        gchar *label,
+                        GCallback callback)
+{
+       GtkWidget *button;
+
+       button = gtk_button_new_with_label (label);
+       g_signal_connect_after (G_OBJECT (button), "clicked",
+                               callback, (gpointer) self);
+       hildon_app_menu_append (menu, GTK_BUTTON (button));
+}
+
+static void setup_menu (ModestHeaderWindow *self)
+{
+       ModestHeaderWindowPrivate *priv = NULL;
+       GtkWidget *app_menu;
+
+       g_return_if_fail (MODEST_IS_HEADER_WINDOW(self));
+
+       priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self);
+
+       app_menu = hildon_app_menu_new ();
+
+       add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_sendandreceive"),
+                    G_CALLBACK (modest_ui_actions_on_send_receive));
+
+       hildon_stackable_window_set_main_menu (HILDON_STACKABLE_WINDOW (self), 
+                                              HILDON_APP_MENU (app_menu));
+}
+
+static void 
+update_view (ModestHeaderWindow *self,
+            TnyFolderChange *change)
+{
+       ModestHeaderWindowPrivate *priv = NULL;
+       gboolean refilter = FALSE;
+       gboolean folder_empty = FALSE;
+       gboolean all_marked_as_deleted = FALSE;
+
+       g_return_if_fail (MODEST_IS_HEADER_WINDOW(self));
+       priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self);
+       g_return_if_fail (priv->folder);
+
+       if (change != NULL) {
+               TnyFolderChangeChanged changed;
+
+               changed = tny_folder_change_get_changed (change);
+               /* If something changes */
+               if ((changed) & TNY_FOLDER_CHANGE_CHANGED_ALL_COUNT)
+                       folder_empty = (((guint) tny_folder_change_get_new_all_count (change)) == 0);
+               else
+                       folder_empty = (((guint) tny_folder_get_all_count (TNY_FOLDER (priv->folder))) == 0);
+
+               if ((changed) & TNY_FOLDER_CHANGE_CHANGED_EXPUNGED_HEADERS)
+                       refilter = TRUE;
+       } else {
+               folder_empty = (((guint) tny_folder_get_all_count (TNY_FOLDER (priv->folder))) == 0);
+       }
+
+       /* Check if all messages are marked to be deleted */
+       all_marked_as_deleted = modest_header_view_is_empty (MODEST_HEADER_VIEW (priv->header_view));
+       folder_empty = folder_empty || all_marked_as_deleted;
+
+       /* Set style of headers view */
+       set_contents_state (self, folder_empty?CONTENTS_STATE_EMPTY:CONTENTS_STATE_HEADERS);
+
+       if (refilter)
+               modest_header_view_refilter (MODEST_HEADER_VIEW (priv->header_view));
+}
+
+static void 
+set_contents_state (ModestHeaderWindow *self, 
+                   ContentsState state)
+{
+       ModestHeaderWindowPrivate *priv = NULL;
+
+       g_return_if_fail (MODEST_IS_HEADER_WINDOW(self));
+       priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self);
+
+       if (priv->contents_state == state)
+               return;
+
+       /* Remove from container the old content */
+       switch (priv->contents_state) {
+       case CONTENTS_STATE_EMPTY:
+               gtk_container_remove (GTK_CONTAINER (priv->contents_view), priv->empty_view);
+               break;
+       case CONTENTS_STATE_HEADERS:
+               gtk_container_remove (GTK_CONTAINER (priv->contents_view), priv->header_view);
+               break;
+       case CONTENTS_STATE_NONE:
+               break;
+       }
+
+       /* Add the new content */
+       switch (state) {
+       case CONTENTS_STATE_EMPTY:
+               gtk_box_pack_start (GTK_BOX (priv->contents_view), priv->empty_view, TRUE, TRUE, 0);
+               gtk_widget_show (priv->empty_view);
+               break;
+       case CONTENTS_STATE_HEADERS:
+               gtk_box_pack_start (GTK_BOX (priv->contents_view), priv->header_view, TRUE, TRUE, 0);
+               gtk_widget_show (priv->header_view);
+               break;
+       case CONTENTS_STATE_NONE:
+               break;
+       }
+       priv->contents_state = state;
+       
+}
+
+static void
+on_msg_count_changed (ModestHeaderView *header_view,
+                     TnyFolder *folder,
+                     TnyFolderChange *change,
+                     ModestHeaderWindow *header_window)
+{      
+       g_return_if_fail (MODEST_IS_HEADER_WINDOW (header_window));
+       
+       update_view (MODEST_HEADER_WINDOW (header_window), change);
+}
+
+static void 
+on_header_activated (ModestHeaderView *header_view,
+                    TnyHeader *header,
+                    GtkTreePath *path,
+                    ModestHeaderWindow *header_window)
+{
+       modest_ui_actions_on_header_activated (header_view, header, path, MODEST_WINDOW (header_window));
+}
diff --git a/src/hildon2/modest-header-window.h b/src/hildon2/modest-header-window.h
new file mode 100644 (file)
index 0000000..2a26b5d
--- /dev/null
@@ -0,0 +1,88 @@
+/* Copyright (c) 2008 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.
+ */
+
+#ifndef __MODEST_HEADER_WINDOW_H__
+#define __MODEST_HEADER_WINDOW_H__
+
+#include <widgets/modest-window.h>
+#include <widgets/modest-header-view.h>
+
+G_BEGIN_DECLS
+
+/* convenience macros */
+#define MODEST_TYPE_HEADER_WINDOW             (modest_header_window_get_type())
+#define MODEST_HEADER_WINDOW(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_HEADER_WINDOW,ModestHeaderWindow))
+#define MODEST_HEADER_WINDOW_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass),MODEST_TYPE_HEADER_WINDOW,ModestWindow))
+
+#define MODEST_IS_HEADER_WINDOW(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_HEADER_WINDOW))
+#define MODEST_IS_HEADER_WINDOW_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_HEADER_WINDOW))
+#define MODEST_HEADER_WINDOW_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_HEADER_WINDOW,ModestHeaderWindowClass))
+
+typedef struct _ModestHeaderWindow      ModestHeaderWindow;
+typedef struct _ModestHeaderWindowClass ModestHeaderWindowClass;
+
+struct _ModestHeaderWindow {
+       ModestWindow parent;
+};
+
+struct _ModestHeaderWindowClass {
+       ModestWindowClass parent_class;
+};
+
+/**
+ * modest_header_window_get_type:
+ * 
+ * get the GType for the ModestHeaderWindow class
+ *
+ * Returns: a GType for ModestHeaderWindow
+ */
+GType modest_header_window_get_type (void) G_GNUC_CONST;
+
+
+/**
+ * modest_header_window_new:
+ * @folder: a #TnyFolder that specifies the folder to show headers
+ * 
+ * instantiates a new ModestHeaderWindow widget
+ *
+ * Returns: a new ModestHeaderWindow, or NULL in case of error
+ */
+ModestWindow* modest_header_window_new (TnyFolder *folder);
+
+/**
+ * modest_header_window_get_header_view:
+ * @self: a #ModestHeaderWindow
+ *
+ * get the header view inside the header window
+ */
+ModestHeaderView *modest_header_window_get_header_view (ModestHeaderWindow *self);
+
+G_END_DECLS
+
+#endif
index 1ab8f76..3fb1cc0 100644 (file)
@@ -50,6 +50,7 @@
 #include <tny-camel-pop-folder.h>
 #ifdef MODEST_TOOLKIT_HILDON2
 #include <hildon/hildon-pannable-area.h>
 #include <tny-camel-pop-folder.h>
 #ifdef MODEST_TOOLKIT_HILDON2
 #include <hildon/hildon-pannable-area.h>
+#include <modest-header-window.h>
 #endif
 
 #ifdef MODEST_PLATFORM_MAEMO
 #endif
 
 #ifdef MODEST_PLATFORM_MAEMO
@@ -1002,12 +1003,10 @@ open_msg_cb (ModestMailOperation *mail_op,
                win = modest_msg_edit_window_new (msg, account, TRUE);
        } else {
                gchar *uid = modest_tny_folder_get_header_unique_id (header);
                win = modest_msg_edit_window_new (msg, account, TRUE);
        } else {
                gchar *uid = modest_tny_folder_get_header_unique_id (header);
+               GtkTreeRowReference *row_reference;
 
 
-               if (MODEST_IS_MAIN_WINDOW (parent_win)) {
-                       GtkTreeRowReference *row_reference;
-
-                       row_reference = (GtkTreeRowReference *) g_hash_table_lookup (helper->row_refs_per_header, header);
-
+               row_reference = (GtkTreeRowReference *) g_hash_table_lookup (helper->row_refs_per_header, header);
+               if (row_reference && helper->model) {           
                        win = modest_msg_view_window_new_with_header_model (msg, account, (const gchar*) uid,
                                                                            helper->model, row_reference);
                } else {
                        win = modest_msg_view_window_new_with_header_model (msg, account, (const gchar*) uid,
                                                                            helper->model, row_reference);
                } else {
@@ -1325,7 +1324,7 @@ open_msgs_performer(gboolean canceled,
  * same when trying to open messages.
  */
 static void
  * same when trying to open messages.
  */
 static void
-open_msgs_from_headers (TnyList *headers, ModestWindow *win)
+open_msgs_from_headers (TnyList *headers, GtkTreePath *path, ModestWindow *win)
 {
        ModestWindowMgr *mgr = NULL;
        TnyIterator *iter = NULL, *iter_not_opened = NULL;
 {
        ModestWindowMgr *mgr = NULL;
        TnyIterator *iter = NULL, *iter_not_opened = NULL;
@@ -1333,7 +1332,7 @@ open_msgs_from_headers (TnyList *headers, ModestWindow *win)
        TnyHeaderFlags flags = 0;
        TnyAccount *account;
        gint uncached_msgs = 0;
        TnyHeaderFlags flags = 0;
        TnyAccount *account;
        gint uncached_msgs = 0;
-       GtkWidget *header_view;
+       GtkWidget *header_view = NULL;
        GtkTreeModel *model;
        GHashTable *refs_for_headers;
        OpenMsgHelper *helper;
        GtkTreeModel *model;
        GHashTable *refs_for_headers;
        OpenMsgHelper *helper;
@@ -1358,14 +1357,32 @@ open_msgs_from_headers (TnyList *headers, ModestWindow *win)
        if (!account)
                return;
 
        if (!account)
                return;
 
-       /* Get the selections, we need to get the references to the
-          rows here because the treeview/model could dissapear (the
-          user might want to select another folder)*/
-       header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
-       sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view));
+       if (!MODEST_IS_MAIN_WINDOW (win) && path == NULL)
+               return;
+       
+        /* get model */
+       if (MODEST_IS_MAIN_WINDOW (win)) {
+               header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
+#ifdef MODEST_TOOLKIT_HILDON2
+       } else if (MODEST_IS_HEADER_WINDOW (win)){
+#endif
+               header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
+       }
+
+       if (!header_view)
+               return;
+
        model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
        model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
-       sel_list = gtk_tree_selection_get_selected_rows (sel, &model);
+       if (path && MODEST_IS_HEADER_WINDOW (win)) {
+               sel_list = g_list_prepend (NULL, gtk_tree_path_copy (path));
+       } else {
+               /* Get the selections, we need to get the references to the
+                  rows here because the treeview/model could dissapear (the
+                  user might want to select another folder)*/
+               sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view));
+               sel_list = gtk_tree_selection_get_selected_rows (sel, &model);
+       }
        refs_for_headers = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, 
                                                  (GDestroyNotify) gtk_tree_row_reference_free);
 
        refs_for_headers = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, 
                                                  (GDestroyNotify) gtk_tree_row_reference_free);
 
@@ -1373,6 +1390,7 @@ open_msgs_from_headers (TnyList *headers, ModestWindow *win)
           true, then remove the header from the list of headers to
           open */
        sel_list_iter = sel_list;
           true, then remove the header from the list of headers to
           open */
        sel_list_iter = sel_list;
+
        not_opened_headers = tny_simple_list_new ();
        while (!tny_iterator_is_done (iter) && sel_list_iter) {
 
        not_opened_headers = tny_simple_list_new ();
        while (!tny_iterator_is_done (iter) && sel_list_iter) {
 
@@ -1509,7 +1527,7 @@ modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
                return;
 
        /* Open them */
                return;
 
        /* Open them */
-       open_msgs_from_headers (headers, win);
+       open_msgs_from_headers (headers, NULL, win);
 
        g_object_unref(headers);
 }
 
        g_object_unref(headers);
 }
@@ -2333,16 +2351,18 @@ modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
 void
 modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
                                       TnyHeader *header,
 void
 modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
                                       TnyHeader *header,
-                                      ModestMainWindow *main_window)
+                                      GtkTreePath *path,
+                                      ModestWindow *window)
 {
        TnyList *headers;
 
 {
        TnyList *headers;
 
-       g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
+       g_return_if_fail (MODEST_IS_WINDOW(window));
 
        if (!header)
                return;
 
 
        if (!header)
                return;
 
-       if (modest_header_view_count_selected_headers (header_view) > 1) {
+       if (MODEST_IS_MAIN_WINDOW (window) &&
+           modest_header_view_count_selected_headers (header_view) > 1) {
                modest_platform_information_banner (NULL, NULL, _("mcen_ib_select_one_message"));
                return;
        }
                modest_platform_information_banner (NULL, NULL, _("mcen_ib_select_one_message"));
                return;
        }
@@ -2350,14 +2370,24 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
        /* we check for low-mem; in that case, show a warning, and don't allow
         * activating headers
         */
        /* we check for low-mem; in that case, show a warning, and don't allow
         * activating headers
         */
-       if (modest_platform_check_memory_low (MODEST_WINDOW(main_window), TRUE))
+       if (modest_platform_check_memory_low (MODEST_WINDOW(window), TRUE))
                return;
 
                return;
 
-       modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (main_window));
+       if (MODEST_IS_MAIN_WINDOW (window)) {
+               modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
+               open_widget = modest_window_get_action_widget (MODEST_WINDOW (window), "/MenuBar/EmailMenu/EmailOpenMenu");
+               if (!GTK_WIDGET_IS_SENSITIVE (open_widget))
+                       return;
+       }
 
 
-       headers = modest_header_view_get_selected_headers (header_view);
+       if (MODEST_IS_MAIN_WINDOW (window)) {
+               headers = modest_header_view_get_selected_headers (header_view);
+       } else {
+               headers = tny_simple_list_new ();
+               tny_list_prepend (TNY_LIST (headers), G_OBJECT (header));
+       }
 
 
-       open_msgs_from_headers (headers, MODEST_WINDOW (main_window));
+       open_msgs_from_headers (headers, path, MODEST_WINDOW (window));
 
        g_object_unref (headers);
 }
 
        g_object_unref (headers);
 }
index 02ef1ba..645663a 100644 (file)
@@ -140,8 +140,9 @@ void     modest_ui_actions_on_header_selected          (ModestHeaderView *folder
                                                        TnyHeader *header,
                                                        ModestMainWindow *main_window);
 void     modest_ui_actions_on_header_activated         (ModestHeaderView *folder_view, 
                                                        TnyHeader *header,
                                                        ModestMainWindow *main_window);
 void     modest_ui_actions_on_header_activated         (ModestHeaderView *folder_view, 
-                                                        TnyHeader *header,
-                                                        ModestMainWindow *main_window);
+                                                       TnyHeader *header,
+                                                       GtkTreePath *path,
+                                                       ModestWindow *main_window);
 
 void     modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
                                                         TnyFolderStore *folder_store, 
 
 void     modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
                                                         TnyFolderStore *folder_store, 
index d846aab..c65a7a9 100644 (file)
@@ -300,9 +300,6 @@ modest_folder_view_class_init (ModestFolderViewClass *klass)
 
 #ifdef MODEST_TOOLKIT_HILDON2
        gtk_rc_parse_string ("class \"ModestFolderView\" style \"fremantle-touchlist\"");
 
 #ifdef MODEST_TOOLKIT_HILDON2
        gtk_rc_parse_string ("class \"ModestFolderView\" style \"fremantle-touchlist\"");
-       /* gtk_rc_parse_string ("style \"fremantle-modest-fv\" {\n" */
-       /*                   "  GtkWidget::hildon-mode = 1\n" */
-       /*                   "} class \"ModestFolderView\" style \"fremantle-modest-fv\""); */
        
 #endif
 
        
 #endif
 
index 78ec1b3..2a68e09 100644 (file)
@@ -250,8 +250,8 @@ modest_header_view_class_init (ModestHeaderViewClass *klass)
                              G_SIGNAL_RUN_FIRST,
                              G_STRUCT_OFFSET (ModestHeaderViewClass,header_activated),
                              NULL, NULL,
                              G_SIGNAL_RUN_FIRST,
                              G_STRUCT_OFFSET (ModestHeaderViewClass,header_activated),
                              NULL, NULL,
-                             g_cclosure_marshal_VOID__POINTER,
-                             G_TYPE_NONE, 1, G_TYPE_POINTER);
+                             gtk_marshal_VOID__POINTER_POINTER,
+                             G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER);
        
        
        signals[ITEM_NOT_FOUND_SIGNAL] = 
        
        
        signals[ITEM_NOT_FOUND_SIGNAL] = 
@@ -280,6 +280,11 @@ modest_header_view_class_init (ModestHeaderViewClass *klass)
                              NULL, NULL,
                              g_cclosure_marshal_VOID__BOOLEAN,
                              G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
                              NULL, NULL,
                              g_cclosure_marshal_VOID__BOOLEAN,
                              G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+
+#ifdef MODEST_TOOLKIT_HILDON2
+       gtk_rc_parse_string ("class \"ModestHeaderView\" style \"fremantle-touchlist\"");
+       
+#endif
 }
 
 static void
 }
 
 static void
@@ -943,6 +948,13 @@ modest_header_view_on_expose_event(GtkTreeView *header_view,
        if (!model)
                return FALSE;
 
        if (!model)
                return FALSE;
 
+#ifdef MODEST_TOOLKIT_HILDON2
+       HildonUIMode ui_mode;
+       g_object_get (G_OBJECT (header_view), "hildon-ui-mode", &ui_mode, NULL);
+       if (ui_mode == HILDON_UI_MODE_NORMAL)
+               /* As in hildon 2.2 normal mode there's no selection, we just simply return */
+               return FALSE;
+#endif
        sel = gtk_tree_view_get_selection(header_view);
        if(!gtk_tree_selection_count_selected_rows(sel)) {
                if (gtk_tree_model_get_iter_first(model, &tree_iter)) {
        sel = gtk_tree_view_get_selection(header_view);
        if(!gtk_tree_selection_count_selected_rows(sel)) {
                if (gtk_tree_model_get_iter_first(model, &tree_iter)) {
@@ -1424,7 +1436,7 @@ on_header_row_activated (GtkTreeView *treeview, GtkTreePath *path,
        /* Emit signal */
        g_signal_emit (G_OBJECT(self), 
                       signals[HEADER_ACTIVATED_SIGNAL], 
        /* Emit signal */
        g_signal_emit (G_OBJECT(self), 
                       signals[HEADER_ACTIVATED_SIGNAL], 
-                      0, header);
+                      0, header, path);
 
        /* Free */
  frees:
 
        /* Free */
  frees:
index e1d671b..2ff48c4 100644 (file)
@@ -115,6 +115,7 @@ struct _ModestHeaderViewClass {
 
        void (*header_activated) (ModestHeaderView* self,
                                  TnyHeader *header,
 
        void (*header_activated) (ModestHeaderView* self,
                                  TnyHeader *header,
+                                 GtkTreePath *path,
                                  gpointer user_data);
 
        void (*msg_count_changed) (ModestHeaderView* self,
                                  gpointer user_data);
 
        void (*msg_count_changed) (ModestHeaderView* self,