2007-04-20 Murray Cumming <murrayc@murrayc.com>
[modest] / src / maemo / modest-msg-view-window.c
index b25498e..91067c7 100644 (file)
@@ -31,6 +31,7 @@
 #include <tny-account-store.h>
 #include <tny-simple-list.h>
 #include <tny-header.h>
+#include "modest-platform.h"
 #include <modest-tny-msg.h>
 #include <modest-msg-view-window.h>
 #include <modest-main-window-ui.h>
@@ -57,21 +58,24 @@ static void  modest_msg_view_window_find_toolbar_search (GtkWidget *widget,
 static void  modest_msg_view_window_set_zoom (ModestWindow *window,
                                              gdouble zoom);
 static gdouble modest_msg_view_window_get_zoom (ModestWindow *window);
-static void modest_msg_view_window_zoom_minus (GtkAction *action, ModestWindow *window);
-static void modest_msg_view_window_zoom_plus (GtkAction *action, ModestWindow *window);
+static gboolean modest_msg_view_window_zoom_minus (ModestWindow *window);
+static gboolean modest_msg_view_window_zoom_plus (ModestWindow *window);
 static gboolean modest_msg_view_window_key_release_event (GtkWidget *window,
                                                          GdkEventKey *event,
                                                          gpointer userdata);
+static gboolean modest_msg_view_window_window_state_event (GtkWidget *widget, 
+                                                          GdkEventWindowState *event, 
+                                                          gpointer userdata);
 static void modest_msg_view_window_scroll_up (ModestWindow *window);
 static void modest_msg_view_window_scroll_down (ModestWindow *window);
-static void modest_msg_view_window_toggle_fullscreen (GtkAction *action, ModestWindow *window);
 static gboolean modest_msg_view_window_is_last_message (ModestMsgViewWindow *window);
 static gboolean modest_msg_view_window_is_first_message (ModestMsgViewWindow *window);
 static TnyFolderType modest_msg_view_window_get_folder_type (ModestMsgViewWindow *window);
 static void modest_msg_view_window_update_dimmed (ModestMsgViewWindow *window);
 static void modest_msg_view_window_update_priority (ModestMsgViewWindow *window);
 
-
+static void modest_msg_view_window_show_toolbar   (ModestWindow *window,
+                                                  gboolean show_toolbar);
 
 
 /* list my signals */
@@ -94,17 +98,9 @@ static const GtkRadioActionEntry msg_view_zoom_action_entries [] = {
        { "Zoom200", NULL, N_("mcen_me_viewer_200"), NULL, NULL, 200 }
 };
 
-static const GtkActionEntry modest_msg_view_action_entries [] = {
-       { "ZoomPlus", NULL, N_("Zoom +"), "F7", NULL, G_CALLBACK (modest_msg_view_window_zoom_plus) },
-       { "ZoomMinus", NULL, N_("Zoom -"), "F8", NULL, G_CALLBACK (modest_msg_view_window_zoom_minus) },
-       { "ToggleFullscreen", NULL, N_("Toggle fullscreen"), "F6", NULL, G_CALLBACK (modest_msg_view_window_toggle_fullscreen) },
-};
-
 typedef struct _ModestMsgViewWindowPrivate ModestMsgViewWindowPrivate;
 struct _ModestMsgViewWindowPrivate {
 
-       GtkWidget   *toolbar;
-       GtkWidget   *menubar;
        GtkWidget   *msg_view;
        GtkWidget   *main_scroll;
        GtkWidget   *find_toolbar;
@@ -160,6 +156,9 @@ modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass)
 
        modest_window_class->set_zoom_func = modest_msg_view_window_set_zoom;
        modest_window_class->get_zoom_func = modest_msg_view_window_get_zoom;
+       modest_window_class->zoom_minus_func = modest_msg_view_window_zoom_minus;
+       modest_window_class->zoom_plus_func = modest_msg_view_window_zoom_plus;
+       modest_window_class->show_toolbar_func = modest_msg_view_window_show_toolbar;
 
        g_type_class_add_private (gobject_class, sizeof(ModestMsgViewWindowPrivate));
 }
@@ -170,10 +169,7 @@ modest_msg_view_window_init (ModestMsgViewWindow *obj)
        ModestMsgViewWindowPrivate *priv;
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj);
 
