These changes disable focus changing in message view (fixes NB#75858)
[modest] / src / widgets / modest-header-view.c
index a7e264b..b886623 100644 (file)
@@ -342,6 +342,9 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn
        ModestHeaderViewPrivate *priv;
        GtkTreeViewColumn *compact_column = NULL;
        const GList *cursor;
+
+       g_return_val_if_fail (self && MODEST_IS_HEADER_VIEW(self), FALSE);
+       g_return_val_if_fail (type != TNY_FOLDER_TYPE_INVALID, FALSE);
        
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); 
 
@@ -700,7 +703,7 @@ modest_header_view_count_selected_headers (ModestHeaderView *self)
        GtkTreeSelection *sel;
        guint selected_rows;
 
-       g_return_val_if_fail (self, 0);
+       g_return_val_if_fail (self && MODEST_IS_HEADER_VIEW(self), 0);
        
        /* Get selection object and check selected rows count */
        sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self));
@@ -714,8 +717,8 @@ modest_header_view_has_selected_headers (ModestHeaderView *self)
 {
        GtkTreeSelection *sel;
        gboolean empty;
-
-       g_return_val_if_fail (self, FALSE);
+       
+       g_return_val_if_fail (self && MODEST_IS_HEADER_VIEW(self), FALSE);
        
        /* Get selection object and check selected rows count */
        sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self));
@@ -736,7 +739,7 @@ modest_header_view_get_selected_headers (ModestHeaderView *self)
        GtkTreeModel *tree_model = NULL;
        GtkTreeIter iter;
 
-       g_return_val_if_fail (self, NULL);
+       g_return_val_if_fail (self && MODEST_IS_HEADER_VIEW(self), NULL);
        
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
 
@@ -810,6 +813,8 @@ modest_header_view_select_next (ModestHeaderView *self)
        GtkTreeModel *model;
        GtkTreePath *path;
 
