aboutsummaryrefslogtreecommitdiffstats
path: root/e-util/e-table-header-item.c
diff options
context:
space:
mode:
Diffstat (limited to 'e-util/e-table-header-item.c')
-rw-r--r--e-util/e-table-header-item.c39
1 files changed, 29 insertions, 10 deletions
diff --git a/e-util/e-table-header-item.c b/e-util/e-table-header-item.c
index 3b843ade18..06c3f7e784 100644
--- a/e-util/e-table-header-item.c
+++ b/e-util/e-table-header-item.c
@@ -1659,7 +1659,7 @@ sort_by_id (GtkWidget *menu_item,
if (clearfirst)
e_table_sort_info_sorting_truncate (ethi->sort_info, 0);
- ethi_change_sort_state (ethi, ecol);
+ ethi_change_sort_state (ethi, ecol, E_TABLE_HEADER_ITEM_SORT_FLAG_NONE);
}
static void
@@ -1793,7 +1793,8 @@ ethi_button_pressed (ETableHeaderItem *ethi,
void
ethi_change_sort_state (ETableHeaderItem *ethi,
- ETableCol *col)
+ ETableCol *col,
+ ETableHeaderItemSortFlag flag)
{
ETableColumnSpecification *col_spec = NULL;
gint length;
@@ -1868,11 +1869,21 @@ ethi_change_sort_state (ETableHeaderItem *ethi,
}
if (!found && col_spec != NULL) {
- e_table_sort_info_sorting_truncate (ethi->sort_info, 0);
+ if (flag == E_TABLE_HEADER_ITEM_SORT_FLAG_NONE) {
+ e_table_sort_info_sorting_truncate (ethi->sort_info, 0);
+ e_table_sort_info_sorting_set_nth (
+ ethi->sort_info, 0,
+ col_spec, GTK_SORT_ASCENDING);
+ } else {
+ guint index = 0;
- e_table_sort_info_sorting_set_nth (
- ethi->sort_info, 0,
- col_spec, GTK_SORT_ASCENDING);
+ if (flag == E_TABLE_HEADER_ITEM_SORT_FLAG_ADD_AS_LAST)
+ index = e_table_sort_info_sorting_get_count (ethi->sort_info);
+
+ e_table_sort_info_sorting_insert (
+ ethi->sort_info, index,
+ col_spec, GTK_SORT_ASCENDING);
+ }
}
}
@@ -1895,6 +1906,7 @@ ethi_event (GnomeCanvasItem *item,
gdouble event_x_win = 0;
gdouble event_y_win = 0;
guint32 event_time;
+ ETableHeaderItemSortFlag sort_flag = E_TABLE_HEADER_ITEM_SORT_FLAG_NONE;
/* Don't fetch the device here. GnomeCanvas frequently emits
* synthesized events, and calling gdk_event_get_device() on them
@@ -1905,6 +1917,13 @@ ethi_event (GnomeCanvasItem *item,
gdk_event_get_state (event, &event_state);
event_time = gdk_event_get_time (event);
+ if ((event_state & GDK_CONTROL_MASK) != 0) {
+ if ((event_state & GDK_SHIFT_MASK) != 0)
+ sort_flag = E_TABLE_HEADER_ITEM_SORT_FLAG_ADD_AS_LAST;
+ else
+ sort_flag = E_TABLE_HEADER_ITEM_SORT_FLAG_ADD_AS_FIRST;
+ }
+
switch (event->type) {
case GDK_ENTER_NOTIFY:
convert (canvas, event_x_win, event_y_win, &x, &y);
@@ -2030,7 +2049,7 @@ ethi_event (GnomeCanvasItem *item,
col = ethi_find_col_by_x (ethi, event_x_win);
ecol = e_table_header_get_column (ethi->eth, col);
- ethi_change_sort_state (ethi, ecol);
+ ethi_change_sort_state (ethi, ecol, sort_flag);
}
if (needs_ungrab)
@@ -2069,7 +2088,7 @@ ethi_event (GnomeCanvasItem *item,
ETableCol *ecol;
ecol = e_table_header_get_column (ethi->eth, ethi->selected_col);
- ethi_change_sort_state (ethi, ecol);
+ ethi_change_sort_state (ethi, ecol, sort_flag);
} else if ((event_keyval == GDK_KEY_Right) ||
(event_keyval == GDK_KEY_KP_Right)) {
ETableCol *ecol;
@@ -2080,7 +2099,7 @@ ethi_event (GnomeCanvasItem *item,
else
ethi->selected_col++;
ecol = e_table_header_get_column (ethi->eth, ethi->selected_col);
- ethi_change_sort_state (ethi, ecol);
+ ethi_change_sort_state (ethi, ecol, sort_flag);
} else if ((event_keyval == GDK_KEY_Left) ||
(event_keyval == GDK_KEY_KP_Left)) {
ETableCol *ecol;
@@ -2091,7 +2110,7 @@ ethi_event (GnomeCanvasItem *item,
else
ethi->selected_col--;
ecol = e_table_header_get_column (ethi->eth, ethi->selected_col);
- ethi_change_sort_state (ethi, ecol);
+ ethi_change_sort_state (ethi, ecol, sort_flag);
}
break;