-       priv->toolbar       = NULL;
-       priv->menubar       = NULL;
        priv->msg_view      = NULL;
-
        priv->header_model  = NULL;
 }
 
@@ -219,52 +215,6 @@ menubar_to_menu (GtkUIManager *ui_manager)
        return main_menu;
 }
 
-static GtkWidget*
-get_toolbar (ModestMsgViewWindow *self)
-{
-       GtkWidget *toolbar, *reply_button, *menu;
-       ModestWindowPrivate *parent_priv;
-       GtkWidget *button;
-
-       parent_priv = MODEST_WINDOW_GET_PRIVATE (self);
-       toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar");
-       reply_button = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply");
-
-       menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolbarReplyCSM");
-       gtk_widget_tap_and_hold_setup (GTK_WIDGET (reply_button), menu, NULL, 0);
-
-       button = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNew");
-       gtk_tool_item_set_expand (GTK_TOOL_ITEM (button), TRUE);
-       gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), TRUE);
-
-       button = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply");
-       gtk_tool_item_set_expand (GTK_TOOL_ITEM (button), TRUE);
-       gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), TRUE);
-
-       button = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo");
-       gtk_tool_item_set_expand (GTK_TOOL_ITEM (button), TRUE);
-       gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), TRUE);
-
-       button = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage");
-       gtk_tool_item_set_expand (GTK_TOOL_ITEM (button), TRUE);
-       gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), TRUE);
-
-       button = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageBack");
-       gtk_tool_item_set_expand (GTK_TOOL_ITEM (button), TRUE);
-       gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), TRUE);
-
-       button = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageForward");
-       gtk_tool_item_set_expand (GTK_TOOL_ITEM (button), TRUE);
-       gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), TRUE);
-
-       button = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/FindInMessage");
-       gtk_tool_item_set_expand (GTK_TOOL_ITEM (button), TRUE);
-       gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), TRUE);
-
-       return toolbar;
-}
-
-
 static void
 init_window (ModestMsgViewWindow *obj, TnyMsg *msg)
 {
@@ -279,16 +229,11 @@ init_window (ModestMsgViewWindow *obj, TnyMsg *msg)
        modest_msg_view_set_shadow_type (MODEST_MSG_VIEW (priv->msg_view), GTK_SHADOW_NONE);
        main_vbox = gtk_vbox_new  (FALSE, 6);
 
-       /* Toolbar / Menubar */
-       
+       /* Menubar */
        parent_priv->menubar = menubar_to_menu (parent_priv->ui_manager);
        gtk_widget_show_all (GTK_WIDGET(parent_priv->menubar));
        hildon_window_set_menu    (HILDON_WINDOW(obj), GTK_MENU(parent_priv->menubar));
 
-       parent_priv->toolbar = get_toolbar (obj);
-       gtk_widget_show_all (GTK_WIDGET(parent_priv->toolbar));
-       hildon_window_add_toolbar (HILDON_WINDOW(obj), GTK_TOOLBAR(parent_priv->toolbar));
-
        priv->main_scroll = gtk_scrolled_window_new (NULL, NULL);
        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->main_scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
        gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (priv->main_scroll), GTK_SHADOW_NONE);
@@ -362,6 +307,7 @@ modest_msg_view_window_new (TnyMsg *msg, const gchar *account_name)
        ModestWindowPrivate *parent_priv;
        GtkActionGroup *action_group;
        GError *error = NULL;
+       GdkPixbuf *window_icon = NULL;
 
        g_return_val_if_fail (msg, NULL);
        
@@ -378,14 +324,10 @@ modest_msg_view_window_new (TnyMsg *msg, const gchar *account_name)
                                      modest_action_entries,
                                      G_N_ELEMENTS (modest_action_entries),
                                      obj);