+       g_return_if_fail (self && MODEST_IS_HEADER_VIEW(self));
+
        sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (self));
        path = get_selected_row (GTK_TREE_VIEW(self), &model);
        if ((path != NULL) && (gtk_tree_model_get_iter(model, &iter, path))) {
@@ -834,6 +839,8 @@ modest_header_view_select_prev (ModestHeaderView *self)
        GtkTreeModel *model;
        GtkTreePath *path;
 
+       g_return_if_fail (self && MODEST_IS_HEADER_VIEW(self));
+
        sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (self));
        path = get_selected_row (GTK_TREE_VIEW(self), &model);
        if ((path != NULL) && (gtk_tree_model_get_iter(model, &iter, path))) {
@@ -855,8 +862,9 @@ modest_header_view_select_prev (ModestHeaderView *self)
 
 GList*
 modest_header_view_get_columns (ModestHeaderView *self)
-{
-       g_return_val_if_fail (self, FALSE);
+{      
+       g_return_val_if_fail (self && MODEST_IS_HEADER_VIEW(self), NULL);
+       
        return gtk_tree_view_get_columns (GTK_TREE_VIEW(self)); 
 }
 
@@ -870,10 +878,10 @@ modest_header_view_set_style (ModestHeaderView *self,
        gboolean show_col_headers = FALSE;
        ModestHeaderViewStyle old_style;
        
-       g_return_val_if_fail (self, FALSE);
+       g_return_val_if_fail (self && MODEST_IS_HEADER_VIEW(self), FALSE);
        g_return_val_if_fail (style >= 0 && MODEST_HEADER_VIEW_STYLE_NUM,
                              FALSE);
-
+       
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
        if (priv->style == style)
                return TRUE; /* nothing to do */
@@ -900,7 +908,8 @@ modest_header_view_set_style (ModestHeaderView *self,
 ModestHeaderViewStyle
 modest_header_view_get_style (ModestHeaderView *self)
 {
-       g_return_val_if_fail (self, FALSE);
+       g_return_val_if_fail (self && MODEST_IS_HEADER_VIEW(self), FALSE);
+
        return MODEST_HEADER_VIEW_GET_PRIVATE(self)->style;
 }
 
@@ -956,6 +965,9 @@ TnyFolder*
 modest_header_view_get_folder (ModestHeaderView *self)
 {
        ModestHeaderViewPrivate *priv;
+
+       g_return_val_if_fail (self && MODEST_IS_HEADER_VIEW(self), NULL);
+
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
 
        if (priv->folder)
@@ -1014,6 +1026,9 @@ modest_header_view_set_folder_intern (ModestHeaderView *self, TnyFolder *folder)
        /* Restore sort column id */
        if (cols) {
                type  = modest_tny_folder_guess_folder_type (folder);
+               if (type == TNY_FOLDER_TYPE_INVALID)
+                       g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
+               
                sort_colid = modest_header_view_get_sort_column_id (self, type); 
                sort_type = modest_header_view_get_sort_type (self, type); 
                gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(sortable),
@@ -1050,6 +1065,9 @@ modest_header_view_sort_by_column_id (ModestHeaderView *self,
        GtkTreeModel *tree_filter, *sortable = NULL; 
        TnyFolderType type;
 
+       g_return_if_fail (self && MODEST_IS_HEADER_VIEW(self));
+       g_return_if_fail (sort_type == GTK_SORT_ASCENDING || sort_type == GTK_SORT_DESCENDING);
+       
        /* Get model and private data */
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);            
        tree_filter = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
@@ -1058,16 +1076,15 @@ modest_header_view_sort_by_column_id (ModestHeaderView *self,
        
        /* Sort tree model */
        type  = modest_tny_folder_guess_folder_type (priv->folder);
-       gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(sortable),
+       if (type == TNY_FOLDER_TYPE_INVALID)
+               g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
+       else {
+               gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(sortable),
                                              sort_colid,
                                              sort_type);
-       /* Store new sort parameters */
-       modest_header_view_set_sort_params (self, sort_colid, sort_type, type);
-
-       /* Save GConf parameters */
-/*     modest_widget_memory_save (modest_runtime_get_conf(), */
-/*                                G_OBJECT(self), "header-view"); */
-       
+               /* Store new sort parameters */
+               modest_header_view_set_sort_params (self, sort_colid, sort_type, type);
+       }       
 }
 
 void
@@ -1078,7 +1095,11 @@ modest_header_view_set_sort_params (ModestHeaderView *self,
 {
        ModestHeaderViewPrivate *priv;
        ModestHeaderViewStyle style;
-
+       
+       g_return_if_fail (self && MODEST_IS_HEADER_VIEW(self));
+       g_return_if_fail (sort_type == GTK_SORT_ASCENDING || sort_type == GTK_SORT_DESCENDING);
+       g_return_if_fail (type != TNY_FOLDER_TYPE_INVALID);
+       
        style = modest_header_view_get_style   (self);
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
 
@@ -1093,6 +1114,9 @@ modest_header_view_get_sort_column_id (ModestHeaderView *self,
        ModestHeaderViewPrivate *priv;
        ModestHeaderViewStyle style;
 
+       g_return_val_if_fail (self && MODEST_IS_HEADER_VIEW(self), 0);
+       g_return_val_if_fail (type != TNY_FOLDER_TYPE_INVALID, 0);
+       
        style = modest_header_view_get_style   (self);
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
 
@@ -1105,7 +1129,10 @@ modest_header_view_get_sort_type (ModestHeaderView *self,
 {
        ModestHeaderViewPrivate *priv;
        ModestHeaderViewStyle style;
-
+       
+       g_return_val_if_fail (self && MODEST_IS_HEADER_VIEW(self), GTK_SORT_DESCENDING);
+       g_return_val_if_fail (type != TNY_FOLDER_TYPE_INVALID, GTK_SORT_DESCENDING);
+       
        style = modest_header_view_get_style   (self);
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
 
@@ -1157,12 +1184,20 @@ modest_header_view_set_folder (ModestHeaderView *self,
                               gpointer user_data)
 {
        ModestHeaderViewPrivate *priv;
-       ModestWindowMgr *mgr = NULL;
-       GObject *source = NULL;
        SetFolderHelper *info;
-       priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
+       ModestWindow *main_win;
+       
+       g_return_if_fail (self);
 
+       priv =     MODEST_HEADER_VIEW_GET_PRIVATE(self);
+
+       main_win = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr (),
+                                                     FALSE); /* don't create */
+       if (!main_win) {
+               g_warning ("%s: BUG: no main window", __FUNCTION__);
+               return;
+       }
+                                                     
        if (priv->folder) {
                g_mutex_lock (priv->observers_lock);
                tny_folder_remove_observer (priv->folder, TNY_FOLDER_OBSERVER (self));
@@ -1175,13 +1210,9 @@ modest_header_view_set_folder (ModestHeaderView *self,
                ModestMailOperation *mail_op = NULL;
                GtkTreeSelection *selection;
 
-               /* Get main window to use it as source of mail operation */
-               mgr = modest_runtime_get_window_mgr ();
-               source = G_OBJECT (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ()));
-
                /* Set folder in the model */
                modest_header_view_set_folder_intern (self, folder);
-
+               
                /* Pick my reference. Nothing to do with the mail operation */
                priv->folder = g_object_ref (folder);
 
@@ -1201,7 +1232,7 @@ modest_header_view_set_folder (ModestHeaderView *self,
                info->user_data = user_data;
 
                /* Create the mail operation (source will be the parent widget) */
-               mail_op = modest_mail_operation_new (source);
+               mail_op = modest_mail_operation_new (G_OBJECT(main_win));
                modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
                                                 mail_op);
 
@@ -1324,20 +1355,32 @@ _modest_header_view_change_selection (GtkTreeSelection *selection,
                                      gpointer user_data)
 {
        g_return_if_fail (GTK_IS_TREE_SELECTION (selection));
-       g_return_if_fail (MODEST_IS_HEADER_VIEW (user_data));
-
+       g_return_if_fail (user_data && MODEST_IS_HEADER_VIEW (user_data));
+       
        on_selection_changed (selection, user_data);
 }
 
-static gint compare_priorities (TnyHeaderFlags p1, TnyHeaderFlags p2)
+static gint
+compare_priorities (TnyHeaderFlags p1, TnyHeaderFlags p2)
 {
-       p1 = p1 & TNY_HEADER_FLAG_PRIORITY;
-       p2 = p2 & TNY_HEADER_FLAG_PRIORITY;
-       if (p1 == 0) 
-               p1 = TNY_HEADER_FLAG_LOW_PRIORITY + 1;
-       if (p2 == 0) 
-               p2 = TNY_HEADER_FLAG_LOW_PRIORITY + 1;
-       return p1 - p2;
+       /* HH, LL, NN */
+       if (p1 == p2)
+               return 0;
+
+       /* HL HN */
+       if (p1 == TNY_HEADER_FLAG_HIGH_PRIORITY)
+               return 1;
+
+       /* LH LN */
+       if (p1 == TNY_HEADER_FLAG_LOW_PRIORITY)
+               return -1;
+
+       /* NH */
+       if ((p1 == TNY_HEADER_FLAG_NORMAL_PRIORITY) && (p2 == TNY_HEADER_FLAG_HIGH_PRIORITY))
+               return -1;
+
+       /* NL */
+       return 1;
 }
 
 static gint
@@ -1368,18 +1411,28 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2,
 
                return cmp ? cmp : t1 - t2;
                
-       case TNY_HEADER_FLAG_PRIORITY:
-               gtk_tree_model_get (tree_model, iter1, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &val1,
+       case TNY_HEADER_FLAG_PRIORITY_MASK: {
+               TnyHeader *header1 = NULL, *header2 = NULL;
+
+               gtk_tree_model_get (tree_model, iter1, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header1,
                                    TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1,-1);
-               gtk_tree_model_get (tree_model, iter2, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &val2,
+               gtk_tree_model_get (tree_model, iter2, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header2,
                                    TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2,-1);
 
                /* This is for making priority values respect the intuitive sort relationship 
-                * as HIGH is 11, LOW is 01, and we put NORMAL AS 10 (2) */
-               cmp =  compare_priorities (val1, val2);
+                * as HIGH is 01, LOW is 10, and NORMAL is 00 */
 
-               return cmp ? cmp : t1 - t2;
+               if (header1 && header2) {
+                       cmp =  compare_priorities (tny_header_get_priority (header1), 
+                               tny_header_get_priority (header2));
+                       g_object_unref (header1);
+                       g_object_unref (header2);
+
+                       return cmp ? cmp : t1 - t2;
+               }
 
+               return t1 - t2;
+       }
        default:
                return &iter1 - &iter2; /* oughhhh  */
        }
@@ -1713,8 +1766,10 @@ folder_monitor_update (TnyFolderObserver *self,
 gboolean
 modest_header_view_is_empty (ModestHeaderView *self)
 {
-       ModestHeaderViewPrivate *priv = NULL;
-               
+       ModestHeaderViewPrivate *priv;
+       
+       g_return_val_if_fail (self && MODEST_IS_HEADER_VIEW(self), TRUE);
+       
        priv = MODEST_HEADER_VIEW_GET_PRIVATE (MODEST_HEADER_VIEW (self));
 
        return priv->status == HEADER_VIEW_EMPTY;
@@ -1723,12 +1778,16 @@ modest_header_view_is_empty (ModestHeaderView *self)
 void
 modest_header_view_clear (ModestHeaderView *self)
 {
+       g_return_if_fail (self && MODEST_IS_HEADER_VIEW(self));
+       
        modest_header_view_set_folder (self, NULL, NULL, NULL);
 }
 
 void 
 modest_header_view_copy_selection (ModestHeaderView *header_view)
 {
+       g_return_if_fail (header_view && MODEST_IS_HEADER_VIEW(header_view));
+       
        /* Copy selection */
        _clipboard_set_selected_data (header_view, FALSE);
 }
@@ -1740,7 +1799,8 @@ modest_header_view_cut_selection (ModestHeaderView *header_view)
        const gchar **hidding = NULL;
        guint i, n_selected;
 
-       g_return_if_fail (MODEST_IS_HEADER_VIEW (header_view));
+       g_return_if_fail (header_view && MODEST_IS_HEADER_VIEW (header_view));
+       
        priv = MODEST_HEADER_VIEW_GET_PRIVATE (header_view);
 
        /* Copy selection */
@@ -1798,15 +1858,18 @@ filter_row (GtkTreeModel *model,
        gchar *id = NULL;
        gboolean visible = TRUE;
        gboolean found = FALSE;
+       GValue value = {0,};
        
        g_return_val_if_fail (MODEST_IS_HEADER_VIEW (user_data), FALSE);
        priv = MODEST_HEADER_VIEW_GET_PRIVATE (user_data);
 
        /* Get header from model */
-       gtk_tree_model_get (model, iter,
-                           TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags,
-                           TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header,
-                           -1);
+       gtk_tree_model_get_value (model, iter, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &value);
+       flags = (TnyHeaderFlags) g_value_get_int (&value);
+       g_value_unset (&value);
+       gtk_tree_model_get_value (model, iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &value);
+       header = (TnyHeader *) g_value_get_object (&value);
+       g_value_unset (&value);
        
        /* Hide mark as deleted heders */
        if (flags & TNY_HEADER_FLAG_DELETED) {
@@ -1822,25 +1885,21 @@ filter_row (GtkTreeModel *model,
 
        /* Get message id from header (ensure is a valid id) */
        if (!header) return FALSE;
-       id = g_strdup(tny_header_get_message_id (header));
        
        /* Check hiding */
        if (priv->hidding_ids != NULL) {
+               id = g_strdup(tny_header_get_message_id (header));
                for (i=0; i < priv->n_selected && !found; i++)
                        if (priv->hidding_ids[i] != NULL && id != NULL)
                                found = (!strcmp (priv->hidding_ids[i], id));
        
                visible = !found;
+               g_free(id);
        }
 
  frees:
        priv->status = ((gboolean) priv->status) && !visible;
        
-       /* Free */
-       if (header)
-               g_object_unref (header);
-       g_free(id);
-
        return visible;
 }
 
@@ -1866,13 +1925,13 @@ modest_header_view_refilter (ModestHeaderView *header_view)
        GtkTreeModel *model = NULL;
        ModestHeaderViewPrivate *priv = NULL;
 
-       g_return_if_fail (MODEST_IS_HEADER_VIEW (header_view));
+       g_return_if_fail (header_view && MODEST_IS_HEADER_VIEW (header_view));
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(header_view);
-
+       
        /* Hide cut headers */
        model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
        if (GTK_IS_TREE_MODEL_FILTER (model)) {
-               priv->status = 0;
+               priv->status = HEADER_VIEW_INIT;
                gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (model));
        }
 }
@@ -1904,15 +1963,14 @@ on_account_removed (TnyAccountStore *self,
        }
 }
 
-void modest_header_view_add_observer(
-               ModestHeaderView *header_view,
-               ModestHeaderViewObserver *observer)
+void
+modest_header_view_add_observer(ModestHeaderView *header_view,
+                                    ModestHeaderViewObserver *observer)
 {
-       ModestHeaderViewPrivate *priv = NULL;
-
-       g_assert(MODEST_IS_HEADER_VIEW(header_view));
-       g_assert(observer != NULL);
-       g_assert(MODEST_IS_HEADER_VIEW_OBSERVER(observer));
+       ModestHeaderViewPrivate *priv;
+       
+       g_return_if_fail (header_view && MODEST_IS_HEADER_VIEW(header_view));
+       g_return_if_fail (observer && MODEST_IS_HEADER_VIEW_OBSERVER(observer));
 
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(header_view);
 
@@ -1925,11 +1983,10 @@ void
 modest_header_view_remove_observer(ModestHeaderView *header_view,
                                   ModestHeaderViewObserver *observer)
 {
-       ModestHeaderViewPrivate *priv = NULL;
+       ModestHeaderViewPrivate *priv;
 
-       g_assert(MODEST_IS_HEADER_VIEW(header_view));
-       g_assert(observer != NULL);
-       g_assert(MODEST_IS_HEADER_VIEW_OBSERVER(observer));
+       g_return_if_fail (header_view && MODEST_IS_HEADER_VIEW(header_view));
+       g_return_if_fail (observer && MODEST_IS_HEADER_VIEW_OBSERVER(observer));
 
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(header_view);
 
@@ -1947,8 +2004,9 @@ modest_header_view_notify_observers(ModestHeaderView *header_view,
        GSList *iter;
        ModestHeaderViewObserver *observer;
 
-       g_assert(MODEST_IS_HEADER_VIEW(header_view));
 
+       g_return_if_fail (header_view && MODEST_IS_HEADER_VIEW(header_view));
+       
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(header_view);
 
        g_mutex_lock(priv->observer_list_lock);