X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fhildon2%2Fmodest-header-window.c;h=92ad0cbed725eb1a99226b57ef58f063bd6688a2;hb=08dcf1a20e55e6c05502615b11ff979fa8bac9a9;hp=c45b0ed9f20cb472543fc1f772732cc68e1e6c92;hpb=c0145bf87fd9e21132e30fb3d89678cf62d4058a;p=modest diff --git a/src/hildon2/modest-header-window.c b/src/hildon2/modest-header-window.c index c45b0ed..92ad0cb 100644 --- a/src/hildon2/modest-header-window.c +++ b/src/hildon2/modest-header-window.c @@ -45,13 +45,12 @@ #include #include #include -#include -#include -#include +#include #include #include #include #include +#include #define SHOW_LATEST_SIZE 250 @@ -89,16 +88,12 @@ struct _ModestHeaderWindowPrivate { /* signals */ GSList *sighandlers; gulong queue_change_handler; - gulong sort_column_handler; gulong notify_model; /* progress hint */ gboolean progress_hint; gchar *current_store_account; - /* sort button */ - GtkWidget *sort_button; - /* CSM menu */ GtkWidget *csm_menu; gdouble x_coord; @@ -106,6 +101,9 @@ struct _ModestHeaderWindowPrivate { /* weak refs */ GtkTreeModel *model_weak_ref; + + gboolean limit_headers; + GtkWidget *isearch_toolbar; }; #define MODEST_HEADER_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_HEADER_WINDOW, \ @@ -168,9 +166,6 @@ static void edit_mode_changed (ModestHeaderWindow *header_window, static void on_progress_list_changed (ModestWindowMgr *mgr, ModestHeaderWindow *self); static void update_progress_hint (ModestHeaderWindow *self); -static void on_sort_column_changed (GtkTreeSortable *treesortable, - gpointer user_data); -static void update_sort_button (ModestHeaderWindow *self); static void on_horizontal_movement (HildonPannableArea *hildonpannable, gint direction, gdouble initial_x, @@ -183,6 +178,17 @@ static gboolean on_key_press(GtkWidget *widget, gpointer user_data); static void modest_header_window_show_more (GtkAction *action, ModestWindow *win); +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; @@ -256,15 +262,14 @@ modest_header_window_init (ModestHeaderWindow *obj) priv->autoscroll = TRUE; priv->progress_hint = FALSE; priv->queue_change_handler = 0; - priv->sort_column_handler = 0; priv->model_weak_ref = NULL; priv->current_store_account = NULL; - priv->sort_button = NULL; priv->new_message_button = NULL; priv->show_more_button = NULL; priv->x_coord = 0; priv->y_coord = 0; priv->notify_model = 0; + priv->limit_headers = FALSE; modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(), GTK_WINDOW(obj), @@ -299,11 +304,6 @@ modest_header_window_finalize (GObject *obj) g_object_weak_unref ((GObject *) priv->model_weak_ref, on_header_view_model_destroyed, obj); - if (g_signal_handler_is_connected (G_OBJECT (priv->model_weak_ref), - priv->sort_column_handler)) { - g_signal_handler_disconnect (G_OBJECT (priv->model_weak_ref), - priv->sort_column_handler); - } on_header_view_model_destroyed (obj, (GObject *) priv->model_weak_ref); } @@ -348,20 +348,6 @@ modest_header_window_disconnect_signals (ModestWindow *self) priv->queue_change_handler = 0; } - if (priv->header_view) { - GtkTreeModel *sortable; - - sortable = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->header_view)); - if (sortable) { - if (g_signal_handler_is_connected (G_OBJECT (sortable), - priv->sort_column_handler)) { - g_signal_handler_disconnect (G_OBJECT (sortable), - priv->sort_column_handler); - priv->sort_column_handler = 0; - } - } - } - modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers); priv->sighandlers = NULL; @@ -566,7 +552,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); } } @@ -586,7 +576,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); } } @@ -605,7 +599,6 @@ on_header_view_model_destroyed (gpointer user_data, priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self); priv->model_weak_ref = NULL; - priv->sort_column_handler = 0; } static void @@ -621,22 +614,12 @@ on_header_view_model_changed (GObject *gobject, g_object_weak_unref ((GObject *) priv->model_weak_ref, on_header_view_model_destroyed, self); - if (g_signal_handler_is_connected (G_OBJECT (priv->model_weak_ref), - priv->sort_column_handler)) { - g_signal_handler_disconnect (G_OBJECT (priv->model_weak_ref), - priv->sort_column_handler); - } on_header_view_model_destroyed (self, (GObject *) priv->model_weak_ref); } if (!model) return; - /* Connect the signal. Listen to object destruction to disconnect it */ - priv->sort_column_handler = g_signal_connect ((GObject *) model, - "sort-column-changed", - G_CALLBACK (on_sort_column_changed), - self); priv->model_weak_ref = model; g_object_weak_ref ((GObject *) model, on_header_view_model_destroyed, self); } @@ -649,23 +632,23 @@ create_header_view (ModestWindow *self, TnyFolder *folder) ModestHeaderWindowPrivate *priv; TnyAccount *account; ModestProtocolType protocol_type; - gboolean limit_headers; priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self); header_view = modest_header_view_new (NULL, MODEST_HEADER_VIEW_STYLE_TWOLINES); account = modest_tny_folder_get_account (folder); - limit_headers = FALSE; + priv->limit_headers = FALSE; if (account) { protocol_type = modest_tny_account_get_protocol_type (account); if (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (), protocol_type, MODEST_PROTOCOL_REGISTRY_STORE_LIMIT_HEADER_WINDOW)) { - limit_headers = TRUE; + priv->limit_headers = TRUE; } + g_object_unref (account); } - modest_header_view_set_show_latest (MODEST_HEADER_VIEW (header_view), limit_headers?SHOW_LATEST_SIZE:0); + modest_header_view_set_show_latest (MODEST_HEADER_VIEW (header_view), priv->limit_headers?SHOW_LATEST_SIZE:0); priv->notify_model = g_signal_connect ((GObject*) header_view, "notify::model", G_CALLBACK (on_header_view_model_changed), self); @@ -775,7 +758,7 @@ on_vertical_movement (HildonPannableArea *area, ModestWindow * modest_header_window_new (TnyFolder *folder, const gchar *account_name, const gchar *mailbox) { - ModestHeaderWindow *self = NULL; + ModestHeaderWindow *self = NULL; ModestHeaderWindowPrivate *priv = NULL; HildonProgram *app; GdkPixbuf *window_icon; @@ -786,7 +769,10 @@ modest_header_window_new (TnyFolder *folder, const gchar *account_name, const gc GdkPixbuf *new_message_pixbuf; 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); @@ -806,6 +792,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 @@ -830,11 +820,14 @@ modest_header_window_new (TnyFolder *folder, const gchar *account_name, const gc gtk_box_pack_start (GTK_BOX (action_area_box), priv->new_message_button, TRUE, TRUE, 0); gtk_widget_show_all (priv->new_message_button); hildon_tree_view_set_action_area_visible (GTK_TREE_VIEW (priv->header_view), TRUE); - + setup_menu (self); 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); @@ -878,6 +871,13 @@ modest_header_window_new (TnyFolder *folder, const gchar *account_name, const gc GTK_SELECTION_MULTIPLE, EDIT_MODE_CALLBACK (modest_ui_actions_on_edit_mode_move_to)); + priv->isearch_toolbar = hildon_find_toolbar_new (NULL); + hildon_window_add_toolbar (HILDON_WINDOW (self), GTK_TOOLBAR (priv->isearch_toolbar)); + g_signal_connect (G_OBJECT (priv->isearch_toolbar), "close", + G_CALLBACK (isearch_toolbar_close), self); + g_signal_connect (G_OBJECT (priv->isearch_toolbar), "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); @@ -907,7 +907,7 @@ modest_header_window_new (TnyFolder *folder, const gchar *account_name, const gc } else { folder_name = modest_tny_folder_get_display_name (folder); } - + gtk_window_set_title (GTK_WINDOW (self), folder_name); g_free (folder_name); } @@ -915,7 +915,6 @@ modest_header_window_new (TnyFolder *folder, const gchar *account_name, const gc update_progress_hint (self); - update_sort_button (self); return MODEST_WINDOW(self); } @@ -959,16 +958,6 @@ static void setup_menu (ModestHeaderWindow *self) modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_folder_details"), NULL, APP_MENU_CALLBACK (modest_ui_actions_on_details), MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_details)); - priv->sort_button = hildon_button_new (MODEST_EDITABLE_SIZE, - HILDON_BUTTON_ARRANGEMENT_VERTICAL); - hildon_button_set_title (HILDON_BUTTON (priv->sort_button), _("mcen_me_sort")); - g_signal_connect_after (G_OBJECT (priv->sort_button), "clicked", - G_CALLBACK (modest_ui_actions_on_sort), (gpointer) self); - hildon_button_set_style(HILDON_BUTTON (priv->sort_button), HILDON_BUTTON_STYLE_PICKER); - hildon_button_set_title_alignment (HILDON_BUTTON (priv->sort_button), 0.5, 0.5); - hildon_button_set_value_alignment (HILDON_BUTTON (priv->sort_button), 0.5, 0.5); - modest_hildon2_window_add_button_to_menu (MODEST_HILDON2_WINDOW (self), GTK_BUTTON (priv->sort_button), - modest_ui_dimming_rules_on_sort); priv->show_more_button = hildon_button_new (MODEST_EDITABLE_SIZE, HILDON_BUTTON_ARRANGEMENT_VERTICAL); hildon_button_set_title (HILDON_BUTTON (priv->show_more_button), _("mcen_va_more")); @@ -982,6 +971,10 @@ static void setup_menu (ModestHeaderWindow *self) modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_outbox_cancelsend"), NULL, APP_MENU_CALLBACK (modest_ui_actions_cancel_send), MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_cancel_sending_all)); +#ifndef MODEST_TOOLKIT_HILDON2 + modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _HL("wdgt_bd_search"), NULL, + APP_MENU_CALLBACK (toggle_isearch_toolbar), NULL); +#endif } static void @@ -1448,84 +1441,6 @@ edit_mode_changed (ModestHeaderWindow *header_window, } } -static void -on_sort_column_changed (GtkTreeSortable *treesortable, - gpointer user_data) -{ - update_sort_button (MODEST_HEADER_WINDOW (user_data)); -} - -static void -update_sort_button (ModestHeaderWindow *self) -{ - ModestHeaderWindowPrivate *priv; - GtkTreeSortable *sortable; - gint current_sort_colid = -1; - GtkSortType current_sort_type; - const gchar *value = NULL; - - priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self); - - /* This could happen as the first time the model is set the - header_view is still not assigned to priv->header_view */ - if (!priv->header_view) - return; - - sortable = GTK_TREE_SORTABLE (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->header_view))); - - if (!gtk_tree_sortable_get_sort_column_id (sortable, - ¤t_sort_colid, ¤t_sort_type)) { - value = _("mcen_li_sort_sender_date_newest"); - } else { - switch (current_sort_colid) { - case TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN: - { - GList *cols = NULL; - cols = modest_header_view_get_columns (MODEST_HEADER_VIEW (priv->header_view)); - if (cols != NULL) { - gpointer flags_sort_type_pointer; - flags_sort_type_pointer = g_object_get_data (G_OBJECT (cols->data), - MODEST_HEADER_VIEW_FLAG_SORT); - if (GPOINTER_TO_INT (flags_sort_type_pointer) == TNY_HEADER_FLAG_PRIORITY_MASK) - value = _("mcen_li_sort_priority"); - else - value = _("mcen_li_sort_attachment"); - g_list_free(cols); - } - } - break; - case TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN: - case TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN: - if (current_sort_type == GTK_SORT_ASCENDING) - value = _("mcen_li_sort_sender_recipient_az"); - else - value = _("mcen_li_sort_sender_recipient_za"); - break; - case TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN: - case TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN: - if (current_sort_type == GTK_SORT_ASCENDING) - value = _("mcen_li_sort_date_oldest"); - else - value = _("mcen_li_sort_date_newest"); - break; - case TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN: - if (current_sort_type == GTK_SORT_ASCENDING) - value = _("mcen_li_sort_subject_az"); - else - value = _("mcen_li_sort_subject_za"); - break; - case TNY_GTK_HEADER_LIST_MODEL_MESSAGE_SIZE_COLUMN: - if (current_sort_type == GTK_SORT_ASCENDING) - value = _("mcen_li_sort_size_smallest"); - else - value = _("mcen_li_sort_size_largest"); - break; - } - } - - hildon_button_set_value (HILDON_BUTTON (priv->sort_button), value?value:""); -} - static void on_horizontal_movement (HildonPannableArea *hildonpannable, gint direction, @@ -1611,3 +1526,75 @@ modest_header_window_show_more (GtkAction *action, ModestWindow *win) update_view (self, NULL); } } + +#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); + hildon_find_toolbar_highlight_entry (HILDON_FIND_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_show_latest (MODEST_HEADER_VIEW (priv->header_view), priv->limit_headers?SHOW_LATEST_SIZE:0); + modest_header_view_set_filter_string (MODEST_HEADER_VIEW (priv->header_view), NULL); + update_view (obj, NULL); +} + +static void +isearch_toolbar_search (GtkWidget *widget, + ModestHeaderWindow *obj) +{ + ModestHeaderWindowPrivate *priv = MODEST_HEADER_WINDOW_GET_PRIVATE (obj); + gchar *current_search; + + g_object_get (G_OBJECT (widget), "prefix", ¤t_search, NULL); + + if (current_search && *current_search == '\0') { + g_free (current_search); + current_search = NULL; + } + + /* TODO: set filter */ + modest_header_view_set_filter_string (MODEST_HEADER_VIEW (priv->header_view), + current_search); + if (current_search == NULL) { + modest_header_view_set_show_latest (MODEST_HEADER_VIEW (priv->header_view), priv->limit_headers?SHOW_LATEST_SIZE:0); + } else { + modest_header_view_set_show_latest (MODEST_HEADER_VIEW (priv->header_view), 0); + } + g_free (current_search); + update_view (obj, NULL); +}