-       gtk_action_group_add_actions (action_group,
-                                     modest_msg_view_action_entries,
-                                     G_N_ELEMENTS (modest_msg_view_action_entries),
-                                     obj);
        gtk_action_group_add_toggle_actions (action_group,
-                                     modest_toggle_action_entries,
-                                     G_N_ELEMENTS (modest_toggle_action_entries),
-                                     obj);
+                                            modest_toggle_action_entries,
+                                            G_N_ELEMENTS (modest_toggle_action_entries),
+                                            obj);
        gtk_action_group_add_toggle_actions (action_group,
                                             msg_view_toggle_action_entries,
                                             G_N_ELEMENTS (msg_view_toggle_action_entries),
@@ -418,9 +360,6 @@ modest_msg_view_window_new (TnyMsg *msg, const gchar *account_name)
        init_window (MODEST_MSG_VIEW_WINDOW(obj), msg);
        restore_settings (MODEST_MSG_VIEW_WINDOW(obj));
        
-       gtk_window_set_title (GTK_WINDOW(obj), "Modest");
-       gtk_window_set_icon_from_file (GTK_WINDOW(obj), MODEST_APP_ICON, NULL);
-
        g_signal_connect (G_OBJECT(obj), "delete-event", G_CALLBACK(on_delete_event), obj);
 
        g_signal_connect (G_OBJECT(priv->msg_view), "link_clicked",
@@ -438,12 +377,20 @@ modest_msg_view_window_new (TnyMsg *msg, const gchar *account_name)
                          G_CALLBACK (modest_msg_view_window_key_release_event),
                          NULL);
 
+       g_signal_connect (G_OBJECT (obj), "window-state-event",
+                         G_CALLBACK (modest_msg_view_window_window_state_event),
+                         NULL);
+
        modest_window_set_active_account (MODEST_WINDOW(obj), account_name);
 
        priv->last_search = NULL;
 
        modest_msg_view_window_update_dimmed (MODEST_MSG_VIEW_WINDOW (obj));
 
+       /* Set window icon */
+       window_icon = modest_platform_get_icon (MODEST_APP_MSG_VIEW_ICON);
+       gtk_window_set_icon (GTK_WINDOW (obj), window_icon);
+
        gtk_widget_grab_focus (priv->msg_view);
 
        return MODEST_WINDOW(obj);
@@ -466,6 +413,26 @@ modest_msg_view_window_get_message (ModestMsgViewWindow *self)
        return modest_msg_view_get_message (msg_view);
 }
 
+const gchar*
+modest_msg_view_window_get_message_uid (ModestMsgViewWindow *self)
+{
+       TnyMsg *msg;
+       TnyHeader *header;
+       const gchar *retval = NULL;
+
+       msg = modest_msg_view_window_get_message (self);
+
+       if (!msg)
+               return NULL;
+
+       header = tny_msg_get_header (msg);
+       if (header) {
+               retval = tny_header_get_uid (header);
+               g_object_unref (header);
+       }
+       return retval;
+}
+
 static void 
 modest_msg_view_window_toggle_find_toolbar (GtkToggleAction *toggle,
                                            gpointer data)
@@ -545,8 +512,8 @@ modest_msg_view_window_get_zoom (ModestWindow *window)
        return modest_msg_view_get_zoom (MODEST_MSG_VIEW (priv->msg_view));
 }
 
-static void
-modest_msg_view_window_zoom_plus (GtkAction *action, ModestWindow *window)
+static gboolean
+modest_msg_view_window_zoom_plus (ModestWindow *window)
 {
        ModestWindowPrivate *parent_priv;
        GtkRadioAction *zoom_radio_action;
@@ -560,19 +527,20 @@ modest_msg_view_window_zoom_plus (GtkAction *action, ModestWindow *window)
 
        if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (group->data))) {
                hildon_banner_show_information (NULL, NULL, _("mcen_ib_max_zoom_level"));
-               return;
+               return FALSE;
        }
 
        for (node = group; node != NULL; node = g_slist_next (node)) {
                if ((node->next != NULL) && gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (node->next->data))) {
                        gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (node->data), TRUE);
-                       return;
+                       return TRUE;
                }
        }
+       return FALSE;
 }
 
-static void
-modest_msg_view_window_zoom_minus (GtkAction *action, ModestWindow *window)
+static gboolean
+modest_msg_view_window_zoom_minus (ModestWindow *window)
 {
        ModestWindowPrivate *parent_priv;
        GtkRadioAction *zoom_radio_action;
@@ -586,13 +554,17 @@ modest_msg_view_window_zoom_minus (GtkAction *action, ModestWindow *window)
 
        for (node = group; node != NULL; node = g_slist_next (node)) {
                if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (node->data))) {
-                       if (node->next != NULL)
+                       if (node->next != NULL) {
                                gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (node->next->data), TRUE);
-                       else
+                               return TRUE;
+                       } else {
                                hildon_banner_show_information (NULL, NULL, _("mcen_ib_min_zoom_level"));
+                               return FALSE;
+                       }
                        break;
                }
        }
