X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-header-window.c;h=c8ffcc3da0d8a1306f03c3e580586fe250cd9e26;hp=1361522fa5c463032820d1cc388dbd46095fc24c;hb=HEAD;hpb=e31d9e7cc8643bc34ae4e31ebdfce07634337fca diff --git a/src/widgets/modest-header-window.c b/src/widgets/modest-header-window.c index 1361522..c8ffcc3 100644 --- a/src/widgets/modest-header-window.c +++ b/src/widgets/modest-header-window.c @@ -51,6 +51,7 @@ #include #include #include +#include typedef enum { CONTENTS_STATE_NONE = 0, @@ -101,6 +102,8 @@ struct _ModestHeaderWindowPrivate { /* weak refs */ GtkTreeModel *model_weak_ref; + + GtkWidget *isearch_toolbar; }; #define MODEST_HEADER_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_HEADER_WINDOW, \ @@ -176,12 +179,25 @@ static void on_progress_list_changed (ModestWindowMgr *mgr, static void update_progress_hint (ModestHeaderWindow *self); static void on_header_view_model_destroyed (gpointer user_data, GObject *model); +#ifdef MODEST_TOOLKIT_HILDON2 static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data); +#endif + +static void isearch_toolbar_close (GtkWidget *widget, + ModestHeaderWindow *obj); +static void isearch_toolbar_search (GtkWidget *widget, + ModestHeaderWindow *obj); +#ifndef MODEST_TOOLKIT_HILDON2 +static void show_isearch_toolbar (GtkWidget *obj, gpointer data); +static void toggle_isearch_toolbar (GtkWidget *obj, + gpointer data); +#endif + /* globals */ -static GtkWindowClass *parent_class = NULL; +static ModestWindowParentClass *parent_class = NULL; #define EMPTYVIEW_XALIGN 0.5 #define EMPTYVIEW_YALIGN 0.5 @@ -276,7 +292,7 @@ modest_header_window_dispose (GObject *obj) folder = modest_header_view_get_folder ((ModestHeaderView *) priv->header_view); if (folder) { - tny_folder_sync_async (folder, FALSE, NULL, NULL, NULL); + tny_folder_sync_async (folder, TRUE, NULL, NULL, NULL); g_object_unref (folder); } @@ -416,8 +432,10 @@ connect_signals (ModestHeaderWindow *self) #endif +#ifdef MODEST_TOOLKIT_HILDON2 g_signal_connect(G_OBJECT(self), "key-press-event", G_CALLBACK(on_key_press), self); +#endif } static void @@ -429,52 +447,6 @@ folder_refreshed_cb (ModestMailOperation *mail_op, update_view (MODEST_HEADER_WINDOW (user_data), NULL); } -static gboolean -tap_and_hold_query_cb (GtkWidget *header_view, - GdkEvent *event, - gpointer user_data) -{ - ModestHeaderWindow *self; - ModestHeaderWindowPrivate *priv; - - self = (ModestHeaderWindow *) user_data; - priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self); - - if (event->type == GDK_BUTTON_PRESS) { - TnyHeader *header; - - priv->x_coord = ((GdkEventButton*)event)->x; - priv->y_coord = ((GdkEventButton*)event)->y; - - /* Enable/Disable mark as (un)read */ - header = modest_header_view_get_header_at_pos ((ModestHeaderView *) header_view, - priv->x_coord, priv->y_coord); - if (header) { - GList *children; - GtkWidget *mark_read_item, *mark_unread_item; - - /* Show "mark as read" or "mark as unread" */ - children = gtk_container_get_children (GTK_CONTAINER (priv->csm_menu)); - mark_read_item = (GtkWidget *) g_list_nth_data (children, 1); - mark_unread_item = (GtkWidget *) g_list_nth_data (children, 2); - - if (tny_header_get_flags (header) & TNY_HEADER_FLAG_SEEN) { - gtk_widget_show (mark_unread_item); - gtk_widget_hide (mark_read_item); - } else { - gtk_widget_show (mark_read_item); - gtk_widget_hide (mark_unread_item); - } - g_object_unref (header); - } else { - /* Do not show the CSM if there is no header below */ - return TRUE; - } - } - - return FALSE; -} - static void delete_header (GtkWindow *parent, TnyHeader *header) @@ -524,7 +496,8 @@ on_delete_csm_activated (GtkMenuItem *item, header = modest_header_view_get_header_at_pos ((ModestHeaderView *) priv->header_view, priv->x_coord, priv->y_coord); if (header) { - delete_header ((GtkWindow *) self, header); + GtkWindow *toplevel = (GtkWindow *) gtk_widget_get_toplevel ((GtkWidget *) self); + delete_header ((GTK_WIDGET_TOPLEVEL (toplevel)) ? toplevel : NULL, header); g_object_unref (header); } } @@ -544,7 +517,11 @@ on_mark_read_csm_activated (GtkMenuItem *item, priv->x_coord, priv->y_coord); if (header) { + gchar *uid; tny_header_set_flag (header, TNY_HEADER_FLAG_SEEN); + uid = modest_tny_folder_get_header_unique_id (header); + modest_platform_emit_msg_read_changed_signal (uid, TRUE); + g_free (uid); g_object_unref (header); } } @@ -564,7 +541,11 @@ on_mark_unread_csm_activated (GtkMenuItem *item, priv->x_coord, priv->y_coord); if (header) { + gchar *uid; tny_header_unset_flag (header, TNY_HEADER_FLAG_SEEN); + uid = modest_tny_folder_get_header_unique_id (header); + modest_platform_emit_msg_read_changed_signal (uid, FALSE); + g_free (uid); g_object_unref (header); } } @@ -609,6 +590,81 @@ on_header_view_model_changed (GObject *gobject, g_object_weak_ref ((GObject *) model, on_header_view_model_destroyed, self); } +/* Returns TRUE if the user clicked over a valid TnyHeader instance */ +static gboolean +show_context_menu (ModestHeaderWindow *self, + GdkEventButton *event) +{ + ModestHeaderWindowPrivate *priv; + TnyHeader *header; + + priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self); + + priv->x_coord = event->x; + priv->y_coord = event->y; + + /* Enable/Disable mark as (un)read */ + header = modest_header_view_get_header_at_pos ((ModestHeaderView *) priv->header_view, + priv->x_coord, priv->y_coord); + if (header) { + GList *children; + GtkWidget *mark_read_item, *mark_unread_item; + + /* Show "mark as read" or "mark as unread" */ + children = gtk_container_get_children (GTK_CONTAINER (priv->csm_menu)); + mark_read_item = (GtkWidget *) g_list_nth_data (children, 1); + mark_unread_item = (GtkWidget *) g_list_nth_data (children, 2); + + if (tny_header_get_flags (header) & TNY_HEADER_FLAG_SEEN) { + gtk_widget_show (mark_unread_item); + gtk_widget_hide (mark_read_item); + } else { + gtk_widget_show (mark_read_item); + gtk_widget_hide (mark_unread_item); + } + g_object_unref (header); + } else { + return FALSE; + } + return TRUE; +} + + +#ifdef MAEMO_CHANGES +static gboolean +tap_and_hold_query_cb (GtkWidget *header_view, + GdkEvent *event, + gpointer user_data) +{ + /* Ignore other clicks but right button single clicks */ + if (event->type != GDK_BUTTON_PRESS) + return FALSE; + + return !show_context_menu ((ModestHeaderWindow *) user_data, + (GdkEventButton *) event); +} +#else +static gboolean +on_button_press_cb (GtkWidget *widget, + GdkEventButton *event, + gpointer user_data) +{ + /* Ignore other clicks but right button single clicks */ + if (event->type != GDK_BUTTON_PRESS || event->button != 3) + return FALSE; + + if (show_context_menu ((ModestHeaderWindow *) user_data, event)) { + ModestHeaderWindowPrivate *priv; + + priv = MODEST_HEADER_WINDOW_GET_PRIVATE (user_data); + gtk_menu_popup ((GtkMenu *) priv->csm_menu, NULL, NULL, + NULL, NULL, event->button, event->time); + } + + return FALSE; +} +#endif + static GtkWidget * create_header_view (ModestWindow *self, TnyFolder *folder) { @@ -630,7 +686,7 @@ create_header_view (ModestWindow *self, TnyFolder *folder) /* Create CSM menu */ priv->csm_menu = gtk_menu_new (); - delete_item = gtk_menu_item_new_with_label (_HL("wdgt_bd_delete")); + delete_item = gtk_menu_item_new_with_label (_HL_DELETE); mark_read_item = gtk_menu_item_new_with_label (_("mcen_me_inbox_mark_as_read")); mark_unread_item = gtk_menu_item_new_with_label (_("mcen_me_inbox_mark_as_unread")); gtk_menu_shell_append (GTK_MENU_SHELL (priv->csm_menu), delete_item); @@ -644,8 +700,13 @@ create_header_view (ModestWindow *self, TnyFolder *folder) gtk_widget_show_all (priv->csm_menu); /* Connect signals */ +#ifdef MAEMO_CHANGES g_signal_connect ((GObject *) header_view, "tap-and-hold-query", G_CALLBACK (tap_and_hold_query_cb), self); +#else + g_signal_connect ((GObject *) header_view, "button-press-event", + G_CALLBACK (on_button_press_cb), self); +#endif g_signal_connect ((GObject *) delete_item, "activate", G_CALLBACK (on_delete_csm_activated), self); g_signal_connect ((GObject *) mark_read_item, "activate", @@ -737,7 +798,10 @@ modest_header_window_new (TnyFolder *folder, const gchar *account_name, const gc ModestServerAccountSettings *store_settings = NULL; GtkWidget *alignment; gchar *account_display_name = NULL; - +#ifdef MODEST_TOOLKIT_HILDON2 + GtkWidget *live_search; +#endif + self = MODEST_HEADER_WINDOW(g_object_new(MODEST_TYPE_HEADER_WINDOW, NULL)); priv = MODEST_HEADER_WINDOW_GET_PRIVATE(self); @@ -757,6 +821,10 @@ modest_header_window_new (TnyFolder *folder, const gchar *account_name, const gc self); priv->header_view = create_header_view (MODEST_WINDOW (self), folder); +#ifdef MODEST_TOOLKIT_HILDON2 + live_search = modest_header_view_setup_live_search (MODEST_HEADER_VIEW (priv->header_view)); + hildon_live_search_widget_hook (HILDON_LIVE_SEARCH (live_search), GTK_WIDGET (self), priv->header_view); +#endif priv->empty_view = create_empty_view (MODEST_WINDOW (self)); /* Transform the floating reference in a "hard" reference. We @@ -791,6 +859,9 @@ modest_header_window_new (TnyFolder *folder, const gchar *account_name, const gc priv->top_vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (alignment), priv->contents_view); +#ifdef MODEST_TOOLKIT_HILDON2 + gtk_box_pack_end (GTK_BOX (priv->top_vbox), live_search, FALSE, FALSE, 0); +#endif gtk_box_pack_end (GTK_BOX (priv->top_vbox), alignment, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER (self), priv->top_vbox); @@ -829,17 +900,25 @@ modest_header_window_new (TnyFolder *folder, const gchar *account_name, const gc /* setup edit modes */ #ifdef MODEST_TOOLKIT_HILDON2 modest_hildon2_window_register_edit_mode (MODEST_HILDON2_WINDOW (self), EDIT_MODE_COMMAND_DELETE, - _("mcen_ti_edit_delete"), _HL("wdgt_bd_delete"), + _("mcen_ti_edit_delete"), _HL_DELETE, GTK_TREE_VIEW (priv->header_view), GTK_SELECTION_MULTIPLE, EDIT_MODE_CALLBACK (modest_ui_actions_on_edit_mode_delete_message)); modest_hildon2_window_register_edit_mode (MODEST_HILDON2_WINDOW (self), EDIT_MODE_COMMAND_MOVE, - _("mcen_ti_edit_move"), _HL("wdgt_bd_move"), + _("mcen_ti_edit_move"), _HL_MOVE, GTK_TREE_VIEW (priv->header_view), GTK_SELECTION_MULTIPLE, EDIT_MODE_CALLBACK (modest_ui_actions_on_edit_mode_move_to)); #endif + priv->isearch_toolbar = modest_toolkit_factory_create_isearch_toolbar (modest_runtime_get_toolkit_factory (), + NULL); + modest_window_add_toolbar (MODEST_WINDOW (self), GTK_TOOLBAR (priv->isearch_toolbar)); + g_signal_connect (G_OBJECT (priv->isearch_toolbar), "isearch-close", + G_CALLBACK (isearch_toolbar_close), self); + g_signal_connect (G_OBJECT (priv->isearch_toolbar), "isearch-search", + G_CALLBACK (isearch_toolbar_search), self); + modest_window_set_active_account (MODEST_WINDOW (self), account_name); modest_window_set_active_mailbox (MODEST_WINDOW (self), mailbox); @@ -918,6 +997,18 @@ static void setup_menu (ModestHeaderWindow *self) modest_window_add_to_menu (MODEST_WINDOW (self), _("mcen_me_delete_messages"), NULL, MODEST_WINDOW_MENU_CALLBACK (set_delete_edit_mode), MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_delete)); +#else + modest_window_add_to_menu (MODEST_WINDOW (self), + dngettext(GETTEXT_PACKAGE, + "mcen_me_move_message", + "mcen_me_move_messages", + 2), + NULL, + MODEST_WINDOW_MENU_CALLBACK (modest_ui_actions_on_move_to), + MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_move_to)); + modest_window_add_to_menu (MODEST_WINDOW (self), _("mcen_me_delete_messages"), NULL, + MODEST_WINDOW_MENU_CALLBACK (modest_ui_actions_on_delete_message), + MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_delete)); #endif modest_window_add_to_menu (MODEST_WINDOW (self), _("mcen_me_folder_details"), NULL, MODEST_WINDOW_MENU_CALLBACK (modest_ui_actions_on_details), @@ -937,6 +1028,10 @@ static void setup_menu (ModestHeaderWindow *self) modest_window_add_to_menu (MODEST_WINDOW (self), _("mcen_me_outbox_cancelsend"), NULL, MODEST_WINDOW_MENU_CALLBACK (modest_ui_actions_cancel_send), MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_cancel_sending_all)); +#ifndef MODEST_TOOLKIT_HILDON2 + modest_window_add_to_menu (MODEST_WINDOW (self), _HL("wdgt_bd_search"), "f", + MODEST_WINDOW_MENU_CALLBACK (toggle_isearch_toolbar), NULL); +#endif } static void @@ -1074,7 +1169,7 @@ show_updating_banner (gpointer user_data) gdk_threads_enter (); priv->updating_banner = modest_platform_animation_banner (GTK_WIDGET (user_data), NULL, - _CS ("ckdg_pb_updating")); + _CS_UPDATING); /* We need this because banners in Maemo could be destroyed by dialogs so we need to properly update @@ -1148,12 +1243,15 @@ on_expose_event(GtkTreeView *header_view, gpointer user_data) { ModestHeaderWindow *self = (ModestHeaderWindow *) user_data; - ModestHeaderWindowPrivate *priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self); g_return_val_if_fail (MODEST_IS_HEADER_WINDOW (self), FALSE); +#ifdef MODEST_TOOLKIT_HILDON2 + ModestHeaderWindowPrivate *priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self); + if (priv->autoscroll) modest_scrollable_jump_to (MODEST_SCROLLABLE (priv->contents_view), 0.0, 0.0); +#endif return FALSE; } @@ -1421,6 +1519,7 @@ on_horizontal_movement (HildonPannableArea *hildonpannable, } #endif +#ifdef MODEST_TOOLKIT_HILDON2 static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data) { @@ -1451,3 +1550,60 @@ on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data) return FALSE; } +#endif + +#ifndef MODEST_TOOLKIT_HILDON2 +/* Used for the Ctrl+F accelerator */ +static void +toggle_isearch_toolbar (GtkWidget *obj, + gpointer data) +{ + ModestHeaderWindow *window = MODEST_HEADER_WINDOW (data); + ModestHeaderWindowPrivate *priv = MODEST_HEADER_WINDOW_GET_PRIVATE (window); + + if (GTK_WIDGET_VISIBLE (priv->isearch_toolbar)) { + isearch_toolbar_close (obj, data); + } else { + show_isearch_toolbar (obj, data); + } +} + +/* Handler for menu option */ +static void +show_isearch_toolbar (GtkWidget *obj, + gpointer data) +{ + ModestHeaderWindow *window = MODEST_HEADER_WINDOW (data); + ModestHeaderWindowPrivate *priv = MODEST_HEADER_WINDOW_GET_PRIVATE (window); + + gtk_widget_show (priv->isearch_toolbar); + modest_isearch_toolbar_highlight_entry (MODEST_ISEARCH_TOOLBAR (priv->isearch_toolbar), TRUE); +} +#endif + +/* Handler for click on the "X" close button in isearch toolbar */ +static void +isearch_toolbar_close (GtkWidget *widget, + ModestHeaderWindow *obj) +{ + ModestHeaderWindowPrivate *priv; + + priv = MODEST_HEADER_WINDOW_GET_PRIVATE (obj); + + /* Hide toolbar */ + gtk_widget_hide (priv->isearch_toolbar); + + modest_header_view_set_filter_string (MODEST_HEADER_VIEW (priv->header_view), NULL); +} + +static void +isearch_toolbar_search (GtkWidget *widget, + ModestHeaderWindow *obj) +{ + ModestHeaderWindowPrivate *priv = MODEST_HEADER_WINDOW_GET_PRIVATE (obj); + + /* TODO: set filter */ + modest_header_view_set_filter_string (MODEST_HEADER_VIEW (priv->header_view), + modest_isearch_toolbar_get_search (MODEST_ISEARCH_TOOLBAR (priv->isearch_toolbar))); + +}