#include <modest-text-utils.h>
#include <modest-account-mgr-helpers.h>
#include "hildon/hildon-pannable-area.h"
+#include <hildon/hildon-app-menu.h>
#include "modest-defs.h"
#include "modest-hildon-includes.h"
#include "modest-ui-dimming-manager.h"
#include <errno.h>
#include <glib/gstdio.h>
#include <modest-debug.h>
+#include <modest-header-window.h>
#define DEFAULT_FOLDER "MyDocs/.documents"
static gboolean modest_msg_view_window_key_event (GtkWidget *window,
GdkEventKey *event,
gpointer userdata);
-static gboolean modest_msg_view_window_window_state_event (GtkWidget *widget,
- GdkEventWindowState *event,
- gpointer userdata);
+static gboolean modest_msg_view_window_toggle_menu (HildonWindow *window,
+ guint button,
+ guint32 time);
static void modest_msg_view_window_update_priority (ModestMsgViewWindow *window);
static void modest_msg_view_window_show_toolbar (ModestWindow *window,
TnyHeader *header,
GtkTreeRowReference *row_reference);
+static void add_to_menu (ModestMsgViewWindow *self,
+ HildonAppMenu *menu,
+ gchar *label,
+ GCallback callback,
+ ModestDimmingRulesGroup *group,
+ GCallback dimming_callback);
+static void setup_menu (ModestMsgViewWindow *self,
+ ModestDimmingRulesGroup *group);
+
/* list my signals */
enum {
MSG_CHANGED_SIGNAL,
{ "ToolsFindInMessage", NULL, N_("mcen_me_viewer_find"), "<CTRL>F", NULL, G_CALLBACK (modest_msg_view_window_toggle_find_toolbar), FALSE },
};
-static const GtkRadioActionEntry msg_view_zoom_action_entries [] = {
- { "Zoom50", NULL, N_("mcen_me_viewer_50"), NULL, NULL, 50 },
- { "Zoom80", NULL, N_("mcen_me_viewer_80"), NULL, NULL, 80 },
- { "Zoom100", NULL, N_("mcen_me_viewer_100"), NULL, NULL, 100 },
- { "Zoom120", NULL, N_("mcen_me_viewer_120"), NULL, NULL, 120 },
- { "Zoom150", NULL, N_("mcen_me_viewer_150"), NULL, NULL, 150 },
- { "Zoom200", NULL, N_("mcen_me_viewer_200"), NULL, NULL, 200 }
-};
-
#define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
MODEST_TYPE_MSG_VIEW_WINDOW, \
ModestMsgViewWindowPrivate))
modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass)
{
GObjectClass *gobject_class;
+ HildonWindowClass *hildon_window_class;
ModestWindowClass *modest_window_class;
GtkBindingSet *binding_set;
gobject_class = (GObjectClass*) klass;
+ hildon_window_class = (HildonWindowClass *) klass;
modest_window_class = (ModestWindowClass *) klass;
parent_class = g_type_class_peek_parent (klass);
gobject_class->finalize = modest_msg_view_window_finalize;
+ hildon_window_class->toggle_menu = modest_msg_view_window_toggle_menu;
+
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;
msg_view_toggle_action_entries,
G_N_ELEMENTS (msg_view_toggle_action_entries),
obj);
- gtk_action_group_add_radio_actions (action_group,
- msg_view_zoom_action_entries,
- G_N_ELEMENTS (msg_view_zoom_action_entries),
- 100,
- G_CALLBACK (modest_ui_actions_on_change_zoom),
- obj);
gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0);
g_object_unref (action_group);
modest_msg_view_window_disconnect_signals (ModestWindow *self)
{
ModestMsgViewWindowPrivate *priv;
- ModestHeaderView *header_view = NULL;
- ModestWindow *main_window = NULL;
+ GtkWidget *header_view = NULL;
+ GtkWindow *parent_window = NULL;
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers);
priv->sighandlers = NULL;
-
- main_window = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr(),
- FALSE); /* don't create */
- if (!main_window)
- return;
-
- header_view = MODEST_HEADER_VIEW(
- modest_main_window_get_child_widget(
- MODEST_MAIN_WINDOW(main_window),
- MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW));
- if (header_view == NULL)
- return;
-
- modest_header_view_remove_observer(header_view,
- MODEST_HEADER_VIEW_OBSERVER(self));
+
+ parent_window = gtk_window_get_transient_for (GTK_WINDOW (self));
+ if (parent_window && MODEST_IS_HEADER_WINDOW (parent_window)) {
+ header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (parent_window)));
+ if (header_view) {
+ modest_header_view_remove_observer(MODEST_HEADER_VIEW (header_view),
+ MODEST_HEADER_VIEW_OBSERVER(self));
+ }
+ }
}
static void
priv->msg_uid = g_strdup (msg_uid);
/* Menubar */
- parent_priv->menubar = modest_maemo_utils_get_manager_menubar_as_menu (parent_priv->ui_manager, "/MenuBar");
- hildon_window_set_menu (HILDON_WINDOW(obj), GTK_MENU(parent_priv->menubar));
- gtk_widget_show (parent_priv->menubar);
+ parent_priv->menubar = NULL;
parent_priv->ui_dimming_manager = modest_ui_dimming_manager_new();
menu_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_MENU, FALSE);
toolbar_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_TOOLBAR, TRUE);
clipboard_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_CLIPBOARD, FALSE);
+ setup_menu (self, menu_rules_group);
/* Add common dimming rules */
modest_dimming_rules_group_add_rules (menu_rules_group,
modest_msg_view_menu_dimming_entries,
G_CALLBACK (modest_msg_view_window_key_event),
NULL);
- g_signal_connect (G_OBJECT (obj), "window-state-event",
- G_CALLBACK (modest_msg_view_window_window_state_event),
- NULL);
-
g_signal_connect (G_OBJECT (obj), "move-focus",
G_CALLBACK (on_move_focus), obj);
/* update the toggle buttons status */
action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage");
- modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active);
- action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ToolsMenu/ToolsFindInMessageMenu");
- modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active);
-
+ if (action)
+ modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active);
+
}
static void
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (obj);
parent_priv = MODEST_WINDOW_GET_PRIVATE (obj);
-
+
toggle = GTK_TOGGLE_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"));
gtk_toggle_action_set_active (toggle, FALSE);
modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
{
ModestMsgViewWindowPrivate *priv;
ModestWindowPrivate *parent_priv;
- GtkAction *action = NULL;
- gint int_zoom = (gint) rint (zoom*100.0+0.1);
g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window));
parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
modest_zoomable_set_zoom (MODEST_ZOOMABLE (priv->msg_view), zoom);
- action = gtk_ui_manager_get_action (parent_priv->ui_manager,
- "/MenuBar/ViewMenu/ZoomMenu/Zoom50Menu");
-
- gtk_radio_action_set_current_value (GTK_RADIO_ACTION (action), int_zoom);
}
static gdouble
static gboolean
modest_msg_view_window_zoom_plus (ModestWindow *window)
{
- ModestWindowPrivate *parent_priv;
- GtkRadioAction *zoom_radio_action;
- GSList *group, *node;
-
- parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
- zoom_radio_action = GTK_RADIO_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager,
- "/MenuBar/ViewMenu/ZoomMenu/Zoom50Menu"));
-
- group = gtk_radio_action_get_group (zoom_radio_action);
+ gdouble zoom_level;
+ ModestMsgViewWindowPrivate *priv;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), 1.0);
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+ zoom_level = modest_zoomable_get_zoom (MODEST_ZOOMABLE (priv->msg_view));
- if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (group->data))) {
+ if (zoom_level >= 2.0) {
hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_max_zoom_level_reached"));
return FALSE;
+ } else if (zoom_level >= 1.5) {
+ zoom_level = 2.0;
+ } else if (zoom_level >= 1.2) {
+ zoom_level = 1.5;
+ } else if (zoom_level >= 1.0) {
+ zoom_level = 1.2;
+ } else if (zoom_level >= 0.8) {
+ zoom_level = 1.0;
+ } else if (zoom_level >= 0.5) {
+ zoom_level = 0.8;
+ } else {
+ zoom_level = 0.5;
}
- 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 TRUE;
- }
- }
- return FALSE;
+ /* set zoom level */
+ modest_zoomable_set_zoom (MODEST_ZOOMABLE (priv->msg_view), zoom_level);
+
+ return TRUE;
+
}
static gboolean
modest_msg_view_window_zoom_minus (ModestWindow *window)
{
- ModestWindowPrivate *parent_priv;
- GtkRadioAction *zoom_radio_action;
- GSList *group, *node;
-
- parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
- zoom_radio_action = GTK_RADIO_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager,
- "/MenuBar/ViewMenu/ZoomMenu/Zoom50Menu"));
-
- group = gtk_radio_action_get_group (zoom_radio_action);
+ gdouble zoom_level;
+ ModestMsgViewWindowPrivate *priv;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), 1.0);
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+ zoom_level = modest_zoomable_get_zoom (MODEST_ZOOMABLE (priv->msg_view));
- 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) {
- gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (node->next->data), TRUE);
- return TRUE;
- } else {
+ if (zoom_level <= 0.5) {
hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_min_zoom_level_reached"));
- return FALSE;
- }
- break;
- }
+ return FALSE;
+ } else if (zoom_level <= 0.8) {
+ zoom_level = 0.5;
+ } else if (zoom_level <= 1.0) {
+ zoom_level = 0.8;
+ } else if (zoom_level <= 1.2) {
+ zoom_level = 1.0;
+ } else if (zoom_level <= 1.5) {
+ zoom_level = 1.2;
+ } else if (zoom_level <= 2.0) {
+ zoom_level = 1.5;
+ } else {
+ zoom_level = 2.0;
}
- return FALSE;
+
+ /* set zoom level */
+ modest_zoomable_set_zoom (MODEST_ZOOMABLE (priv->msg_view), zoom_level);
+
+ return TRUE;
+
}
static gboolean
}
-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);
- }
- toolbar_resize (MODEST_MSG_VIEW_WINDOW (widget));
- }
-
- return FALSE;
-
-}
static void
modest_msg_view_window_show_toolbar (ModestWindow *self,
ModestMsgViewWindowPrivate *priv = NULL;
ModestWindowPrivate *parent_priv;
GtkWidget *reply_button = NULL, *menu = NULL;
- const gchar *action_name;
- GtkAction *action;
-
+
parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
priv->next_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNext");
priv->prev_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageBack");
toolbar_resize (MODEST_MSG_VIEW_WINDOW (self));
-
+
/* Add to window */
hildon_window_add_toolbar (HILDON_WINDOW (self),
GTK_TOOLBAR (parent_priv->toolbar));
- /* Set reply button tap and hold menu */
+ /* 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);
+ if (menu && reply_button)
+ gtk_widget_tap_and_hold_setup (GTK_WIDGET (reply_button), menu, NULL, 0);
}
if (show_toolbar) {
gtk_widget_hide (GTK_WIDGET (parent_priv->toolbar));
}
- /* Update also the actions (to update the toggles in the
- menus), we have to do it manually because some other window
- of the same time could have changed it (remember that the
- toolbar fullscreen mode is shared by all the windows of the
- same type */
- if (modest_window_mgr_get_fullscreen_mode (modest_runtime_get_window_mgr ()))
- action_name = "/MenuBar/ViewMenu/ViewShowToolbarMenu/ViewShowToolbarFullScreenMenu";
- else
- action_name = "/MenuBar/ViewMenu/ViewShowToolbarMenu/ViewShowToolbarNormalScreenMenu";
-
- action = gtk_ui_manager_get_action (parent_priv->ui_manager, action_name);
- modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
- show_toolbar);
}
static void
ModestWindowMgr *mgr;
ModestWindow *msg_win = NULL;
gboolean found;
-
+
header = tny_msg_get_header (TNY_MSG (mime_part));
- mgr = modest_runtime_get_window_mgr ();
+ mgr = modest_runtime_get_window_mgr ();
found = modest_window_mgr_find_registered_header (mgr, header, &msg_win);
if (found) {
/* if it's found, but there is no msg_win, it's probably in the process of being created;
* thus, we don't do anything */
g_warning ("window for is already being created");
- } else {
+ } else {
/* it's not found, so create a new window for it */
modest_window_mgr_register_header (mgr, header, attachment_uid); /* register the uid before building the window */
gchar *account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (window)));
if (!account)
account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr ());
msg_win = modest_msg_view_window_new_for_attachment (TNY_MSG (mime_part), account, attachment_uid);
- modest_window_set_zoom (MODEST_WINDOW (msg_win),
+ modest_window_set_zoom (MODEST_WINDOW (msg_win),
modest_window_get_zoom (MODEST_WINDOW (window)));
modest_window_mgr_register_window (mgr, msg_win, MODEST_WINDOW (window));
gtk_widget_show_all (GTK_WIDGET (msg_win));
return TRUE;;
}
+
+static void
+add_to_menu (ModestMsgViewWindow *self,
+ HildonAppMenu *menu,
+ gchar *label,
+ GCallback callback,
+ ModestDimmingRulesGroup *dimming_group,
+ GCallback dimming_callback)
+{
+ GtkWidget *button;
+
+ button = gtk_button_new_with_label (label);
+ g_signal_connect_after (G_OBJECT (button), "clicked",
+ callback, (gpointer) self);
+ modest_dimming_rules_group_add_widget_rule (dimming_group,
+ button,
+ dimming_callback,
+ MODEST_WINDOW (self));
+ hildon_app_menu_append (menu, GTK_BUTTON (button));
+}
+
+static void
+setup_menu (ModestMsgViewWindow *self, ModestDimmingRulesGroup *group)
+{
+ ModestMsgViewWindowPrivate *priv = NULL;
+ GtkWidget *app_menu;
+
+ g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW(self));
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+
+ app_menu = hildon_app_menu_new ();
+
+ /* Settings menu buttons */
+ add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_reply"),
+ G_CALLBACK (modest_ui_actions_on_reply),
+ group, G_CALLBACK (modest_ui_dimming_rules_on_reply_msg));
+ add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_replytoall"),
+ G_CALLBACK (modest_ui_actions_on_reply_all),
+ group, G_CALLBACK (modest_ui_dimming_rules_on_reply_msg));
+ add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_forward"),
+ G_CALLBACK (modest_ui_actions_on_forward),
+ group, G_CALLBACK (modest_ui_dimming_rules_on_reply_msg));
+ add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_viewer_newemail"),
+ G_CALLBACK (modest_ui_actions_on_new_msg),
+ group, G_CALLBACK (modest_ui_dimming_rules_on_new_msg));
+ add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_messagedetails"),
+ G_CALLBACK (modest_ui_actions_on_details),
+ group, G_CALLBACK (modest_ui_dimming_rules_on_details));
+ add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_viewer_save_attachments"),
+ G_CALLBACK (modest_ui_actions_save_attachments),
+ group, G_CALLBACK (modest_ui_dimming_rules_on_save_attachments));
+ add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_remove_attachments"),
+ G_CALLBACK (modest_ui_actions_remove_attachments),
+ group, G_CALLBACK (modest_ui_dimming_rules_on_remove_attachments));
+ add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_viewer_addtocontacts"),
+ G_CALLBACK (modest_ui_actions_on_add_to_contacts),
+ group, G_CALLBACK (modest_ui_dimming_rules_on_add_to_contacts));
+
+ hildon_stackable_window_set_main_menu (HILDON_STACKABLE_WINDOW (self),
+ HILDON_APP_MENU (app_menu));
+}
+
+static gboolean
+modest_msg_view_window_toggle_menu (HildonWindow *window,
+ guint button,
+ guint32 time)
+{
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
+
+ return HILDON_WINDOW_CLASS (parent_class)->toggle_menu (window, button, time);
+}