static void on_selection_changed (GtkTreeSelection *sel,
gpointer user_data);
-static void setup_drag_and_drop (GtkTreeView *self);
+static gboolean on_button_press_event (GtkWidget * self, GdkEventButton * event,
+ gpointer userdata);
+
+static gboolean on_button_release_event(GtkWidget * self, GdkEventButton * event,
+ gpointer userdata);
+
+static void setup_drag_and_drop (GtkWidget *self);
+
+static void enable_drag_and_drop (GtkWidget *self);
+
+static void disable_drag_and_drop (GtkWidget *self);
static GtkTreePath * get_selected_row (GtkTreeView *self, GtkTreeModel **model);
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);
}
}
- setup_drag_and_drop (GTK_TREE_VIEW (obj));
+ setup_drag_and_drop (GTK_WIDGET(obj));
}
static void
G_CALLBACK(on_focus_in), NULL);
g_signal_connect (self, "focus-out-event",
G_CALLBACK(on_focus_out), NULL);
+
+ g_signal_connect (self, "button-press-event",
+ G_CALLBACK(on_button_press_event), NULL);
+ g_signal_connect (self, "button-release-event",
+ G_CALLBACK(on_button_release_event), NULL);
priv->acc_removed_handler = g_signal_connect (modest_runtime_get_account_store (),
"account_removed",
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));
{
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));
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);
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))) {
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))) {
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));
}
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 */
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;
}
GtkTreeModel *model;
GtkTreeIter tree_iter;
- /* I'm invalidating this method because it causes an annoying
- efect, the focus changes to the header view when selecting
- a folder in the folder view because of this code and it
- shouldn't. We need to find another way to set the passive
- focus on it. Sergio. */
- return FALSE;
-
model = gtk_tree_view_get_model(header_view);
sel = gtk_tree_view_get_selection(header_view);
if(!gtk_tree_selection_count_selected_rows(sel))
- if (gtk_tree_model_get_iter_first(model, &tree_iter))
+ if (gtk_tree_model_get_iter_first(model, &tree_iter)) {
+ /* Prevent the widget from getting the focus
+ when selecting the first item */
+ g_object_set(header_view, "can-focus", FALSE, NULL);
gtk_tree_selection_select_iter(sel, &tree_iter);
+ g_object_set(header_view, "can-focus", TRUE, NULL);
+ }
return FALSE;
}
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)
/* 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),
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));
/* 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
{
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);
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);
{
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);
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));
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);
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);
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
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 */
}
};
static void
-setup_drag_and_drop (GtkTreeView *self)
+enable_drag_and_drop (GtkWidget *self)
{
- gtk_drag_source_set (GTK_WIDGET (self),
- GDK_BUTTON1_MASK,
+ gtk_drag_source_set (self, GDK_BUTTON1_MASK,
header_view_drag_types,
G_N_ELEMENTS (header_view_drag_types),
GDK_ACTION_MOVE | GDK_ACTION_COPY);
+}
+static void
+disable_drag_and_drop (GtkWidget *self)
+{
+ gtk_drag_source_unset (self);
+}
+
+static void
+setup_drag_and_drop (GtkWidget *self)
+{
+ enable_drag_and_drop(self);
g_signal_connect(G_OBJECT (self), "drag_data_get",
G_CALLBACK(drag_data_get_cb), NULL);
return FALSE;
}
+static gboolean
+on_button_release_event(GtkWidget * self, GdkEventButton * event, gpointer userdata)
+{
+ enable_drag_and_drop(self);
+ return FALSE;
+}
+
+static gboolean
+on_button_press_event(GtkWidget * self, GdkEventButton * event, gpointer userdata)
+{
+ GtkTreeSelection *selection = NULL;
+ GtkTreePath *path = NULL;
+ gboolean already_selected = FALSE;
+
+ if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(self), event->x, event->y, &path, NULL, NULL, NULL)) {
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(self));
+ already_selected = gtk_tree_selection_path_is_selected (selection, path);
+ }
+
+ /* Enable drag and drop onlly if the user clicks on a row that
+ it's already selected. If not, let him select items using
+ the pointer */
+ if (!already_selected) {
+ disable_drag_and_drop(self);
+ }
+
+ if (path != NULL) {
+ gtk_tree_path_free(path);
+ }
+
+ return FALSE;
+}
+
static void
folder_monitor_update (TnyFolderObserver *self,
TnyFolderChange *change)
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;
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);
}
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 */
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));
}
}
}
}
-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);
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);
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);