+       return FALSE;
 }
 
 static gboolean
@@ -876,7 +848,7 @@ modest_msg_view_window_update_dimmed (ModestMsgViewWindow *window)
        widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewPreviousMessageMenu");
        gtk_action_set_sensitive (widget, !is_first);
                
-       widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageForward");
+       widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNext");
        gtk_action_set_sensitive (widget, !is_last);
        widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewNextMessageMenu");
        gtk_action_set_sensitive (widget, !is_last);
@@ -914,16 +886,87 @@ modest_msg_view_window_update_priority (ModestMsgViewWindow *window)
 
 }
 
+static gboolean
+modest_msg_view_window_window_state_event (GtkWidget *widget, GdkEventWindowState *event, gpointer userdata)
+{
+       if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) {
+               ModestWindowPrivate *parent_priv;
+               ModestWindowMgr *mgr;
+               gboolean is_fullscreen;
+               GtkAction *fs_toggle_action;
+               gboolean active;
+
+               mgr = modest_runtime_get_window_mgr ();
+               is_fullscreen = (modest_window_mgr_get_fullscreen_mode (mgr))?1:0;
+
+               parent_priv = MODEST_WINDOW_GET_PRIVATE (widget);
+               
+               fs_toggle_action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewToggleFullscreenMenu");
+               active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (fs_toggle_action)))?1:0;
+               if (is_fullscreen != active) {
+                       gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (fs_toggle_action), is_fullscreen);
+               }
+       }
+
+       return FALSE;
+
+}
+
+void
+modest_msg_view_window_toggle_fullscreen (ModestMsgViewWindow *window)
+{
+               ModestWindowPrivate *parent_priv;
+               GtkAction *fs_toggle_action;
+               parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
+               
+               fs_toggle_action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewToggleFullscreenMenu");
+               gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (fs_toggle_action),
+                                             !gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (fs_toggle_action)));
+}
+
 static void
-modest_msg_view_window_toggle_fullscreen (GtkAction *action, ModestWindow *window)
+set_homogeneous (GtkWidget *widget,
+                gpointer data)
+{
+       if (GTK_IS_TOOL_ITEM (widget)) {
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), TRUE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), TRUE);
+       }
+}
+
+static void
+modest_msg_view_window_show_toolbar (ModestWindow *self,
+                                    gboolean show_toolbar)
 {
        ModestWindowPrivate *parent_priv;
-       GtkAction *fs_toggle_action;
-       gboolean active;
+       GtkWidget *reply_button = NULL, *menu = NULL;
+       
+       parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
+
+       if (!parent_priv->toolbar && show_toolbar) {
+               parent_priv->toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager, 
+                                                                 "/ToolBar");
+
+               /* Set homogeneous toolbar */
+               gtk_container_foreach (GTK_CONTAINER (parent_priv->toolbar), 
+                                      set_homogeneous, NULL);
+
+               /* Add to window */
+               hildon_window_add_toolbar (HILDON_WINDOW (self), 
+                                          GTK_TOOLBAR (parent_priv->toolbar));
+
+
+               /* Set reply button tap and hold menu */        
+               reply_button = gtk_ui_manager_get_widget (parent_priv->ui_manager, 
+                                                         "/ToolBar/ToolbarMessageReply");
+               menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, 
+                                                 "/ToolbarReplyCSM");
+               gtk_widget_tap_and_hold_setup (GTK_WIDGET (reply_button), menu, NULL, 0);
+       }
 
-       parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
 
-       fs_toggle_action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ShowToggleFullscreenMenu");
-       active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (fs_toggle_action));
-       gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (fs_toggle_action), !active);
+       if (show_toolbar)
+               gtk_widget_show (GTK_WIDGET (parent_priv->toolbar));
+       else
+               gtk_widget_hide (GTK_WIDGET (parent_priv->toolbar));
 }