+
+ /* Delete using horizontal gesture */
+ /* DISABLED because it's unreliabile */
+ if (FALSE) {
+ priv->sighandlers =
+ modest_signal_mgr_connect (priv->sighandlers,
+ (GObject *) priv->contents_view,
+ "horizontal-movement",
+ G_CALLBACK (on_horizontal_movement),
+ self);
+ }
+
+
+ g_signal_connect(G_OBJECT(self), "key-press-event",
+ G_CALLBACK(on_key_press), self);
+}
+
+static void
+folder_refreshed_cb (ModestMailOperation *mail_op,
+ TnyFolder *folder,
+ gpointer user_data)
+{
+ /* Update the view (folder could be empty) */
+ 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)
+{
+ gint response;
+ gchar *subject, *msg;
+
+ subject = tny_header_dup_subject (header);
+ if (!subject)
+ subject = g_strdup (_("mail_va_no_subject"));
+
+ msg = g_strdup_printf (ngettext("emev_nc_delete_message", "emev_nc_delete_messages", 1),
+ subject);
+ g_free (subject);
+
+ /* Confirmation dialog */
+ response = modest_platform_run_confirmation_dialog (parent, msg);
+ g_free (msg);
+
+ if (response == GTK_RESPONSE_OK) {
+ ModestMailOperation *mail_op;
+ TnyList *header_list;
+
+ header_list = tny_simple_list_new ();
+ tny_list_append (header_list, (GObject *) header);
+ mail_op = modest_mail_operation_new ((GObject *) parent);
+ modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
+ mail_op);
+ modest_mail_operation_remove_msgs (mail_op, header_list, FALSE);
+ g_object_unref (mail_op);
+ g_object_unref (header_list);
+ }
+}
+
+
+static void
+on_delete_csm_activated (GtkMenuItem *item,
+ gpointer user_data)
+{
+ TnyHeader *header;
+ ModestHeaderWindow *self;
+ ModestHeaderWindowPrivate *priv;
+
+ self = (ModestHeaderWindow *) user_data;
+ priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self);
+
+ 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);
+ g_object_unref (header);
+ }
+}
+
+static void
+on_mark_read_csm_activated (GtkMenuItem *item,
+ gpointer user_data)
+{
+ TnyHeader *header;
+ ModestHeaderWindow *self;
+ ModestHeaderWindowPrivate *priv;
+
+ self = (ModestHeaderWindow *) user_data;
+ priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self);
+
+ header = modest_header_view_get_header_at_pos ((ModestHeaderView *) priv->header_view,
+ priv->x_coord, priv->y_coord);
+
+ if (header) {
+ tny_header_set_flag (header, TNY_HEADER_FLAG_SEEN);
+ g_object_unref (header);
+ }
+}
+
+static void
+on_mark_unread_csm_activated (GtkMenuItem *item,
+ gpointer user_data)
+{
+ TnyHeader *header;
+ ModestHeaderWindow *self;
+ ModestHeaderWindowPrivate *priv;
+
+ self = (ModestHeaderWindow *) user_data;
+ priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self);
+
+ header = modest_header_view_get_header_at_pos ((ModestHeaderView *) priv->header_view,
+ priv->x_coord, priv->y_coord);
+
+ if (header) {
+ tny_header_unset_flag (header, TNY_HEADER_FLAG_SEEN);
+ g_object_unref (header);
+ }
+}
+
+static void
+on_header_view_model_destroyed (gpointer user_data,
+ GObject *model)
+{
+ ModestHeaderWindow *self;
+ ModestHeaderWindowPrivate *priv;
+
+ self = (ModestHeaderWindow *) user_data;
+ if (!GTK_IS_WIDGET (self))
+ return;
+
+ priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self);
+ priv->model_weak_ref = NULL;
+
+ priv->sort_column_handler = 0;
+}
+
+static void
+on_header_view_model_changed (GObject *gobject,
+ GParamSpec *arg1,
+ gpointer user_data)
+{
+ ModestHeaderWindow *self = (ModestHeaderWindow *) user_data;
+ ModestHeaderWindowPrivate *priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self);
+ GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (gobject));
+
+ if (priv->model_weak_ref ) {
+ 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);